From: Sehong Na Date: Sat, 31 May 2014 03:58:08 +0000 (+0900) Subject: Initialize Tizen 2.3 X-Git-Tag: 2.3a_release X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b5a226024d85d055452a70cc0217b1b2f660b130;p=external%2Fpoppler.git Initialize Tizen 2.3 --- b5a226024d85d055452a70cc0217b1b2f660b130 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..a785e40 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +xpdf is written by Derek Noonburg + +libpoppler is a fork of xpdf-3.00 + +Current Maintainer: Albert Astals Cid diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6b1782c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,623 @@ +project(poppler) + +cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) + +set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) + +include(PopplerDefaults) +include(PopplerMacros) +include(MacroOptionalFindPackage) +find_package(PkgConfig) +include(MacroEnsureVersion) +include(MacroBoolTo01) +find_package(Threads) +include(TestBigEndian) +test_big_endian(WORDS_BIGENDIAN) + +set(POPPLER_MAJOR_VERSION "0") +set(POPPLER_MINOR_VERSION "20") +set(POPPLER_MICRO_VERSION "4") +set(POPPLER_VERSION "${POPPLER_MAJOR_VERSION}.${POPPLER_MINOR_VERSION}.${POPPLER_MICRO_VERSION}") + +# command line switches +option(ENABLE_XPDF_HEADERS "Install unsupported xpdf headers." OFF) +option(BUILD_GTK_TESTS "Whether compile the GTK+ test programs." ON) +option(BUILD_QT4_TESTS "Whether compile the Qt4 test programs." ON) +option(BUILD_CPP_TESTS "Whether compile the CPP test programs." ON) +option(ENABLE_SPLASH "Build the Splash graphics backend." ON) +option(ENABLE_UTILS "Compile poppler command line utils." ON) +option(ENABLE_CPP "Compile poppler cpp wrapper." ON) +option(ENABLE_LIBOPENJPEG "Use libopenjpeg for JPX streams." ON) +option(ENABLE_LCMS "Use liblcms for color management." ON) +option(ENABLE_LIBCURL "Build libcurl based HTTP support." OFF) +option(ENABLE_ZLIB "Build with zlib (not totally safe)." OFF) +option(USE_FIXEDPOINT "Use fixed point arithmetic in the Splash backend" OFF) +option(USE_FLOAT "Use single precision arithmetic in the Splash backend" OFF) +if(WIN32) + option(ENABLE_RELOCATABLE "Do not hardcode the poppler library location (on Windows)." ON) +else(WIN32) + set(ENABLE_RELOCATABLE OFF) +endif(WIN32) + +set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") + +set(TESTDATADIR "${CMAKE_SOURCE_DIR}/../test" CACHE STRING "Specify test data dir.") +if(NOT (EXISTS ${TESTDATADIR} AND EXISTS ${TESTDATADIR}/test-poppler.c)) + message(WARNING " + No test data found in $testdatadir. + You will not be able to run 'make test' successfully. + + The test data is not included in the source packages + and is also not part of the main git repository. Instead, + you can checkout the test data from its own git + repository with: + + git clone git://git.freedesktop.org/git/poppler/test + + You should checkout the test data as a sibling of your + poppler source folder or specify the location of your + checkout with -DTESTDATADIR=/path/to/checkoutdir/test. + ") +endif() + +if(WIN32) + set(_default_fontconfiguration "win32") +else(WIN32) + set(_default_fontconfiguration "fontconfig") +endif(WIN32) +set(FONT_CONFIGURATION "${_default_fontconfiguration}" CACHE STRING "The font configuration backend (win32|fontconfig).") +string(TOLOWER "${FONT_CONFIGURATION}" font_configuration) +set(WITH_FONTCONFIGURATION_WIN32 OFF) +set(WITH_FONTCONFIGURATION_FONTCONFIG OFF) +if(font_configuration STREQUAL "win32") + set(WITH_FONTCONFIGURATION_WIN32 ON) +elseif(font_configuration STREQUAL "fontconfig") + set(WITH_FONTCONFIGURATION_FONTCONFIG ON) +else(font_configuration STREQUAL "win32") + message(FATAL_ERROR "Invalid font configuration setting: ${FONT_CONFIGURATION}") +endif(font_configuration STREQUAL "win32") + +# Enable these unconditionally. +set(MULTITHREADED ON) +set(OPI_SUPPORT ON) +set(TEXTOUT_WORD_LIST ON) + +# setting the minimum required versions for some components +set(QT4_MIN_VERSION "4.4.0") +set(CAIRO_VERSION "1.10.0") +set(GLIB_REQUIRED "2.18") + +macro_bool_to_01(ENABLE_SPLASH HAVE_SPLASH) +find_package(Freetype REQUIRED) +if(WITH_FONTCONFIGURATION_FONTCONFIG) + find_package(Fontconfig REQUIRED) +endif(WITH_FONTCONFIGURATION_FONTCONFIG) +macro_optional_find_package(JPEG) +macro_optional_find_package(PNG) +macro_optional_find_package(TIFF) +if(JPEG_FOUND) + set(ENABLE_LIBJPEG ${JPEG_FOUND}) +endif(JPEG_FOUND) +macro_optional_find_package(Qt4) +macro_optional_find_package(Cairo ${CAIRO_VERSION}) +if(CAIRO_FOUND) + set(HAVE_CAIRO ${CAIRO_FOUND}) + set(CAIRO_FEATURE "#define POPPLER_HAS_CAIRO 1") + set(CAIRO_REQ "cairo") + set(POPPLER_GLIB_DISABLE_DEPRECATED "") + set(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES "") + macro_optional_find_package(GLIB) + if(GLIB_FOUND) + set(ENABLE_GLIB ON) + # Check for introspection + macro_optional_find_package(GObjectIntrospection 0.9.12) + set(HAVE_INTROSPECTION ${INTROSPECTION_FOUND}) + set(POPPLER_GLIB_DISABLE_DEPRECATED "${POPPLER_GLIB_DISABLE_DEPRECATED} -DG_DISABLE_DEPRECATED") + set(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES "${POPPLER_GLIB_DISABLE_SINGLE_INCLUDES} -DG_DISABLE_SINGLE_INCLUDES") + macro_optional_find_package(GTK) + endif(GLIB_FOUND) +else(CAIRO_FOUND) + set(CAIRO_FEATURE "#undef POPPLER_HAS_CAIRO") +endif(CAIRO_FOUND) +if(ENABLE_CPP) + macro_optional_find_package(Iconv) + set(ENABLE_CPP ${ICONV_FOUND}) + set(HAVE_ICONV ${ICONV_FOUND}) +endif(ENABLE_CPP) +if(ENABLE_ZLIB) + find_package(ZLIB) + if(ZLIB_FOUND) + set(HAVE_LIBZ ${ZLIB_FOUND}) + endif(ZLIB_FOUND) + set(ENABLE_ZLIB ${ZLIB_FOUND}) +endif(ENABLE_ZLIB) +if(ENABLE_LIBOPENJPEG) + find_package(LIBOPENJPEG) + set(ENABLE_LIBOPENJPEG ${LIBOPENJPEG_FOUND}) + set(HAVE_OPENJPEG_H ON) +endif(ENABLE_LIBOPENJPEG) +if(ENABLE_LCMS) + find_package(LCMS2) + if(LCMS2_FOUND) + set(USE_CMS ${LCMS2_FOUND}) + else(LCMS2_FOUND) + find_package(LCMS) + set(USE_CMS ${LCMS_FOUND}) + set(USE_LCMS1 ${LCMS_FOUND}) + endif(LCMS2_FOUND) +endif(ENABLE_LCMS) +if(ENABLE_LIBCURL) + find_package(CURL) + include_directories(${CURL_INCLUDE_DIR}) + set(POPPLER_HAS_CURL_SUPPORT ON) +endif(ENABLE_LIBCURL) + +add_definitions(-DHAVE_CONFIG_H=1) +if(FONTCONFIG_FOUND) + add_definitions(${FONTCONFIG_DEFINITIONS}) + include_directories(${FONTCONFIG_INCLUDE_DIR}) +endif(FONTCONFIG_FOUND) +if(WITH_FONTCONFIGURATION_WIN32) + if(MINGW) + # Set the minimum required Internet Explorer version to 5.0 + add_definitions(-D_WIN32_IE=0x0500) + endif(MINGW) +endif(WITH_FONTCONFIGURATION_WIN32) +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/fofi + ${CMAKE_CURRENT_SOURCE_DIR}/goo + ${CMAKE_CURRENT_SOURCE_DIR}/poppler + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/poppler + ${FREETYPE_INCLUDE_DIRS} +) +set(HAVE_FREETYPE_H ON) +if(CMAKE_USE_PTHREADS_INIT) + set(HAVE_PTHREAD ON) +endif(CMAKE_USE_PTHREADS_INIT) + +if(ENABLE_ZLIB) + include_directories(${ZLIB_INCLUDE_DIR}) +endif(ENABLE_ZLIB) +if(JPEG_FOUND) + include_directories(${JPEG_INCLUDE_DIR}) + set(ENABLE_LIBJPEG ON) +endif(JPEG_FOUND) +if(PNG_FOUND) + include_directories(${PNG_INCLUDE_DIR}) + set(ENABLE_LIBPNG ON) +endif(PNG_FOUND) +if(TIFF_FOUND) + include_directories(${TIFF_INCLUDE_DIR}) + set(ENABLE_LIBTIFF ON) +endif(TIFF_FOUND) +if(LIBOPENJPEG_FOUND) + include_directories(${LIBOPENJPEG_INCLUDE_DIR}) +endif(LIBOPENJPEG_FOUND) +if(LCMS_FOUND) + include_directories(${LCMS_INCLUDE_DIR}) +endif(LCMS_FOUND) +if(LCMS2_FOUND) + include_directories(${LCMS2_INCLUDE_DIR}) +endif(LCMS2_FOUND) + +if(DEFINED COMPILE_WARNINGS) +else(DEFINED COMPILE_WARNINGS) + set(COMPILE_WARNINGS "yes") +endif(DEFINED COMPILE_WARNINGS) +string(TOLOWER "${COMPILE_WARNINGS}" _comp_warnings) +if(_comp_warnings STREQUAL "no") + set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_NO} ${CMAKE_CXX_FLAGS}") +endif(_comp_warnings STREQUAL "no") +if(_comp_warnings STREQUAL "yes") + set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_YES} ${CMAKE_CXX_FLAGS}") +endif(_comp_warnings STREQUAL "yes") +if(_comp_warnings STREQUAL "kde") + set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_KDE} ${CMAKE_CXX_FLAGS}") +endif(_comp_warnings STREQUAL "kde") + + +include(ConfigureChecks.cmake) +configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) +configure_file(poppler/poppler-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h) + + +set(poppler_SRCS + goo/gfile.cc + goo/gmempp.cc + goo/GooHash.cc + goo/GooList.cc + goo/GooTimer.cc + goo/GooString.cc + goo/gmem.cc + goo/FixedPoint.cc + goo/PNGWriter.cc + goo/TiffWriter.cc + goo/JpegWriter.cc + goo/ImgWriter.cc + goo/gstrtod.cc + fofi/FoFiBase.cc + fofi/FoFiEncodings.cc + fofi/FoFiTrueType.cc + fofi/FoFiType1.cc + fofi/FoFiType1C.cc + fofi/FoFiIdentifier.cc + poppler/Annot.cc + poppler/Array.cc + poppler/BuiltinFont.cc + poppler/BuiltinFontTables.cc + poppler/CachedFile.cc + poppler/Catalog.cc + poppler/CharCodeToUnicode.cc + poppler/CMap.cc + poppler/DateInfo.cc + poppler/Decrypt.cc + poppler/Dict.cc + poppler/Error.cc + poppler/FileSpec.cc + poppler/FontEncodingTables.cc + poppler/Form.cc + poppler/FontInfo.cc + poppler/Function.cc + poppler/Gfx.cc + poppler/GfxFont.cc + poppler/GfxState.cc + poppler/GlobalParams.cc + poppler/Hints.cc + poppler/JArithmeticDecoder.cc + poppler/JBIG2Stream.cc + poppler/Lexer.cc + poppler/Link.cc + poppler/Linearization.cc + poppler/LocalPDFDocBuilder.cc + poppler/NameToCharCode.cc + poppler/Object.cc + poppler/OptionalContent.cc + poppler/Outline.cc + poppler/OutputDev.cc + poppler/Page.cc + poppler/PageTransition.cc + poppler/Parser.cc + poppler/PDFDoc.cc + poppler/PDFDocEncoding.cc + poppler/PDFDocFactory.cc + poppler/PopplerCache.cc + poppler/ProfileData.cc + poppler/PreScanOutputDev.cc + poppler/PSTokenizer.cc + poppler/Stream.cc + poppler/strtok_r.cpp + poppler/UnicodeMap.cc + poppler/UnicodeTypeTable.cc + poppler/XRef.cc + poppler/PSOutputDev.cc + poppler/TextOutputDev.cc + poppler/PageLabelInfo.cc + poppler/SecurityHandler.cc + poppler/StdinCachedFile.cc + poppler/StdinPDFDocBuilder.cc + poppler/Sound.cc + poppler/ViewerPreferences.cc + poppler/XpdfPluginAPI.cc + poppler/Movie.cc + poppler/Rendition.cc +) +set(poppler_LIBS ${FREETYPE_LIBRARIES}) +if(ENABLE_SPLASH) + set(poppler_SRCS ${poppler_SRCS} + poppler/SplashOutputDev.cc + splash/Splash.cc + splash/SplashBitmap.cc + splash/SplashClip.cc + splash/SplashFTFont.cc + splash/SplashFTFontEngine.cc + splash/SplashFTFontFile.cc + splash/SplashFont.cc + splash/SplashFontEngine.cc + splash/SplashFontFile.cc + splash/SplashFontFileID.cc + splash/SplashPath.cc + splash/SplashPattern.cc + splash/SplashScreen.cc + splash/SplashState.cc + splash/SplashT1Font.cc + splash/SplashT1FontEngine.cc + splash/SplashT1FontFile.cc + splash/SplashXPath.cc + splash/SplashXPathScanner.cc + ) +endif(ENABLE_SPLASH) +if(FONTCONFIG_FOUND) + set(poppler_LIBS ${poppler_LIBS} ${FONTCONFIG_LIBRARIES}) +endif(FONTCONFIG_FOUND) +if(JPEG_FOUND) + set(poppler_SRCS ${poppler_SRCS} + poppler/DCTStream.cc + ) + set(poppler_LIBS ${poppler_LIBS} ${JPEG_LIBRARIES}) +endif(JPEG_FOUND) +if(ENABLE_ZLIB) + set(poppler_SRCS ${poppler_SRCS} + poppler/FlateStream.cc + ) + set(poppler_LIBS ${poppler_LIBS} ${ZLIB_LIBRARIES}) +endif(ENABLE_ZLIB) +if(ENABLE_LIBCURL) + set(poppler_SRCS ${poppler_SRCS} + poppler/CurlCachedFile.cc + poppler/CurlPDFDocBuilder.cc + ) + set(poppler_LIBS ${poppler_LIBS} ${CURL_LIBRARIES}) +endif(ENABLE_LIBCURL) +if(LIBOPENJPEG_FOUND) + set(poppler_SRCS ${poppler_SRCS} + poppler/JPEG2000Stream.cc + ) + set(poppler_LIBS ${poppler_LIBS} ${LIBOPENJPEG_LIBRARIES}) +else (LIBOPENJPEG_FOUND) + set(poppler_SRCS ${poppler_SRCS} + poppler/JPXStream.cc + ) +endif(LIBOPENJPEG_FOUND) +if(USE_CMS) + if(LCMS_FOUND) + set(poppler_LIBS ${poppler_LIBS} ${LCMS_LIBRARIES}) + endif(LCMS_FOUND) + if(LCMS2_FOUND) + set(poppler_LIBS ${poppler_LIBS} ${LCMS2_LIBRARIES}) + endif(LCMS2_FOUND) +endif(USE_CMS) +if(WIN32) + # gdi32 is needed under win32 + set(poppler_LIBS ${poppler_LIBS} gdi32) +endif(WIN32) +if(PNG_FOUND) + set(poppler_LIBS ${poppler_LIBS} ${PNG_LIBRARIES}) +endif(PNG_FOUND) +if(TIFF_FOUND) + set(poppler_LIBS ${poppler_LIBS} ${TIFF_LIBRARIES}) +endif(TIFF_FOUND) + +if(MSVC) +add_definitions(-D_CRT_SECURE_NO_WARNINGS) +set(CMAKE_CXX_FLAGS "/Zc:wchar_t- ${CMAKE_CXX_FLAGS}") +add_library(poppler STATIC ${poppler_SRCS}) +else(MSVC) +add_library(poppler SHARED ${poppler_SRCS}) +endif(MSVC) +set_target_properties(poppler PROPERTIES VERSION 27.0.0 SOVERSION 27) +target_link_libraries(poppler ${poppler_LIBS}) +target_link_libraries(poppler LINK_INTERFACE_LIBRARIES "") +install(TARGETS poppler RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) + +if(ENABLE_XPDF_HEADERS) + install(FILES + poppler/Annot.h + poppler/Array.h + poppler/BuiltinFont.h + poppler/BuiltinFontTables.h + poppler/CachedFile.h + poppler/Catalog.h + poppler/CharCodeToUnicode.h + poppler/CMap.h + poppler/DateInfo.h + poppler/Decrypt.h + poppler/Dict.h + poppler/Error.h + poppler/FileSpec.h + poppler/FontEncodingTables.h + poppler/FontInfo.h + poppler/Form.h + poppler/Function.cc + poppler/Function.h + poppler/Gfx.h + poppler/GfxFont.h + poppler/GfxState.h + poppler/GfxState_helpers.h + poppler/GlobalParams.h + poppler/Hints.h + poppler/JArithmeticDecoder.h + poppler/JBIG2Stream.h + poppler/Lexer.h + poppler/Link.h + poppler/Linearization.h + poppler/LocalPDFDocBuilder.h + poppler/Movie.h + poppler/NameToCharCode.h + poppler/Object.h + poppler/OptionalContent.h + poppler/Outline.h + poppler/OutputDev.h + poppler/Page.h + poppler/PageTransition.h + poppler/Parser.h + poppler/PDFDoc.h + poppler/PDFDocBuilder.h + poppler/PDFDocEncoding.h + poppler/PDFDocFactory.h + poppler/PopplerCache.h + poppler/ProfileData.h + poppler/PreScanOutputDev.h + poppler/PSTokenizer.h + poppler/Rendition.h + poppler/Stream-CCITT.h + poppler/Stream.h + poppler/UnicodeMap.h + poppler/UnicodeMapTables.h + poppler/UnicodeTypeTable.h + poppler/UnicodeCClassTables.h + poppler/UnicodeCompTables.h + poppler/UnicodeDecompTables.h + poppler/ViewerPreferences.h + poppler/XRef.h + poppler/CharTypes.h + poppler/CompactFontTables.h + poppler/ErrorCodes.h + poppler/NameToUnicodeTable.h + poppler/PSOutputDev.h + poppler/TextOutputDev.h + poppler/SecurityHandler.h + poppler/StdinCachedFile.h + poppler/StdinPDFDocBuilder.h + poppler/UTF8.h + poppler/XpdfPluginAPI.h + poppler/Sound.h + ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h + DESTINATION include/poppler) + install(FILES + goo/GooHash.h + goo/GooList.h + goo/GooTimer.h + goo/GooMutex.h + goo/GooString.h + goo/gtypes.h + goo/gmem.h + goo/gfile.h + goo/FixedPoint.h + goo/ImgWriter.h + goo/GooLikely.h + goo/gstrtod.h + DESTINATION include/poppler/goo) + if(PNG_FOUND) + install(FILES + goo/PNGWriter.h + DESTINATION include/poppler/goo) + endif(PNG_FOUND) + if(TIFF_FOUND) + install(FILES + goo/TiffWriter.h + DESTINATION include/poppler/goo) + endif(TIFF_FOUND) + install(FILES + fofi/FoFiBase.h + fofi/FoFiEncodings.h + fofi/FoFiTrueType.h + fofi/FoFiType1.h + fofi/FoFiType1C.h + fofi/FoFiIdentifier.h + DESTINATION include/poppler/fofi) + if(ENABLE_LIBCURL) + install(FILES + poppler/CurlCachedFile.h + poppler/CurlPDFDocBuilder.h + DESTINATION include/poppler) + endif(ENABLE_LIBCURL) + if(LIBOPENJPEG_FOUND) + install(FILES + poppler/JPEG2000Stream.h + DESTINATION include/poppler) + install(FILES + goo/JpegWriter.h + DESTINATION include/poppler/goo) + else(LIBOPENJPEG_FOUND) + install(FILES + poppler/JPXStream.h + DESTINATION include/poppler) + endif(LIBOPENJPEG_FOUND) + if(ENABLE_SPLASH) + install(FILES + poppler/SplashOutputDev.h + DESTINATION include/poppler) + install(FILES + splash/Splash.h + splash/SplashBitmap.h + splash/SplashClip.h + splash/SplashErrorCodes.h + splash/SplashFTFont.h + splash/SplashFTFontEngine.h + splash/SplashFTFontFile.h + splash/SplashFont.h + splash/SplashFontEngine.h + splash/SplashFontFile.h + splash/SplashFontFileID.h + splash/SplashGlyphBitmap.h + splash/SplashMath.h + splash/SplashPath.h + splash/SplashPattern.h + splash/SplashScreen.h + splash/SplashState.h + splash/SplashT1Font.h + splash/SplashT1FontEngine.h + splash/SplashT1FontFile.h + splash/SplashTypes.h + splash/SplashXPath.h + splash/SplashXPathScanner.h + DESTINATION include/poppler/splash) + endif(ENABLE_SPLASH) +endif(ENABLE_XPDF_HEADERS) + + +if(ENABLE_UTILS) + add_subdirectory(utils) +endif(ENABLE_UTILS) +if(ENABLE_GLIB) + add_subdirectory(glib) +endif(ENABLE_GLIB) +add_subdirectory(test) +if(QT4_FOUND) + add_subdirectory(qt4) +endif(QT4_FOUND) +if(ENABLE_CPP) + add_subdirectory(cpp) +endif(ENABLE_CPP) + +set(PKG_CONFIG_VERSION_0_18 TRUE) +if(PKG_CONFIG_EXECUTABLE) + exec_program(${PKG_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _output_VAR) + macro_ensure_version("0.18" "${_output_VAR}" PKG_CONFIG_VERSION_0_18) +endif(PKG_CONFIG_EXECUTABLE) +if(PKG_CONFIG_VERSION_0_18) + set(PC_REQUIRES "") + set(PC_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION}") +else(PKG_CONFIG_VERSION_0_18) + set(PC_REQUIRES "poppler = ${POPPLER_VERSION}") + set(PC_REQUIRES_PRIVATE "") +endif(PKG_CONFIG_VERSION_0_18) + +poppler_create_install_pkgconfig(poppler.pc lib${LIB_SUFFIX}/pkgconfig) +if(ENABLE_SPLASH) + poppler_create_install_pkgconfig(poppler-splash.pc lib${LIB_SUFFIX}/pkgconfig) +endif(ENABLE_SPLASH) +if(QT4_FOUND) + poppler_create_install_pkgconfig(poppler-qt4.pc lib${LIB_SUFFIX}/pkgconfig) +endif(QT4_FOUND) +if(ENABLE_GLIB) + poppler_create_install_pkgconfig(poppler-glib.pc lib${LIB_SUFFIX}/pkgconfig) +endif(ENABLE_GLIB) +if(CAIRO_FOUND) + poppler_create_install_pkgconfig(poppler-cairo.pc lib${LIB_SUFFIX}/pkgconfig) +endif(CAIRO_FOUND) +if(ENABLE_CPP) + poppler_create_install_pkgconfig(poppler-cpp.pc lib${LIB_SUFFIX}/pkgconfig) +endif(ENABLE_CPP) + + +message("Building Poppler with support for:") +show_end_message("font configuration" ${font_configuration}) +show_end_message_yesno("splash output" ENABLE_SPLASH) +show_end_message_yesno("cairo output" CAIRO_FOUND) +show_end_message_yesno("qt4 wrapper" QT4_FOUND) +show_end_message_yesno("glib wrapper" ENABLE_GLIB) +show_end_message_yesno(" introspection" INTROSPECTION_FOUND) +show_end_message_yesno("cpp wrapper" ENABLE_CPP) +show_end_message("use gtk-doc" "not supported with this CMake build system") +show_end_message_yesno("use libjpeg" ENABLE_LIBJPEG) +show_end_message_yesno("use libpng" ENABLE_LIBPNG) +show_end_message_yesno("use libtiff" ENABLE_LIBTIFF) +show_end_message_yesno("use zlib" ENABLE_ZLIB) +show_end_message_yesno("use curl" ENABLE_LIBCURL) +show_end_message_yesno("use libopenjpeg" LIBOPENJPEG_FOUND) +show_end_message_yesno("use cms" USE_CMS) +if(LCMS_FOUND) + message(" with lcms1") +endif(LCMS_FOUND) +if(LCMS2_FOUND) + message(" with lcms2") +endif(LCMS2_FOUND) +show_end_message_yesno("command line utils" ENABLE_UTILS) +show_end_message("test data dir" ${TESTDATADIR}) + +if(USE_FIXEDPOINT AND USE_FLOAT) + message("Warning: Single precision and fixed point options should not be enabled at the same time") +endif(USE_FIXEDPOINT AND USE_FLOAT) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..f7cdff1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,44241 @@ +commit 5fd691dc58aac817bca81c87c4820afcf53989d1 +Author: Albert Astals Cid +Date: Mon Sep 10 19:29:01 2012 +0200 + + 0.20.40.20.40.20.40.20.4 + + CMakeLists.txt | 4 ++-- + NEWS | 13 +++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 19 insertions(+), 6 deletions(-) + +commit b3e86dbdba82956f125e37f69176072e2d0127f2 +Author: Thomas Freitag +Date: Sun Sep 9 23:35:45 2012 +0200 + + Try to find another rootNum if actual rootNum doesn't point to a dict + + Bug #14303 + + poppler/XRef.cc | 14 ++++++++++++-- + poppler/XRef.h | 4 ++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit 558a7d9b046bbbe185dea263b48a3cb2664378fc +Author: Thomas Freitag +Date: Sun Sep 9 23:25:47 2012 +0200 + + Fix invalid memory access in solves 1066.pdf.asan.38.75 + + splash/SplashClip.cc | 23 +++++++++++++++++++++++ + splash/SplashXPathScanner.cc | 3 +++ + 2 files changed, 26 insertions(+) + +commit d0df8e54512f584ca2b3edbae1c19e167948e5c3 +Author: Thomas Freitag +Date: Sun Sep 9 23:21:38 2012 +0200 + + Fix invalid memory access in 1106.pdf.asan.30.120.patch + + poppler/Function.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 86b89864396a1dcf027e5793e6ac75411977bcf9 +Author: Thomas Freitag +Date: Sun Sep 9 23:08:49 2012 +0200 + + Fix crash in 1255.pdf.SIGSEGV.56f.285 + + poppler/XRef.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 96931732f343d2bbda9af9488b485da031866c3b +Author: Thomas Freitag +Date: Sun Sep 9 22:47:57 2012 +0200 + + Fix invalid memory access in 61.pdf.asan.13.95 + + fofi/FoFiType1C.cc | 25 +++++++++++++++++-------- + fofi/FoFiType1C.h | 2 ++ + 2 files changed, 19 insertions(+), 8 deletions(-) + +commit 26917d69c4da6a110db02b120133c36579fbb17c +Author: Albert Astals Cid +Date: Sun Sep 9 22:23:36 2012 +0200 + + Add unlikely + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6a3c797c01aa343f640f2e6f45de5bf379aa8ad +Author: Thomas Freitag +Date: Sun Sep 9 22:22:59 2012 +0200 + + Fix wrong memory access in 68.pdf.asan.7.1030 + + poppler/Gfx.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 48fe18cf277cd2a4e665c74b3a594482f762f4b6 +Author: Albert Astals Cid +Date: Sun Sep 9 22:09:44 2012 +0200 + + Fix memory leak + + poppler/Gfx.cc | 1 + + 1 file changed, 1 insertion(+) + +commit b87aafc0cdb36c3555053f2684c45f1a9d7b2f94 +Author: Albert Astals Cid +Date: Sun Sep 9 21:42:48 2012 +0200 + + Add unlikelys to the ifs + + poppler/DCTStream.cc | 4 ++-- + poppler/JBIG2Stream.cc | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit a019eef2f8ca53addd7ccab7f9c47657f4e52286 +Author: Thomas Freitag +Date: Sun Sep 9 21:41:09 2012 +0200 + + Fix crash in 1162.pdf.SIGSEGV.28e.182 + + poppler/DCTStream.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit ad7c6ac88f2315c9ce003308d1b4988592d4434b +Author: William Bader +Date: Sun Sep 9 21:31:58 2012 +0200 + + Fix crash in 1028.pdf.SIGSEGV.ae6.33 + + poppler/JBIG2Stream.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit b861af714daee4125e54b250dddf82106f5a8ce8 +Author: Albert Astals Cid +Date: Sun Sep 9 21:15:06 2012 +0200 + + Fix memory leak + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a4f59113574a8d7460c6ce5000cb09d20fe52b74 +Author: Albert Astals Cid +Date: Sun Sep 9 12:49:43 2012 +0200 + + Fix memory leak + + poppler/Annot.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 28240046f8fe37ca96f9a80cb1ea3a59af9c66f3 +Author: Thomas Freitag +Date: Sun Sep 9 12:48:26 2012 +0200 + + Fix crash in 589.pdf.SIGSEGV.8b1.929 + + poppler/Annot.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit ccd3db5a7723ddb692f6dc85ed9d0f5e3dde189f +Author: Albert Astals Cid +Date: Sat Sep 8 18:10:14 2012 +0200 + + Only complain when the malloc really failed + + poppler/JBIG2Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6356c0bbae47db291a3585d31c7727bc3f8d97a4 +Author: Albert Astals Cid +Date: Thu Aug 30 00:57:51 2012 +0200 + + qt4: unbreak spacing + + qt4/src/poppler-embeddedfile.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 46948868dee6d4e68b658c68d7df482590e34da3 +Author: Albert Astals Cid +Date: Thu Aug 30 00:43:45 2012 +0200 + + Accept FileSpec as Dict too and not only as Ref + + File to try in KDE bug #306008 + + poppler/Catalog.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit debc8fb497bc22c0f9f34d785852981a87475c30 +Author: Albert Astals Cid +Date: Thu Aug 30 00:35:40 2012 +0200 + + Take into account the embFile returned by the core may be NULL + + qt4/src/poppler-embeddedfile-private.h | 4 +++- + qt4/src/poppler-embeddedfile.cc | 19 ++++++++++++------- + 2 files changed, 15 insertions(+), 8 deletions(-) + +commit 3ca67a59fc15782abb1e479eb2b8916de5b1b6ed +Author: Albert Astals Cid +Date: Thu Aug 30 00:34:06 2012 +0200 + + Return NULL EmbFile if the FileSpec is not ok + + Otherwise we might end up asserting + + poppler/FileSpec.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 686ec0cc92e25f74eaa9e09a328724cbdf939bca +Author: Albert Astals Cid +Date: Wed Aug 15 20:02:05 2012 +0200 + + Remove declared but not implemented function + + poppler/XRef.h | 1 - + 1 file changed, 1 deletion(-) + +commit e83568065f77ba722b147b3b10faed1ff66f22dc +Author: Pino Toscano +Date: Sat Aug 11 01:38:08 2012 +0200 + + remove extra execution permissions + + (cherry picked from commit 9a5a19ee2f9cd536c3527b30c0256ca9dce3638c) + + 0 files changed + +commit 1b2903c104012fdd3c982d57898910945dff9a15 +Author: Albert Astals Cid +Date: Sat Aug 11 00:05:10 2012 +0200 + + 0.20.3 + + CMakeLists.txt | 4 ++-- + NEWS | 16 ++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 22 insertions(+), 6 deletions(-) + +commit 40e7b744d32152ab4c6201b8bda7fb7caf6bfd4e +Author: Albert Astals Cid +Date: Sun Aug 5 15:07:16 2012 +0200 + + If NULL, NULL fails as password try EMPTY, EMPTY before failing + + Reviewed by Jose Aliste + Bug #3498 + + poppler/SecurityHandler.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 3ca2bc0d3abdf92741b7921ea402c9de09e531f6 +Author: Markus Trippelsdorf +Date: Fri Aug 3 00:48:12 2012 +0200 + + Fix segfault when scaleImage returns NULL + + Bug 52488 + + splash/Splash.cc | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 768cf5877f48f8cee80fe96e2ee52f42f230dfdf +Author: Thomas Freitag +Date: Thu Aug 2 00:22:19 2012 +0200 + + PSOutputDev: Fix Bitmaps in level2sep or level3sep + + Bug #52384 + + poppler/PSOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 315447843a368556a8536bc30e579c9bf338682e +Author: Thomas Freitag +Date: Wed Aug 1 22:56:49 2012 +0200 + + Splash: Blend mode enhancements for CMYK + + poppler/SplashOutputDev.cc | 76 + +++++++++++++++++++++++++++++++------------- + splash/Splash.cc | 22 ------------- + 2 files changed, 54 insertions(+), 44 deletions(-) + +commit c0c88b3707fc7337e814ae4252d80002641a19ee +Author: Albert Astals Cid +Date: Tue Jul 31 23:32:19 2012 +0200 + + Replace c++ style includes with c style ones + + Fixes build in Solaris 10 + Bug #52426 + + goo/gstrtod.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit dcbc923bd3592a81876f84005fbaddcea18641cc +Author: Thomas Freitag +Date: Sun Jul 22 18:40:46 2012 +0200 + + Make sure xScale and yScale are always initialized + + Bug #52215 + + poppler/PSOutputDev.cc | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit ef7c2418e12d3e6a79f1d89a0051b005fadbc344 +Author: Thomas Freitag +Date: Sat Jul 21 00:01:49 2012 +0200 + + Fix conversion to ps when having multiple strips + + Bug 51982 + + poppler/PSOutputDev.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 349b21acc249c130fb053bc4a0c75019f75bd35b +Author: Torsten Kasch +Date: Thu Jul 19 00:18:14 2012 +0200 + + Unify poppler-config.h includes in core "installed" headers + + Bug 52193 + + goo/FixedPoint.h | 2 +- + goo/GooTimer.h | 2 +- + goo/JpegWriter.h | 2 +- + goo/PNGWriter.h | 2 +- + goo/TiffWriter.h | 2 +- + goo/gfile.h | 2 +- + goo/gmem.h | 2 +- + splash/SplashFTFont.h | 2 +- + splash/SplashMath.h | 2 +- + 9 files changed, 9 insertions(+), 9 deletions(-) + +commit 15c6ae699f083ea6c9716c1098ae9833a56eeb3e +Author: Torsten Kasch +Date: Thu Jul 19 00:06:45 2012 +0200 + + autoconf: Do not assume the shell is bash compatible + + Bug 52197 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f5311da76ec7cd7c1e6cdfc4e18df6dd56e8398b +Author: Albert Astals Cid +Date: Thu Jul 19 00:01:49 2012 +0200 + + pdfseparate: Return 0 on success + + utils/pdfseparate.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 51f22ca0badfc41c19cba66cabd63184244f81c7 +Author: Thomas Freitag +Date: Mon Jul 16 23:32:23 2012 +0200 + + PSOutputDev: Fix DeviceN images with alternate Lab colorspace in + level 3 PostScript + + Bug #51822 + + poppler/PSOutputDev.cc | 54 + +++++++++++++++++++++++++++++++++++++++++------- + poppler/PSOutputDev.h | 2 +- + 2 files changed, 48 insertions(+), 8 deletions(-) + +commit 950d5f3dec4bff5d3c523d55689d7b70215dc110 +Author: Thomas Freitag +Date: Fri Jul 13 00:56:48 2012 +0200 + + Fix Splash::arbitraryTransformImage causes bogus memory allocation + size + + Bug #49523 + + poppler/SplashOutputDev.cc | 2 +- + splash/Splash.cc | 79 + +++++++++++++++++++++++++------------------- + splash/Splash.h | 4 +-- + 3 files changed, 48 insertions(+), 37 deletions(-) + +commit e09be3bc6ba1290fd31bde0c3d19c4ffcbadbf00 +Author: Albert Astals Cid +Date: Tue Jul 10 23:06:53 2012 +0200 + + 0.20.2 + + CMakeLists.txt | 2 +- + NEWS | 11 +++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 15 insertions(+), 4 deletions(-) + +commit e15fe0e1e6accf779caeb1179a8d62161c0aa650 +Author: Thomas Freitag +Date: Thu Jul 5 17:44:02 2012 +0200 + + Fix handling of DeviceN images in level 3 PostScript + + bug #51548 + + poppler/PSOutputDev.cc | 14 -------------- + 1 file changed, 14 deletions(-) + +commit 02c4e6bf4cc0f5535946fe31815081a40b1de986 +Author: Albert Astals Cid +Date: Fri Jun 29 01:56:55 2012 +0200 + + PSOutputDev: Correct %%DocumentCustomColors + + Bug 51479 + + poppler/PSOutputDev.cc | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit f7990386d268a444c297958e9c50ed27a0825a00 +Author: Albert Astals Cid +Date: Thu Jun 28 00:18:07 2012 +0200 + + Add some security checks to JPXStream decoding + + Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk + and Gynvael Coldwind + + poppler/JPXStream.cc | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit c5c6eed1623506e1206e89cee0b7c887d815ba62 +Author: Albert Astals Cid +Date: Sun Jun 24 23:43:03 2012 +0200 + + Change SplashBitmap gmallocn to gmallocn_checkoverflow + + Fixes abort in KDE bug #302372 + + splash/Splash.cc | 37 +++++++++++++++++++++++-------------- + splash/SplashBitmap.cc | 18 +++++++++++------- + 2 files changed, 34 insertions(+), 21 deletions(-) + +commit c87738ee234aafc6eda5a263ad789205037020e1 +Author: Thomas Freitag +Date: Sun Jun 24 20:20:38 2012 +0200 + + copy resources content defined in the pages dict + + Fixes bug #51369 + + poppler/PDFDoc.cc | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit 6cdf879e389f05abba30b3fad8083b7fff23056e +Author: Fabio D'Urso +Date: Sun Jun 24 11:48:04 2012 +0200 + + qt4: Do not hang on malformed /Annots objects + + Don't recurse infinitely if the /Annots object contains annotation + dictionaries (according to specs, /Annots must contain *references* + to annotation dictionaries). + + Fixes bug #51361 + + qt4/src/poppler-annotation.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 3575becd60585324bcefc0631b1bac47c1db3c5c +Author: Mark Brand +Date: Thu Jun 14 20:31:26 2012 +0200 + + fix typo to compile in Windows + + poppler/GlobalParamsWin.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 06618065c8a97a5bec125560546b98edfc1210f3 +Author: Albert Astals Cid +Date: Mon Jun 11 15:17:59 2012 +0200 + + Add some security checks to JBIG2Stream decoding + + Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk + and Gynvael Coldwind + + poppler/JBIG2Stream.cc | 58 + ++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 44 insertions(+), 14 deletions(-) + +commit e3fe88df3646a80945210ba426eb4681a98b55e9 +Author: Hib Eris +Date: Sun Jun 10 19:44:18 2012 +0200 + + Check value of first page in linearization table + + Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk + and Gynvael Coldwind + + poppler/Linearization.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1240eee8c0d0d01113443e0fda87721775a76da9 +Author: Albert Astals Cid +Date: Sun Jun 10 20:42:55 2012 +0200 + + 0.20.1 + + CMakeLists.txt | 4 ++-- + NEWS | 25 +++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 31 insertions(+), 6 deletions(-) + +commit c783037619e2b4c101e8ecd7e61c94ee077b4be2 +Author: Albert Astals Cid +Date: Sun Jun 10 20:15:01 2012 +0200 + + Update copyrights + + poppler/GlobalParamsWin.cc | 1 + + 1 file changed, 1 insertion(+) + +commit f3f9d8f28a97338da92c842d5668b0ef3495ef13 +Author: Albert Astals Cid +Date: Sun Jun 10 19:09:17 2012 +0200 + + Do use NULL function + + Fixes crash in broken/fuzzed pdf sent by Mateusz "j00ru" Jurczyk + and Gynvael Coldwind + + poppler/Gfx.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 92ef16e3699da949c80716c3fd4b438fe79c134d +Author: Thomas Freitag +Date: Sun Jun 10 16:58:54 2012 +0200 + + use setoverprintmode only if rip knows it + + poppler/PSOutputDev.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 99aa734ae2d3ba51f840d4c8ef450488fb702a31 +Author: Fabio D'Urso +Date: Thu May 24 23:17:27 2012 +0200 + + qt4: Keep page rotation into account when normalizing annotation + coords + + If the page is rotated by 90 or 270 degrees, width and height need + to be swapped + + qt4/src/poppler-annotation.cc | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit bde31ce7b223abc86d25e06f3d73668b792c70df +Author: Fabio D'Urso +Date: Sat Jun 9 01:31:29 2012 +0200 + + Fix saving to xml + + The default icon is Note not comment + + qt4/src/poppler-annotation.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9904b8f10abf068a7816bd90976ccbb320387645 +Author: Adrian Johnson +Date: Thu May 24 18:24:48 2012 +0930 + + glib docs: fix typo + + glib/poppler-document.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 028f580056f99719cfb8af7bbe8184ceac02cb16 +Author: Adrian Johnson +Date: Sun May 13 21:36:36 2012 +0930 + + add sustitute font name to GlobalParamsWin32 to fix compilation + + poppler/GlobalParamsWin.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 1916d000a86336213ffd6e9bd44ce873e8955895 +Author: Adrian Johnson +Date: Sat May 12 16:31:38 2012 +0930 + + Include substitute font name in system font cache + + Bug 49826 + + poppler/FontInfo.cc | 1 + + poppler/GlobalParams.cc | 58 + ++++++++++++++++++++++++++--------------------- + 2 files changed, 33 insertions(+), 26 deletions(-) + +commit 1c6e84555572a6bf3a2e3fbe9a54b40f11c122ad +Author: Fabio D'Urso +Date: Fri May 18 16:22:46 2012 +0200 + + qt4: Make TextAnnotation ctor public + + qt4/src/poppler-annotation.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8e504bf2543621973fdaddbd29055ce435540146 +Author: Ville Skyttä +Date: Wed May 16 23:49:01 2012 +0300 + + pdfseparate.1: Syntax fixes. + + utils/pdfseparate.1 | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9f7d919e68a26bb7dd809986d8394fe20b750bd0 +Author: Anthony Wesley +Date: Thu May 17 19:54:47 2012 +0200 + + Fix logic on SplashBitmap::writeImgFile + + splash/SplashBitmap.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7e7997e12faccf4c0513811b324a2fd0fa960a96 +Author: Igor Slepchin +Date: Tue May 15 23:16:27 2012 +0200 + + Determine if font is bold or italic based on FontDescriptor. + + Bug #49758 + + utils/HtmlFonts.cc | 24 ++++++++++++++++++------ + utils/HtmlFonts.h | 3 ++- + utils/HtmlOutputDev.cc | 4 +--- + 3 files changed, 21 insertions(+), 10 deletions(-) + +commit 329bb1e2b4f4b58832847bcf805d19ac0fd5ef02 +Author: Carlos Garcia Campos +Date: Sun May 13 19:45:55 2012 +0200 + + glib: Make sure password is always converted to latin1 + + Remove the utf8 validation since glib API is supposed to always + receive + utf8 strings. + + glib/poppler-document.cc | 38 +++++++++++++++++++------------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +commit 7714b4e319c48ee915061a172208245ae7c4141b +Author: Carlos Garcia Campos +Date: Sun May 13 19:30:17 2012 +0200 + + glib: Fix memory leak when document fails to load + + glib/poppler-document.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 13d2aa303eb1fd900f1045efec14af8002477b02 +Author: Thomas Freitag +Date: Sun May 13 17:25:15 2012 +0200 + + remove unnecesary transparency group handling in splash + + Bug #13487 + + poppler/Gfx.cc | 64 + +++++++++++++++++++++++++++++++++++++++++++- + poppler/Gfx.h | 4 ++- + poppler/GfxState.cc | 4 ++- + poppler/OutputDev.h | 1 + + poppler/SplashOutputDev.cc | 11 ++++++++ + poppler/SplashOutputDev.h | 1 + + 6 files changed, 82 insertions(+), 3 deletions(-) + +commit a76867003a7bff5ab03016156c75b4c928788d50 +Author: Albert Astals Cid +Date: Sun May 13 13:10:40 2012 +0200 + + Distribute cmake/modules/FindLCMS2.cmake + + Bug #49818 + + Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 4114c928fa2560937e02319f57937f1c267a9817 +Author: Albert Astals Cid +Date: Thu May 10 21:09:14 2012 +0200 + + 0.20.0 + + CMakeLists.txt | 6 +++--- + NEWS | 16 ++++++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 24 insertions(+), 8 deletions(-) + +commit df05d084cb26807c39695280cd8ea52d13aa1255 +Author: Albert Astals Cid +Date: Thu May 10 20:54:13 2012 +0200 + + Bring back the begin/endMarkedContent virtuals + + For those evil people that keep using poppler internals + + poppler/Gfx.cc | 8 ++++++++ + poppler/OutputDev.cc | 8 +++++++- + poppler/OutputDev.h | 4 +++- + 3 files changed, 18 insertions(+), 2 deletions(-) + +commit b6159fea4a13ecfd1c38b3a666a797c5147dd952 +Author: William Bader +Date: Thu May 10 20:02:19 2012 +0200 + + splash uses cmykTransferC for M, Y and K in two places + + splash/Splash.cc | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit c2146219d555cab277906daefd2589f9056f536c +Author: Peter Breitenlohner +Date: Thu May 10 13:26:18 2012 +0200 + + Add missing function parameter + + poppler/GlobalParams.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 753f6ab9347f972223ec21b7ed4b4f7ebed3d420 +Author: Albert Astals Cid +Date: Thu May 3 15:29:57 2012 -0700 + + Compile with ENABLE_PLUGINS defined + + poppler/SecurityHandler.cc | 4 ++-- + poppler/SecurityHandler.h | 16 ++++++++++++++++ + poppler/XpdfPluginAPI.cc | 35 +---------------------------------- + poppler/XpdfPluginAPI.h | 34 +++++++++++++++------------------- + 4 files changed, 34 insertions(+), 55 deletions(-) + +commit 23df93aaf495428b580bafd0fd1f41515828b08d +Author: Albert Astals Cid +Date: Thu May 3 14:50:09 2012 -0700 + + We don't support the keyBinding concept + + remove wrong merge + + poppler/GlobalParams.cc | 1 - + 1 file changed, 1 deletion(-) + +commit e55838b41959acc311e9b00dc390c9816a9afac2 +Author: Jason +Date: Wed May 2 19:35:26 2012 +0200 + + glib: Use delete[] to free array allocated with new[] + + https://bugs.freedesktop.org/show_bug.cgi?id=48447 + + glib/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dec873463b06bfe76ff48e36282877e6ac11b59d +Author: Albert Astals Cid +Date: Sun Apr 29 23:36:57 2012 +0200 + + Add the objUint type + + poppler/Object.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 50c0b294d08114920a5db711876e20d991f474a6 +Author: Albert Astals Cid +Date: Sun Apr 29 22:33:09 2012 +0200 + + Make sure the index to dcHuffTables and acHuffTables is in bounds + + Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael + Coldwind + + poppler/Stream.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9e36206465289c96cb189c648a6f5121714c647b +Author: Albert Astals Cid +Date: Sun Apr 29 22:18:12 2012 +0200 + + include for memcpy + + splash/SplashBitmap.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 931051fe0bb445545355027d999515bc3d4b32ef +Author: Albert Astals Cid +Date: Sun Apr 29 22:07:34 2012 +0200 + + Make sure the index for refLine is in bounds + + Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael + Coldwind + + poppler/Stream.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 53b9c2e2806320d0d0e35134b75da5da72514742 +Author: Albert Astals Cid +Date: Sun Apr 29 22:00:18 2012 +0200 + + Just call getNum if isNum is true + + Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael + Coldwind + + poppler/Link.cc | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit da8d858c4fc610718a5f14b14dc3a4a11564a73d +Author: Albert Astals Cid +Date: Sun Apr 29 20:28:37 2012 +0200 + + Do not access args[-1] + + Found in a fuzzed pdf sent by Mateusz "j00ru" Jurczyk and Gynvael + Coldwind + + poppler/Gfx.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 934b1a7cd502fe5537a350cdfc650989992693f7 +Author: Albert Astals Cid +Date: Sun Apr 29 19:59:15 2012 +0200 + + Do not access invalid lookup indexes + + Found by Mateusz "j00ru" Jurczyk and Gynvael Coldwind + + poppler/GfxState.cc | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit e80fd082914fe29fad7e60c321a747eb8634e413 +Author: Albert Astals Cid +Date: Sun Apr 29 18:27:41 2012 +0200 + + [qt4] the qualified name may be unicode encoded + + qt4/src/poppler-form.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 251be1787a2a003862691f5a825eb3468eceb6a2 +Author: Albert Astals Cid +Date: Sun Apr 29 18:26:42 2012 +0200 + + Fix getFullyQualifiedName with unicode field names + + Based on a patch from Mark Riedesel. + Bug #49256 + + poppler/Form.cc | 71 + +++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 61 insertions(+), 10 deletions(-) + +commit be41f1c7905d695d17e19ced83a1018531d00199 +Author: Albert Astals Cid +Date: Sun Apr 29 16:02:45 2012 +0200 + + SplashOutputDev: Fix rendering of knockout groups + + Bug #12185 + + poppler/SplashOutputDev.cc | 31 ++++++++++++++++++++++++++++--- + splash/Splash.cc | 21 ++++++++++++++++++--- + splash/Splash.h | 6 ++++-- + splash/SplashBitmap.cc | 22 +++++++++++++++++++++- + splash/SplashBitmap.h | 2 ++ + 5 files changed, 73 insertions(+), 9 deletions(-) + +commit 800cb9ec7189a539d64b99fa181cd4126496c1ec +Author: Thomas Freitag +Date: Sat Apr 28 17:15:30 2012 +0200 + + Reconstruct xref table if xref needed but missing + + Bug #40719 + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 410822d7013ce1f61325afdb61d75ea64666755e +Author: Albert Astals Cid +Date: Fri Apr 27 01:10:22 2012 +0200 + + 0.19.4 + + CMakeLists.txt | 4 ++-- + NEWS | 17 +++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 23 insertions(+), 6 deletions(-) + +commit b1d5c6c0a20a4a24b42de66db23e0f63d10ca52d +Author: Fabio D'Urso +Date: Tue Apr 24 21:00:11 2012 +0200 + + Output XRef stream when incrementally updating if there's already + a XRef stream + + poppler/PDFDoc.cc | 45 +++++++++++++++++++++++++++++-- + poppler/XRef.cc | 76 + +++++++++++++++++++++++++++++++++++++++++++++-------- + poppler/XRef.h | 34 ++++++++++++++++++++++++ + 3 files changed, 142 insertions(+), 13 deletions(-) + +commit 2ecf3b2e49a4c35e995d25016b810592260edfeb +Author: Fabio D'Urso +Date: Tue Apr 24 18:10:15 2012 +0200 + + Refactoring of XRef table write support (in preparation for XRef + stream write support) + + - Trailer dictionary creation now lives in its own function + "createTrailerDict" + (that will be used by XRef stream creation too) + - writeXRefTableTrailer (WAS writeTrailer) now takes care of writing + the XRef + table too (previously it was demanded to the caller) + + poppler/PDFDoc.cc | 61 + ++++++++++++++++++++++++++--------------------------- + poppler/PDFDoc.h | 14 +++++++++--- + poppler/XRef.cc | 2 +- + poppler/XRef.h | 2 +- + utils/pdfunite.cc | 10 +++++---- + 5 files changed, 49 insertions(+), 40 deletions(-) + +commit cf7a20adbd15f901d414ce06825459c33eeef3f5 +Author: Thomas Freitag +Date: Wed Apr 25 18:51:23 2012 +0200 + + Fix slow rendering of pdf with a lot of image masks in pattern + colorspace + + Makes it around 8 times faster + + poppler/CairoOutputDev.cc | 6 +++--- + poppler/CairoOutputDev.h | 6 +++--- + poppler/Gfx.cc | 4 ++-- + poppler/OutputDev.cc | 5 +++-- + poppler/OutputDev.h | 6 +++--- + poppler/PSOutputDev.cc | 4 ++-- + poppler/PSOutputDev.h | 4 ++-- + poppler/SplashOutputDev.cc | 35 +++++++++++------------------------ + poppler/SplashOutputDev.h | 4 ++-- + 9 files changed, 31 insertions(+), 43 deletions(-) + +commit 26fd142a3608283fd41e07b54067a51a9db76e93 +Author: Fabio D'Urso +Date: Sat Apr 21 18:16:46 2012 +0200 + + Preserve z-index after annotation removal + + poppler/Annot.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 7b10014c1fe9ef1cba57fd6b01c63129ac31386a +Author: Fabio D'Urso +Date: Sat Apr 21 17:53:22 2012 +0200 + + Do not remove appearance stream if it's shared with other annotations + + poppler/Annot.cc | 78 + +++++++++++++++++++++++++++++++++++++++++++++++++++--- + poppler/Annot.h | 6 +++++ + 2 files changed, 80 insertions(+), 4 deletions(-) + +commit 7684c325929493ad9de01a891de0aef197e176dd +Author: Fabio D'Urso +Date: Sat Apr 21 20:26:49 2012 +0200 + + AnnotText: Always force 24x24 size with custom stamps, not only on + first rendering + + poppler/Annot.cc | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit 44cd46a6e04a87bd702dab4a662042f69f16c4ad +Author: Albert Astals Cid +Date: Mon Apr 23 20:02:55 2012 +0200 + + Do not try to access nPatches - 1 if nPatches is 0 + + Found by Mateusz "j00ru" Jurczyk and Gynvael Coldwind + + poppler/GfxState.cc | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +commit a92f87b83e3c6c9078508c644aa09f4f2b14e9cc +Author: Albert Astals Cid +Date: Mon Apr 23 00:06:18 2012 +0200 + + Do not complain if the entry is missing + + Since we are actually looking for non existing entries :D + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 114e113e3278d02baaffd6c0da7fda266283c176 +Author: Fabio D'Urso +Date: Sat Apr 21 21:08:55 2012 +0200 + + Do not allocate XRef entries whose generation number is 65535 + + poppler/XRef.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit ad8785b053aa115b593b2f20073e2989d59a77c9 +Author: Albert Astals Cid +Date: Wed Apr 18 22:51:33 2012 +0200 + + Remove duplicate call + + utils/pdftohtml.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 80d4e1843c56801508f476fed64ecb3201ba18c8 +Author: Fabio D'Urso +Date: Tue Apr 17 20:25:57 2012 +0200 + + Do not draw border in AnnotText::draw + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a1e3d868ccd7fb84d52d94754d8681c97119fb6e +Author: Fabio D'Urso +Date: Fri Mar 30 21:52:04 2012 +0200 + + Save/restore gfx state when drawing annot border + + poppler/Gfx.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 7fbeaac5c0d0240564add6c252c1ba7c14639d98 +Author: Albert Astals Cid +Date: Tue Apr 17 20:36:51 2012 +0200 + + Be sure we are checking a non free entry + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d1254c7e8e995302542093968a0c2967f3c0b5ff +Author: Thomas Freitag +Date: Tue Apr 17 20:36:03 2012 +0200 + + Do not complain if the entry does not exist + + XRef::getNumEntry is only trying to find which entry a given stream + pos belongs so no need to cry if the entry is not there + Bug 48679 + + poppler/XRef.cc | 10 ++++++---- + poppler/XRef.h | 2 +- + 2 files changed, 7 insertions(+), 5 deletions(-) + +commit bcbe9497a4fa50b41852abd538ad139c7b6693e5 +Author: suzuki toshiya +Date: Tue Apr 17 20:21:58 2012 +0200 + + Copying graphics library CFLAGS to cpp frontend Makefile.am. + + Because poppler-image.cpp includes PNGWriter.h, JpegWriter.h, + TiffWriter.h, + CFLAGS to include libpng, libjpeg and libtiff headers are expected. + + cpp/Makefile.am | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +commit 44c9df8277877ee1021317a3b6c253f80310f826 +Author: suzuki toshiya +Date: Tue Apr 17 20:21:00 2012 +0200 + + Do not clear FREETYPE_CFLAGS, FREETYPE_LIBS before PKG_CHECK_MODULES() + + Although configure --help says as if environmental variables + FREETYPE_CFLAGS and FREETYPE_LIBS will overwrite the values obtained + by pkg-config. But it is not. These help messages are automatically + given + by pkg-config macro (so I guess no poppler developer designed so + intentionally). + + In current configure, FREETYPE_CFLAGS, FREETYPE_LIBS are cleared + before + PKG_CONFIG_MODULES(), like: + + dnl Check for freetype headers + FREETYPE_LIBS= + FREETYPE_CFLAGS= + + PKG_CHECK_MODULES(FREETYPE, freetype2, + [freetype_pkgconfig=yes], + [freetype_pkgconfig=no]) + + if test "x$freetype_pkgconfig" = "xyes"; then + + AC_DEFINE(HAVE_FREETYPE_H, 1, [Have FreeType2 include + files]) + + else + + AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) + [...] + + Checking the history why these values are cleared, it seems that + the initial revision of poppler did not use pkg-config to detect + FREETYPE_CFLAGS, _LIBS. At that time, only freetype-config is used. + In later, when PKG_CHECK_MODULES is introduced, it was accidentally + introduced AFTER the clearning of FREETYPE_CFLAGS,_LIBS. As a result, + the inconsistency between "configure --help" and what configure does + really. I propose to move the clearance of FREETYPE_CFLAGS,_LIBS + just before AC_PATH_PROG, to make PKG_CHECK_MODULES catch the + environmental + values. + + configure.ac | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 9e0f0368e543df46b40cbd7bed6fdc1abf846e7d +Author: suzuki toshiya +Date: Tue Apr 17 20:19:41 2012 +0200 + + Do not append "-ansi" to CXXFLAG, if "-std=XXX" is already specified. + + SplashOutputDev.cc uses isfinite() function (defined by math.h). + isfinite() was standardized in C99, and imported to C++0x in later. + + In QNX header file system, isfinite() is disabled by default, + the definition of __STDC_VERSION__ > 199901 is required to enable it. + In the case of GCC, "-std=c99" (for C) or "-std=gnu++0x" (for C++) + is expected. + + But, current configure of poppler appends "-ansi" flag for CXXFLAGS, + if the compiler is known to be GNU. "-ansi" is C89 or C++98, + so isfinite() + is unavailable. I propose a patch NOT to "-ansi" flag, if CXXFLAGS + includes "-std=XXX" already. + + configure.ac | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 2f1e7ef252b8d1f7ee6004825c2926f0f5e181a5 +Author: Albert Astals Cid +Date: Thu Apr 12 23:11:41 2012 +0200 + + Do not crash in broken documents + + They might trigger an xref reconstruct and then i could not be in + bounds anymore + Crash found by Joel Voss of Leviathan Security Group + + poppler/XRef.cc | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 19fb9caecb1b265a8b8651e9bcf4b779f593fefd +Author: Albert Astals Cid +Date: Thu Apr 12 22:24:50 2012 +0200 + + Fix crash when the destination file does not exist + + Issue found by Joel Voss of Leviathan Security Group + + utils/HtmlOutputDev.cc | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit fa4848eae370437ab1b9863124e9a340830f66c7 +Author: Adrian Johnson +Date: Fri Apr 13 22:11:01 2012 +0930 + + man pages: add missing section heading + + utils/pdftotext.1 | 1 + + 1 file changed, 1 insertion(+) + +commit 08a14aa37b177bb4586869857ae678cb4bcd4039 +Author: Albert Astals Cid +Date: Thu Apr 12 21:52:30 2012 +0200 + + 0.19.3 + + CMakeLists.txt | 4 ++-- + NEWS | 26 +++++++++++++++++++++++++- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + 8 files changed, 33 insertions(+), 9 deletions(-) + +commit 52227b59d1fa2a2029bfff2f8a167efd81faebbb +Author: Albert Astals Cid +Date: Thu Apr 12 20:52:55 2012 +0200 + + Update (C) + + poppler/CairoFontEngine.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 40cb3f27f4dcad4fe8c48f0b638eac7913fc3722 +Author: Albert Astals Cid +Date: Thu Apr 12 20:50:38 2012 +0200 + + Do not pass those params to createGfx since they aren't used + + glib/poppler-page.cc | 4 ++-- + poppler/Page.cc | 9 +++------ + poppler/Page.h | 5 ++--- + 3 files changed, 7 insertions(+), 11 deletions(-) + +commit 9a10d31fca7f060f24bae9efe15662f02a9684ca +Author: Fabio D'Urso +Date: Thu Apr 12 20:31:23 2012 +0200 + + qt4: Remove unimplemented revision setters from public API + + qt4/src/poppler-annotation-private.h | 2 ++ + qt4/src/poppler-annotation.cc | 62 + ++++++++-------------------------- + qt4/src/poppler-annotation.h | 13 ------- + 3 files changed, 16 insertions(+), 61 deletions(-) + +commit 0531329aeb8783c48f056929e6e81cebda33500f +Author: Albert Astals Cid +Date: Thu Apr 12 20:07:13 2012 +0200 + + [qt4] Mark the dummy stuff as deprecated + + qt4/src/poppler-annotation.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 67b7b2bdd0943680437d96349c3415aa40082cbb +Author: Albert Astals Cid +Date: Thu Apr 12 20:06:52 2012 +0200 + + [qt4] initialize the dummy members here too + + qt4/src/poppler-annotation.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit bf171382afb6b50284c3855e3a1815a15ec34366 +Author: Albert Astals Cid +Date: Thu Apr 12 19:24:42 2012 +0200 + + Add since markers + + qt4/src/poppler-annotation.h | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit e36fd775394ee752c0f62f789359c72b52094975 +Author: Albert Astals Cid +Date: Thu Apr 12 18:58:29 2012 +0200 + + Remove unneeded forward declaration + + qt4/src/poppler-qt4.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit c1aa4a8c0aa9d46757e3849776acac42731e02d1 +Author: Fabio D'Urso +Date: Thu Apr 12 00:39:33 2012 +0200 + + qt4: Annotation appearance invalidation + + Call Annot::invalidateAppearance every time the visual aspect + is changed + + qt4/src/poppler-annotation.cc | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit 4338ae354c66e4df8d7d70a156517e27b3b80539 +Author: Fabio D'Urso +Date: Sun Mar 25 22:58:33 2012 +0200 + + qt4: Added HideAnnotations option to PSConverter + + qt4/src/poppler-ps-converter.cc | 23 ++++++++++++++++++++++- + qt4/src/poppler-qt4.h | 3 ++- + 2 files changed, 24 insertions(+), 2 deletions(-) + +commit e50993b3b47a759c93ccdeeaef289d6985b05bb1 +Author: Fabio D'Urso +Date: Thu Mar 22 19:58:12 2012 +0100 + + qt4: DOM annotation store - Black color is different than invalid + color + + qt4/src/poppler-annotation.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4739a6a02097f110c37defdfa616351459902806 +Author: Fabio D'Urso +Date: Mon Mar 19 19:17:33 2012 +0100 + + qt4: Annotation removal + + qt4/src/poppler-annotation-private.h | 3 +++ + qt4/src/poppler-annotation.cc | 29 +++++++++++++++++++++++++++++ + qt4/src/poppler-page.cc | 5 +++++ + qt4/src/poppler-qt4.h | 8 ++++++++ + 4 files changed, 45 insertions(+) + +commit 25a64d69aaab61c8cf944107e649e19920244a2b +Author: Fabio D'Urso +Date: Tue Mar 20 01:46:07 2012 +0100 + + qt4: TextAnnotation write support + basic textFont getter + + Also makes inplaceText a synoym for contents + + qt4/src/poppler-annotation.cc | 159 + ++++++++++++++++++++++++++++++++--------- + 1 file changed, 124 insertions(+), 35 deletions(-) + +commit a31a8118ba07aa7f90c69130476fb7d86f8614ad +Author: Fabio D'Urso +Date: Sun Mar 11 23:57:51 2012 +0100 + + qt4: GeomAnnotation, InkAnnotation and CaretAnnotation write support + + qt4/src/poppler-annotation.cc | 103 + +++++++++++++++++++++++++++++++++++++---- + qt4/src/poppler-annotation.h | 6 +-- + 2 files changed, 96 insertions(+), 13 deletions(-) + +commit e4052b52002447772e24571fd13f0f22fd2bfb16 +Author: Fabio D'Urso +Date: Sat Mar 10 17:48:56 2012 +0100 + + qt4: HighlightAnnotation and StampAnnotation write support + + qt4/src/poppler-annotation.cc | 96 + ++++++++++++++++++++++++++++++++++++++--- + qt4/src/poppler-annotation.h | 4 +- + 2 files changed, 91 insertions(+), 9 deletions(-) + +commit b5e948b6130cdb04387a8244179337c7904dcd03 +Author: Fabio D'Urso +Date: Wed Mar 14 17:44:50 2012 +0100 + + qt4: Annotation insertion and LineAnnotation support + + This patch adds Page::addAnnotation to insert new annotations in + a page. + The only annotation type that can be added is LineAnnotation. Support + for other + types will be added in the next patches. + + qt4/src/poppler-annotation-private.h | 12 ++ + qt4/src/poppler-annotation.cc | 297 + ++++++++++++++++++++++++++++++++-- + qt4/src/poppler-annotation.h | 4 +- + qt4/src/poppler-page.cc | 5 + + qt4/src/poppler-qt4.h | 9 ++ + 5 files changed, 316 insertions(+), 11 deletions(-) + +commit 20b4feec612448be8a800173ddadbf257657477e +Author: Fabio D'Urso +Date: Fri Mar 9 19:31:16 2012 +0100 + + qt4: Basic setters to edit annotations + + qt4/src/poppler-annotation-helper.h | 15 ++++ + qt4/src/poppler-annotation-private.h | 1 + + qt4/src/poppler-annotation.cc | 128 + +++++++++++++++++++++++++++++++--- + 3 files changed, 135 insertions(+), 9 deletions(-) + +commit 0e8c35b59f0fba926b30c9a87823c92ae03bf116 +Author: Fabio D'Urso +Date: Fri Mar 9 01:04:28 2012 +0100 + + qt4: Changes to Annotation API (part 2/2) + + 1) Moved annotation data retrieval logic to getters for types of + annotations + that will be made editable in next patches. + Others (Link, FileAttachment, Sound, Movie and Screen) are still + entirely filled + at creation time. + + 2) TextAnnotation's callout points setter now takes an array, not just + individual points. + + 3) AnnotationPrivate::pdfObjectReference replaced with a getter + method that + directly queries the tied Annot object (if any) + + qt4/src/poppler-annotation-helper.h | 31 +- + qt4/src/poppler-annotation-private.h | 23 +- + qt4/src/poppler-annotation.cc | 1254 + +++++++++++++++++++++++++++++++--- + qt4/src/poppler-annotation.h | 58 +- + qt4/src/poppler-link.cc | 2 +- + qt4/src/poppler-page.cc | 778 +-------------------- + qt4/src/poppler-qt4.h | 4 +- + 7 files changed, 1217 insertions(+), 933 deletions(-) + +commit 73b91207649a81740183e2288809d3b84b52f595 +Author: Fabio D'Urso +Date: Wed Mar 7 17:05:50 2012 +0100 + + qt4: Changes to Annotation API (part 1/2) + + This is part 1/2 of a change in annotation API. It breaks both source + and binary + compatibility. + + Note that, even though DOM methods are partially modified by this + patch, their + output is 100% backward compatible. Therefore code relying only on + DOM methods + (i.e. AnnotationUtils methods) will keep working. + + 1) Style and Popup container classes + + Style and Popup (previously known as Window) properties are now + wrapped in + container classes. In both of them, private data is implicitly shared. + The old Window structure is removed, but an undocumented window + field is still + exported to make Okular 4.8.0 compile. It must not be used. + + 2) Revisions + + The Annotation::Revision structure was removed, because it added an + extra layer + of indirection that can be avoided. Now revision scope and type + are stored + directly in the target Annotation, and Annotation::revisions() + returns a list + of pointers to child annotations. + + 3) All constructors are temporarily made private + + This patch hides all constructors from user code. Subsequent + patches will + restore them in the same patch as their type-specific creation + support. + + 4) Minor fixes + - Popup size was incorrectly stored as an integer value, now + it's part of + a QRectF. + - Typo: LinkAnnotation::linkDestionation() --> linkDestination + - Dash array is now exported as QVector instead of + a marks/spaces + integer pair + - GeomAnnotation's geometricalPointWidth removed, because it + was never + referenced and it doesn't exist in PDF specs + + 5) AnnotationPrivate data is now explicitly shared + Annotation private data has been rearranged so that it's now + possible to + uniformly give ownership of all Annotation objects to the caller. + Previously Page::annotations() did leave ownership to user, but + Annotation::revisions() didn't. Now both of them give ownership + to user. + + qt4/src/poppler-annotation-private.h | 19 +- + qt4/src/poppler-annotation.cc | 1022 + ++++++++++++++++++++++++---------- + qt4/src/poppler-annotation.h | 292 +++++++--- + qt4/src/poppler-page.cc | 92 ++- + qt4/src/poppler-qt4.h | 6 + + 5 files changed, 997 insertions(+), 434 deletions(-) + +commit 7f0f080277d35f6f2e426ca2a3ff76c2856daeaf +Author: Adrian Johnson +Date: Tue Apr 10 00:08:49 2012 +0930 + + cairo: fix stroke pattern with transparency group + + Cairo copy path/append path with device offsets is broken. Use GfxPath + instead. + + Bug 48468 + + poppler/CairoOutputDev.cc | 15 ++++++--------- + poppler/CairoOutputDev.h | 4 ++-- + 2 files changed, 8 insertions(+), 11 deletions(-) + +commit 5ea305c3924cead302092378ab67300c3099afd9 +Author: Adrian Johnson +Date: Sun Apr 8 23:11:30 2012 +0930 + + cairo: only align stroke coords for horizontal and vertical lines + + Bug 48318 + + poppler/CairoOutputDev.cc | 80 + ++++++++++++++++++++++++++++++++++----------- + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 62 insertions(+), 20 deletions(-) + +commit 8414d8f621b8abb018e80f2255cfb511a1e558d4 +Author: Adrian Johnson +Date: Mon Apr 9 12:08:20 2012 +0930 + + cairo: ensure 0 width lines with stroke_adjust are aligned + + Previously the code path for 0 width lines ignored the stroke_adjust + setting. Rearrange the code so the code path for stroke_adjust == TRUE + is performed first (this will also set 0 width lines to 1 pixel wide). + + poppler/CairoOutputDev.cc | 42 + +++++++++++++++++++++--------------------- + 1 file changed, 21 insertions(+), 21 deletions(-) + +commit af1a84eb90656de68bb14f2c4ae4f813c51bc3a3 +Author: Adrian Johnson +Date: Mon Apr 9 17:17:29 2012 +0930 + + cairo: fix paintTransparencyGroup when both mask and fill opacity + are required + + Bug 48453 + + poppler/CairoOutputDev.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 46b3a70cae3b37cb4270a83afaddd6734442b752 +Author: Fabio D'Urso +Date: Mon Apr 9 19:32:24 2012 +0200 + + Caption text rendering in AnnotLine + + poppler/Annot.cc | 262 + +++++++++++++++++++++++++++++++++++++----------------- + poppler/Annot.h | 2 + + 2 files changed, 183 insertions(+), 81 deletions(-) + +commit 855607828447ecec2c8444650d015e21bd17d2e2 +Author: Fabio D'Urso +Date: Mon Apr 9 16:45:50 2012 +0200 + + AnnotFreeText rendering improvements (auto word-wrap, quadding, + border style, font/border color) + + poppler/Annot.cc | 146 + ++++++++++++++++++++++++++++++++++++++++++------------ + poppler/Annot.h | 1 + + 2 files changed, 115 insertions(+), 32 deletions(-) + +commit 80f662162698c1ec27771d9cf5e2e6bc3d21c4df +Author: Ihar Filipau +Date: Thu Apr 12 00:19:26 2012 +0200 + + Fix the mask inversion + + utils/HtmlOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 06591d848e53598973f7d5fddac50785a46e8027 +Author: Thomas Freitag +Date: Wed Apr 11 23:49:29 2012 +0200 + + Fix Splash CMYK merge error + + Mail says + ****** + Hi, + + playing around with the attached PDF to get a better CMYK support for + the blend mode soft light, I encountered that I made a big mistake + during merge in the CMYK part of splash. I fixed that. The attached + patch also includes the small enhancement I made in soft light + routine. + ****** + + poppler/SplashOutputDev.cc | 9 +++++++++ + splash/Splash.cc | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 1f45afde6410f03c79fcf4b66d5834079879d38f +Author: Ihar Filipau +Date: Mon Apr 9 19:17:41 2012 +0200 + + Add producer and version to xml output + + utils/HtmlOutputDev.cc | 2 +- + utils/pdf2xml.dtd | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit cef6ac0ebbf8451beaadb3ddb6c991bbb7239432 +Author: Fabio D'Urso +Date: Sun Apr 8 23:15:15 2012 +0200 + + FIX: Do not append a NUL character to Unicode page labels + + poppler/PageLabelInfo.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 3d4985f14e54ddcc64ea654b23e931b7e6acfbdc +Author: Fabio D'Urso +Date: Sat Apr 7 11:28:36 2012 +0200 + + Do not trust the rect of AnnotTextMarkup when drawing + + poppler/Annot.cc | 43 +++++++++++++++++++++++++++++-------------- + 1 file changed, 29 insertions(+), 14 deletions(-) + +commit c6296cd8c1ca398beac20f1e88c87b9082386247 +Author: Fabio D'Urso +Date: Sat Apr 7 00:30:54 2012 +0200 + + Do not trust the rect of AnnotLine, AnnotPolygon and AnnotInk + when drawing + + poppler/Annot.cc | 126 + +++++++++++++++++++++++++++++++++++++++++++----------- + poppler/Annot.h | 27 ++++++++++++ + 2 files changed, 128 insertions(+), 25 deletions(-) + +commit 503620ae74d719da52e3374725e490c62f7be7a3 +Author: Fabio D'Urso +Date: Thu Mar 29 19:07:05 2012 +0200 + + Do not recreate Annots when writing to PS, Export poppler-generated + Annot appearance resource dict + + 1) With previous code each Annot object was reconstructed from the + pdf object when + writing to PS, leading to the fact that writeDocSetup couldn't see the + generated appearance. + This patch makes writeDocSetup use the same Annots object returned by + Page::getAnnots. + + 2) This patch also enables each Annot subtype to control the exported + resources. AnnotFreeText uses this new method to export font + information. + + 3) Comment fixed in Page.h: Page::getAnnots does *not* give away + ownership, in + fact the returned object is destroyed by ~Page. + + poppler/Annot.cc | 28 ++++++++++++++++++++++++++++ + poppler/Annot.h | 5 +++-- + poppler/FontInfo.cc | 11 ++++------- + poppler/PSOutputDev.cc | 12 +++--------- + poppler/Page.h | 2 +- + 5 files changed, 39 insertions(+), 19 deletions(-) + +commit 2733504890333b0925d95e01310726d11fed44d8 +Author: Fabio D'Urso +Date: Fri Mar 23 20:54:58 2012 +0100 + + Basic AnnotFreeText rendering (hardcoded font, WinAnsi characters + only) + + This patch also moves layoutText and writeString from AnnotWidget + to Annot + + poppler/Annot.cc | 137 + +++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 11 +++-- + 2 files changed, 142 insertions(+), 6 deletions(-) + +commit 3023a59c0a1a5974b232f6f8cb629eabb6797616 +Author: Fabio D'Urso +Date: Sun Mar 25 22:04:11 2012 +0200 + + AnnotTextMarkup rendering improvements + + 1) FIX: Wrong coords in typeUnderline and typeStrikeout + 2) Implementation of typeSquiggly + 3) FIX: Form creation is common to all markup types + + poppler/Annot.cc | 92 + +++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 56 insertions(+), 36 deletions(-) + +commit 8927ddc448edc016043107e88e3bc3b2b8b03269 +Author: Fabio D'Urso +Date: Thu Mar 22 17:33:01 2012 +0100 + + Improvements to AnnotLine::draw + + poppler/Annot.cc | 50 + ++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 46 insertions(+), 4 deletions(-) + +commit bd7a40fd0312c753d1871558b566376304f1ff35 +Author: Fabio D'Urso +Date: Wed Mar 21 22:48:05 2012 +0100 + + AnnotInk rendering + + poppler/Annot.cc | 62 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 ++ + 2 files changed, 64 insertions(+) + +commit 6a8794abe639db8284db079e028cbcd66e138884 +Author: Fabio D'Urso +Date: Wed Mar 21 22:33:13 2012 +0100 + + AnnotPolygon rendering + + poppler/Annot.cc | 87 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 ++ + 2 files changed, 89 insertions(+) + +commit f389c50458079f24164b1c12b1151c8617485acb +Author: Fabio D'Urso +Date: Wed Mar 21 21:12:59 2012 +0100 + + Do not fill AnnotGeometry with transparent color + + Previously it was filled with black. + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c63cc22dd82f827305ad57f241ad49998f2a1c23 +Author: Albert Astals Cid +Date: Sun Apr 8 12:28:17 2012 +0200 + + Remove extra copy() (memleak) + + poppler/GlobalParams.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit ed0c9640abcbea459e3a276ee0b27631b01c32c4 +Author: Albert Astals Cid +Date: Sun Apr 8 12:24:20 2012 +0200 + + Do not crash if mallocing too much memory + + Fixes crash in + https://ritdml.rit.edu/bitstream/handle/1850/11220/TYehThesis1992.pdf?sequence=1 + even though the page is still unrendered + + poppler/JBIG2Stream.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit f1e621adbbb74ec709022b2a31195331651c83fa +Author: Adrian Johnson +Date: Sun Apr 8 19:42:05 2012 +0930 + + cairo: use correct userfont font bbox + + cairo 1.12 started clipping text to the font bbox + + Bug 48399 + + poppler/CairoFontEngine.cc | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit f5b708c3e04ba50756cd9f9530cf82f547443ce9 +Author: Suzuki Toshiya +Date: Fri Apr 6 15:22:36 2012 +0200 + + ttc<->ttf fallback is expected for CJK font list in GlobalParamsWin.cc + + Bug 48046 + + poppler/GlobalParamsWin.cc | 224 + +++++++++++++++++++++++++------------------- + 1 file changed, 128 insertions(+), 96 deletions(-) + +commit 4e940b14a6fddde9a1714976ff8045e26cbf7d40 +Author: Adrian Johnson +Date: Mon Apr 2 20:03:11 2012 +0930 + + cairo: fix regression caused by mesh gradients + + poppler/CairoOutputDev.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 74a7d963de75c0097eedcf4224d13cf275a64757 +Author: Carlos Garcia Campos +Date: Sun Apr 1 19:35:48 2012 +0200 + + regtest: remove debug print to show bisect exit status in Bisect.py + + regtest/Bisect.py | 1 - + 1 file changed, 1 deletion(-) + +commit 2749db77eb8ccdbc4b0771163c8942f882f259f4 +Author: Carlos Garcia Campos +Date: Sun Apr 1 19:20:37 2012 +0200 + + regtest: Fix crash when creating HTML report for a single test + + regtest/commands/create-report.py | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 1c8e1bb637347d0d31945f9d265b29e7b49396e2 +Author: Carlos Garcia Campos +Date: Sun Apr 1 19:11:57 2012 +0200 + + regtest: Don't show results for crashed or failed to run tests in + HTML report + + regtest/HTMLReport.py | 2 ++ + 1 file changed, 2 insertions(+) + +commit a5f4936dfb3e60ca37f932cc066aa10765f3cbc9 +Author: Fabio D'Urso +Date: Sat Mar 24 23:13:48 2012 +0100 + + Fix: annotDisplayDecideCbk was not propagated + + poppler/OutputDev.h | 6 +++++- + poppler/PSOutputDev.cc | 11 ++++++++--- + poppler/PSOutputDev.h | 5 ++++- + poppler/Page.cc | 3 ++- + utils/HtmlOutputDev.h | 5 ++++- + 5 files changed, 23 insertions(+), 7 deletions(-) + +commit aab8c9a026f781da47ecedd453e225f906361444 +Author: Albert Astals Cid +Date: Thu Mar 29 21:49:38 2012 +0200 + + Increase version + + CMakeLists.txt | 4 ++-- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 6 insertions(+), 6 deletions(-) + +commit f7e65b62480631d0485167a81a588a176630dd8d +Author: Albert Astals Cid +Date: Thu Mar 29 21:48:11 2012 +0200 + + 0.19.2 news + + NEWS | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +commit 627e072eb1edbfabf549656e9abf10100ed7340c +Author: Albert Astals Cid +Date: Thu Mar 29 21:40:13 2012 +0200 + + Update copyrights + + poppler/TextOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit e9ad888b003d343d8ca60f044c7cf10a8df81cf4 +Author: Albert Astals Cid +Date: Thu Mar 29 19:49:34 2012 +0200 + + Add quotes to the poppler version define + + poppler/poppler-config.h.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8172bb03b6e8f1c16e1a152fb251b10446f54129 +Author: Peter Breitenlohner +Date: Mon Mar 26 11:13:34 2012 +0200 + + define POPPLER_VERSION as C string + + Signed-off-by: Peter Breitenlohner + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4a38d933d06d189317b1b9028c3fa4ae2a1551af +Author: Suzuki Toshiya +Date: Thu Mar 29 19:34:25 2012 +0200 + + per-collection fallback for missing CID-keyed fonts on Win32 + + poppler/GlobalParamsWin.cc | 38 ++++++++++++++++++++++++++++++++++---- + 1 file changed, 34 insertions(+), 4 deletions(-) + +commit a0b3e0938e08847d10c5d7b7528c7c5d43a7a3b8 +Author: Hib Eris +Date: Thu Mar 29 07:52:30 2012 +0200 + + Fix help message + + Partial credit goes to suzuki toshiya + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 631224dc0c721119c91984f1940c9e51edf17eca +Author: Fabio D'Urso +Date: Tue Mar 20 00:56:50 2012 +0100 + + Annotation removal + + poppler/Annot.cc | 17 +++++++++++++++++ + poppler/Annot.h | 1 + + poppler/Page.cc | 36 ++++++++++++++++++++++++++++++++++++ + poppler/Page.h | 3 +++ + 4 files changed, 57 insertions(+) + +commit 20476370a445a26f1fae9db6ad58727ee3c63550 +Author: Fabio D'Urso +Date: Wed Mar 28 23:16:37 2012 +0200 + + Basic support for Annot appearance stream removal and invalidation + + poppler/Annot.cc | 190 + ++++++++++++++++++++++++++++++++++++++++-------------- + poppler/Annot.h | 29 +++++++-- + 2 files changed, 168 insertions(+), 51 deletions(-) + +commit e9a066c3a53cc1cb73dd43a243390ae4e3c76ca3 +Author: Albert Astals Cid +Date: Wed Mar 28 23:33:37 2012 +0200 + + Fix another typo in macGlyphNames + + fofi/FoFiTrueType.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3d277b230e806a648fcc6d9e7af39370aa89c2ae +Author: Adrian Johnson +Date: Sat Feb 18 09:19:51 2012 +1030 + + Fix typo in "mu" glyph name in truetype 'post' table standard mac + ordering + + The standard mac ordering table is at: + + https://developer.apple.com/fonts/ttrefman/rm06/Chap6post.html + + fofi/FoFiTrueType.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 47b910d35b2cf5914ed4c07f751c5e8c304be7fc +Author: suzuki toshiya +Date: Wed Mar 28 20:21:44 2012 +0200 + + Add quotes + + this is quite small fix. In poppler's configure, basically the shell + variables are not enclosed, and not quoted, aslike + if test x$use_glib = x; then + This syntax make the test command confused when use_glib is multi-word + value, as, "no (required cairo output)". In such case, test cannot + know + how to evaluate the token "no" "(required" "cairo", so some "syntax + error" + messages are given. Thus, quoting of the variable would be safer. + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 78224609f6c1d87deee72b60a8f8f9f6c36ac75f +Author: Albert Astals Cid +Date: Wed Mar 28 20:21:11 2012 +0200 + + Workaround Windows problem with libjpeg + + In libjpeg6b, there is a type definition conflict issue in jmorecfg.h. + jmorecfg.h typedefs INT16 as short, INT32 as long. The latter conflict + with basetsd.h of Microsoft Windows SDK or MinGW that typedefs INT32 + as int. basetsd.h is included by windows.h, so, if the users work with + ANSI C features only, the conflict does not appear, it would be the + background why such fundamental error has been preserved. + Anyway, jmorecfg.h designer was aware about the conflict with + X11 headers + (Xmd.h defines INT16, INT32, etc), so if we pretend as if Xmd.h were + included (by defining XMD_H), this issue can be bypassed. Attached + patch + checks the conflict, then, if there is a conflict, tries XMD_H + trick, and + uses it if it works. If jmorecfg.h or basetsd.h was manually fixed to + prevent this issue, this trick is not used. + + configure.ac | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit d8cf31f8c7e190939525ad68cd4617fb48fea60e +Author: suzuki toshiya +Date: Wed Mar 28 20:20:43 2012 +0200 + + update Makefile.am to reflect LIBJPEG_CFLAGS, LIBTIFF_CFLAGS, + LIBPNG_CFLAGS for related sources. + + goo/Makefile.am | 15 +++++++++++++++ + poppler/Makefile.am | 6 ++++++ + splash/Makefile.am | 16 ++++++++++++++++ + utils/Makefile.am | 6 ++++++ + 4 files changed, 43 insertions(+) + +commit f0c13f5efc641c63627b8f0b0815b6b511d8d196 +Author: suzuki toshiya +Date: Wed Mar 28 20:20:06 2012 +0200 + + Configure improvements for libs in non default paths + + evaluate pkg-config-like environmental variables like LIBJPEG_CFLAGS, + LIBJPEG_LIBS, LIBTIFF_CFLAGS and LIBTIFF_LIBS in configuration. + + configure.ac | 50 ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 44 insertions(+), 6 deletions(-) + +commit e55f485d803cb1f82e0d8a53d1998e1887c7920f +Author: suzuki toshiya +Date: Wed Mar 28 20:19:08 2012 +0200 + + Improve m4/libjpeg.m4 + + m4/libjpeg.m4 uses USER_INCLUDES and USER_LDFLAGS in it, but + USER_INCLUDES is not reflected when jpeglib.h is searched. + this patch modifies m4/libjpeg.m4 to reflect USER_INCLUDES + when jpeglib.h is searched. + + m4/libjpeg.m4 | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit e88c17d45220eea60a3dd7fab26a067616388c5f +Author: Albert Astals Cid +Date: Wed Mar 28 20:05:45 2012 +0200 + + Fix compile in windows + + poppler/GlobalParamsWin.cc | 35 ++++++++++++++++++++++++++++++----- + 1 file changed, 30 insertions(+), 5 deletions(-) + +commit ee0eaabe24019d2af226ef03e3f456787525e040 +Author: Fabio D'Urso +Date: Mon Mar 19 00:05:49 2012 +0100 + + Added Array::remove (and Object::arrayRemove) + + poppler/Array.cc | 13 +++++++++++++ + poppler/Array.h | 4 ++++ + poppler/Object.h | 5 +++++ + 3 files changed, 22 insertions(+) + +commit d6a1b7dcaeac1e49533519b9f8a279fd64d04c67 +Author: Thomas Freitag +Date: Tue Mar 27 00:00:05 2012 +0200 + + Some regression fixes/improvements + + I just finished the patch for these regressions, they had differents + reasons + 1. In CharCodeToUnicode::mapToUnicode the identity support was missing + 2. The new algorithms for axial and radial shading caused problems in + cairo. I revert these changes but removed the examination of hidden + content (this is already done in the calling function) + 3. The examination of optional hidden content in showing text + was wrong: + of course hidden text should not be shown, but text parameters + like text + position in the state must be changed! + 4. Searching and finding fonts especially with base14 fonts should be + more exact than just looking at the base14 name (i.e. fixed width + and so + on) when using fontconfig. I implement that to find the best font + fitting to the needs. + + poppler/CharCodeToUnicode.cc | 5 + + poppler/Gfx.cc | 329 + +++++++++++++++++++----------------------- + poppler/GfxFont.cc | 3 +- + poppler/GlobalParams.cc | 78 +++++++--- + poppler/GlobalParams.h | 6 +- + 5 files changed, 218 insertions(+), 203 deletions(-) + +commit a5257efe00d0fe850b1abe5c552f7581027ac64c +Author: Fabio D'Urso +Date: Mon Mar 26 19:28:55 2012 +0200 + + Re-added forceRasterize to PSOutputDev (and qt4 fix too)‏ + + The patch restores the forceRasterize argument in PSOutputDev ctors. + Commit 6ee907f291427b8751a872b31210bf32e8d2b722 had removed it, + turning it + into a global param. + As a side effect, this patch also fixes qt4/poppler-ps-converter, + which had + not been updated to the new signature, and thus produced corrupted + output if + forceRasterization was set. + + glib/poppler-page.cc | 2 +- + poppler/GlobalParams.cc | 16 ---------------- + poppler/GlobalParams.h | 3 --- + poppler/PSOutputDev.cc | 6 +++++- + poppler/PSOutputDev.h | 3 +++ + 5 files changed, 9 insertions(+), 21 deletions(-) + +commit 55d039ada063a9427de6dd59846ce1570ab26e9f +Author: Suzuki Toshiya +Date: Mon Mar 26 22:31:29 2012 +0200 + + CJK improvements + + More info in the mailing list threads + * script names for vertical writing mode should be differentiated + for CJK + * 2 workarounds for a Korean font on Microsoft Windows + + fofi/FoFiTrueType.cc | 47 + ++++++++++++++++++++++++++++++++++++----------- + fofi/FoFiTrueType.h | 8 +++++++- + poppler/GfxFont.cc | 14 ++++++++------ + 3 files changed, 51 insertions(+), 18 deletions(-) + +commit a8b0fa4d07480242afba7751995e38eaf3147ac5 +Author: Horst Prote +Date: Mon Mar 26 21:04:32 2012 +1030 + + don't add newline to last line extracted by TextSelectionDumper + + Bug 45955 + + poppler/TextOutputDev.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c40e2315cd796ba928969d13a761f5f19d8438fc +Author: Adrian Johnson +Date: Fri Mar 23 21:49:42 2012 +1030 + + cairo: use a transparency group with + setSoftMaskFromImageMask/unsetSoftMaskFromImageMask + + Drawing a tiling pattern between setSoftMaskFromImageMask and + unsetSoftMaskFromImageMask clears the softmask. + + Similar to Splash, create a transparency group in + setSoftMaskFromImageMask. Pop and paint the group in + unsetSoftMaskFromImageMask. The saveState/restoreState is to ensure + the softmask is restored before painting the group. + + Bug 47739 + + poppler/CairoOutputDev.cc | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 7b57afea2e433fc7b6f359a62b1289f0e1da3267 +Author: Adrian Johnson +Date: Sat Mar 24 08:27:34 2012 +1030 + + cairo: update cairo mesh pattern to 1.12 api + + Now that a stable version of cairo with mesh gradient support is + released update poppler to use this api. + + poppler/CairoOutputDev.cc | 40 ++++++++++++++++++++-------------------- + poppler/CairoOutputDev.h | 4 ++-- + 2 files changed, 22 insertions(+), 22 deletions(-) + +commit 2f156b34fc8755ddd2a32cac830f3073d6b2c481 +Author: Suzuki Toshiya +Date: Fri Mar 23 20:00:18 2012 +0100 + + Fix compile in mingw-gcc + + poppler/GlobalParamsWin.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 06b6db92dd1ec32f9a55347073f8b533aa074ee1 +Author: Fabio D'Urso +Date: Sun Mar 18 23:58:05 2012 +0100 + + Added XRef::removeIndirectObject + + poppler/PDFDoc.cc | 15 ++++++++++----- + poppler/XRef.cc | 15 +++++++++++++++ + poppler/XRef.h | 2 ++ + 3 files changed, 27 insertions(+), 5 deletions(-) + +commit a2e9b7c02ffa0e5edc4da18cc726993bc92fc684 +Author: Fabio D'Urso +Date: Mon Mar 19 19:17:09 2012 +0100 + + Fix in AnnotMarkup's popup window handling + + AnnotPopup's ref was previously set to the *parent* annot, now + it's correctly + set to the *popup* annot's own. + + poppler/Annot.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 05641304df67beae546a2fe18071f3be52707aa8 +Author: Fabio D'Urso +Date: Mon Mar 19 20:56:45 2012 +0100 + + Basic Annot border editing support + + poppler/Annot.cc | 23 +++++++++++++++++++++++ + poppler/Annot.h | 9 +++++++++ + 2 files changed, 32 insertions(+) + +commit 3e6275a05066c152b265cc27275d9e4107c089e9 +Author: Fabio D'Urso +Date: Fri Mar 16 21:47:02 2012 +0100 + + Yet new setters to AnnotFreeText + + poppler/Annot.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 ++ + 2 files changed, 47 insertions(+) + +commit f69f41056fc8cd8a70b38024f255e9074af20bdc +Author: Pino Toscano +Date: Tue Mar 20 15:18:33 2012 +0100 + + cmake: reset CMAKE_REQUIRED_INCLUDES/CMAKE_REQUIRED_LIBRARIES + + cmake/modules/FindLIBOPENJPEG.cmake | 3 +++ + 1 file changed, 3 insertions(+) + +commit 4a9238441a5317c3304296e4e6430cccefe8322c +Author: Ihar Filipau +Date: Fri Mar 16 00:07:45 2012 +0100 + + Flip images if they need to + + Bug 32340 + + utils/HtmlOutputDev.cc | 50 + ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 48 insertions(+), 2 deletions(-) + +commit 6d68d0d3acc8c8e0d9d310b2e1ba2b07d6bfe942 +Author: Ihar Filipau +Date: Thu Mar 15 22:56:10 2012 +0100 + + pdftohtml: extract mask images even if they are not JPEG + + Bug #47186 + + utils/HtmlOutputDev.cc | 203 + ++++++++++++++++++++++++++++++------------------ + utils/HtmlOutputDev.h | 3 + + 2 files changed, 131 insertions(+), 75 deletions(-) + +commit 60155e0fc7224a6b479bf62133f72c460fe48078 +Author: Albert Astals Cid +Date: Thu Mar 15 20:46:53 2012 +0100 + + Install poppler-media.h + + qt4/src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 6a173844d5ca6f32e188406ab14cae6a7548fc1d +Author: Albert Astals Cid +Date: Thu Mar 15 20:44:12 2012 +0100 + + Add the export + + qt4/src/poppler-media.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e401f8e6ba3e18d5a3a4920cd111b2174c75f415 +Author: Albert Astals Cid +Date: Thu Mar 15 20:32:12 2012 +0100 + + Increase version and sonames + + CMakeLists.txt | 4 ++-- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + 9 files changed, 10 insertions(+), 10 deletions(-) + +commit ce059698e8c5097f75e7a0f828af0936aa104af0 +Author: Albert Astals Cid +Date: Thu Mar 15 20:27:45 2012 +0100 + + 0.19.1 news + + Also inclusing 0.18.x ones + + NEWS | 110 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 110 insertions(+) + +commit 2041d5721871adb2a23999c16ecbdc60abb7b1c4 +Author: Albert Astals Cid +Date: Thu Mar 15 20:20:31 2012 +0100 + + Update C years + + poppler/CMap.h | 1 + + poppler/GfxFont.h | 2 +- + poppler/Rendition.cc | 1 + + 3 files changed, 3 insertions(+), 1 deletion(-) + +commit 95d684aa2a87d01296f5e93516f2ac3f54adbec8 +Author: Guillermo Amaral +Date: Thu Mar 15 20:13:20 2012 +0100 + + Remove the QIODevice and go with a not so good but more safer + QByteArray + + Bug #47336 + + qt4/src/CMakeLists.txt | 1 - + qt4/src/Makefile.am | 1 - + qt4/src/poppler-media.cc | 35 +++++++++----- + qt4/src/poppler-media.h | 4 +- + qt4/src/poppler-page.cc | 1 - + qt4/src/poppler-streamsequentialdevice-private.h | 51 + -------------------- + qt4/src/poppler-streamsequentialdevice.cc | 56 + ---------------------- + 7 files changed, 26 insertions(+), 123 deletions(-) + +commit 9fee12f9bee7252db0974ef69870b69ff1452053 +Author: Albert Astals Cid +Date: Thu Mar 15 19:23:47 2012 +0100 + + Compile++ + + qt4/src/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit aa1e6d12d063a64a22841f7996101b45aa680ec7 +Author: Guillermo Amaral +Date: Thu Mar 15 00:35:31 2012 +0100 + + Added media rendition support for Qt4 + + qt4/src/CMakeLists.txt | 3 + + qt4/src/poppler-annotation.cc | 66 ++++++++++ + qt4/src/poppler-annotation.h | 47 ++++++- + qt4/src/poppler-link.cc | 44 +++++++ + qt4/src/poppler-link.h | 38 +++++- + qt4/src/poppler-media.cc | 149 + ++++++++++++++++++++++ + qt4/src/poppler-media.h | 94 ++++++++++++++ + qt4/src/poppler-page.cc | 32 ++++- + qt4/src/poppler-qt4.h | 2 + + qt4/src/poppler-streamsequentialdevice-private.h | 51 ++++++++ + qt4/src/poppler-streamsequentialdevice.cc | 56 ++++++++ + 11 files changed, 579 insertions(+), 3 deletions(-) + +commit 258e2197afa49e60b0b13a05408fc8d484dd8147 +Author: Fabio D'Urso +Date: Wed Mar 14 23:25:00 2012 +0100 + + Added some new setters to AnnotFreeText + + poppler/Annot.cc | 39 +++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 4 ++++ + 2 files changed, 43 insertions(+) + +commit 84a62ac157e03880c1c1eda60c3927bd4414640e +Author: Fabio D'Urso +Date: Wed Mar 14 23:24:28 2012 +0100 + + Added some new setters to AnnotGeometry, AnnotInk and AnnotCaret + + poppler/Annot.cc | 116 + ++++++++++++++++++++++++++++++++++++++++-------------- + poppler/Annot.h | 10 +++++ + 2 files changed, 96 insertions(+), 30 deletions(-) + +commit 233c9a097bdc382f6a2eb6319ee15528c72e9632 +Author: Fabio D'Urso +Date: Wed Mar 14 23:23:59 2012 +0100 + + Added some new setters to AnnotTextMarkup and AnnotStamp + + poppler/Annot.cc | 61 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 11 ++++++++-- + 2 files changed, 70 insertions(+), 2 deletions(-) + +commit 8fb3ac6cf66233b80959ba99a2c706111050f5f1 +Author: Fabio D'Urso +Date: Wed Mar 14 23:23:23 2012 +0100 + + Added Page::getDoc() + + poppler/Page.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit dc4cb07c1e735006d5168e0e65f5143d7fc53e12 +Author: Fabio D'Urso +Date: Wed Mar 14 23:22:10 2012 +0100 + + Added some new setters to AnnotLine and AnnotPolygon + + poppler/Annot.cc | 201 + ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + poppler/Annot.h | 16 +++++ + 2 files changed, 211 insertions(+), 6 deletions(-) + +commit 4931018eecc37dbbe0df1a456347ab200f1b057a +Author: Fabio D'Urso +Date: Wed Mar 14 23:21:07 2012 +0100 + + Make Dict::set remove the entry if object is Null + + poppler/Dict.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 13ac2c0bed3fa5515a3c068488cb6a0b17410a97 +Author: Fabio D'Urso +Date: Wed Mar 14 23:20:13 2012 +0100 + + Added some new setters to Annot and AnnotMarkup + + poppler/Annot.cc | 94 + ++++++++++++++++++++++++++++++++++++++++++++++++++---- + poppler/Annot.h | 8 +++++ + 2 files changed, 96 insertions(+), 6 deletions(-) + +commit aa2b5ffa7961aac0aea33ae9a42bf1f38a756b1b +Author: Pino Toscano +Date: Wed Mar 14 16:25:35 2012 +0100 + + qt4: replace ObjectReference with simplier Ref + + instead of roll out a new (still private) version of Ref, just use + it for private annotation and link data; + this needed a couple of explicit initializations of Ref (since it's + a simple struct with no methods) and a private operator== for it + + qt4/src/CMakeLists.txt | 1 - + qt4/src/poppler-annotation-private.h | 4 +- + qt4/src/poppler-annotation.cc | 1 + + qt4/src/poppler-link.cc | 16 +++--- + qt4/src/poppler-link.h | 5 +- + qt4/src/poppler-objectreference.cc | 89 + ---------------------------------- + qt4/src/poppler-objectreference_p.h | 77 ----------------------------- + qt4/src/poppler-page.cc | 7 ++- + 8 files changed, 21 insertions(+), 179 deletions(-) + +commit e5b914b2bfbb5e95ecde5f1ce148374b1d58dadd +Author: Ihar Filipau +Date: Tue Mar 13 23:54:26 2012 +0100 + + Add possibilty of controlling word breaks percentage + + Bug #47022 + + utils/HtmlOutputDev.cc | 7 +++++-- + utils/pdftohtml.1 | 5 +++++ + utils/pdftohtml.cc | 7 +++++++ + 3 files changed, 17 insertions(+), 2 deletions(-) + +commit 4388cb69114e406ec29e8b6976d1a900e4ab1b7d +Author: Albert Astals Cid +Date: Sun Mar 11 23:37:39 2012 +0100 + + Make doUpdateFont protected + + So that people inheriting from SplashOutputDev *yuck* can use it + more easily + Bug 46622 + + poppler/SplashOutputDev.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 448cfc431b7067af38da51e725ac0f1b2a0bc8f8 +Author: Tobias Koenig +Date: Sun Mar 11 23:22:18 2012 +0100 + + support for LinkMovie object in Qt4 frontend + + Bug #40561 + + qt4/src/CMakeLists.txt | 1 + + qt4/src/poppler-annotation-private.h | 4 ++ + qt4/src/poppler-annotation.h | 4 ++ + qt4/src/poppler-link.cc | 42 ++++++++++++---- + qt4/src/poppler-link.h | 43 ++++++++++++++-- + qt4/src/poppler-objectreference.cc | 89 + ++++++++++++++++++++++++++++++++++ + qt4/src/poppler-objectreference_p.h | 77 +++++++++++++++++++++++++++++ + qt4/src/poppler-page.cc | 39 +++++++++++---- + 8 files changed, 276 insertions(+), 23 deletions(-) + +commit a0d151deabf8243c98ff9953f8a43bb56fbf95a9 +Author: Carlos Garcia Campos +Date: Sun Mar 11 16:05:15 2012 +0100 + + regtest: Add find-regression command to run git bisect automatically + + regtest/Bisect.py | 113 + +++++++++++++++++++++++++++++++++++ + regtest/builder/__init__.py | 86 ++++++++++++++++++++++++++ + regtest/builder/autotools.py | 63 +++++++++++++++++++ + regtest/commands/find-regression.py | 77 ++++++++++++++++++++++++ + 4 files changed, 339 insertions(+) + +commit 856768c380ecea30ce9727b81c4c44b4f9489626 +Author: Carlos Garcia Campos +Date: Sat Mar 10 18:15:58 2012 +0100 + + regtest: Add information about skipped tests in the summary + + regtest/TestRun.py | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 508c7c3ef1f22459daa822f8287cab382119e753 +Author: Tobias Koenig +Date: Wed Mar 7 18:35:05 2012 +0100 + + Fix logic error in Rendition parsing code + + Make the rendition object invalid when both P an C entries are not + present or are invalid in Media Rendition dictionary. + + https://bugs.freedesktop.org/show_bug.cgi?id=47063 + + poppler/Rendition.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 68625258ab3cfc3e8e10a727e397f80bed0d1f5c +Author: Adrian Johnson +Date: Sun Mar 4 18:37:53 2012 +1030 + + glib demo: make ctrl-q quit the demo + + glib/demo/main.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 684b47727ba810ad6bf239e2838aa65b6f6cec36 +Author: Adrian Johnson +Date: Sun Mar 4 18:10:49 2012 +1030 + + glib demo: show font encoding in font demo + + glib/demo/fonts.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 48c08d28645d82ab9d67433a0150f6e1ba24b7c6 +Author: Adrian Johnson +Date: Sun Mar 4 17:49:56 2012 +1030 + + glib: add poppler_fonts_iter_get_encoding + + glib/poppler-document.cc | 26 ++++++++++++++++++++++++++ + glib/poppler-document.h | 1 + + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 28 insertions(+) + +commit 8d935569a977675afac35cf1bd5f2611b6a771b6 +Author: Albert Astals Cid +Date: Mon Mar 5 21:59:09 2012 +0100 + + Fix regression in some PSOutputDev array sizing + + poppler/PSOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2484bc0f29aef74c45ea39ef1e24804ed736154c +Author: Albert Astals Cid +Date: Sun Mar 4 23:47:24 2012 +0100 + + Fix mismatch in some functions declarations + + goo/GooString.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 35c960d198d2efa97d15e962662114c5c31b8d20 +Author: Even Rouault +Date: Sun Mar 4 20:32:42 2012 +0100 + + Do not crash on malformed files with 0 bits in the color map of + an image + + poppler/Gfx.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit dae29c6c201cd69cbf4f008de865cc19a36f29b3 +Author: Thomas Freitag +Date: Sun Mar 4 15:22:02 2012 +0100 + + CJK substitute implementation on WIndows platforms. + + When You install ghostscript on WIndows You're able to switch on CJK + support. This will create a cidfmap file in the gs-lib directory. The + ps file which creates it (mkcidfm.ps) runs over the windows font + directory and tries to create a suitable substitution table for + missing + CJK fonts. The cidfmap file is more or less PDF like, so it's + quite easy + to parse it with our parser and create a substitution table in + GlobalParamsWin and use that table. But I expect it in the poppler + data + dir instead of searching for ghostscript installation. If it is not + there, it always returns the default CID font of point 2. + You can either copy it from the gs lib directory or create it with the + ghostscript tool calling + + gswin32c -q -dBATCH -sFONTDIR= + -sCIDFMAP=/cidfmap mkcidfm.ps + + poppler/GlobalParams.cc | 5 +++ + poppler/GlobalParams.h | 2 + + poppler/GlobalParamsWin.cc | 106 + +++++++++++++++++++++++++++++++++++++++----- + 3 files changed, 103 insertions(+), 10 deletions(-) + +commit 32e47ee03840cc8f21c00497025864d77edb75f5 +Author: Thomas Freitag +Date: Sun Mar 4 15:21:13 2012 +0100 + + Improve CJK suport in PSOutputDev + + 1. Adapt bug fix for bug 11413 to the postscript device + 2. A small bug fix when locateFont doesn't find a suitable font and + returns a null pointer + + to 1.: + Adapting the implementation of the bug fix for splash and cairo to the + postscript device was quite easy. But my first proofs of the + output with + ghostscript 8.71 shows some regressions where the CJK chars have a + smaller height than the default square of the font. But the "48" + in the + output of bug-poppler11413.pdf which is set in a "normal" font but + rotated was at the right position. Then I stepped to ghostscript 9.04, + and now the CJK chars were shown correctly, but the 48 was positioned + wrong. But because of these different tests I think that it is still a + problem in ghostscript when using a mix of CJK fonts and "normal" + fonts. + BTW, also Acrobat X distiller has problems with the position of the + "48"! + + to 2.: + On my first tests with PDF which uses non embedded CJK fonts on + Windows + I got crashes. Reason for it was that GlobalParamWin returns + Helvetica, + which is not a CID font, but locateFont accepts here only CID + fonts and + therefore returns a NULL pointer. I first fixed that and then + decided to + return as default MS Mincho if a CID font is expected. + + poppler/PSOutputDev.cc | 203 + ++++++++++++++++++++++-------------------------- + 1 file changed, 92 insertions(+), 111 deletions(-) + +commit 61037a6de157e39331ae7a8b12ee5a115fd7e936 +Author: Adrian Johnson +Date: Sun Mar 4 17:40:40 2012 +1030 + + glib demo: fix typo + + glib/demo/selections.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aff5b0a4f04c12ad7733aedbc9997367f5873aa1 +Author: Carlos Garcia Campos +Date: Sat Mar 3 20:10:17 2012 +0100 + + regtest: Ignore backends with no results when creating html report + + regtest/HTMLReport.py | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 9d28b8db3561845f4ca94c29479a259ceaf78bc5 +Author: Carlos Garcia Campos +Date: Sat Mar 3 14:42:51 2012 +0100 + + regtest: Add --pretty-diff option to create-report command + + It includes a pretty-diff link to make a bit easier to check + differences + in test results. For images it creates a html with javascript that + toggles actual and expected image, using the same code than WebKit + layout test results. For text files it uses HtmlDiff class from python + difflib. It's an option disabled by default because pretty diff + for text + files is very slow. + + regtest/HTMLReport.py | 128 + ++++++++++++++++++++++++++++++++++++- + regtest/commands/create-report.py | 4 ++ + 2 files changed, 129 insertions(+), 3 deletions(-) + +commit 670ea176495b8b580daba061840c914714bf422d +Author: Adrian Johnson +Date: Fri Mar 2 22:22:16 2012 +1030 + + pdffonts: list the encoding of each font + + Bug 46888 + + poppler/CMap.h | 2 ++ + poppler/FontInfo.cc | 3 +++ + poppler/FontInfo.h | 2 ++ + poppler/GfxFont.cc | 26 ++++++++++++++++++++++++++ + poppler/GfxFont.h | 4 ++++ + utils/pdffonts.1 | 3 +++ + utils/pdffonts.cc | 7 ++++--- + 7 files changed, 44 insertions(+), 3 deletions(-) + +commit 3ab6b5ebf3b6c0d59bcb2ec68eae1aa95cab1d0e +Author: William Bader +Date: Fri Mar 2 19:40:44 2012 +0100 + + Fix pdftops -passfonts regression + + This patch fixes pdftops -passfonts by using the new psFontPassthrough + variable + consistently and removing the old psSubstFonts and its setter and + getter in + GlobalParams. + + Bug 46744 + + poppler/GlobalParams.cc | 9 +-------- + poppler/GlobalParams.h | 4 +--- + utils/pdftops.cc | 10 +++++----- + 3 files changed, 7 insertions(+), 16 deletions(-) + +commit 6c1ee34424b1122c0a2222b776d8d475f7c555cd +Author: Adrian Johnson +Date: Fri Mar 2 18:41:58 2012 +1030 + + Update poppler copyright + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit cdb1350d1e28cf3bceda75736ca91e13d193de84 +Author: Albert Astals Cid +Date: Thu Mar 1 18:58:02 2012 +0100 + + Increase versions + + CMakeLists.txt | 4 ++-- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + 9 files changed, 10 insertions(+), 10 deletions(-) + +commit 2c9e6fa5b3bc6cd01618c3fb4f46533bfce97466 +Author: Albert Astals Cid +Date: Thu Mar 1 18:48:17 2012 +0100 + + 0.19.0 news file + + NEWS | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +commit 14f6abfcb83f91755e6de05cd33870934bba3cfb +Author: Albert Astals Cid +Date: Thu Mar 1 17:53:25 2012 +0100 + + Update copyrights + + goo/JpegWriter.cc | 2 +- + poppler/CairoFontEngine.cc | 1 + + poppler/CairoOutputDev.cc | 3 ++- + poppler/CairoOutputDev.h | 2 +- + poppler/CairoRescaleBox.cc | 15 +++++++++++++++ + poppler/FontInfo.cc | 2 +- + poppler/FontInfo.h | 1 + + poppler/Gfx.cc | 2 +- + poppler/GfxFont.cc | 1 + + poppler/GlobalParams.cc | 2 ++ + poppler/GlobalParams.h | 1 + + poppler/Lexer.cc | 1 + + poppler/NameToUnicodeTable.h | 2 +- + utils/ImageOutputDev.cc | 1 + + utils/ImageOutputDev.h | 1 + + utils/parseargs.cc | 1 + + utils/parseargs.h | 1 + + utils/pdffonts.cc | 1 + + utils/pdfimages.cc | 1 + + utils/pdftocairo.cc | 2 +- + utils/pdftoppm.cc | 2 +- + 21 files changed, 37 insertions(+), 8 deletions(-) + +commit e63ca8184168f824575be9bbb64e9b1eac1eff94 +Author: Adrian Johnson +Date: Thu Mar 1 21:46:12 2012 +1030 + + pdftocairo: document that -scale-to will preserve aspect ratio + + based on pdftpppm patch 7ec31b8dc40ec8a3534fbb89964aa011aeb81f5e + + utils/pdftocairo.1 | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit fa82a7ce1372e5976ad95624115fcd7a4d9bd22c +Author: Adrian Johnson +Date: Thu Mar 1 21:43:32 2012 +1030 + + pdftocairo: allow one of -scale-to-[xy] = -1 to mean the aspect + ratio is to be preserved + + based on pdftoppm patch 38ace7db5de0b2b247fd520e48a8f26e5d28c9d7 + + utils/pdftocairo.1 | 8 ++++++-- + utils/pdftocairo.cc | 8 ++++++-- + 2 files changed, 12 insertions(+), 4 deletions(-) + +commit a2b008223ad6887f00d76c535f2b0b0f13f52b76 +Author: Adrian Johnson +Date: Tue Feb 28 21:38:19 2012 +1030 + + glib: add copy button to selections demo + + glib/demo/selections.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit b666d19308a043206e405c7e9d4ad709d68d331b +Author: Adrian Johnson +Date: Tue Feb 28 21:07:06 2012 +1030 + + glib: show substitute font name in demo + + glib/demo/fonts.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 18bc59fcf5a59b1fd51a631c02e900790c3a6dc0 +Author: Adrian Johnson +Date: Tue Feb 28 21:06:38 2012 +1030 + + glib: add poppler_fonts_iter_get_substitute_name + + glib/poppler-document.cc | 27 +++++++++++++++++++++++++++ + glib/poppler-document.h | 1 + + glib/reference/poppler-docs.sgml | 4 ++++ + glib/reference/poppler-sections.txt | 1 + + 4 files changed, 33 insertions(+) + +commit 4eaafe67de79fb63ebf61f031a97bbc0ed6a8891 +Author: Albert Astals Cid +Date: Wed Feb 29 23:22:34 2012 +0100 + + Change nnnnnn to number + + This way people won't expect it to be six fixed digits + Bug #46708 + + utils/pdftoppm.1 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aec6cb67951e56e4557a11c4fdf301e585268fe4 +Author: William Bader +Date: Wed Feb 29 23:18:16 2012 +0100 + + Fix stuff lost when merging xpdf303 + + restore the implementation of -binary + restore the fix that level2sep and level3sep must write cmyk instead + of rgb + restore the conversion of bitmaps with all gray to mono8 + fixed the CMYK misspelling in Stream. + + poppler/PSOutputDev.cc | 284 + ++++++++++++++++++++++++++++++++++++++++-------- + poppler/Stream.cc | 55 +++++++++- + poppler/Stream.h | 39 ++++++- + 3 files changed, 320 insertions(+), 58 deletions(-) + +commit e977925a1eb15083e6b020b31da77ddef9d5df02 +Author: William Bader +Date: Wed Feb 29 23:12:24 2012 +0100 + + Fix double alloc + + xpdf303 merge glitch + + poppler/PSOutputDev.cc | 1 - + 1 file changed, 1 deletion(-) + +commit e13efe04facdc10f3acffece3b057544f018f40c +Author: William Bader +Date: Wed Feb 29 23:10:43 2012 +0100 + + Fix memory leak + + Wrong merge from xpdf303 + + poppler/GfxState.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit adfc03e441b2a86dab5216dc560fd79343dfbe4f +Author: Hib Eris +Date: Wed Feb 29 21:10:56 2012 +0100 + + Only use Hints table when there are no parse errors + + Fixes bug #46459. + + poppler/Hints.cc | 6 ++++-- + poppler/Parser.cc | 30 ++++++++++++++++++++++++------ + poppler/Parser.h | 7 +++++-- + 3 files changed, 33 insertions(+), 10 deletions(-) + +commit 7ec31b8dc40ec8a3534fbb89964aa011aeb81f5e +Author: Adrian Johnson +Date: Mon Feb 27 21:15:39 2012 +1030 + + pdftoppm: document that -scale-to will preserve aspect ratio + + utils/pdftoppm.1 | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 38ace7db5de0b2b247fd520e48a8f26e5d28c9d7 +Author: Adrian Johnson +Date: Sat Feb 25 20:02:22 2012 +1030 + + pdftoppm: allow one of -scale-to-[xy] = -1 to mean the aspect ratio + is to be preserved + + bug 43393 + + utils/pdftoppm.1 | 8 ++++++-- + utils/pdftoppm.cc | 8 ++++++-- + 2 files changed, 12 insertions(+), 4 deletions(-) + +commit 738b879ebb536cc84d7ec96543d484023b69e6d3 +Author: Carlos Garcia Campos +Date: Sat Feb 25 20:53:58 2012 +0100 + + regtest: Add create-report command to generate html report of + test results + + regtest/HTMLReport.py | 197 + +++++++++++++++++++++++++++++++++++++ + regtest/backends/__init__.py | 20 +++- + regtest/commands/create-report.py | 57 +++++++++++ + 3 files changed, 273 insertions(+), 1 deletion(-) + +commit d5faabd509c2860ab199ee89b8ef9d4c14fa5118 +Author: Carlos Garcia Campos +Date: Sat Feb 25 20:50:53 2012 +0100 + + regtest: Use diff.png extension for image diff files + + So that they are recognized as images + + regtest/backends/__init__.py | 16 ++++++++++++++-- + regtest/backends/cairo.py | 2 +- + regtest/backends/splash.py | 2 +- + regtest/backends/text.py | 2 +- + 4 files changed, 17 insertions(+), 5 deletions(-) + +commit 2a5f1594a23cf521497f904b502fbadf56a9e780 +Author: William Bader +Date: Sat Feb 25 16:32:33 2012 +0100 + + Fix PSOutputDev regression with -level1 + + poppler/PSOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6a5deb0a86ad227cce3f85b1f58a9b86755cd812 +Author: Adrian Johnson +Date: Sat Feb 25 19:39:02 2012 +1030 + + autoconf: PKG_CHECK_EXISTS should not have the variable prefix in + the first argument + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8f4566c14a727fb75c4c353989cf5eb96516c2e3 +Author: Adrian Johnson +Date: Wed Feb 22 21:21:52 2012 +1030 + + autoconf: replace openjpeg compile test with a version test + + Now that openjpeg 1.5 is released and supports pkg-config the compile + test can be replaced with a pkg-config version check. + + configure.ac | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit 30f38bf425e2f76b3f6cc4c080137ac7219a9dbe +Author: Adrian Johnson +Date: Wed Feb 22 21:01:59 2012 +1030 + + autoconf: Use pkgconfig to check for libopenjpeg + + and if not found fallback to using AC_CHECK_LIB/AC_CHECK_HEADERS + + openjpeg >= 1.4 installs a pkgconfig file + + Bug 21789 + + configure.ac | 28 +++++++++++++++++----------- + 1 file changed, 17 insertions(+), 11 deletions(-) + +commit 466340d257ff0fe7e3a88a4e013e3feec3f7b70a +Author: Albert Astals Cid +Date: Thu Feb 23 23:47:15 2012 +0100 + + Combine UTF16 surrogate pairs + + Bug 46521 + + utils/HtmlOutputDev.cc | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 675ef2bda3c4e06b39e2ba09b3b19d99cfb001b6 +Author: Oliver Sander +Date: Thu Feb 23 23:22:50 2012 +0100 + + Compile + + poppler/Stream.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7705e65c231cc3af296bf19f5cba110cabb72e7d +Author: Albert Astals Cid +Date: Thu Feb 23 23:09:23 2012 +0100 + + Generate outlines in pdftohtml in -xml mode. + + Bug 56993 + + utils/HtmlOutputDev.cc | 130 + +++++++++++++++++++++++++++++++++++------------- + utils/HtmlOutputDev.h | 7 ++- + utils/pdf2xml.dtd | 7 ++- + utils/pdftohtml.cc | 5 +- + 4 files changed, 108 insertions(+), 41 deletions(-) + +commit 30446bdd7e202eed88d131e04477c76861fd145c +Author: Albert Astals Cid +Date: Thu Feb 23 22:56:17 2012 +0100 + + Use an Identity CharCodeToUnicode for Adobe-Identity and Adobe-UCS + collections + + Also fix Identity CharCodeToUnicode code + + Bug #35468 + + poppler/CharCodeToUnicode.cc | 18 +++++++++++++----- + poppler/CharCodeToUnicode.h | 7 +++++-- + poppler/GfxFont.cc | 13 +++++++------ + 3 files changed, 25 insertions(+), 13 deletions(-) + +commit 71104f1ec55d3be999afaa1b62405454b31066a9 +Author: Albert Astals Cid +Date: Thu Feb 23 19:34:57 2012 +0100 + + Remove unneded CharCodeToUnicode includes + + poppler/ArthurOutputDev.cc | 3 +-- + poppler/CairoFontEngine.cc | 3 +-- + poppler/CairoOutputDev.cc | 3 +-- + poppler/SplashOutputDev.cc | 3 +-- + 4 files changed, 4 insertions(+), 8 deletions(-) + +commit c0c8cc1592ee6aa13157e34f8083b951d487a413 +Author: Adrian Johnson +Date: Thu Feb 23 21:13:23 2012 +1030 + + glib docs: fix typo + + glib/poppler.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fde3bed0f400a50f31f1f6bcee44ac1b2c17ddc6 +Author: Albert Astals Cid +Date: Wed Feb 22 00:03:37 2012 +0100 + + pdfinfo: decode utf-16 surrogate pairs + + Based on a patch by Adrian Johnson + Bug 23075 + + utils/pdfinfo.cc | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 3361564364a1799fc3d6c6df9f208c5531c407dc +Author: Adrian Johnson +Date: Tue Feb 21 22:20:02 2012 +0100 + + Expand glyph name ligatures such as "ff", "ffi" etc to normal form + + Bug 7002 + + poppler/GfxFont.cc | 14 +++++++++++++- + poppler/UnicodeTypeTable.cc | 9 +++++++++ + poppler/UnicodeTypeTable.h | 3 +++ + 3 files changed, 25 insertions(+), 1 deletion(-) + +commit d0186c558f4a84a9317687ad50b460d34fb5fdf0 +Author: Pino Toscano +Date: Mon Feb 20 22:18:00 2012 +0100 + + cmake: support for lcms2 + + followup of e48c22d3b70412015b9cc07a9a6ce07845274e13 also for the + CMake build system, + importing the FindLCMS2.cmake from kdelibs + + CMakeLists.txt | 26 +++++++++++++-- + cmake/modules/FindLCMS2.cmake | 73 + +++++++++++++++++++++++++++++++++++++++++ + config.h.cmake | 3 ++ + utils/CMakeLists.txt | 3 ++ + 4 files changed, 102 insertions(+), 3 deletions(-) + +commit e48c22d3b70412015b9cc07a9a6ce07845274e13 +Author: Koji Otani +Date: Mon Feb 20 22:04:01 2012 +0100 + + Add support for lcms2 + + configure.ac | 24 ++++++- + poppler/GfxState.cc | 159 + +++++++++++++++++++++++++++---------------- + qt4/src/poppler-document.cc | 5 ++ + utils/pdftocairo.cc | 17 +++++ + 4 files changed, 143 insertions(+), 62 deletions(-) + +commit 1bcae7aa8f87cc85ee6b477bf0abb49452e46505 +Author: Igor Slepchin +Date: Sun Feb 19 23:40:50 2012 +0100 + + Consistently check if pdftohtml needs to generate outlines. + + utils/pdftohtml.cc | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 126bf08105e319f9216654782e5a63f99f1d1825 +Author: Albert Astals Cid +Date: Sun Feb 19 23:18:25 2012 +0100 + + Update glyph names to Unicode values mapping + + Added Zapf Dingbat names and fixed copyrightsans, copyrightserif, + registersans, registerserif, trademarksans, trademarkserif + Kudos to Adrian Johnson for find what was missing :-) + Bug #13131 + + poppler/NameToUnicodeTable.h | 213 + ++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 207 insertions(+), 6 deletions(-) + +commit c0fec84312a37f62bdbfdee7c8e9b520af28330a +Author: Pino Toscano +Date: Sun Feb 19 14:47:24 2012 +0100 + + fix typo, GString -> GooString + + goo/GooString.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aaae8996766f259dcc329755c7cccde7c916c1fb +Author: Adrian Johnson +Date: Thu Feb 16 22:22:15 2012 +1030 + + cairo: set mask matrix before drawing an image with a mask + + Bug 40828 + + poppler/CairoOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit fff439f25d9bbd199db5646deccd80733138898e +Author: Adrian Johnson +Date: Sun Feb 19 15:45:31 2012 +1030 + + update .gitignore + + utils/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 1cc3e152d6e879eb13fbdf2964ede3e01d13d097 +Author: Adrian Johnson +Date: Sun Feb 19 15:43:09 2012 +1030 + + glib docs: fix typo + + glib/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4f4db591276ec156c55b3a3c2020a1cf82f1519b +Author: Adrian Johnson +Date: Sun Feb 19 15:37:04 2012 +1030 + + cairo: fix pdftocairo crash when pdf document uses actualText + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b72ee4e4c8658b2f7cd542d601a5c3be621d3fc +Author: Thomas Freitag +Date: Sat Feb 18 17:34:12 2012 +0100 + + Make some of the unfilteredResets be really unfiltered + + poppler/Stream.cc | 26 ++++++++++++++++++++------ + poppler/Stream.h | 3 +++ + 2 files changed, 23 insertions(+), 6 deletions(-) + +commit 33aded82fbd98832eaab7cb7487fe6a1c7ef15f5 +Author: Albert Astals Cid +Date: Sat Feb 18 17:21:10 2012 +0100 + + Rework XRef getNumObjects and getSize + + Kill XRef::last since we do not maintain it correctly, now + getNumObjects returns size as it did + Kill getSize as it just returns the same as getNumObjects + + poppler/PDFDoc.cc | 10 +++++----- + poppler/XRef.cc | 12 +----------- + poppler/XRef.h | 6 ++---- + 3 files changed, 8 insertions(+), 20 deletions(-) + +commit 521d3740e9b7d2cfacf29f089a4a8f6c962de807 +Author: Adrian Johnson +Date: Mon Feb 13 22:05:18 2012 +1030 + + pdfimages: add -list option to list all images + + Bug 46066 + + utils/ImageOutputDev.cc | 204 + +++++++++++++++++++++++++++++++++++++++++------ + utils/ImageOutputDev.h | 20 ++++- + utils/pdfimages.1 | 101 +++++++++++++++++++++++ + utils/pdfimages.cc | 12 ++- + 4 files changed, 307 insertions(+), 30 deletions(-) + +commit 119b6b752314c9b13440eddf5bd1d5cef2966e80 +Author: Adrian Johnson +Date: Mon Feb 6 16:50:11 2012 +1030 + + cairo: don't read inline image streams twice + + Bug 45668 + + poppler/CairoOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a76135391555145ec740d49a7141e60da0ea5dee +Author: Hib Eris +Date: Tue Feb 14 20:11:19 2012 +0100 + + Add a configuration option for the test data dir + + This makes 'make distcheck' run succesfully. + + CMakeLists.txt | 20 +++++++++++++++++++ + Makefile.am | 2 +- + configure.ac | 42 + +++++++++++++++++++++++++++++++++++++++ + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 1 + + qt4/tests/check_actualtext.cpp | 2 +- + qt4/tests/check_attachments.cpp | 14 ++++++------- + qt4/tests/check_fonts.cpp | 18 ++++++++--------- + qt4/tests/check_links.cpp | 6 +++--- + qt4/tests/check_metadata.cpp | 32 ++++++++++++++--------------- + qt4/tests/check_optcontent.cpp | 12 +++++------ + qt4/tests/check_pagelayout.cpp | 6 +++--- + qt4/tests/check_pagemode.cpp | 10 +++++----- + qt4/tests/check_password.cpp | 12 +++++------ + qt4/tests/check_permissions.cpp | 2 +- + qt4/tests/check_search.cpp | 4 ++-- + 16 files changed, 124 insertions(+), 60 deletions(-) + +commit 59946e0c34e762eb5f5a13b4ae8c9ec7fb21379a +Author: Thomas Freitag +Date: Tue Feb 14 19:37:21 2012 +0100 + + Overprint implementation in postscript and splash device + + It is an enhancement patch, a + merge fix and a bug fix in one: an enhancement, because it now + completes + the implementation overprint mode and devicen in postscript, a merge + fix, because it fixes some bugs in the overprint implementation in + splash of xpdf 3.0.3 and has now the complete functionality (and + more!) + of my implementation back again and a bug fix, because it fixes + the use + of splash cmyk in postscript which never had worked. + + 1. Overprint implementation in postscript + To have a complete overprint implementation in the (pure) postscript + device there were just two things missing: overprint mode and the + implementation of the DeviceN colorspace in PostScript. I double + checked + my implementation with the Ghent Test Suite with GhostScript (device + pdfwrite) and Acrobat X distiller, and all the tests now succeeds, + either in Acrobat X distiller or in GhostScript. As overprint is a + device dependent feature, it is up to the output device if it supports + overprint and what features of overprint are supported, and often You + have various configuration possibilities there. Nearly all PostScript + output of the Ghent tests show now the desired results if converting + it + back to PDF with ghostscript pdfwrite, the implementation in + ghostscript + is complete. On the other hand a few tests failed when using Acrobat X + distiller, all of them with the overprint mode switch. Funny, because + overprint mode 1 is often also called the illustrator overprint mode + because it was introduced by illustrator, but probably the destiller + only handles EPS correctly which comes from illustrator + + 2. Overprint implementation in postscript if using splash + rasterization + Of course the postscript overprint implementation will only work if + pdftops doesn't decide to use splash to rasterize it because of + the use + of transparencies in the PDF. But because overprint is device + dependent + I decided to spend an additional parameter "overprint" to pdftops + (simular to pdftoppm). Switching it on (only available if compiled + with + SPLASH_CMYK, because overprint is only in CMYK colorspace showable) + will + use the overprint implementation in splash also if rasterizing + the PDF. + + 3. Overprint implementation in splash + The overprint implementation in splash now uses the better designed + interface of xpdf and therefore now also works in transparency groups. + Thanks to the developper team of xpdf. I just fixed a small bug in it, + where it defies the technical specification. Of course it is still in + the nature of the splash implementation that it fails if CMYK values + should overprint spot colors, because spot colors are converted + immediately in their CMYK alternates. And in the implementation of + overprinting spot colors over CMYK colors I made a small assumption to + get it running which causes undesired results if this assumption + fails, + but I didn't want to implement more and more configuration switches. I + still plan to implement a DeviceN output in splash and make a complete + implementation there, but this is of course a bigger task (but + doable). + The overprint switch in pdftoppm is still only available if compiled + with the SPLASH_CMYK directive. + + poppler/PSOutputDev.cc | 67 ++++++++++-- + poppler/PSOutputDev.h | 3 +- + poppler/SplashOutputDev.cc | 62 +++++++++-- + poppler/SplashOutputDev.h | 4 +- + splash/Splash.cc | 70 +++++++++---- + splash/Splash.h | 4 +- + splash/SplashState.cc | 5 +- + splash/SplashState.h | 247 + ++++++++++++++++++++++---------------------- + utils/pdftops.cc | 13 +++ + 9 files changed, 308 insertions(+), 167 deletions(-) + +commit b505920db6d3dac58c7e9f4f8917f4c4449b08a0 +Merge: 9250449 a631281 +Author: Albert Astals Cid +Date: Tue Feb 14 19:18:54 2012 +0100 + + Merge remote-tracking branch 'origin/xpdf303merge' + + Conflicts: + utils/HtmlOutputDev.cc + utils/HtmlOutputDev.h + +commit 9250449aaa279840d789b3a7cef75d06a0fd88e7 +Author: Hib Eris +Date: Sun Feb 12 23:16:41 2012 +0100 + + Improve moc detection when cross compiling + + configure.ac | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 66cf1fdb3ba6894f61d9078f5c30046b464347ae +Author: Pino Toscano +Date: Sun Feb 12 22:27:58 2012 +0100 + + qt4: remove non-existing 'qt' include dirs + + qt4/demos/Makefile.am | 1 - + qt4/src/Makefile.am | 1 - + qt4/tests/Makefile.am | 1 - + 3 files changed, 3 deletions(-) + +commit 53d8fc4d2978b70e8926e3df71facd1f39de9348 +Author: Pino Toscano +Date: Sun Feb 12 17:36:55 2012 +0100 + + man pages: fix minor issues with hypens and % + + utils/pdfseparate.1 | 6 +++--- + utils/pdftocairo.1 | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit a63128179c65b5d9d6d9d41fa601a593b0a05d94 +Author: Thomas Freitag +Date: Thu Feb 9 22:02:52 2012 +0100 + + [xpdf303] Fix merge issue + + utils/pdftoppm.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cd5a6a4d02e579e543067d1847164aff90363f16 +Author: Thomas Freitag +Date: Thu Feb 9 22:01:42 2012 +0100 + + [xpdf303] Fix merge bug + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 597fa37cacec928c40d0491174ce843fe01f26d9 +Author: Igor Slepchin +Date: Wed Feb 8 19:22:13 2012 -0500 + + Close li tags in generated outlines. + + Also, add newlines after ul tags for better readability. + Bug #45807 + (cherry picked from commit bf81250ff7d0968852fc7559fafb6389cd695b91) + + utils/HtmlOutputDev.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 2fc36dba5f63703896722adb5127896e4c2840e7 +Author: Igor Slepchin +Date: Thu Feb 9 00:15:13 2012 +0100 + + Get rid of static data members; merge duplicated jpeg dumping code. + + HtmlPage::pgNum is never used; + imgNum is always equal to imgList->getLength()+1 + imgList is now maintained in HtmlPage. + + utils/HtmlOutputDev.cc | 143 + +++++++++++++++++++----------------------------- + utils/HtmlOutputDev.h | 15 +++-- + 2 files changed, 65 insertions(+), 93 deletions(-) + +commit f655efe327ddd3b6a68353a62589d4e4f8a318a8 +Author: Albert Astals Cid +Date: Wed Feb 8 23:58:27 2012 +0100 + + Fix memory leak when using HtmlOutputDev::mapEncodingToHtml + + Bug #45805 + (cherry picked from commit 53a0c2043dfd56f6da7780f1a049f75af368b84b) + + utils/HtmlOutputDev.cc | 47 + ++++++++++++++++++++++++----------------------- + utils/HtmlOutputDev.h | 7 ++++--- + 2 files changed, 28 insertions(+), 26 deletions(-) + +commit 68f02d19c571fce956c7f4af6ccd0ff9ba8b1b03 +Author: Albert Astals Cid +Date: Wed Feb 8 23:47:46 2012 +0100 + + Fix leak in pdftohtml getInfoString + + Bug #45805 + (cherry picked from commit 4afe4d827a342a847e8b89aba5b4164ed3b4cc32) + + utils/pdftohtml.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 2b7ba166c28e32653db4ae7acf90e06e0dd5975b +Author: Albert Astals Cid +Date: Wed Feb 8 19:12:52 2012 +0100 + + [xpdf303] Compile fixes + + poppler/GlobalParamsWin.cc | 2 +- + poppler/SplashOutputDev.cc | 10 ---------- + 2 files changed, 1 insertion(+), 11 deletions(-) + +commit b8c9b179c9491cf6755b07bfdec4174e78b7d241 +Author: Albert Astals Cid +Date: Mon Feb 6 19:55:07 2012 +0100 + + [xpdf303] Adapt better to what we did and what xpdf303 does + + poppler/ArthurOutputDev.cc | 1 - + poppler/GlobalParams.cc | 10 ---------- + poppler/GlobalParams.h | 1 - + poppler/SplashOutputDev.cc | 3 --- + poppler/SplashOutputDev.h | 1 - + splash/SplashFTFont.cc | 40 + +++++++++++++++++++--------------------- + splash/SplashFTFont.h | 1 - + splash/SplashFTFontEngine.cc | 7 +++---- + splash/SplashFTFontEngine.h | 5 ++--- + splash/SplashFontEngine.cc | 3 +-- + splash/SplashFontEngine.h | 1 - + utils/pdftoppm.cc | 2 +- + 12 files changed, 26 insertions(+), 49 deletions(-) + +commit ea6bc19564865e04431d9154802ae7fba975a716 +Merge: e17f095 92ce79f +Author: Albert Astals Cid +Date: Mon Feb 6 01:18:25 2012 +0100 + + Merge branch 'master' into xpdf303merge + + Conflicts: + poppler/CairoOutputDev.cc + poppler/CairoOutputDev.h + poppler/FontInfo.cc + poppler/GfxFont.cc + poppler/GfxState.cc + poppler/GlobalParams.cc + poppler/GlobalParams.h + poppler/Lexer.cc + +commit e17f09563276ee25b6acfc127b6ea360da650030 +Author: Albert Astals Cid +Date: Mon Feb 6 00:25:53 2012 +0100 + + [xpdf303] TextOutputDev and associated changes + + cpp/poppler-page.cpp | 10 +- + glib/poppler-page.cc | 5 +- + poppler/ArthurOutputDev.cc | 1 + + poppler/CairoOutputDev.cc | 2 +- + poppler/Gfx.cc | 6 +- + poppler/PSOutputDev.cc | 6 +- + poppler/TextOutputDev.cc | 360 + +++++++++++++++++++++++++++----------------- + poppler/TextOutputDev.h | 18 ++- + qt4/src/poppler-page.cc | 12 +- + test/perf-test.cc | 2 +- + utils/pdftotext.1 | 4 + + utils/pdftotext.cc | 10 +- + 12 files changed, 270 insertions(+), 166 deletions(-) + +commit 548648bf29dc1551443eb1925814342e7aadee46 +Author: Albert Astals Cid +Date: Sun Feb 5 23:08:44 2012 +0100 + + [xpdf303] Merge PDFDoc encryption related code + + poppler/PDFDoc.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 6ee907f291427b8751a872b31210bf32e8d2b722 +Author: Albert Astals Cid +Date: Sun Feb 5 22:57:25 2012 +0100 + + [xpdf303] More merges from Thomas, basically PSOutputDev and some + other small stuff + + poppler/GfxFont.cc | 4 +- + poppler/GlobalParams.cc | 95 ++- + poppler/GlobalParams.h | 18 +- + poppler/GlobalParamsWin.cc | 16 +- + poppler/Hints.cc | 2 +- + poppler/PSOutputDev.cc | 1814 + ++++++++++++++++++++++--------------------- + poppler/PSOutputDev.h | 51 +- + poppler/Parser.cc | 13 +- + poppler/Parser.h | 7 +- + poppler/PreScanOutputDev.cc | 70 +- + poppler/PreScanOutputDev.h | 16 +- + poppler/XRef.cc | 91 ++- + poppler/XRef.h | 3 +- + utils/pdftops.cc | 2 +- + 14 files changed, 1231 insertions(+), 971 deletions(-) + +commit 92ce79f47f929392f48737612a9690088573f63d +Author: Igor Slepchin +Date: Sun Feb 5 15:55:39 2012 +0100 + + Proper unicode support when dumping PDF outline. + + Also use of already existing Outline class rather than parsing the + outline anew. + + Bug 45572 + (cherry picked from commit 40f7289ab04787734b856c53d5c0139445b52635) + + Conflicts: + + utils/HtmlOutputDev.cc + + utils/HtmlOutputDev.cc | 197 + ++++++++++++++++++++++++++---------------------- + utils/HtmlOutputDev.h | 6 +- + utils/pdftohtml.cc | 3 +- + 3 files changed, 112 insertions(+), 94 deletions(-) + +commit 38ec58ed1cb54722aece875287b847643aa2c4b8 +Author: Adrian Johnson +Date: Sat Feb 4 17:13:30 2012 +1030 + + Lexer: convert integer to real when overflow occurs + + Bug 45605 + + poppler/Lexer.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit df89de61b7d01f0f816e773cdb809faa3053e962 +Author: Hib Eris +Date: Tue Jan 31 20:01:30 2012 +0100 + + glib: Exclude poppler-private.h from introspection files + + Fixes bug #45455. + + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 88cb6d9360bc943fc2cdda262dc46bf831641541 +Author: Carlos Garcia Campos +Date: Sat Feb 4 12:04:03 2012 +0100 + + glib: Update gtk-doc makefile and m4 file + + gtk-doc.make | 112 + ++++++++++++++++++++++++++++++++------------------------- + m4/gtk-doc.m4 | 6 ++++ + 2 files changed, 70 insertions(+), 48 deletions(-) + +commit 3f4164f84bbf748a2f919741669ef20db0fbda9f +Author: Hib Eris +Date: Wed Feb 1 10:44:17 2012 +0100 + + gtk-doc: Fix build when builddir != srcdir + + Bug #45549. + + glib/reference/Makefile.am | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 8daeb82f982eba25fe8c7d07358f0a6593ddc89a +Author: Hib Eris +Date: Thu Feb 2 13:01:45 2012 +0100 + + gtk-doc: Fix API documentation for poppler_page_free_annot_mapping() + + Remove reference to non existent method poppler_annot_free() and use + ref/unref instead of copy/free. + + Bug #45549. + + glib/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f8ce9966e4f480949799a26c01bd861f4011b587 +Author: Carlos Garcia Campos +Date: Sat Feb 4 11:51:34 2012 +0100 + + gtk-doc: Remove reference to non existent method poppler_layer_free() + + Bug #45549. + + glib/poppler-document.cc | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit f58f3525f135bc47e89c23c33e96e43db10d4853 +Author: Hib Eris +Date: Thu Feb 2 15:59:47 2012 +0100 + + gtk-doc: Add more glib API documentation for poppler-document + + Fixes several gtk-doc warnings. + + Bug #45549. + + glib/poppler-document.h | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 080247f6a47bc929b25f6e000f4474801af74b1f +Author: Hib Eris +Date: Thu Feb 2 15:45:37 2012 +0100 + + gtk-doc: remove references to removed pixbuf functions + + Bug #45549. + + glib/poppler-page.cc | 6 ++---- + glib/reference/poppler-sections.txt | 4 ---- + 2 files changed, 2 insertions(+), 8 deletions(-) + +commit 47780d9ed1fd69068fdb9b9782e2cb37e2a5b217 +Author: Hib Eris +Date: Thu Feb 2 15:43:30 2012 +0100 + + gtk-doc: do not build doc for glib-demo + + Fixes glib-demo symbols in poppler-unused.txt + + Bug #45549. + + glib/reference/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e320f335cc6e54c60bd2436799dd1f05beb060ba +Author: Hib Eris +Date: Sat Feb 4 11:32:50 2012 +0100 + + gtk-doc: Fix typo's + + Bug #45549. + + glib/poppler-annot.cc | 6 +++--- + glib/poppler-annot.h | 2 +- + glib/poppler-document.cc | 2 +- + glib/poppler-media.cc | 2 +- + glib/poppler-page.cc | 3 +-- + glib/poppler-page.h | 4 ++-- + glib/reference/poppler-sections.txt | 4 +++- + 7 files changed, 12 insertions(+), 11 deletions(-) + +commit 1fe27b07975e9a9455708563118fb73cce696f81 +Author: Hib Eris +Date: Tue Jan 31 12:49:01 2012 +0100 + + cairo: Remove unused variable in CairoFontEngine.cc + + Fixes bug #45442. + + poppler/CairoFontEngine.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit e3d80c79815ce46daf3c3f2b944f49eaf19bfea5 +Author: Hib Eris +Date: Tue Jan 31 14:42:04 2012 +0100 + + Fix return value of downscale_box_filter() + + Fixes bug #45441. + + poppler/CairoRescaleBox.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e074e526fa206403b84da5ce0f27d7357223c7ac +Author: Hib Eris +Date: Tue Jan 31 13:02:16 2012 +0100 + + Fix return value of poppler_attachment_save + + Fixes bug #45440. + + glib/poppler-attachment.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bc389cff91c350d7da186d4cf707c389c77bbc29 +Author: Hib Eris +Date: Tue Jan 31 14:03:08 2012 +0100 + + glib-demo: Do not use deprecated gtk_dialog_set_has_separator() + + Bug #45439 + + glib/demo/main.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit e52e3c24663edaa630d9187e832223b474b74089 +Author: Hib Eris +Date: Tue Jan 31 13:39:05 2012 +0100 + + glib-demo: Do not use deprecated GtkComboBox API + + Bug #45439. + + glib/demo/annots.c | 6 ++++++ + glib/demo/print.c | 9 ++++++++- + glib/demo/render.c | 16 ++++++++++++++++ + glib/demo/selections.c | 8 ++++++++ + 4 files changed, 38 insertions(+), 1 deletion(-) + +commit 165ab4ec122d0e1a6f30dcfba80aefc422cd83b7 +Author: Hib Eris +Date: Tue Jan 31 12:15:51 2012 +0100 + + Fix build for builddir != srcdir + + Fixes bug #45434. + + glib/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e424a13bb516464d59ad76fd0933e92f3307b21b +Author: Thomas Freitag +Date: Fri Feb 3 00:12:10 2012 +0100 + + pdfseparate fixes by Thomas after his last commit + + poppler/PDFDoc.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 4fcd42cfa4424992cd4b36af38bc6230ce0706c9 +Author: Albert Astals Cid +Date: Wed Feb 1 22:53:03 2012 +0100 + + [xpdf303] More merges from Thomas (with minor fixes from me) + + Basically fonts related and some other small stuff + + poppler/Annot.cc | 6 +- + poppler/ArthurOutputDev.cc | 47 +-- + poppler/CMap.cc | 153 ++++++++ + poppler/CMap.h | 16 + + poppler/CairoFontEngine.cc | 43 +-- + poppler/CharCodeToUnicode.h | 1 + + poppler/FontInfo.cc | 8 +- + poppler/Gfx.cc | 363 +++++++++++-------- + poppler/GfxFont.cc | 831 + +++++++++++++++++++++++++++++-------------- + poppler/GfxFont.h | 34 +- + poppler/GfxState.cc | 81 +++-- + poppler/GfxState.h | 2 + + poppler/GlobalParams.cc | 738 ++++++++++++++++++++++---------------- + poppler/GlobalParams.h | 112 +++--- + poppler/GlobalParamsWin.cc | 180 ++++++++-- + poppler/PSOutputDev.cc | 591 +++++++++++++++--------------- + poppler/PSOutputDev.h | 12 +- + poppler/PreScanOutputDev.cc | 10 +- + poppler/SplashOutputDev.cc | 59 ++- + poppler/XRef.cc | 16 +- + 20 files changed, 2008 insertions(+), 1295 deletions(-) + +commit 0089357de8ea96f3e394ea9cb37e8182ccf15ae2 +Author: Thomas Freitag +Date: Wed Feb 1 19:17:38 2012 +0100 + + pdfseparate: Produce PDF/X conformant pdf pages if the original PDF + was PDF/X conformant. + + poppler/PDFDoc.cc | 63 + +++++++++++++++++++++++++++++++++-------------------- + poppler/XRef.cc | 9 +++++++- + poppler/XRef.h | 5 ++++- + 3 files changed, 51 insertions(+), 26 deletions(-) + +commit be62a4f2e7d5db3b6d85d1b3026979f9561e6e15 +Author: Hib Eris +Date: Mon Jan 30 17:07:28 2012 +0100 + + Fix build with latest mingw-w64 headers + + Fixes bug #45407. + (cherry picked from commit 58c17c3a61f18a6808ec9ba37e82734a655090ac) + + glib/poppler-annot.cc | 1 + + glib/poppler-document.cc | 1 + + 2 files changed, 2 insertions(+) + +commit acbc63348ce5e279e4d66ed4f240dc8d61df4e57 +Author: Suzuki Toshiya +Date: Mon Jan 30 20:46:04 2012 +1030 + + pdftocairo/automake: link with lcms + + utils/Makefile.am | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 9548573a16629fecdbd44c9aac8b626ec6f53b81 +Author: Pino Toscano +Date: Mon Jan 30 00:32:52 2012 +0100 + + glib/cmake: various minor introspection improvements + + "port" to CMake of the automake equivalents of + 4765c3289635fe4fb006e7df4f83d7056eb42855 + + glib/CMakeLists.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit bf2ffb1cc76bcf569419ac495f524c41bb6f1650 +Author: Pino Toscano +Date: Mon Jan 30 00:21:31 2012 +0100 + + cmake: support $(gir_name)_EXPORT_PACKAGES for g-ir-scanner + + cmake/modules/GObjectIntrospectionMacros.cmake | 2 ++ + 1 file changed, 2 insertions(+) + +commit cbe7131e63c5896010e7e1ad5c0c3aa91611704d +Author: Albert Astals Cid +Date: Fri Jan 27 00:36:18 2012 +0100 + + Set OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG if you have it + + Fixes/workarounds bug 43414 with openjpeg 1.5 (unreleased) + (cherry picked from commit de6415af1a39ec7dfa4f149c6c5e311b86352cec) + + cmake/modules/FindLIBOPENJPEG.cmake | 13 +++++++++++++ + config.h.cmake | 3 +++ + configure.ac | 8 ++++++++ + poppler/JPEG2000Stream.cc | 7 ++++++- + 4 files changed, 30 insertions(+), 1 deletion(-) + +commit 641526d1a7e8032ea8f7b8ac42c5ad8c20448d9b +Author: Adrian Johnson +Date: Wed Jan 25 22:44:27 2012 +1030 + + jpeg: set image parameters after jpeg_set_defaults() + + so the resolution does not get overwritten by the defaults. + + The libjpeg documentation for jpeg_set_defaults() states: "This + routine sets all JPEG parameters to reasonable defaults, using only + the input image's color space (field in_color_space, which must + already be set in cinfo)" + + Bug 45224 + + goo/JpegWriter.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit f7356a88fe983c2ddd7d5a50400768310a26c4d2 +Author: Adrian Johnson +Date: Thu Jan 26 11:33:28 2012 +1030 + + glib: add section in docs for new symbols in 0.18 + + glib/reference/poppler-docs.sgml | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b42c171de93dba56859beb21cfe5312d825fedd6 +Author: Alexander Saprykin +Date: Mon Jan 23 22:07:15 2012 +0100 + + Do not use 50Kb of stack in SplashXPath::addCurve + + Bug 44905 + + splash/SplashXPath.cc | 69 + +++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 49 insertions(+), 20 deletions(-) + +commit a04fca6266bda6d04068f38f16fe492cb6b8677b +Author: Adrian Johnson +Date: Sat Jan 21 09:41:12 2012 +1030 + + cairo: use fabs when comparing the transformed line width + + as the transform may cause a negative width. + + Bug 43441 + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce1b6c7ca16847f07eeafc29c6503be6fa5a9a3d +Author: Patrick Pfeifer +Date: Thu Jan 19 14:54:48 2012 +0100 + + cairo: Fix test for rotation + + Fixes bug #14619. + + poppler/CairoOutputDev.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 4765c3289635fe4fb006e7df4f83d7056eb42855 +Author: Evan Nemerson +Date: Sun Jan 15 11:02:50 2012 -0800 + + glib: various minor introspection and documentation improvements + + Bug 44790 + + glib/Makefile.am | 4 +++- + glib/poppler-annot.cc | 8 ++++---- + glib/poppler-attachment.h | 7 ++++--- + glib/poppler-document.cc | 6 ++++-- + glib/poppler-media.h | 7 ++++--- + glib/poppler-page.cc | 23 +++++++++++++++-------- + 6 files changed, 34 insertions(+), 21 deletions(-) + +commit e8e42988c5cebab2ffa5fe020f30a3a645e90b5f +Author: Adrian Johnson +Date: Mon Jan 16 21:25:19 2012 +1030 + + cairo: ensure paintTransparencyGroup uses same ctm as + beginTransparencyGroup + + Bug 29968 + + poppler/CairoOutputDev.cc | 8 ++++++-- + poppler/CairoOutputDev.h | 1 + + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit f6c7aa752f9455bba1aa3c72e0998e7911c1d43e +Author: Adrian Johnson +Date: Wed Jan 18 21:19:43 2012 +1030 + + configure.ac: print the glib version required if not found + + configure.ac | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 100488ec7db2d1f3e25bfda42c1603ca86696195 +Author: Adrian Johnson +Date: Sun Jan 15 23:52:28 2012 +1030 + + cairo: restore temporary clip used in CairoOutputDev::fill when + painting a mask + + The clip is only used to clip the paint to the fill path so it should + be moved inside the save/restore. + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c092e17e8f0cf0335b431a223e6e44bddc27e64 +Author: Albert Astals Cid +Date: Sun Jan 15 23:28:51 2012 +0100 + + [xpdf] More Splash and Gfx changes from Thomas + + 1. merge of blend changes + Here I had not only merged the changed in blend modes, I made also + a few + changes in the SPLASH_CMYK area, so that the already sent PDF now also + be rendered correctly with the -jpegcmyk option + 2. merge of font handling in SplashOutputDev.cc + There were a few changes left in font handling, I took them over + 3. merge of getcolor-changes + The getcolor changes win a price for well defined C++ code. I wouldn't + have merged them, if there were not a lot of other things to merge. + 4. merge of image handling in SplashOutputDev.cc + I merged the left changes in image handling including colorizing masks + in pattern colorspace + 5. cleanup of overprint + I tested the overprint implementation of Derek. They succeed only + in 70 + % percent of the PDF where my solution had success, but Derek's + solution + is much cleaner, and I'm sure that I could also fix the rest in + it. BUT: + as I already considered, when I implemented overprint, there are some + overprint situations, which can not be solved in a CMYK colorspace, we + have to implement a DeviceN colorpace when also overprint from CMYK + colors over spot colors should work. Therefore I decided to remove my + overprint implementation completely from the code and let Derek's + solution in, even if there could be done some enhancements in it. + 6. colorizing text in pattern colorspace + When I saw Derek's implementation with a clean interface only at one + place in Gfx.cc, I first was very surprised. My solution had a lot of + places in Gfx.cc, where I looked if the current colorspace is + a pattern + colorspace. Therefore I first had a look into the PDF specification + again, and really, it can be done in the way of Derek. Therefore I + merged it and removed the fragments of my code. + + On this step I started a regtest against the version after the fourth + patch. There were a lot of enhancements, especially in texts with + symbolic chars like mathematical and so on, but there was one + (and ONLY + one) regression, shown in bug-poppler27482.pdf + I examined that (that is also the reason for the delay) and + encountered + that on merging I removed my solution for this bug, therefore + + 7. insert enhancements for colorizing masks in pattern colorspace + I adapt the bug fix from bug 27482 to the merge. + + poppler/CairoOutputDev.cc | 101 ++-- + poppler/CairoOutputDev.h | 21 +- + poppler/Gfx.cc | 705 +++++++++++++++----------- + poppler/Gfx.h | 22 +- + poppler/GfxState.cc | 208 +++++--- + poppler/GfxState.h | 37 +- + poppler/GlobalParams.cc | 17 + + poppler/GlobalParams.h | 3 + + poppler/OutputDev.cc | 13 +- + poppler/OutputDev.h | 25 +- + poppler/PSOutputDev.cc | 87 ++-- + poppler/PSOutputDev.h | 21 +- + poppler/PreScanOutputDev.cc | 2 +- + poppler/SplashOutputDev.cc | 1179 + +++++++++++++++++++++---------------------- + poppler/SplashOutputDev.h | 80 +-- + poppler/TextOutputDev.cc | 8 + + poppler/TextOutputDev.h | 8 + + splash/Splash.cc | 11 +- + splash/Splash.h | 122 ++--- + splash/SplashPattern.cc | 14 - + splash/SplashPattern.h | 7 - + utils/pdftoppm.cc | 1 + + 22 files changed, 1390 insertions(+), 1302 deletions(-) + +commit 69df13c49cea2390f2c5036f3d450f134f7a2656 +Author: Thomas Freitag +Date: Sun Jan 15 15:07:18 2012 +0100 + + Fix stack overflow in PDFDoc::markObject() + + Bug 44660 + + poppler/PDFDoc.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit cdb56567c60b492ad08befff54f2ff70620b86fe +Author: Thomas Freitag +Date: Sun Jan 15 15:04:51 2012 +0100 + + Correctly initialize globalParams + + utils/pdfseparate.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 4e205a6625431dcf95375de009b4354746a4f0b7 +Author: Adrian Johnson +Date: Sun Jan 15 22:18:30 2012 +1030 + + parseargs: don't use arg->size with GooString argument + + 40b56994 added GooString arguments but incorrectly used arg->size as + the string length. arg->size is always 0 for GooString arguments. This + worked because the arg->size - 1 string length passed to + GooString::Set() just happened to be the the same value as the + CALC_STRING_LEN default argument indicating the string length is to be + calculated with strlen. + + utils/parseargs.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit a7210a7ebc3d3ca88643bfbc2f0d660a5553a668 +Author: Arseny Solokha +Date: Fri Jan 13 18:52:17 2012 +0100 + + Properly initialize globalParams + + Bug 44659 + + utils/pdfunite.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit baaf93f0e47a1978f9ea80e9394543a25b763d77 +Author: Adrian Johnson +Date: Thu Jan 12 01:05:07 2012 +1030 + + configure.ac: print the cairo version required if not found + + Bug 44619 + + configure.ac | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 9b8b4232587831fdada37de033c272a3c5049c34 +Author: Adrian Johnson +Date: Thu Jan 12 00:26:03 2012 +1030 + + cairo: avoid setting huge clip area when printing + + Bug 44002 + + poppler/CairoOutputDev.cc | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit efe115f22f8f00a2863ef265ad6f4e7cc2e0336c +Author: Albert Astals Cid +Date: Tue Jan 10 23:41:54 2012 +0100 + + compile + + poppler/ArthurOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 52d190d8ff962a57a59218f6871c3a63a443ea53 +Author: Albert Astals Cid +Date: Tue Jan 10 23:33:40 2012 +0100 + + [xpdf303] tiling "merges" from Thomas, using mostly our "old" code + instead of xpdf's + + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 4 ++-- + poppler/Gfx.cc | 45 + +++++++++++++++++++++++++++++++------------ + poppler/Gfx.h | 15 +++++++++------ + poppler/GfxState.cc | 5 ++++- + poppler/GfxState.h | 7 ++++--- + poppler/OutputDev.h | 3 ++- + poppler/PSOutputDev.cc | 2 +- + poppler/PSOutputDev.h | 2 +- + poppler/PreScanOutputDev.cc | 15 +++++++-------- + poppler/PreScanOutputDev.h | 2 +- + poppler/SplashOutputDev.cc | 8 ++++++-- + poppler/SplashOutputDev.h | 3 ++- + splash/Splash.cc | 32 ++++++++++++++++++++++-------- + utils/ImageOutputDev.cc | 2 +- + utils/ImageOutputDev.h | 2 +- + 16 files changed, 99 insertions(+), 50 deletions(-) + +commit bf75a957650dd5208ecf1f6db1555a3d00b7949c +Author: Albert Astals Cid +Date: Tue Jan 10 23:31:27 2012 +0100 + + [xpdf303] Splash::blitTransparent merges from Thomas + + splash/Splash.cc | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 296244ab74e56b2781daae0a664617d1da30527c +Author: Albert Astals Cid +Date: Tue Jan 10 23:30:34 2012 +0100 + + [xpdf303] Merge xpath Splash stuff from Thomas + + splash/SplashXPath.cc | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +commit e1ae7b900b01db7c7703da68ad94aa9bda1938f6 +Author: Albert Astals Cid +Date: Tue Jan 10 23:29:38 2012 +0100 + + [xpdf303] Merge splash font stuff from Thomas + + poppler/GlobalParams.cc | 17 +++++++++++++++++ + poppler/GlobalParams.h | 3 +++ + poppler/SplashOutputDev.cc | 3 +++ + poppler/SplashOutputDev.h | 1 + + splash/SplashFTFont.cc | 34 ++++++++++++++++++++++++++++------ + splash/SplashFTFont.h | 1 + + splash/SplashFTFontEngine.cc | 7 ++++--- + splash/SplashFTFontEngine.h | 5 +++-- + splash/SplashFontEngine.cc | 3 ++- + splash/SplashFontEngine.h | 1 + + 10 files changed, 63 insertions(+), 12 deletions(-) + +commit d46b673c46a72132fb3918b64733be552e35952f +Author: Albert Astals Cid +Date: Tue Jan 10 23:28:43 2012 +0100 + + [xpdf303] More merges from Thomas + + splash/Splash.cc | 2800 + ++++++++++++++++++++++++++++++++++++------------------ + splash/Splash.h | 60 ++ + 2 files changed, 1943 insertions(+), 917 deletions(-) + +commit 2cb40bab3b8c49d54c2a49554b30268ccb32899b +Author: Adrian Johnson +Date: Sun Jan 8 21:35:41 2012 +1030 + + Fix typo in pdffonts man page + + utils/pdffonts.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 34ae382915d9d9b2b3c015fee3c24907a6b52b8b +Author: Albert Astals Cid +Date: Sat Jan 7 17:14:05 2012 +0100 + + xpdf303: Merge some stuff in Splash [Thomas Freitag] + + 1. merge the complete pipe changes + a) including the overprint implementation from Derek used by pipe + b) including the transfer function implementation + 2. Two changes (not really a merge) to get it compiled under windows + (in + GlobalParams.cc & PDFDoc.cc) + 3. merge fill and stroke changes + a) including merge of SplashClip.cc + b) including merge of SplashXPathScanner.cc + + poppler/GfxState.cc | 94 ++- + poppler/GfxState.h | 17 +- + poppler/GlobalParams.cc | 7 + + poppler/GlobalParams.h | 3 + + poppler/GlobalParamsWin.cc | 2 +- + poppler/PDFDoc.cc | 2 +- + poppler/SplashOutputDev.cc | 134 +++- + poppler/SplashOutputDev.h | 8 +- + splash/Splash.cc | 1658 + ++++++++++++++++++++++++++++++------------ + splash/Splash.h | 42 +- + splash/SplashClip.cc | 57 +- + splash/SplashState.cc | 49 ++ + splash/SplashState.h | 12 + + splash/SplashXPathScanner.cc | 474 +++++++----- + splash/SplashXPathScanner.h | 24 +- + 15 files changed, 1845 insertions(+), 738 deletions(-) + +commit c2378609ae52523beb64e0f040fc79dce4877e03 +Author: Thomas Freitag +Date: Sat Jan 7 11:47:19 2012 +0100 + + regtest: read stderr output before calling wait to fix a possible + deadlock + + In the way the scripts starts it subprocesses, stderr becomes buffered + for the subprocesses. And unforunately, when the buffer limit is + reached, the subprocess suspends it work until it can print again on + stderr. That's why the python script runs into a deadlock when the + subprocess produces a lot of error messages. A small rearrange of the + commands, first read the stderr output and then wait that the + subprocess + ends, will remove this deadlock. + + regtest/backends/__init__.py | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit da6bfacb0f858f27bd47f247a25d6bc9ab778411 +Author: Adrian Johnson +Date: Sat Jan 7 10:35:17 2012 +1030 + + Add -subst option to pdffonts to list the substitute font name + and filename + + Bug 44416 + + poppler/FontInfo.cc | 8 ++++-- + poppler/FontInfo.h | 2 ++ + poppler/GlobalParams.cc | 29 ++++++++++++++++++-- + poppler/GlobalParams.h | 3 ++- + utils/pdffonts.1 | 3 +++ + utils/pdffonts.cc | 67 + +++++++++++++++++++++++++++++++++-------------- + 6 files changed, 88 insertions(+), 24 deletions(-) + +commit 9979b1b3e36dc8085d8c684692fece463fa474b1 +Author: Yi Yang +Date: Sat Jan 7 09:44:42 2012 +1030 + + Include .otf fonts when finding substitute fonts + + Bug 44412 + + poppler/GfxFont.cc | 2 +- + poppler/GlobalParams.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit ebfab832ab4f2642b9ab2ededd25de670a3c7147 +Author: Adrian Johnson +Date: Fri Dec 23 09:55:20 2011 +1030 + + autoconf: Check for cairo-ft and other cairo backends + + so that CAIRO_LIBS includes the freetype dependency and pdftocairo + includes the dependencies for optional cairo backends. + + Bug 43969 + + configure.ac | 14 ++++++++++++-- + utils/Makefile.am | 4 ++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit 51ca2b7c7dec5430d29860fd887ad5c5d9b3f574 +Author: Albert Astals Cid +Date: Thu Dec 15 00:26:09 2011 +0100 + + [xpdf303] Some more changes in TextOutputDev + + poppler/TextOutputDev.cc | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit c5ce12993a4d2bcd3b3e95b1f08d00dc8960678c +Author: Albert Astals Cid +Date: Wed Dec 14 22:49:33 2011 +0100 + + [xpdf303] Merge some stuff from TextOutputDev + + Yes, this is the best commit log i could think of + + poppler/TextOutputDev.cc | 268 + +++++++++++++++++++++++++++++----------------- + poppler/TextOutputDev.h | 19 ++-- + 2 files changed, 180 insertions(+), 107 deletions(-) + +commit 388d72ac27ae98fe3a1ebd21760f2b0fa0249a9b +Author: Albert Astals Cid +Date: Tue Dec 6 23:21:15 2011 +0100 + + include strings.h as we use memcpy + + Fixes bug 43558 + + goo/PNGWriter.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 743f70f594bf3c9a58d1ff0738b9a2bc3ea03382 +Author: Albert Astals Cid +Date: Tue Dec 6 20:27:03 2011 +0100 + + xpdf303: Use xpdf method against recursion while parsing + + Ours detected loops correctly, but not "valid" files containing lots + of arrays one inside the other [[[[[[[[[[[[[[[[[[[ + So go to this more crude "fix" used in xpdf + + poppler/Dict.cc | 4 ++-- + poppler/Dict.h | 2 +- + poppler/Object.cc | 4 ++-- + poppler/Object.h | 8 ++++---- + poppler/Parser.cc | 32 +++++++++++++++----------------- + poppler/Parser.h | 10 +++------- + poppler/XRef.cc | 33 +++++++-------------------------- + poppler/XRef.h | 2 +- + 8 files changed, 35 insertions(+), 60 deletions(-) + +commit 63c942a45227ef28fb94ef4765171d9812fffafa +Author: Albert Astals Cid +Date: Sun Dec 4 17:29:45 2011 +0100 + + Do not fail if we are trying to save a file with Encrypt but that + we have not modified at all + + Fixes KDE bug #288045 + + poppler/PDFDoc.cc | 49 + +++++++++++++++++++++++++++++-------------------- + 1 file changed, 29 insertions(+), 20 deletions(-) + +commit 0937d775e59a963b72fa7924e0f7be484f8345fc +Author: Albert Astals Cid +Date: Sun Dec 4 15:37:20 2011 +0100 + + update name and copyright + (cherry picked from commit 22601c2a64f094ede8085a3ccca3de9daaa556e7) + + utils/pdftocairo.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit bdb439ac5a751d6146204ae0d61fdbf7828c89c3 +Author: Axel Strübing +Date: Thu Nov 24 22:32:57 2011 +0100 + + Fix typo/regression introduced in + f6d026bfa18624ccd321e102bb39ba744998de1e + + poppler/Gfx.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 74e11d8c912dd95d235e44e7b34b8ea1be082b9f +Author: Albert Astals Cid +Date: Thu Nov 24 18:54:27 2011 +0100 + + Fix typo + + qt4/src/poppler-qt4.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ec2a1c3fca92a28c56911729927838f7aacf1078 +Author: Albert Astals Cid +Date: Wed Nov 16 23:13:52 2011 +0100 + + xpdf303: Use the correct sizeof() for the greallocn + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 544440b9d19ce99f3a7fcacdea70999b1efc217f +Author: Albert Astals Cid +Date: Wed Nov 16 23:09:23 2011 +0100 + + xpdf303: Add XRef::getPermFlags + + poppler/XRef.h | 1 + + 1 file changed, 1 insertion(+) + +commit b2e43e531edcecaeacf02a627c98cf7ef57f3e3c +Author: Albert Astals Cid +Date: Wed Nov 16 23:04:04 2011 +0100 + + xpdf303: make strToUnsigned "safer" + + poppler/PDFDoc.cc | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit bd1513742182ed4c80d21401dd30180981879f24 +Author: Albert Astals Cid +Date: Wed Nov 16 22:59:12 2011 +0100 + + xpdf303: Check xrefEntryCompressed entries to be of correct type + and in bounds + + poppler/XRef.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 3bf3e82d1f3eb19a454239d8c7641fc68ff4e462 +Author: Albert Astals Cid +Date: Wed Nov 16 22:54:17 2011 +0100 + + xpdf303: Adobe apparently ignores the generation number on compressed + objects + + poppler/XRef.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 73e6f19c4e76762eb5131b168e3b24167ba126cb +Author: Albert Astals Cid +Date: Wed Nov 16 22:29:11 2011 +0100 + + xpdf303: Add PDFDoc::fileNameU to windows builds + + poppler/PDFDoc.cc | 43 +++++++++++++++++++++++++++++++++++-------- + poppler/PDFDoc.h | 6 ++++++ + 2 files changed, 41 insertions(+), 8 deletions(-) + +commit 65388b1aaf9a78efcf9486d5e2d4bdce76f11194 +Author: Igor Slepchin +Date: Tue Nov 15 21:53:40 2011 +0100 + + Output images in pdftohtml -xml mode if no -i option is specified. + + Comes with an attached update to pdf2xml.dtd + + utils/HtmlOutputDev.cc | 48 + ++++++++++++++++++++++++++++++++++++++++-------- + utils/pdf2xml.dtd | 22 +++++++++++++++++----- + 2 files changed, 57 insertions(+), 13 deletions(-) + +commit a4c78946bc1fc3d52152af2e319051050ab05e28 +Author: Albert Astals Cid +Date: Mon Nov 14 13:22:53 2011 +0100 + + Make GfxColorSpace::parse accept dicts too + + poppler/GfxState.cc | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit f6d026bfa18624ccd321e102bb39ba744998de1e +Author: Albert Astals Cid +Date: Fri Nov 11 16:37:27 2011 +0100 + + Do not crash if failing to parse the colorspace + + Fixes bug 42793 + + poppler/Gfx.cc | 52 + +++++++++++++++++++++++++++++----------------------- + 1 file changed, 29 insertions(+), 23 deletions(-) + +commit c9da140bb476dcbb3928950ae9b506de82695cd2 +Author: David King +Date: Thu Oct 20 11:31:10 2011 +0200 + + glib-demo: Conditionally initialise threading + + In GLib 2.24.0 and above, threading is enabled by default, and the + thread initialization functions are deprecated since GLib 2.31.0. + + Fixes bug #42036. + + glib/demo/main.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit a0db250bbdefff6361551cf9db344bd5268fea11 +Author: Vittal Aithal +Date: Wed Nov 9 20:07:58 2011 +0100 + + pdfinfo: report page rotation + + utils/pdfinfo.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit e7dbd17ff07afa465636a90f526cd7ac8c731862 +Author: Kenji Uno +Date: Wed Nov 9 12:39:41 2011 +0100 + + Fix leak in GooString when resizing + + If resizing from "long" to shorter + + goo/GooString.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6a4f0c32b6723b127034d59a34bf076942e9935f +Author: Carlos Garcia Campos +Date: Sun Nov 6 15:44:06 2011 +0100 + + regtest: Skip tests with results when creating refs + + Not only tests that have md5, but also crashed or failed tests. + + regtest/TestReferences.py | 4 ++-- + regtest/backends/__init__.py | 3 +++ + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit eab952d121c7ab88a0d41587cfa449c0978bea04 +Author: Pino Toscano +Date: Thu Nov 3 21:58:11 2011 +0100 + + qt4: remove unused variable + + qt4/src/poppler-embeddedfile.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 85615f04e040dd38792533a4522e437644e97548 +Author: Pino Toscano +Date: Thu Nov 3 16:15:40 2011 +0100 + + qt4: get rid of the own F and Ff flags reading + + no more useful now, as they are available either directly or as + parsed values in both Annot and FormField + + qt4/src/poppler-form.cc | 16 ---------------- + qt4/src/poppler-private.h | 4 +--- + 2 files changed, 1 insertion(+), 19 deletions(-) + +commit 43347b43eeb66b5c8dc9637c36436baacc626bc4 +Author: Pino Toscano +Date: Thu Nov 3 16:10:57 2011 +0100 + + qt4: use the flags of the associated Annot object + + qt4/src/poppler-form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6c9492202de9b3b43da9eac3e40dc7fe218f21da +Author: Pino Toscano +Date: Thu Nov 3 16:03:11 2011 +0100 + + qt4: remove old commented code + + qt4/src/poppler-form.cc | 1 - + 1 file changed, 1 deletion(-) + +commit f0eca54131f7cdf6c1e0e78a18be0bf642567af4 +Author: Pino Toscano +Date: Thu Nov 3 15:46:33 2011 +0100 + + qt4: use the quadding read already in FormField + + ... instead of reading it again + + qt4/src/poppler-form.cc | 24 ++++++++---------------- + 1 file changed, 8 insertions(+), 16 deletions(-) + +commit d92bce1ae87d2f351bb1b972c64466502fb212aa +Author: Pino Toscano +Date: Thu Nov 3 15:30:45 2011 +0100 + + qt4: include + + qt4/src/poppler-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 955cd0c7bd3a72340deba098f4242a4904adc60f +Author: Albert Astals Cid +Date: Wed Nov 2 20:20:41 2011 +0100 + + Compile with MSVC needed for last change in the qt4 frontend + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit e0f5bc1deebaa9861baffd7c9ba31ea31585cd1d +Author: Hib Eris +Date: Tue Nov 1 14:15:09 2011 +0100 + + qt4: Use PDFDoc(wchar_t *, ...) on Windows + + Bug 35378 + + qt4/src/poppler-document.cc | 6 +++--- + qt4/src/poppler-private.h | 17 +++++++++++++++-- + 2 files changed, 18 insertions(+), 5 deletions(-) + +commit 52c1e9c5109299255d13b5b1e7d3eedaab512084 +Author: Carlos Garcia Campos +Date: Tue Nov 1 14:13:10 2011 +0100 + + regtest: Add --update-refs command line option to run-tests command + + It allows to update the references of failing tests. + + regtest/TestRun.py | 2 +- + regtest/backends/__init__.py | 34 ++++++++++++++++++++++++++++++++-- + regtest/commands/run-tests.py | 4 ++++ + 3 files changed, 37 insertions(+), 3 deletions(-) + +commit b4896a416b1df14a81b944b3c577fec85c9c7f7d +Author: Rex Dieter +Date: Tue Nov 1 09:40:53 2011 +0100 + + Fix pkg-config files + + We were using $FOO_REQUIRED instead of @FOO_REQUIRED@ + + configure.ac | 1 + + poppler-glib-uninstalled.pc.in | 2 +- + poppler-glib.pc.cmake | 2 +- + poppler-glib.pc.in | 2 +- + 4 files changed, 4 insertions(+), 3 deletions(-) + +commit 53f1b0c5edfdbef817bff31566893ac4e111516a +Author: Carlos Garcia Campos +Date: Sun Oct 30 16:02:19 2011 +0100 + + pdftocairo: Make sure beginDocument() is always called + + This fixes a crash when rendering only odd/even pages in a printing + format. + + utils/pdftocairo.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 8b0dfe9537082eaccd982530f1eddc2fcfc92f8e +Author: Albert Astals Cid +Date: Thu Oct 27 19:58:31 2011 +0200 + + xpdf303: Use splashDist instead of splashSqrt and USE_FIXEDPOINT + enhacements + + splash/SplashFTFont.cc | 70 + +++++++++++++++++++++++++++++++++++++++++++----- + splash/SplashFTFont.h | 2 +- + 2 files changed, 65 insertions(+), 7 deletions(-) + +commit b021bce2583c8e1e3a4c129106d80e7a4e223600 +Author: Albert Astals Cid +Date: Thu Oct 27 19:54:22 2011 +0200 + + xpdf303: wops, make it compile + + poppler/Lexer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 76295f4d401c36bdef3b2a20d18ac57a3b976410 +Author: Albert Astals Cid +Date: Thu Oct 27 19:42:42 2011 +0200 + + xpdf303: Adopt xpdf solution for the name too long problem + + poppler/Lexer.cc | 37 +++++++++++++++++-------------------- + 1 file changed, 17 insertions(+), 20 deletions(-) + +commit be6d4c19b8ce1515ce995eee408dc5752012c649 +Author: Albert Astals Cid +Date: Thu Oct 27 19:34:38 2011 +0200 + + xpdf303: Add brackets + + poppler/Lexer.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 904ae1385e93155a55008977c89aa664b7c8cb9b +Author: Albert Astals Cid +Date: Wed Oct 26 14:22:28 2011 +0200 + + Expose POPPLER_VERSION in poppler-config.h + + configure.ac | 3 +++ + poppler/poppler-config.h.cmake | 5 +++++ + poppler/poppler-config.h.in | 5 +++++ + 3 files changed, 13 insertions(+) + +commit aa83d4fe942ef0685c5990ddf3eccc2fbdf82292 +Author: Albert Astals Cid +Date: Thu Oct 20 00:59:57 2011 +0200 + + xpdf303: Add readFromStream + + poppler/GfxFont.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 74d771d58a4d1868669117709eb6811ec28bf840 +Author: Albert Astals Cid +Date: Thu Oct 20 00:56:58 2011 +0200 + + xpdf303: Add base14SubstFonts + + poppler/GfxFont.cc | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit 71260f987161d5b122caced6af14e9d64be46e4d +Author: Albert Astals Cid +Date: Thu Oct 20 00:55:42 2011 +0200 + + xpdf303: GfxFontLoc implementation + + poppler/GfxFont.cc | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 586430137985fd303ce87bdb9b902ee9a01341e8 +Author: Albert Astals Cid +Date: Thu Oct 20 00:54:09 2011 +0200 + + xpdf303: More stuff into base14FontMap + + poppler/GfxFont.cc | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit c0affb1845c339f89ca67608cb9fd9134ff902f5 +Author: Albert Astals Cid +Date: Thu Oct 20 00:51:31 2011 +0200 + + xpdf303: GfxFont::getOrignName/getName rework + + poppler/FontInfo.cc | 4 ++-- + poppler/GfxFont.cc | 4 ---- + poppler/GfxFont.h | 6 +----- + poppler/PSOutputDev.cc | 8 ++++---- + poppler/TextOutputDev.cc | 5 ++--- + 5 files changed, 9 insertions(+), 18 deletions(-) + +commit c5c513b5b72e03f6f0a94d04f7d8a22fe9bdaa80 +Author: Albert Astals Cid +Date: Thu Oct 20 00:45:30 2011 +0200 + + xpdf303: GfxFontLoc + + poppler/GfxFont.h | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit 4ec5e5e6d4785eb7a60744ae7e33c7ba3f603e8e +Author: Albert Astals Cid +Date: Thu Oct 20 00:34:10 2011 +0200 + + xpdf303: StdFontMapEntry renaming + + poppler/GfxFont.cc | 26 +++++++++++--------------- + poppler/GfxFont.h | 2 ++ + 2 files changed, 13 insertions(+), 15 deletions(-) + +commit e71088dc5087303b1ae5f3e72af287ec4e0a1342 +Author: Albert Astals Cid +Date: Mon Oct 17 13:42:06 2011 +0200 + + remove useless #if + + poppler/Page.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 40b56994dda79653c902977423f349efa55cf21e +Author: Adrian Johnson +Date: Mon Oct 17 20:33:03 2011 +1030 + + utils: Add GooString arg to parseargs and use for paths in pdftocairo + + and MAXPATHLEN is not available on windows. Avoid the + need to know the max path length by using GooString for the path. + + utils/parseargs.cc | 12 ++++++++++++ + utils/parseargs.h | 2 ++ + utils/pdftocairo.cc | 17 ++++++++--------- + 3 files changed, 22 insertions(+), 9 deletions(-) + +commit 4bb34757dbbff780baba053371274c05b29771e1 +Author: Adrian Johnson +Date: Mon Sep 19 21:11:44 2011 +0930 + + cairo: fix setSoftMask bugs + + - Getting the clip extents in device space requires transforming all + four corners of the clip extents and translating by the group device + offset other wise the device extents will not be correct for rotated + ctm. + + - Adjust matrix to include translation of the clip extents origin + since the mask surface does not start at (0,0). + + - the ctm when called cairo_mask() needs to be the same as the + ctm when + the mask was created. + + - implement transfer function in setSoftMask + + Bug 41005 + + poppler/CairoOutputDev.cc | 97 + ++++++++++++++++++++++++++++----------------- + poppler/CairoOutputDev.h | 6 ++- + 2 files changed, 65 insertions(+), 38 deletions(-) + +commit 50adbed183e9bf70eb4c41e8858cf464c3042e45 +Author: Carlos Garcia Campos +Date: Sun Oct 16 12:40:27 2011 +0200 + + Remove poppler-cairo dependency from poppler-glib pkg-config file + + poppler-glib links to poppler-cairo statically, so it doesn'tm + depend on + the dynamic library. + + CMakeLists.txt | 1 - + configure.ac | 2 -- + poppler-glib-uninstalled.pc.in | 2 +- + poppler-glib.pc.cmake | 2 +- + poppler-glib.pc.in | 2 +- + 5 files changed, 3 insertions(+), 6 deletions(-) + +commit acd8ecc9121db58851f73764f046a4f54bd80581 +Author: Adrian Johnson +Date: Sat Oct 8 15:03:24 2011 +1030 + + ps: fix uncolored tiling patterns + + Uncolored patterns and type 3 chars must not use color setting + operators. When emitting an uncolored pattern: + - disable the update color space functions + - disable the update color functions + - set pdfLastFill and pdfLastStroke to true to ensure the the sCol + and fCol procedures that is used by some of the PS procedures that + emulate PDF operators do not update the color. + + Bug 41462 + + poppler/PSOutputDev.cc | 41 +++++++++++++++++++++++++++++++++++++++++ + poppler/PSOutputDev.h | 1 + + 2 files changed, 42 insertions(+) + +commit 6e1326b11f98f2b277e53a6cdbcb373ce6c29958 +Author: Adrian Johnson +Date: Fri Oct 7 20:29:36 2011 +1030 + + ps: emit non repeating patterns in PSOutput with inType3Char = true + + instead of falling back to Gfx. This avoids emitting the image data + twice. + + poppler/PSOutputDev.cc | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit ed05fcb8c442b716c5e382c98f2625701926c86a +Author: Adrian Johnson +Date: Sat Oct 1 20:19:19 2011 +0930 + + ps: fix tiling pattern fill matrix + + In PS the pattern matrix maps the pattern space to user space. In PDF + the pattern matrix maps the pattern space to the default ctm of the + content stream (baseMatrix in Gfx). The matrix mat already contains + the + correct pattern->baseMatrix so use it instead of pmat. + + Bug 41374 + + poppler/PSOutputDev.cc | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 087757866de13b6164967a1d241d3c0e47065f1a +Author: Albert Astals Cid +Date: Thu Oct 13 12:18:52 2011 +0200 + + xpdf303: Merge SplashT1Font::getGlyphPath changes + + splash/SplashT1Font.cc | 39 +++++++++++++++++++++------------------ + 1 file changed, 21 insertions(+), 18 deletions(-) + +commit c84f46ee16a8dcc6e2cad2359df621cc6cdb8fa5 +Author: Albert Astals Cid +Date: Thu Oct 13 12:16:14 2011 +0200 + + xpdf303: Add GBool type1 to SplashFTFontFile + + splash/SplashFTFontFile.cc | 9 +++++---- + splash/SplashFTFontFile.h | 3 ++- + 2 files changed, 7 insertions(+), 5 deletions(-) + +commit d845da2c3c1acbeaa4b9bb3125f9143e785210ff +Author: Yury G. Kudryashov +Date: Thu Oct 6 14:49:19 2011 +0200 + + Okular moved to git, fix docs + + Fix URLs in poppler-qt4 documentation + + qt4/src/Mainpage.dox | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bb40c980f7ab7a6eb9735af17103f87bc65893d6 +Author: Yury G. Kudryashov +Date: Thu Oct 6 14:49:08 2011 +0200 + + Explicitly include fontconfig include dir + + This fixes cmake-driven build on systems where fontconfig is + installed in + non-standard location. + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 776ca137984556530ba938265714934bdc3d6443 +Author: Yury G. Kudryashov +Date: Thu Oct 6 14:48:46 2011 +0200 + + Fix typo in cmake option documentation + + Relocatable build does *not* (was missing in docs) hardcode library + location. + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ab8616dcb637ac1aeb4d5f142c3c4bff9aecd041 +Author: Adrian Johnson +Date: Thu Oct 6 14:21:10 2011 +0200 + + close the file or flush stdout + + utils/pdftocairo.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 72c2d563684ab6937a98a0c1c79be3639d29c9ce +Author: Albert Astals Cid +Date: Tue Oct 4 17:46:11 2011 +0200 + + xpdf303: Make sure array length is > 0 + + This is not scritcly necessary since Array::get already returns a + null object in case + the index is out of range but let's merge it for the sake of being + more closer to xpdf + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c814c2452c7f60623fdd0fee6f915adeaf5b49e3 +Author: Albert Astals Cid +Date: Tue Oct 4 17:40:27 2011 +0200 + + xpdf303: Limit recursion in GfxColorSpace parsing + + I think we could do it better, but it'd take more time and it's not + what we are doing in this branch anyway + + poppler/GfxState.cc | 43 +++++++++++++++++++++++++++---------------- + poppler/GfxState.h | 14 +++++++------- + 2 files changed, 34 insertions(+), 23 deletions(-) + +commit 0e53ba5709296dc2ba1399f885af200d2041f0cd +Author: Glad Deschrijver +Date: Sat Oct 1 15:41:51 2011 +0200 + + qt4: Add the option of PSConverter creating EPS + + qt4/src/poppler-ps-converter.cc | 3 ++- + qt4/src/poppler-qt4.h | 6 ++++-- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 04e271a0c10807c9c3967daa1f656e87b97b9901 +Author: Albert Astals Cid +Date: Sat Oct 1 14:34:50 2011 +0200 + + Fix typo in documentation + + Reported by Glad Deschrijver + (cherry picked from commit 1346caac6c564035d368617a329b361d0253fbf6) + + qt4/src/poppler-qt4.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9855529e8e1a83c6d77a9e4221ea2132d44e9fb1 +Author: Albert Astals Cid +Date: Sat Oct 1 14:27:44 2011 +0200 + + Remove space after % as it confuses libspectre + + Discussed with Adrian Johnson + Problem found by Glad Deschrijver + + poppler/PSOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8e8cde6f374b59222d834e2e7f08fb4a6a4d55a5 +Author: Albert Astals Cid +Date: Wed Sep 28 23:32:24 2011 +0200 + + xpdf303: More manpage merging + + utils/pdftotext.1 | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit f798f00c9ec55bff2eb93938424c436ba2663e7a +Author: Albert Astals Cid +Date: Wed Sep 28 23:30:55 2011 +0200 + + xpdf303: mention pdfdetach in non xpdf tools + + utils/pdftocairo.1 | 1 + + utils/pdftohtml.1 | 1 + + 2 files changed, 2 insertions(+) + +commit 3fc46ac1c046460ccf46ba4b8a92f728e775694a +Author: Albert Astals Cid +Date: Wed Sep 28 23:30:00 2011 +0200 + + xpdf303: Fix pdfdetach man page references + + utils/pdfdetach.1 | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit 79e1d77fb00a7c7f0bda4ae76328c4211c7f16e6 +Author: Albert Astals Cid +Date: Wed Sep 28 23:27:53 2011 +0200 + + xpdf303: Merge some more manpages + + utils/pdfinfo.1 | 15 +++++++++++---- + utils/pdftoppm.1 | 9 +++++---- + 2 files changed, 16 insertions(+), 8 deletions(-) + +commit 841c96be59ddad32f51d4d114ba1dcc42285ab55 +Author: Albert Astals Cid +Date: Wed Sep 28 23:23:25 2011 +0200 + + xpdf303: Merge some man pages + + utils/pdffonts.1 | 9 +++++---- + utils/pdfimages.1 | 9 +++++---- + utils/pdftops.1 | 9 +++++---- + 3 files changed, 15 insertions(+), 12 deletions(-) + +commit d2706a05513134f961e2500e0e596f2769707ce5 +Author: Adrian Johnson +Date: Wed Sep 28 21:20:23 2011 +0930 + + cairo: fix crash when using poppler_page_get_image() + + poppler/CairoOutputDev.h | 1 + + 1 file changed, 1 insertion(+) + +commit 0c0591fa23441c54c9443072615273ea65482d76 +Author: Albert Astals Cid +Date: Tue Sep 27 00:45:59 2011 +0200 + + 0.18.0 + + CMakeLists.txt | 6 +-- + NEWS | 14 +++++++ + configure.ac | 4 +- + cpp/Doxyfile | 2 +- + gtk-doc.make | 102 + +++++++++++++++++++++------------------------------ + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 7 files changed, 64 insertions(+), 68 deletions(-) + +commit 19f5db7acd64330d198f18695175df02141794d7 +Author: Albert Astals Cid +Date: Tue Sep 27 00:15:15 2011 +0200 + + Update Carlos (C) year + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6d34d4af90b8b41360de4dabb000bbcc894775d0 +Author: Albert Astals Cid +Date: Tue Sep 27 00:09:54 2011 +0200 + + Rename pdfmerge and pdfextract + + To pdfunite and pdfseparate, the old names were taken + + utils/.gitignore | 4 +- + utils/CMakeLists.txt | 28 ++++---- + utils/Makefile.am | 16 ++--- + utils/pdfextract.1 | 49 -------------- + utils/pdfextract.cc | 115 --------------------------------- + utils/pdfmerge.1 | 33 ---------- + utils/pdfmerge.cc | 176 + -------------------------------------------------- + utils/pdfseparate.1 | 49 ++++++++++++++ + utils/pdfseparate.cc | 115 +++++++++++++++++++++++++++++++++ + utils/pdfunite.1 | 33 ++++++++++ + utils/pdfunite.cc | 176 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 11 files changed, 397 insertions(+), 397 deletions(-) + +commit baf54c2876edd476ffc68da6518598847bb7ec8a +Author: Albert Astals Cid +Date: Mon Sep 26 15:54:46 2011 +0200 + + Remove getRawStream + + Since it does exactly the same as getNextStream + + poppler/DCTStream.h | 1 - + poppler/Stream.h | 1 - + utils/HtmlOutputDev.cc | 7 ++----- + utils/ImageOutputDev.cc | 9 +++------ + 4 files changed, 5 insertions(+), 13 deletions(-) + +commit bba57e588fd1ee3a61f18405d1d1bf89fceb5b96 +Author: Carlos Garcia Campos +Date: Sun Sep 25 12:21:02 2011 +0200 + + xpdf303: Added the pdfdetach tool + + I haven't merged xpdf code for embedded files, I think our + implementation is better and more complete. I've adapated pdfdetach + code to use our code and return also embedded files of file attachment + annotations to match what xpdf does. + + poppler/FileSpec.cc | 22 ++++ + poppler/FileSpec.h | 3 + + utils/CMakeLists.txt | 9 ++ + utils/Makefile.am | 6 + + utils/pdfdetach.1 | 105 +++++++++++++++++ + utils/pdfdetach.cc | 318 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 463 insertions(+) + +commit f62c2f002c782d3a7887525f031d266aca6eb582 +Author: Carlos Garcia Campos +Date: Sat Sep 24 11:20:13 2011 +0200 + + xpdf303: Parse ActualText in Gfx instead of output devices + + Remove beginMarkedContent and endMarkedcontent and add beginActualText + and endActualText. ActualText is parsed in Gfx, that already + handles the + marked content stack, so that text output dev doesn't need to + handle it + too. The text string is passed to beginActualText(). This change + is not + an exact merge of xpdf code, I've tried to keep our implementation. + + poppler/CairoOutputDev.cc | 8 +-- + poppler/CairoOutputDev.h | 6 +- + poppler/Gfx.cc | 40 +++++++++---- + poppler/OutputDev.cc | 6 -- + poppler/OutputDev.h | 4 +- + poppler/TextOutputDev.cc | 145 + +++++++++++++++++++-------------------------- + poppler/TextOutputDev.h | 21 ++++--- + 7 files changed, 108 insertions(+), 122 deletions(-) + +commit a097447ed13cb021003425f85597e2628935feb2 +Author: Carlos Garcia Campos +Date: Sat Sep 24 09:43:05 2011 +0200 + + Use new error syntax in pdfextract + + utils/pdfextract.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 718c735aed540aa49b8dde250ca886c6ad93f5b6 +Merge: 6721916 69707f0 +Author: Carlos Garcia Campos +Date: Sat Sep 24 09:38:52 2011 +0200 + + Merge branch 'master' into xpdf303merge + +commit 69707f0a9b5a94c80817039db943fb4f26e743e3 +Author: Adrian Johnson +Date: Mon Sep 19 22:00:34 2011 +0930 + + Update .gitignore + + regtest/.gitignore | 1 + + utils/.gitignore | 2 ++ + 2 files changed, 3 insertions(+) + +commit 0de477817e424078cfcfcae114e7745809f0848d +Author: Adrian Johnson +Date: Mon Sep 19 21:57:07 2011 +0930 + + utils: Add Glyph & Cog copyright to pdfmerge and pdfextract man pages + + utils/pdfextract.1 | 3 ++- + utils/pdfmerge.1 | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit ce7372db64ee807dc2b491e121fbe557dbf697e8 +Author: Adrian Johnson +Date: Mon Sep 19 22:04:27 2011 +0930 + + regtest: render cairo at 72ppi + + For consistency with splash. It is faster and easier to compare with + splash results. + + regtest/backends/cairo.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6cf7330089c4dcc1099906d9c37c3607a2a1eeba +Author: Carlos Garcia Campos +Date: Mon Sep 19 18:42:35 2011 +0200 + + regtest: Ignore checksums of crashed, failed and stderr files + + They shouldn't have a checksum, but it might happen with md5 files + generated with previous versions. + + regtest/backends/__init__.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 6512bf1c5dab37058460882fec3407b396830981 +Author: Albert Astals Cid +Date: Sun Sep 18 18:38:32 2011 +0200 + + Render at 72 instead of 150, it's faster :D + + regtest/backends/splash.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b828f63ed3896a22f3fe7ddbe2ec2f549d7a2c62 +Author: Albert Astals Cid +Date: Sun Sep 18 18:20:47 2011 +0200 + + install pdfextract and pdfmerge manpages + + utils/CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 986759dfbe85998c85ee9b0825c7522395567531 +Author: Thomas Freitag +Date: Sun Sep 18 18:19:30 2011 +0200 + + pdfextract and pdfmerge man pages + + utils/Makefile.am | 2 ++ + utils/pdfextract.1 | 48 + ++++++++++++++++++++++++++++++++++++++++++++++++ + utils/pdfmerge.1 | 32 ++++++++++++++++++++++++++++++++ + 3 files changed, 82 insertions(+) + +commit 90da1af542fd7f3cecef31b15da6971345b38209 +Author: Thomas Freitag +Date: Sun Sep 18 18:19:04 2011 +0200 + + Complain if %d is not present and it should + + utils/pdfextract.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 40e066a84ddb3a5c41805c095659af5f5704d6d8 +Author: suzuki toshiya +Date: Sun Sep 18 18:16:14 2011 +0200 + + qt_subdir is unneeded + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6721916c92d720947b3285c85fdbe6610c6bf013 +Merge: 8456a6e e23f6b9 +Author: Carlos Garcia Campos +Date: Sun Sep 18 16:31:10 2011 +0200 + + Merge branch 'master' into xpdf303merge + + Conflicts: + poppler/Gfx.cc + +commit e23f6b9cade804136bd4bb58182f4fe0b072fbf2 +Author: Carlos Garcia Campos +Date: Sun Sep 18 16:27:50 2011 +0200 + + regtest: Do not create checksums for crashed, failed and stderr files + + regtest/backends/__init__.py | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 110b8be1d9f2694b42bd12dcb6af02bfca9866dd +Author: Carlos Garcia Campos +Date: Sun Sep 18 16:26:58 2011 +0200 + + Fix memory leak + + poppler/Gfx.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 8456a6e1354126dc98357fb806595bd3bc198522 +Author: Carlos Garcia Campos +Date: Sun Sep 18 16:07:54 2011 +0200 + + xpdf303: Add OCDisplayNode + + It's not used by poppler yet, but we might want to use it from the + frontends after the merge. + + poppler/OptionalContent.cc | 127 + ++++++++++++++++++++++++++++++++++++++++++++ + poppler/OptionalContent.h | 36 ++++++++++++- + 2 files changed, 162 insertions(+), 1 deletion(-) + +commit 06c6660dc9fe326f185ff323e643af6714b32ec8 +Author: Carlos Garcia Campos +Date: Sun Sep 18 15:08:44 2011 +0200 + + xpdf303: Parse usage dictionary of optional content groups + + poppler/OptionalContent.cc | 28 ++++++++++++++++++++++++++++ + poppler/OptionalContent.h | 14 +++++++++++++- + 2 files changed, 41 insertions(+), 1 deletion(-) + +commit 528d5b0d40302b3fee3aec69b85bdd1daa4db568 +Author: Carlos Garcia Campos +Date: Sun Sep 18 14:03:36 2011 +0200 + + xpdf303: Image XObjects can have a OC entry too + + poppler/Gfx.cc | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit c40353d3bb761f5be8ddbd2bf5341e83901fb132 +Author: Carlos Garcia Campos +Date: Sun Sep 18 13:32:07 2011 +0200 + + xpdf303: OC entry is specific to form XObjects + + poppler/Gfx.cc | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 6ddb51d81b064346dc85d2ae72570a956a184d74 +Author: Carlos Garcia Campos +Date: Sun Sep 18 12:59:28 2011 +0200 + + xpdf303: The spec doesn't say OC must be null or ref + + poppler/Annot.cc | 5 +---- + poppler/Gfx.cc | 22 +++++++--------------- + 2 files changed, 8 insertions(+), 19 deletions(-) + +commit 434bb9b38319edc7282be22044bd7761403a38a6 +Author: Carlos Garcia Campos +Date: Sun Sep 18 12:45:12 2011 +0200 + + xpdf303: OC entry can be an optional content group too + + Not only an optional content membership dictionary. + + poppler/OptionalContent.cc | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 56410b80fdabb99e2de0c6589de6ee745936c523 +Author: Carlos Garcia Campos +Date: Sun Sep 18 12:44:02 2011 +0200 + + xpdf303: Not finding an oc group is not necessarily a syntax error + + poppler/OptionalContent.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 4bb4439450e342479375cb56d10561457475bd13 +Author: Carlos Garcia Campos +Date: Sun Sep 18 12:42:15 2011 +0200 + + xpdf303: Fix check of OptionalContentGroup::getState() + + We use an enum, not a boolean. + + poppler/OptionalContent.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d737e3098e02e46525c0edf2165462e03ac7a0e6 +Author: Carlos Garcia Campos +Date: Sun Sep 18 11:36:11 2011 +0200 + + xpdf303: Add support for visibility expressions in OptContent + + poppler/OptionalContent.cc | 113 + ++++++++++++++++++++++++++++++++++---------- + poppler/OptionalContent.h | 3 +- + 2 files changed, 91 insertions(+), 25 deletions(-) + +commit 258d56ba85902a8ab50eec3fe66dd6425226fa59 +Merge: 72a7736 12c6239 +Author: Carlos Garcia Campos +Date: Sun Sep 18 11:12:38 2011 +0200 + + Merge branch 'master' into xpdf303merge + +commit 12c6239ca4f1f6a5de72aebd755f9d1354ea5837 +Author: Carlos Garcia Campos +Date: Sun Sep 18 11:08:06 2011 +0200 + + regtest: Fix checksum check for tests containing spaces in filename + + regtest/backends/__init__.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 72a7736389cbe36c1f8a526f1a659cae1a3f85a3 +Author: Carlos Garcia Campos +Date: Sun Sep 18 10:47:51 2011 +0200 + + xpdf303: No need to cache optContentConfig object in Annot + + poppler/Annot.cc | 2 +- + poppler/Annot.h | 2 -- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit 93ba92db0a3af35f197a4faa5a528af98ea0f624 +Author: Albert Astals Cid +Date: Wed Sep 14 00:58:44 2011 +0200 + + Make it work with Python3 + + regtest/Config.py | 4 ++-- + regtest/TestReferences.py | 8 ++++---- + regtest/TestRun.py | 32 ++++++++++++++++---------------- + regtest/Timer.py | 8 ++++---- + regtest/backends/__init__.py | 12 ++++++------ + regtest/commands/__init__.py | 6 +++--- + regtest/commands/create-refs.py | 2 +- + regtest/commands/run-tests.py | 2 +- + regtest/main.py | 2 +- + 9 files changed, 38 insertions(+), 38 deletions(-) + +commit da1b5437148e1e6317246b16f7235c8bc280be97 +Author: Carlos Garcia Campos +Date: Tue Sep 13 20:09:56 2011 +0200 + + regtest: Add a way to skip files + + A new command line option --skip has been added to give a file + with the + list of test to skip. When --skip is not used, it look for a file + named + Skipped in the tests dir. Lines starting with '#' are considered + comments and are ignored. + + regtest/TestReferences.py | 9 +++++++-- + regtest/TestRun.py | 9 +++++++-- + regtest/Utils.py | 20 ++++++++++++++++++++ + regtest/main.py | 6 +++++- + 4 files changed, 39 insertions(+), 5 deletions(-) + +commit b730b2c1d9666f62f940762663c8318e64049d61 +Author: Carlos Garcia Campos +Date: Tue Sep 13 19:04:04 2011 +0200 + + regtest: Limit the number of arguments to 1 + + It's easier to run poppler-regtest more than once if you need to run + different tests. + + regtest/commands/create-refs.py | 24 ++++++++++++------------ + regtest/commands/run-tests.py | 26 +++++++++++++------------- + regtest/main.py | 2 +- + 3 files changed, 26 insertions(+), 26 deletions(-) + +commit 5ce045d0358318859c844340c639483485b69c58 +Author: Carlos Garcia Campos +Date: Tue Sep 13 18:18:21 2011 +0200 + + regtest: Sort tests before create-refs/run-tests and show progress + + regtest/TestReferences.py | 20 ++++++++------------ + regtest/TestRun.py | 21 ++++++++++----------- + regtest/Utils.py | 35 +++++++++++++++++++++++++++++++++++ + 3 files changed, 53 insertions(+), 23 deletions(-) + +commit 10801b6faee9037af054fe74cc4a03620ea41d45 +Author: Carlos Garcia Campos +Date: Mon Sep 12 20:13:17 2011 +0200 + + Add initial poppler regressions test program + + regtest/Config.py | 32 ++++++ + regtest/TestReferences.py | 73 +++++++++++++ + regtest/TestRun.py | 156 +++++++++++++++++++++++++++ + regtest/Timer.py | 73 +++++++++++++ + regtest/backends/__init__.py | 220 + +++++++++++++++++++++++++++++++++++++++ + regtest/backends/cairo.py | 39 +++++++ + regtest/backends/postscript.py | 35 +++++++ + regtest/backends/splash.py | 39 +++++++ + regtest/backends/text.py | 48 +++++++++ + regtest/commands/__init__.py | 93 +++++++++++++++++ + regtest/commands/create-refs.py | 65 ++++++++++++ + regtest/commands/run-tests.py | 69 ++++++++++++ + regtest/main.py | 77 ++++++++++++++ + regtest/poppler-regtest | 6 ++ + 14 files changed, 1025 insertions(+) + +commit 245e331a14e11a615bf47abbeb34a3561e393b41 +Author: Albert Astals Cid +Date: Mon Sep 12 13:43:49 2011 +0200 + + 0.17.4 + + CMakeLists.txt | 2 +- + NEWS | 5 +++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 9 insertions(+), 4 deletions(-) + +commit 194b2413eb2c6a1641508aec63336aaf89ec3b51 +Author: Albert Astals Cid +Date: Mon Sep 12 13:43:35 2011 +0200 + + gir 0.18 + + glib/CMakeLists.txt | 12 ++++++------ + glib/Makefile.am | 12 ++++++------ + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 61c06d2efad20880e1e0b399cf797dd55f6c8dab +Author: Albert Astals Cid +Date: Mon Sep 12 00:32:38 2011 +0200 + + xpdf303: Useless NULL assignments + + poppler/SplashOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4fbcbf1ffb8a98fe8c12643fdab2cbd90b4e60f9 +Author: Albert Astals Cid +Date: Mon Sep 12 00:30:52 2011 +0200 + + xpdf303: Set size to 64 instead of 100 + + poppler/SplashOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1c7203e57e9c7c264f5cada6362a6b449dd8689c +Author: Albert Astals Cid +Date: Mon Sep 12 00:21:03 2011 +0200 + + xpdf303: Avoid calling a "slow" function + + poppler/PSOutputDev.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit db4c5789bf95af9f45a7911153acc20a26a447f1 +Author: Albert Astals Cid +Date: Mon Sep 12 00:19:49 2011 +0200 + + xpdf303: fix spacing + + poppler/PSOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 10c3d15f841865929d2f66353cb01d0d321e8b82 +Author: Albert Astals Cid +Date: Mon Sep 12 00:03:13 2011 +0200 + + xpdf303: make limit smaller + + poppler/PSOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d4e6e739701ba817576752ced169b24c5e95156 +Author: Albert Astals Cid +Date: Sun Sep 11 23:57:22 2011 +0200 + + xpdf303: Remove 512 limit in pdftoppm + + utils/pdftoppm.cc | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit e4e843f1115d95c54967f0386bfb28f685d6c88d +Author: Albert Astals Cid +Date: Sun Sep 11 22:49:34 2011 +0200 + + xpdf303: Rework nComps != colorSpace->getNComps() handling + + poppler/GfxState.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit dda45b6a67f3f97705e5d806eaf7d37171789e66 +Author: Albert Astals Cid +Date: Sun Sep 11 22:46:51 2011 +0200 + + xpdf303: NULL GfxICCBasedColorSpace if array does not have 2 elements + + poppler/GfxState.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 760e814a6d26db8eba567520aad771002e11357a +Author: Albert Astals Cid +Date: Sun Sep 11 22:21:40 2011 +0200 + + xpdf303: increase formDepth limit + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 59442e5994f3b94d5221cbc90f79fad235fe2611 +Author: Albert Astals Cid +Date: Sun Sep 11 22:10:41 2011 +0200 + + xpdf303: Remove flags that were never used + + splash/Splash.cc | 6 +----- + splash/SplashXPath.cc | 34 ++++------------------------------ + splash/SplashXPath.h | 13 ++++--------- + 3 files changed, 9 insertions(+), 44 deletions(-) + +commit 41a620ef60507ceda42a14d06d6587ed10016468 +Author: Albert Astals Cid +Date: Thu Sep 8 16:18:01 2011 +0200 + + xpdf303: Adapt use of getBlock to our use of getChars + + poppler/Stream.cc | 58 + ++++++++++++++++++++++++++++++++--------------------- + poppler/Stream.h | 2 ++ + 2 files changed, 37 insertions(+), 23 deletions(-) + +commit 2f7701fe730a648d0a1d181c5b20e4802640dc52 +Author: Albert Astals Cid +Date: Thu Sep 8 15:59:27 2011 +0200 + + xpdf303: Adapt xpdf getBlock to our getChars + + poppler/JBIG2Stream.cc | 17 ++++++++ + poppler/JBIG2Stream.h | 2 + + poppler/Stream.cc | 113 + +++++++++++++++++++++++++++++++++++++++++++----- + poppler/Stream.h | 55 ++++++++++++----------- + 4 files changed, 152 insertions(+), 35 deletions(-) + +commit 3a1988db40def1655ec638cd521ed40eadc0acca +Author: Carlos Garcia Campos +Date: Thu Sep 8 15:40:12 2011 +0200 + + xpdf303: empty pages need to call dump to do any setup required by + the OutputDev + + poppler/Page.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4cddaed21592ac491519a81a003035bc4e618705 +Author: Carlos Garcia Campos +Date: Thu Sep 8 15:35:33 2011 +0200 + + xpdf303: Don't clip the other page boxes to the MediaBox at the + intermediate nodes + + only do it at the leaf (Page) nodes - the other boxes can be specified + before the MediaBox is specified. + I think we already had that change, we checked isPage before clipping, + I've merged this way just to make future merges a bit easier. + + poppler/Page.cc | 16 ++++++++-------- + poppler/Page.h | 3 +++ + 2 files changed, 11 insertions(+), 8 deletions(-) + +commit 3538ac89bfea750de8907847d1d5e3515d0b8be7 +Author: Albert Astals Cid +Date: Thu Sep 8 15:07:21 2011 +0200 + + xpdf303: compile + + poppler/ArthurOutputDev.cc | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 89d95d0f254a828d28d943b698eeaec51f03686f +Author: Carlos Garcia Campos +Date: Thu Sep 8 12:38:36 2011 +0200 + + xpdf303: Add codeToGID and codeToGIDLen params to + loadOpenTypeCFFFont() + + poppler/SplashOutputDev.cc | 12 +++++++++++- + splash/SplashFTFontEngine.cc | 29 +++++++++++++++++------------ + splash/SplashFTFontEngine.h | 3 ++- + splash/SplashFontEngine.cc | 6 ++++-- + splash/SplashFontEngine.h | 3 ++- + 5 files changed, 36 insertions(+), 17 deletions(-) + +commit d768204e51e6bdbcac4d6b43537297616cbedbf3 +Author: Albert Astals Cid +Date: Tue Sep 6 21:56:43 2011 +0200 + + xpdf303: Revert b36d150931cd555b84ee996d505e8b91e2afde19 + + Breaks bug164568-2.pdf so our fix was better :-) + + poppler/JBIG2Stream.cc | 91 + +++++++++++++++++++++--------------------------- + poppler/JBIG2Stream.h | 1 - + 2 files changed, 40 insertions(+), 52 deletions(-) + +commit 2230b8f2128edf4994d8a742f562e1b5acf96b74 +Author: Albert Astals Cid +Date: Tue Sep 6 00:05:53 2011 +0200 + + xpdf303: Merge JPXStream changes + + poppler/JPXStream.cc | 1000 + +++++++++++++++++++++++++++++++------------------- + poppler/JPXStream.h | 43 +-- + 2 files changed, 632 insertions(+), 411 deletions(-) + +commit 35bb53feaa2e469253368f03a9835d73aeb1a240 +Author: Albert Astals Cid +Date: Mon Sep 5 23:20:09 2011 +0200 + + xpdf303: Add BufStream + + poppler/Stream.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Stream.h | 25 +++++++++++++++++++++++++ + 2 files changed, 71 insertions(+) + +commit 8a9d92fcf05285c1f06bc153aa79d0200d05bbd9 +Author: Albert Astals Cid +Date: Mon Sep 5 22:57:02 2011 +0200 + + xpdf303: CCITTFaxStream header misc fixes + + poppler/Stream.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 22d370c0a1f8c016ebc5a6d8320fe55bfd31c8a7 +Author: Albert Astals Cid +Date: Mon Sep 5 22:53:45 2011 +0200 + + xpdf303: DCTStream misc fixes + + poppler/Stream.cc | 32 ++++++++++++++++++++++++++------ + 1 file changed, 26 insertions(+), 6 deletions(-) + +commit 36d3057546b5a1d717c71b8dcb9773f91e3b5960 +Author: Albert Astals Cid +Date: Mon Sep 5 22:46:59 2011 +0200 + + xpdf303: Add some {} + + poppler/Stream.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 308654eb5dfbb783f29bd645f60c79d5b5fe42c9 +Author: Albert Astals Cid +Date: Mon Sep 5 22:45:50 2011 +0200 + + xpdf303: code1 changed to int in CCITTFaxStream::reset + + poppler/Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f097dc1f9d580eb1cdc8180d3920fe795493cf89 +Author: Albert Astals Cid +Date: Mon Sep 5 22:43:16 2011 +0200 + + xpdf303: Use 32 bits in CCITTFaxStream::lookBits + + poppler/Stream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b5417659042c95891aa549cae396ba4cc6604030 +Author: Albert Astals Cid +Date: Mon Sep 5 22:40:02 2011 +0200 + + xpdf303: Check against lookBits returning EOF + + poppler/Stream.cc | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit eaf9d31c97a3cc06f4ce94d9190ae1a337634749 +Author: Albert Astals Cid +Date: Mon Sep 5 22:38:05 2011 +0200 + + xpdf303: Set endOfLine to true if code1 is 1 + + poppler/Stream.cc | 1 + + 1 file changed, 1 insertion(+) + +commit a654a77e26a6c7d76c318636303f8c636a3d2495 +Author: Albert Astals Cid +Date: Mon Sep 5 22:36:58 2011 +0200 + + xpdf303: Tweaks to CCITTFaxStream::lookChar + + poppler/Stream.cc | 55 + +++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 43 insertions(+), 12 deletions(-) + +commit abdf828449cd543e66f326ba862efcb3ca6d342d +Author: Albert Astals Cid +Date: Mon Sep 5 22:19:30 2011 +0200 + + xpdf303: Remove cygwin workaround + + poppler/Stream.cc | 4 ---- + 1 file changed, 4 deletions(-) + +commit 05ef4227d09381e3a9e8050e447770f44d532386 +Author: Albert Astals Cid +Date: Mon Sep 5 22:18:33 2011 +0200 + + xpdf303: Return false if getLine fails + + poppler/Stream.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c2d6158bd56328754d77ab8f1bf84d46e6ede773 +Author: Albert Astals Cid +Date: Mon Sep 5 22:14:39 2011 +0200 + + xpdf303: Return NULL if size < 0 + + poppler/Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 04947e1dca858b890302a5a1005b84b34255d670 +Author: Albert Astals Cid +Date: Mon Sep 5 22:11:24 2011 +0200 + + xpdf303: Add -rawdates and print Form information + + utils/pdfinfo.cc | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +commit 9529e776e53e71069ba4215cdb8b84592d37b555 +Author: Carlos Garcia Campos +Date: Mon Sep 5 21:19:58 2011 +0200 + + xpdf303: Other fixes in PostScriptFunction + + poppler/Function.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 071f983f461ba0b872dd93d7f1a24d325312799d +Author: Carlos Garcia Campos +Date: Mon Sep 5 21:19:13 2011 +0200 + + xpdf303: Fixed a bug in the PostScript-type function parser + + Real numbers that start with a decimal point weren't being handled + correctly. + + poppler/Function.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit da0eff1aaa31c2bf357a64b6275645100c9629d4 +Author: Carlos Garcia Campos +Date: Mon Sep 5 21:12:02 2011 +0200 + + xpdf303: Fixes in StitchingFunction + + poppler/Function.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit b655316706ec394fa6c8ad076d9d9d96ac8ed563 +Author: Albert Astals Cid +Date: Mon Sep 5 21:05:55 2011 +0200 + + xpdf303: Rework LinkURI decoding + + poppler/Link.cc | 35 +++++++++++++++++++---------------- + 1 file changed, 19 insertions(+), 16 deletions(-) + +commit abad9b4e44d81a206bccff8a109ceb9a7effa2ad +Author: Carlos Garcia Campos +Date: Mon Sep 5 21:00:31 2011 +0200 + + xpdf303: Cache the last transform for PostScript-type functions + + poppler/Function.cc | 37 ++++++++++++++++++++++++++++++++++--- + poppler/Function.h | 2 ++ + 2 files changed, 36 insertions(+), 3 deletions(-) + +commit e1c6b4c6e6df0854b040c9af9ef2d3f6789e24b2 +Author: Albert Astals Cid +Date: Mon Sep 5 21:02:31 2011 +0200 + + xpdf303: Only call getNum if isNum + + poppler/Link.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit e5661e1a08c38d4c8d69976a8c1c02c1102bc88c +Author: Carlos Garcia Campos +Date: Mon Sep 5 20:49:13 2011 +0200 + + Optimize SampledFunction + + Pull index computation code out of the transform function; cache the + last transform. + + poppler/Function.cc | 87 + ++++++++++++++++++++++++++++++++++++++++++--------- + poppler/Function.h | 4 ++- + 2 files changed, 75 insertions(+), 16 deletions(-) + +commit b36d150931cd555b84ee996d505e8b91e2afde19 +Author: Albert Astals Cid +Date: Mon Sep 5 20:52:05 2011 +0200 + + xpdf303: Take xpdf way of handling bug 6500 + + poppler/JBIG2Stream.cc | 91 + +++++++++++++++++++++++++++--------------------- + poppler/JBIG2Stream.h | 1 + + 2 files changed, 52 insertions(+), 40 deletions(-) + +commit 065565a67c7826b64d89fac9719049d0a57da721 +Author: Albert Astals Cid +Date: Mon Sep 5 20:39:50 2011 +0200 + + xpdf303: Merge ¿speed? improvements in JBIG2Stream::readGenericBitmap + + poppler/JBIG2Stream.cc | 586 + ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 471 insertions(+), 115 deletions(-) + +commit 28adb3884dafcf1d36aae1ec05855b10b22aa4ae +Author: Albert Astals Cid +Date: Mon Sep 5 20:26:57 2011 +0200 + + xpdf303: Change bpp calculation + + poppler/JBIG2Stream.cc | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit c163a82f45d869b7c35a1a7141ab237507671f82 +Author: Albert Astals Cid +Date: Mon Sep 5 20:25:04 2011 +0200 + + xpdf303: Change symCodeLen calculation + + poppler/JBIG2Stream.cc | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit 1d1a985101c26f90bde8340dcfae3d6a1e0a08ba +Author: Albert Astals Cid +Date: Mon Sep 5 20:20:03 2011 +0200 + + xpdf303: symCodeLen calculation fix + + poppler/JBIG2Stream.cc | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 5c0274572c65972434293a30f3ba5afd3905005f +Author: Albert Astals Cid +Date: Mon Sep 5 20:07:54 2011 +0200 + + xpdf303: add line accessor + + poppler/JBIG2Stream.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 7b77a264b5c21ba693677b1249a2122743e4e395 +Author: Albert Astals Cid +Date: Mon Sep 5 19:46:16 2011 +0200 + + xpdf303: segments with unspecified length + + poppler/JBIG2Stream.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 23066e8e8309babd61ade9f50ef7d82c9e275055 +Author: Albert Astals Cid +Date: Mon Sep 5 19:41:16 2011 +0200 + + xpdf303: More EOF detection + + poppler/JBIG2Stream.cc | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit bc6eded798d6e5dc7a58f88afbe4ab2904698db5 +Author: Albert Astals Cid +Date: Mon Sep 5 19:38:29 2011 +0200 + + xpdf303: Comment++ + + poppler/JBIG2Stream.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit adb98856a745340b4ffb34ffd2ed701600cfc82f +Author: Albert Astals Cid +Date: Mon Sep 5 19:38:02 2011 +0200 + + xpdf303: Exit loop in case of EOF + + poppler/JBIG2Stream.cc | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 112154567ebcab63959294533b00075d6ca6ea65 +Author: Albert Astals Cid +Date: Mon Sep 5 19:33:27 2011 +0200 + + xpdf303: Initialize to NULL + + poppler/JBIG2Stream.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit b9ecfdf4cb27a19e65817af51c048e8030825035 +Author: Albert Astals Cid +Date: Mon Sep 5 19:27:36 2011 +0200 + + xpdf303: Delay memory allocation up to when it is really needed + + poppler/CMap.cc | 58 + ++++++++----------------------------------------------- + poppler/CMap.h | 2 -- + 2 files changed, 8 insertions(+), 52 deletions(-) + +commit 7af7b4b2d1941ee9dcd575535d4fc31f29026d8d +Author: Carlos Garcia Campos +Date: Mon Sep 5 19:05:31 2011 +0200 + + xpdf303: Rework initialization of appearance state + + Merged a slightly different patch, adding an error when the AS + entry is + missing and the AP contains one or more subdictionaries. + + poppler/Annot.cc | 62 + ++++++++++++++++++++++++++++++------------------------ + 1 file changed, 34 insertions(+), 28 deletions(-) + +commit f7d307b818bca9553a05b5d43deb429abbf04824 +Author: Carlos Garcia Campos +Date: Sun Sep 4 13:56:35 2011 +0200 + + xpdf303: Rewrote the code that handles annotation transforms + + It was not handling non-rectangular transforms correctly. + + poppler/Gfx.cc | 143 + +++++++++++++++++++++++++++++--------------------------- + 1 file changed, 75 insertions(+), 68 deletions(-) + +commit 4609f9feeca22620c6e143962a3717784a843a68 +Author: Carlos Garcia Campos +Date: Sun Sep 4 13:09:50 2011 +0200 + + xpdf303: Implement rotation in the form field appearance regeneration + + poppler/Annot.cc | 51 + ++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 38 insertions(+), 13 deletions(-) + +commit ca7d77a27e2f3a692842968f08dcb9fa5379bf0f +Author: Carlos Garcia Campos +Date: Sun Sep 4 11:53:40 2011 +0200 + + Create forms with a PDFDoc instead of XRef too + + poppler/Form.cc | 79 + ++++++++++++++++++++++++++++--------------------------- + poppler/Form.h | 28 +++++++++++--------- + 2 files changed, 55 insertions(+), 52 deletions(-) + +commit ec52e46e309a0307fdf12113a1b7d41a760f9d6c +Author: Carlos Garcia Campos +Date: Sun Sep 4 11:32:38 2011 +0200 + + xpdf303: Create annots with a doc instead of xref + catalog + + glib/poppler-action.cc | 2 +- + glib/poppler-annot.cc | 4 +- + poppler/Annot.cc | 364 + ++++++++++++++++++++++++------------------------ + poppler/Annot.h | 128 ++++++++--------- + poppler/Catalog.cc | 9 +- + poppler/Form.cc | 22 +-- + poppler/Form.h | 11 +- + poppler/PSOutputDev.cc | 2 +- + poppler/Page.cc | 2 +- + 9 files changed, 274 insertions(+), 270 deletions(-) + +commit ce5e620f07e984927610866467705bb526f9ad8d +Author: Carlos Garcia Campos +Date: Sat Sep 3 11:05:42 2011 +0200 + + xpdf303: Handle the case where sid < 0 + + fofi/FoFiType1C.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 9d77f999de973f3c547245bca0568f8984faa5d7 +Author: Carlos Garcia Campos +Date: Sat Sep 3 11:02:55 2011 +0200 + + xpdf303: Initialize nFDs in FoFiType1C::parse() + + fofi/FoFiType1C.cc | 1 + + 1 file changed, 1 insertion(+) + +commit d9594c95713ac79b46e313ecf2875196ea076ef4 +Author: Carlos Garcia Campos +Date: Sat Sep 3 11:01:28 2011 +0200 + + xpdf303: Check whether fdSelect is NULL before using it + + fofi/FoFiType1C.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 4e4a8ec52c5662e21036f219636a39fc97a32353 +Author: Carlos Garcia Campos +Date: Sat Sep 3 10:52:14 2011 +0200 + + xpdf303: Add writePSString() helper function to FoFiType1C + + fofi/FoFiType1C.cc | 68 + ++++++++++++++++++++++++++++++++++++++-------------- + fofi/FoFiType1C.h | 1 + + 2 files changed, 51 insertions(+), 18 deletions(-) + +commit ff03811db1ef833df4bab12fe3bf3a8c1534c174 +Author: Carlos Garcia Campos +Date: Sat Sep 3 10:40:15 2011 +0200 + + xpdf303: More checks in GooString + + goo/GooString.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 0029efbe2a8a97ff34353f8028ac649b2fd07013 +Author: Carlos Garcia Campos +Date: Sat Sep 3 10:32:14 2011 +0200 + + xpdf303: Use a double instead of an int with a cast + + goo/GooString.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 419ee8c30ba0df02e9f0281b321fbe38387e5a21 +Author: Carlos Garcia Campos +Date: Fri Sep 2 18:44:04 2011 +0200 + + xpdf303: Add more formats to GooString + + goo/GooString.cc | 102 + +++++++++++++++++++++++++++++++++++++++++++++++++----- + goo/GooString.h | 21 +++++++++-- + 2 files changed, 111 insertions(+), 12 deletions(-) + +commit 738a6954da01fd3fc8c1cd5baa49fc7b8c959169 +Author: Carlos Garcia Campos +Date: Fri Sep 2 18:24:04 2011 +0200 + + xpdf303: Add getGlyphName() to FoFiType1C + + fofi/FoFiType1C.cc | 12 ++++++++++++ + fofi/FoFiType1C.h | 4 ++++ + 2 files changed, 16 insertions(+) + +commit 39b77a193996b0916690a246f4a9874dad596b2f +Author: Carlos Garcia Campos +Date: Fri Sep 2 18:17:51 2011 +0200 + + xpdf303: Improvements in FoFiType1 parser + + fofi/FoFiType1.cc | 75 + +++++++++++++++++++++++++---------------------------- + 1 file changed, 35 insertions(+), 40 deletions(-) + +commit 44dbb28a07125f92a0835aea7ad3403310bc451d +Author: Carlos Garcia Campos +Date: Fri Sep 2 18:08:39 2011 +0200 + + xpdf303: Handle PFB headers in Type 1 font files + + fofi/FoFiType1.cc | 36 ++++++++++++++++++++++++++++++++++++ + fofi/FoFiType1.h | 1 + + 2 files changed, 37 insertions(+) + +commit 9531a52b227a994ab8e0d66aeaff2b21358ca73e +Author: Carlos Garcia Campos +Date: Fri Sep 2 18:01:35 2011 +0200 + + xpdf303: New signature of methods convertToCIDType0() and + convertToType0() + + fofi/FoFiTrueType.cc | 8 ++--- + fofi/FoFiTrueType.h | 4 +-- + fofi/FoFiType1C.cc | 84 + ++++++++++++++++++++++++++++++++++-------------- + fofi/FoFiType1C.h | 19 ++++++++--- + poppler/PSOutputDev.cc | 13 ++++++-- + 5 files changed, 91 insertions(+), 37 deletions(-) + +commit 830d2b40770333489a08f23a3b16a372770a8d19 +Author: Albert Astals Cid +Date: Thu Sep 1 23:23:57 2011 +0200 + + xpdf303: Use openFile + + poppler/CharCodeToUnicode.cc | 4 ++-- + poppler/GlobalParams.cc | 10 +++++----- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit ddf9d6e35b40b902519cbaa8cb664ba6dfdfd510 +Author: Albert Astals Cid +Date: Thu Sep 1 23:21:26 2011 +0200 + + xpdf303: openFile + minor fixes for openTempFile in Windows + + goo/gfile.cc | 108 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + goo/gfile.h | 13 +++++++ + 2 files changed, 118 insertions(+), 3 deletions(-) + +commit 68e8fa9ff4f13b6703148b3eb6ea628418211243 +Author: Albert Astals Cid +Date: Thu Sep 1 23:17:59 2011 +0200 + + xpdf303: make gcc happy + + fofi/FoFiType1C.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 876021b1aa16ad38767a91e1be31c392f368fde2 +Author: Carlos Garcia Campos +Date: Thu Sep 1 19:07:01 2011 +0200 + + xpdf303: Add getFontMatrix() + + fofi/FoFiTrueType.cc | 76 + ++++++++++++++++++++++++++++++-------------------- + fofi/FoFiTrueType.h | 9 ++++++ + fofi/FoFiType1.cc | 37 ++++++++++++++++++++++++ + fofi/FoFiType1.h | 4 +++ + fofi/FoFiType1C.cc | 29 +++++++++++++++++++ + fofi/FoFiType1C.h | 3 ++ + 6 files changed, 127 insertions(+), 31 deletions(-) + +commit 1369862ed61ef8b0f81c52fce36f6c1602d82ddb +Author: Carlos Garcia Campos +Date: Thu Sep 1 18:27:51 2011 +0200 + + xpdf303: Ignore entries that have an invalid tag too + + fofi/FoFiTrueType.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 0fe7cc82e84dc2a3b79248b111656e5e7df9fdc2 +Author: Carlos Garcia Campos +Date: Thu Sep 1 18:21:33 2011 +0200 + + xpdf303: Update cmap, name, post and os2 tables in FoFiTrueType + + fofi/FoFiTrueType.cc | 29 ++++++++++++++++------------- + 1 file changed, 16 insertions(+), 13 deletions(-) + +commit 0feebf5f3c9da8d7a1154456a00492a623340cec +Author: Carlos Garcia Campos +Date: Thu Sep 1 18:16:59 2011 +0200 + + xpdf303: Ignore any bogus entries in the table directory + + It's a different approach to fix the same issue we had already fixed, + added just to make future merge easier. We were also reallocating the + tables array, I've kept that but doing it only when the size actually + changes. + + fofi/FoFiTrueType.cc | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit 68c6ebc78b89eec94a9c3538fe6e27561a21b680 +Author: Carlos Garcia Campos +Date: Thu Sep 1 17:49:46 2011 +0200 + + xpdf303: codeToGID items can be < 0 now + + fofi/FoFiTrueType.cc | 12 ++++++++++-- + poppler/PSOutputDev.cc | 2 +- + splash/SplashFTFont.cc | 2 +- + 3 files changed, 12 insertions(+), 4 deletions(-) + +commit 19204ed5cd5cb64809f1a1f51dd5ffdef2b9417a +Author: Albert Astals Cid +Date: Thu Sep 1 17:28:39 2011 +0200 + + xpdf303: CMap::getCID signature change + + poppler/CMap.cc | 47 +++++++++++++++++++++++++++++++---------------- + poppler/CMap.h | 8 +++++--- + poppler/GfxFont.cc | 6 ++++-- + 3 files changed, 40 insertions(+), 21 deletions(-) + +commit 9c74bef77e7e1d7a8464dff43cae16bb1206665e +Author: Albert Astals Cid +Date: Thu Sep 1 17:04:04 2011 +0200 + + xpdf303: Use splashDist instead of splashSqrt + + splash/SplashT1Font.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0568d0dc3c42b68b715226e5ce0ff98d73a94ac7 +Author: Albert Astals Cid +Date: Thu Sep 1 17:01:30 2011 +0200 + + xpdf303: Do the multiplication the other way around + + No idea why :-D + + splash/SplashFTFont.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3c0da502aa1d5b1acae01cf1e43fb96f5ecc11da +Author: Albert Astals Cid +Date: Thu Sep 1 17:00:31 2011 +0200 + + xpdf303: Use splashCheckDet isntead of splashAbs + + splash/SplashFontEngine.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2b4303c66f8de9a267413465898897fd6b0ebb17 +Author: Albert Astals Cid +Date: Thu Sep 1 16:51:53 2011 +0200 + + xpdf303: Bigger fileKey + + poppler/XRef.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53060857e31a01413936fbe33b7032a0a325b384 +Author: Albert Astals Cid +Date: Thu Sep 1 16:50:08 2011 +0200 + + xpdf303: Merge JArithmeticDecoder.* + + poppler/JArithmeticDecoder.cc | 47 + +++++++++++++++++++++++++++++++++++------ + poppler/JArithmeticDecoder.h | 4 ++++ + 2 files changed, 44 insertions(+), 7 deletions(-) + +commit 0722960b4cf4ce40b6bd278ac7287d64a1d70bf2 +Author: Albert Astals Cid +Date: Thu Sep 1 16:48:31 2011 +0200 + + xpdf303: Do not crash if imgStr->getLine() is NULL + + utils/ImageOutputDev.cc | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit f848edab849910b8291c7974e484ef5d02b2234c +Author: Albert Astals Cid +Date: Thu Sep 1 16:42:30 2011 +0200 + + xpdf303: Do not extract the million tiles of a pattern + + utils/ImageOutputDev.cc | 9 +++++++++ + utils/ImageOutputDev.h | 12 ++++++++++++ + 2 files changed, 21 insertions(+) + +commit 01adb7ef6a524d7313a45e7c5f441da4fd0250bd +Author: Albert Astals Cid +Date: Thu Sep 1 16:31:50 2011 +0200 + + xpdf303: Assembler for some functions + + splash/SplashMath.h | 110 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 110 insertions(+) + +commit 4f87a3163f133565e8774ef416e67d05f906723d +Author: Albert Astals Cid +Date: Thu Sep 1 16:25:19 2011 +0200 + + xpdf303: Add splashAvg + + splash/SplashMath.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 64cf42f89939763d105be4948a20e9ecb81a64c1 +Author: Albert Astals Cid +Date: Thu Sep 1 16:23:08 2011 +0200 + + xpdf303: Add getters to SplashClip + + splash/SplashClip.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 28c6a55742f55a719ef63b8e0eff7c242653cf36 +Author: Albert Astals Cid +Date: Thu Sep 1 16:17:56 2011 +0200 + + xpdf303: unneeded forward declare + + poppler/Page.h | 1 - + 1 file changed, 1 deletion(-) + +commit 38ebe8c568aafbe5f248f9e0a654f46829e0b659 +Author: Albert Astals Cid +Date: Thu Sep 1 16:13:53 2011 +0200 + + xpdf303: Page functions do not need Catalog * anymore + + glib/poppler-document.cc | 2 +- + glib/poppler-page.cc | 11 ++++----- + poppler/FontInfo.cc | 2 +- + poppler/OutputDev.h | 4 ++-- + poppler/PDFDoc.cc | 8 +++---- + poppler/PSOutputDev.cc | 6 ++--- + poppler/PSOutputDev.h | 2 +- + poppler/Page.cc | 36 + +++++++++++++++--------------- + poppler/Page.h | 16 ++++++------- + poppler/TextOutputDev.cc | 2 +- + poppler/TextOutputDev.h | 2 +- + qt4/src/poppler-link-extractor-private.h | 2 +- + qt4/src/poppler-link-extractor.cc | 4 ++-- + qt4/src/poppler-page.cc | 4 ++-- + utils/HtmlOutputDev.cc | 9 ++++---- + utils/HtmlOutputDev.h | 7 +++--- + utils/pdftohtml.cc | 2 +- + 17 files changed, 58 insertions(+), 61 deletions(-) + +commit 7d794f6411499fb8f26778bf2b54cb9734d004af +Author: Albert Astals Cid +Date: Thu Sep 1 15:47:32 2011 +0200 + + xpdf303: API rework, Gfx wants a PDFDoc instead of an XRef + + cpp/poppler-page-renderer.cpp | 2 +- + glib/poppler-document.cc | 2 +- + glib/poppler-page.cc | 2 -- + poppler/CairoFontEngine.cc | 28 ++++++++++++---------------- + poppler/CairoFontEngine.h | 13 ++++++------- + poppler/CairoOutputDev.cc | 12 +++++------- + poppler/CairoOutputDev.h | 6 +++--- + poppler/Catalog.cc | 8 +++++--- + poppler/Catalog.h | 4 +++- + poppler/Gfx.cc | 15 +++++++++------ + poppler/Gfx.h | 6 ++++-- + poppler/PDFDoc.cc | 6 +++--- + poppler/PSOutputDev.cc | 29 +++++++++++++++-------------- + poppler/PSOutputDev.h | 9 ++++----- + poppler/Page.cc | 8 +++++--- + poppler/Page.h | 4 +++- + poppler/PreScanOutputDev.cc | 6 +++--- + poppler/PreScanOutputDev.h | 4 ++-- + poppler/SplashOutputDev.cc | 13 +++++++------ + poppler/SplashOutputDev.h | 5 +++-- + qt4/src/poppler-private.h | 2 +- + qt4/src/poppler-ps-converter.cc | 2 -- + test/gtk-test.cc | 2 +- + test/pdf-inspector.cc | 2 +- + test/perf-test.cc | 2 +- + utils/pdftocairo.cc | 2 +- + utils/pdftohtml.cc | 6 +++--- + utils/pdftoppm.cc | 2 +- + utils/pdftops.cc | 4 ++-- + 29 files changed, 105 insertions(+), 101 deletions(-) + +commit 52fb80a7b3f98eb8322a7ba84e2900f044b3a18a +Author: Albert Astals Cid +Date: Thu Sep 1 13:27:01 2011 +0200 + + xpdf303: compile++ + + poppler/ArthurOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 37ca8dc4215693ec657d165ebdb6c315a0ae92c9 +Author: Carlos Garcia Campos +Date: Thu Sep 1 12:34:32 2011 +0200 + + xpdf303: Use int instead of Gushort for gid/cid maps + + fofi/FoFiTrueType.cc | 18 +++++++++--------- + fofi/FoFiTrueType.h | 14 +++++++------- + fofi/FoFiType1C.cc | 8 ++++---- + fofi/FoFiType1C.h | 2 +- + poppler/CairoFontEngine.cc | 22 +++++++++++----------- + poppler/CairoFontEngine.h | 8 ++++---- + poppler/GfxFont.cc | 22 +++++++++++----------- + poppler/GfxFont.h | 10 +++++----- + poppler/PSOutputDev.cc | 14 +++++++------- + poppler/SplashOutputDev.cc | 6 +++--- + splash/SplashFTFontEngine.cc | 6 +++--- + splash/SplashFTFontEngine.h | 2 +- + splash/SplashFTFontFile.cc | 12 ++++++------ + splash/SplashFTFontFile.h | 8 ++++---- + splash/SplashFontEngine.cc | 2 +- + splash/SplashFontEngine.h | 2 +- + 16 files changed, 78 insertions(+), 78 deletions(-) + +commit df942e25bff9b014bde0ff69c8a01fa3c1963015 +Author: Albert Astals Cid +Date: Thu Sep 1 01:08:10 2011 +0200 + + xpdf303: More parsing flexibility + + poppler/CharCodeToUnicode.cc | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +commit 5305dfc5702e8004e5ae35697c6aebd0b1a5c96e +Author: Albert Astals Cid +Date: Thu Sep 1 01:05:02 2011 +0200 + + xpdf303: Make sure codes are inside the range + + poppler/CharCodeToUnicode.cc | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 45212483572c68abd612b5c62b21cbb545e10143 +Author: Albert Astals Cid +Date: Thu Sep 1 01:01:13 2011 +0200 + + xpdf303: change mapLen growing stragegy + + poppler/CharCodeToUnicode.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 75d70f190e97f69047cdbe97a872a936788392d9 +Author: Albert Astals Cid +Date: Thu Sep 1 01:00:23 2011 +0200 + + xpdf303: Limit code to 0xffffff + + poppler/CharCodeToUnicode.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit b4180a187f9246b6390df112e5536ead9ef9bcbe +Author: Albert Astals Cid +Date: Thu Sep 1 00:59:09 2011 +0200 + + xpdf303: Use parseHex instead of sscanf + + poppler/CharCodeToUnicode.cc | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit 121f648f233adcdc631c7e29d67b60baa922e29a +Author: Albert Astals Cid +Date: Thu Sep 1 00:28:40 2011 +0200 + + Add helper parseHex function + + poppler/CharCodeToUnicode.cc | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit be0436ace671070bab4304efee607f40c959bc55 +Author: Albert Astals Cid +Date: Thu Sep 1 00:26:57 2011 +0200 + + xpdf303: CharCodeToUnicode::makeIdentityMapping & friends + + poppler/CharCodeToUnicode.cc | 25 +++++++++++++++++++++++++ + poppler/CharCodeToUnicode.h | 4 ++++ + 2 files changed, 29 insertions(+) + +commit 5dd94447b14db1894f06ad0590187dae7575e33a +Author: Albert Astals Cid +Date: Thu Sep 1 00:15:59 2011 +0200 + + xpdf303: Remove unused constructor + + splash/SplashXPath.cc | 5 ----- + splash/SplashXPath.h | 1 - + 2 files changed, 6 deletions(-) + +commit d00d56e4a46e8534378534de0d94ce0551d75d84 +Author: Albert Astals Cid +Date: Thu Sep 1 00:11:49 2011 +0200 + + xpdf303: Speedup SplashScreen + + By using << instead of * and by putting some functions on the header + so they can be inlined + + splash/SplashScreen.cc | 89 + ++++++++++++++++-------------------------------- + splash/SplashScreen.h | 14 ++++++-- + 2 files changed, 42 insertions(+), 61 deletions(-) + +commit 5e8debf96ab1bb9db31a0332a482d08c181d52ea +Author: Albert Astals Cid +Date: Wed Aug 31 23:56:52 2011 +0200 + + xpdf303: Add splashCheckDet helper + + splash/SplashMath.h | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 4cef5a52b33b1afba28d890bbe48000b734ac357 +Author: Albert Astals Cid +Date: Wed Aug 31 21:09:50 2011 +0200 + + xpdf303: Protect against NULL from lexer->getStream() + + poppler/Parser.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 2547ec60db6d954e5c8318e30fcc54f70bcfa95c +Author: Albert Astals Cid +Date: Wed Aug 31 21:05:11 2011 +0200 + + xpdf303: Add GBool force = gFalse to SplashPath::close + + splash/SplashPath.cc | 5 +++-- + splash/SplashPath.h | 6 ++++-- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 9370f9640a24c7b944f3da7c10e070a960bdd8f9 +Author: Albert Astals Cid +Date: Wed Aug 31 21:01:32 2011 +0200 + + xpdf303: Add guards to the header + + poppler/Stream-CCITT.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ab9dea663a4df5af8f54c1ff5149254adfd72ce9 +Author: Albert Astals Cid +Date: Wed Aug 31 20:34:17 2011 +0200 + + xpdf303: Add SplashBitmap::writeAlphaPGMFile and + SplashBitmap::takeData + + splash/SplashBitmap.cc | 22 ++++++++++++++++++++++ + splash/SplashBitmap.h | 6 ++++++ + 2 files changed, 28 insertions(+) + +commit 6558d735c65a3dca9b9e16de5588c8b8c482f04f +Author: Albert Astals Cid +Date: Wed Aug 31 20:30:27 2011 +0200 + + xpdf303: Write faster + + splash/SplashBitmap.cc | 14 ++------------ + 1 file changed, 2 insertions(+), 12 deletions(-) + +commit a9b26d9c35fccc7b46a96acdb2064a9976bd49bd +Author: Albert Astals Cid +Date: Wed Aug 31 20:29:58 2011 +0200 + + xpdf303: Only free data if there is data to free + + splash/SplashBitmap.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 8f6e0285d7e80d8c1a8defaad9d0f87a2e054151 +Author: Albert Astals Cid +Date: Wed Aug 31 20:20:47 2011 +0200 + + xpdf303: PDFDocEncoding changes + + This overwrites Michael Vrable's changes of using U+FFFD to actually + using the order, i'm taking Derek's change here + + poppler/PDFDocEncoding.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9c8f30fb4a2a0dd2cf359610e33749e1682921c7 +Author: Albert Astals Cid +Date: Wed Aug 31 20:17:38 2011 +0200 + + xpdf303: comment changes + + poppler/Link.h | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit b78046057657b44c5cc9353d9e3dde356eb7fcbd +Author: Albert Astals Cid +Date: Wed Aug 31 19:32:03 2011 +0200 + + xpdf303: Introduce unicodeTypeNum and unicodeTypeAlphaNum + + poppler/UnicodeTypeTable.cc | 11 +++++++++++ + poppler/UnicodeTypeTable.h | 4 ++++ + 2 files changed, 15 insertions(+) + +commit 0ec4b390ddb7fa7d028b8f0515ecd3e61c488c9f +Author: Albert Astals Cid +Date: Wed Aug 31 19:30:55 2011 +0200 + + xpdf303: UnicodeTypeTable tables changes + + poppler/UnicodeTypeTable.cc | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit f331c009f94703d6007fce9570ee19c6e4822339 +Author: Albert Astals Cid +Date: Wed Aug 31 19:20:12 2011 +0200 + + xpdf303: Remove warning() from Error.h + + poppler/CairoOutputDev.cc | 6 +++--- + poppler/Error.cc | 7 ------- + poppler/Error.h | 1 - + 3 files changed, 3 insertions(+), 11 deletions(-) + +commit 53f94df2ce21793914ccc153ba6b2fe5cbeb8371 +Author: Albert Astals Cid +Date: Wed Aug 31 19:17:13 2011 +0200 + + Port to setErrorCallback + + cpp/poppler-document.cpp | 2 +- + cpp/poppler-private.cpp | 6 ++---- + cpp/poppler-private.h | 3 ++- + qt4/src/poppler-private.cc | 8 +++----- + test/perf-test.cc | 4 ++-- + 5 files changed, 10 insertions(+), 13 deletions(-) + +commit 95a52f06a98f49f7c8f2b92634b75af96b4eee1d +Author: Albert Astals Cid +Date: Wed Aug 31 19:07:22 2011 +0200 + + xpdf303: Forgot this when doing the char * -> const char * + + poppler/JPXStream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 00549400f155d8e36b4ac718603fc945858fe50d +Author: Albert Astals Cid +Date: Wed Aug 31 19:04:14 2011 +0200 + + xpdf303: error() changes, new param and formatting + + fofi/FoFiBase.cc | 8 +-- + fofi/FoFiTrueType.cc | 2 +- + fofi/FoFiType1.cc | 4 +- + goo/JpegWriter.cc | 2 +- + goo/PNGWriter.cc | 16 ++--- + poppler/Annot.cc | 40 +++++------ + poppler/ArthurOutputDev.cc | 16 ++--- + poppler/CMap.cc | 26 +++---- + poppler/CachedFile.cc | 2 +- + poppler/CairoFontEngine.cc | 10 +-- + poppler/Catalog.cc | 50 ++++++------- + poppler/CharCodeToUnicode.cc | 54 +++++++------- + poppler/CurlCachedFile.cc | 2 +- + poppler/DCTStream.cc | 2 +- + poppler/Decrypt.cc | 2 +- + poppler/Error.cc | 55 +++++++++----- + poppler/Error.h | 23 +++++- + poppler/FileSpec.cc | 8 +-- + poppler/Form.cc | 44 ++++++------ + poppler/Function.cc | 107 ++++++++++++++------------- + poppler/Gfx.cc | 161 + ++++++++++++++++++++--------------------- + poppler/GfxFont.cc | 102 +++++++++++++------------- + poppler/GfxState.cc | 128 ++++++++++++++++----------------- + poppler/GfxState.h | 8 +-- + poppler/GlobalParams.cc | 38 +++++----- + poppler/GlobalParamsWin.cc | 4 +- + poppler/Hints.cc | 22 +++--- + poppler/JBIG2Stream.cc | 88 +++++++++++------------ + poppler/JPEG2000Stream.cc | 10 +-- + poppler/JPXStream.cc | 164 + +++++++++++++++++++++--------------------- + poppler/Lexer.cc | 24 +++---- + poppler/Linearization.cc | 20 +++--- + poppler/Link.cc | 77 ++++++++++---------- + poppler/Movie.cc | 2 +- + poppler/Object.h | 8 +-- + poppler/OptionalContent.cc | 14 ++-- + poppler/PDFDoc.cc | 43 ++++++----- + poppler/PDFDocFactory.cc | 2 +- + poppler/PSOutputDev.cc | 45 ++++++------ + poppler/Page.cc | 12 ++-- + poppler/Parser.cc | 10 +-- + poppler/Rendition.cc | 6 +- + poppler/SecurityHandler.cc | 12 ++-- + poppler/SplashOutputDev.cc | 28 ++++---- + poppler/Stream.cc | 116 +++++++++++++++++------------- + poppler/TextOutputDev.cc | 2 +- + poppler/UnicodeMap.cc | 15 ++-- + poppler/XRef.cc | 32 ++++----- + splash/Splash.cc | 2 +- + splash/SplashBitmap.cc | 6 +- + test/perf-test.cc | 4 +- + utils/HtmlOutputDev.cc | 18 ++--- + utils/ImageOutputDev.cc | 10 +-- + utils/pdfextract.cc | 4 +- + utils/pdfimages.cc | 2 +- + utils/pdfinfo.cc | 6 +- + utils/pdfmerge.cc | 6 +- + utils/pdftocairo.cc | 6 +- + utils/pdftohtml.cc | 6 +- + utils/pdftops.cc | 6 +- + utils/pdftotext.cc | 12 ++-- + 61 files changed, 912 insertions(+), 842 deletions(-) + +commit cd0764921064bfd455e9df52dc9bda6fbd2c2db2 +Author: Carlos Garcia Campos +Date: Wed Aug 31 17:23:28 2011 +0200 + + xpdf303: Always define at least 256 glyphs for Type 0 fonts + + fofi/FoFiTrueType.cc | 41 ++++++++++++++++++++++++++++++++++------- + fofi/FoFiTrueType.h | 3 ++- + 2 files changed, 36 insertions(+), 8 deletions(-) + +commit 4d4318e258fb68704b1a51a14fa89134606e2aa7 +Author: Carlos Garcia Campos +Date: Wed Aug 31 17:07:25 2011 +0200 + + xpdf303: Different growing strategy for vmtxTab in FoFiTrueType + + fofi/FoFiTrueType.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c8c7fcef9bc8f802be2d376c9d2099971f159317 +Author: Carlos Garcia Campos +Date: Wed Aug 31 17:05:16 2011 +0200 + + xpdf303: Fix memory leak in FoFiTrueType + + fofi/FoFiTrueType.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 655b1a97db5449c009e5b63fc7c12233e6fae450 +Author: Carlos Garcia Campos +Date: Wed Aug 31 16:54:05 2011 +0200 + + xpdf303: Check for an invalid loca format field in the head table + in FoFiTrueType + + fofi/FoFiTrueType.cc | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 9710ab96f1cf26394cc473952a3331d60c149451 +Author: Carlos Garcia Campos +Date: Wed Aug 31 16:49:54 2011 +0200 + + Fix the build + + fofi/FoFiIdentifier.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36b733a3165fd26aa8c25ba57faa5d2277aa31ec +Author: Carlos Garcia Campos +Date: Tue Aug 30 16:31:52 2011 +0200 + + xpdf303: Handle bogus loca table entries in FoFiTrueType + + where the offset is past the end of the glyf table. This part was + missing in previous commit. + + fofi/FoFiTrueType.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit a288bdb417582f07a5a0cb13d5218946a1d0ccc8 +Author: Albert Astals Cid +Date: Tue Aug 30 21:55:43 2011 +0200 + + xpdf303: Increase max keyLength to 32 + + poppler/XRef.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 12e0acd9d393df76e297bb3fde323092c428be21 +Author: Albert Astals Cid +Date: Tue Aug 30 21:03:05 2011 +0200 + + xpdf303: GfxXXXpath different growing strategy + + poppler/GfxState.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 7c5e496715f56498fb1aa08371d2b8d4d0e73d25 +Author: Albert Astals Cid +Date: Tue Aug 30 20:59:36 2011 +0200 + + xpdf303: No need for 4 Guint when 1 is enough + + poppler/GfxState.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e7e8082901e108130d5c98cc7648f143978c9562 +Author: Albert Astals Cid +Date: Tue Aug 30 20:50:17 2011 +0200 + + xpdf303: GooList::copy, GooList::reverse and GooList::put + + goo/GooList.cc | 22 ++++++++++++++++++++++ + goo/GooList.h | 10 ++++++++++ + 2 files changed, 32 insertions(+) + +commit 8a119cf205467c20269e7beffde9497ffd277c15 +Author: Albert Astals Cid +Date: Tue Aug 30 20:48:40 2011 +0200 + + xpdf303: Inserting with a negative i means prepending + + goo/GooList.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 95142a8e63e476324e368785001a23d4f1d462b9 +Author: Albert Astals Cid +Date: Tue Aug 30 20:47:12 2011 +0200 + + xpdf303: If size is 0 reserve 8 anyway + + goo/GooList.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bd1076da03f76fb62998a9409d366412f4aa5d13 +Author: Albert Astals Cid +Date: Tue Aug 30 20:45:36 2011 +0200 + + xpdf303: Complain for gmalloc and grealloc < 0 + + goo/gmem.cc | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +commit 5a42b3693a9e501a27d790d4aeafcb68f63cb950 +Author: Albert Astals Cid +Date: Tue Aug 30 20:38:39 2011 +0200 + + xpdf303: Honor the deleteKeys setting + + goo/GooHash.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit d584b54eff52c47f983947b2aff0967dfed0ccf9 +Author: Albert Astals Cid +Date: Tue Aug 30 20:36:03 2011 +0200 + + xpdf303: set to NULL on failure + + goo/gfile.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit bf2cb5c9c47b4a61192101f0a48771657228e383 +Author: Adrian Johnson +Date: Tue Aug 30 19:08:40 2011 +0930 + + Fix compile error with libpng >= 1.5.0 + + libpng 1.5.0 changed one of the types in the png_set_iCCP() function + prototype. + + goo/PNGWriter.cc | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 6364c50ffb4053cc30cecbefff7a3142cab8c50b +Author: Albert Astals Cid +Date: Tue Aug 30 18:27:09 2011 +0200 + + xpdf303: Support for aes256 et all in Decrypt/SecurityHandler + + poppler/Decrypt.cc | 488 + ++++++++++++++++++++++++++++++++++++++------ + poppler/Decrypt.h | 19 +- + poppler/PDFDoc.cc | 2 +- + poppler/SecurityHandler.cc | 238 ++++++++++++--------- + poppler/SecurityHandler.h | 7 +- + poppler/Stream.h | 3 +- + 6 files changed, 595 insertions(+), 162 deletions(-) + +commit 39ce4575f96953b499d09074e847d492d18379fa +Author: Albert Astals Cid +Date: Tue Aug 30 17:39:30 2011 +0200 + + xpdf303: Add FoFiIdentifier + + CMakeLists.txt | 2 + + fofi/FoFiIdentifier.cc | 630 + ++++++++++++++++++++++++++++++++++++++++++++++++ + fofi/FoFiIdentifier.h | 42 ++++ + fofi/Makefile.am | 2 + + 4 files changed, 676 insertions(+) + +commit 33e7d54b4a29d297108ef3dc6008190625125ec8 +Author: Albert Astals Cid +Date: Tue Aug 30 17:36:22 2011 +0200 + + xpdf303: Also check against INT_MAX in FoFiBase + + fofi/FoFiBase.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit fb1f56f091e5329b30279916b182f64134f3b2e6 +Author: Albert Astals Cid +Date: Tue Aug 30 17:34:50 2011 +0200 + + xpdf303: Introduce FoFiBase::getU32LE + + fofi/FoFiBase.cc | 15 +++++++++++++++ + fofi/FoFiBase.h | 1 + + 2 files changed, 16 insertions(+) + +commit a79bc3359586cbc2c235d20dfa934dab1f475561 +Author: Carlos Garcia Campos +Date: Tue Aug 30 16:59:08 2011 +0200 + + xpdf303: Check for a zero-entry cmap table in FoFiTrueType + + fofi/FoFiTrueType.cc | 28 +++++++++++++++++----------- + 1 file changed, 17 insertions(+), 11 deletions(-) + +commit efce014e39d0d13157b21a10ff8d483b5cfc561a +Author: Albert Astals Cid +Date: Tue Aug 30 17:02:16 2011 +0200 + + xpdf303: upddate xpdfCopyright + + poppler/poppler-config.h.cmake | 4 ++-- + poppler/poppler-config.h.in | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2eb388ccc6c7526e66da804d9d800cf29a027914 +Author: Albert Astals Cid +Date: Tue Aug 30 16:50:39 2011 +0200 + + xpdf303: Merge README + + README | 2 +- + README-XPDF | 153 + ++++++++++++++++++++++++++++++++++++++--------------------- + 2 files changed, 101 insertions(+), 54 deletions(-) + +commit 331b0f1c16c4f636fc616569bab030969aa848f2 +Author: Carlos Garcia Campos +Date: Tue Aug 30 16:42:33 2011 +0200 + + xpdf303: Check for entries in the table directory with bogus tags + in FoFiTrueType + + This handles the case where the number of tables given in the + header is + too high. + + fofi/FoFiTrueType.cc | 30 +++++++++++++++++++++++++----- + 1 file changed, 25 insertions(+), 5 deletions(-) + +commit faaba717046ba87ef5ded614e2bcab6260a9f7c2 +Author: Albert Astals Cid +Date: Tue Aug 30 16:36:24 2011 +0200 + + xpdf303: FixedPoint improvements + + goo/FixedPoint.cc | 51 + +++++++++++++++++++++++++++++++----------------- + goo/FixedPoint.h | 15 ++++++++++++-- + splash/Splash.cc | 12 ++++++++++++ + splash/SplashFTFont.cc | 16 +++++++-------- + splash/SplashMath.h | 8 +++++--- + splash/SplashXPath.cc | 9 +++++++++ + 6 files changed, 80 insertions(+), 31 deletions(-) + +commit 73efc96eef6bd32a7c058b7dda8101f4f23c454f +Author: Carlos Garcia Campos +Date: Tue Aug 30 16:31:52 2011 +0200 + + xpdf303: Handle bogus loca table entries in FoFiTrueType + + where the offset is past the end of the glyf table. + + fofi/FoFiTrueType.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1df3489392a77e2b75adbafcc2fa10de829c172e +Author: Carlos Garcia Campos +Date: Tue Aug 30 16:21:40 2011 +0200 + + xpdf303: Use std::sort (with functors) in place of qsort + + It can be significantly faster. Not included changes in + SplashXPathScanner.cc since they depend on other changes not yet + merged. + + fofi/FoFiTrueType.cc | 55 + ++++++++++++++++++++++-------------------------- + poppler/GfxFont.cc | 24 ++++++++++++++------- + splash/SplashScreen.cc | 12 +++++++---- + splash/SplashXPath.cc | 44 ++++++++++++++++++-------------------- + 4 files changed, 69 insertions(+), 66 deletions(-) + +commit f298e7f844105f2d9a36144e59be86c341e37507 +Merge: 2a6bd7a 0ca5453 +Author: Albert Astals Cid +Date: Tue Aug 30 16:21:58 2011 +0200 + + Merge branch 'master' into xpdf303merge + +commit 0ca5453fea9e5342188f772acd6f31af1778f236 +Author: Albert Astals Cid +Date: Tue Aug 30 16:20:17 2011 +0200 + + Compile when defining USE_FIXEDPOINT + + splash/Splash.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit bd7a53bc2f27fc3979f8de306e2dcaca53d4570a +Author: Albert Astals Cid +Date: Tue Aug 30 16:20:08 2011 +0200 + + match function definition + + poppler/SplashOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2a6bd7aae37f73a94bf1a84f699f310177661611 +Author: Albert Astals Cid +Date: Tue Aug 30 15:13:17 2011 +0200 + + xpdf303: Expand latin1UnicodeMapRanges and ascii7UnicodeMapRanges + + poppler/UnicodeMapTables.h | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 4d31785409e464d0e96dcf11167ecdffd64026d1 +Author: Albert Astals Cid +Date: Tue Aug 30 15:09:01 2011 +0200 + + xpdf303: More entries for nameToUnicodeTab + + poppler/NameToUnicodeTable.h | 3159 + ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 3159 insertions(+) + +commit 2658030836f3a15dadadd7f1989dfaa858bf876f +Author: Albert Astals Cid +Date: Tue Aug 30 14:49:23 2011 +0200 + + xpdf303: char * -> const char * + + cmake/modules/PopplerMacros.cmake | 2 +- + configure.ac | 2 +- + cpp/poppler-private.cpp | 2 +- + cpp/poppler-private.h | 2 +- + fofi/FoFiBase.h | 2 +- + fofi/FoFiEncodings.cc | 6 ++--- + fofi/FoFiEncodings.h | 6 ++--- + fofi/FoFiTrueType.cc | 10 ++++---- + fofi/FoFiTrueType.h | 4 ++-- + fofi/FoFiType1.cc | 4 ++-- + fofi/FoFiType1.h | 2 +- + fofi/FoFiType1C.cc | 14 +++++------ + fofi/FoFiType1C.h | 6 ++--- + goo/GooHash.cc | 16 ++++++------- + goo/GooHash.h | 12 +++++----- + goo/GooString.cc | 22 +++++++++--------- + goo/GooString.h | 16 ++++++------- + goo/gfile.cc | 4 ++-- + goo/gfile.h | 4 ++-- + goo/gmem.cc | 2 +- + goo/gmem.h | 2 +- + poppler/Annot.cc | 8 +++---- + poppler/Annot.h | 6 ++--- + poppler/ArthurOutputDev.cc | 6 ++--- + poppler/BuiltinFont.cc | 6 ++--- + poppler/BuiltinFont.h | 10 ++++---- + poppler/DCTStream.cc | 2 +- + poppler/DCTStream.h | 2 +- + poppler/Dict.cc | 14 +++++------ + poppler/Dict.h | 14 +++++------ + poppler/Error.cc | 10 ++++---- + poppler/Error.h | 6 ++--- + poppler/FileSpec.cc | 2 +- + poppler/FlateStream.cc | 2 +- + poppler/FlateStream.h | 2 +- + poppler/FontEncodingTables.cc | 14 +++++------ + poppler/FontEncodingTables.h | 14 +++++------ + poppler/FontInfo.cc | 2 +- + poppler/Form.cc | 6 ++--- + poppler/Form.h | 4 ++-- + poppler/Gfx.cc | 2 +- + poppler/Gfx.h | 2 +- + poppler/GfxFont.cc | 46 + ++++++++++++++++++------------------- + poppler/GfxFont.h | 8 +++---- + poppler/GfxState.cc | 6 ++--- + poppler/GfxState.h | 2 +- + poppler/GlobalParams.cc | 21 ++++++++--------- + poppler/GlobalParams.h | 8 +++---- + poppler/GlobalParamsWin.cc | 6 ++--- + poppler/JBIG2Stream.cc | 2 +- + poppler/JBIG2Stream.h | 2 +- + poppler/JPEG2000Stream.cc | 2 +- + poppler/JPEG2000Stream.h | 2 +- + poppler/JPXStream.h | 2 +- + poppler/NameToCharCode.cc | 8 +++---- + poppler/NameToCharCode.h | 6 ++--- + poppler/NameToUnicodeTable.h | 2 +- + poppler/Object.cc | 4 ++-- + poppler/Object.h | 28 +++++++++++----------- + poppler/PDFDoc.cc | 2 +- + poppler/PSOutputDev.cc | 24 +++++++++---------- + poppler/PSOutputDev.h | 8 +++---- + poppler/Page.cc | 2 +- + poppler/Page.h | 2 +- + poppler/SplashOutputDev.cc | 6 ++--- + poppler/Stream.cc | 16 ++++++------- + poppler/Stream.h | 28 +++++++++++----------- + poppler/TextOutputDev.cc | 2 +- + poppler/TextOutputDev.h | 2 +- + poppler/UnicodeMap.cc | 4 ++-- + poppler/UnicodeMap.h | 4 ++-- + poppler/UnicodeTypeTable.cc | 4 ++-- + qt4/src/poppler-private.cc | 2 +- + qt4/src/poppler-ps-converter.cc | 2 +- + splash/SplashFTFontEngine.cc | 8 +++---- + splash/SplashFTFontEngine.h | 6 ++--- + splash/SplashFTFontFile.cc | 6 ++--- + splash/SplashFTFontFile.h | 2 +- + splash/SplashFontEngine.cc | 6 ++--- + splash/SplashFontEngine.h | 6 ++--- + splash/SplashT1FontEngine.cc | 6 ++--- + splash/SplashT1FontEngine.h | 4 ++-- + splash/SplashT1FontFile.cc | 10 ++++---- + splash/SplashT1FontFile.h | 6 ++--- + test/pdf-operators.c | 4 ++-- + test/perf-test.cc | 4 ++-- + utils/HtmlFonts.cc | 4 ++-- + utils/HtmlOutputDev.cc | 12 +++++----- + utils/HtmlOutputDev.h | 4 ++-- + utils/parseargs.cc | 4 ++-- + utils/parseargs.h | 6 ++--- + utils/pdffonts.cc | 2 +- + utils/pdfinfo.cc | 12 +++++----- + utils/pdftocairo.cc | 4 ++-- + utils/pdftohtml.cc | 10 ++++---- + utils/pdftotext.cc | 12 +++++----- + 96 files changed, 337 insertions(+), 338 deletions(-) + +commit c899d26e0f7a61db99925179330c28df015a676b +Author: Albert Astals Cid +Date: Tue Aug 30 00:31:00 2011 +0200 + + Add COPYING3 from xpdf3.03 + + COPYING3 | 674 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 674 insertions(+) + +commit 508517a35cb3bc5195682a9cd89fb50a801eddc2 +Author: Albert Astals Cid +Date: Mon Aug 29 23:55:42 2011 +0200 + + 0.17.3 + + CMakeLists.txt | 4 ++-- + NEWS | 32 ++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + 10 files changed, 42 insertions(+), 10 deletions(-) + +commit 1431564f3363a63a8669c8dd15970db814f4969f +Author: Thomas Freitag +Date: Mon Aug 29 22:22:02 2011 +0200 + + Add pdfextract and pdfmerge + + See "Creating PDF with poppler ?" thread for more info + + utils/CMakeLists.txt | 15 +++++ + utils/Makefile.am | 10 +++ + utils/pdfextract.cc | 111 +++++++++++++++++++++++++++++++ + utils/pdfmerge.cc | 176 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 312 insertions(+) + +commit 8ca2f41089bc6402baf9b24428af04314c037b54 +Author: Thomas Freitag +Date: Mon Aug 29 22:20:52 2011 +0200 + + Rework writing of PDF files + + Makes it more compatible with other PDF readers + See "Creating PDF with poppler ?" thread in the mailing list for + more info + + poppler/PDFDoc.cc | 389 + +++++++++++++++++++++++++++++++++++++++++++++++------ + poppler/PDFDoc.h | 30 ++++- + 2 files changed, 375 insertions(+), 44 deletions(-) + +commit 33da7e270431e8e4c500e7573b3ca0dddd9f237e +Author: suzuki toshiya +Date: Sun Aug 28 22:07:38 2011 +0200 + + Fix building static-linked pdftocairo + + utils/Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 91fafce028ca6620c0eb22e370fb4c6fd3404e3c +Author: Adrian Johnson +Date: Tue Aug 23 21:02:02 2011 +0930 + + cairo: align strokes when Stroke Adjust is true and line width <= 1 + + If the stroke coordinates are not aligned, lines in cairo may be up to + 1 pixel wider than the requested width. This is most obvious when the + line width is 1 and the rendered line is 2 pixels. + + When Stroke Adjust is true, the PDF standard requires that stroke + coordinates be adjusted to ensure the stroke width is within half a + pixel of the requested width. + + If Stroke Adjust is enabled and the width is <= 1 pixel (the previous + commit adjusts the width to be at least 1 pixel), use the method + documented at http://www.cairographics.org/FAQ/#sharp_lines to align + the coordinates to ensure the rendered width is 1 pixel. + + Fixes bug #4536. + + poppler/CairoOutputDev.cc | 40 +++++++++++++++++++++++++++++++++++----- + poppler/CairoOutputDev.h | 3 +++ + 2 files changed, 38 insertions(+), 5 deletions(-) + +commit cfc67afe80b963ba662018674cadf3085466bb9f +Author: Adrian Johnson +Date: Tue Aug 23 20:46:24 2011 +0930 + + cairo: fix stroking of very thin lines + + Lines with a width less than 1.0 are almost invisible in cairo output + due to antialising. The PDF standard states that when the Stroke + Adjust graphics parameter is true, all lines must be at least one + pixel wide. + + Add a stroke_adjust flag to the CairoOuputDev. Like splash, use the + globalParam strokeAdjust setting (which defaults to true) to + initialize the flag and ignore the Stroke Adjust settng in PDF + files. This emulates Acrobat behavior. + + When stroke_adjust is true, find the line width in device pixels and + if less than 0.5 set the line width to 0.5 device pixels. The value + 0.5 pixels seems to make horizontal and vertical lines look better + because integer aligned 1.0 wide lines in cairo are rendered two + pixels wide which looks too fat. + + poppler/CairoOutputDev.cc | 20 +++++++++++++++++++- + poppler/CairoOutputDev.h | 1 + + 2 files changed, 20 insertions(+), 1 deletion(-) + +commit 7a7c932e09796b944dda69df1b339c889ee1d63a +Author: Albert Astals Cid +Date: Thu Aug 25 00:23:40 2011 +0200 + + Add a way to get the fully qualified name + + qt4/src/poppler-form.cc | 12 +++++++++++- + qt4/src/poppler-form.h | 8 +++++++- + 2 files changed, 18 insertions(+), 2 deletions(-) + +commit e001871d927f9cc86b4327d64e4c66ad00172ad0 +Author: Albert Astals Cid +Date: Wed Aug 24 23:44:18 2011 +0200 + + Clarify ownership + + qt4/src/poppler-qt4.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 87c48fdc175be4d852b953778f915ea93cd50194 +Author: Adrian Johnson +Date: Wed Aug 24 19:53:48 2011 +0930 + + cairo: fix unique id mime data + + The unique id string was copied before the object number was appended + resulting in all images in pdf output being the same. + + poppler/CairoOutputDev.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 08a2ba6f1603246651f0d5e697b88d38363d7df2 +Author: Pino Toscano +Date: Tue Aug 23 20:20:32 2011 +0200 + + pdftocairo/cmake: need to link to freetype + + utils/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 82496b18dc4aff66cc29f2b6607c8f894afe8b49 +Author: Albert Astals Cid +Date: Mon Aug 22 16:42:28 2011 +0200 + + Update Adrian (C) + + poppler/GfxFont.h | 1 + + 1 file changed, 1 insertion(+) + +commit 2576e3a6d9746e2272c620a775e11295932eb5f2 +Author: Adrian Johnson +Date: Mon Aug 22 21:41:36 2011 +0930 + + update SEE ALSO section of man pages + + - ensure each man page references all other utils + - sort list of utils in alphabetical order + + utils/pdffonts.1 | 8 +++++--- + utils/pdfimages.1 | 8 +++++--- + utils/pdfinfo.1 | 8 +++++--- + utils/pdftocairo.1 | 2 +- + utils/pdftohtml.1 | 8 ++++++++ + utils/pdftoppm.1 | 8 +++++--- + utils/pdftops.1 | 8 +++++--- + utils/pdftotext.1 | 9 +++++---- + 8 files changed, 39 insertions(+), 20 deletions(-) + +commit 23ec5c8d394beb632ee45f6308215646cd1a0195 +Author: Adrian Johnson +Date: Mon Aug 22 21:26:24 2011 +0930 + + cairo: only use show_text_glyphs if the surface supports it and the + font has toUnicode + + When generating pdf output, fonts that do not have toUnicode cause an + excessive number of empty text ActualText entries to be written due to + glyphs that do not have have a mapping. + + poppler/CairoOutputDev.cc | 12 ++++++++---- + poppler/CairoOutputDev.h | 1 + + poppler/GfxFont.h | 3 +++ + 3 files changed, 12 insertions(+), 4 deletions(-) + +commit 3a574f13fa22b7c31eda0d0437f4094a5a39ff34 +Author: Adrian Johnson +Date: Fri Aug 19 23:23:24 2011 +0930 + + cairo: fix stroke patterns + + Since cairo still does not yet have cairo_stroke_to_path(), this + implements a workaround for stroke patterns. In clipToStrokePath, the + stroke path and stroke parameters are saved. In tilingPatternFill and + fill (used to draw shading patterns) if a stroke path clip has been + saved, the current pattern is stroked instead of filled using the + saved stroke. + Fixes bug #11719. + + poppler/CairoOutputDev.cc | 52 + ++++++++++++++++++++++++++++++++++++++++++++- + poppler/CairoOutputDev.h | 17 +++++++++++++-- + 2 files changed, 66 insertions(+), 3 deletions(-) + +commit eb740dac838d2a1e32899327ca6d25c3dca641df +Author: Carlos Garcia Campos +Date: Mon Aug 22 13:41:56 2011 +0200 + + glib-demo: Add text attributes information to text demo + + glib/demo/text.c | 103 + ++++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 97 insertions(+), 6 deletions(-) + +commit cda4aefaa136ae07778de3b1593808a5aaa2db5b +Author: Carlos Garcia Campos +Date: Mon Aug 22 13:40:49 2011 +0200 + + glib-demo: Add pgd_pixbuf_new_for_color() to utils + + To get a pixbuf for a given poppler color. + + glib/demo/annots.c | 22 +--------------------- + glib/demo/utils.c | 27 +++++++++++++++++++++++++++ + glib/demo/utils.h | 1 + + 3 files changed, 29 insertions(+), 21 deletions(-) + +commit 2a11b2963a548186654722a393db1e19d57828f1 +Author: danigm +Date: Mon Aug 22 12:51:50 2011 +0200 + + glib: Add poppler_page_get_text_attributes() + + It returns a list of text attributes that apply to a range of text as + returned by poppler_page_get_text(). Text attributes are represented + by + a PopplerTextAttributes struct that contains font name, font size, + whether text is undrlined and foreground color for a range of text. + Fixes bug #33269. + + glib/poppler-page.cc | 202 + +++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 33 ++++++ + glib/poppler.h | 1 + + glib/reference/poppler-sections.txt | 7 ++ + 4 files changed, 243 insertions(+) + +commit 15f99157cf3900bf20cf619e204ae53085af497d +Author: Carlos Garcia Campos +Date: Mon Aug 22 12:43:12 2011 +0200 + + textoutputdev: Add TextFontInfo::matches() + + It checks whether two TextFontInfo objects contain the same font. + + poppler/TextOutputDev.cc | 4 ++++ + poppler/TextOutputDev.h | 1 + + 2 files changed, 5 insertions(+) + +commit 5b554b39fca634c8ba58915c14522cb2920fe280 +Author: Pino Toscano +Date: Mon Aug 22 13:16:23 2011 +0200 + + pdftocairo/cmake: link to lcms library if available + + utils/CMakeLists.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit f7cd236fea8740ef05635d1fd7917a778cc373f0 +Author: Albert Astals Cid +Date: Mon Aug 22 00:00:32 2011 +0200 + + Ship HtmlUtils.h + + utils/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit a128a858c50287cfba74c69996276ea44370dc26 +Author: Albert Astals Cid +Date: Sun Aug 21 23:52:06 2011 +0200 + + Update Adrian's (C) + + goo/PNGWriter.cc | 2 +- + goo/PNGWriter.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit b78134314107d8344360c3313478115ed291630d +Author: Albert Astals Cid +Date: Sun Aug 21 23:46:09 2011 +0200 + + Fix copyright + + c&p is evil + + goo/gtypes_p.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ade53277546cef4ba19d982518c0cd83a4bb9c12 +Author: Albert Astals Cid +Date: Sun Aug 21 23:42:53 2011 +0200 + + Move HAVE_STDINT_H use to a private header + + This way we do not need to expose it in poppler-config.h since + gtypes.h is a half public header + + goo/Makefile.am | 1 + + goo/gtypes.h | 18 ------------------ + goo/gtypes_p.h | 30 ++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.cc | 1 + + poppler/CairoRescaleBox.cc | 1 + + utils/pdftocairo.cc | 1 + + 6 files changed, 34 insertions(+), 18 deletions(-) + +commit 6166c3a37a4d6307d4f23ee272ea07c95bbba74a +Author: Albert Astals Cid +Date: Sun Aug 21 23:31:30 2011 +0200 + + Silence silly gcc + + goo/PNGWriter.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit eb5b228c4c24152e632c931b63c64ffb1e10d45d +Author: Adrian Johnson +Date: Sat Aug 20 21:13:18 2011 +0930 + + pdftocairo: fix writing to stdout for ps/pdf/svg + + utils/pdftocairo.cc | 23 ++++++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +commit 1beac5896a301be68de22240017fef11e7d27d40 +Author: Adrian Johnson +Date: Sat Aug 13 00:23:23 2011 +0930 + + Add poppler version to PSOutputDev ouput + + poppler/PSOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit b35fd3651fd3dbaa876fc64b8c5cfe77ae67335f +Author: Adrian Johnson +Date: Fri Aug 5 23:01:51 2011 +0930 + + cairo: use cairo_show_text_glyphs() when printing + + This will allow cairo to setup the correct toUnicode or glyph names to + ensure text can be extracted. + + poppler/CairoOutputDev.cc | 41 + ++++++++++++++++++++++++++++++++++++++--- + poppler/CairoOutputDev.h | 5 +++++ + 2 files changed, 43 insertions(+), 3 deletions(-) + +commit 51ade078bc1fa737e20120ae4cb3bf693a219823 +Author: Stefan Thomas +Date: Thu Jul 15 16:24:55 2010 +0100 + + pdftocairo: Added to CMake build system. + + utils/CMakeLists.txt | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 5a8745cdf428e22641937977eedfc1d605f6ff07 +Author: Adrian Johnson +Date: Fri Aug 12 23:57:01 2011 +0930 + + Add pdftocairo man page + + utils/Makefile.am | 5 +- + utils/pdftocairo.1 | 254 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 258 insertions(+), 1 deletion(-) + +commit b67a12b2b26692e2ccec7ff2e6df18fee05be535 +Author: Adrian Johnson +Date: Thu Aug 11 21:34:11 2011 +0930 + + pdftocairo - utility for creating png/jpeg/ps/eps/pdf/svg using + CairoOutputDev + + utils/.gitignore | 2 +- + utils/Makefile.am | 20 +- + utils/pdftocairo.cc | 970 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 989 insertions(+), 3 deletions(-) + +commit 4f2d774826bf7bb7b3825e02c5ca4c2928643950 +Author: Adrian Johnson +Date: Thu Aug 11 21:32:53 2011 +0930 + + png: add support for embedding ICC profile + + goo/PNGWriter.cc | 28 ++++++++++++++++++++++++++++ + goo/PNGWriter.h | 8 ++++++++ + 2 files changed, 36 insertions(+) + +commit 1091f47310bf0fc71bac5dd4ec81dad50b2f2537 +Author: Adrian Johnson +Date: Wed Aug 10 18:48:15 2011 +0930 + + png: Add additional pixel formats + + RGBA is required for images with transparency. GRAY and MONOCHROME + allow PNGWriter write more compact PNG files when the images is known + to be all gray or monochrome. + + goo/PNGWriter.cc | 30 ++++++++++++++++++++++++++---- + goo/PNGWriter.h | 11 ++++++++++- + 2 files changed, 36 insertions(+), 5 deletions(-) + +commit c6f26915db568f12892d48005746ad2922c19000 +Author: Adrian Johnson +Date: Wed Aug 10 18:45:24 2011 +0930 + + png: use PNG_RESOLUTION_METER instead of PNG_RESOLUTION_UNKNOWN to + set resolution + + gimp does not show the correct resolution unless PNG_RESOLUTION_METER + is used + + goo/PNGWriter.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 2667d2a5b34e1bbf322aea42876e7e81aa06dc29 +Author: Adrian Johnson +Date: Tue Aug 9 22:05:53 2011 +0930 + + Use stdint.h instead of assuming the size of types + + configure.ac | 1 + + goo/gtypes.h | 18 ++++++++++++++++++ + poppler/CairoOutputDev.cc | 2 -- + poppler/CairoRescaleBox.cc | 2 -- + 4 files changed, 19 insertions(+), 4 deletions(-) + +commit c043f298e68bdfffcb7505ec354ec7487b5bd7b2 +Author: Adrian Johnson +Date: Fri Jul 8 21:13:36 2011 +0930 + + cairo: assume printer pixel size is 1/600" when stroking 0 width lines + + Fixes bug #39067. + + poppler/CairoOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 961adf0b767be78d3556b7315de3761d3d46b107 +Author: Adrian Johnson +Date: Thu Aug 18 17:44:35 2011 +0930 + + cairo: set mime data for soft masked images + + Fixes bug #40192. + + poppler/CairoOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 86271e4810f714d4ba7a2a6651a9b1d04f653262 +Author: Joshua Richardson +Date: Thu Aug 18 18:48:40 2011 +0200 + + pdftohtml: Support text rotation + + Includes a few other fixlets. + See bug 38586 for more info + + utils/HtmlFonts.cc | 64 +++++++++--------- + utils/HtmlFonts.h | 10 ++- + utils/HtmlOutputDev.cc | 170 + +++++++++++++++++++++++++++++++++--------------- + utils/HtmlOutputDev.h | 8 ++- + utils/HtmlUtils.h | 51 +++++++++++++++ + 5 files changed, 218 insertions(+), 85 deletions(-) + +commit 56248b84e2185483dd54704c13838e8f78029d49 +Author: Albert Astals Cid +Date: Thu Aug 18 12:40:51 2011 +0200 + + Only declare overprint if we are going to use it + + utils/pdftoppm.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a1093aae9f64cb6768164551d50cafaef52876c1 +Author: Albert Astals Cid +Date: Thu Aug 18 12:30:29 2011 +0200 + + Fix Adrian's (C) + + poppler/PSOutputDev.cc | 2 +- + poppler/PSOutputDev.h | 3 ++- + poppler/PreScanOutputDev.cc | 1 + + poppler/PreScanOutputDev.h | 1 + + poppler/SplashOutputDev.cc | 1 + + poppler/SplashOutputDev.h | 1 + + 6 files changed, 7 insertions(+), 2 deletions(-) + +commit 7741b24d05f50c134cf15361d52f5df7ae3c3115 +Author: Adrian Johnson +Date: Sun Aug 14 22:06:22 2011 +0930 + + ps: Avoid using /PatternType if only one instance of the pattern + is used + + this optimization makes pages print faster on my LaserJet + + poppler/PSOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit a60e61ac64634dc59c80d8e6b0288c1269fc0154 +Author: Adrian Johnson +Date: Sun Aug 14 21:55:24 2011 +0930 + + ps: use PS Patterns for tiling fill when PS level >= 2 + + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 4 +-- + poppler/Gfx.cc | 4 +-- + poppler/OutputDev.h | 2 +- + poppler/PSOutputDev.cc | 59 + +++++++++++++++++++++++++++++++++++++++---- + poppler/PSOutputDev.h | 13 +++++++++- + poppler/PreScanOutputDev.cc | 2 +- + poppler/PreScanOutputDev.h | 2 +- + poppler/SplashOutputDev.cc | 2 +- + poppler/SplashOutputDev.h | 2 +- + 10 files changed, 76 insertions(+), 16 deletions(-) + +commit 9938770e737b2fcec8269147e70663517f848925 +Author: Albert Astals Cid +Date: Mon Aug 15 13:17:24 2011 +0200 + + 0.17.2 + + CMakeLists.txt | 4 ++-- + NEWS | 37 +++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 5 +++-- + 10 files changed, 49 insertions(+), 11 deletions(-) + +commit 378fc06c574b85b5c003ca842aa743f0ffe5587e +Author: Albert Astals Cid +Date: Mon Aug 1 22:14:12 2011 +0200 + + Only assume the OC is not visible if it exists and is set to no + + Similar to commit e2def20a45c1d8307fd62fabb9769121af975abf + but in the other branch of the if, fixes bug 39637 + + poppler/OptionalContent.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 861a7bfb9431609e1e148240447f23c8e83b9d0f +Author: Thomas Freitag +Date: Fri Jul 29 00:30:58 2011 +0200 + + Implement overprint in Splash + + See the "Implementing overprint in Splash" thread in the mailing + list for more info + + goo/ImgWriter.h | 2 + + goo/JpegWriter.cc | 54 ++++++-- + goo/JpegWriter.h | 7 +- + poppler/Gfx.cc | 98 ++++++++++++-- + poppler/GfxState.cc | 1 + + poppler/GfxState.h | 4 + + poppler/OutputDev.h | 1 + + poppler/SplashOutputDev.cc | 307 + ++++++++++++++++++++++++++++++++++++++------ + poppler/SplashOutputDev.h | 51 +++++++- + splash/Splash.cc | 86 ++++++++++--- + splash/Splash.h | 9 +- + splash/SplashBitmap.cc | 64 ++++++++- + splash/SplashBitmap.h | 1 + + splash/SplashPattern.cc | 16 ++- + splash/SplashPattern.h | 7 + + splash/SplashState.cc | 11 +- + splash/SplashState.h | 22 ++++ + splash/SplashTypes.h | 5 +- + utils/pdftoppm.cc | 36 +++++- + 19 files changed, 686 insertions(+), 96 deletions(-) + +commit e2fa8a2ca8459d19c0f9dca445a2399b9a3d483d +Author: Koji Otani +Date: Thu Jul 28 12:43:57 2011 +0200 + + Parse the "Medium" modifier when asking fontconfig for a font + + poppler/GlobalParams.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0a677dd8dc9c55936530ea1fee901cab831c52af +Author: Koji Otani +Date: Thu Jul 28 12:42:16 2011 +0200 + + Improve selection of CJK fonts + + Seems we need to do some more fontconfig magic for some special + fontconfig configurations + More info at bug 36474 + + poppler/GlobalParams.cc | 137 + ++++++++++++++++++++++++++++++----------------- + 1 file changed, 89 insertions(+), 48 deletions(-) + +commit e78aff6796a5d5a0a4f2fe8c7ceb33c506e2c8f5 +Author: William Bader +Date: Tue Jul 26 00:10:34 2011 +0200 + + make -level1sep write gray instead of cmyk + + If it is a gray only image + Bug 39012 + + poppler/PSOutputDev.cc | 63 + +++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 60 insertions(+), 3 deletions(-) + +commit ea31309487aab6ed407a086dff1f350b6e4bdbc9 +Author: Albert Astals Cid +Date: Tue Jul 26 00:09:27 2011 +0200 + + Update (C) + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a945641497946a825dc880f94200ea1d5409332b +Author: Hib Eris +Date: Sat Jul 23 08:44:06 2011 +0200 + + Handle missing startxref properly + + Bug 38209 + + poppler/PDFDoc.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 2c1b25ef2592367f4c18e204ab5d102f15cf272f +Author: William Bader +Date: Mon Jul 25 23:43:27 2011 +0200 + + Fix a bad memory access + + When not using antialias and the character starts to the left/top + of the image + Bug 37189 + + splash/Splash.cc | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 300900afa2140141748a7571270be5d850274072 +Author: Daniel Glöckner +Date: Sat Jul 23 19:49:15 2011 +0200 + + Fix numerical overflow in libopenjpeg JPXStream::doLookChar() + + It also includes a speed optimization. Bug 39361 + + poppler/JPEG2000Stream.cc | 37 ++++++++++++++++++++++++++++++++++++- + poppler/JPEG2000Stream.h | 36 +++++++++++------------------------- + 2 files changed, 47 insertions(+), 26 deletions(-) + +commit ec6ea621b066a3b332a8099341664889d2ff3743 +Author: Axel Struebing +Date: Thu Jul 21 23:12:36 2011 +0200 + + Fix calculation of startXRefPos + + Reviewed by Hib Eris + See "another problem with saving linearized files" in the mailing + list for more info + + poppler/PDFDoc.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit ce97cfcd6373c98fb8c63e9b3ef6c51738f22a50 +Author: Albert Astals Cid +Date: Wed Jul 20 00:24:52 2011 +0200 + + Render dots for 0 length dashed lines + + Bug 34150 + + splash/Splash.cc | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 42c1b1c4af6b07f488d1b2b02a4700f19b0ab0ef +Author: Tomas Hoger +Date: Wed Jul 20 00:23:15 2011 +0200 + + Fix crash on truncated JPEG/DCT stream + + Bug 36693 + + poppler/DCTStream.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 091b570c63694e475c24bb8805638ac70c654892 +Author: Albert Astals Cid +Date: Wed Jul 20 00:19:43 2011 +0200 + + Make sure the dict is a page dict + + Fixes second part of 35925 and 39072 + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac566c887ffae9d384587f7587609642aef7a016 +Author: Albert Astals Cid +Date: Wed Jul 20 00:17:49 2011 +0200 + + Do not crash if can not get page 0 for some reason + + qt4/tests/test-poppler-qt4.cpp | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 6ad95e7b8b9766aa19f01f06f02eb430e4a4a899 +Author: Albert Astals Cid +Date: Mon Jul 11 15:04:49 2011 +0100 + + Complete the list of preprocessor defines that we never define + + When using any of the two sanctioned build systems + + poppler/poppler-config.h.cmake | 6 ++++-- + poppler/poppler-config.h.in | 6 ++++-- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit edcc84ef0137a733cf3fab79b919af309d87325c +Author: Albert Astals Cid +Date: Mon Jul 11 15:00:39 2011 +0100 + + Harmonize all SPLASH_CMYK to use #if + + poppler/SplashOutputDev.cc | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit a8fca630d592941c033ca6a380bf46b6e733a748 +Author: Albert Astals Cid +Date: Mon Jul 11 14:57:33 2011 +0100 + + Sanitize headers a big + + * Remove includes to config.h as that file does not exist + * Add to poppler-config.h all the defines we define in the + configure/cmake process and are used in headers + * Include poppker-config.h where needed + + goo/GooTimer.h | 2 ++ + goo/ImgWriter.h | 3 +- + goo/JpegWriter.h | 3 +- + goo/PNGWriter.h | 4 +-- + goo/TiffWriter.h | 3 +- + goo/gfile.h | 3 +- + poppler/DCTStream.h | 5 ++-- + poppler/FlateStream.h | 5 ++-- + poppler/Gfx.h | 3 +- + poppler/GfxState.h | 2 ++ + poppler/Stream.h | 3 +- + poppler/poppler-config.h.cmake | 63 + ++++++++++++++++++++++++++++++++++++++++ + poppler/poppler-config.h.in | 63 + ++++++++++++++++++++++++++++++++++++++++ + splash/SplashFTFont.h | 4 ++- + splash/SplashMath.h | 4 ++- + 15 files changed, 153 insertions(+), 17 deletions(-) + +commit 214322f3c66a9aad4e2a46f6e305a3dacaa4f8b1 +Author: Albert Astals Cid +Date: Sun Jul 10 01:20:21 2011 +0100 + + And 3 years later, Ed has answered :-) + + Now all our changes are GPLv2+ + + poppler/GfxFont.cc | 3 +++ + poppler/GlobalParams.cc | 3 +++ + poppler/TextOutputDev.cc | 3 +++ + poppler/TextOutputDev.h | 3 +++ + poppler/UnicodeTypeTable.cc | 3 +++ + poppler/UnicodeTypeTable.h | 3 +++ + 6 files changed, 18 insertions(+) + +commit 37cc1344672f480d4062aafbd2f3245ca1392279 +Author: Albert Astals Cid +Date: Sun Jul 10 01:15:44 2011 +0100 + + Fix header + + The file was modified in 2009 and README.contributors stating + everything is GPLv2+ is from 2008 + + poppler/XpdfPluginAPI.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 230ab66f52a992557464e325d18f88573ec52423 +Author: Albert Astals Cid +Date: Sun Jul 10 01:06:41 2011 +0100 + + make files easier to include by themselves + + fofi/FoFiTrueType.h | 2 ++ + splash/Splash.h | 3 ++- + splash/SplashFontEngine.h | 3 ++- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit 866c6d1b0daa8b28f259e1faba075026cf9007e0 +Author: Albert Astals Cid +Date: Sun Jul 10 00:55:25 2011 +0100 + + Name most of the classes in poppler/ includable by themselves + + poppler/Annot.h | 4 +++- + poppler/Catalog.h | 2 ++ + poppler/CharCodeToUnicode.h | 4 +++- + poppler/CompactFontTables.h | 16 ++++++++++++++++ + poppler/FontInfo.h | 6 +++++- + poppler/GfxState_helpers.h | 4 +++- + poppler/NameToUnicodeTable.h | 18 ++++++++++++++++++ + 7 files changed, 50 insertions(+), 4 deletions(-) + +commit 6b62fb7e9bd7de7f79b9b9a6fe36a5f5da099133 +Author: William Bader +Date: Mon Jun 27 19:38:52 2011 +0100 + + Remove unused variable + + poppler/PSOutputDev.cc | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 4bc6c5bd3a001bb4eb9f61488e3d4f356638e391 +Author: Adrian Bunk +Date: Tue Jul 5 15:21:06 2011 +0300 + + .gitignore tests additions + + The following files were missing in .gitignore: + - cpp/tests/poppler-render + - qt4/tests/poppler-texts + - test/gtk-test + + cpp/tests/.gitignore | 1 + + qt4/tests/.gitignore | 1 + + test/.gitignore | 1 + + 3 files changed, 3 insertions(+) + +commit 00076bc308ae320244c47777fe351c1c2bef2da8 +Author: Albert Astals Cid +Date: Fri Jun 24 22:51:55 2011 +0100 + + Forgot William's (C) here + + poppler/Stream.cc | 1 + + poppler/Stream.h | 1 + + 2 files changed, 2 insertions(+) + +commit 7e244fde4ec03da08d81af3402b21646c803bd31 +Author: William Bader +Date: Fri Jun 24 22:39:13 2011 +0100 + + patch to make -level2sep and -level3sep write gray instead of cmyk + + If they are only gray of course :D + + poppler/PSOutputDev.cc | 34 ++++++++++++++++++++++++++++++---- + poppler/Stream.cc | 43 +++++++++++++++++++++++++++++++++++++++++++ + poppler/Stream.h | 29 +++++++++++++++++++++++++++++ + 3 files changed, 102 insertions(+), 4 deletions(-) + +commit abba8140a9972197faaca96ec590af7dc9408fb0 +Author: William Bader +Date: Fri Jun 24 22:38:33 2011 +0100 + + patch to make -level2sep and -level3sep write cmyk instead of rgb + + poppler/PSOutputDev.cc | 59 + ++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 54 insertions(+), 5 deletions(-) + +commit 706007431325b1e8c9bf4cba35c89511b10ebf0c +Author: Albert Astals Cid +Date: Mon Jun 20 23:30:50 2011 +0100 + + (C) for Jim + + fofi/FoFiBase.cc | 1 + + 1 file changed, 1 insertion(+) + +commit e23384fbb3542941d2cf59ce6560913255ca2b01 +Author: Jim Meyering +Date: Mon Jun 20 11:09:01 2011 +0200 + + don't gmalloc(-1) upon ftell failure + + * fofi/FoFiBase.cc: Diagnose ftell failure. + + fofi/FoFiBase.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c5601bde9d8f3f56e558a6f63e563c9d337810eb +Author: Steven Murdoch +Date: Mon Jun 20 23:25:43 2011 +0100 + + Fix encoding of PDF document metadata in output of pdftohtml + + pdftohtml simply copies the PDF document title into the HTML + tag, which fails when the title is UCS-2 encoded, or if it contains + characters which are in pdfDocEncoding (a ISO 8859-1 superset), + but not + in ISO 8859-1. This patch fixes the problem by decoding UCS-2 or + pdfDocEncoding into Unicode, then encoding this in the desired output + encoding. HTML escaping wasn't being done either, so I have used the + existing function HtmlFont::HtmlFilter to perform both HTML escaping + and character set encoding. This static method had to be made public + to call it from pdftohtml. See bug #37900. + + utils/HtmlFonts.h | 3 ++- + utils/pdftohtml.cc | 41 ++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 40 insertions(+), 4 deletions(-) + +commit d4af1c4ef46abf1f11b7215c7b144ce7bb7912eb +Author: Joshua Richardson <joshuarbox-junk1@yahoo.com> +Date: Sat Jun 18 13:39:54 2011 +0100 + + Fix vertical spacing issues in pdftohtml output. + + Bug 38019 + + utils/HtmlFonts.cc | 3 ++- + utils/HtmlOutputDev.cc | 21 +++++++++++++++++++-- + 2 files changed, 21 insertions(+), 3 deletions(-) + +commit 589933ef105b60e8d48854cce15a7548c2850116 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 13 21:24:39 2011 +0100 + + Forgot my (C) + + poppler/PreScanOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f5d2ddd13d27078355dee63207671885bf9b0926 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 13 18:57:29 2011 +0100 + + We need to include config.h here + + Fixes crash after patch to fix bug 13518 + + poppler/PreScanOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 147ae4bf76a85768c9ed729ca10ee3dae93b8876 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 8 23:36:14 2011 +0100 + + Do not crash if link does not have an action + + utils/HtmlOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5d9489bf566b700ef38e5e33665a2648b535e1e7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 4 21:46:10 2011 +0100 + + forgot to update the C + + utils/pdftotext.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 7b123bf2b11ac81f24a966186a06de739d3c8f02 +Author: Steven Murdoch <Steven.Murdoch@cl.cam.ac.uk> +Date: Sat Jun 4 20:22:52 2011 +0100 + + Fix pdftotext -htmlmeta to correctly output U+2019 in PDF metadata + + In PDF documents, right single quotation mark (U+2019) may be + encoded as + 0x90 because PDFDocEncoding uses some of the reserved characters in + ISO 8859-1. However, pdftotext -htmlmeta assumes that characters + are either + UCS-2 or ISO 8859-1. Thus when a right single quotation mark is + encoded as + 0x90, it is output as unicode 0x90 (which is a control + character). pdfinfo + does the right thing by first converting from PDFDocEncoding to + Unicode + with pdfDocEncoding[], before encoding it in the desired character + set. + This patch applies the same logic to pdftotext. pdftohtml is broken + in the + same way, but this patch does not attempt to fix it. + + Bug 37900 + + utils/pdftotext.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit db2ae1bdbb7fcb64ba4c91dfc574d9f970bebdf6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 4 13:23:11 2011 +0100 + + Make sure catDict is a dict + + poppler/Catalog.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 58915affbdf1b5780f25d172a582c69fb2413230 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 4 13:20:02 2011 +0100 + + Make sure catDict is a dict before using it + + KDE Bug 274888 shows it's possible to get aborts because of that + + poppler/Catalog.cc | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +commit 4ebc7e364409fe303e7a5729b568913e3c92e7d4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 4 13:19:34 2011 +0100 + + We need to free catDict on failure + + poppler/Catalog.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 335a7fc6d98f5facc1ff098a91ac968387473cb3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 31 23:18:26 2011 +0100 + + Make parse() private + + poppler/Catalog.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 311d69ef2222409859817737c44b8e741289d897 +Author: Axel Strübing <axel.struebing@freenet.de> +Date: Sun May 29 16:12:29 2011 +0100 + + Needs to be freed + + As i said in my last commit comment :D + + poppler/PDFDoc.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 66c7d0199b45bc7c81c88a9989c9515398d30d43 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 28 17:32:02 2011 +0100 + + No need to check for NULL + + We probably need to free obj4 but i don't have the stamina to properly + test it + + poppler/PDFDoc.cc | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +commit 450934619a1c5b2a58f65649f567274af8d24ea7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 28 12:37:08 2011 +0100 + + Parse that as unicode + + Fixes KDE Bug #274055 + + qt4/src/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 04dfb2c984b3c9949466e2b70e26b58029c5a7d3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat May 7 12:55:34 2011 +0200 + + Make FileSpec a class and move EmbFile from Catalog to FileSpec + + Qt and cpp frontends adapted by Pino Toscano + + cpp/poppler-document.cpp | 4 +- + cpp/poppler-embedded-file-private.h | 10 +-- + cpp/poppler-embedded-file.cpp | 42 +++++++---- + glib/poppler-annot.cc | 6 +- + glib/poppler-attachment.cc | 33 ++++---- + glib/poppler-document.cc | 5 +- + glib/poppler-private.h | 3 +- + poppler/Catalog.cc | 118 + ++--------------------------- + poppler/Catalog.h | 55 +------------- + poppler/FileSpec.cc | 128 + ++++++++++++++++++++++++++++++++ + poppler/FileSpec.h | 51 ++++++++++++- + qt4/src/poppler-embeddedfile-private.h | 6 +- + qt4/src/poppler-embeddedfile.cc | 34 +++++---- + qt4/src/poppler-page.cc | 5 +- + qt4/src/poppler-private.h | 4 +- + qt4/tests/check_attachments.cpp | 12 +-- + 16 files changed, 284 insertions(+), 232 deletions(-) + +commit 74f9befddd4b5848c4af0c1b2848a1322f8cd0a2 +Author: Pino Toscano <pino@kde.org> +Date: Wed May 25 16:46:15 2011 +0200 + + [qt4] Page needs to be a friend of EmbeddedFile, too + + qt4/src/poppler-qt4.h | 1 + + 1 file changed, 1 insertion(+) + +commit 74853614d617486b7b62e9c08be39a6e58bc7d9b +Author: Pino Toscano <pino@kde.org> +Date: Wed May 25 16:40:49 2011 +0200 + + update copyrights + + qt4/src/poppler-embeddedfile-private.h | 2 +- + qt4/src/poppler-embeddedfile.cc | 2 +- + qt4/src/poppler-qt4.h | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit e6b2dec502c02f9fbaed480f227cf7145249a98e +Author: Pino Toscano <pino@kde.org> +Date: Wed May 25 16:39:09 2011 +0200 + + [qt4] one more usage of the new EmbeddedFile ctor + + followup of a264e5385b2d0fee5126b3d0e57d42d34cafa45d + + qt4/src/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a264e5385b2d0fee5126b3d0e57d42d34cafa45d +Author: Pino Toscano <pino@kde.org> +Date: Wed May 25 16:12:02 2011 +0200 + + [qt4] create EmbeddedFile by EmbeddedFileData only + + - create the private class and pass it to the EmbeddedFile ctor, + reducing the amount of poppler code API exposed to the outside + - turn the old private EmbeddedFile(EmbFile*) ctor in a death machine + + qt4/src/poppler-embeddedfile-private.h | 3 +++ + qt4/src/poppler-embeddedfile.cc | 21 ++++++++++++++++++--- + qt4/src/poppler-private.h | 3 ++- + qt4/src/poppler-qt4.h | 2 ++ + 4 files changed, 25 insertions(+), 4 deletions(-) + +commit 232bfa1c59013637fd7e858e22194becb636ad21 +Author: Pino Toscano <pino@kde.org> +Date: Wed May 25 15:55:48 2011 +0200 + + [Qt4] split EmbeddedFileData in an own file + + qt4/src/poppler-embeddedfile-private.h | 37 + ++++++++++++++++++++++++++++++++ + qt4/src/poppler-embeddedfile.cc | 7 +----- + 2 files changed, 38 insertions(+), 6 deletions(-) + +commit a7242b78b3c9a64cf38ac150e6a914d7abce3355 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 7 11:10:11 2011 +0100 + + Do not free a shallow copy of an object we'll free later + + Make sure we have our own copy we can free + Fixes KDE BUG #268816 + (cherry picked from commit dab9cdf795d6caead555326958e86e844ace067b) + + poppler/Catalog.cc | 12 +++++------- + poppler/Catalog.h | 2 +- + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit 4db2452b3d345d9531987998e6b5532a59137e1d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 6 14:57:51 2011 +0200 + + glib: Add poppler_document_get_n_attachments() + + glib/poppler-document.cc | 34 + ++++++++++++++++++++++++---------- + glib/poppler-document.h | 1 + + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 26 insertions(+), 10 deletions(-) + +commit 3e3284de3fe1916d7f8161ede7bf49c76d01f303 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 6 14:49:05 2011 +0200 + + glib: Update gtk-doc.make + + gtk-doc.make | 151 + +++++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 98 insertions(+), 53 deletions(-) + +commit 9a77bd7706a08d9aeabe600e3500c14493ac8519 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 6 14:48:38 2011 +0200 + + glib-demo: Add missing permission flags to info demo + + glib/demo/info.cc | 39 ++++++++++++++++++++++++++++++++++++--- + 1 file changed, 36 insertions(+), 3 deletions(-) + +commit 091c155f8a7bc79da84cd21877be389de1f2b1a3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 6 14:47:36 2011 +0200 + + glib: Add missing permissions flags to PopplerPermissions + + glib/poppler-document.cc | 6 ++++++ + glib/poppler-document.h | 10 +++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 632d6a40ce3a5d3d8e10bf7e93e8eb578beae907 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 3 21:54:59 2011 +0100 + + 0.17.1 + + CMakeLists.txt | 4 ++-- + NEWS | 12 ++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 18 insertions(+), 6 deletions(-) + +commit ecb136b9927a454df9360a307ccd741eaea3ca93 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 3 21:42:45 2011 +0100 + + remove unused vars + + poppler/Annot.cc | 9 ++------- + poppler/ArthurOutputDev.cc | 12 ++---------- + 2 files changed, 4 insertions(+), 17 deletions(-) + +commit ad131763640b2e27dde75c42b514386284b6a60d +Author: Pino Toscano <pino@kde.org> +Date: Wed Apr 27 22:36:13 2011 +0200 + + [qt4/tests] turn some assignments to bool into QVERIFY checks + + qt4/tests/check_optcontent.cpp | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit be08dd69d9dd4fcb22400f2f0aea331222e88e4a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 27 20:45:36 2011 +0100 + + update copyright years + (cherry picked from commit 2fbd493197309de5700f71f09967c9d23add88d3) + + poppler/Annot.cc | 1 + + utils/pdftotext.cc | 1 + + 2 files changed, 2 insertions(+) + +commit 39bcce0c8ed378aafb1019ffd1ae40330f6bb63f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 27 19:39:01 2011 +0100 + + Remove more variables that are set but then unused + + poppler/SplashOutputDev.cc | 11 +------ + utils/HtmlOutputDev.cc | 75 + +------------------------------------------- + 2 files changed, 2 insertions(+), 84 deletions(-) + +commit 6656cf657b62d626910a02dfae9b6a1eb77772dd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 27 08:46:37 2011 +0100 + + Remove unused vars + + poppler/TextOutputDev.cc | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit ce55510f4dd10dfec2fc5b1c211c4a546c6ebc98 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 27 08:42:34 2011 +0100 + + Remove unused vars + + splash/Splash.cc | 5 ++--- + splash/SplashFTFontEngine.cc | 4 +--- + splash/SplashXPath.cc | 6 ++---- + 3 files changed, 5 insertions(+), 10 deletions(-) + +commit 49d199fd1ea14383638739d95d019adb33b17768 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 27 08:38:17 2011 +0100 + + Fix page_transition::operator= + + cpp/poppler-page-transition.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 807c1df2bf79c7c6378390b41dc230d80533ae3f +Author: Tom Gleason <tom@buildadam.com> +Date: Tue Apr 26 17:06:07 2011 +0100 + + bbox coordinates are relative to MediaBox size, not CropBox size + + utils/pdftotext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 813f41367a681702ae7a155d5c2f3195124a9096 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 3 20:40:15 2011 +0200 + + forms: fix mem leak in case of error + + poppler/Form.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 722baf8baf42e2c7a49e1560aae5235677d1ddee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 3 20:17:57 2011 +0200 + + forms: check form field is actually terminal before creating the + widget + + poppler/Form.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 5f6f7fc569d1c891956a3c37b3e328504635ab33 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 3 15:06:45 2011 +0100 + + Properly initialize pageObjectNum to 0 + + Bug 35925 + + poppler/Hints.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit d6786edc2549164214342a50782b72c2fd904b63 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 3 13:11:18 2011 +0200 + + forms: Remove unused parameter + + poppler/Form.cc | 2 +- + poppler/Form.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 62692ff381f3b7907b330bfc2019416ed058ea46 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 3 13:01:42 2011 +0200 + + forms: rework the way form fields tree is built + + Now we build the tree as described by the doc, without ignoring + container fields and always creating a child widget for composed + (field + + annot) dictionaries. The way check and radio buttons are set + has been + reworked too, since now it's possible to have a set of buttons where + children are not widgets, but form fields with a child widget. + + poppler/Annot.cc | 4 +- + poppler/Form.cc | 237 + +++++++++++++++++++++++++++++------------------------- + poppler/Form.h | 17 ++-- + 3 files changed, 137 insertions(+), 121 deletions(-) + +commit a6802301d9c3ab8bf68bd8821f562f8ecced8491 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 28 17:42:37 2011 +0200 + + forms: Add debug methods to print the forms tree + + poppler/Form.cc | 78 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Form.h | 25 ++++++++++++++++++ + 2 files changed, 103 insertions(+) + +commit 46f87da04700cdd1afa634f9c554e376f6f6f752 +Author: José Aliste <jaliste@src.gnome.org> +Date: Thu Mar 31 08:09:41 2011 -0400 + + Fix a memleak in AnnotScreen::initialize + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit b64178eaa5dd01f914649d6faa870fa140ddaf9b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 30 15:17:54 2011 +0200 + + glib: docs: Add PopplerActionJavascript to poppler-sections.txt + + glib/reference/poppler-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 3d777181ddee8f7ab2cc9e4684879cb5b52b065c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 30 15:16:04 2011 +0200 + + glib: Use Javascript instead of JavaScript for consistency + + glib/poppler-action.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c4774fecfe3d523f32d5980f50e31daa798c9692 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 30 15:08:59 2011 +0200 + + glib-demo: show javascript actions in actions view + + glib/demo/utils.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +commit 68bbbe1a3f68d242b35027ae41f5751b02a2a700 +Author: José Aliste <jaliste@src.gnome.org> +Date: Tue Mar 29 04:56:37 2011 -0400 + + glib: add JavaScript actions + + glib/poppler-action.cc | 24 ++++++++++++++++++++++++ + glib/poppler-action.h | 14 +++++++++++++- + 2 files changed, 37 insertions(+), 1 deletion(-) + +commit 3dd934088a06f246718382601030c9b093d04160 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 30 00:03:58 2011 +0100 + + Need to create the globalParams + + qt4/tests/check_optcontent.cpp | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ce0d4278a32b3ba19c2002ed0c481c58b1854d59 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:47:33 2011 +0100 + + Long gone + + Makefile.am | 2 -- + 1 file changed, 2 deletions(-) + +commit 12337026533aa59bb66022ce8a119f37aafd4fad +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:40:57 2011 +0100 + + increase sonames + + CMakeLists.txt | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +commit a6e613b01698c6b38deff5248fcf7c0b17d041c3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:40:38 2011 +0100 + + more typos + + NEWS | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e3ee037ede67212836be158b935deb7ea974b7f7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:38:24 2011 +0100 + + typo + + NEWS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8bcd94964f0af17a3f5b6edf71127df3daa00b1a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:30:30 2011 +0100 + + typo + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a05b9dacbe5dbd4337fdbb3e7d7d364ad5fbaeab +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:28:49 2011 +0100 + + 0.17.0 version number + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 4637b737b4735c70017b46a3ed6c0ee069c02c9b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 23:28:41 2011 +0100 + + 0.17.0 news + + NEWS | 108 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 108 insertions(+) + +commit a55cc5d9c67ede1d96f6e5a58179ddd9f563c53f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 29 22:51:40 2011 +0100 + + Update years + + poppler/Catalog.cc | 2 +- + poppler/Catalog.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit d96efb6c1af621be78e998ba1a228022c3c076fc +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 29 11:13:03 2011 +0200 + + fix comment + + poppler/ViewerPreferences.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 74ec81d66d4d5bc45cccc4aa8794df1c517f2d74 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 29 11:07:36 2011 +0200 + + viewer preferences: read PrintScaling and Duplex + + poppler/ViewerPreferences.cc | 24 ++++++++++++++++++++++++ + poppler/ViewerPreferences.h | 14 ++++++++++++++ + 2 files changed, 38 insertions(+) + +commit b41bcd484dd7a93a339270926c57caa524059d8f +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 29 10:58:46 2011 +0200 + + free the viewerPreferences Object + + poppler/Catalog.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 1dd88d0b6b7cbfda76e81902a351c89457a061a8 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 29 09:58:10 2011 +0200 + + read the ViewerPreferences dict once, and construct ViewerPreferences + on demand + + this way it is possible to know whether the ViewerPreferences + dictionary is present in the Catalog + + poppler/Catalog.cc | 24 +++++++++--------------- + poppler/Catalog.h | 3 ++- + 2 files changed, 11 insertions(+), 16 deletions(-) + +commit f10b0b8c88a7df83ada09f32b6cb6fd930fcb748 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 29 09:57:46 2011 +0200 + + assume the prefDict is not null + + poppler/ViewerPreferences.cc | 4 ---- + 1 file changed, 4 deletions(-) + +commit d4a5ea45057cad531a8979cf9861ac05cdd56613 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 29 09:54:22 2011 +0200 + + fix variable name for DisplayDocTitle + + poppler/ViewerPreferences.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cf84a05ae524aa9b266463cc23cccc3860ff1ba3 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 28 23:18:02 2011 +0200 + + viewer preferences: read NonFullScreenPageMode and Direction + + poppler/ViewerPreferences.cc | 26 ++++++++++++++++++++++++++ + poppler/ViewerPreferences.h | 15 +++++++++++++++ + 2 files changed, 41 insertions(+) + +commit 460253a6705a227ff7c36e9c31cceb93cce4d78b +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 28 22:37:54 2011 +0200 + + read some boolean viewer preferences + + - HideToolbar + - HideMenubar + - HideWindowUI + - FitWindow + - CenterWindow + - DisplayDocTitle + + poppler/ViewerPreferences.cc | 41 + +++++++++++++++++++++++++++++++++++++++++ + poppler/ViewerPreferences.h | 13 +++++++++++++ + 2 files changed, 54 insertions(+) + +commit 9fa9ac3546674120532bb512b82af6471cbebf01 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 28 19:58:16 2011 +0200 + + add skeleton for ViewerPreferences + + a small class for handling the ViewerPreferences dictionary of + a Catalog, + created on demand and in any occasion (so defaults are in one + place only) + + CMakeLists.txt | 2 ++ + poppler/Catalog.cc | 23 +++++++++++++++++++++++ + poppler/Catalog.h | 4 ++++ + poppler/Makefile.am | 2 ++ + poppler/ViewerPreferences.cc | 30 ++++++++++++++++++++++++++++++ + poppler/ViewerPreferences.h | 34 ++++++++++++++++++++++++++++++++++ + 6 files changed, 95 insertions(+) + +commit c6081f0bf00d7dcdfa1d09e91e4c9a1fe5a54ad6 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 28 19:55:00 2011 +0200 + + delete the temporary buffers created by pdfDocEncodingToUTF16() + + poppler/Form.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit d94d5056d5570e2f5cb578736eba12317ea63fa4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 28 18:20:31 2011 +0200 + + glib-demo: show the activation action of form fields if there's one + + glib/demo/forms.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit ba0f36b76d0c2fd4ef39f3013fc125a53747c03f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 28 18:17:52 2011 +0200 + + glib: Add poppler_form_field_get_action() + + Fixes bug #33174. + + glib/poppler-form-field.cc | 34 + ++++++++++++++++++++++++++++++++++ + glib/poppler-form-field.h | 1 + + glib/poppler-private.h | 1 + + glib/reference/poppler-sections.txt | 1 + + 4 files changed, 37 insertions(+) + +commit ae5b9cf884ce38dde409c3e5b0f6c46f7d6327d2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 28 17:43:53 2011 +0200 + + Revert "Patch for embedding videos in to the pdf" + + This reverts commit 66575c990f379871e4b796befc899de178332670. + + It introduces new API to glib frontend that is wrong and will be + changed soon. + + glib/poppler-annot.cc | 33 ----- + glib/poppler-annot.h | 5 - + poppler/Annot.cc | 377 + ------------------------------------------------- + poppler/Annot.h | 2 - + 4 files changed, 417 deletions(-) + +commit b7edd4c93539585652961ecf2db9c4462415c8bc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 27 12:31:19 2011 +0200 + + annot: Always create appearance streams when NeedAppearances is true + + Fixes regression in document example_054.pdf + + poppler/Annot.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e9350899e77c28452c48b56349ad7758b3fd47ba +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 24 20:09:18 2011 +0000 + + Introduce splash-friendly getRGBLine functions + + So it does not need to pack and unpack the color again and again + + poppler/GfxState.cc | 248 + +++++++++++++++++++++++++++++++++++++++++--- + poppler/GfxState.h | 22 +++- + poppler/SplashOutputDev.cc | 43 ++------ + 3 files changed, 265 insertions(+), 48 deletions(-) + +commit 7b08795a9541e9fa01836b4c7fd63f6fe295ad80 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 24 12:16:07 2011 +0100 + + glib: Add g_return macros to make sure index is correct in form + field choice methods + + glib/poppler-form-field.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit f1102fccd2899bc7f97414b1e2a295c59f03da22 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 24 12:15:30 2011 +0100 + + glib-demo: Fix a crash when a choice form field has no items selected + + glib/demo/forms.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b3971ee6bca6b14b75f046c831a31ac1e5e3241e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 22 22:08:27 2011 +0000 + + kill this TODO, n is too small + + poppler/SplashOutputDev.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1064d75817401fe24f728c189b450e9e906beb56 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 22 20:43:05 2011 +0000 + + kill unmaintained abiword backend + + CMakeLists.txt | 16 - + configure.ac | 16 - + poppler/ABWOutputDev.cc | 1179 + ----------------------------------------------- + poppler/ABWOutputDev.h | 141 ------ + poppler/Makefile.am | 17 - + utils/CMakeLists.txt | 10 - + utils/Makefile.am | 18 +- + utils/pdftoabw.cc | 201 -------- + 8 files changed, 2 insertions(+), 1596 deletions(-) + +commit abf167af8b15e5f3b510275ce619e6fdb42edd40 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Mon Mar 21 21:34:46 2011 +0000 + + Implement tiling/patterns in SplashOutputDev + + Fixes bug 13518 + + poppler/CairoOutputDev.cc | 5 +- + poppler/CairoOutputDev.h | 10 +- + poppler/Gfx.cc | 6 +- + poppler/OutputDev.h | 6 +- + poppler/PSOutputDev.cc | 8 +- + poppler/PSOutputDev.h | 6 +- + poppler/PreScanOutputDev.cc | 22 +++- + poppler/PreScanOutputDev.h | 16 ++- + poppler/SplashOutputDev.cc | 265 + +++++++++++++++++++++++++++++++++++++++++++ + poppler/SplashOutputDev.h | 12 ++ + 10 files changed, 334 insertions(+), 22 deletions(-) + +commit 66575c990f379871e4b796befc899de178332670 +Author: Srinivas Adicherla <srinivas.adicherla@gmail.com> +Date: Thu Mar 17 20:14:05 2011 +0000 + + Patch for embedding videos in to the pdf + + glib/poppler-annot.cc | 33 +++++ + glib/poppler-annot.h | 5 + + poppler/Annot.cc | 377 + +++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 + + 4 files changed, 417 insertions(+) + +commit ec1917968d2f1c7a00772a0829b3fcc6957d8f3c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 14 00:13:26 2011 +0000 + + Only build gtk-test if we have to build gtk-test + + test/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1acbb01e72a22f70f00dc058ff206e3bc05bc0ab +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 13 14:49:48 2011 +0000 + + (C) years + + poppler/CachedFile.cc | 2 +- + poppler/CurlCachedFile.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit bc8aeb269aa92406081f749064ceff75bb3145e7 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Mar 12 23:17:59 2011 +0100 + + Check response code of libcurl call + + poppler/CachedFile.cc | 8 +++++++- + poppler/CurlCachedFile.cc | 12 +++++++++--- + 2 files changed, 16 insertions(+), 4 deletions(-) + +commit 0268cedee5b460835a4747d0ea41bbe12269310d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 12 15:24:30 2011 +0100 + + cairo: Fix typo + + poppler/CairoFontEngine.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5aa369e68e5c9f14efc888c7b26da06aa8bd2a78 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 12 13:47:34 2011 +0000 + + Remove unused variable + + poppler/CurlCachedFile.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit c0dffbe28f91b30b36310ab0b9a9b948610550ae +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 12 12:15:58 2011 +0100 + + update copyright years + + cpp/poppler-document-private.h | 2 +- + cpp/poppler-document.cpp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit b8fab173ffdd1e62a34b530228d08bc5ec6725ac +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 12 12:13:05 2011 +0100 + + [cpp] init the globalParams early in the document loading + + introduce a small RAII class to init/deinit the globalParams, and + make document_private inherit from it + + cpp/poppler-document-private.h | 17 ++++++++----- + cpp/poppler-document.cpp | 52 + +++++++++++++++++++++------------------- + 2 files changed, 39 insertions(+), 30 deletions(-) + +commit a97a54cb22def2a9fc381fb81842dad9e5c3931f +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 12 12:12:11 2011 +0100 + + forms: delete tmp_str after being converted to GooString + + poppler/Form.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 9671fe07f8c9ade956742cb141b99518c3b12bad +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 11 00:05:52 2011 +0000 + + getForm can return NULL, do not crash if that happens + + poppler/Annot.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit bd32672899f5ca4509ec9311de8092d14bec8ab1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 10 23:33:15 2011 +0000 + + update copyright years + + poppler/Catalog.cc | 2 +- + qt4/src/poppler-form.cc | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 841f3bbca37015ec2c58d7b85a73cef5681294f8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 10 23:30:51 2011 +0000 + + Do not infinite loop + + poppler/Form.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f2fcafdc2b982d9bbed3c01bc7d45c8bd0603f19 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 10 23:27:41 2011 +0000 + + Create the globalParams before the pdfdoc + + qt4/src/poppler-private.cc | 5 +---- + qt4/src/poppler-private.h | 12 ++++++++---- + 2 files changed, 9 insertions(+), 8 deletions(-) + +commit f956b03604b195623ab034a06942a39547adf905 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 10 00:01:18 2011 +0000 + + compile + + qt4/src/poppler-form.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f0ec3bedc5490aa35e54563019fcf2c3f8b7647d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 20:54:15 2011 +0100 + + forms: Remove unused method FormWidget::updateField() + + poppler/Form.cc | 22 ---------------------- + poppler/Form.h | 2 -- + 2 files changed, 24 deletions(-) + +commit 93c25e100ae2564b9a866b95bed16d2fac619bd7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 20:49:32 2011 +0100 + + forms: Rename FormField::createActivationAction() to + FormField::getActivationAction() + + And use the existing action from the AnnotWidget instead of creating a + new one. + + poppler/Form.cc | 11 ++--------- + poppler/Form.h | 2 +- + qt4/src/poppler-form.cc | 3 +-- + 3 files changed, 4 insertions(+), 12 deletions(-) + +commit 59fb0489bfabfd8acccafdcd0361ce005664962a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 20:19:24 2011 +0100 + + annots: Check whether we need to create an appearance stream in + AnnotWidget::draw() + + And never modify the AP entry since it breaks check and radio buttons + that doesn't have an appearance for the Off state. + + poppler/Annot.cc | 79 + +++++++++--------------------------------------------- + poppler/Annot.h | 1 - + 2 files changed, 13 insertions(+), 67 deletions(-) + +commit f3b00ef51ceef6d9b7a1aa7e0f19249abf8ca6f3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 18:19:12 2011 +0100 + + annots: Add Annot::setAppearanceState() and use it from FormWidget + + This method not only updates the current appearance state, but + also the + appearance stream corresponding to the new state. + + poppler/Annot.cc | 43 ++++++++++++++++++++++++++++++++++++------- + poppler/Annot.h | 2 ++ + poppler/Form.cc | 7 +++---- + 3 files changed, 41 insertions(+), 11 deletions(-) + +commit d59561212253302d4dcb23392bb8306b8e5c68d1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 17:35:28 2011 +0100 + + forms: Make FormWidget use a real widget annotation instead of + duplicating code + + When creating annotations, if it's a widget annotation, look first + whether it has already been created by a FormWidget and reuse + it instead + of duplicating it. + + poppler/Annot.cc | 42 +++++++++++++-------- + poppler/Annot.h | 2 +- + poppler/Catalog.cc | 2 +- + poppler/Form.cc | 107 + ++++++++++++++++++++++++---------------------------- + poppler/Form.h | 23 ++++++----- + 5 files changed, 89 insertions(+), 87 deletions(-) + +commit 2dd7e1ba09d4501adf9d10ab4cb8ee003cace74a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 10:25:00 2011 +0100 + + forms: Move modified flag from FormWidget to FormField + + poppler/Form.cc | 16 ++++++++-------- + poppler/Form.h | 6 ++++-- + 2 files changed, 12 insertions(+), 10 deletions(-) + +commit b04f03be7e43e309af5f164ef71788e7b8915841 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 9 10:17:57 2011 +0100 + + forms: Move field names handling from FormWidget to FormField + + poppler/Form.cc | 149 + ++++++++++++++++++++++++++++++------------------------- + poppler/Form.h | 20 +++++--- + 2 files changed, 95 insertions(+), 74 deletions(-) + +commit abe1e0d5a37bcdb4376901306d3adccfb33ff3b4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Mar 8 21:39:00 2011 +0100 + + annots: Make sure no border is drawn for invalid border arrays + + Fixes regression on ClassSchedule_2091_ENGL.pdf + + poppler/Annot.cc | 8 ++++++-- + poppler/Annot.h | 2 +- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 14d145371e86ccb92f09b1ca750ced52171b2885 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Mar 8 20:14:57 2011 +0100 + + forms: Remove loadDefaults method + + Moving the code to initialize form field stuff to form field + constructors and widget stuff to form widget constructors. Clean up an + simplify the code. + + poppler/Form.cc | 227 + +++++++++++++++++++++---------------------------------- + poppler/Form.h | 21 ++--- + 2 files changed, 91 insertions(+), 157 deletions(-) + +commit 0585d7820455c93fe5b732b7a9a20d423df47075 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Mar 8 15:36:45 2011 +0100 + + forms: Handle field values (V entry) by field objects + + Rather than AnnotWidget or FormWidget, and use the form field object + from AnnotWidget to get the values. + + poppler/Annot.cc | 52 ++++--- + poppler/Form.cc | 400 + ++++++++++++++++++++++++++---------------------------- + poppler/Form.h | 21 +-- + 3 files changed, 230 insertions(+), 243 deletions(-) + +commit dc100eb9080fb58164fc94c86bfb1728cecd21c3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 7 20:14:27 2011 +0100 + + annots: Use the field object to get MaxLen instead of parsing the + field dict + + poppler/Annot.cc | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 7149634f184dc3f07f2a70c296aac207ef24952c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 7 19:55:45 2011 +0100 + + forms: Parse the default resources dictionary in Form + + And use it in AnnotWidget instead of parsing the dictionary again. + + poppler/Annot.cc | 65 + +++++++++++++++++++++--------------------------------- + poppler/Annot.h | 12 +++++----- + poppler/Form.cc | 16 ++++++++++++++ + poppler/Form.h | 5 +++++ + 4 files changed, 52 insertions(+), 46 deletions(-) + +commit 2e73f17975811177c0b3c16b8bd97c7eb912bc44 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 7 18:41:48 2011 +0100 + + forms: Parse field variable text entries (DA, Q) in FormField() + + And use them from AnnotWidget instead of parsing the field dictionary + again. + + poppler/Annot.cc | 28 +++++----------------------- + poppler/Form.cc | 17 +++++++++++++++++ + poppler/Form.h | 9 +++++++++ + 3 files changed, 31 insertions(+), 23 deletions(-) + +commit 8677a34911563a712b2dcf0b6e411cee0bad9c44 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 7 18:24:07 2011 +0100 + + forms: Parse default variable text entries (DA, Q) on Form + construction + + And use them from AnnotWidget instead of parsing the acroForm + dictionary + again. + + poppler/Annot.cc | 99 + ++++++++++++++++++++++++++---------------------------- + poppler/Form.cc | 11 ++++++ + poppler/Form.h | 12 +++++++ + 3 files changed, 70 insertions(+), 52 deletions(-) + +commit 41420bfd88685d9b1ac44dc7444ea3abee92097c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 7 09:18:25 2011 +0100 + + annots: Only parse the dash array for dashed borders + + poppler/Annot.cc | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit c198a3f83d8508ddaf84564871d9202ffba8096c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 6 17:52:01 2011 +0100 + + annots: Use the field object to get the top index of a form field + choice + + Instead of parsing the field dictionary again. + + poppler/Annot.cc | 14 ++------------ + poppler/Annot.h | 1 - + 2 files changed, 2 insertions(+), 13 deletions(-) + +commit 5cf803ec181dbf1112f67b4f4a9c77b88d102e3b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 6 17:47:18 2011 +0100 + + forms: Add FormFieldChoice::getTopIndex() + + poppler/Form.cc | 5 +++++ + poppler/Form.h | 5 ++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 1248f59e2045749ece1f5a5e579b866b8330a752 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 6 17:41:33 2011 +0100 + + annots: Draw widget background using the existing appearance + characteristics + + Instead of parsing the appearance characteristics dictionary again + + poppler/Annot.cc | 23 +++++++---------------- + 1 file changed, 7 insertions(+), 16 deletions(-) + +commit dc249ad4529997001ae1f96dcfd7351766ca8e8d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 6 17:34:33 2011 +0100 + + annots: Factor out generateFieldAppearance() + + Adding methods to render every form field type and using the field + object when possible instead of parsing the field dictionary again. + + poppler/Annot.cc | 312 + +++++++++++++++++++++++------------------------------- + poppler/Annot.h | 8 +- + 2 files changed, 138 insertions(+), 182 deletions(-) + +commit f98b3540db731026e0febf1f010548f0f0ef9142 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 6 15:57:22 2011 +0100 + + annots: Move code to draw the border of an AnnotWidget to a new method + + And use the field object instead of parsing the field dictionary + again. + + poppler/Annot.cc | 242 + +++++++++++++++++++++++++++--------------------------- + poppler/Annot.h | 3 + + 2 files changed, 124 insertions(+), 121 deletions(-) + +commit 9854f3173f994bbe3f57d33bd1d0e045833859c2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 6 15:56:06 2011 +0100 + + annots: Add AnnotColor::adjustColor() to be able to adjust an + existing AnnotColor + + poppler/Annot.cc | 7 +++++++ + poppler/Annot.h | 2 ++ + 2 files changed, 9 insertions(+) + +commit 2bf82f27bd9c8f97e5484ea97be661f65221163d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 5 15:30:01 2011 +0100 + + annots: Remove unused class AnnotBorderStyle + + poppler/Annot.cc | 22 ---------------------- + poppler/Annot.h | 36 ------------------------------------ + 2 files changed, 58 deletions(-) + +commit 128dcaf282f418d8c45cea4df6ad4d3167b3e39c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 5 13:12:49 2011 +0100 + + annots: Add AnnotBorder::parseDashArray() to parse dash arrays + + The code was duplicated in AnnotBorderArray and AnnotBorderBS + + poppler/Annot.cc | 91 + +++++++++++++++++++----------------------------------- + poppler/Annot.h | 4 ++- + 2 files changed, 34 insertions(+), 61 deletions(-) + +commit ec2643d311e0ce55f0ff5309c0c420140d053a50 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 1 19:50:55 2011 +0000 + + fix copyright years + + poppler/Annot.cc | 2 +- + poppler/Annot.h | 2 +- + poppler/ArthurOutputDev.cc | 2 +- + poppler/ArthurOutputDev.h | 2 +- + poppler/FontInfo.cc | 1 + + poppler/Form.cc | 4 ++-- + poppler/Form.h | 3 ++- + poppler/GlobalParams.cc | 1 + + poppler/GlobalParams.h | 1 + + poppler/Link.cc | 2 +- + poppler/Link.h | 2 +- + poppler/OutputDev.h | 2 +- + poppler/PDFDoc.cc | 2 +- + poppler/Page.cc | 2 +- + poppler/Page.h | 2 +- + poppler/TextOutputDev.cc | 2 +- + poppler/TextOutputDev.h | 2 +- + qt4/src/poppler-form.cc | 2 +- + qt4/src/poppler-link-extractor-private.h | 2 +- + qt4/src/poppler-link-extractor.cc | 2 +- + qt4/src/poppler-page.cc | 2 +- + qt4/src/poppler-private.h | 2 +- + utils/HtmlOutputDev.cc | 2 +- + utils/HtmlOutputDev.h | 4 ++-- + 24 files changed, 27 insertions(+), 23 deletions(-) + +commit 900974ebfbe6ab7ae21ed151ff79f9578d2bdae2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 1 19:42:22 2011 +0000 + + Fix years + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit c804db4d8261274b013f8c340abfc921c77bb3cf +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 1 19:22:31 2011 +0100 + + move the fontconfig.h inclusion from GlobalParams.h to GlobalParams.cc + + this avoids a dependency on the fontconfig headers to the users of + the core + + poppler/GlobalParams.cc | 4 ++++ + poppler/GlobalParams.h | 3 --- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 2d77c7f9c41f1121354413bcdc3beded35a247f9 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 1 16:51:04 2011 +0100 + + create the GooString on stack, not in heap + + poppler/Annot.cc | 5 ++--- + poppler/Form.cc | 5 ++--- + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit 5dc2ef0e27ac48c81739cdfe8e8070ebbc410c87 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 1 16:39:36 2011 +0100 + + annots: avoid temporary GooString's just for comparisons, just + use strcmp + + other than reducing few GooString allocations, strcmp should be much + faster than GooString::cmp + + poppler/Annot.cc | 128 + ++++++++++++++++++++++++------------------------------ + 1 file changed, 56 insertions(+), 72 deletions(-) + +commit 535e48ab764ee4e377451ddd032044b51b842c4a +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 1 16:07:34 2011 +0100 + + [qt4] ignore "Widget" annotations + + they usually are forms or something else we do not support, so do + not complain about them for now + + qt4/src/poppler-page.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f0e5c36e7f1c5d0f0f51e3a6a6acd6c423f86df7 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 1 16:02:54 2011 +0100 + + annots: avoid a temporary GooString just for comparisons, just + use strcmp + + other than reducing few GooString allocations, strcmp should be much + faster than GooString::cmp + + poppler/Annot.cc | 54 + ++++++++++++++++++++++++++---------------------------- + 1 file changed, 26 insertions(+), 28 deletions(-) + +commit 58a3b83a8fbd8b13eb98c4f677f4ed19b6ae44cd +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 1 15:35:45 2011 +0100 + + fix appendAnnot() invocation on annotations reading + + 1) check that the annot is actually a non-NULL pointer (otherwise + doing anything else is pointless) + 2) call appendAnnot() only if the annotation isOk() (that will + increase the annot refcount), but always decrement the refcount + (so valid annotation will have it at 1, while invalid will be deleted) + + poppler/Annot.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 664865a2ddca9c20ac36a41aef52ebf12eab838d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Mar 1 10:56:40 2011 +0100 + + Merge Link and AnnotLink code + + Annotations now belong to the Page and are created only once on + demand. + Annots are now ref counted and Links is a list of AnnotLink objects, + Link object has been removed. The AnnotLink API is mostly the + same than + Link and frontends APIs are not affected. + Qt4 changes made by Pino Toscano. + + glib/poppler-document.cc | 2 +- + glib/poppler-page.cc | 29 ++++--- + glib/poppler-private.h | 1 - + poppler/Annot.cc | 79 ++++++++++++------- + poppler/Annot.h | 24 ++++-- + poppler/ArthurOutputDev.cc | 4 - + poppler/ArthurOutputDev.h | 3 - + poppler/CairoOutputDev.cc | 3 - + poppler/CairoOutputDev.h | 6 -- + poppler/FontInfo.cc | 4 +- + poppler/Form.cc | 36 ++++----- + poppler/Form.h | 5 +- + poppler/Link.cc | 124 + +++++------------------------- + poppler/Link.h | 43 ++--------- + poppler/OutputDev.h | 4 +- + poppler/PDFDoc.cc | 4 +- + poppler/Page.cc | 63 +++++++-------- + poppler/Page.h | 11 +-- + poppler/TextOutputDev.cc | 9 ++- + poppler/TextOutputDev.h | 10 +-- + qt4/src/poppler-link-extractor-private.h | 2 +- + qt4/src/poppler-link-extractor.cc | 3 +- + qt4/src/poppler-page.cc | 12 ++- + utils/HtmlOutputDev.cc | 7 +- + utils/HtmlOutputDev.h | 4 +- + 25 files changed, 188 insertions(+), 304 deletions(-) + +commit 1f6573e949aaba0eb0a4c2f9cd73d7ad45ba67be +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 21:53:32 2011 +0100 + + small fixes to the pdftohtml manpage + + - capitalize HTML, PDF, XML, PNG + - dont -> do not + - fix UTF-8 character + - fix hypens used as minus + + utils/pdftohtml.1 | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit e927384897595f1bda5f7e41b552602f9cc8ed95 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 16:39:59 2011 +0100 + + [qt4] fix caption of push button fields + + instead of asking the 'onStr' of the underlying form widget, + take (if available) the 'MK' entry, i.e. the appearance + characteristics dictionary, + and use the normal caption of that + + qt4/src/poppler-form.cc | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +commit 5b24ee2c934feea1b7d46c8ec423d1c547258be2 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 16:24:22 2011 +0100 + + annots: 'CA', 'RC' and 'AC' are strings, not names + + poppler/Annot.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit e64f6cb23e9a564b3f80daea9abcfe8bb29189eb +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 15:22:32 2011 +0100 + + make getOnStr() return the GooString* instead of its char* + + ... and modify its use accordingly + this way it is easier to check for a numm onStr, without the risk + of dereferencing a NULL pointer + + poppler/Form.cc | 6 +++--- + poppler/Form.h | 2 +- + qt4/src/poppler-form.cc | 7 ++----- + 3 files changed, 6 insertions(+), 9 deletions(-) + +commit f9c978fc2ab8a1f901f2136ae95deb9d41076155 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 14:39:52 2011 +0100 + + [qt4] directly use the dict + + qt4/src/poppler-form.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 071966e48577c515b17a424baeae85ae4fc80a20 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 14:21:11 2011 +0100 + + [qt4] move textAlignment() as a private function + + qt4/src/poppler-form.cc | 33 +++++++++++++++++++++++++++++++-- + qt4/src/poppler-private.h | 25 ------------------------- + 2 files changed, 31 insertions(+), 27 deletions(-) + +commit adc236771f11eeb4197064747836e8ed3fbfeba9 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 14:13:50 2011 +0100 + + [qt4] use FormWidget::getAlternateUiName() + + ... instead of read the value on our own + + qt4/src/poppler-form.cc | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 9f111483cf6196dedf3cee380c3e5224776203ea +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 14:12:16 2011 +0100 + + forms: read the TU field as alternateUiName + + poppler/Form.cc | 8 ++++++++ + poppler/Form.h | 2 ++ + 2 files changed, 10 insertions(+) + +commit cfaadaa9e4a857fcea3b5a2cadacd352de6c469d +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 14:07:35 2011 +0100 + + [qt4] use FormWidget::getPartialName() + + ... instead of read the value on our own + + qt4/src/poppler-form.cc | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 2478896a0c1f6e5842f3d8b172e4cc7e6bd58cd8 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 13:24:09 2011 +0100 + + [qt4] use the new FormWidget::createActivationAction() + + qt4/src/poppler-form.cc | 13 +++---------- + 1 file changed, 3 insertions(+), 10 deletions(-) + +commit 1dcb683a5c2dd6a1de654e90a4394f65d63dc296 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 27 13:22:48 2011 +0100 + + add FormWidget::createActivationAction() + + used to get and create a new activation action object of a form widget + + poppler/Form.cc | 12 ++++++++++++ + poppler/Form.h | 3 +++ + 2 files changed, 15 insertions(+) + +commit bd4cc73e438a7d4d4a10c50c69e65b5bdc63ddf2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 27 11:04:45 2011 +0000 + + Some more missing copyrights + + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 2 +- + poppler/Gfx.cc | 2 +- + poppler/OutputDev.h | 2 +- + poppler/TextOutputDev.cc | 1 + + 5 files changed, 5 insertions(+), 4 deletions(-) + +commit 6c2ed4781d8ecfffdf24e1459aafd554b3527686 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 27 10:55:22 2011 +0000 + + Add 2011 years + + poppler/Annot.cc | 2 +- + poppler/CairoFontEngine.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit b297fb9de0779ac84d5b7ef68c792afefe598320 +Author: William Bader <williambader@hotmail.com> +Date: Sun Feb 27 01:48:55 2011 +0000 + + access the pixels directly + + Faster, bug 34005 + + splash/Splash.cc | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit de77e26759f1c33698abe248ad29b75c329a043c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 27 01:39:23 2011 +0000 + + Fix crash in some pdf + + Has to be 3 and not nComps since it's a output buffer, a the input one + Bug 34357 + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4f82a2e08cb2c930956c6b38030fa7b015a0de5a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 27 01:38:33 2011 +0000 + + Implement GfxDeviceCMYKColorSpace::getRGBLine + + poppler/GfxState.cc | 22 +++++++++++++++++++++- + poppler/GfxState.h | 12 +++++++++++- + 2 files changed, 32 insertions(+), 2 deletions(-) + +commit 4980b99214281dcab8f82b5b618aadc24de371f4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 26 14:00:33 2011 +0100 + + annots: Don't assume y1 > y3 for quad points of a highlight annotation + + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=643028 + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6ae0f8609cd66e9e124af59adefdff9d610dcd4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 26 13:23:47 2011 +0100 + + cairo: Handle font type fontCIDType2OT when creating freetype font + + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=643273 + + poppler/CairoFontEngine.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 22eb01d305ea2560d26417ca8df9c0465d4e9a82 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 26 12:17:49 2011 +0100 + + cairo: Fix a crash when rendering a document with inline images + + poppler/CairoOutputDev.cc | 28 ++++++++++++++++------------ + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 17 insertions(+), 13 deletions(-) + +commit a6599dd1fda37186b876b5b2de80be1731dd5946 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 26 11:59:03 2011 +0100 + + glib: Add some more introspection annotations + + glib/poppler-attachment.cc | 2 +- + glib/poppler-document.cc | 4 ++-- + glib/poppler-media.cc | 2 +- + glib/poppler-page.cc | 6 +++--- + 4 files changed, 7 insertions(+), 7 deletions(-) + +commit 89c66f236c85ac5a53ae12b01cdebc30e27b78d3 +Author: Peter Ward <peteraward@gmail.com> +Date: Sat Feb 26 11:39:58 2011 +0100 + + glib: Add missing "out" annotation to poppler_page_get_size() + + glib/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7a68199b342eb3f33733f7d7446ede8f94130fba +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 26 11:09:27 2011 +0100 + + cairo: Check if cairo version is == 1.11.2 to use mesh gradients api + + Cairo API has changed in 1.11.3. + + poppler/CairoOutputDev.cc | 4 ++-- + poppler/CairoOutputDev.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 97e7ab1a4eea2160f3f0847d10f6c16f2d66ef11 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Feb 25 20:33:39 2011 +0000 + + Do not ask freetype for a font of size 0x0 + + Fixes rendering bug at 34602 + + splash/SplashFTFont.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 3590a2d38082fc705040cdb31bf0b22ff12dd3e4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Feb 24 18:47:35 2011 +0000 + + Fix rendering of some substituted fonts + + More info in bug 34522 + + poppler/GfxFont.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 384753f1f9f780687bdead99a6548ef8598b898a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 21 19:19:48 2011 +0000 + + Use gfree since we allocate with gmalloc + + Bug 34512 + + goo/GooString.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d775420c3c6cb5a29ff74712d3fc210fcb4b4627 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 19 11:19:57 2011 +0000 + + Do not delete textOut twice when using -bbox + + utils/pdftotext.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit e1a56d73b066e7152ccf6ccf36206def7956cb00 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 16 00:06:45 2011 +0000 + + Lots of rendering improvements by Thomas and Andrea + + Function.cc: Stitching functions incorrectly reported 0 as output + size. + Function.cc: Remove cache from PostScriptFunction + Function.cc: Make PSStack stack allocated + GfxState.cc & GfxState.h: Abstract GfxSimpleShading, add Matrix::norm + method, add simple caching, parameter range computation + SplashOutputDev.cc & SplashOutputDev..h & Splash.cc & SplashPattern.h: + Improve splash rendering, implement radial and abstract simple + shadings + in splash + + And maybe something more, look at the + Followup Bug 32349 & Poppler: More shading fun ;-) + thread for more info + + poppler/Function.cc | 122 +-------- + poppler/Function.h | 3 +- + poppler/GfxState.cc | 634 + +++++++++++++++++++++++++++++++++++++++----- + poppler/GfxState.h | 90 +++++-- + poppler/SplashOutputDev.cc | 253 +++++++++++++++--- + poppler/SplashOutputDev.h | 67 ++++- + splash/Splash.cc | 126 ++++++--- + splash/SplashPattern.h | 7 +- + 8 files changed, 1006 insertions(+), 296 deletions(-) + +commit 675b3505f963a0110dac7f865654232cbb865ef5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 13 16:21:52 2011 +0100 + + tests: Merge splash and cairo tests into a single gtk-test tool + + With a command line option to use cairo or splash backends. + + test/CMakeLists.txt | 20 +-- + test/Makefile.am | 29 ++-- + test/gtk-cairo-test.cc | 190 ----------------------- + test/gtk-splash-test.cc | 311 ------------------------------------- + test/gtk-test.cc | 397 + +++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 412 insertions(+), 535 deletions(-) + +commit 728c022cdc1ea12aa54077d44276f9d7714930d4 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 13 13:25:51 2011 +0100 + + remove more references to the qt3 frontend + + followup of d82f98a274bfa008c218e265a080c4af7ce95131 + + Makefile.am | 3 --- + 1 file changed, 3 deletions(-) + +commit 15e5b3f16015361754fdc14da4a0dde5af887568 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 13 13:23:06 2011 +0100 + + remove more GDK-related stuff + + followup of 149b7fec472beda9d1538e0f26607c9498d504c2 + + Makefile.am | 1 - + cmake/modules/FindGDK.cmake | 22 ---------------------- + config.h.cmake | 3 --- + glib/reference/Makefile.am | 1 - + glib/reference/poppler-sections.txt | 1 - + 5 files changed, 28 deletions(-) + +commit 50aa15a0bd7100fc9b9243de1d6e6f4b59df1488 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 13 13:07:19 2011 +0100 + + remove GDK API here too + + followup of 149b7fec472beda9d1538e0f26607c9498d504c2 + + glib/poppler-features.h.cmake | 1 - + 1 file changed, 1 deletion(-) + +commit f410cd11268254b9d0422201c9860d775f73fdd8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 13 12:55:37 2011 +0100 + + gtk-splash-test: Don't use GDK deprecated API + + test/gtk-splash-test.cc | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit a0568e449061d6b6af5485e340cd6f9d3e54ef7c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 13 12:27:22 2011 +0100 + + glib: remove gdk referenes from pkg-config files + + poppler-glib-uninstalled.pc.in | 2 +- + poppler-glib.pc.cmake | 2 +- + poppler-glib.pc.in | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 149b7fec472beda9d1538e0f26607c9498d504c2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 13 11:51:57 2011 +0100 + + glib: Remove deprecated GDK API + + It removes the GDK dependency so that poppler-glib now only depends on + glib and cairo. + + CMakeLists.txt | 9 -- + configure.ac | 44 +------ + glib/CMakeLists.txt | 14 +-- + glib/Makefile.am | 8 +- + glib/poppler-features.h.in | 6 - + glib/poppler-page.cc | 296 + -------------------------------------------- + glib/poppler-page.h | 34 ----- + 7 files changed, 4 insertions(+), 407 deletions(-) + +commit a5482d64472a81206dd8d0c5bb80007f6d5bb893 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 13 11:40:23 2011 +0100 + + glib: Remove test-poppler-glib, poppler-glib-demo does the same + and more + + glib/CMakeLists.txt | 8 - + glib/Makefile.am | 14 - + glib/test-poppler-glib.cc | 657 + --------------------------------------------- + 3 files changed, 679 deletions(-) + +commit cab0cf028a192772dcb5c3f4aefa0a421e73e9e7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Feb 11 19:42:34 2011 +0000 + + Do not infinite loop in some broken files + + poppler/JBIG2Stream.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1125cc8ccf386d8e0a0679aa73614bc2cb8037b0 +Author: William Bader <williambader@hotmail.com> +Date: Tue Feb 8 20:27:16 2011 +0000 + + Allow setting the rasterization resolution + + More info at bug 34001 + + poppler/GlobalParams.cc | 15 +++++++++++++++ + poppler/GlobalParams.h | 3 +++ + poppler/PSOutputDev.cc | 7 ++++++- + utils/pdftops.1 | 6 ++++++ + utils/pdftops.cc | 6 ++++++ + 5 files changed, 36 insertions(+), 1 deletion(-) + +commit 96e169b0eca31891f3cd564365d4a2a5c6e2a2c0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 8 19:58:31 2011 +0000 + + Make really sure the uMap static pointer is valid + + It might happen you are extremely unlucky and get the same + globalParams after a new delete/creation + + qt4/src/poppler-private.cc | 51 + ++++++++++++++++++++++++++++++++++++++------ + qt4/src/poppler-private.h | 34 +++-------------------------- + 2 files changed, 47 insertions(+), 38 deletions(-) + +commit c3470145f95791167c19a438934a923eab8a93cf +Author: William Bader <williambader@hotmail.com> +Date: Tue Feb 8 19:54:48 2011 +0000 + + Add PS level1 non standard binary output option + + More info at bug 34003 + + poppler/GlobalParams.cc | 18 +++- + poppler/GlobalParams.h | 5 +- + poppler/PSOutputDev.cc | 227 + ++++++++++++++++++++++++++++++++++------------- + utils/pdftops.1 | 7 ++ + utils/pdftops.cc | 8 +- + 5 files changed, 198 insertions(+), 67 deletions(-) + +commit 37077aa475d2dee81f87daa05297b201eeb99c87 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 7 19:48:28 2011 +0000 + + Make sure tx is inside the bitmap + + Seems to be what the code tried to do, fixes crash in bug 33948 + depending on + the resolution you render it + + poppler/SplashOutputDev.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 5aa854f70c8f563efe56dafa8bd6b3cdd5c95451 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 6 13:24:35 2011 +0100 + + cairo: Use the new cairo unique id to set the surface id when printing + + Set the unique surface id when attaching jpeg images to the surface so + that cairo can reuse the mime data even when a new surface is created + with the same mime data. This reduces the size of the output file when + printing. + + poppler/CairoOutputDev.cc | 18 ++++++++++++++++-- + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 17 insertions(+), 3 deletions(-) + +commit fe7b8aa4fc78aacf3226d019db74146ceaebd63c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 2 22:35:40 2011 +0000 + + Workaround bug when converting pdf to ps with level1 + + See bug 31926 for more info + + poppler/PSOutputDev.cc | 2 +- + poppler/PreScanOutputDev.cc | 7 +++++++ + poppler/PreScanOutputDev.h | 7 +++++++ + 3 files changed, 15 insertions(+), 1 deletion(-) + +commit 5984ad081cd609f3146e0da5e22097ef073eb519 +Author: William Bader <williambader@hotmail.com> +Date: Sun Jan 30 17:02:02 2011 +0000 + + Increase precision + + Fixes some issues with pdf from bug 27482 + + poppler/PSOutputDev.cc | 200 + ++++++++++++++++++++++++------------------------ + 1 file changed, 100 insertions(+), 100 deletions(-) + +commit c60d5afbeb986c1b335357202c5f551a3c146a76 +Author: Jim Meyering <meyering@redhat.com> +Date: Mon Jan 24 15:51:20 2011 +0100 + + demo: don't use an uninitialized local variable + + * text.c (pgd_text_get_text): Before this change, when + poppler_page_get_text returned NULL, we'd use "n_recs" uninitialized. + + glib/demo/text.c | 1 + + 1 file changed, 1 insertion(+) + +commit a3bdc56e2f086444419eddfcda5d2010a9a6b5c0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jan 29 11:23:33 2011 +0100 + + glib-demo: Add a tooltip with current selected character in text demo + + To make sure that the offset of the text returned by + poppler_page_get_text() matches + the list of rectangles returned by poppler_page_get_text_layout(). + + glib/demo/text.c | 60 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 60 insertions(+) + +commit bf2d86c8db430595fb3c55edd3f6c8d289bdaeb5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 28 20:34:08 2011 +0000 + + Make sure uMap is still valid before using it + + Fixes KDE bug 264667 + + qt4/src/poppler-private.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit e6fb20d7b3bf8ea8aedc1bcd910e035059835b5f +Author: Axel Strübing <axel.struebing@freenet.de> +Date: Fri Jan 28 19:20:15 2011 +0000 + + Extract text of a pdf correctly + + See "[poppler] text extraction does not work" in the mailing list + for more info + + poppler/GfxFont.cc | 14 +++++++++++++- + poppler/GfxFont.h | 2 ++ + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 4829d36a3b005585db8c8115f7ee81a4e2384780 +Author: Simon Kellner <kellner@kit.edu> +Date: Wed Jan 26 22:59:49 2011 +0000 + + fix labelToIndex on multiple prefixes + + A PDF document can use page label prefixes, for example, to label + only inside a chapter ("A-1" .. "A-<n>", "B-1" .. "B-<m>" et cetera). + When calculating a page index for a given label, poppler would + disregard the page range for all preceding prefixes that do not + match the given prefix. + + poppler/PageLabelInfo.cc | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit e57c75fbd95ef8399b0785500f6893465bc808c3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 24 19:48:09 2011 +1030 + + cairo: Implement Type 4,5,6,7 shadings using cairo mesh gradients + + Fixes bugs #19076 and #32791. + + poppler/CairoOutputDev.cc | 139 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 12 ++++ + poppler/Gfx.cc | 10 +++- + poppler/OutputDev.h | 2 + + 4 files changed, 161 insertions(+), 2 deletions(-) + +commit 5081356fcc69012e9df95dbf1e3c36e7c1e751c4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 25 20:26:25 2011 +0000 + + Fix leak in SplashOutputDev::axialShadedFill + + poppler/SplashOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 19dc283c3af597deab297341a37495c06988948b +Author: Thomas Klausner <wiz@danbala.tuwien.ac.at> +Date: Mon Jan 24 19:05:08 2011 +0000 + + Include zlib header since we use things defined there + + goo/PNGWriter.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5056e33e01ce0f7db1a5401b7b38d30e84eedf69 +Author: Sam Liao <phyomh@gmail.com> +Date: Mon Jan 17 13:07:22 2011 +0800 + + Poppler: Fix line selection, dont check y for Line selection + + When a line is selected while the Y values of selection is + not in the y range of words, the render will render the + line with reverse color while the words does not show up. + + This fix neglect the Y vaules to make sure that the words + also displayed when line is selected. + + poppler/TextOutputDev.cc | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 88812e716c1a0c87a504118d47eb4cc6f52962fa +Author: Andreas Hartmetz <ahartmetz@gmail.com> +Date: Fri Jan 21 23:33:47 2011 +0000 + + Add Hinting API to ArthurOutputDev + + poppler/ArthurOutputDev.cc | 11 +++++++++-- + poppler/ArthurOutputDev.h | 15 ++++++++++++++- + 2 files changed, 23 insertions(+), 3 deletions(-) + +commit dc5ec4668bdfe3b6ba41f0a2e551bbc07f8839ba +Author: Andreas Hartmetz <ahartmetz@gmail.com> +Date: Fri Jan 21 23:32:50 2011 +0000 + + support slight hinting in Splash backend + + cpp/poppler-page-renderer.cpp | 2 +- + poppler/SplashOutputDev.cc | 6 +++++- + poppler/SplashOutputDev.h | 4 +++- + qt4/src/poppler-private.h | 3 ++- + qt4/src/poppler-qt4.h | 4 +++- + splash/SplashFTFont.cc | 27 ++++++++++++++++++--------- + splash/SplashFTFont.h | 2 ++ + splash/SplashFTFontEngine.cc | 10 +++++++--- + splash/SplashFTFontEngine.h | 6 ++++-- + splash/SplashFontEngine.cc | 4 +++- + splash/SplashFontEngine.h | 2 ++ + 11 files changed, 50 insertions(+), 20 deletions(-) + +commit 0c5b1bef9f3f98001cee20061b1eaf20b965c5a9 +Author: William Bader <williambader@hotmail.com> +Date: Fri Jan 21 19:01:45 2011 +0000 + + Fix rendering for some pdf with -level1sep + + Also some speed improvemensts. Bug #32365 + + poppler/PSOutputDev.cc | 207 + +++++++++++++++++++++++++++++++++++++----------- + poppler/PSOutputDev.h | 13 ++- + 2 files changed, 170 insertions(+), 50 deletions(-) + +commit 6cb8965fb8bce6da2a4460e86f592c1ea3a84a5c +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 21 18:43:21 2011 +0000 + + fix (C) years + + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 2 +- + qt4/src/poppler-private.cc | 2 +- + qt4/tests/check_strings.cpp | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 24f9c8924b2135da616386d0fa691fe790b4e7a4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 21 08:43:34 2011 +0000 + + Access the correct variable + + Fixes asert on bug 33063 + + poppler/Annot.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 07a8808c22445c421f3064da7e5227dcbf40358b +Author: Pino Toscano <pino@kde.org> +Date: Mon Jan 17 21:34:23 2011 +0100 + + fix unicodeToQString() to correctly decode the Unicode sequence + + Use a UnicodeMap to convert the sequence to UTF-8, and convert from + that to QString. + Also, ignore the last character of the Unicode sequence if it is 0x0. + + Add a couple of testcases for it. + + qt4/src/poppler-private.cc | 30 ++++++++++++++++++++++++------ + qt4/tests/check_strings.cpp | 21 +++++++++++++++++++++ + 2 files changed, 45 insertions(+), 6 deletions(-) + +commit ed367c08d788c88c49de770019bf826cfebb3e2c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 16 17:25:02 2011 +0000 + + Don't need this either + + configure.ac | 1 - + 1 file changed, 1 deletion(-) + +commit 76ab657dc81ed0af7d9f2efaca2e68d570063001 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 16 17:22:56 2011 +0000 + + And this is the last bit of qt3 cleaning? + + configure.ac | 1 - + 1 file changed, 1 deletion(-) + +commit 9a02856c2762e65b8f03e443e728e05e5a86f65b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 16 17:21:00 2011 +0000 + + Another qt3 unused file + + m4/qt.m4 | 16 ---------------- + 1 file changed, 16 deletions(-) + +commit 26da7a52d31eb677ab6399de2c07140aa272b35e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 16 17:17:59 2011 +0000 + + Yet more qt3 cleaning + + configure.ac | 2 -- + 1 file changed, 2 deletions(-) + +commit 8dc9c693abb0033247a338d0f7d1f3f7a57c1a55 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 16 17:14:34 2011 +0000 + + Some more qt3 thigs i forgot to kill + + CMakeLists.txt | 5 - + Makefile.am | 1 - + cmake/modules/FindQt3.cmake | 319 + ------------------------------------------- + 3 files changed, 325 deletions(-) + +commit d82f98a274bfa008c218e265a080c4af7ce95131 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 16 17:13:06 2011 +0000 + + Kill qt3 frontend + + CMakeLists.txt | 5 - + Makefile.am | 5 - + configure.ac | 18 -- + poppler-qt-uninstalled.pc.in | 7 - + poppler-qt.pc.cmake | 13 -- + poppler-qt.pc.in | 13 -- + qt/.gitignore | 7 - + qt/CMakeLists.txt | 34 ---- + qt/Makefile.am | 48 ----- + qt/poppler-document.cc | 344 + -------------------------------- + qt/poppler-fontinfo.cc | 83 -------- + qt/poppler-link-qt3.h | 188 ------------------ + qt/poppler-link.cc | 267 ------------------------- + qt/poppler-page-transition-private.h | 28 --- + qt/poppler-page-transition.cc | 95 --------- + qt/poppler-page-transition.h | 146 -------------- + qt/poppler-page.cc | 357 + ---------------------------------- + qt/poppler-private.cc | 147 -------------- + qt/poppler-private.h | 102 ---------- + qt/poppler-qt.h | 311 ----------------------------- + qt/test-poppler-qt.cpp | 122 ------------ + 21 files changed, 2340 deletions(-) + +commit 301352e5585d4ab6e7b609b4ab79b4d8b8656092 +Author: Daiki Ueno <ueno@unixuser.org> +Date: Sun Jan 9 18:48:50 2011 +0000 + + Do not crash in case jpeg_create_decompress fails + + Bug 32890 + + poppler/DCTStream.cc | 21 ++++++++++++--------- + poppler/DCTStream.h | 8 ++++++-- + 2 files changed, 18 insertions(+), 11 deletions(-) + +commit 17baf0498485720b4ea5952bb46287f533139d0a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jan 8 13:03:31 2011 +0000 + + Remove declaration of function without implementation + + poppler/XRef.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit a9e280508f5d669c8b6e1a6bb888b9369d868ab3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jan 8 10:39:41 2011 +0100 + + glib: Fix memory leak when calling poppler_page_get_text_layout() + for pages with no text + + glib/poppler-page.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 5d62d18941810ef7d668eafa8b001085133fb169 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jan 8 10:33:32 2011 +0100 + + glib: Use NULL instead of FALSE in g_return_val_if_fail() for + functions returning a pointer + + glib/poppler-page.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 1324ae13f1fc2fa28951c2c7f7d63d4756537229 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 6 01:15:30 2011 +0100 + + [cpp/apidox] advertize the 'pnm' image format + + cpp/poppler-image.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit b192363960c26111167b1b08db9910e5f39dcf8b +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 6 01:09:09 2011 +0100 + + [cpp] Add PNM (PBM/PGM/PPM) exporting to 'image'. + + Introduce a custom ImgWriter (PNMWriter) for exporting in the PNM + variants, + and use it choosing the output format matching as close as possible + the format of the image. + + cpp/CMakeLists.txt | 1 + + cpp/Makefile.am | 2 + + cpp/PNMWriter.cc | 119 + +++++++++++++++++++++++++++++++++++++++++++++++++ + cpp/PNMWriter.h | 43 ++++++++++++++++++ + cpp/poppler-image.cpp | 22 ++++++++- + 5 files changed, 186 insertions(+), 1 deletion(-) + +commit bebc530cbde7898759e1bd3629d2836ce0fb1d08 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Dec 31 12:11:40 2010 +1030 + + cairo: Don't set JPX mime data if the stream specifies a colorspace + + The stream colorspace overides, and may be different to, the + colorspace in the JPX data. + + https://bugs.freedesktop.org/show_bug.cgi?id=32746 + + poppler/CairoOutputDev.cc | 46 + ++++++++++++++++++++++++++++++--------------- + poppler/CairoOutputDev.h | 1 + + 2 files changed, 32 insertions(+), 15 deletions(-) + +commit 1399b9ab14b19f25583c75af2b36f63a6a01129a +Author: Pino Toscano <pino@kde.org> +Date: Wed Dec 29 15:56:45 2010 +0100 + + [cpp] add TIFF output to 'image' + + cpp/poppler-image.cpp | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 1c7937dbc3c577ffc12cacc8de33d320e2f30ce9 +Author: William Bader <williambader@hotmail.com> +Date: Wed Dec 29 14:47:06 2010 +0000 + + Make pdftoppm be able of writing tif files + + BUG 32027 + + CMakeLists.txt | 15 ++++ + config.h.cmake | 3 + + configure.ac | 32 ++++++++ + goo/Makefile.am | 2 + + goo/TiffWriter.cc | 202 + ++++++++++++++++++++++++++++++++++++++++++++++++ + goo/TiffWriter.h | 53 +++++++++++++ + poppler/Makefile.am | 11 +++ + splash/SplashBitmap.cc | 18 ++++- + splash/SplashBitmap.h | 5 +- + splash/SplashTypes.h | 4 +- + utils/pdftoppm.1 | 6 ++ + utils/pdftoppm.cc | 14 +++- + 12 files changed, 358 insertions(+), 7 deletions(-) + +commit bae91ecb638fcfee001e5c9a86a754610da796e4 +Author: William Bader <williambader@hotmail.com> +Date: Tue Dec 28 11:53:54 2010 +0000 + + Add -singlefile option to pdftoppm + + Bug 32025 + + utils/pdftoppm.1 | 3 +++ + utils/pdftoppm.cc | 26 +++++++++++++++++++++++--- + 2 files changed, 26 insertions(+), 3 deletions(-) + +commit ff58ee66c27da09a370a3000ab55eb1a24921852 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 27 20:07:21 2010 +0000 + + bump soname just in case the getPage change is not BC + + qt/CMakeLists.txt | 2 +- + qt/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 453df02e195a96d0210f297c21c8ffba646659da +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 27 19:51:13 2010 +0000 + + Make distcheck work + + glib/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6a34cec72c1a1b6576858a7836aae4a902fb5ed7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 27 19:29:52 2010 +0000 + + increase core soname + + CMakeLists.txt | 2 +- + poppler/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 8c11e9d68dceb609d04b3b383d22c307b5981d86 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 27 19:23:29 2010 +0000 + + 0.16.0 project version increase + + CMakeLists.txt | 4 ++-- + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit 8c1fd83c6061279af00c1172fe41cee61f19d917 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 27 19:22:22 2010 +0000 + + 0.16.0 NEWS + + NEWS | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit 0294d6e50691a3e40fad0d6e4fa9056944a91efd +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Dec 23 15:56:32 2010 +0000 + + Be more correct when drawing radial shadings + + Fixes 32349 + + poppler/Gfx.cc | 25 ++++++++++++++++--------- + 1 file changed, 16 insertions(+), 9 deletions(-) + +commit 3aa08e378927889b35b6fa858d6da568250ba6ec +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 19 22:36:47 2010 +0000 + + Seems to work with this version, so enable it + + CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 93cf184b7573980bf2e56342e64f9b99c5d0b415 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 19 14:16:25 2010 +0000 + + Fix last commit + + Applying patches by hand is bad + + poppler/PDFDoc.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ebb580d756a8321de87814f05ab572564732c15e +Author: Philip Lorenz <lorenzph+freedesktop@gmail.com> +Date: Sun Dec 19 14:08:31 2010 +0000 + + Windows fixes + + poppler/PDFDoc.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 88a4154420e016d93c5ce05b5b8e09b6bddcadc9 +Author: Philip Lorenz <lorenzph+freedesktop@gmail.com> +Date: Sun Dec 19 13:03:01 2010 +0000 + + build on newer MSVC + + qt4/src/poppler-annotation.h | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 18cd9f6aeb48266c551952c395eb9cd662bc27f5 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Dec 18 17:59:54 2010 +0000 + + compile in windows + + poppler/FontInfo.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 471102ef68b439dfa13e20e3b0f2e143f8d0dc85 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 17 00:36:36 2010 +0000 + + Remove -resolution + + Actually use -zoom that is there for a reason + + utils/pdftohtml.1 | 3 --- + utils/pdftohtml.cc | 15 ++++++--------- + 2 files changed, 6 insertions(+), 12 deletions(-) + +commit edf6c47feb5b7658e585bcce196e465245e1dc98 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 16 22:56:40 2010 +0000 + + kill useless code + + utils/pdftohtml.cc | 8 -------- + 1 file changed, 8 deletions(-) + +commit 185a2f81485e19f96393a431be5523a277747b94 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 16 22:56:15 2010 +0000 + + static-ify some vars + + utils/HtmlOutputDev.cc | 9 --------- + utils/pdftohtml.cc | 8 ++++---- + 2 files changed, 4 insertions(+), 13 deletions(-) + +commit e4dfc548c57b690db9122d1db3342ed0a785c8bb +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 14 19:45:46 2010 +0000 + + We need this to make the define really be defined + + config.h.cmake | 3 +++ + 1 file changed, 3 insertions(+) + +commit 06da4b46c442778c67b788b747f04b386b5247ac +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 14 09:06:57 2010 +1030 + + cairo: Use A1 instead of A8 for imagemask + + The cairo PDF surface now optimizes the case of cairo_mask() with + solid source and A1 mask to use a PDF stencil mask. + + Fixes https://bugs.launchpad.net/ubuntu/+source/libcairo/+bug/680628 + where a 65K PDF printed to PDF using poppler-cairo turns into an 8MB + PDF. + + CMakeLists.txt | 2 ++ + configure.ac | 1 + + poppler/CairoOutputDev.cc | 25 ++++++++++++++++++------- + 3 files changed, 21 insertions(+), 7 deletions(-) + +commit 6ef457dc818e7e241e5d2e264bc2d78b132ae638 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 13 14:08:29 2010 +0000 + + Move -fno-exceptions -fno-check-new to default flags + + Makes sense since we decided not to support the exception path in + gmem a + while ago + + cmake/modules/PopplerMacros.cmake | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 86e469600b58ae05cb6ede1b4017fbdac99cc556 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 13 14:04:00 2010 +0000 + + More gcc flags movement + + -Wchar-subscripts is part of -Wall so remove it + Move -fno-common to default options since it makes sense to use it + + cmake/modules/PopplerMacros.cmake | 4 ++-- + configure.ac | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2b74241d8b1fd1ec9fab4f6f673bbaaa1cb3d949 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 13 13:56:52 2010 +0000 + + Promote -Wcast-align to the general warnings we ask gcc to give + + cmake/modules/PopplerMacros.cmake | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 7313e0a4de6f2146c1dcb3d235f18a3c844d12d5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 12 23:28:18 2010 +0000 + + Do not return 99 (or 1) with -h, -v and -printenc + + Bug 32149 + + utils/pdffonts.cc | 2 ++ + utils/pdfimages.cc | 2 ++ + utils/pdfinfo.cc | 3 +++ + utils/pdftoppm.cc | 2 ++ + utils/pdftops.cc | 5 ++++- + utils/pdftotext.cc | 3 +++ + 6 files changed, 16 insertions(+), 1 deletion(-) + +commit 669cbfc9fd78a22d4f14b0af43143e1f5dc28cd5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 11 19:04:22 2010 +0000 + + Fix the preliminary bbox/clip calculation + + Code based in code posted by Suzuki Toshiya in the freetype mailing + list + + splash/SplashFTFont.cc | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 2984002a64acca7014edeadd900dd52cdf7d9eac +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 11 18:57:52 2010 +0000 + + Remove the * we just need to increase the pointer + + Gives a warning with newer gcc's + + splash/Splash.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9b45fa072198da4a5032004ac943cf2227aa97ea +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 10 12:05:58 2010 +0000 + + Make PreScanOutputDev be less agressive when deciding to rasterize + + BUG 30107 + + poppler/PreScanOutputDev.cc | 14 +++++++++++++- + poppler/PreScanOutputDev.h | 4 ++++ + 2 files changed, 17 insertions(+), 1 deletion(-) + +commit f96f6a06cdc33b4654669ac74d5abd0d546a127d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 5 12:06:21 2010 +0000 + + Adapt the zlib-base FlateStream code to API changes + + Bug 32065 + + poppler/FlateStream.cc | 9 ++++++--- + poppler/FlateStream.h | 9 +++++++++ + 2 files changed, 15 insertions(+), 3 deletions(-) + +commit 7b1f83990a1f68306daf5f7dbeabcd38f4382e3b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 29 22:27:46 2010 +0000 + + 0.15.3 + + CMakeLists.txt | 4 ++-- + NEWS | 18 ++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 24 insertions(+), 6 deletions(-) + +commit 7c23a993193aaaa4d4b5b6d1161a0455d1e2a8c0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 29 21:33:31 2010 +0000 + + Add some more isNum before calling getNum + + poppler/GfxState.cc | 48 + ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 32 insertions(+), 16 deletions(-) + +commit 62ec4f591c258e702ee79b519919a931517220bf +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 29 20:50:43 2010 +0000 + + pass fetchOriginatorNums in some more calls + + Fixes some more crashes in broken files + + poppler/Parser.cc | 7 ++++++- + poppler/Parser.h | 1 + + poppler/XRef.cc | 6 +++--- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit d2a0e2ca723142478858f7edfb7c98807d554578 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Nov 25 10:36:38 2010 +0000 + + Skip over loops in Pages tree + + poppler/Catalog.cc | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 7abd371364e6e4aaef932f26b0664f7f9d760c42 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 28 13:57:50 2010 +0000 + + this var is not about xobjects only anymroe + + poppler/FontInfo.cc | 6 +++--- + poppler/FontInfo.h | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 1ac14df61d711097837e44d80a9332f0a854b95e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 28 13:49:41 2010 +0000 + + find fonts inside patterns + + Bug 31948 + + poppler/FontInfo.cc | 50 + +++++++++++++++++++++++++++----------------------- + 1 file changed, 27 insertions(+), 23 deletions(-) + +commit d30dd8c6f6491beac9750447126930168394cd9f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 28 13:25:39 2010 +0000 + + Use sets instead of arrays + + poppler/FontInfo.cc | 46 ++++++++-------------------------------------- + poppler/FontInfo.h | 11 +++-------- + 2 files changed, 11 insertions(+), 46 deletions(-) + +commit 4c20bf14c0b1d7f1d5e530ded890186487da32b5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 28 12:50:24 2010 +0000 + + Use FontInfoScanner + + No idea why we didn't do this before, duplicate code is evil and now + pdffonts doesn't crash on pdf from bug 20486 + + utils/pdffonts.cc | 185 + ++++++++--------------------------------------------- + 1 file changed, 26 insertions(+), 159 deletions(-) + +commit d915f3d5a9e9e2e5dcd6be4cf8fac1b5849a13e9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 24 21:51:46 2010 +0000 + + protect against null ref here + + poppler/Catalog.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cf32faaa16d763561fb9dfc4469345e4b3ba2369 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 24 21:48:54 2010 +0000 + + Protect against NULL values here + + poppler/JPEG2000Stream.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 46a6cc5952c59504863baed3ad2870093c462f12 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 24 19:42:59 2010 +0000 + + Check the objects are numbers before using them + + Bug 31895 + + poppler/GfxState.cc | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +commit 52e25cca7e75a8b8eac95a3cec258f1cd9f8ecaa +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 23 20:31:14 2010 +0000 + + If it is not a Page but has no Kids either let's just pretend it's + a page + + Fixes broken PDF at bug 31861 + + poppler/Catalog.cc | 2 +- + poppler/Dict.cc | 4 ++++ + poppler/Dict.h | 2 ++ + 3 files changed, 7 insertions(+), 1 deletion(-) + +commit c6127898b13311197971b1c6b1b306b91e28cf0e +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Nov 22 13:08:48 2010 +0000 + + Use gmallocn_checkoverflow when parsing Hints table + + Prevents running out of memory with malicious documents. + + poppler/Hints.cc | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 6a17cc89eda52f08cbacbf9bfaaeda22cf041e82 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Mon Nov 22 19:20:56 2010 +0000 + + Improve rendering of radial shadings + + Improves the duck rendering in bug 22098 + + poppler/Gfx.cc | 71 + +++++++++++++++++++++++++++----------------------------- + 1 file changed, 34 insertions(+), 37 deletions(-) + +commit 9093adede4f9ad6fb2962dcefcb09c1d8c357715 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 21 23:49:12 2010 +0000 + + pedantic ; + + poppler/CurlPDFDocBuilder.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 61445f5af749510fb647059af01abf1faf664195 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 22:19:35 2010 +0000 + + forgot to upadte year here + + poppler/Parser.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3628837febb21bcd1b54f3fb737628ea59e5d95d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 22:15:08 2010 +0000 + + And now generalize the previous fix + + Works for loops of more than one item as in bug 28784 + + poppler/Dict.cc | 4 ++-- + poppler/Dict.h | 2 +- + poppler/Object.cc | 4 ++-- + poppler/Object.h | 9 +++++---- + poppler/Parser.cc | 19 +++++++++++++------ + poppler/Parser.h | 7 ++++++- + poppler/XRef.cc | 30 +++++++++++++++++++++++++----- + poppler/XRef.h | 2 +- + 8 files changed, 55 insertions(+), 22 deletions(-) + +commit b0555189a7fbd7f6a899e582783b9e0df44d5d6a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 21:32:24 2010 +0000 + + Protect against more loops when parsing + + poppler/Dict.cc | 4 ++-- + poppler/Dict.h | 2 +- + poppler/Object.cc | 4 ++-- + poppler/Object.h | 8 ++++---- + poppler/Parser.cc | 2 +- + poppler/XRef.cc | 4 ++-- + poppler/XRef.h | 2 +- + 7 files changed, 13 insertions(+), 13 deletions(-) + +commit 555fa897b275ca7195f22a727b049c8c4f2d74cd +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 19:14:38 2010 +0000 + + Detect loops in FormField creation + + poppler/Form.cc | 88 + +++++++++++++++++++++++++++++++------------------------ + poppler/Form.h | 14 +++++---- + 2 files changed, 58 insertions(+), 44 deletions(-) + +commit 1802ddef374cb1451975480b2427e5d23ee2c737 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 18:58:17 2010 +0000 + + Forgot to port this away from GooVector :-S + + poppler/CurlCachedFile.cc | 3 +-- + poppler/CurlCachedFile.h | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 32e53c5436b8c3654e7043f1d86596a79511a4cf +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 18:54:59 2010 +0000 + + fix spacing + + poppler/Form.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 1cb3d5d94a1d89ccded96d977bcabfbe438fb81f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 18:08:45 2010 +0000 + + fix the memset + + Fixes crash in broken pdf + + poppler/Hints.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 22e8cebaa15adb4b19c9556cdca43cc3e77832b7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 20 17:20:34 2010 +0000 + + Ensure the obj are num before reading them + + poppler/GfxState.cc | 32 ++++++++++++++++++++++---------- + 1 file changed, 22 insertions(+), 10 deletions(-) + +commit 08b2db36db4e011ebe36d2d945cb1a0498f1c5fb +Author: Pino Toscano <pino@kde.org> +Date: Sat Nov 20 14:00:36 2010 +0100 + + add my copyright here + + poppler/Hints.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 91aa4b02aa93ffe3828479194067de42d52be465 +Author: Pino Toscano <pino@kde.org> +Date: Sat Nov 20 13:13:46 2010 +0100 + + [cpp] include <ios> for std::hex() and std::left() + + cpp/poppler-global.cpp | 1 + + cpp/tests/poppler-dump.cpp | 1 + + 2 files changed, 2 insertions(+) + +commit 1c924412923cb01f2cb95b0943cb7bbaf7e8cfb6 +Author: Pino Toscano <pino@kde.org> +Date: Sat Nov 20 13:02:36 2010 +0100 + + [cpp] include <iterator> for std::back_inserter() + + cpp/poppler-document.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit 95b551025a34f3a7bcff2852eac6d186bc8a7cb0 +Author: Pino Toscano <pino@kde.org> +Date: Sat Nov 20 12:54:21 2010 +0100 + + use a std::vector<char> instead of a var-length-array of char's + + poppler/Hints.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4faaff893515c80cb69b02e431a0f8483274a497 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 19 23:53:35 2010 +0000 + + [win32] Simplify strtok_r implementation + + The previous implementation did not compile with mingw64. + + poppler/strtok_r.cpp | 137 + +------------------------------------------------- + 1 file changed, 1 insertion(+), 136 deletions(-) + +commit 255f84927a649d980f047fe755c9c308535a3779 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 19 23:45:33 2010 +0000 + + Correct parsing of linearization table + + Fixes bug #31627 + + poppler/Linearization.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 9d05138f0b7d15945f546564036bc67815593db0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 14 16:05:28 2010 +0000 + + 0.15.2 + + CMakeLists.txt | 4 ++-- + NEWS | 22 ++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 28 insertions(+), 6 deletions(-) + +commit 2d18543bd6b3a5a9ff2dfab63339d5bfcccd0b2f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 14 15:41:56 2010 +0000 + + This does actually work now :D + + qt4/tests/check_metadata.cpp | 1 - + 1 file changed, 1 deletion(-) + +commit d772364b8a5858cbd98e256547d319260fa9d084 +Author: Pino Toscano <pino@kde.org> +Date: Thu Nov 11 21:52:25 2010 +0100 + + [Qt4] New function setDebugErrorFunction(). + + This new function + typedef can be useful to direct the ebug/error + messages + to a different place than the default qDebug()'s one. + + Base on an idea of Albert, added closure and polish by me. + + qt4/src/poppler-private.cc | 20 +++++++++++++++++++- + qt4/src/poppler-qt4.h | 24 ++++++++++++++++++++++++ + 2 files changed, 43 insertions(+), 1 deletion(-) + +commit ce929cf33f4b6b6421f9d327b4bb792816d47aac +Author: Jakob Voss <jakob.voss@gbv.de> +Date: Wed Nov 10 23:41:44 2010 +0000 + + Add -p flag to pdfimages + + Adds the page the image is in to the image filename + + utils/ImageOutputDev.cc | 25 ++++++++++++++++++------- + utils/ImageOutputDev.h | 19 +++++++++++++++---- + utils/pdfimages.1 | 3 +++ + utils/pdfimages.cc | 6 +++++- + 4 files changed, 41 insertions(+), 12 deletions(-) + +commit 6296c28968613aadb7ea084092945a54005eca9b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 10 23:28:45 2010 +0000 + + Kill GooVector + + std::vector does the same and GooVector is not part of xpdf so + we don't + need to maintain it in case we ever get a new xpdf release we want to + merge with + + CMakeLists.txt | 1 - + goo/GooVector.h | 159 + -------------------------------------------- + goo/Makefile.am | 1 - + poppler/CachedFile.cc | 19 +++--- + poppler/CachedFile.h | 15 +++-- + poppler/Catalog.cc | 12 ++-- + poppler/Catalog.h | 10 +-- + poppler/Form.h | 3 +- + poppler/Gfx.h | 7 +- + poppler/Hints.cc | 5 +- + poppler/Hints.h | 6 +- + poppler/StdinCachedFile.cc | 2 +- + poppler/StdinCachedFile.h | 2 +- + poppler/Stream.h | 1 - + poppler/XRef.cc | 10 +-- + poppler/XRef.h | 7 +- + utils/HtmlFonts.cc | 8 +-- + utils/HtmlFonts.h | 12 ++-- + utils/HtmlLinks.cc | 8 +-- + utils/HtmlLinks.h | 4 +- + 20 files changed, 66 insertions(+), 226 deletions(-) + +commit 5934c320aa136c1a6e97fb9bf54bdfdccfcab521 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Nov 10 22:50:36 2010 +0000 + + Linearization improvements + + Read + http://lists.freedesktop.org/archives/poppler/2010-November/006642.html + for the detailed patch description + + CMakeLists.txt | 4 + + glib/poppler-action.cc | 4 +- + glib/poppler-document.cc | 17 +- + glib/poppler-page.cc | 1 + + poppler/CachedFile.h | 2 +- + poppler/Catalog.cc | 352 ++++++++++++++++++++----------- + poppler/Catalog.h | 14 +- + poppler/FontInfo.cc | 5 +- + poppler/Hints.cc | 439 + +++++++++++++++++++++++++++++++++++++++ + poppler/Hints.h | 95 +++++++++ + poppler/Linearization.cc | 224 ++++++++++++++++++++ + poppler/Linearization.h | 45 ++++ + poppler/Makefile.am | 4 + + poppler/PDFDoc.cc | 284 +++++++++++++++++++++---- + poppler/PDFDoc.h | 38 +++- + poppler/PSOutputDev.cc | 39 ++-- + poppler/PSOutputDev.h | 14 +- + poppler/Stream.cc | 13 +- + poppler/Stream.h | 11 +- + poppler/XRef.cc | 351 ++++++++++++++++++------------- + poppler/XRef.h | 25 ++- + qt/poppler-document.cc | 14 +- + qt/poppler-page.cc | 19 +- + qt/poppler-private.h | 14 +- + qt/poppler-qt.h | 3 +- + qt4/src/poppler-document.cc | 12 +- + qt4/src/poppler-link.cc | 7 +- + qt4/src/poppler-page.cc | 3 +- + qt4/src/poppler-ps-converter.cc | 2 + + utils/HtmlOutputDev.cc | 2 +- + utils/HtmlOutputDev.h | 3 + + utils/pdffonts.cc | 6 +- + utils/pdfinfo.cc | 22 +- + utils/pdftohtml.cc | 2 +- + utils/pdftops.cc | 3 +- + 35 files changed, 1690 insertions(+), 403 deletions(-) + +commit abb1313ae40ab7efb073406f47fa53bf7afe0b88 +Author: Pino Toscano <pino@kde.org> +Date: Mon Nov 8 01:54:03 2010 +0100 + + [cpp/apidox] add the minimum version of 'image' + + cpp/poppler-image.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit f559e77cb7d76c5fe6a79be9086667a29613c912 +Author: Pino Toscano <pino@kde.org> +Date: Mon Nov 8 01:52:48 2010 +0100 + + [cpp] add image::bytes_per_row() + + cpp/poppler-image.cpp | 8 ++++++++ + cpp/poppler-image.h | 1 + + 2 files changed, 9 insertions(+) + +commit 14dea4d74698d5d7d994e687f8176652d790dba7 +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 7 22:57:31 2010 +0100 + + [arthur] use the untransformed line width, not the transformed one + + ... as the painter will do the transformation itself already; + seems to product better results + + poppler/ArthurOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f077e82af0724be88d28c896a3c208f1d50ccff9 +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 7 21:50:48 2010 +0100 + + [qt4] New Page::renderToPainter() + + This new painter-based painting function ican be used for painting + (with Arthur only for now) without getting an image first. + Also add a new flag type for it, with a single item telling whether + do not save+restore the provided painter. + + Mostly based on a patch by Matthias Fauconneau + (matthias.fauconneau@gmail.com), thanks! + + qt4/src/poppler-page.cc | 62 + ++++++++++++++++++++++++++++++-------------- + qt4/src/poppler-qt4.h | 65 + ++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 107 insertions(+), 20 deletions(-) + +commit df02d1fc9e65422121e5e8f493c13229552ec0e7 +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 7 19:47:56 2010 +0100 + + [arthur] remove unused 'm_image' attribute + + poppler/ArthurOutputDev.cc | 1 - + poppler/ArthurOutputDev.h | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit b29582cd0d542a3e70dbca3fb75770daa4cc91ca +Author: Matthias Fauconneau <matthias.fauconneau@gmail.com> +Date: Sun Nov 7 19:44:11 2010 +0100 + + [arthur] small fixes and memory leaks + + - fix font rendering (transforming the glyph path and not only the + glyph origin) + - fix image rendering (alpha was set to zero) + + poppler/ArthurOutputDev.cc | 122 + ++++++++++++++++++++------------------------ + 1 file changed, 54 insertions(+), 68 deletions(-) + +commit 970f075569bf9be5e5ddc3a9ad1fabec5435dfaf +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 7 16:31:02 2010 +0100 + + [cpp/tests] add a simple poppler-render test + + ... to ease testing the render capabilities of poppler-cpp. + quite minimal at the moment. + + cpp/tests/CMakeLists.txt | 3 ++ + cpp/tests/Makefile.am | 9 +++- + cpp/tests/poppler-render.cpp | 113 + ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 124 insertions(+), 1 deletion(-) + +commit bfe4139c742cb0a669f5504df7e22e3e57243d9a +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 7 16:23:26 2010 +0100 + + [cpp] Add page_renderer, to render pages over images. + + This new class introduces a very simple way to render a page, using + the Splash backend, + giving an 'image' as result. + It can hold a color for the "paper" of the pages, and some hints + for the actual rendering. + + cpp/CMakeLists.txt | 2 + + cpp/Makefile.am | 2 + + cpp/poppler-page-renderer.cpp | 212 + +++++++++++++++++++++++++++++++++++++++++ + cpp/poppler-page-renderer.h | 66 +++++++++++++ + 4 files changed, 282 insertions(+) + +commit 91e3f7b4ea42a5821fd78e1edf55e95250c9bc68 +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 7 16:19:34 2010 +0100 + + [cpp] add an internal way to get a 'page_private' of a 'page' + + useful for getting a 'page_private' in the implementation of other + cpp classes + without the need to add friends to 'page' + + cpp/poppler-page-private.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit fa7c41cb9c52ecd3d7c574455b1258a3021b8c75 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 4 20:55:34 2010 +0000 + + Improvements to the splash backend + + Antialias and shadings. + Code by Thomas Freitag <Thomas.Freitag@alfa.de> and Christian + Feuersänger <cfeuersaenger@googlemail.com> + More info at bug 30436 + + poppler/CairoOutputDev.h | 5 +- + poppler/Function.cc | 4 +- + poppler/Function.h | 2 + + poppler/Gfx.cc | 12 +- + poppler/OutputDev.h | 16 +- + poppler/PSOutputDev.h | 4 +- + poppler/SplashOutputDev.cc | 182 +++++++++++++++++++- + poppler/SplashOutputDev.h | 68 +++++++- + splash/Splash.cc | 395 + +++++++++++++++++++++++++++++++++++++++++++- + splash/Splash.h | 11 +- + splash/SplashBitmap.cc | 4 +- + splash/SplashBitmap.h | 3 + + splash/SplashPattern.cc | 17 +- + splash/SplashPattern.h | 36 +++- + 14 files changed, 735 insertions(+), 24 deletions(-) + +commit 0aa040163741ab8ba093a742e556bba2a5ab7edf +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 3 20:40:24 2010 +0000 + + Do not add sibling children as parents + + Fixes c2ff94b1600b8a5841a5e4627f014560ac460f1a + + poppler/Function.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit c2ff94b1600b8a5841a5e4627f014560ac460f1a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 3 00:02:02 2010 +0000 + + Do not loop forever in broken documents + + StitchingFunctions that have themselves up in the parent chain + are wrong + + poppler/Function.cc | 22 +++++++++++++++++++--- + poppler/Function.h | 6 ++++-- + 2 files changed, 23 insertions(+), 5 deletions(-) + +commit cad66a7d25abdb6aa15f3aa94a35737b119b2659 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 2 19:14:34 2010 +0000 + + Fix crash in broken documents + + mapLen = (code + 256) & ~255; can wrap and you end up with mapLen + < code + that is not what you wanted + + poppler/CharCodeToUnicode.cc | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit 7e5f31c1c41193c6e49355970e6d027b91d45825 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 2 00:32:01 2010 +0000 + + make some more fields private + + splash/SplashFontFile.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 6751eb48dc49890f7ad8b732b3fc29a2db746ec4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 2 00:26:08 2010 +0000 + + Make the destructor private + + You are not supposed to call it, you should call unref + + splash/SplashFontFile.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit b718e821d5f21ea5b0c44c6c2b59769c9b94892a +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 28 08:46:09 2010 +0100 + + Revert fdfffc9c68314d3f64dee7e0ef8617105e3198dd + + It is not a leak and makes things crash :D + + poppler/SplashOutputDev.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 15b9aeac5a20c544db1aebe00113ebc2f7ba52c7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 28 00:37:29 2010 +0100 + + if reallocn fails, free p + + goo/gmem.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 561c0567a5741d7c49903c51c8020187dccaa0d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 27 22:43:51 2010 +0100 + + fix comment + + poppler/SplashOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4ef38cc99a879202e717447a422272cf85eeccfc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 27 22:36:07 2010 +0100 + + Fix memory leaks that can happen with broken documents + + poppler/SplashOutputDev.cc | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit fdfffc9c68314d3f64dee7e0ef8617105e3198dd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 27 20:40:19 2010 +0100 + + Fix memory leak + + poppler/SplashOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 90d479d9d5c947175e60ab689f440ae9c24f0b2b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 27 20:39:48 2010 +0100 + + Do not crash if bitmap->alpha == NULL + + Happens in broken files + + splash/Splash.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 6ad36277971ec46d4a4ef0c45625e60f8c5f1247 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Oct 25 18:59:49 2010 +0100 + + Initialze movie to NULL on broken pdf files + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 2d0b6e2956a81164bca6adc9aacad0e620480957 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 24 00:23:21 2010 +0100 + + Here the chars to read is the increment size not the initialSize + + Fixes crash in file provided by Robert Święcki + + poppler/Stream.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dcb02d2100136b6035485be3be214ce3d9f1c102 +Author: Vincent Torri <vtorri@univ-evry.fr> +Date: Sat Oct 23 23:45:05 2010 +0100 + + remove -ansi flag for cywin and mingw + + configure.ac | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 17cdc81224c72f7b58de61734c9ead337ff7b42b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 23:37:59 2010 +0100 + + update my C year + + poppler/SplashOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e09ddce7e21bbd62b384d9d59fbd1e0f14f7d05f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 23:33:00 2010 +0100 + + Fix crash in malformed documents + + poppler/SplashOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 906e4e15421d8f3f0a825ca767e5eac3169853d6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 23:12:44 2010 +0100 + + Do not leak attrs1 + + poppler/Catalog.cc | 1 + + 1 file changed, 1 insertion(+) + +commit ec32bb45a57a8a839156c946fcde1270aa6019d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 23:00:03 2010 +0100 + + Do not crash if n is 0 + + poppler/Function.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9edf7e4fefb37989af9a2558aaa83d7cd4694ec6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 22:59:50 2010 +0100 + + add unlikely marker + + poppler/Decrypt.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c46e863b7b94dc2f83a7d89f4afb8fe3bc8ec35c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 22:55:49 2010 +0100 + + Do not divide by 0 in rc4InitKey + + poppler/Decrypt.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit bcb13ed5828e2a855efd5e38b2acd15ca37a9991 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 23 22:40:17 2010 +0100 + + Check obj2 is a num before reading it + + poppler/Gfx.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit c64a49307782299cb7a950a66419f9d59707f38b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 20 22:29:29 2010 +0100 + + 0.15.1 + + CMakeLists.txt | 4 ++-- + NEWS | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 52 insertions(+), 6 deletions(-) + +commit 3b45c66de91243d7419657512cf726c9e1c26dfb +Author: Kenneth Berland <ken@hero.com> +Date: Sun Oct 17 14:24:16 2010 +0100 + + Add -bbox option to pdftotext + + utils/pdftotext.1 | 4 ++ + utils/pdftotext.cc | 125 + +++++++++++++++++++++++++++++++++++++++++----------- + 2 files changed, 103 insertions(+), 26 deletions(-) + +commit 71ec4c7a6715a40d536d1e4b911dae48d1bba7b9 +Author: Pino Toscano <pino@kde.org> +Date: Sun Oct 17 14:57:43 2010 +0200 + + [CMake] update MacroOptionalFindPackage.cmake from KDE SVN + + no radical changes, just a minor improvement for the "explicitly + disabled" case + + cmake/modules/MacroOptionalFindPackage.cmake | 40 + +++++++++++++++++++------- + 1 file changed, 30 insertions(+), 10 deletions(-) + +commit ab0049d8be5dfe1989c4aa33c2732915c62fecb2 +Author: Pino Toscano <pino@kde.org> +Date: Sun Oct 17 14:29:22 2010 +0200 + + [CMake] Cairo package: make the version check really working + + cmake/modules/FindCairo.cmake | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 1cea33717c92631ee9c417d9f89e32b03695c75a +Author: Pino Toscano <pino@kde.org> +Date: Sun Oct 17 13:55:58 2010 +0200 + + [CMake] Bump cairo dependency to 1.10 + + followup of fc9b85894754d175af916eaf6cb127efd601df7e + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d6f49aa2da15cd2e9cf775d6b1d2d04a005c8cdd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 14:22:57 2010 +0200 + + [cairo] Fix a crash when redering documents with invalid type 3 fonts + + poppler/CairoFontEngine.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2fad550c3cbf86541730582151e1bb6470ed9c1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 13:47:33 2010 +0200 + + [glib-demo] Use poppler_page_get_selected_region() in selections demo + + glib/demo/selections.c | 73 + +++++++++++++++--------------------------------- + 1 file changed, 22 insertions(+), 51 deletions(-) + +commit 88013458e141de58ed801480707ae0dfe92b9aa2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 13:46:26 2010 +0200 + + [glib] Add poppler_page_get_selected_region() + + that returns a cairo_region_t, and deprecate + poppler_page_get_selection_region(). + + glib/poppler-page.cc | 81 + +++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 4 ++ + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 86 insertions(+) + +commit fc9b85894754d175af916eaf6cb127efd601df7e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 12:54:18 2010 +0200 + + [configure] Bump cairo dependency to 1.10 + + configure.ac | 2 +- + poppler/CairoOutputDev.cc | 4 ---- + 2 files changed, 1 insertion(+), 5 deletions(-) + +commit dd14ef6b211ac1c8a4f16bb6094dbfd6a09cbef9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 17 12:46:55 2010 +0100 + + Improve dict lookup speed for big dicts + + Based on a patch by Paweł Wiejacha <pawel.wiejacha@gmail.com> + + poppler/Dict.cc | 98 + +++++++++++++++++++++++++++++++++++++++++++------------ + poppler/Dict.h | 2 ++ + 2 files changed, 80 insertions(+), 20 deletions(-) + +commit bb38a0c71434413f2728109c73278de1b8a58571 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 12:52:01 2010 +0200 + + [glib-demo] Make glib demo program installable + + It's a useful tool for testing and debugging not only for people who + install from sources. + + glib/demo/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d26d0fab2ddfff853f6681a3518813a2d65a4112 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 12:36:46 2010 +0200 + + [glib-demo] Use printing options in print demo + + glib/demo/print.c | 96 + +++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 93 insertions(+), 3 deletions(-) + +commit 4a71dcdd350d0c0515ca349f0b875b33289d25ee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 17 12:31:41 2010 +0200 + + [glib] Add poppler_page_render_for_printing_with_options() + + It allows to print with the same options acroread has: + + - Print document + - Print document and markup + - Print document and stamps + + glib/poppler-page.cc | 77 + +++++++++++++++++++++++++++++++---- + glib/poppler-page.h | 3 ++ + glib/poppler.h | 19 +++++++++ + glib/reference/poppler-sections.txt | 4 ++ + 4 files changed, 94 insertions(+), 9 deletions(-) + +commit 0b3b2ebc3930bd46fb13fb2158fc695b0962f7c5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 16 15:09:05 2010 +0100 + + Add a callback to know which page has been printed + + qt4/src/poppler-ps-converter.cc | 16 ++++++++++++++-- + qt4/src/poppler-qt4.h | 10 ++++++++++ + 2 files changed, 24 insertions(+), 2 deletions(-) + +commit 4bd25223c4d15dfa91965a6e86eaa444a5a81f71 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 16 15:08:05 2010 +0100 + + Do not omit this character + + Mimics Cairo backend and Adode Reader behaviour + + splash/SplashFTFont.cc | 4 ---- + 1 file changed, 4 deletions(-) + +commit b604a008a2a379a21e5fdfa0799886f80d893a08 +Author: Christian Feuersänger <cfeuersaenger@googlemail.com> +Date: Thu Oct 14 23:56:36 2010 +0100 + + Improve rendering of Shading Type 6 and 7 + + poppler/Gfx.cc | 214 + ++++++++++++++++++++++++++++++++++++++++----------- + poppler/Gfx.h | 9 ++- + poppler/GfxState.cc | 96 ++++++++++++++++++++++- + poppler/GfxState.h | 127 +++++++++++++++++++++++++++++- + 4 files changed, 398 insertions(+), 48 deletions(-) + +commit c6bb63b31c268e4e842532e6839b15edb31cf25c +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 14 23:33:13 2010 +0100 + + Only clip boxes to mediabox if we are at the page level + + Fixes bug 30784 + + poppler/Page.cc | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +commit 4a248b3f523209ec16ace587229412653b2276d0 +Author: Pino Toscano <pino@kde.org> +Date: Thu Oct 14 18:32:05 2010 +0200 + + [cpp] make it compile also when there are no image formats available + + including the ImgWirter.h is enough to get the definition of ImgWriter + + cpp/poppler-image.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit de1501d87549269f9214c9e3fba4cbf39960826e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 13 19:18:36 2010 +0100 + + remove windows eol + + poppler/Gfx.cc | 38 +++++++++++++++++++------------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +commit 12e68b49feef10b654944dd71eab0852cfeceb89 +Author: Pino Toscano <pino@kde.org> +Date: Sun Oct 10 23:04:57 2010 +0200 + + [cpp] Add a new 'image' class. + + This implicitely shared class represents the data buffer of an + "image", + with direct access to the data. + It also has a function to save to file (png/jpeg). + + Still a FIXME in the copy() method and in the save() (for mono + images only). + + cpp/CMakeLists.txt | 2 + + cpp/Makefile.am | 3 + + cpp/poppler-image-private.h | 48 +++++ + cpp/poppler-image.cpp | 431 + +++++++++++++++++++++++++++++++++++++++++++ + cpp/poppler-image.h | 70 +++++++ + 5 files changed, 554 insertions(+) + +commit db31687ba476e272b72625a8a78b50780522ee7d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Oct 9 10:33:06 2010 +0200 + + [glib] docs: Document poppler_annot_markup_get_date() + + glib/poppler-annot.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit a7cf8d322a4a687c9810a577cc92ff6b9725ecdc +Author: Fernando Herrera <fherrera@onirica.com> +Date: Thu Oct 7 17:28:31 2010 +0200 + + [glib] Fix introspection annotations for poppler_document_get_page*() + + Return value should be transfer full since the caller owns the only + reference. + + glib/poppler-document.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit d690bea929553d1a4392d42d949843e9467ba8cb +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 5 22:18:22 2010 +0100 + + Make sure obj is a num before reading it + + Not sure if using a 0 is correct otherwise, but if your matrix is + broken you're probably going to get a wrong rendering anyway, so who + cares. Bug #30590 + + poppler/Gfx.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit b17be2bc32cf71bac0473bf4ac16359e3027b4fc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 3 12:14:11 2010 +0200 + + [annots] Fix a crash when drawing square/circle annots without + a border + + Fixes bug #30580 + + poppler/Annot.cc | 121 + +++++++++++++++++++++++++++--------------------------- + 1 file changed, 61 insertions(+), 60 deletions(-) + +commit e3d3944c1988343704e3ba3a5d60609719466afb +Author: Tomas Hoger <thoger@redhat.com> +Date: Wed Sep 29 20:03:45 2010 +0100 + + Fix uninitialized uses on DCTScanInfo + + poppler/Stream.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit f380647f09d88339c936184bbe86c70c0d47de4b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 29 20:02:10 2010 +0100 + + Free names + + poppler/Catalog.cc | 1 + + 1 file changed, 1 insertion(+) + +commit aa0fd32a8501473832bce1b8b804dd3f9a45735b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 27 22:39:09 2010 +0100 + + Consider render value when colorizing text + + Fixes bug 2807 + + poppler/CairoOutputDev.cc | 18 +++--------------- + poppler/CairoOutputDev.h | 2 -- + poppler/Gfx.cc | 21 +++++++++++++++++---- + poppler/PSOutputDev.cc | 26 ++++++++++---------------- + poppler/PSOutputDev.h | 3 +-- + poppler/SplashOutputDev.cc | 18 +++--------------- + poppler/SplashOutputDev.h | 4 +--- + 7 files changed, 35 insertions(+), 57 deletions(-) + +commit cf710b999b510203e9348ea9f04360be1fe957b8 +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 24 00:50:37 2010 +0200 + + [Qt4] enable the generation of the QCH file + + ... usable in Qt Assistant + + qt4/src/Doxyfile | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit be6d933071c9ab043f01f374a884472c4ce3007e +Author: Pino Toscano <pino@kde.org> +Date: Thu Sep 23 15:55:45 2010 +0200 + + update Doxyfile's for qt4 and cpp + + no changes in the actual configuration values + + cpp/Doxyfile | 155 ++++-- + qt4/src/Doxyfile | 1469 + +++++++++++++++++++++++++++++++++--------------------- + 2 files changed, 1018 insertions(+), 606 deletions(-) + +commit 721da3d542ab9b234b058f3c14ea9303d748107e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Sep 23 14:09:11 2010 +0200 + + [glib] Use g_memdup instead of g_strdup in poppler_document_get_id() + + Ids are not null-terminated strings, but fixed size byte arrays. + + glib/demo/info.cc | 8 ++++++-- + glib/poppler-document.cc | 33 ++++++++++++++------------------- + 2 files changed, 20 insertions(+), 21 deletions(-) + +commit 4ffc0ed73397e4e58f04c3577b093a3fd39c22bd +Author: Pino Toscano <pino@kde.org> +Date: Thu Sep 23 02:21:12 2010 +0200 + + [cpp] small clarification in document::load_from_data() apidox + + cpp/poppler-document.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9491dc4a10706109d0f2b4d15f21b9a1db51d8c9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Sep 23 02:18:07 2010 +0200 + + [cpp] add document::load_from_raw_data() + + ... to be able to load a document from an external data buffer, + with no need to copy the data. + + add as well a new document_private constructor to handle the new + situation, + and make sure to properly use the raw data when unlocking the document + + cpp/poppler-document-private.h | 5 ++++ + cpp/poppler-document.cpp | 53 + ++++++++++++++++++++++++++++++++++++++++ + cpp/poppler-document.h | 4 +++ + 3 files changed, 62 insertions(+) + +commit a3c1f2d5ea1de969e9aaaa84ee38866938b4ce0c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 22 20:14:27 2010 +0100 + + fix copyright + + poppler/Form.cc | 1 + + poppler/Form.h | 1 + + 2 files changed, 2 insertions(+) + +commit 1aad013e353a9e59bdab8a1b4ce93f2ad7aaf4f2 +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 22 17:07:38 2010 +0200 + + update copyrights + + cpp/poppler-document.h | 2 +- + cpp/poppler-page-transition.cpp | 2 +- + cpp/poppler-private.cpp | 2 +- + cpp/poppler-rectangle.cpp | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 2d6d66ebe0215df66e33cb5974c58c324fab50b6 +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 22 17:07:13 2010 +0200 + + [cpp/tests] poppler-dump: show the PDF IDs, if available + + cpp/tests/poppler-dump.cpp | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit e39fde1b62544b90e73a2fc3609a260991db3a47 +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 22 16:52:08 2010 +0200 + + [cpp] add document::get_pdf_id() + + ... to get the IDs of a PDF document, if present. + + cpp/poppler-document.cpp | 29 +++++++++++++++++++++++++++++ + cpp/poppler-document.h | 1 + + 2 files changed, 30 insertions(+) + +commit 299a1849a148fa0a7b3171c45ec68b9901aa93bb +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 22 16:36:30 2010 +0200 + + [Qt4] add Document::getPdfId() + + ... to get the IDs of a PDF document, if present. + + also, add two test cases for it in the metadata unit test + + qt4/src/poppler-document.cc | 16 ++++++++++++++ + qt4/src/poppler-qt4.h | 14 ++++++++++++ + qt4/tests/check_metadata.cpp | 50 + ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 80 insertions(+) + +commit dd9bcdb720ac1bf8a022635bcbb3b56e4b75bb15 +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 22 16:29:46 2010 +0200 + + Make the internal get_id() not fail because of null bytes in the ID. + + Passing the const char* of the byte string to convert is not enough + if its length must be checked, + as it might fail when the string of the ID contains null bytes. + Instead, pass the original GooString so its size is properly checked. + + Also, remove an hardcoded 16 and make it dependent on pdfIdLength, + as used elsewhere in get_id() function. + + poppler/PDFDoc.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 9554cbc3cb4fc0cd7ad2295f5d27a18e030c6aee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Sep 22 12:54:25 2010 +0200 + + [glib-demo] Show form field names in forms demo + + glib/demo/forms.c | 26 ++++++++++++++++++++------ + 1 file changed, 20 insertions(+), 6 deletions(-) + +commit 257634b26b682628dba5ee5f94cb0bad030bcb4f +Author: Mark Riedesel <mark@klowner.com> +Date: Wed Sep 22 12:52:49 2010 +0200 + + [glib] Add methods to get mapping, partial an fully qualified form + field names + + See bug #28780. + + glib/poppler-form-field.cc | 68 + +++++++++++++++++++++++++++++++++++ + glib/poppler-form-field.h | 3 ++ + glib/reference/poppler-sections.txt | 3 ++ + 3 files changed, 74 insertions(+) + +commit 6db98abc59c154dcb18d69fc37e44ce804c3ccc9 +Author: Mark Riedesel <mark@klowner.com> +Date: Wed Sep 22 12:41:16 2010 +0200 + + Add getLabel method to FormWidget + + See bug #28780. + + poppler/Form.cc | 64 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Form.h | 8 +++++++ + 2 files changed, 72 insertions(+) + +commit bcdca66fd57439735e0b9aa182ab7cfce29e9ed0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Sep 21 11:49:37 2010 +0200 + + [glib] Fix minimum value of creation and modification date properties + + It should be -1 which means there's no date specified + + glib/poppler-document.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d2578bd66129466b2dd114b6407c147598e09d2b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:19:27 2010 +0100 + + Avoid loops in Form::fieldLookup + + Fixes crash in broken pdf provided by Joel Voss of Leviathan + Security Group + + poppler/Dict.h | 3 +++ + poppler/Form.cc | 27 ++++++++++++++++++++++++--- + 2 files changed, 27 insertions(+), 3 deletions(-) + +commit 2fe825deac055be82b220d0127169cb3d61387a8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:15:25 2010 +0100 + + Make sure obj1 is a num before reading it + + Fixes crash in broken pdf provided by Joel Voss of Leviathan + Security Group + + poppler/Gfx.cc | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +commit 473de6f88a055bb03470b4af5fa584be8cb5fda4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:11:42 2010 +0100 + + Fix memory leak if obj2 is not a dict + + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + poppler/Form.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 9706e28657ff7ea52aa69d9efb3f91d0cfaee70b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:09:37 2010 +0100 + + Fix crash when idx is out of range + + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + poppler/Function.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 26a5817ffec9f05ac63db6c5cd5b1f0871d271c7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:08:54 2010 +0100 + + Fix crash when idx is out of range + + Fixes crash in broken pdf provided by Joel Voss of Leviathan + Security Group + + poppler/Function.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit dfdf3602bde47d1be7788a44722c258bfa0c6d6e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:07:12 2010 +0100 + + Give a value to color.c[i] + + Might not be the better solution but it's better than having a random + value there + + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + poppler/Gfx.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 01c85c08305bae16242f5979ab107fa5bb5f5100 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:04:37 2010 +0100 + + Forgot my (C) here + + poppler/Decrypt.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bf2055088a3a2d3bb3d3c37d464954ec1a25771f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:03:19 2010 +0100 + + Properly initialize stack + + Fixes crash in broken pdf provided by Joel Voss of Leviathan + Security Group + + poppler/Function.cc | 1 + + 1 file changed, 1 insertion(+) + +commit e853106b58d6b4b0467dbd6436c9bb1cfbd372cf +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 19:01:36 2010 +0100 + + Properly initialize parser + + Fixes crash in broken pdf provided by Joel Voss of Leviathan + Security Group + + poppler/Gfx.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3422638b2a39cbdd33a114a7d7debc0a5f688501 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 18:58:43 2010 +0100 + + Fix crash in broken pdf (parser->getStream() is 0) + + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + poppler/Gfx.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit a2dab0238a69240dad08eca2083110b52ce488b7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 18:55:51 2010 +0100 + + Initialize properly charactersRead + + It is possible that there are calls to getPos before reset + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + poppler/Decrypt.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 39d140bfc0b8239bdd96d6a55842034ae5c05473 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 18:54:31 2010 +0100 + + Fix crash in broken pdf (code < 0) + + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + fofi/FoFiType1.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit c6a091512745771894b54a71613fd6b5ca1adcb3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 21 18:50:25 2010 +0100 + + Fix memory leak + + Found thanks to PDF provided by Joel Voss of Leviathan Security Group + + poppler/Stream.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 9b6ddb68b80ef19cd2615900bd24da76374003d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 20 19:47:47 2010 +0100 + + Fix copyright + + poppler/PDFDoc.cc | 1 + + poppler/PDFDoc.h | 1 + + 2 files changed, 2 insertions(+) + +commit fa3abc23656204eedd022ee1c73d9e5af758cdac +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 22:20:09 2010 +0200 + + [cpp] More bits of API documentation. + + cpp/poppler-global.cpp | 124 + +++++++++++++++++++++++++++++++++++++++ + cpp/poppler-page-transition.cpp | 32 ++++++++++ + cpp/poppler-rectangle.cpp | 19 ++++++ + 3 files changed, 175 insertions(+) + +commit c5f7b5becc9993c05b67a470d5a1e431806b98d6 +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 20:26:37 2010 +0200 + + update copyrights + + qt4/src/poppler-private.cc | 2 +- + qt4/tests/check_strings.cpp | 18 ++++++++++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +commit ae517042570327b860c1db6b68f9697d5c104657 +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 19:39:10 2010 +0200 + + [cpp] improve a bit the Unicode* -> ustring conversion + + (although IMHO not yet solved) + + cpp/poppler-private.cpp | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f4c6ef88f01f6763943a3e6e006e52dbea0b149c +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 16:07:05 2010 +0200 + + [Qt4/tests] check_strings: add a new test case for + QStringToUnicodeGooString + + not much test data at the moment though + + qt4/tests/check_strings.cpp | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit ffd227b7669895325d752009d5185973cf86ce5b +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 14:25:57 2010 +0200 + + [Qt4] optimize UnicodeParsedString using less memory from QString + + - reserve() the right number of chars in the result string, so there + is less possibility to make it gr + ow its buffer + - do not call unicodeToQString() just to create a 1 character string, + but directly append a QChar crea + ted with the resulting unicode value (always belonging to the BMP) + + this should reduce of a very little bit the memory usage, while give + a sensible speedup of UnicodeParsedString invocations + + qt4/src/poppler-private.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6180890008f2b1814f092f50b8f75376399905ba +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 13:23:25 2010 +0200 + + [Qt4/tests] check_strings: add a test case for UnicodeParsedString + + very simple test data for it, at the moment + + qt4/tests/check_strings.cpp | 48 + +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +commit c5f78d7d3953d62a746c6f5a90085ea020fe5ec7 +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 12:54:32 2010 +0200 + + [Qt4/tests] check_string: use a pool of GooString + + this way we can reuse the GooString in a data set even after a test + run (eg in benchmarks), + making sure they all are properly freed + + qt4/tests/check_strings.cpp | 35 ++++++++++++++++++++++++++++++----- + 1 file changed, 30 insertions(+), 5 deletions(-) + +commit 0cd5a256bdf7778c0c720941a611ad8ab56fa2e9 +Author: Pino Toscano <pino@kde.org> +Date: Fri Sep 17 00:27:53 2010 +0200 + + [Qt4/tests] first version of a unit test for strings + + this is used for testing the various string conversions: + - unicodeToQString + - UnicodeParsedString + - QStringToUnicodeGooString + - QStringToGooString + the 1st and the 4th have basic tests + + given private symbols are used, this unit test is not compiled on + windows (at least, it supposed to be so) + + qt4/tests/CMakeLists.txt | 3 ++ + qt4/tests/Makefile.am | 7 ++- + qt4/tests/check_strings.cpp | 101 + +++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 110 insertions(+), 1 deletion(-) + +commit c6e8b21c9829672e6ca42e6cdc0ca631a06af73f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 17 13:44:38 2010 +0200 + + [glib] docs: Document PopplerDocument properties + + glib/poppler-document.cc | 380 + +++++++++++++++++++++++++++------------------- + 1 file changed, 223 insertions(+), 157 deletions(-) + +commit d4a6c17255821925906c17b79b88eebed9edfee1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 17 13:04:33 2010 +0200 + + [glib] Add accessor for all PopplerDocument properties + + PopplerDocument:linearized is now a boolean value rather than string, + so this commit breaks the API again. + + glib/demo/info.cc | 8 +- + glib/poppler-document.cc | 532 + ++++++++++++++++++++++++++++------- + glib/poppler-document.h | 74 +++-- + glib/reference/poppler-sections.txt | 16 ++ + 4 files changed, 498 insertions(+), 132 deletions(-) + +commit a5fec843dbb40fdd2007b926405b96789b21496d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 17 10:38:14 2010 +0200 + + [glib-demo] Show permanent/update ID in document info demo + + glib/demo/info.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit bfaf8f3cc62f28c6255d42680b9464ab9973737e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 17 10:37:32 2010 +0200 + + [glib] Add poppler_document_get_id() to get the PDF file identifier + + glib/poppler-document.cc | 52 + +++++++++++++++++++++++++++++++++++ + glib/poppler-document.h | 3 ++ + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 56 insertions(+) + +commit b15641677447b2e89853a667fc34bcca1383a97a +Author: srinivas adicherla <srinivas.adicherla@gmail.com> +Date: Fri Sep 17 10:36:22 2010 +0200 + + Add a method to get the PDF file identifier + + poppler/PDFDoc.cc | 65 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/PDFDoc.h | 3 +++ + 2 files changed, 68 insertions(+) + +commit 3b4a901a4431814590449b6cd5ea418f4d6c1172 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 16 23:23:03 2010 +0100 + + Add -s option + + Writes a single html file + Since git does not allow multiple authors i'm adding them here + OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar + Potdar (onkar@cdacmumbai.in) + + utils/HtmlFonts.cc | 11 +++++-- + utils/HtmlFonts.h | 18 +++++++++-- + utils/HtmlOutputDev.cc | 84 + ++++++++++++++++++++++++++++++------------------ + utils/pdftohtml.1 | 3 ++ + utils/pdftohtml.cc | 15 +++++++-- + 5 files changed, 93 insertions(+), 38 deletions(-) + +commit 2792330f6caeeb42e2996271456b562489215c4c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 15 22:42:09 2010 +0100 + + new soversions + + CMakeLists.txt | 2 +- + cpp/CMakeLists.txt | 2 +- + cpp/Makefile.am | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 4 ++-- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 2 +- + 8 files changed, 9 insertions(+), 9 deletions(-) + +commit 1cf56c732b63d0a310bc45b8e4b3f3f357a42cb1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 15 20:56:42 2010 +0100 + + 0.15.0 in the versions + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 4ec0be498b557c3cf631e43823c6d7004304dff3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 15 20:56:34 2010 +0100 + + 0.15.0 NEWS + + NEWS | 90 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 90 insertions(+) + +commit c01a17745c04aef3e6f2225679c867a03e731e83 +Author: Pino Toscano <pino@kde.org> +Date: Thu Sep 16 20:55:56 2010 +0200 + + [CMake] disable the GObject introspection system + + it cannot complete the scanning propecure correctly without libtool + it seems + + CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9be7d3143b12f291409f88f3d725a239934b205e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 15 19:19:30 2010 +0100 + + update copyright + + poppler/OptionalContent.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b9333529bba43a71655fdbf1919ba515f7df9ca3 +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 15 17:23:54 2010 +0200 + + [cpp/tests] poppler-dump: convert out_ustring() to an + operator<<(std::ostream&) + + so we have a chance to better output the bytearray of a string to + the stream + + cpp/tests/poppler-dump.cpp | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +commit a44f711b4412332875337e9fb7509f18db806ddc +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 15 16:44:30 2010 +0200 + + [cpp/tests] poppler-dump: add a "--show-text <physical|raw>" option + + ... to show the text of a page in the specified layout + + cpp/tests/poppler-dump.cpp | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit 0094c9372b5b439af2564d83d6fb7439f4bdba88 +Author: Pino Toscano <pino@kde.org> +Date: Wed Sep 15 13:19:13 2010 +0200 + + [cpp] add a new page::text() for specifying a layout mode + + add a new text_layout_enum enum for the layout mode, used by the + new text() + make the old text() implementation call the new one with the old value + (= physical) + add & adapt the apidox accordingly + + cpp/poppler-page.cpp | 27 +++++++++++++++++++++++++-- + cpp/poppler-page.h | 5 +++++ + 2 files changed, 30 insertions(+), 2 deletions(-) + +commit 4ec3e7784cdba5c0720b1992ba500e97a7e0ed2b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Sep 15 11:24:07 2010 +0200 + + Set initial state of optional content groups based on BaseState field + + There's a test case using BaseState attached to bug #30106 + + poppler/OptionalContent.cc | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit f49aa86812ed8ad91d41c675bc670b3d88d3444a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Sep 13 14:37:10 2010 +0200 + + [glib] doc: Document PopplerPage:label property + + glib/poppler-page.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit f41fe7ae6e374100574c49d1bb7a3ddc646786c8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Sep 13 14:36:43 2010 +0200 + + [glib] doc: Add poppler_page_get_label to poppler-sections.txt + + glib/reference/poppler-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 91b8246766a8e5d9cca385b5854667d7967a9d71 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Sep 13 14:22:56 2010 +0200 + + [glib-demo] Use poppler_page_get_label() instead of g_object_get() + + glib/demo/page.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b82412ef86091f4d249c818cebf00e4c59bae311 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Sep 13 14:22:03 2010 +0200 + + [glib] Add poppler_page_get_label() + + It's just an accessor for the property label + + glib/poppler-page.cc | 47 + ++++++++++++++++++++++++++++++++++------------- + glib/poppler-page.h | 1 + + 2 files changed, 35 insertions(+), 13 deletions(-) + +commit ff88abf61f4bf90ad276a8593be1818d39c8ecac +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Sep 13 10:05:45 2010 +0200 + + [glib] Avoid core headers to be parsed by the g-i scanner + + glib/poppler-document.cc | 2 ++ + glib/poppler-page.cc | 2 ++ + glib/poppler-private.h | 3 +++ + 3 files changed, 7 insertions(+) + +commit 53324502898ae5fbbb21a4fb819e4a84acdc1a64 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 12 11:42:03 2010 +0200 + + [glib] Fix a crash when building layer actions + + Some layers are just the parent of others, but not actually a layer so + they don't have an optional content object. Fixes bug #30106. + + glib/poppler-action.cc | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit dfc6ea7877635212aa7c5f7ade07af4aa9467e96 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 12 11:36:58 2010 +0200 + + [glib] Fix layers array generation when it contains multiple arrays + + Fixes layers for document attached to bug #30106. + + glib/poppler-document.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 7574912b6c0ff0421c69b6e8c6835957d5126d7d +Author: Jonathan Liu <net147@gmail.com> +Date: Thu Sep 9 20:34:03 2010 +0100 + + Fix checking whether _WIN32 is defined + + Bug 29329 + + poppler/StdinCachedFile.cc | 2 +- + utils/pdftoppm.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 2fc83068c32e09fa3de03a157a420490431ea706 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 5 14:26:27 2010 +0100 + + Increase the number of cached glyphs for small sizes + + Should not increase memory usage much and gives me a 17% speed + increase + in the firefox nytimes advertisment pdf + + splash/SplashFont.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 0d96f74f31171c58a55e4ac36d492ce36dd5e7c5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 5 12:31:57 2010 +0100 + + Use std::sort instead of qsort + + Gives a nice speed improvement without any real code change + Passes regression tests + Based on Paweł Wiejacha patches + + poppler/GfxFont.cc | 17 ++++++--------- + splash/SplashXPath.cc | 48 + +++++++++++++++++++++++++++--------------- + splash/SplashXPathScanner.cc | 10 +++++---- + 3 files changed, 44 insertions(+), 31 deletions(-) + +commit 3b4816b2b8caa0e2baafbe4c0eb1e45e452d01ce +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 1 20:43:35 2010 +0100 + + forgot the file + + qt4/tests/poppler-texts.cpp | 40 + ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + +commit b0db93c71a83946aa3e02bae6b396223dcca19d1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 1 20:43:14 2010 +0100 + + add since and rename enum + + qt4/src/poppler-page.cc | 2 +- + qt4/src/poppler-qt4.h | 5 ++++- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit a86f9d90be99a36c41c6932fb4d9a202c4ff6d05 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 1 20:20:48 2010 +0100 + + Clarify the ownership + + qt4/src/poppler-qt4.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 33ad3a17ac26879fcd6a7fad2023dd219bc5919f +Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp> +Date: Wed Sep 1 20:19:54 2010 +0100 + + Add a way to access the raw text + + poppler/TextOutputDev.cc | 23 ++++++++++++++++++++--- + qt4/src/poppler-page.cc | 11 +++++++++-- + qt4/src/poppler-qt4.h | 19 +++++++++++++++++++ + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 7 ++++++- + 5 files changed, 55 insertions(+), 6 deletions(-) + +commit 46e89248b3c5b1789baa3bd9bfa012570720ddb5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 1 19:54:02 2010 +0100 + + quadding is not a GBool but an int + + poppler/Annot.cc | 2 +- + poppler/Annot.h | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit ae79fc504c5424be2fa21dbc5498ced4db6e5dd3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 31 22:14:57 2010 +0100 + + Make GBool a bool instead of an int + + Passes the regression tests and might make things faster and use a bit + less memory + + cpp/tests/CMakeLists.txt | 2 +- + cpp/tests/Makefile.am | 2 +- + goo/gtypes.h | 7 +- + utils/CMakeLists.txt | 2 +- + utils/Makefile.am | 2 +- + utils/parseargs.c | 208 + ---------------------------------------------- + utils/parseargs.cc | 208 + ++++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 216 insertions(+), 215 deletions(-) + +commit d3f32f2c4f9f46620c0287c44bef686f340461f3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 31 18:51:17 2010 +0100 + + Read from the correct variable + + Fixes crash on KDE bug 249586 + + poppler/Movie.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 681bb38eafc720b309172ed7c650439c559663a0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 26 23:55:58 2010 +0100 + + Make declaration match what there is in the .cc file + + poppler/TextOutputDev.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c91e869304fc263c52f21ee484a57a6f1900f6b2 +Author: Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp> +Date: Thu Aug 26 19:40:46 2010 +0100 + + Add -r option to pdftohtml + + Fixes bug 29551 + + utils/pdftohtml.1 | 3 +++ + utils/pdftohtml.cc | 18 +++++++++++++----- + 2 files changed, 16 insertions(+), 5 deletions(-) + +commit 9b4be586640b4ad344b1b3ed4c9cda8351257f0c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 25 19:26:30 2010 +0100 + + Use 3 not nComps + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 218f67c527fb41babf2703ba068d072f8326e37b +Author: Paweł Wiejacha <pawel.wiejacha@gmail.com> +Date: Tue Aug 24 23:47:06 2010 +0100 + + Make SplashOutputDev::imageSrc faster + + By using getRGBLine when possible + + poppler/SplashOutputDev.cc | 39 ++++++++++++++++++++++++++++++--------- + 1 file changed, 30 insertions(+), 9 deletions(-) + +commit 868f4a1f22051b7978f47a0614f23fd66dbb7ca8 +Author: Paweł Wiejacha <pawel.wiejacha@gmail.com> +Date: Tue Aug 24 23:35:21 2010 +0100 + + Make GfxICCBasedColorSpace::getRGBLine faster + + By calling doTransform less + + poppler/GfxState.cc | 15 +++++++-------- + poppler/GfxState.h | 4 +++- + 2 files changed, 10 insertions(+), 9 deletions(-) + +commit 46e37c54c6365cf37dc1e223a3c146e7b96a56af +Author: Paweł Wiejacha <pawel.wiejacha@gmail.com> +Date: Tue Aug 24 21:23:34 2010 +0100 + + Do not call pow three times when one is enough + + poppler/GfxState.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 8591c804598576556c6d24a66b6648de8ed1c4eb +Author: Mike Slegeir <tehpola@yahoo.com> +Date: Sun Aug 22 22:01:03 2010 +0100 + + Use splash instead of external gs invocation to render the background + + Patch in bug 19404, should fix 9746 too + + utils/pdftohtml.1 | 8 +- + utils/pdftohtml.cc | 210 + +++++++++++++++++++++++++++++++++++++--------------- + 2 files changed, 158 insertions(+), 60 deletions(-) + +commit 7fc3c21a8c5d6cf8517100427b182887a9569ed0 +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Fri Aug 20 20:24:31 2010 +0100 + + Fix failure to parse PDF with damaged internal structure + + Patch in bug 29189, fixes bug 3870 + + poppler/PDFDoc.cc | 24 ++++++++++++---- + poppler/XRef.cc | 80 + ++++++++++++++++++++++++++++++----------------------- + poppler/XRef.h | 5 ++-- + 3 files changed, 68 insertions(+), 41 deletions(-) + +commit bedf48d4397ae412a6d28fc8fea16cc23a29f07c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 17 22:02:59 2010 +0100 + + use memset instead of a for + + splash/Splash.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 03ca5b4a5c9964d9c0e9913eb2061692848c4b95 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 10 19:55:31 2010 +0100 + + Update copyrights + + goo/GooTimer.cc | 1 + + goo/GooTimer.h | 1 + + goo/gfile.cc | 2 +- + poppler/DCTStream.cc | 1 + + poppler/DCTStream.h | 1 + + poppler/GfxState.cc | 2 +- + poppler/Page.cc | 2 +- + qt4/src/poppler-annotation.cc | 2 +- + 8 files changed, 8 insertions(+), 4 deletions(-) + +commit 3bca8ddc10bf4291bf0c0e39c67341a05953e949 +Author: Jonathan Liu <net147@gmail.com> +Date: Tue Aug 10 19:42:40 2010 +0100 + + Tell windows we are writing/reading binary data + + Bug #29329 + + poppler/StdinCachedFile.cc | 9 +++++++++ + utils/pdftoppm.cc | 9 +++++++++ + 2 files changed, 18 insertions(+) + +commit bdd617f2177a7836f6b6686fde892664513a32a7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Aug 3 13:05:26 2010 +0200 + + [glib] Fix a crash when a layer doesn't have a name + + Fixes bug #28842. + + glib/poppler-layer.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e9f0646ca664cc27825f7e084f8419fe0de1fcfc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Aug 3 13:02:52 2010 +0200 + + Catalog page array might contain NULL for some pages in invalid + documents + + Fixes a crash reproducible with gtk-splash-test when opening document + attached to bug #28842. + + poppler/PDFDoc.cc | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +commit 842209782ca3ba8c1c783cccf565372a18b3fda5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 30 19:29:12 2010 +0100 + + Do not crash when using pdftops in some files + + Fixes crash in file in kde bug 246269. The output is still wrong + though + + fofi/FoFiType1C.cc | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 0dd7c80b7baf2622eb4780a867c4dc6291773f3b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 26 23:58:26 2010 +0100 + + Do not overwrite the rgb values + + Recommended by Koji Otani in Re: [poppler] Question about code + Passed the regression testing in my files + + poppler/GfxState.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 627edf88c8f5c073a68bd05990df56e1af547292 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 25 13:56:03 2010 +0200 + + [annots] Fix a crash when adding a new annotation and annots object + is an array + + When annots object is an array instead of a ref, the modified + object is + actually de page object. + + poppler/Page.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 5d86f9b600b1e10de93bcaf1b925fadbc2a47522 +Author: mpsuzuki <mpsuzuki@hiroshima-u.ac.jp> +Date: Sat Jul 24 15:12:05 2010 +0100 + + reindent correctly + + poppler/TextOutputDev.cc | 34 +++++++++++++++++----------------- + 1 file changed, 17 insertions(+), 17 deletions(-) + +commit d0a6f9abdab88ec43004b6766337db304cbf6a25 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jul 22 21:28:55 2010 +0200 + + [CMake] improve the way include dirs and cflags for gdk and gtk + are set + + correctly include_directories() for the include dirs, while add the + cflags which are not include dirs as definitions + + glib/CMakeLists.txt | 5 +++-- + glib/demo/CMakeLists.txt | 5 ++++- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 02d85dd2cc154dbb6caa04a349532033d833edd1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 20 13:53:56 2010 +0200 + + [glib-demo] Add support for adding annots in annot demo + + glib/demo/annots.c | 114 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 114 insertions(+) + +commit 969cb850f5c2bc31de82c591b2b3210b5cfabf5f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 20 13:53:29 2010 +0200 + + [glib] docs: Add new symbols to poppler-sections.txt + + glib/reference/poppler-sections.txt | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 251959438b6257fe71ed58e79eec60cda68a66cf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 20 13:53:00 2010 +0200 + + [glib] Add poppler_page_add_annot() + + glib/poppler-document.cc | 7 ++++--- + glib/poppler-page.cc | 19 +++++++++++++++++++ + glib/poppler-page.h | 2 ++ + 3 files changed, 25 insertions(+), 3 deletions(-) + +commit 78a4f6976e708f2cc23aac49fbff0faf00e74bc3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 20 13:51:16 2010 +0200 + + [glib] annots: Add several setter methods + + glib/poppler-annot.cc | 278 + +++++++++++++++++++++++++++++++++++++++++++----- + glib/poppler-annot.h | 26 +++++ + glib/poppler-private.h | 6 ++ + 3 files changed, 285 insertions(+), 25 deletions(-) + +commit fee488c9db60ab691ce9ff5eef284be2af897aee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 18 11:26:59 2010 +0200 + + [annots] Add AnnotMarkup::setOpacity + + poppler/Annot.cc | 8 ++++++++ + poppler/Annot.h | 1 + + 2 files changed, 9 insertions(+) + +commit d15a355ede2d8510c4df847ea0b92b5357b29914 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 18 09:57:35 2010 +0200 + + Set the page reference (P in annot dict) when adding a new annot to + a page + + poppler/Annot.cc | 9 +++++++++ + poppler/Annot.h | 3 +++ + poppler/Page.cc | 2 ++ + 3 files changed, 14 insertions(+) + +commit 49ffb46db3118db874d2d9830bb034762d625c61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 19 16:31:54 2010 +0100 + + Remove exception support + + We don't use it and don't even support it properly + + CMakeLists.txt | 1 - + config.h.cmake | 3 --- + configure.ac | 4 --- + goo/gmem.cc | 56 + ++++++++++++---------------------------- + goo/gmem.h | 38 ++++++++------------------- + poppler/poppler-config.h.cmake | 5 ---- + poppler/poppler-config.h.in | 5 ---- + 7 files changed, 27 insertions(+), 85 deletions(-) + +commit dd2e9399868e3dbf2fa4ede050f8d74d29ebbbb4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 19 16:31:43 2010 +0100 + + add uninstalled.pc to ignore + + .gitignore | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit d1033006aae381a0f075e02d54638a1af997caf3 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 17 21:46:14 2010 +0200 + + add FindGObjectIntrospection.cmake and + GObjectIntrospectionMacros.cmake to the dist + + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit ce8d03950736cc35d035a44a7d88e5f2a9defa74 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 17 21:39:08 2010 +0200 + + [CMake/glib] add support for gobject-introspection + + other than a module to find (using pkg-config) gobject-introspection, + this adds a macro (gir_add_introspections) to add new introspections + in a directory. + its working is much similar (even the variable names used) to + the Makefile version provided by gobject-repository itself, with + the notable difference of a disabled libtool in the g-ir-scanner + invocation. + the only additional step needed is adding two custom targets, compiled + by ALL, which have the gir and the typelib files as dependencies, + to make them build with the usual `make all'. + + CMakeLists.txt | 5 +- + cmake/modules/FindGObjectIntrospection.cmake | 61 +++++++++++++++ + cmake/modules/GObjectIntrospectionMacros.cmake | 94 + ++++++++++++++++++++++++ + glib/CMakeLists.txt | 36 +++++++++ + 4 files changed, 194 insertions(+), 2 deletions(-) + +commit 78bf43d8e11aa52db9862af118c597e117d31083 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 17 20:28:58 2010 +0200 + + [CMake] properly use the glib2 include dirs + + properly use GLIB2_INCLUDE_DIRS (pkg-config result) for the glib + include dirs, + while turn GLIB2_CFLAGS into GLIB2_CFLAGS_OTHERS to add the remaining + CFLAGS as definitions + + glib/CMakeLists.txt | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6f3082d677bc62aa3f8124132e3e337c01be2629 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 17 19:28:09 2010 +0200 + + [CMake] split the generated sources of poppler_glib_SRCS in an own + poppler_glib_generated_SRCS + + glib/CMakeLists.txt | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 2a252dd9b05857bbd10dee235e873886fc74ec17 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 17 14:57:38 2010 +0200 + + [CMake] add stub message and TODO for the gobject-introspection + support + + CMakeLists.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit 8a3d1794a8ef5d525bb454755fec018e3fcb3816 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 16 14:00:32 2010 +0100 + + update + + TODO | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 31ac578942b82cbd16b064abca586ccb89dfa7ce +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 15 15:05:10 2010 +0200 + + Rework ChangeLog generation to fix make distcheck + + Makefile.am | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +commit 5da5825ecab63089a19aac694826271019a94e6d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 15 15:03:20 2010 +0200 + + [glib] docs: Add version.xml to content_files var + + glib/reference/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fe69b474ae63c9d5d2538db9e51e666dd6ea9fb3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 15 10:51:21 2010 +0100 + + Fix padding of names + + The previous method returned 2 for documents with 100 pages, which + is wrong as 100 needs 3 + characters, not 2 + + utils/pdftoppm.cc | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit e265ae2d8a46df00ab1bbd863f01f652068d265f +Author: Brian Cameron <brian.cameron@oracle.com> +Date: Wed Jul 14 20:26:25 2010 +0100 + + Add uninstalled .pc file for poppler when using autoconf + + Makefile.am | 9 ++++++++- + configure.ac | 9 ++++++++- + poppler-cairo-uninstalled.pc.in | 6 ++++++ + poppler-cpp-uninstalled.pc.in | 7 +++++++ + poppler-glib-uninstalled.pc.in | 7 +++++++ + poppler-qt-uninstalled.pc.in | 7 +++++++ + poppler-qt4-uninstalled.pc.in | 7 +++++++ + poppler-splash-uninstalled.pc.in | 7 +++++++ + poppler-uninstalled.pc.in | 6 ++++++ + 9 files changed, 63 insertions(+), 2 deletions(-) + +commit 552ab99e60fe4068be8e4e415924e4be289e47cd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 13 10:18:01 2010 +0200 + + Handle ColorTransform in DCT streams when using libjpeg + + Fixes bug #28873. + + poppler/DCTStream.cc | 30 ++++++++++++++++++++++++++++++ + poppler/DCTStream.h | 1 + + 2 files changed, 31 insertions(+) + +commit 8a6697f89625106f3c373dbc7b4dc521e22502f7 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jul 3 16:42:04 2010 +0200 + + Only define findModifier() when used + + Prevents a warning when building with win32 font backend. + + poppler/GlobalParams.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b1fdb87a4ebb5079c731256cce1870de8c54c65d +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 2 10:53:20 2010 +0200 + + Fix compile warnings on auto imports for mingw compiler + + cpp/Makefile.am | 2 +- + cpp/tests/Makefile.am | 2 ++ + glib/Makefile.am | 2 ++ + poppler/Makefile.am | 2 +- + qt4/demos/Makefile.am | 2 ++ + qt4/src/Makefile.am | 2 +- + qt4/tests/Makefile.am | 2 ++ + 7 files changed, 11 insertions(+), 3 deletions(-) + +commit 9e577110134eb1e093e697b7504efca759000086 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 2 10:51:24 2010 +0200 + + Check for declaration of gettimeofday() + + The function gettimeofday() is not declared in ansi mode with the + mingw compiler, even though the function exists. Therefore, + configure must + not only check with AC_CHECK_FUNC, but also with AC_CHECK_DECL. + + Also, the checks must run in a C++ context because that is where + gettimeofday() is used. + + configure.ac | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 58c8430ac584f3ba5e97aceb148e6287bfc45f95 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 30 15:06:44 2010 +0200 + + Set -ansi compiler flag early in configure.ac + + The -ansi compiler flag does not enable warnings, but turns of certain + features of GCC. To force feature tests to use this flag, it should be + set early in configure.ac + + This is important for the mingw compiler where header files refrain + from declaring certain function (e.g. gettimeofday()) when the -ansi + flag is set. + + configure.ac | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit e3663a855a9c86f0a3988a7a50fa40d37d0ea069 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 2 14:45:15 2010 +0200 + + Use MAX_PATH instead of _MAX_PATH everywhere + + _MAX_PATH is compiler specific and not availble with the mingw + compiler + in ansi mode. MAX_PATH is in the Windows api and thus always available + when windows.h is included. + + goo/gfile.cc | 4 ++-- + poppler/GlobalParams.cc | 2 +- + poppler/PDFDoc.cc | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 7227c407d23a37f5d95e6c01cb7411be2f82ca85 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 30 16:15:06 2010 +0200 + + Check for _WIN32 instead of _MSC_VER + + goo/GooTimer.cc | 6 +++--- + goo/GooTimer.h | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 34e727e011529be312313a1f4d4fa1ba9c545888 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Jun 29 16:43:31 2010 +0200 + + Fix cross compiling for Windows with autotools + + When cross compiling for Windows with autotools, libtool creates + libpoppler_qt4_la-poppler-optcontent.lo instead of + poppler-optcontent.lo. Thus, explicitly using poppler-optcontent.lo to + create poppler-optcontent.moc does not work well. + + qt4/src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1bc2f4501ea4e56ca99ae4d94d6cf34cf33c2c7a +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Jun 29 15:34:22 2010 +0200 + + define poppler_qt4_EXPORTS when building with autotools + + Lets you build the qt4 bindings for Windows with automake/autoconf. + + qt4/src/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5825114a26cc6eece2e556063f640dda53ea1e11 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 11 12:24:20 2010 +0100 + + Compile++ + + glib/demo/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 5e4d8eeea0b9dba68420c164975418c76a53be85 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 10 15:54:28 2010 +0200 + + [pdf-inspector] Do not render for printing + + test/pdf-inspector.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e6824972a213a888ca0185b7ae0a75fc23f75797 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 10 15:52:15 2010 +0200 + + [annots] Use a transparency group for markup annots without AP and + opacity != 1 + + Fixes bug #623616. + + poppler/Annot.cc | 346 + +++++++++++++++++++++++++----------------------------- + poppler/Annot.h | 3 + + poppler/Gfx.cc | 9 +- + poppler/Gfx.h | 2 +- + 4 files changed, 165 insertions(+), 195 deletions(-) + +commit 70ce0b6ea1a0d61f5048d2ae49c639d74a643b29 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 9 17:04:00 2010 +0200 + + [annots] Clamp QuadPoints coords to annot rectangle instead of + ignore points + + Fixes appearance stream generation for document attached to bug + #623616. + + poppler/Annot.cc | 38 +++++++++++++++++++++----------------- + 1 file changed, 21 insertions(+), 17 deletions(-) + +commit 8a9e561bfe64f71e9f38c43e5c6be7e5069b2349 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 2 21:07:53 2010 +0200 + + Nicer autogen.sh output + + autogen.sh | 1 + + 1 file changed, 1 insertion(+) + +commit ce4d328294cea73f4b7368691dc1fed6bd45d569 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 2 20:51:47 2010 +0200 + + Add option for autogen.sh to skip configure + + If you do not want to automatically run configure when calling + autogen.sh, run it with: + + $ NOCONFIGURE=1 ./autogen.sh + + This feature is modeled after gnome-autogen.sh behaviour. + + autogen.sh | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit d7ee87c5d0a35c8d4fcc88bde4b8496c49f397c6 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Jul 6 15:16:08 2010 +0100 + + warnings-=2 + + poppler/GfxFont.cc | 3 ++- + utils/HtmlOutputDev.cc | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 1e7f457ca1617fd8c958feef8dd7e694476dedd9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 9 12:29:14 2010 +0200 + + [cairo] Use ceil to convert double to int in tilingPatternFill() + + Fixes rendering of page 2 of document attached to bug #28954. + + poppler/CairoOutputDev.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 91a7605eb51144f2e7dea69aa9454fff47c49bd2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 9 11:42:56 2010 +0200 + + [glib] Fix build when GDK is enabled + + glib/test-poppler-glib.cc | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +commit 09e3e0e9c5134688c4ed2af5cd3a12aa2986474c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 8 18:56:38 2010 +0200 + + [glib] Fix poppler_page_find_tex() when called more than once + + Fixes bug #27927 + + glib/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 25427bdecb219ffe6f0592d2ac36de60c247bfd9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 8 17:46:22 2010 +0200 + + Fix build when compiling without glib frontend + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 550684731356a66753ec19f5a8ca4b572db6d2d5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 8 17:16:02 2010 +0200 + + [glib-demo] Add selections demo + + glib/demo/Makefile.am | 2 + + glib/demo/main.c | 4 +- + glib/demo/selections.c | 687 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/selections.h | 31 +++ + 4 files changed, 723 insertions(+), 1 deletion(-) + +commit b257428150e2c13dcc24fd8f75e4ee2c679ab414 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 8 14:45:29 2010 +0200 + + [glib] Add poppler_page_get_selected_text() + + And change poppler_page_get_text() to return the text of the whole + page. For consistency with poppler_page_get_selection_region() + get_seletect_text() doesn't invert the y coords as get_text() + did. This + change breaks the API. Users of poppler_page_get_text should: + + - Use the new poppler_page_get_text() if they want the text of the + whole page + + - Use poppler_page_get_selected_text() if they want the text of the + selected area. In this case they shouldn't invert the y coords + anymore + before calling the method. + + glib/demo/text.c | 9 +------- + glib/poppler-page.cc | 43 + ++++++++++++++++++++++++++--------- + glib/poppler-page.h | 3 ++- + glib/reference/poppler-sections.txt | 1 + + 4 files changed, 36 insertions(+), 20 deletions(-) + +commit bedc88225c948ad1288b69c6c106adce36233442 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 7 11:55:47 2010 +0200 + + [cairo] Fix warning on signed/unsigned comparison + + poppler/CairoFontEngine.cc | 12 ++++++------ + poppler/CairoFontEngine.h | 8 ++++---- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit 092aa901b9ec35a48bc1fb229ad16a3b00eef5f2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 5 11:16:49 2010 +0200 + + [glib] docs: add some more introspection annotations + + glib/poppler-attachment.cc | 4 ++-- + glib/poppler-document.cc | 12 ++++++------ + glib/poppler-media.cc | 4 ++-- + glib/poppler-page.cc | 4 ++-- + 4 files changed, 12 insertions(+), 12 deletions(-) + +commit 6c4e14fd90d5ef2d6670a980ab2476b6fab58df7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 5 10:49:59 2010 +0200 + + [glib] docs: fix POPPLER_CHECK_VERSION() docs + + glib/poppler-features.h.in | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit ed324a867ecf1f616c4b2dc575f01d5cf1b67c38 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 2 18:28:45 2010 +0200 + + [glib] Rename instrospection files as 0.16 instead of 0.14 + + glib/Makefile.am | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit a55f567ff1ea0858eda13a024ed765a016f3bff0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 2 18:23:03 2010 +0200 + + [glib] docs: Remove unneeded empty line in doc comment + + glib/poppler-features.h.in | 1 - + 1 file changed, 1 deletion(-) + +commit f16015303422280eaa21c3144eca0f1a330dce8a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 2 18:19:13 2010 +0200 + + [glib] docs: Add GObject introspection annotations + + glib/poppler-annot.cc | 45 + +++++++++++++++++++------------------- + glib/poppler-document.cc | 8 +++---- + glib/poppler-page.cc | 23 ++++++++++++------- + glib/reference/poppler-docs.sgml | 2 ++ + 4 files changed, 43 insertions(+), 35 deletions(-) + +commit 60242038e4dce7f0c90f2bfa0e771120247dbc9d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 09:35:29 2010 +0200 + + [glib] Add GObject introspection support + + configure.ac | 5 +++ + glib/Makefile.am | 29 ++++++++++++++++ + m4/introspection.m4 | 94 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 128 insertions(+) + +commit 3160950a7d7161457405c9084c31af230329b3f0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 2 12:47:04 2010 +0200 + + [glib] docs: Add index of deprecated symbols + + glib/reference/poppler-docs.sgml | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 593db7acf6edce1267f69d12310bf4098ff24c97 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 2 12:44:39 2010 +0200 + + [glib] docs: deprecate GDK API + + glib/poppler-page.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 6facefb3fa8f97a9d330545308fb2d89c7f57fa0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 18:01:45 2010 +0200 + + [glib] docs: Add index of new symbols for versions 0.12, 0.14 and 0.16 + + glib/poppler-action.h | 10 +++++++--- + glib/poppler-annot.cc | 17 +++++++++++++++++ + glib/poppler-date.cc | 2 ++ + glib/poppler-document.cc | 16 +++++++++++++++- + glib/poppler-layer.cc | 12 ++++++++++++ + glib/poppler-media.cc | 14 ++++++++++++-- + glib/poppler-media.h | 3 +++ + glib/poppler-movie.cc | 6 ++++++ + glib/poppler-page.cc | 2 ++ + glib/reference/poppler-docs.sgml | 12 ++++++++++++ + 10 files changed, 88 insertions(+), 6 deletions(-) + +commit 166b78c0ce8a4536873c4f60b392c24c8a68e7aa +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 17:25:03 2010 +0200 + + [glib] docs: document PopplerMediaSaveFunc + + glib/poppler-media.h | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +commit 5cc0a51f88580c65ac2d5c6ff02b8cf14697b70c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 17:20:13 2010 +0200 + + [glib] Use the same name for parameter in function prototype + + glib/poppler-media.h | 10 +++++----- + glib/poppler-movie.h | 6 +++--- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit 6793fd8fd2d33d3d58c6556b5dbe6d0497e56646 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 15:49:49 2010 +0200 + + [glib] docs: document some enums in poppler-action + + glib/poppler-action.h | 92 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 92 insertions(+) + +commit 8e139696dbe19f54ad54364a711b929146f11080 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 15:02:58 2010 +0200 + + [glib] docs: mark structures in poppler-private.h as private + + glib/poppler-private.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit ccae7e574047d66c638003cc36fa1edeef4d35ed +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 14:59:50 2010 +0200 + + [glib] docs: document PopplerDocument enums + + glib/poppler-document.h | 65 + +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 65 insertions(+) + +commit 4fbff172693c38cdc4ae8070a55ceb706aa213cd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 14:26:53 2010 +0200 + + [glib] docs: document PopplerFontInfo + + glib/poppler-document.cc | 106 + ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 106 insertions(+) + +commit 465dd4897ff603a6fd96503cf4746fc808b0f827 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 12:59:39 2010 +0200 + + [glib] docs: document some enums + + glib/poppler.h | 55 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 55 insertions(+) + +commit de3d599ea9e948867cfe395f42ed659670110c4c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 12:31:10 2010 +0200 + + [glib] docs: document boxed types defined in poppler-page + + glib/poppler-page.cc | 147 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 79 +++++++++++++++++++++++++++ + 2 files changed, 226 insertions(+) + +commit 34c52190e1dbf4d3effa44b4408faa1fbae0d12d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 1 09:33:08 2010 +0200 + + [glib] Remove splash header file + + glib/poppler-page.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 6910545a487f206ccd059bb295d2312228dbf2ba +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 19:03:04 2010 +0200 + + [glib] docs: Remove invalid symbol from poppler-sections.txt + + glib/reference/poppler-sections.txt | 1 - + 1 file changed, 1 deletion(-) + +commit 65ea3b636cb5a38660e526a483a4d95f5acdf8db +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 19:02:32 2010 +0200 + + [glib] docs: fix typo + + glib/poppler-form-field.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 689bfec40b5b3030c2819cb4aac42c3ab6279278 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 19:01:47 2010 +0200 + + [glib] docs: Add missing doc for parameter + + glib/poppler-document.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 0b3d77627f255a4bf3da6ee875ad8d9eb931c96e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 19:00:59 2010 +0200 + + [glib] Use the same name for parameter in function prototype + + glib/poppler-page.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 19e1944c00ac2da6b18b015721fc3a8d1898a23a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 18:01:52 2010 +0200 + + [glib] docs: Add media and movie to docs + + glib/poppler-media.cc | 6 ++++++ + glib/poppler-movie.cc | 6 ++++++ + glib/reference/poppler-docs.sgml | 3 ++- + 3 files changed, 14 insertions(+), 1 deletion(-) + +commit ca48bee07e6b4a20ea7b40b472a335e75feb4739 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 17:56:50 2010 +0200 + + [glib] docs: Add missing types to poppler.types + + glib/reference/poppler.types | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 613ccf81317a007ed5017ee788466613a6699bb5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 17:54:22 2010 +0200 + + [glib] docs: rework poppler-sections.txt + + - Better organization of sections and contents + - Use of Standard and Private subsections + - Add missing sections + - Remove enums section + + glib/reference/poppler-sections.txt | 424 + ++++++++++++++++++++++++----------- + 1 file changed, 295 insertions(+), 129 deletions(-) + +commit b37556a32b79f8711ed7eca24abf19511872a70a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 12:01:44 2010 +0200 + + [glib] docs: Add index of symbols + + glib/reference/poppler-docs.sgml | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 7f5fa4e19b4e324a396d64261b9125c1a557ac84 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 12:00:35 2010 +0200 + + [glib] docs: Add version information + + configure.ac | 1 + + glib/reference/Makefile.am | 2 +- + glib/reference/poppler-docs.sgml | 7 ++++++- + glib/reference/version.xml.in | 1 + + 4 files changed, 9 insertions(+), 2 deletions(-) + +commit 848d5e158fa9eadd19a658db314ba3fff9d026e8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 30 11:30:41 2010 +0200 + + [glib] docs: do not use gtk-doc templates + + configure.ac | 2 +- + glib/poppler-action.cc | 6 + + glib/poppler-annot.cc | 6 + + glib/poppler-attachment.cc | 6 + + glib/poppler-attachment.h | 16 + + glib/poppler-document.cc | 8 + + glib/poppler-features.h.in | 59 ++++ + glib/poppler-form-field.cc | 6 + + glib/poppler-layer.cc | 6 + + glib/poppler-page.cc | 6 + + glib/reference/tmpl/poppler-action.sgml | 216 ------------ + glib/reference/tmpl/poppler-annot.sgml | 377 -------------------- + glib/reference/tmpl/poppler-attachment.sgml | 68 ---- + glib/reference/tmpl/poppler-document.sgml | 410 + ---------------------- + glib/reference/tmpl/poppler-enums.sgml | 246 ------------- + glib/reference/tmpl/poppler-features.sgml | 83 ----- + glib/reference/tmpl/poppler-form-field.sgml | 318 ----------------- + glib/reference/tmpl/poppler-layer.sgml | 83 ----- + glib/reference/tmpl/poppler-page.sgml | 483 + -------------------------- + glib/reference/tmpl/poppler-private.sgml | 148 -------- + glib/reference/tmpl/poppler-unused.sgml | 8 - + glib/reference/tmpl/poppler.sgml | 285 --------------- + glib/reference/tmpl/stamp-poppler-enums.sgml | 22 -- + gtk-doc.make | 78 +++-- + m4/gtk-doc.m4 | 2 +- + 25 files changed, 171 insertions(+), 2777 deletions(-) + +commit 16e15ac845206217086e2adac9f220e75c0c630d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 29 21:44:02 2010 +0100 + + bitmap can be null at this stage, check it isn't + + poppler/JBIG2Stream.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 38e5d28a184d0ca8df71a7ea910ce85d7a225e4e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 21 20:38:00 2010 +0100 + + more pow 0.5 -> sqrt + + poppler/GfxState.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 58a53ca0a4e8434e8478f8fe121067dcf05c017d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 21 19:24:20 2010 +0100 + + sqrt is much faster than pow 0.5 + + poppler/GfxState.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bf86a9fc464aca57ebec207a213dcc2cc6031940 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 21 19:20:47 2010 +0100 + + introduce getChars to save some method calls + + Can give us a decent speedup when we go a lot though this methods + + poppler/Catalog.cc | 12 +---- + poppler/DCTStream.cc | 51 ++++++++++++++------ + poppler/DCTStream.h | 3 ++ + poppler/GfxFont.cc | 22 ++------- + poppler/GfxState.cc | 30 +++--------- + poppler/JPEG2000Stream.cc | 67 +++++++------------------ + poppler/JPEG2000Stream.h | 38 ++++++++++++++- + poppler/Link.cc | 14 ++---- + poppler/Object.h | 4 ++ + poppler/Stream.cc | 90 ++++++++++++++++++---------------- + poppler/Stream.h | 118 + ++++++++++++++++++++++++++++++++++++++++++++- + 11 files changed, 279 insertions(+), 170 deletions(-) + +commit 65c14073a3b1035ca5fe3bd6667abd315272841e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 21 17:19:22 2010 +0200 + + Reduce pow operations in GfxCalRGBColorSpace::getXYZ() + + We were doing the same pow operation 3 times!. It makes document + attached to bug #28591 render a little faster. + + poppler/GfxState.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 9365c05c1f66b3000febf32c45cef2ffe79e041a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 19 10:36:39 2010 +0200 + + [glib] Fix links/annots area for rotated documents with page CropBox + not starting at 0,0 + + Fixes bug #28588. + + glib/poppler-page.cc | 25 ++++++++++--------------- + 1 file changed, 10 insertions(+), 15 deletions(-) + +commit d9504c0a288c84b68a516f715505d6bc94b911f5 +Author: Pino Toscano <pino@kde.org> +Date: Fri Jun 18 23:59:04 2010 +0200 + + [autotools] link the 'cpp' tests against libpoppler as well + + ... this way gatof() can be found correctly + should fix bug #28605 + + cpp/tests/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 62975737bcaa6e0a2ecab981aa3e0c8f2ff10571 +Author: Brian Cameron <brian.cameron@oracle.com> +Date: Fri Jun 18 19:22:17 2010 +0100 + + Compile with Sun Studio + + goo/ImgWriter.h | 3 ++- + goo/JpegWriter.h | 3 ++- + poppler/SplashOutputDev.cc | 6 ++++++ + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 7cbe3d1521aea8b484efb8663e75684e05b6fb61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 17 23:01:21 2010 +0100 + + Optimize Splash::compositeBackground + + Optimization takes into account the two most common cases, the + pixel not + being painted at all (alpha == 0) meaning we just copy the paperColor + and the pixel being opage meaning we have to do nothing + + splash/Splash.cc | 34 ++++++++++++++++++++++++++-------- + 1 file changed, 26 insertions(+), 8 deletions(-) + +commit f323e5e4cdcc20075ee7c722f7adc088c0772249 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 17 22:59:37 2010 +0100 + + Check the objects are num before reading them + + Might have caused the kde bug #241995 + + poppler/GfxState.cc | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 35e87d2062b1d82db0d765de5a6187122a0fa99c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 16 11:52:25 2010 +0200 + + [gib-demo] Add demo for poppler_page_get_text_layout() + + glib/demo/text.c | 182 + ++++++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 164 insertions(+), 18 deletions(-) + +commit ddcea568b3a7334e062d6214f43d0a2c2ec95be4 +Author: Daniel Garcia <danigm@yaco.es> +Date: Tue Jun 15 16:57:32 2010 +0200 + + [glib] Add poppler_page_get_text_layout() + + Returns an array of PopplerRectangle items and each Rectangle is a + text character position. + + The position in this array represent the offset in text returned by + poppler_page_get_text + + glib/poppler-page.cc | 91 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 4 ++- + 2 files changed, 94 insertions(+), 1 deletion(-) + +commit 6e9fe8832c37b560ac4d0b0e32d618bde70ee117 +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 16 00:22:59 2010 +0200 + + [Qt4] and support 'Print' named action here too... + + qt4/src/poppler-annotation.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 53c003f36af5d77f50fe238eaec4c5f7c3a485c7 +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 16 00:18:13 2010 +0200 + + [CMake] install the new goo/GooLikely.h + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 2ba752aabc8dad4bb35a351697b1590795c54ca4 +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 16 00:06:30 2010 +0200 + + update copyrights + + qt4/src/poppler-link.h | 3 ++- + qt4/src/poppler-page.cc | 1 + + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 38bf54bbad40288be763c6a1a89d90477c9ef89d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 15 23:05:43 2010 +0100 + + move the declaration of likely/unlikely to an own file in goo/ + + goo/GooLikely.h | 22 ++++++++++++++++++++++ + goo/Makefile.am | 1 + + poppler/Object.h | 9 +-------- + splash/Splash.cc | 4 +--- + 4 files changed, 25 insertions(+), 11 deletions(-) + +commit 9838edf8c7497858e3bac2743784a3259f61cfdd +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 15 22:54:34 2010 +0100 + + Protect us against negative y coordinates + + Happens very rarely, like in bug 28480 + + splash/Splash.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 8b32c3e9826d4462fd9d16fab4200ebb23251046 +Author: Pino Toscano <pino@kde.org> +Date: Tue Jun 15 23:55:01 2010 +0200 + + [Qt4/apidox] ok, now the *proper* version for 'Print'... + + qt4/src/poppler-link.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b54e5ac49f69bd1c906e517edcb436e042199cd5 +Author: Pino Toscano <pino@kde.org> +Date: Tue Jun 15 23:53:50 2010 +0200 + + [Qt4/apidox] add the proper version for the new 'Print' + + qt4/src/poppler-link.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 71ad18c3b6b73e23d71600d07ce00bdfaf0bef60 +Author: Pino Toscano <pino@kde.org> +Date: Tue Jun 15 23:51:01 2010 +0200 + + [Qt4] recognize the 'Print' named action here too + + qt4/src/poppler-annotation.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 96f60f2748ba76de0d296a9838dbd7181f506e36 +Author: Guillermo Amaral <gamaral@kdab.com> +Date: Tue Jun 15 23:47:46 2010 +0200 + + [Qt4] recognize 'Print' as name in named actions + + qt4/src/poppler-link.h | 3 ++- + qt4/src/poppler-page.cc | 2 ++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 25494311c5b8eb88d43df420ec91a1aedad20d05 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 17:44:23 2010 +0200 + + [glib] Add some G_UNLIKELY() + + glib/poppler-document.cc | 12 ++++++------ + glib/poppler-page.cc | 17 ++++++++++------- + 2 files changed, 16 insertions(+), 13 deletions(-) + +commit 52f133fb962256edb577b7f639c5c13221c6365d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 14:20:49 2010 +0200 + + [glib] Use g_slice for actions and destinations + + glib/poppler-action.cc | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +commit f035c94d8b5b34c0c3bb47b8cfc2f9c720a4fc71 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 14:01:07 2010 +0200 + + [glib] Use g_slice_dup in _copy() function for iterators + + glib/poppler-document.cc | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit c84f69681828c7e3b969f666f9b84f1531976c6f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 13:57:18 2010 +0200 + + [glib] Use g_slice for mappings and PopplerRectangle + + glib/poppler-page.cc | 50 + ++++++++++++++++++-------------------------------- + 1 file changed, 18 insertions(+), 32 deletions(-) + +commit e12b9ab105f3b56b47ded871693b939ed421c853 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 13:49:27 2010 +0200 + + [glib] Use poppler_image_mapping_free() instead of g_free() + + glib/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fb791a15f7472042fb2174e6f5df6924dd4eeb9b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 13:37:52 2010 +0200 + + [glib] Remove poppler_mapping_free and use poppler_link_mapping_free + instead + + glib/poppler-page.cc | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +commit 6186d7220e545eb89597626933a10acd0cd25173 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 13:16:59 2010 +0200 + + [glib] Use _new() methods instead of g_new() to create boxed structs + + glib/poppler-page.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 44639cb7b10ab6d66122ae2b6b7f3e5745f933bd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 15 10:39:00 2010 +0200 + + [glib-demo] Use poppler_rectangle_free() instead of g_free() + + glib/demo/find.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3ca304f3837af27ae49541a5f441d8729264a945 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 14 19:16:41 2010 +0100 + + Add more caching to ObjectStreams + + Makes opening of file from bug 26759 ten times faster + + poppler/XRef.cc | 62 + +++++++++++++++++++++++++++++++++++++++++++++++-------- + poppler/XRef.h | 4 ++-- + 2 files changed, 55 insertions(+), 11 deletions(-) + +commit cc2e5f190e19ee8169f67df2541302a2816873d3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 14 18:17:01 2010 +0200 + + [glib-demo] Support password protected documents + + glib/demo/main.c | 175 + ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 170 insertions(+), 5 deletions(-) + +commit 34b2dbb6bbaf0189c92eea6b7924999ab2b6ad11 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 14 17:41:51 2010 +0200 + + [glib-demo] Remove GLIB_CHECK_VERSION(), we already depend on + glib 2.18 + + glib/demo/attachments.c | 5 ----- + glib/demo/main.c | 32 +------------------------------- + 2 files changed, 1 insertion(+), 36 deletions(-) + +commit a52670a46c0561025d8b86cd2865603f0720c695 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 13 15:31:15 2010 +0100 + + do not distribute these two files + + they are generated on configure/cmake time and depend on the machine + + glib/Makefile.am | 7 +++---- + poppler/Makefile.am | 4 ++-- + 2 files changed, 5 insertions(+), 6 deletions(-) + +commit eb0206ba8458f1dba004ac7bef856dcbb2ccbba5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 9 18:56:16 2010 +0100 + + we need to ship these two files + + Bug 28458 + + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7dfdf1ee293b7d36a049a90d8a17462ed0e50f2c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 8 21:54:52 2010 +0100 + + Typo-- + + utils/pdftoppm.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 57cc04ee1a122794b338c0d9818dbdaea46a42d6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 8 21:49:40 2010 +0100 + + Add cropbox to the manpage + + utils/pdftoppm.1 | 3 +++ + 1 file changed, 3 insertions(+) + +commit f9e6cb9647981f7afbb20261b3ccedaf003657d2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 8 20:43:11 2010 +0100 + + 0.14.0 + + CMakeLists.txt | 4 ++-- + NEWS | 18 ++++++++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 24 insertions(+), 6 deletions(-) + +commit 963afdc39153fee69ecb939c98deeef4f64638de +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 8 20:29:58 2010 +0100 + + libpoppler-qt4.so.3.2.0 -> libpoppler-qt4.so.3.3.0 + + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit c1629be8011f3bddbf619246090640d62136d521 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 8 20:23:00 2010 +0100 + + Increase soname as _PopplerActionMovie struct grew + + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 5ef45b1e72aed88ece0905b1204edee641f3c8fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 8 19:35:20 2010 +0100 + + Do not exit when trying to allocate memory for the XRef fails + + See bug 28406 + + poppler/XRef.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit e7a5e9f70ee1283a2ca6734552d905279c97989b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 4 08:46:33 2010 +0100 + + a bit of docu + + poppler/Object.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9ff4dab2558f7c2700fd7fcaccacdad9619dbdda +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 4 08:44:34 2010 +0100 + + Add support for unsigned integer numbers + + So files store their P as a 32 bit unsigned instead of as a 32 bit + signed, making us to overflow our objInt parsing and rejecting to open + the file, this patch introduces objUint that only happens when the + number is not real, does not fit in a 32 bit integer but still fits + in a + 32 bit unsigned integer + + poppler/Lexer.cc | 32 +++++++++++++++++++++++++------- + poppler/Object.cc | 5 ++++- + poppler/Object.h | 14 +++++++++++--- + poppler/SecurityHandler.cc | 22 ++++++++++++++++++++++ + 4 files changed, 62 insertions(+), 11 deletions(-) + +commit 41e9af7f505dbfbda36f6ac97df90f2a42ab3160 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 1 21:40:07 2010 +0100 + + If the document is not encrypted it is ok to print + + poppler/XRef.cc | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit b15c793a8a58b17a7fe7b32c1037726e1e0e1bf0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 1 20:57:16 2010 +0100 + + Check it is a stream, not that it is not none + + People is reporting aborts, e.g. KDE bug 240208 + but can not check if this really fixes it since he can not share the + document + + poppler/Lexer.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit a72c68117ba05f3934e2df227cdcaf53a375f0ce +Author: Pino Toscano <pino@kde.org> +Date: Fri May 28 18:11:02 2010 +0200 + + [cpp apidox] add a start of API documentation for the 'page' class + + cpp/poppler-page.cpp | 68 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 68 insertions(+) + +commit acf7729e8e270e1b4b2a552272dc280ae6d7b352 +Author: Pino Toscano <pino@kde.org> +Date: Fri May 28 17:38:35 2010 +0200 + + [cpp] fix the font_iterator current page status + + cpp/poppler-font.cpp | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 4e017ff24a01cbbf1b39eedc3d7697f8b180fdd9 +Author: Pino Toscano <pino@kde.org> +Date: Fri May 28 17:15:28 2010 +0200 + + [cpp apidox] add API documentation for the 'font_info' and + 'font_iterator' classes + + cpp/poppler-font.cpp | 71 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 71 insertions(+) + +commit 2ff840b62e41e2fc98e9fcff7330f40216de58a5 +Author: Pino Toscano <pino@kde.org> +Date: Fri May 28 14:34:37 2010 +0200 + + [cpp] move the actual convert_date(const char*) implementation in + the detail + + this way it is possible to call it from inside poppler-cpp without + an implicit conversion to std::string + + cpp/poppler-document.cpp | 2 +- + cpp/poppler-embedded-file.cpp | 4 ++-- + cpp/poppler-global.cpp | 23 ++--------------------- + cpp/poppler-private.cpp | 25 +++++++++++++++++++++++++ + cpp/poppler-private.h | 2 ++ + 5 files changed, 32 insertions(+), 24 deletions(-) + +commit 8112e9111313eaded4cd2e89d0e67efb0f3e29db +Author: Pino Toscano <pino@kde.org> +Date: Fri May 28 13:13:50 2010 +0200 + + [cpp] add a time_type typedef + + ... defined as unsigned int, and use it all around + (it changes nothing for client code) + + cpp/poppler-document.cpp | 8 ++++---- + cpp/poppler-document.h | 2 +- + cpp/poppler-embedded-file.cpp | 4 ++-- + cpp/poppler-embedded-file.h | 4 ++-- + cpp/poppler-global.cpp | 4 ++-- + cpp/poppler-global.h | 4 +++- + 6 files changed, 14 insertions(+), 12 deletions(-) + +commit bc5bdb43b12437e00aaddc27a74b9ac4b6498446 +Author: Pino Toscano <pino@kde.org> +Date: Fri May 28 13:01:53 2010 +0200 + + use the proper type for iterating on a GooVector + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87128ab0dfec6be1a034361512ee41301b078831 +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Thu May 27 17:31:00 2010 +0200 + + [CMake] Do not force -O2, preserve compiler flags instead. + + cmake/modules/PopplerMacros.cmake | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 241c338facb45641ef1a271c904355a014bbf28d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 27 20:37:55 2010 +0100 + + Allow quality & progressive mode to be utilised in JpegWriter + + goo/JpegWriter.cc | 15 +++++++++++++-- + goo/JpegWriter.h | 4 ++++ + splash/SplashBitmap.cc | 18 +++++++++--------- + splash/SplashBitmap.h | 4 ++++ + 4 files changed, 30 insertions(+), 11 deletions(-) + +commit 9eda6e8aaae412a9882141d1b5b8c7bf0c823c68 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 25 23:44:30 2010 +0100 + + Do not follow loops blindly + + Fixes crash in pdf in bug 28172 + + poppler/XRef.cc | 21 +++++++++++++++------ + poppler/XRef.h | 7 ++++--- + 2 files changed, 19 insertions(+), 9 deletions(-) + +commit bbee6e0c8c9b181f8d19c167c867d74a765685fb +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 25 23:13:38 2010 +0100 + + update copyright + + poppler/JBIG2Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 80b72b9f2fd70395580205b8b176e0576e132cf5 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed May 26 13:07:57 2010 +0200 + + [autotools] sync autotool build with cmake build + + In addition to commit 69c2cf76cef9c190ac07726f60f1dccd3df5cb6d + + poppler/poppler-config.h.in | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 30ea3ab8a1eecafb3366aef193910098fdb7ccc8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 25 23:07:56 2010 +0100 + + Fix crash when parsing pdf in bug 28170 + + This code is a can of crashing worms :-7 + + poppler/JBIG2Stream.cc | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit b5a9021037c4e6cbbfd622433f3de693d1f47671 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 25 20:00:57 2010 +0100 + + 0.13.4 + + CMakeLists.txt | 2 +- + NEWS | 16 ++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + glib/reference/tmpl/poppler-action.sgml | 5 +++++ + glib/reference/tmpl/poppler-annot.sgml | 18 ++++++++++++++++++ + glib/reference/tmpl/poppler-attachment.sgml | 3 +++ + glib/reference/tmpl/poppler-document.sgml | 5 +++++ + glib/reference/tmpl/poppler-enums.sgml | 17 +++++++++++++++++ + glib/reference/tmpl/poppler-features.sgml | 3 +++ + glib/reference/tmpl/poppler-form-field.sgml | 3 +++ + glib/reference/tmpl/poppler-layer.sgml | 4 ++++ + glib/reference/tmpl/poppler-page.sgml | 13 +++++++++++++ + glib/reference/tmpl/poppler-private.sgml | 3 +++ + glib/reference/tmpl/poppler.sgml | 6 ++++++ + glib/reference/tmpl/stamp-poppler-enums.sgml | 3 +++ + qt4/src/Doxyfile | 2 +- + 17 files changed, 103 insertions(+), 4 deletions(-) + +commit 57ab0ebe993d79fe551bba58e0a70d55d32828f8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 12 20:49:31 2010 +0100 + + better copyright + + poppler/strtok_r.cpp | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 69c2cf76cef9c190ac07726f60f1dccd3df5cb6d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 12 20:47:25 2010 +0100 + + mingw does not provide strtok_r + + Copy the glibc implementation + + CMakeLists.txt | 1 + + poppler/Makefile.am | 1 + + poppler/poppler-config.h.cmake | 4 + + poppler/strtok_r.cpp | 189 + ++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 195 insertions(+) + +commit 9e9b5e0d87a7450bd2223538673321ecec720c36 +Author: Marek Kasik <mkasik@redhat.com> +Date: Tue May 11 12:06:17 2010 +0200 + + Better check of overlapping of table cells when selecting text + + Add check for overlapping of upper right cell with lower left cell + of assumed table (related to #3188). + + poppler/TextOutputDev.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit a3e40b460b7690ef73ccf143b10da07e91d9ee7f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon May 10 17:41:04 2010 +0200 + + [annots] Adjust bbox for line annots when y1 = y2 + + Some documents like pdf_commenting_new.pdf, have y1 = y2 but + line_width > 0, acroread renders the lines in such cases even + though the + annot bbox is empty. + + poppler/Annot.cc | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit e30d24c506a9ff742f8af5d6c71273abeddaa265 +Author: Pino Toscano <pino@kde.org> +Date: Tue May 4 15:19:26 2010 +0200 + + [cpp] ustring::{from,to}_utf8(): fix in/out buffer sizes + + cpp/poppler-global.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aaa19a673020e12dbfceb4d25ade0ece7875fd83 +Author: Pino Toscano <pino@kde.org> +Date: Tue May 4 12:07:43 2010 +0200 + + [cpp] make the pkg-config files really working + + poppler-cpp.pc.cmake | 6 +++++- + poppler-cpp.pc.in | 6 +++++- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit 8f963ccde41ef1faa719254fccc5bdfe75e9fa87 +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun May 2 18:42:10 2010 +0200 + + Windows: define strtok_r as strtok_s + + poppler/poppler-config.h.cmake | 4 ++++ + poppler/poppler-config.h.in | 4 ++++ + 2 files changed, 8 insertions(+) + +commit c9d8df51c96e50ad72f7954baba2254259fc894c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 1 19:52:51 2010 +0100 + + 2010 in these copyrights + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 9ce71fb35fdd66c55872956432160a5c76a62080 +Author: Jakub Wilk <ubanus@users.sf.net> +Date: Sat May 1 19:50:54 2010 +0100 + + Use strtok_r instead strtok + + strtok is not thread safe + + fofi/FoFiType1.cc | 8 +++++--- + poppler/CharCodeToUnicode.cc | 6 ++++-- + poppler/GlobalParams.cc | 6 ++++-- + poppler/PDFDoc.cc | 4 +++- + poppler/UnicodeMap.cc | 21 ++++++++++++++++++--- + 5 files changed, 34 insertions(+), 11 deletions(-) + +commit 6b2983f89e87792a393880dab6dc1fedb748db2c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 30 14:48:50 2010 +0200 + + [cairo] Set device offset and matrix to smask depending on the + group target + + It seems to fix all of my test cases. Fixes bug #27208. + + poppler/CairoOutputDev.cc | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +commit ac32021704178721ee007a6b6831283e323e500f +Author: Pino Toscano <pino@kde.org> +Date: Fri Apr 30 01:14:14 2010 +0200 + + demote the #warning to a simple FIXME comment + + poppler/ArthurOutputDev.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 8c1bc17552c989c15f318d9d109607a9a594ca6b +Author: Pino Toscano <pino@kde.org> +Date: Fri Apr 30 01:12:19 2010 +0200 + + MSVC: define fmax() and fmin() + + MSVC does not provide those functions, so we need to define them to + the existing max()/mix() macros. + Thanks to Patrick Spendrin for the hint! + + poppler/poppler-config.h.cmake | 5 +++++ + poppler/poppler-config.h.in | 5 +++++ + 2 files changed, 10 insertions(+) + +commit 71063d51a45835b0267a7e3f823ef49689cfd06f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Apr 29 20:28:07 2010 +0200 + + Make sure we are drawing text before calling endTextObject() + + This is actually the right fix for the previous commit. + + poppler/Gfx.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit e909219d8e92994bd52976f9676015fa6ca9fc91 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Apr 29 18:34:22 2010 +0200 + + Set textHaveCSPattern=false again before filling the pattern in + opEndText() + + Fixes cairo backend regressions caused by commit + ccf238b32e236f69c0507a5421ac2649dfa8d865. + + poppler/Gfx.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 29572d6ac7829b60efce2d8e489473c55e370f26 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 27 23:39:23 2010 +0100 + + fabs for doubles + + poppler/TextOutputDev.cc | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 4905e2bd764ea601e3bf9c5195c740e5bf186af5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 27 23:34:34 2010 +0100 + + fix include + + splash/SplashBitmap.cc | 1 + + 1 file changed, 1 insertion(+) + +commit f9f0e4b747a1527bd6354897cdba7954d58651de +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 27 14:26:23 2010 +0200 + + Fix first color stop offset of linear gradients + + Fixes bug #27837. + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5b822011029f3721fbafd4a7bf01b9d6fee35d25 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 24 18:18:08 2010 +0200 + + include standard float.h instead of unportable values.h + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dee7cb8691528293bb5b8f266970cdb6771e301b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 24 15:39:23 2010 +0100 + + 0.13.3 + + CMakeLists.txt | 2 +- + NEWS | 31 +++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 35 insertions(+), 4 deletions(-) + +commit 07864c9e2a7a32b48bdbab92c8b2f79bce1d9f5b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 24 13:07:02 2010 +0100 + + minor cleanups + + utils/HtmlLinks.cc | 15 ++------------- + utils/HtmlLinks.h | 16 ++++++++++++++-- + 2 files changed, 16 insertions(+), 15 deletions(-) + +commit e501eabb2f0775444a2bf64005a3a3f1ffa281b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 24 13:06:12 2010 +0100 + + Do not assume the parameter will have more than 5 chars + + utils/pdftohtml.cc | 30 ++++++++++++++++++------------ + 1 file changed, 18 insertions(+), 12 deletions(-) + +commit 6cc4d571339214e9eeeb682ba48fb220cef905f9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 24 13:04:05 2010 +0100 + + Fix end() to return the correct last valid value + + goo/GooVector.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 4ed53e30e735b79c46eab9d54883531c6e187b17 +Author: William Bader <williambader@hotmail.com> +Date: Fri Apr 23 22:52:24 2010 +0100 + + Silence some Illegal entry in bfrange block in ToUnicode CMap + + Fixes #27728 + + poppler/CharCodeToUnicode.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 16a004784043e2a8587c0c3c6d23889df8a80470 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 22 19:39:01 2010 +0100 + + Avoid the usage of std:: + + poppler/TextOutputDev.cc | 25 +++++++++++-------------- + 1 file changed, 11 insertions(+), 14 deletions(-) + +commit a7dcb2b4ffee57b7f78529cbaeaab647ab93de86 +Author: Pino Toscano <pino@kde.org> +Date: Thu Apr 22 13:31:41 2010 +0200 + + Windows: include config.h in GlobalParamsWin.cc only if not included + already + + GlobalParamsWin.cc is not compiled standalone but only #include'd by + GlobalParams.cc (on Windows only), so config.h has already included + already + as safety check, check for PACKAGE_NAME (#define'd in config.h) + before #include'ing it again + + poppler/GlobalParamsWin.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit fba076e17af24a9c9883504282316bba119a908c +Author: Pino Toscano <pino@kde.org> +Date: Thu Apr 22 13:24:04 2010 +0200 + + avoid accidental max() macro replacement with some compilers (eg MSVC) + + defining an empty macro and using it between "max" and "(", such + compilers won't try to replace their macro max(a, b) there; in any + case, empty spaces are just fine + + poppler/TextOutputDev.cc | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit ccf238b32e236f69c0507a5421ac2649dfa8d865 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Apr 21 19:21:37 2010 +0100 + + Improve colorizing text and masks in pattern colorspace + + Bug #27482 + + poppler/Gfx.cc | 137 + +++++++++++++++++++++----------------------- + poppler/Gfx.h | 4 +- + poppler/SplashOutputDev.cc | 41 +++++++++++-- + poppler/SplashOutputDev.h | 3 +- + 4 files changed, 106 insertions(+), 79 deletions(-) + +commit 8e86dfb328d94939ecf390d34af533b831b2837b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 21 19:19:53 2010 +0100 + + Add copyright + + poppler/TextOutputDev.cc | 1 + + poppler/TextOutputDev.h | 1 + + 2 files changed, 2 insertions(+) + +commit 6f9f3d33ff8058e28243ba45b8547e21ad0d088a +Author: Andre Klapper <a9016009@gmx.de> +Date: Wed Apr 21 19:57:15 2010 +0200 + + [glib-demo] Compile with -DGSEAL_ENABLE + + Fixes bug #27579. + + glib/demo/images.c | 2 +- + glib/demo/layers.c | 4 ++-- + glib/demo/render.c | 8 ++++---- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 6b14c18d60cae130869f9a5c7688dfe880602224 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Apr 21 19:56:49 2010 +0200 + + [cairo] Make sure we always use a new path in doPath() + + Fixes document + http://acroeng.adobe.com/Test_Files/images/transparency/Untitled-2.pdf + when rendering with cairo backend. + + poppler/CairoOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 4f71d64c69500ed78daf4d797c8af6cfbd3d970e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Apr 21 11:44:49 2010 +0200 + + [cairo] Fix pattern size when bbox is not at 0,0 + + poppler/CairoOutputDev.cc | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 9c5612f6e013a8698eff6531ec388a7e6c1fb89a +Author: Marek Kasik <mkasik@redhat.com> +Date: Fri Feb 12 14:31:01 2010 +0100 + + Distinguish between columns and tables when selecting text + + This commit add ability to detect tables in text by checking borders + of 4 neighbouring text blocks for arrangement (to the left, to + the right, + center, ...). Detected border of whole table is then stored in + ExMin, ExMax, + EyMin and EyMax of each block together with id of detected + table. Sorting + of blocks is then performed on the these borders to be able to + distinguish + tables from columns. + Pasting of selected text was modified so that tables are pasted + correctly + (even with multi line cells). + + poppler/TextOutputDev.cc | 490 + ++++++++++++++++++++++++++++++++++++++++------ + poppler/TextOutputDev.h | 5 + + 2 files changed, 437 insertions(+), 58 deletions(-) + +commit db014ffb357e760d9397544c5a8fe747cdb497ab +Author: Brian Ewins <brian.ewins@gmail.com> +Date: Mon Nov 23 08:58:19 2009 +0000 + + Select top right to bottom left in RTL mode + + This makes pure RTL selection work. Bidi is not handled at all. + Rendering of the selection is poor and the dumped text appears + to still be in reverse order to me. + + poppler/TextOutputDev.cc | 57 + ++++++++++++++++++++++++++++++++++------------ + 1 file changed, 43 insertions(+), 14 deletions(-) + +commit b1d43fa052d9160c4f319a67415ecf3ebf2cf9b3 +Author: Brian Ewins <brian.ewins@gmail.com> +Date: Sun Nov 22 09:47:40 2009 +0000 + + Make pdftotext newlines match copy and paste + + The output of pdftotext didn't insert line breaks, + resulting in jumbled text. Change the rules to + emit a newline at the end of each line unless + a hyphenation is being supressed, and an extra + newline at the end of each flow. + + poppler/TextOutputDev.cc | 17 +++-------------- + 1 file changed, 3 insertions(+), 14 deletions(-) + +commit f83b677a8eb44d65698b77edb13a5c7de3a72c0f +Author: Brian Ewins <brian.ewins@gmail.com> +Date: Thu Nov 12 02:50:29 2009 +0000 + + Use a reading-order sort to order blocks + + This switches the block sort from XY to reading order, + using the rules from T. Breuel's "High Performance + Document Layout Analysis". + + Signed-off-by: Brian Ewins <brian.ewins@gmail.com> + + poppler/TextOutputDev.cc | 164 + ++++++++++++++++++++++++++++++++++++++++++++-- + poppler/TextOutputDev.h | 8 +++ + 2 files changed, 167 insertions(+), 5 deletions(-) + +commit a2191a4d45e0abaec97c19aacae37c4c5824bd36 +Author: Brian Ewins <brian.ewins@gmail.com> +Date: Mon Nov 9 06:24:51 2009 +0000 + + Separate flow construction from reading order + + If the blocks were already in reading order, then + constructing flows is simplified, since blocks + cannot be picked out-of-order. Make this change + first in preparation for adding a reading-order + sort. + + Signed-off-by: Brian Ewins <brian.ewins@gmail.com> + + poppler/TextOutputDev.cc | 96 + ++++++++-------------------------------------- + 1 file changed, 17 insertions(+), 79 deletions(-) + +commit 345ed51af9b9e7ea53af42727b91ed68dcc52370 +Author: Brian Ewins <brian.ewins@gmail.com> +Date: Thu Oct 29 01:46:29 2009 +0000 + + Fix bug 3188, text selection across table cells + + Bug 3188. When selecting text, poppler goes across the whole + page then down, rather than across each cell, down that cell, + then across to the next cell. This leads to illegible paste + results. + + Teach TextPage to visit the selection in flow order rather than + block order. + + Signed-off-by: Brian Ewins <brian.ewins@gmail.com> + + poppler/TextOutputDev.cc | 334 + ++++++++++++++++++++++++---------------------- + 1 file changed, 178 insertions(+), 156 deletions(-) + +commit 12d83931ae1b899b70c7ea5c01f03f123b1bb9a8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 18 17:53:48 2010 +0200 + + [cairo] Check pattern status after setting matrix when rendering + images + + Fixes rendering of document attached to kde bug + http://bugs.kde.org/show_bug.cgi?id=135417. + + poppler/CairoOutputDev.cc | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit ff6d501a2fc887fd49a985161f756d6d6b8e6c0d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 18 17:51:42 2010 +0200 + + [cairo] Fix a crash when rendering 0x0 images + + See kde bug http://bugs.kde.org/show_bug.cgi?id=135417 + + poppler/CairoOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 84cd2186861436fbaa7c29aa691e69fcd543a1c2 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Apr 13 23:42:28 2010 +0200 + + Properly initialize variable + + poppler/CachedFile.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 24f244f486f332b0bd76c6525c5d9d03168a76e6 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Apr 13 23:54:28 2010 +0200 + + pdftops: require output filename when reading from stdin + + utils/pdftops.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 955f9f53ff225f6794a494fdd0f0fe5ee1a41d88 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Apr 13 23:47:40 2010 +0200 + + pdftotext: require output filename when reading from stdin + + utils/pdftotext.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 31388aa8b5117619878431b7fed2d033000af541 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Apr 13 23:27:20 2010 +0200 + + pdftohtml: require output filename when reading from stdin + + utils/pdftohtml.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit a8d43ec1c7f5448a7f63d9bbd9062d56ee1c7c58 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 14 19:21:33 2010 +0100 + + update XOPEN_SOURCE to 600 in non standard compile options + + it seems helps compiling on some BSD + + cmake/modules/PopplerMacros.cmake | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 4cce1f14e964edf1bf2d9fb8286ee002a67dc212 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 13 21:57:16 2010 +0100 + + include strings.h on non windows platforms + + poppler/GlobalParams.cc | 2 ++ + test/perf-test.cc | 2 ++ + 2 files changed, 4 insertions(+) + +commit 55c76069c52f9f51c6b8c60fe1aa8de499012ea8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Apr 12 19:32:46 2010 +0200 + + [glib] Use existing cairo api when rendering to a pixbuf + + I should fix bug #5589 for the GDK api too. + + glib/poppler-page.cc | 227 + +++++++++++++++++++++----------------------------- + 1 file changed, 93 insertions(+), 134 deletions(-) + +commit 51aefe1423a068e8c119c21a8791d265aecbeaf5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 9 12:50:00 2010 +0200 + + [cairo] Implement colorizing image masks with pattern colorspace + + poppler/CairoOutputDev.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit bd8f44289770175a17ac45e4788b0d374cc93d5a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 9 12:02:38 2010 +0200 + + Partially revert "[cairo] Do not change device offset of mask surface" + + This partially reverts commit + a32f6f9ebaed3e4827b9dc6cb37e307c2798f521. + It fixed bug #27208, but it's causing regressions on other documents. + + poppler/CairoOutputDev.cc | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit bcb405c43fb7140f5d601d00de4d30913a0050ef +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Apr 8 12:02:48 2010 +0200 + + Pages were always created without forms by Catalog + + Use getForm() instead of form when creating a page object. + + poppler/Catalog.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d46581c574b3088a82555cbc3b76e95e2571b9c0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 7 20:25:23 2010 +0100 + + Fix destructor + + poppler/Catalog.cc | 19 +++++++------------ + poppler/Catalog.h | 3 +-- + 2 files changed, 8 insertions(+), 14 deletions(-) + +commit ab14433f8b3d7c67f279cece65dfdd40c6675ac0 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 15:33:33 2010 +0100 + + Parse Form on demand + + poppler/Catalog.cc | 21 +++++++++++++-------- + poppler/Catalog.h | 2 +- + 2 files changed, 14 insertions(+), 9 deletions(-) + +commit c72a2c7f70b13a7b7b531b3c983d9a9bc104bac7 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 17:33:11 2010 +0100 + + Parse Names on demand + + poppler/Catalog.cc | 112 + ++++++++++++++++++++++++++++++++++++++++++---------- + poppler/Catalog.h | 18 ++++++--- + 2 files changed, 104 insertions(+), 26 deletions(-) + +commit 32053360c93607cf9bdc092257cefad5d4df9ec5 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 16:32:22 2010 +0100 + + Parse Dests on demand + + poppler/Catalog.cc | 27 +++++++++++++++++++++------ + poppler/Catalog.h | 2 +- + 2 files changed, 22 insertions(+), 7 deletions(-) + +commit da0f8e69eecb944e128474f62829f729eeabd189 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 16:48:07 2010 +0100 + + Parse Outline on demand in PDFDoc + + poppler/PDFDoc.cc | 17 ++++++++++++----- + poppler/PDFDoc.h | 2 +- + 2 files changed, 13 insertions(+), 6 deletions(-) + +commit d7a69c8cad112cb6616d0192d8a4028fdaee2f73 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 16:05:02 2010 +0100 + + Parse Outline on demand + + poppler/Catalog.cc | 23 ++++++++++++++++++++--- + poppler/Catalog.h | 2 +- + 2 files changed, 21 insertions(+), 4 deletions(-) + +commit c149e027fa76824221a78fe6d3bf9bfe953491d4 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 15:51:51 2010 +0100 + + Parse StructTreeRoot on demand + + poppler/Catalog.cc | 22 +++++++++++++++++++--- + poppler/Catalog.h | 2 +- + 2 files changed, 20 insertions(+), 4 deletions(-) + +commit 3c6effe44d6d97f175c2ee7f3913d8c4ba34d612 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 14:55:22 2010 +0100 + + Parse Metadata on demand + + poppler/Catalog.cc | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 749d67ea2346a3453ef41dc37ba59d419ad900b0 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Mar 25 15:09:58 2010 +0100 + + Parse PageLabelInfo on demand + + poppler/Catalog.cc | 37 +++++++++++++++++++++++++++++-------- + poppler/Catalog.h | 3 +++ + 2 files changed, 32 insertions(+), 8 deletions(-) + +commit 78f7d106714fa489a66c39410163a6902ba24856 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Mar 27 14:43:57 2010 +0100 + + Parse PageMode and PageLayout on demand + + poppler/Catalog.cc | 109 + +++++++++++++++++++++++++++++++++++----------------- + poppler/Catalog.h | 11 ++++-- + 2 files changed, 81 insertions(+), 39 deletions(-) + +commit f5dd5be64d09186ee289632c1a61979d15edd605 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Apr 7 19:48:39 2010 +0200 + + Fix saving update docs that have a compressed xref table + + - Use the original xref table size as Size field in the trailer + dictionary to make sure size = maxObjId + 1 + + - Use the right generation number for compressed objects that which + must be 0. gen field in xref entry for compressed objects is the + index of the object in the stream, not the generation number. + + Fixes bug #27450. + + poppler/PDFDoc.cc | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 3f302fdd78cd78873bf5376af84e83741a8daadb +Author: Pino Toscano <pino@kde.org> +Date: Tue Apr 6 23:58:46 2010 +0200 + + use a GooVector<bool> instead of a non-standard variable-length-array + + poppler/CachedFile.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 425a62b5fa8e4e69bfc1c64ed126b5baac06d78a +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Apr 6 10:57:30 2010 +0200 + + pdfutils: fix deleting fileName + + utils/pdfinfo.cc | 2 +- + utils/pdftoabw.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 198c9d61ba93ba62ea2da44a23cd948d43556c3e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 6 22:00:14 2010 +0100 + + Use the topleft of the Rect of text annots to draw + + Not use the full rect when we are drawing "our" notes + + poppler/Annot.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 1422802f029483ad3e62a3a13e66b2d3990ac58f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 6 12:32:12 2010 +0200 + + [cairo] Use current fill_opacity when drawing soft masked images + + Fixes GNOME Bug https://bugzilla.gnome.org/show_bug.cgi?id=614915 + + poppler/CairoOutputDev.cc | 27 ++++++++++++++++++++------- + 1 file changed, 20 insertions(+), 7 deletions(-) + +commit c152d30f879e6cde45de58bb9249035e127e84e7 +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Apr 5 18:55:29 2010 +0200 + + delete fileName in utils + + utils/pdftohtml.cc | 1 + + utils/pdftops.cc | 1 + + utils/pdftotext.cc | 1 + + 3 files changed, 3 insertions(+) + +commit f091c83414ab32a4ecf1fa2bd15f13a3cf113a86 +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Apr 5 20:12:01 2010 +0100 + + add some docu + + poppler/CachedFile.h | 30 ++++++++++++++++++++++++++++++ + poppler/CurlPDFDocBuilder.h | 2 ++ + poppler/LocalPDFDocBuilder.h | 2 ++ + poppler/PDFDocBuilder.h | 9 +++++++++ + poppler/PDFDocFactory.h | 12 ++++++++++++ + poppler/StdinPDFDocBuilder.h | 2 ++ + 6 files changed, 57 insertions(+) + +commit fc071d800cb4329a3ccf898d7bf16b4db7323ad8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 5 19:11:26 2010 +0100 + + Rework DCTStream error handling, should work better now + + Fixes bug 26280 + + poppler/DCTStream.cc | 35 ++++++++++++++--------------------- + poppler/DCTStream.h | 5 +++-- + utils/HtmlOutputDev.cc | 4 ++-- + 3 files changed, 19 insertions(+), 25 deletions(-) + +commit a9d801b2db20ecb08734ee5cdb703abf11994b6e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 5 16:55:02 2010 +0100 + + Make some paremeters const & to clearly show we just read them + + poppler/CachedFile.cc | 18 ++++++++++-------- + poppler/CachedFile.h | 8 +++++--- + poppler/CurlCachedFile.cc | 9 +++++---- + poppler/CurlCachedFile.h | 3 ++- + poppler/CurlPDFDocBuilder.cc | 9 +++++---- + poppler/CurlPDFDocBuilder.h | 5 +++-- + poppler/LocalPDFDocBuilder.cc | 15 ++++++++------- + poppler/LocalPDFDocBuilder.h | 5 +++-- + poppler/PDFDocBuilder.h | 5 +++-- + poppler/PDFDocFactory.cc | 7 ++++--- + poppler/PDFDocFactory.h | 3 ++- + poppler/StdinCachedFile.cc | 3 ++- + poppler/StdinCachedFile.h | 3 ++- + poppler/StdinPDFDocBuilder.cc | 7 ++++--- + poppler/StdinPDFDocBuilder.h | 5 +++-- + utils/pdffonts.cc | 4 ++-- + utils/pdfimages.cc | 4 ++-- + utils/pdfinfo.cc | 4 ++-- + utils/pdftoabw.cc | 4 ++-- + utils/pdftohtml.cc | 4 ++-- + utils/pdftoppm.cc | 2 +- + utils/pdftops.cc | 4 ++-- + utils/pdftotext.cc | 4 ++-- + 23 files changed, 76 insertions(+), 59 deletions(-) + +commit a04ee3ea6066c97d41fc40d5d97c600a1870855a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 5 16:50:58 2010 +0100 + + forgot my (C) + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed723c8ac4a21a50d7d236cdcf7a635defd8dffb +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 5 16:50:15 2010 +0100 + + The copy constructor of GooString never worked, so do not use it + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a28be8e4009b86fdfd92da928def194225a736c6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 5 16:49:06 2010 +0100 + + Add some const correctnes to GooString + + goo/GooString.cc | 12 ++++++------ + goo/GooString.h | 21 ++++++++++++--------- + 2 files changed, 18 insertions(+), 15 deletions(-) + +commit 46aee9e4d225b88a3dfd4afbe57259f337bb15d3 +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Apr 5 14:36:09 2010 +0200 + + Use PDFDocFactory in utils + + utils/pdffonts.cc | 16 ++++++++-------- + utils/pdfimages.cc | 11 ++++++++++- + utils/pdfinfo.cc | 31 +++++++------------------------ + utils/pdftoabw.cc | 10 +++++++++- + utils/pdftohtml.cc | 10 +++++++++- + utils/pdftoppm.cc | 17 +++++++++++------ + utils/pdftops.cc | 9 ++++++++- + utils/pdftotext.cc | 14 +++++++------- + 8 files changed, 69 insertions(+), 49 deletions(-) + +commit d487a90688c4431075c9e4db040b3b02625e208f +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Apr 5 14:35:52 2010 +0200 + + Add PDFDocFactory + + CMakeLists.txt | 2 ++ + poppler/Makefile.am | 2 ++ + poppler/PDFDocFactory.cc | 71 + ++++++++++++++++++++++++++++++++++++++++++++++ + poppler/PDFDocFactory.h | 42 +++++++++++++++++++++++++++ + 4 files changed, 117 insertions(+) + +commit 869135920831fb0d15db734f3dcd7a67146cc241 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Feb 24 15:24:26 2010 +0100 + + Add CurlPDFDocBuilder + + CMakeLists.txt | 2 ++ + poppler/CurlPDFDocBuilder.cc | 46 + ++++++++++++++++++++++++++++++++++++++++++ + poppler/CurlPDFDocBuilder.h | 30 +++++++++++++++++++++++++++ + poppler/Makefile.am | 6 ++++-- + 4 files changed, 82 insertions(+), 2 deletions(-) + +commit ec5c6117a64f9cb03560091c4d7948d4287b6975 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Feb 25 11:23:28 2010 +0100 + + Add LocalPDFDocBuilder and StdinPDFDocBuilder + + CMakeLists.txt | 4 ++++ + poppler/LocalPDFDocBuilder.cc | 45 + +++++++++++++++++++++++++++++++++++++++++ + poppler/LocalPDFDocBuilder.h | 30 +++++++++++++++++++++++++++ + poppler/Makefile.am | 4 ++++ + poppler/StdinPDFDocBuilder.cc | 42 + ++++++++++++++++++++++++++++++++++++++ + poppler/StdinPDFDocBuilder.h | 30 +++++++++++++++++++++++++++ + 6 files changed, 155 insertions(+) + +commit 919b735d1c0b99bf72280aff8db87ba503954498 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Apr 4 11:05:35 2010 +0200 + + Add PDFDocBuilder + + CMakeLists.txt | 1 + + poppler/Makefile.am | 1 + + poppler/PDFDocBuilder.h | 32 ++++++++++++++++++++++++++++++++ + 3 files changed, 34 insertions(+) + +commit 1ab07faf05661d6d92186974c4b1c279b6178747 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Apr 4 11:29:53 2010 +0200 + + Add PDFDoc::ErrorPDFDoc + + poppler/PDFDoc.cc | 14 ++++++++++++++ + poppler/PDFDoc.h | 3 +++ + 2 files changed, 17 insertions(+) + +commit efc7e5efeddd8f70b7c74573d3194aba0a7d4631 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Apr 4 11:17:37 2010 +0200 + + Cleanup PDFDoc + + poppler/PDFDoc.cc | 40 +++++++++++++++------------------------- + poppler/PDFDoc.h | 3 ++- + 2 files changed, 17 insertions(+), 26 deletions(-) + +commit 08a3435e67ebf21beac2fefcbd21ad65f9293fd1 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Feb 23 02:29:26 2010 +0100 + + Add HTTP support using libcurl + + With libcurl, poppler can handle documents over http. + + CMakeLists.txt | 18 ++++++++ + config.h.cmake | 6 +++ + configure.ac | 16 +++++++ + poppler/CurlCachedFile.cc | 95 + ++++++++++++++++++++++++++++++++++++++++ + poppler/CurlCachedFile.h | 39 +++++++++++++++++ + poppler/Makefile.am | 20 +++++++++ + poppler/poppler-config.h.cmake | 5 +++ + poppler/poppler-config.h.in | 5 +++ + utils/pdfinfo.cc | 16 ++++++- + 9 files changed, 219 insertions(+), 1 deletion(-) + +commit a87abf6ad9fb66d35a70c9412adc5d8ba2889b96 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Feb 24 14:46:59 2010 +0100 + + Use cached files to read from stdin in pdfinfo + + This fixes reading from stdin. + + utils/pdfinfo.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 958b04b14baf03c07492fa1cbd225d9968b9efc1 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Feb 23 02:02:10 2010 +0100 + + Add support for reading a cached file from stdin + + CMakeLists.txt | 2 ++ + poppler/Makefile.am | 2 ++ + poppler/StdinCachedFile.cc | 37 +++++++++++++++++++++++++++++++++++++ + poppler/StdinCachedFile.h | 26 ++++++++++++++++++++++++++ + 4 files changed, 67 insertions(+) + +commit 9539f75bd06150a3868209c5b04a75f5253722cc +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Apr 3 15:08:20 2010 +0200 + + Add support for cached files + + CMakeLists.txt | 2 + + poppler/CachedFile.cc | 246 + +++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/CachedFile.h | 113 +++++++++++++++++++++++ + poppler/Makefile.am | 2 + + poppler/Stream.cc | 102 ++++++++++++++++++++ + poppler/Stream.h | 58 ++++++++++++ + 6 files changed, 523 insertions(+) + +commit 8c6aefb8aa8929b9c47791d3062ed3ac8512626f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Apr 4 16:08:12 2010 +0200 + + [lexer] Correctly parse numbers with '+' sign + + See GNOME Bug: https://bugzilla.gnome.org/show_bug.cgi?id=614549 + + poppler/Lexer.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit ab5044e451e3714d385295f0b4ce9a15c8f2562c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 4 12:32:42 2010 +0100 + + Add the -o[dd] and -e[ven] options to pdftoppm + + I've been using this patch forever and it's a pain to apply and + unapply + it each time + + utils/pdftoppm.1 | 6 ++++++ + utils/pdftoppm.cc | 8 ++++++++ + 2 files changed, 14 insertions(+) + +commit 0e371fb628a7e7d0cc1656e6405af4c97dbebf5d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 4 12:30:34 2010 +0100 + + Fix my roll optimization + + Thanks Carlos for noticing + + poppler/Function.cc | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit a32f6f9ebaed3e4827b9dc6cb37e307c2798f521 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 28 18:43:14 2010 +0200 + + [cairo] Do not change device offset of mask surface + + Also call cairo_paint() after set_source_rgb() to paint the + background. + Fixes bug #27208. + + poppler/CairoOutputDev.cc | 13 ++----------- + 1 file changed, 2 insertions(+), 11 deletions(-) + +commit efa5d9544d29252e3df36cc4e65c3d880b3c5172 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 27 22:11:49 2010 +0000 + + remove empty section + + NEWS | 2 -- + 1 file changed, 2 deletions(-) + +commit 5722df7a5387e43ec73f659ca58d2d07b9c4be3b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 27 22:04:43 2010 +0000 + + poppler 0.13.2 + + CMakeLists.txt | 2 +- + NEWS | 39 +++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 43 insertions(+), 4 deletions(-) + +commit b82fd707747b9d87ebf3c8f7ce5ab70ccdf82809 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 27 22:00:58 2010 +0000 + + gtk-doc changes + + glib/reference/tmpl/poppler-action.sgml | 7 +++---- + glib/reference/tmpl/poppler-annot.sgml | 9 --------- + glib/reference/tmpl/poppler-private.sgml | 10 ++++++++++ + glib/reference/tmpl/poppler-unused.sgml | 8 ++++++++ + glib/reference/tmpl/poppler.sgml | 10 ++++++++++ + 5 files changed, 31 insertions(+), 13 deletions(-) + +commit ed0354be4eac615b80e7a868984cc527853788b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 27 21:44:59 2010 +0000 + + some forgotten copyrights + + qt/poppler-page.cc | 2 +- + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-movie.cc | 3 ++- + qt4/src/poppler-page.cc | 2 +- + 4 files changed, 5 insertions(+), 4 deletions(-) + +commit 2aedeedf9ef2e2d3eb17bc36d728e68c2f7af762 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Mar 27 14:38:27 2010 +0000 + + Correctly initialize actualText + + poppler/TextOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b53f9b203598555d6d706c3804aba013b8566921 +Author: Jan Engelhardt <jengelh@medozas.de> +Date: Sat Mar 27 13:23:42 2010 +0000 + + make qt3 detection use pkgconfig + + m4/qt.m4 | 101 + +++++--------------------------------------------------- + qt/Makefile.am | 4 +-- + 2 files changed, 10 insertions(+), 95 deletions(-) + +commit 320d4cee46e108498440179d8f9eab22cd5383d9 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 24 21:51:58 2010 +0100 + + Revert "no more needed" + + This reverts commit 24d6bc8c78cb3148db2098ae4d69bd744340cf52. + It is actually needed. + + cpp/tests/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit af21b5ab366bfdda203c26a77f4ae6ed0e70f64e +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 23 00:13:21 2010 +0100 + + [CMake] remove the (now) unneeded stuff from Find{GLIB,GDK,GTK}.cmake, + and search for them + + this way each bit (GLIB, GDK, and GTK) can be enabled/disabled + independently from the others + + CMakeLists.txt | 4 +++- + cmake/modules/FindGDK.cmake | 14 +------------- + cmake/modules/FindGLIB.cmake | 14 +------------- + cmake/modules/FindGTK.cmake | 14 +------------- + 4 files changed, 6 insertions(+), 40 deletions(-) + +commit 9b93ed5ce6712ec4cdf58148628e95685c289ef5 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 23 00:02:27 2010 +0100 + + [CMake] copy FindGTK.cmake as FindGLIB.cmake and FindGDK.cmake + + this way FindGTK.cmake can be split in the various parts + + cmake/modules/FindGDK.cmake | 34 ++++++++++++++++++++++++++++++++++ + cmake/modules/FindGLIB.cmake | 34 ++++++++++++++++++++++++++++++++++ + 2 files changed, 68 insertions(+) + +commit 0ec21cae0b4623644c3efca1d2836a9f38f25737 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 22 22:11:04 2010 +0100 + + [Qt] add the unhandled cases for 'actionOCGState' + + qt/poppler-page.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 5211e09595135b8e6c68efd1b8b689b518092b84 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 22 22:07:44 2010 +0100 + + [CMake/cpp] move the BUILD_CPP_TESTS option to the main CMakeLists.txt + + CMakeLists.txt | 1 + + cpp/tests/CMakeLists.txt | 3 --- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit 24d6bc8c78cb3148db2098ae4d69bd744340cf52 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 22 22:00:55 2010 +0100 + + no more needed + + cpp/tests/CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +commit a07ef8f703ab896f89ed211a5780e4a669b04fc7 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 22 22:00:15 2010 +0100 + + [CMake] revert addition of "-Wl,--no-add-needed" to the link flags, + if available + + for now it is safer without it + + cmake/modules/PopplerMacros.cmake | 6 ------ + 1 file changed, 6 deletions(-) + +commit 86debcc9bba28a7c86f01ca9e63bde5fcd541846 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 22 21:49:22 2010 +0100 + + [CMake] add "-ansi" to the CXXFLAGS only on Linux + + cmake/modules/PopplerMacros.cmake | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 0819acd52a2ce74f0e176626d7b2233e10232d53 +Merge: c4ddbe8 92738eb +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 22 21:43:01 2010 +0100 + + Merge branch 'master' of ssh://git.freedesktop.org/git/poppler/poppler + +commit 92738ebb8a9c7cfc879aae59c2cbdf3159f03cd3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 22 20:28:15 2010 +0000 + + Add a search overload that takes doubles + + QRectF is evil and is float in some arch and causes search to loop + infinitely because of double->float conversion + + qt4/src/poppler-page.cc | 22 +++++++++++++++------- + qt4/src/poppler-qt4.h | 16 ++++++++++++++-- + 2 files changed, 29 insertions(+), 9 deletions(-) + +commit 0a895f14c8125c5de7b97e8e799459c431eb51cb +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Mon Mar 22 19:03:54 2010 +0000 + + correctly initialize the grayscale softmask color + + Fixes file with sha1sum e6e1576803a1bd74ad822eebbd750ee7b8357d25 + + poppler/SplashOutputDev.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit c4ddbe89df9e48343a9606728b7c182080d87ece +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sat Mar 20 21:55:17 2010 +0100 + + [CMake] when the conf configuration backend is "win32", set the + required Internet Explorer version to 5.0 + + ... as done with autotools as well + + CMakeLists.txt | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 97da1f9d060493d9fb54a20e980c3f6e2b82c97e +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 20 17:51:07 2010 +0100 + + [CMake] check whether a link flag is supported before adding it to + the link flags + + this way we can add -Wl,--as-needed and -Wl,--no-add-needed only if + the current GCC/LD supports them + + cmake/modules/PopplerMacros.cmake | 23 ++++++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +commit 223bce6d14e632f457a81b2ec091fe16369d2eb6 +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 20 14:08:58 2010 +0100 + + [CMake] with GCC, pass --as-needed and --no-add-needed to the linker + + --as-needed allows to avoid overlinking, linking only to the libraries + whose symbols are actually used + --no-add-needed makes the linker not use the NEEDED libraries + automatically, so we have to always make sure we specify all the + libraries actually used in a exe/lib + + cmake/modules/PopplerMacros.cmake | 4 ++++ + 1 file changed, 4 insertions(+) + +commit fc761f0d385708daaef1b95968532795b04f11b0 +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 20 14:05:59 2010 +0100 + + [CMake] poppler-dump uses parseargs.c which uses the poppler core API, + so it must link to it + + cpp/tests/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit a210440b05d14efc53224a10e8b3ac7d508043b5 +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 20 14:04:02 2010 +0100 + + [CMake] poppler-glib uses the freetype API, so it must explicitly + link to it + + glib/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f5d352666b92cee0390470d7b892ec8dcbf046a5 +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 20 14:03:19 2010 +0100 + + [CMake] pdftoabw uses the libxml2 API, so it must explicitly link + to it + + utils/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3fc2c4affe825f4aabcee161ec794338bd359403 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 13:52:52 2010 +0100 + + [glib] Use g_slice_new/free instead of g_new/free to alloc/free + iterators + + glib/poppler-document.cc | 27 +++++++++++++-------------- + 1 file changed, 13 insertions(+), 14 deletions(-) + +commit 7bd6a8558646983669ce699f83d5ed42d7fce476 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 13:34:03 2010 +0100 + + [glib] Move find_annot_movie_for_action() from page to action + + And remove _poppler_action_movie_set_movie(). + + glib/poppler-action.cc | 93 + ++++++++++++++++++++++++++++++++++++++++++------ + glib/poppler-page.cc | 79 ---------------------------------------- + glib/poppler-private.h | 2 -- + 3 files changed, 82 insertions(+), 92 deletions(-) + +commit e5e3d310aa488638431dd85ac3383a12056674bf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 12:20:26 2010 +0100 + + Update copyright header + + poppler/Link.cc | 2 +- + poppler/Link.h | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit c76870178a031e437de3f9ed7baa64efb96955d6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 12:13:36 2010 +0100 + + [glib-demo] OCG State Actions demo + + glib/demo/utils.c | 64 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 64 insertions(+) + +commit 456e42f91dfbf73b71a5dbdde13d7ccdb5637d79 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 12:12:51 2010 +0100 + + [glib] Add support for OCG State actions + + glib/poppler-action.cc | 125 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-action.h | 25 +++++++++- + glib/poppler.h | 1 + + 3 files changed, 150 insertions(+), 1 deletion(-) + +commit 4b109899e0732bbf65cacd875829e869e61eda48 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 12:10:19 2010 +0100 + + [glib] Make get_layer_rbgroup() and get_layers() doc funcs public + for internal use + + glib/poppler-document.cc | 12 ++++++------ + glib/poppler-private.h | 3 +++ + 2 files changed, 9 insertions(+), 6 deletions(-) + +commit 38a55f6118debf994ce1fc41e987b0e3766047ba +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 18 12:08:30 2010 +0100 + + Add support for Set-OCG-State actions + + Fixes bug #23522. + + poppler/Link.cc | 80 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Link.h | 31 +++++++++++++++++++++ + 2 files changed, 111 insertions(+) + +commit bf398e53b0823d0a6272679858b67c5ffd704425 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 23:06:44 2010 +0100 + + [CMake] fix pkg-config executable variable name + + CMakeLists.txt | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ab1a37666704d6b15c19b694ee191327847c23da +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 23:04:01 2010 +0100 + + [CMake] proper way of looking for pkg-config + + cmake/modules/FindGTK.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7f07a7dcea031f99a9a6d7c424184a2e69ee0062 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 22:58:08 2010 +0100 + + [CMake] update FindFontconfig.cmake with a more recent version + + ... present in KDE (as before) + + cmake/modules/FindFontconfig.cmake | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit beee143ffbdc699ab19f10a01e5747200ea1927a +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 18:36:32 2010 +0100 + + [CMake] set the LINK_INTERFACE_LIBRARIES for the poppler and + poppler-cpp libraries + + this should reduce the libraries linked by frontends and utility + applications + + CMakeLists.txt | 1 + + cpp/CMakeLists.txt | 1 + + 2 files changed, 2 insertions(+) + +commit 5ab791cb2a029edcde84b00a47165adfe4d98a98 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 16:39:38 2010 +0100 + + [CMake] small cleanups in FindGTK.cmake + + - update the header will all the stuff found and the variables set + - add my copyright for this year + - remove no more useful UsePkgConfig inclusion + + cmake/modules/FindGTK.cmake | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +commit fcbc76d82e3059c8288fbdc8da117ac9b38a70f2 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 16:36:41 2010 +0100 + + [CMake] switch gtk2 (gtk+, gdk-pixbuf, gthread, gio) search to use + the new pkg_check_modules() way + + cmake/modules/FindGTK.cmake | 27 ++------------------------- + 1 file changed, 2 insertions(+), 25 deletions(-) + +commit 5b8135e0899aa3578045eca40940a3495c48d895 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 16:27:40 2010 +0100 + + [CMake] link poppler-glib to the gdk2 libraries, if gdk2 was found + + glib/CMakeLists.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3dc4979d72048e81ae3b2d60dab11e791ac95696 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 16:26:04 2010 +0100 + + [CMake] switch gdk2 search to use the new pkg_check_modules() way + + cmake/modules/FindGTK.cmake | 13 +------------ + 1 file changed, 1 insertion(+), 12 deletions(-) + +commit 0ef3d899cb8dea75c97ae1038cac5006f97bc0d2 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 16:05:07 2010 +0100 + + [CMake] switch glib2 search to use the new pkg_check_modules() way + + cmake/modules/FindGTK.cmake | 18 ++---------------- + 1 file changed, 2 insertions(+), 16 deletions(-) + +commit d2dc83cb8de481e44ea584eee77881978af920fa +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 15:56:16 2010 +0100 + + [CMake] rename GLIB_VERSION to GLIB_REQUIRED + + this way it matches autotools, and it is going to not conflict with + my next changes + + CMakeLists.txt | 4 ++-- + cmake/modules/FindGTK.cmake | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 34accfe27305cae18e09243ab2a607287b86fa47 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 13:55:09 2010 +0100 + + [CMake] set all the definitions for poppler-glib in a single place + + glib/CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3d93daf50c61019ca70f42e7ccf33897800b262a +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 17 13:49:22 2010 +0100 + + [CMake] no need to check for BUILD_GTK_TESTS for single tests + + poppler_add_test(... BUILD_GTK_TESTS ...) takes care of that already + + glib/CMakeLists.txt | 4 ++-- + test/CMakeLists.txt | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 946a11345d01d39538d22114e50aa3e179059883 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 20:24:25 2010 +0100 + + [build] Update cmake files + + CMakeLists.txt | 2 ++ + glib/CMakeLists.txt | 4 ++++ + 2 files changed, 6 insertions(+) + +commit 922c0fe392ba439453edb5b2e88b74f0caa586b3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 20:08:23 2010 +0100 + + [glib-demo] Rendition actions demo + + glib/demo/utils.c | 112 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 112 insertions(+) + +commit 163b3f79d67543bc37b64875e30dcc9b7053e1d5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 20:08:00 2010 +0100 + + [glib] Add support for rendition actions + + glib/poppler-action.cc | 22 ++++++++++++++++++++++ + glib/poppler-action.h | 14 +++++++++++++- + 2 files changed, 35 insertions(+), 1 deletion(-) + +commit d9b1e40751beddf48a8694b20bfcc4b4cb41060a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 20:06:45 2010 +0100 + + [glib] Add PopplerMedia representing a Rendition Media Clip + + glib/Makefile.am | 2 + + glib/poppler-media.cc | 302 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-media.h | 53 +++++++++ + glib/poppler-private.h | 2 + + glib/poppler.h | 2 + + 5 files changed, 361 insertions(+) + +commit 0224b81c4729a98a56b7a68054422ea655018d6a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 17:54:03 2010 +0100 + + [glib-demo] Add page number to annots demo + + glib/demo/annots.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0153b892c63e4fccd0819150cf7b4213857a11c5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 17:49:51 2010 +0100 + + [glib] Add poppler_annot_get_page_index() to get the page associated + to annot + + glib/poppler-annot.cc | 19 +++++++++++++++++++ + glib/poppler-annot.h | 1 + + 2 files changed, 20 insertions(+) + +commit b47337ea91696fea8f42a68a6fa160681ab284b2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 17:49:17 2010 +0100 + + [annots] Checks screen annots associated with a rendition action + have a valid page ref + + poppler/Annot.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 9417fd793ec8d806822669aa614193073e7dfe50 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 16:52:30 2010 +0100 + + [annots] Save page index of the page associated with the annot + + poppler/Annot.cc | 14 +++++--------- + poppler/Annot.h | 4 ++-- + 2 files changed, 7 insertions(+), 11 deletions(-) + +commit 36b76a5d01b74c6381433b6f6f7ffb9f02696a60 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 14:12:11 2010 +0100 + + Rework LinkRendition to follow the spec + + poppler/Link.cc | 68 + ++++++++++++++++++++++++++++++++++--------------------- + poppler/Link.h | 12 ++++++---- + 2 files changed, 50 insertions(+), 30 deletions(-) + +commit 7b5885ee7d2026df9a6e87327b6d02f37d79b8b2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 12:25:12 2010 +0100 + + [glib-demo] Annot screen demo + + glib/demo/annots.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit bdb76c7cb89bcb6fb139b0ef348d96b7780d57ed +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 12:24:19 2010 +0100 + + [glib] Add support for screen annotation + + Based on patch by Sam Kaplan. + + glib/poppler-annot.cc | 75 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 8 ++++++ + glib/poppler-page.cc | 3 ++ + glib/poppler-private.h | 1 + + glib/poppler.h | 1 + + 5 files changed, 88 insertions(+) + +commit 54892b1375e360113432b07c6ba058f861d21fe8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 12:21:30 2010 +0100 + + [annots] Save the action already parsed in AnnotScreen + + poppler/Annot.cc | 9 +++++++-- + poppler/Annot.h | 5 +++-- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 5a84a2d749478f19631dbfad2be06ec4ea85038c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 11:16:17 2010 +0100 + + [glib-demo] Annot and links movie demo + + glib/demo/annots.c | 20 +++++++++ + glib/demo/utils.c | 115 + +++++++++++++++++++++++++++++++++++++++++++++++++++- + glib/demo/utils.h | 3 ++ + 3 files changed, 137 insertions(+), 1 deletion(-) + +commit 2cf5ee4f62089df099f78cd4d39a4eb7589d1b47 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 11:04:17 2010 +0100 + + [glib] Add support for movie actions + + Based on patch by Hugo Mercier. + + glib/poppler-action.cc | 35 ++++++++++++++++++--- + glib/poppler-action.h | 15 +++++++-- + glib/poppler-page.cc | 81 + +++++++++++++++++++++++++++++++++++++++++++++++- + glib/poppler-private.h | 2 ++ + 4 files changed, 125 insertions(+), 8 deletions(-) + +commit 132b6f072fefd231d42f31626f1b5009c4e8319e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 10:56:23 2010 +0100 + + [glib] Add support for movie annotations + + Based on patch by Hugo Mercier. + + glib/poppler-annot.cc | 97 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 10 +++++ + glib/poppler-page.cc | 3 ++ + glib/poppler-private.h | 1 + + glib/poppler.h | 1 + + 5 files changed, 112 insertions(+) + +commit aecad2bb12be44825d273e364ec6a0444dac5605 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 15 10:48:03 2010 +0100 + + [glib] Add PopplerMovie class + + glib/Makefile.am | 2 + + glib/poppler-movie.cc | 140 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-movie.h | 42 +++++++++++++++ + glib/poppler-private.h | 2 + + glib/poppler.h | 2 + + 5 files changed, 188 insertions(+) + +commit 5b3234a16e0d465bff2b5e277cb64b4f4b0a8dbd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 14 16:10:26 2010 +0100 + + Split Movie class into Rendition and Movie classes to follow the spec + + poppler/Annot.cc | 16 +- + poppler/Link.cc | 10 +- + poppler/Link.h | 6 +- + poppler/Makefile.am | 2 + + poppler/Movie.cc | 438 + +++++----------------------------------------- + poppler/Movie.h | 138 +++------------ + poppler/Rendition.cc | 400 + ++++++++++++++++++++++++++++++++++++++++++ + poppler/Rendition.h | 157 +++++++++++++++++ + qt4/src/poppler-movie.cc | 9 +- + 9 files changed, 657 insertions(+), 519 deletions(-) + +commit f9c163730478e3b6d8a1e73dbae6c52c28ae1e84 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 8 14:49:12 2010 +0100 + + [Qt4] include Object.h and Annot.h, now needed + + qt4/src/poppler-movie.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit a00532f509c19c5455e0db5068db95dd4583e8dd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 8 14:22:53 2010 +0100 + + Check for Null instead of None to know whether a dict entry is present + + Dict::lookup returns obj->initNull() when the key is not found. + + poppler/Movie.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit b51e66c9a7e2f7f39ae1edf8bda02a7bc1ad4ebd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 8 14:15:22 2010 +0100 + + [annots] Create appearance stream for Movie Annotations when not + defined + + See bug #23108 + + poppler/Annot.cc | 103 + +++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 4 ++- + 2 files changed, 105 insertions(+), 2 deletions(-) + +commit fae59411852e5c2c45825c5ea963318f1ed5dc6a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 8 14:07:09 2010 +0100 + + Fix handling of poster in Movie + + Poster is not always a stream, it can be a boolean too. Also, get the + reference when available instead of fetching the stream. + + poppler/Movie.cc | 25 ++++++++++++------------- + poppler/Movie.h | 6 ++++-- + 2 files changed, 16 insertions(+), 15 deletions(-) + +commit a451f83d101bf265a1e7e2a17c0b320895e70f4e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 7 12:22:57 2010 +0100 + + Save width, height (aspect) in Movie object and provide getAspect() + method + + poppler/Movie.cc | 3 ++- + poppler/Movie.h | 4 ++++ + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit f88d469f860da17055fc4b98b64aef241fcf0185 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 6 12:33:40 2010 +0100 + + Move Movie objects parsing code from Annot to Movie + + poppler/Annot.cc | 244 + ++------------------------------------------ + poppler/Annot.h | 73 +------------ + poppler/Link.cc | 4 +- + poppler/Movie.cc | 255 + ++++++++++++++++++++++++++++++++++++++-------- + poppler/Movie.h | 25 +++-- + qt4/src/poppler-movie.cc | 11 +- + 6 files changed, 246 insertions(+), 366 deletions(-) + +commit ec9138b574c7226ad733880d3d43b86bb72073f4 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 23:17:50 2010 +0100 + + [autotools] add also cpp/tests/CMakeLists.txt to the "dist files" + + Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit ef3258d6fc57e7a62d951cc826804e50e8e1b526 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 23:14:12 2010 +0100 + + [autotools] fix location of poppler-config.h.cmake + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fd1d9c882997ff35acd5a458e9dfeba3ad6c8b25 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 22:42:06 2010 +0100 + + [CMake] just enable what needed each time + + CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 476bde472a7e694afde96a04ea335fe9582d6fad +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 22:39:45 2010 +0100 + + [CMake] add small description for the zlib option + + taken from two bits in configure.ac + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1267d7e0c36e262984070a3b55fea46e7289a4b4 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 19:34:03 2010 +0100 + + [CMake] add a note about gtk-doc not supported yet + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 201b18ad0837e84d874b56e1b0469d1b2d45378b +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 19:30:36 2010 +0100 + + [CMake] sync with poppler-config.h.in: add + WITH_FONTCONFIGURATION_{FONTCONFIG,WIN32} + + poppler/poppler-config.h.cmake | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 0d0044e8cc2d406f066338102ec73e1b56214cc3 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 19:25:27 2010 +0100 + + [CMake] move poppler-config.h.cmake in the poppler subdirectory, + where poppler-config.h.in is + + CMakeLists.txt | 2 +- + poppler-config.h.cmake | 90 + ---------------------------------------- + poppler/poppler-config.h.cmake | 90 + ++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 91 insertions(+), 91 deletions(-) + +commit f785e29a901d2c76204dd26e9585446fdd817ebd +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 18:35:34 2010 +0100 + + [CMake] remove the generated poppler-enums.{c,h} in the clean target + + ie usually when doing `make clean' + + glib/CMakeLists.txt | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 369604603375dbe3516136b6f8f9d0c26e0b744f +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 18:26:45 2010 +0100 + + [CMake] use the --template option of glib-mkenums (like done with + autotools) + + glib/CMakeLists.txt | 24 ++++-------------------- + 1 file changed, 4 insertions(+), 20 deletions(-) + +commit bbcbb34fec10c90edd5960bdbcc6849bc8f39526 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 17:34:40 2010 +0100 + + [CMake] set POPPLER_GLIB_DISABLE_DEPRECATED and + POPPLER_GLIB_DISABLE_SINGLE_INCLUDES as done with autotools + + CMakeLists.txt | 6 ++++++ + glib/CMakeLists.txt | 6 +++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 190fa971c12ca1b3007f6ba349a77a7c15c47490 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 17:24:25 2010 +0100 + + reorder to match what's in the correspondent .in + + glib/poppler-features.h.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ff46def8b178420a86a974ec2ce767a538bba8be +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 17:23:16 2010 +0100 + + [CMake] GDK_FEATURE is no more needed here + + glib/CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +commit 1eb8026a3060ef61a88c535177510f7ac7e7fc25 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 17:19:58 2010 +0100 + + [CMake] set in one place whether to build the glib frontend + + CMakeLists.txt | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit a1a6f23e2345814e147a72211ce9139555385223 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 17:09:58 2010 +0100 + + [CMake] correctly set the GLIB_REQ stuff + + CMakeLists.txt | 1 + + poppler-glib.pc.cmake | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 0f2e5d6925c5938281d9bafc297a43867c4a915b +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 17:03:21 2010 +0100 + + [CMake] move the minimum GLib version to the main CMakeLists.txt + + CMakeLists.txt | 1 + + cmake/modules/FindGTK.cmake | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit efdffba45d15b538dbfb294403e99f3a6470b4d9 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 16:58:27 2010 +0100 + + [CMake] align the GDK stuff (GDK_{FEATURE,REQ}) to what done with + autotools + + CMakeLists.txt | 6 +++++- + poppler-glib.pc.cmake | 2 +- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit cfecc69b7f05920f543ee7e9aafeafaa4c3506fb +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 16:49:14 2010 +0100 + + [CMake] apparently there's not a minimum version requirement for GDK, + so drop the check + + cmake/modules/FindGTK.cmake | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 8ff1cf03d2607b0f13bbbbf272f2b03d8927bd24 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 16:47:21 2010 +0100 + + [CMake] first look for Cairo, then for GLib/GDK/GTK + + this starts to align to the searches done with autotools + also, move the CAIRO_FEATURE to the main CMakeLists.txt + + CMakeLists.txt | 19 +++++++++++-------- + glib/CMakeLists.txt | 1 - + 2 files changed, 11 insertions(+), 9 deletions(-) + +commit bcaf62b8e252594530d3050761ba563cf3b1fb6e +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 16:00:03 2010 +0100 + + [CMake] enhance/rewrite a bit the FindCairo module + + make use of some features of CMake 2.6 (as we require it): + - newer pkg-config handling (aka pkg_check_modules()) + - version checking for modules (PACKAGE_FIND_VERSION*) + - find_package_handle_standard_args() + also, after the pkg-config search to win32, search for cairo again + (double-check plus real search for win32) + furthermore, introduce CAIRO_INCLUDE_DIRS with the include paths + requires (kind of "obsoletes" CAIRO_CFLAGS, left there in case it + is used again) + + apply the changes to the rest of the build system (specify the + version needed, use the correct variable for includes) + + CMakeLists.txt | 2 +- + cmake/modules/FindCairo.cmake | 64 + ++++++++++++++++++++++++++--------------- + glib/CMakeLists.txt | 2 +- + 3 files changed, 43 insertions(+), 25 deletions(-) + +commit c96aa0f5fc74ae04f483485b787aaf65f1791991 +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 02:01:13 2010 +0100 + + add Patrick's copyright notices + + cpp/poppler-global.h | 1 + + goo/gtypes.h | 14 ++++++++++++++ + poppler/GlobalParams.cc | 1 + + poppler/SplashOutputDev.cc | 1 + + 4 files changed, 17 insertions(+) + +commit 3311bedd2eb831ef1fd553f3f50960331cf6885f +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Mar 7 01:56:15 2010 +0100 + + MSVC: disable for the 'ustring' class the warning C4251 (which does + not apply) + + cpp/poppler-global.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 9efa18397bd05fbd27c7811fa6e0f34ce94012e0 +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Mar 7 01:48:03 2010 +0100 + + MSVC: disable warning C4800, which is of no use for now + + goo/gtypes.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 3a88d1bf8d2c5a9e8014e0d46e24c9ec06556469 +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Mar 7 01:26:10 2010 +0100 + + MSVC: no isfinite(), so provide it using _finite() + + poppler/SplashOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 7774912c46f832f25c51b4cfc0e9430b1cd7fa1f +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Mar 7 01:22:31 2010 +0100 + + MSVC: do not force constness here, so the right overload will + be chosen + + poppler/GlobalParams.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cf07a5d85b402b6956c9605fbdc88bddcb94a3cf +Author: Pino Toscano <pino@kde.org> +Date: Sun Mar 7 00:49:07 2010 +0100 + + [CMake] show end yes/no message about the GDK usage + + just like done with autotools + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 42c98f8eabe304d5e3dc8c1ebdd5b0b6c221e696 +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 6 17:18:08 2010 +0100 + + [CMake] make the font configuration backend selection take a string + (like with autotools) + + this way it is possible to set the cmake variable FONT_CONFIGURATION + to either "win32" (default on windows) or "fontconfig" (default + elsewhere) to the font backend to use + as a consequence, make fontconfig a requirement only if the font + backend chosen is "fontconfig" + + CMakeLists.txt | 39 +++++++++++++++++++++++++++++---------- + 1 file changed, 29 insertions(+), 10 deletions(-) + +commit bda6e7cd089f2970af2e9540b4415633ffcf0ebb +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 6 17:13:30 2010 +0100 + + [CMake] add a show_end_message() macro to show a generic string + as value + + make show_end_message_yesno() call it with the proper "yes" or + "no" string + + cmake/modules/PopplerMacros.cmake | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit d313c0f508711b3b7166b84608c43ebf1f07194b +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 6 17:08:59 2010 +0100 + + [CMake] rename the show_end_message() macro to + show_end_message_yesno() + + CMakeLists.txt | 26 +++++++++++++------------- + cmake/modules/PopplerMacros.cmake | 4 ++-- + 2 files changed, 15 insertions(+), 15 deletions(-) + +commit 0425ff835fa26df5e25e628a6c56f3a180713905 +Author: Pino Toscano <pino@kde.org> +Date: Fri Mar 5 22:21:56 2010 +0100 + + update copyright + + poppler/ArthurOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c5ea135ca58e112110be3ae10d887f3188172765 +Author: Pino Toscano <pino@kde.org> +Date: Fri Mar 5 22:14:57 2010 +0100 + + [arthur] update the miter limit + + poppler/ArthurOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 552f344b3e3df7c796afa6946149b0a5590cc4f7 +Author: Pino Toscano <pino@kde.org> +Date: Fri Mar 5 22:04:39 2010 +0100 + + [arthur] update the line dash style + + poppler/ArthurOutputDev.cc | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit bc42ee05fceef0d0dd2ab0587c184dfc37cf29bf +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 5 18:54:32 2010 +0000 + + fix copyright year + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b21461e91ed671ef29fd3cf4780fda44f82a0679 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 5 15:14:08 2010 +0100 + + [cairo] Close image stream before resetting it again + + poppler/CairoOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 866bcc7edb47fe11355081045e2d316a4d530649 +Author: Pino Toscano <pino@kde.org> +Date: Thu Mar 4 14:19:50 2010 +0100 + + [Qt4] no need to save&restore on a newly created painter + + qt4/src/poppler-page.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 654698b556eb53eab7c2d55fc6b3fdd9e35173bb +Author: Pino Toscano <pino@kde.org> +Date: Thu Mar 4 13:16:11 2010 +0100 + + [Qt4] use Arthur unconditionally + + arthur is no more tied to splash, so can be used in an occasion + + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-page.cc | 4 +--- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 41931b6310d2ae81e622db904246f019ceb8410d +Author: Pino Toscano <pino@kde.org> +Date: Thu Mar 4 13:13:11 2010 +0100 + + [Qt4] compile Arthur unconditionally + + as the arthur output dev does not require splash anymore, we can + always compile it with poppler-qt4 + + poppler/Makefile.am | 4 ++-- + qt4/src/CMakeLists.txt | 6 +----- + qt4/src/Makefile.am | 6 +----- + 3 files changed, 4 insertions(+), 12 deletions(-) + +commit 48a29e2bbc9aa9bd0cb2775a2365c0ffdeb6ce87 +Author: Pino Toscano <pino@kde.org> +Date: Thu Mar 4 13:11:43 2010 +0100 + + [Arthur] make ArthurOutputDev compile even with Splash disabled + + text rendering is disabled in that case for now + + poppler/ArthurOutputDev.cc | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 2013a19b6457753890affad8c4049f2ce4627df7 +Author: Pino Toscano <pino@kde.org> +Date: Thu Mar 4 13:02:43 2010 +0100 + + [CMake/tests] compile gtk-splash-test only if splash is enabled + + test/CMakeLists.txt | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit ae740c5cfefbae13f82b750e39fa3dbbdc94858b +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 2 23:22:06 2010 +0100 + + [cpp] update the copyrights + + cpp/poppler-document-private.h | 2 +- + cpp/poppler-document.cpp | 2 +- + cpp/poppler-embedded-file.cpp | 2 +- + cpp/poppler-embedded-file.h | 2 +- + cpp/poppler-global.cpp | 3 ++- + cpp/poppler-global.h | 2 +- + cpp/poppler-page.cpp | 2 +- + cpp/poppler-page.h | 2 +- + cpp/poppler-rectangle.h | 2 +- + cpp/poppler-toc.cpp | 2 +- + cpp/poppler-version.cpp | 2 +- + cpp/tests/poppler-dump.cpp | 2 +- + 12 files changed, 13 insertions(+), 12 deletions(-) + +commit 24b1d8d0b4ae7cea9fbc331f19cd5ce3917b8b4d +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 2 23:15:56 2010 +0100 + + [cpp] {from,to}_utf_8() -> {from,to}_utf8() + + cpp/poppler-global.cpp | 4 ++-- + cpp/poppler-global.h | 4 ++-- + cpp/poppler-page.cpp | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 690af1bc58de1ebe710c5e599f1cb635e4838fc8 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Mar 2 16:33:04 2010 +0100 + + [cpp] define poppler_cpp_EXPORTS when building with autotools as well + + fixes building on Windows + + cpp/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit 7492a376e7e5ec35534276ac15485123645617b0 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 2 22:16:07 2010 +0100 + + [cpp/tests] use gmtime() when gmtime_r() is not available + + cpp/tests/poppler-dump.cpp | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit de013cc14a0621782c53f481ed7e559f241855a3 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 2 22:05:25 2010 +0100 + + [cpp] include config.h _after_ the other includes + + cpp/poppler-global.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 388e5d6aebcabbfc90894c86248159c63701cb0a +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Mar 2 15:51:23 2010 +0100 + + Use ICONV_CONST when necessary + + cpp/poppler-global.cpp | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit aaa58b26733a2f7c778632da4942b588050cf33f +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 2 21:53:55 2010 +0100 + + [CMake] properly define ICONV_CONST + + CMakeLists.txt | 1 - + cmake/modules/FindIconv.cmake | 3 +++ + config.h.cmake | 2 +- + 3 files changed, 4 insertions(+), 2 deletions(-) + +commit 6304b0d8959fccf96b030c757d78e845d04757e4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 28 15:33:53 2010 +0100 + + poppler 0.13.1 + + CMakeLists.txt | 2 +- + NEWS | 33 +++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 37 insertions(+), 4 deletions(-) + +commit 9eac71862915c851c07075e3ca3af82eb9e4e775 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 28 15:33:19 2010 +0100 + + Make sure the private headers end up in the tarball on make dist + + cpp/Makefile.am | 5 +++++ + 1 file changed, 5 insertions(+) + +commit b488172311c2921ab4c365d71ad8b1ab7f596c71 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 28 14:25:36 2010 +0100 + + Add copyright notices + + poppler/CairoFontEngine.cc | 3 ++- + poppler/CairoFontEngine.h | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 5453cff5b7cb47cadfdae585a58409117af8c1f1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 28 13:51:22 2010 +0100 + + [cairo] Select filter for images based on scale factor + + When rendering images and interpolate flag is disabled or missing, we + always interpolate unless scale factor is >= 400% + + See bugs #25268, #9860 + + poppler/CairoOutputDev.cc | 64 + +++++++++++++++++++++++++++++++++------------ + poppler/CairoOutputDev.h | 2 ++ + 2 files changed, 49 insertions(+), 17 deletions(-) + +commit e65456cbd5cae2750426aabeb2d66a10537616f0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 28 13:13:13 2010 +0100 + + [cairo] Refactor scaled size computation into a new method + + poppler/CairoOutputDev.cc | 52 + ++++++++++++++++++++++----------------------- + poppler/CairoOutputDev.h | 2 ++ + 2 files changed, 28 insertions(+), 26 deletions(-) + +commit 32aa9ae7d0087298661829265de00e93398272b3 +Author: Jan Kümmel <jan+freedesktop@snorc.org> +Date: Sat Feb 27 17:58:46 2010 +0100 + + [cairo] Omit writing of embedded fonts into tempary files + + Fixes bug #26694. + + poppler/CairoFontEngine.cc | 146 + ++++++++++++++++++++++++-------------------- + 1 file changed, 80 insertions(+), 66 deletions(-) + +commit 7ba52a32343ca73730a80b64c136e3f03348e7d9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 27 17:42:46 2010 +0100 + + [cairo] Remove unused 'face' from CairoFreeTypeFont class + + poppler/CairoFontEngine.cc | 6 ++---- + poppler/CairoFontEngine.h | 3 +-- + 2 files changed, 3 insertions(+), 6 deletions(-) + +commit 7c3140c88c00282e10888143fffe3c402d48fb05 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 27 13:13:47 2010 +0100 + + Don't use '\' character in PostScript names + + poppler/PSOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8e354a15a1861719c00799937ad9f9bb1bb71e9f +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Feb 24 18:58:11 2010 +0000 + + Fix remaining part of 26243 + + Thomas says: The "gn" is colored with a shading pattern, but the + shading has a bbox, + so it is clipped to this bbox, too. But when coloring text or masks in + pattern colorspace, this is definely wrong. + + poppler/Gfx.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fcbc571a98775b1daa8f562fc8674fb2d15b6626 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 23 17:02:47 2010 +0100 + + [cpp] make checksum() return an array of data, instead of a string + + a checksum is a sequence of values after all, so just return it as + such instead of pretending it is a string + accordingly adapt the mini dump application + + cpp/poppler-embedded-file.cpp | 10 ++++++++-- + cpp/poppler-embedded-file.h | 2 +- + cpp/tests/poppler-dump.cpp | 4 ++-- + 3 files changed, 11 insertions(+), 5 deletions(-) + +commit fbefb9bef9f7a099d51919255a98f412d1e1d696 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 23 16:56:47 2010 +0100 + + [cpp apidox] add API documentation for the 'embedded_file' class + + cpp/poppler-embedded-file.cpp | 43 + +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + +commit 6d39cca0a035fc656d3b86ba66dedaccee532fcb +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 23 16:41:56 2010 +0100 + + [cpp apidox] add API documentation for the 'toc' and 'toc_item' + classes + + cpp/poppler-toc.cpp | 57 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 57 insertions(+) + +commit 857e4ceb26d959c48c7af6bff53ca1bfe5307236 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 23 15:39:58 2010 +0100 + + [cpp] when the loading of the document fails, put back the data + where it was before + + cpp/poppler-document-private.h | 2 +- + cpp/poppler-document.cpp | 10 +++++++--- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 7838b182143086192ac8dcf571da0ce1743619e2 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 23 00:04:09 2010 +0100 + + [cpp] add the directory of the generated html apidox to the ignore + list + + cpp/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 71a38a23a9db5cac872c666283b7abcb1462210c +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 23:43:34 2010 +0100 + + [cpp] add page::text() to get the text inside a page region + + cpp/poppler-page.cpp | 16 ++++++++++++++++ + cpp/poppler-page.h | 1 + + 2 files changed, 17 insertions(+) + +commit 4c75360233bc67f097551980a46ecce976927220 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 23:05:53 2010 +0100 + + [cpp] add page::search() + + cpp/poppler-page.cpp | 51 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + cpp/poppler-page.h | 8 ++++++++ + 2 files changed, 59 insertions(+) + +commit 8932c53a084083eb42d109dd17bac3ad41ce65b5 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 22:39:36 2010 +0100 + + [cpp] add getters and setters for left/top/right/bottom + + cpp/poppler-rectangle.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 8e1ea57f558fa3a1702a17d79b5aaffc486c6a56 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 22:19:51 2010 +0100 + + [cpp] add a global enum for case sensitivity + + cpp/poppler-global.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit ae41b087de8f0a7d525320dcf1d64ff22fe982b6 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 19:06:21 2010 +0100 + + [cpp apidox] doxygen configuration for poppler-cpp + + cpp/Doxyfile | 1551 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 1551 insertions(+) + +commit 1a36a7bcc684065478a3ade2c2938f0e3672140a +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 19:05:49 2010 +0100 + + [cpp apidox] very small start of intro page + + cpp/Mainpage.dox | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 85e052ab7a4c462143325ecf60eebba35411b790 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 18:53:20 2010 +0100 + + [cpp apidox] start adding API documentation for the global 'poppler' + namespace + + ... including the 'convert_date' function and faking the 'noncopyable' + class + + cpp/poppler-global.cpp | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit b01608f91fb6cf6e9c4fb6e6ee3cb57517a766bf +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 18:52:24 2010 +0100 + + [cpp apidox] exclude the 'detail' namespace from apidox extraction + + this includes also the 'noncopyable' typedef, but that will be + handled differently + + cpp/poppler-global.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit f17a7a8cfdeabb3ced3ba8d42c869d892c528e13 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 18:51:30 2010 +0100 + + [cpp apidox] add API documentation for the version functions + + cpp/poppler-version.cpp | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit f6c4bbddc7d04c0b1a6b25c41cbf6d81ae40cc0c +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 18:50:54 2010 +0100 + + [cpp apidox] start adding API documentation for 'document' + + cpp/poppler-document.cpp | 182 + ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 182 insertions(+) + +commit cbb7519904d9b6395d0128e16a79324e4b8bfcc0 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 22 13:15:11 2010 +0100 + + [CMake] no more need to build system check for the Cairo blend modes + + followup of 880890c14e99a954b365a3a6b59deeffa5304d30 for the cmake + build system + + cmake/modules/FindCairo.cmake | 18 ------------------ + config.h.cmake | 3 --- + 2 files changed, 21 deletions(-) + +commit 80f47bbf45faf751c661c1d0931e8e1da622b8ca +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Feb 22 12:43:06 2010 +0100 + + [cairo] Use cairo_surface_set_mime_data() when printing + + When rendering a jpeg image for printing, using + cairo_surface_set_mime_data() to attach the jpeg stream to the + surface reduces drastically the size of the output file. + + poppler/CairoOutputDev.cc | 42 + ++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 1 + + 2 files changed, 43 insertions(+) + +commit d63293af6dbff65f160be0118b1580c03a1aab56 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 27 09:52:23 2009 +0100 + + [cairo] Turn EXTEND_PAD off when printing + + poppler/CairoOutputDev.cc | 98 + +++++++++++++++++++++++++++++++-------------- + 1 file changed, 67 insertions(+), 31 deletions(-) + +commit 880890c14e99a954b365a3a6b59deeffa5304d30 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Feb 22 11:01:05 2010 +0100 + + [cairo] Use CAIRO_VERSION macros to check whether blend modes are + available + + configure.ac | 24 ------------------------ + poppler/CairoOutputDev.cc | 4 ++-- + 2 files changed, 2 insertions(+), 26 deletions(-) + +commit 5c300ce00b5c59da767ca1ffec12f96f0ebbe701 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 21 21:20:10 2010 +0100 + + [Qt4/apidox] fix typo + + qt4/src/poppler-qt4.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f89ccf871e2f4a14129ad3e986b8cd19cdf129c +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 21 21:06:31 2010 +0100 + + [CMake] set the CXXFLAGS in a better way + + CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a18dab9e53a20a76eb46fa3a868fffdd3c754ce2 +Merge: fa09892 f3862f7 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 21 19:56:38 2010 +0100 + + Merge remote branch 'origin/cpp-frontend' + + * origin/cpp-frontend: (34 commits) + [cpp/tests] poppler-dump: show a string for the font type + [cpp/tests] poppler-dump: show the orientation of the pages + [cpp/tests] poppler-dump: a bit less output in permissions lines + [cpp/tests] poppler-dump: add --show-all to show all the information + [cpp] use iconv for the utf8 <-> utf16 conversions + [cpp] add the build system stuff for iconv, mandatory for cpp + [cpp] fixup unicode GooString <-> ustring conversions + [cpp] fix installation of poppler-version.h with autotools and + builddir != srcdir + simplify + [cpp/tests] add a simple poppler-dump test + [cpp] use the correct index (instead of an uninitialized variable) + [cpp] properly delete the children of a toc item + [cpp] actually implement toc::root() + [cpp] fix the reference to the vector data + [cpp] fix the reference to the vector data + [cpp] add destructor for 'rectangle' + [cpp] add out stream operators for rect and rectf + [cpp] add namespace to namespace functiond to link properly + [cpp] add default empty parameters for the passwords of the document + loading functions + [cpp] add "human friendly" output representation for byte_array + ... + + Conflicts: + config.h.cmake + +commit fa0989297e95b6adebed71336ea206d1b279ab24 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 21 16:59:57 2010 +0000 + + Detect the need for nanosleep in solaris + + Fixes bug 26650 + + ConfigureChecks.cmake | 5 +++++ + test/CMakeLists.txt | 17 +++++++++++------ + 2 files changed, 16 insertions(+), 6 deletions(-) + +commit d074485aa9d9fac6b715382002f53e3303bbc519 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 20 10:08:33 2010 +0000 + + Do not call getPixel if we know how to access the data + + Gives a 20% speed increase in some pdf + + splash/Splash.cc | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +commit d4cafe357bd86feb4b56e5dfbf5b7822e237a2ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 20 10:07:20 2010 +0000 + + Only call getPixel when really needed + + Gives a 8% speed increase in some pdf + + splash/Splash.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c3122cfbe090f3a4045269222f941cd5ce77c171 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 20 10:04:37 2010 +0000 + + Move test code to the header to it can be inlined + + Gives a 10% speed increase in some documents + + splash/SplashClip.cc | 40 ++++++++++++++-------------------------- + splash/SplashClip.h | 43 +++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 55 insertions(+), 28 deletions(-) + +commit d987fb9b77e6da454eb898cc6c8baaf747b7ac4f +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Feb 19 23:59:03 2010 +0000 + + implement writeImgFile for splashModeXBGR8 + + splash/SplashBitmap.cc | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +commit f9425c0b5b112ac673d0499f79a743afce719593 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Feb 19 20:18:13 2010 +0000 + + use pkgconfig to detect libpng on autotools too + + configure.ac | 12 ++++--- + goo/Makefile.am | 7 +++- + m4/libpng.m4 | 99 + --------------------------------------------------- + poppler/Makefile.am | 3 ++ + 4 files changed, 17 insertions(+), 104 deletions(-) + +commit 0cb07d645527f25997f5e1b104a6be92441d8ffa +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 18 23:27:20 2010 +0000 + + Only swap w with h if rotation is 90 or 270 + + utils/pdftoppm.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 35015ed11090d67cab69443e607d4d80ca03c619 +Author: Nils Höglund <nils.hoglund@gmail.com> +Date: Thu Feb 18 23:14:51 2010 +0000 + + Match the number of calls to beginMarkedContent and endMarkedContent + + poppler/Gfx.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit ee265760e6ecec93fe26fb8e02848872555daefd +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 18 23:13:48 2010 +0000 + + make sure properties exists before using it + + poppler/TextOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit eab7a55815c06525c7aeba254b66498ab147a958 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 17 21:54:31 2010 +0000 + + if malloc failed return false + + splash/SplashFTFont.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e2def20a45c1d8307fd62fabb9769121af975abf +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 16 23:31:05 2010 +0000 + + Only assume the OC is not visible if it exists and is set to no + + Fixes bug 26532 and a small line that was not drawn in 15899 + + poppler/OptionalContent.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5edd175bdd0f7c2fc3aecb72384de4cb0788fc4e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 16 20:57:22 2010 +0000 + + Add and fix copyright years + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f0fba1b04589061449f98b9dcd8a0c4e7ad2d74 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 22:00:51 2010 +0100 + + make the descriptions specify they refer to the Splash backend + + config.h.cmake | 4 ++-- + configure.ac | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 39b4699020b5cfa1a10e5ef00f0e355e27b21c9f +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 21:56:30 2010 +0100 + + [CMake] reflect that poppler-glib needs cairo now + + poppler-glib.pc.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5c66c775bcd686c61ea136bcd8f261fb631c5e71 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 16 20:52:15 2010 +0000 + + We don't need to pass anything to FontConfig + + Makes it much easier to manage and also fixes bug 26544 + + poppler/GlobalParams.cc | 11 +++-------- + poppler/GlobalParams.h | 6 +----- + 2 files changed, 4 insertions(+), 13 deletions(-) + +commit 582b5259b3c65ee1bef99dbdfccf00f37269b76f +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 16:36:24 2010 +0100 + + [CMake] find the system threads, and define in the config.h if we + have pthreads + + CMakeLists.txt | 4 ++++ + config.h.cmake | 3 +++ + 2 files changed, 7 insertions(+) + +commit 1dff9d440556a155fb5ca7bed15fc6a1f77a1c97 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 16:10:44 2010 +0100 + + [CMake] add the HAVE_LIBOPENJPEG and HAVE_OPENJPEG_H defines, to + match autotools' ones + + CMakeLists.txt | 1 + + config.h.cmake | 6 ++++++ + 2 files changed, 7 insertions(+) + +commit 4a0bcaa83e6e6533cd48c63449a08467d51c13ea +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 16:01:53 2010 +0100 + + [CMake] config.h.cmake: change some comments to match autotools' ones + + config.h.cmake | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 9e38082c3e571d035f0152d65661e5dd97fdd5d8 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 15:58:30 2010 +0100 + + [CMake] add the Win32-specific ENABLE_RELOCATABLE option, matching + autotools' one + + CMakeLists.txt | 5 +++++ + config.h.cmake | 3 +++ + 2 files changed, 8 insertions(+) + +commit eb03020893ed591c18817d75d427a1296cb1f233 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 16 15:49:50 2010 +0100 + + [CMake] config.h.cmake: move POPPLER_WITH_GDK in the same place of + autotools' generated one, and with the same comment + + config.h.cmake | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ba65b3af047b758094b999b2939065c5127508dd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 10 23:08:04 2010 +0000 + + Wrap #include <jpeglib.h> in extern "C" to fix build + + Fixes bug 26351 + + goo/JpegWriter.h | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit d3d2a3ee0a3505f44d1196823716b768d434ba73 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 10 23:16:27 2010 +0100 + + [CMake] fix typo: "MULTITHREAD" -> "MULTITHREADED" + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0dae2294cf8a2f312d8e6504be4e1be516b34b1b +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Feb 9 21:44:07 2010 +0000 + + Fix regression in painting. Fixes bug 26243 + + poppler/Gfx.cc | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit aa9c3acbc73bafb33c8a797701ed0488a4a74263 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jan 28 17:23:18 2010 +0100 + + [cairo] Add clipToStrokePath() method + + It's unimplemented, it just contains a log message to help when + debugging. + + poppler/CairoOutputDev.cc | 4 ++++ + poppler/CairoOutputDev.h | 1 + + 2 files changed, 5 insertions(+) + +commit 41a450c8db45fd064798d15c3d8fe5ab536a7b30 +Author: David Benjamin <davidben@mit.edu> +Date: Fri Jan 22 00:26:59 2010 -0500 + + [cairo] Avoid leaving pointers to free'd memory + + Fixes potential free'd memory access introduced by + 3a94e8ce90c0a4d11c5c5aa8805c167c8a0434e5. I don't think this is + actually + possible in the current code; we push/pop before and after rendering a + PDF, so the bottom state should never have a mask. + + Still, better to clean this up. + + poppler/CairoOutputDev.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 309228404710debee4337cc53c641dfef64ad86c +Author: David Benjamin <davidben@mit.edu> +Date: Wed Jan 27 22:41:16 2010 +0000 + + Allow commands to abort the current stream + + In many instances, the sensible response (and what acroread does) in + case of an error is abort the PDF stream. To avoid changing the return + value of every function and using C++ exceptions, we communicate via a + commandAborted variable. + + This patch, matching acroread's behavior aborts the current stream + when + there are too few arguments or we pop too many times. Implementation + note 39 in Appendix H of the PDF reference contradicts the former, but + hand-crafted test PDFs as well as the file in #24575 suggest + otherwise. + + Unlike all the other attempts, this patch actually fixes the PDF in + bug #24575. + + poppler/Gfx.cc | 11 +++++++++++ + poppler/Gfx.h | 1 + + 2 files changed, 12 insertions(+) + +commit 8284008aa8230a92ba08d547864353d3290e9bf9 +Author: David Benjamin <davidben@mit.edu> +Date: Wed Jan 27 22:40:33 2010 +0000 + + Add a stack of stateGuards to Gfx + + While a stack of states is a good way to maintain graphics contexts, + if + the command stream you are interpreting is untrusted, we must place + appropriate guards to be sure that, not only do we not pop past + the end + of the stack, but we do not pop past the stack as it was when we began + rendering. + + poppler/Gfx.cc | 30 +++++++++++++++++++++++++++++- + poppler/Gfx.h | 11 +++++++++++ + 2 files changed, 40 insertions(+), 1 deletion(-) + +commit 4ae84c830f842d100cbb702b32970951a5a5769f +Author: David Benjamin <davidben@mit.edu> +Date: Wed Jan 27 22:39:20 2010 +0000 + + Maintain the height of the stack in Gfx + + Introduces a new variable Gfx::stackHeight that maintains up-to-date + information about the current height of the stack. + + poppler/Gfx.cc | 4 ++++ + poppler/Gfx.h | 1 + + 2 files changed, 5 insertions(+) + +commit 120fe6ef673c648ae7b19ad2a7e9aef22ee25810 +Author: David Benjamin <davidben@mit.edu> +Date: Wed Jan 27 22:38:43 2010 +0000 + + Do not use objects just after deleting them + + The error condition in GfxCIDFont::GfxCIDFont references cMapName and + collection, so they should not be deleted yet. + + poppler/GfxFont.cc | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 3375fa96c7a7dbbb98f5a7b3df9e840a5f30bc80 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 27 22:32:29 2010 +0000 + + GooVector rewrite, old version had "unknown" origins/license + + goo/GooVector.h | 237 + +++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 141 insertions(+), 96 deletions(-) + +commit a945fe64e16ac9aa2577c5db05fc7f3fd4955b7b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jan 27 16:15:40 2010 +0100 + + [cairo] Fix downscaling images when document is rotated + + Fixes bug #26264. + + poppler/CairoOutputDev.cc | 37 +++++++++++++++++++++++++++++++++++-- + 1 file changed, 35 insertions(+), 2 deletions(-) + +commit 428cc965c17f167ea00540beeaeaac5c3e426686 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 26 21:01:32 2010 +0000 + + Add POPPLER_WITH_GDK in cmake build system + + Bug 26247 + + glib/CMakeLists.txt | 1 + + glib/poppler-features.h.cmake | 1 + + 2 files changed, 2 insertions(+) + +commit 0af1ae75fd4c8031343f668bed5d8ca6588ee652 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jan 26 20:49:17 2010 +0100 + + [cairo] Use the right matrix for the mask in drawMaskedImage() + + Fixes bug #16906. + + poppler/CairoOutputDev.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit d8ceaff39f5b80624b6bdc703c2a180dfc3d73ee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jan 26 11:57:06 2010 +0100 + + [cairo] Add some more LOG messages + + poppler/CairoOutputDev.cc | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 778e764b3cb77526260c3c8b46acf19ad06fc61d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 25 22:40:20 2010 +0000 + + poppler 0.13.0 + + CMakeLists.txt | 4 +-- + NEWS | 99 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 104 insertions(+), 5 deletions(-) + +commit 1b5333f2685b8ab85bb1f5b899332c5a0ac99a3d +Author: Pino Toscano <pino@kde.org> +Date: Mon Jan 25 02:19:00 2010 +0100 + + [CMake] allow multiple targets with the same name + + this is needed for building the unit tests later without explicitly + having + enabling them at configure time (thus compile them on-demand) + for this, set the cmake policy 0003 as OLD (allow), and consecuently + 0011 for + setting the former from an include()d script + + cmake/modules/PopplerDefaults.cmake | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 92e1f46866c063c370ef1d6324f6a6c01aed6680 +Author: Pino Toscano <pino@kde.org> +Date: Mon Jan 25 02:15:27 2010 +0100 + + [CMake] do not add the fake buildtests target for the MSVC IDE + + cmake/modules/PopplerMacros.cmake | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dea5aa37de079196fa916b1db9af782cf25045f9 +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Mon Jan 25 00:51:20 2010 +0000 + + Install some more goo files + + CMakeLists.txt | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 671a971c45a1e8ce8f6daade82117a9a137034d6 +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Mon Jan 25 00:48:31 2010 +0000 + + do not install a private header + + qt4/src/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 54c86e53a143a8f9d196e4bef2a733c6f00f6026 +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Mon Jan 25 00:33:07 2010 +0000 + + Only build tests if told to + + test/CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit eb082274694aadb80dd16caea65d7f0a1adf8b46 +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Mon Jan 25 00:29:55 2010 +0000 + + Only build demos and test if told so. Install poppler-layer.h + + glib/CMakeLists.txt | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 73fcc310cd7d6ef435b453485c1c99a33f77212a +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Mon Jan 25 00:29:09 2010 +0000 + + install man pages + + utils/CMakeLists.txt | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 8672217af4cf88d5506572c2b40fbb0d1d0dbd87 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 25 00:11:50 2010 +0000 + + Make the poppler object cache params be a ref + + And make sure what we was is a ref, otherwise we abort + + poppler/Gfx.cc | 14 ++++++++------ + poppler/PopplerCache.cc | 12 ++++++------ + poppler/PopplerCache.h | 6 +++--- + 3 files changed, 17 insertions(+), 15 deletions(-) + +commit 9567fd8d3d905897d0abacd77885102ae86ba8a9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 24 20:15:49 2010 +0000 + + ImgWriter is a header too + + goo/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 735e8a690d0bd3ab4bec90bdad975d19ac3d4689 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 24 19:51:19 2010 +0000 + + noone maintains this either + + msvc/config.h | 62 --------------------------------- + msvc/poppler/poppler-config.h | 77 + ----------------------------------------- + 2 files changed, 139 deletions(-) + +commit d485564f0dc86f62b996380bfbd570cf3f543e4f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 24 19:22:33 2010 +0000 + + remove files noone maintains + + README.windows | 63 ------------------------ + makefile.vc | 150 + -------------------------------------------------------- + 2 files changed, 213 deletions(-) + +commit 38467f2738c88f060ae1d30332e34da743a888a5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 24 19:18:44 2010 +0000 + + only compile glib frontend if cairo is found + + CMakeLists.txt | 4 ++-- + glib/CMakeLists.txt | 25 +++++++------------------ + 2 files changed, 9 insertions(+), 20 deletions(-) + +commit cf045acf46307d51fb6d9959451b53681e6cac03 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 24 19:01:52 2010 +0000 + + compile + + glib/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 0397cf4f193015286464ae70ab202ed400110e30 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 24 19:00:09 2010 +0000 + + Add and fix copyright years + + poppler/CairoFontEngine.cc | 1 + + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 2 +- + poppler/Gfx.cc | 2 +- + poppler/Gfx.h | 2 +- + poppler/PopplerCache.cc | 1 + + poppler/PopplerCache.h | 1 + + 7 files changed, 7 insertions(+), 4 deletions(-) + +commit 9c9f18b6ceea546dfb21ef0aab29ba99733dcb52 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 24 19:27:29 2010 +0100 + + [glib-demo] Remove #ifdef HAVE_CAIRO macros from several demos + + glib/demo/images.c | 2 -- + glib/demo/layers.c | 71 + +++------------------------------------------------- + glib/demo/render.c | 29 ++++----------------- + 3 files changed, 9 insertions(+), 93 deletions(-) + +commit 4e938c1f81add2162ced0e97b24fe588f15f178d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 24 19:15:06 2010 +0100 + + [glib] Make glib frontend unconditionally use cairo output device + + Splash support has been removed. + + configure.ac | 74 +++++++------- + glib/Makefile.am | 20 +--- + glib/poppler-document.cc | 9 -- + glib/poppler-page.cc | 237 + +-------------------------------------------- + glib/poppler-page.h | 7 -- + glib/poppler-private.h | 14 --- + glib/poppler.cc | 6 -- + glib/test-poppler-glib.cc | 6 +- + poppler-glib.pc.in | 2 +- + 9 files changed, 51 insertions(+), 324 deletions(-) + +commit 59ff9d66fc3b0c9612b1c12fc1ae4dbb8dc85b39 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 24 17:57:48 2010 +0100 + + Use a small object cache in GfxResources to cache GState objects + + It drastically improves performance with some documents like page + 742 of + PDF32000_2008.pdf + + poppler/Gfx.cc | 19 +++++++++++++++++-- + poppler/Gfx.h | 2 ++ + 2 files changed, 19 insertions(+), 2 deletions(-) + +commit 880a4a9a60a10f7aa7d3dc7c2802b31b7ef01e06 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 24 17:56:35 2010 +0100 + + Add a generic cache to store objects by its reference + + poppler/PopplerCache.cc | 60 + +++++++++++++++++++++++++++++++++++++++++++++++ + poppler/PopplerCache.h | 16 +++++++++++++ + 2 files changed, 76 insertions(+) + +commit 5ad492df75c0c2394719e85db4c8b43f15b52110 +Author: mpsuzuki <mpsuzuki@hiroshima-u.ac.jp> +Date: Sun Jan 24 13:34:41 2010 +0100 + + [cairo] Fix memory leak + + poppler/CairoFontEngine.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 3160464b4b70c714c36234320878acab81b866cc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Nov 26 13:17:19 2009 +0100 + + [cairo] Use our own implementation to scale down images instead + of cairo + + This is a workaround for the low quality downscaling of pixman. + Rescaler implementation is a box filter that supports non-integer box + sizes written by Jeff Muizelaar. + Fixes bug #5589. + + poppler/CairoOutputDev.cc | 89 +++++++++++ + poppler/CairoOutputDev.h | 1 + + poppler/CairoRescaleBox.cc | 352 + ++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoRescaleBox.h | 12 ++ + poppler/Makefile.am | 4 +- + 5 files changed, 457 insertions(+), 1 deletion(-) + +commit 6825a219f0bc0ac6fd469fb8a6ebb86df774375f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jan 23 11:24:15 2010 +0100 + + [glib] Use TextOutputDev to get TextPage when we haven't rendered + the page + + glib/poppler-page.cc | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +commit 6c61a457e9a8ec10945bc1e0700c8e4d121faa58 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 20 21:59:05 2010 +0000 + + Fix GfxRadialShading::GfxRadialShading + + Fixes crash in KDE bug 223359 + + poppler/GfxState.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 442894d371879a6bf2adb5a39b9dd0a49e76e4ac +Author: Pino Toscano <pino@kde.org> +Date: Fri Jan 15 21:28:42 2010 +0100 + + [glib-demo/cmake] compile print.c + + followup of b64d4bd46b052feb0b143f1348773afbd93e5e33 + + glib/demo/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit b64d4bd46b052feb0b143f1348773afbd93e5e33 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 27 11:47:22 2009 +0100 + + [glib-demo] Add print demo + + glib/demo/Makefile.am | 2 + + glib/demo/main.c | 4 +- + glib/demo/print.c | 135 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/print.h | 31 ++++++++++++ + 4 files changed, 171 insertions(+), 1 deletion(-) + +commit ba2c746f358a5785d8cbaaf03d8628ee3754c388 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 27 09:52:50 2009 +0100 + + [glib-demo] Add render for printing option to render demo + + glib/demo/render.c | 47 ++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 38 insertions(+), 9 deletions(-) + +commit 9a478008ccb61641f09bd77eaa55033cca266c43 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jan 15 12:03:11 2010 +0100 + + Add FONTCONFIGURATION macros to poppler-config.h + + They are used in a header file (GlobalParams.h). It fixes a crash + when opening any document. + + poppler/poppler-config.h.in | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 1f80f874d8e132411816302465f04bc59d404d89 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 14 08:43:11 2010 +0000 + + Fix Uncover and Fade to return correct values + + Bug 26034 + + poppler/PageTransition.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 350ff407e06a961f2a5b9d203cb8e78ce09313a0 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jan 13 22:20:41 2010 +0000 + + Make poppler (optionally) relocatable on Windows + + configure.ac | 26 +++++++++++++++++++++ + poppler/GlobalParams.cc | 57 + +++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 83 insertions(+) + +commit 36b67b002db802bfad553720e2114b76b07bb614 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jan 13 22:17:03 2010 +0000 + + Make fontconfig optional with mingw compiler + + CMakeLists.txt | 8 +++++++- + config.h.cmake | 6 ++++++ + configure.ac | 39 ++++++++++++++++++++++++++++++++++++++- + makefile.vc | 2 +- + poppler/GlobalParams.cc | 10 +++++++--- + poppler/GlobalParams.h | 7 ++++--- + poppler/GlobalParamsWin.cc | 5 +++++ + 7 files changed, 68 insertions(+), 9 deletions(-) + +commit 9c0b20ab8c104c2f5398a5a3b8409ca554f5fa39 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 12 22:55:06 2010 +0000 + + Add the possibility of using float for splash variables instead + of double + + Based on a patch by Marius Vollmer marius.vollmer@nokia.com + See bug 25578 for more info + + CMakeLists.txt | 7 ++++++- + config.h.cmake | 5 ++++- + configure.ac | 10 +++++++++- + splash/SplashMath.h | 14 ++++++++++++-- + splash/SplashTypes.h | 4 +++- + 5 files changed, 34 insertions(+), 6 deletions(-) + +commit 30e5f76e372114339fa1d37c335e6bbade8b6d8a +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 7 11:18:36 2010 +0100 + + [CMake] followup recent glib/gtk+ version requirements + + - glib to 2.18, see ce9404b1999f81b3f9e5a89bcd6e715463f89024 + - gtk+ to 2.14, see e338643f2cebb1203f7ff0646f87b3dea8318757 + + cmake/modules/FindGTK.cmake | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e338643f2cebb1203f7ff0646f87b3dea8318757 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jan 7 11:08:31 2010 +0100 + + [tests] Bump GTK+ requirements to 2.14 + + Fixes bug #22090. + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ce9404b1999f81b3f9e5a89bcd6e715463f89024 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jan 7 11:06:19 2010 +0100 + + Bump glib requirements to 2.18 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 526c8871cbdfbc119e013ee96887a79f65403790 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Dec 31 17:52:33 2009 +0100 + + [glib] Use PDFDoc(wchar_t *, ...) on Windows + + Fixes bug #25032 + + glib/poppler-document.cc | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +commit e0c8188136958b853269179079efefdd3488dc22 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 4 18:36:01 2010 +0000 + + Require Qt 4.4 + + This updates the requirement to real requirement + + CMakeLists.txt | 2 +- + configure.ac | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit f9accdb878b23ebd2152dd05d61cfcc71d46cd03 +Author: Pino Toscano <pino@kde.org> +Date: Mon Jan 4 14:13:13 2010 +0100 + + [Qt4/tests] use getPdfVersion() instead of the deprecated pdfVersion() + + qt4/tests/stress-poppler-dir.cpp | 3 ++- + qt4/tests/stress-poppler-qt4.cpp | 3 ++- + qt4/tests/test-password-qt4.cpp | 4 +++- + qt4/tests/test-poppler-qt4.cpp | 4 +++- + 4 files changed, 10 insertions(+), 4 deletions(-) + +commit 898e939d8c0ac74cc7ee3f5d42d83083ed31036e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jan 2 02:33:58 2010 +0100 + + Make pdftoppm embed correct resolution in PNG and JPEG files + + goo/ImgWriter.h | 3 ++- + goo/JpegWriter.cc | 6 +++++- + goo/JpegWriter.h | 3 ++- + goo/PNGWriter.cc | 6 +++++- + goo/PNGWriter.h | 3 ++- + splash/SplashBitmap.cc | 9 +++++---- + splash/SplashBitmap.h | 5 +++-- + utils/HtmlOutputDev.cc | 4 +++- + utils/pdftoppm.cc | 9 +++++---- + 9 files changed, 32 insertions(+), 16 deletions(-) + +commit df569dc2fb89d7e0780bbf7a687ce2464ff5cb43 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jan 2 01:19:50 2010 +0100 + + enable AM_SILENT_RULES by default + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f3862f7d987aae52a1fd2bb0af27d1cd803a5b84 +Author: Pino Toscano <pino@kde.org> +Date: Thu Dec 31 00:20:11 2009 +0100 + + [cpp/tests] poppler-dump: show a string for the font type + + cpp/tests/poppler-dump.cpp | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +commit 9c343c821593ebae51ac47b58ad007a82f198652 +Author: Pino Toscano <pino@kde.org> +Date: Thu Dec 31 00:13:09 2009 +0100 + + [cpp/tests] poppler-dump: show the orientation of the pages + + cpp/tests/poppler-dump.cpp | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit bc91fe3824f37cd17a38aac85c817e8ada1b2f43 +Author: Pino Toscano <pino@kde.org> +Date: Wed Dec 30 23:53:31 2009 +0100 + + [cpp/tests] poppler-dump: a bit less output in permissions lines + + cpp/tests/poppler-dump.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1199de8f097a78edb831313841ac0ed3f9ec9905 +Author: Pino Toscano <pino@kde.org> +Date: Wed Dec 30 23:50:36 2009 +0100 + + [cpp/tests] poppler-dump: add --show-all to show all the information + + cpp/tests/poppler-dump.cpp | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 9522f830b59942adfc91d5f03c274415a4737ccc +Author: Pino Toscano <pino@kde.org> +Date: Wed Dec 30 23:38:40 2009 +0100 + + [cpp] use iconv for the utf8 <-> utf16 conversions + + cpp/poppler-global.cpp | 92 + +++++++++++++++++++++++++++++++++--------------- + 1 file changed, 64 insertions(+), 28 deletions(-) + +commit b156b4031f5daf658f40db8efa2a3016d95b98b5 +Author: Pino Toscano <pino@kde.org> +Date: Wed Dec 30 23:24:23 2009 +0100 + + [cpp] add the build system stuff for iconv, mandatory for cpp + + CMakeLists.txt | 6 ++ + Makefile.am | 1 + + cmake/modules/FindIconv.cmake | 57 +++++++++++++ + config.h.cmake | 6 ++ + configure.ac | 6 ++ + cpp/CMakeLists.txt | 2 +- + cpp/Makefile.am | 3 +- + m4/iconv.m4 | 180 + +++++++++++++++++++++++++++++++++++++++++ + 8 files changed, 259 insertions(+), 2 deletions(-) + +commit a0cffb8b69e0595a2afe15ecc4928e0df1eeb063 +Author: Pino Toscano <pino@kde.org> +Date: Wed Dec 30 18:57:09 2009 +0100 + + [cpp] fixup unicode GooString <-> ustring conversions + + better make them use the "hand-made" code, it is more correct for them + + cpp/poppler-private.cpp | 44 + +++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 41 insertions(+), 3 deletions(-) + +commit 3b6e3605209d5db453725b9ce4e6e54679d9c5da +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 27 15:30:22 2009 +0100 + + Do not crop the transformation matrix at an arbitrary value + + Fixes bug 25763 and gave no regression on my test suite + + poppler/GfxState.cc | 21 --------------------- + poppler/SplashOutputDev.cc | 15 +++++++++++++++ + 2 files changed, 15 insertions(+), 21 deletions(-) + +commit ea44c60645001ffea7d297f8549aaa4f5ce5e16c +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Sun Dec 27 15:27:00 2009 +0100 + + Try to work on streams without Length + + We have code that finds the Length if it's wrong so let that code + do its job + instead of returning a NULL stream + + poppler/Parser.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 283dd326a00c804b6332ee3ca1aaa0d86377b3f3 +Author: Pino Toscano <pino@kde.org> +Date: Sat Dec 19 12:50:10 2009 +0100 + + [cpp] fix installation of poppler-version.h with autotools and + builddir != srcdir + + cpp/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df0ccddb7f784b4a8564beda51b3047cb9e3611a +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 18 20:23:48 2009 +0000 + + move the retrieval of the bitmap after rendering the page as it can + change on render time + + utils/pdftoppm.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit ab88a02f7efefc950a316d7a5edf88dad8f3e4d0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Dec 17 18:24:20 2009 +0100 + + [annots] QuadPoints is required in Text Markup annotations + + Show an error message and mark annotation as invalid when it's + missing. + + poppler/Annot.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 39dc99431b3ea9e00f6f645dd7169c0319571dc9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Dec 17 18:17:20 2009 +0100 + + [annots] Create appearance stream for Sound Annotations when not + defined + + See bug #23108. + + poppler/Annot.cc | 112 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 + + 2 files changed, 114 insertions(+) + +commit e4f5a78a853b88b1586ef59fc8893a321ea23736 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Dec 17 17:39:39 2009 +0100 + + [annots] Add Tag and Graph icons for File Attachment annotations + + See bug #23108. + + poppler/Annot.cc | 70 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 70 insertions(+) + +commit 752b14857cfb0669fd6d7dfef2ea73c13a2369fc +Author: Pino Toscano <pino@kde.org> +Date: Thu Dec 17 17:16:01 2009 +0100 + + simplify + + cpp/poppler-toc.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a26e4b7903fabc667d7d16c23ca2c7a535dd05fa +Author: Pino Toscano <pino@kde.org> +Date: Thu Dec 17 17:09:35 2009 +0100 + + [cpp/tests] add a simple poppler-dump test + + this small test executable can dump various features of the document, + like the general info, permissions, metadata, toc, fonts, + embedded files, pages, etc + + also add the necessary autotools+cmake machinery to compile it + + configure.ac | 1 + + cpp/CMakeLists.txt | 2 + + cpp/Makefile.am | 1 + + cpp/tests/.gitignore | 1 + + cpp/tests/CMakeLists.txt | 24 ++++ + cpp/tests/Makefile.am | 17 +++ + cpp/tests/poppler-dump.cpp | 293 + ++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 339 insertions(+) + +commit 86c871cc625d00b8ee7f93dc8c0f9ef8462bba5a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Dec 17 17:05:45 2009 +0100 + + [annots] Create appearance stream for Text Markup Annotations when + not defined + + Highlight annotations are an exception, we always ignore the + appearance stream to use our own, since for most of the documents the + appearance stream provided by the annotation is not enough. That's why + it's currently broken. This is what acroread does indeed and Leonard + Rosenthol recommended us to do the same. + See bug #23108. + + poppler/Annot.cc | 199 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 + + 2 files changed, 201 insertions(+) + +commit 904ecd929c6acbbad6d782b950c53c0a80e1f39c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Dec 17 12:49:20 2009 +0100 + + [annots] Fix memory leaks + + poppler/Annot.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit ef7954b86f9b1a762c4f77a48d5f42f8db4bbed7 +Author: Pino Toscano <pino@kde.org> +Date: Tue Dec 15 02:20:18 2009 +0100 + + [cpp] use the correct index (instead of an uninitialized variable) + + cpp/poppler-page.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2547b5e53e7799cf7299838ae9bd882c21a228ae +Author: Pino Toscano <pino@kde.org> +Date: Tue Dec 15 02:14:57 2009 +0100 + + [cpp] properly delete the children of a toc item + + cpp/poppler-toc.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit 771bd3594740fe16bd030dbe73928a8b1d4d113f +Author: Pino Toscano <pino@kde.org> +Date: Tue Dec 15 02:04:24 2009 +0100 + + [cpp] actually implement toc::root() + + cpp/poppler-toc.cpp | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ca1d2ec4588b2437b58b4448ae2fc5ebd0f130d3 +Author: Pino Toscano <pino@kde.org> +Date: Tue Dec 15 00:54:29 2009 +0100 + + [cpp] fix the reference to the vector data + + cpp/poppler-global.cpp | 2 +- + cpp/poppler-private.cpp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 16c946e7658b0e9cff701ce1d6bbf7d3828cbe08 +Author: Pino Toscano <pino@kde.org> +Date: Tue Dec 15 00:35:25 2009 +0100 + + [cpp] fix the reference to the vector data + + cpp/poppler-document.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9bb90c99b65e0e9d9b65c7dbeb5b4d66377ceb21 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 23:43:12 2009 +0100 + + [cpp] add destructor for 'rectangle' + + cpp/poppler-rectangle.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 61ccdc9ab3b816174896fcae0899ff34f11eee80 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 23:40:51 2009 +0100 + + [cpp] add out stream operators for rect and rectf + + cpp/CMakeLists.txt | 1 + + cpp/Makefile.am | 1 + + cpp/poppler-rectangle.cpp | 35 +++++++++++++++++++++++++++++++++++ + cpp/poppler-rectangle.h | 5 +++++ + 4 files changed, 42 insertions(+) + +commit 69dd51fed3de41f8b799b811ae5ee59c0d5f59c2 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 22:24:07 2009 +0100 + + [cpp] add namespace to namespace functiond to link properly + + cpp/poppler-global.cpp | 4 ++-- + cpp/poppler-version.cpp | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 3923fa4890984d8616d86016f4f4a94e8ef3e992 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 22:23:15 2009 +0100 + + [cpp] add default empty parameters for the passwords of the document + loading functions + + cpp/poppler-document.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 1d23cc677e9b0a9f61c53e0ea365537f33abe5bf +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 21:44:56 2009 +0100 + + [cpp] add "human friendly" output representation for byte_array + + cpp/poppler-global.cpp | 23 +++++++++++++++++++++++ + cpp/poppler-global.h | 3 +++ + 2 files changed, 26 insertions(+) + +commit 82954ea5f8ba880276328765f104690a05adbd9e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Dec 7 12:05:54 2009 +0100 + + [annot] Create appearance stream for Attachment Annotations when + not defined + + See bug #23108. + + poppler/Annot.cc | 94 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 ++ + 2 files changed, 96 insertions(+) + +commit c6195472326c183fcfd8a3e9da1ee7f6fa8b7c3d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 6 17:09:23 2009 +0100 + + [annots] Use opacity when drawing Markup Annotations + + According to the spec: + + "The constant opacity value that shall be used in painting the + annotation. This value shall apply to all visible elements of the + annotation in its closed state (including its background and border) + but + not to the pop-up window that appears when the annotation is opened. + + The specified value shall not used if the annotation has an appearance + stream in that case, the appearance stream shall specify any + transparency. + + If no explicit appearance stream is defined for the annotation, it may + be painted by implementation-dependent means that do not necessarily + conform to the PDF imaging model; in this case, the effect of + this entry + is implementation-dependent as well." + + poppler/Annot.cc | 21 +++++++++++++++------ + poppler/Gfx.cc | 9 ++++++++- + poppler/Gfx.h | 2 +- + 3 files changed, 24 insertions(+), 8 deletions(-) + +commit a337c1d757d52c1c238229d2f0cd3a41694b0e08 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 16:18:22 2009 +0100 + + [cpp] add document metadata reading + + cpp/poppler-document.cpp | 9 +++++++++ + cpp/poppler-document.h | 1 + + 2 files changed, 10 insertions(+) + +commit 6c4fa513e60dbdd5ab693434f239d82d95756994 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 6 16:56:22 2009 +0100 + + [annot] Create appearance stream for Geometry Annotations when + not defined + + See bug #23108. + + poppler/Annot.cc | 120 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 + + 2 files changed, 122 insertions(+) + +commit eed94b8bd2855dce1fd39b835e3280cbd0ccd1cf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 6 16:51:37 2009 +0100 + + [annot] Create appearance stream for Line Annotations when not defined + + See bug #23108. + + poppler/Annot.cc | 62 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 ++ + 2 files changed, 64 insertions(+) + +commit 1c7a5f5e89c4c51e31b6de345d4862ef8dcc2bc0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 6 16:40:14 2009 +0100 + + [annot] Create appearance stream for Text Annotations when not defined + + Streams have been created by using the svg icons created by mac_v and + ulisse. See bug #23108. + + poppler/Annot.cc | 305 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 2 + + 2 files changed, 307 insertions(+) + +commit c9cb6353ad5279d09615eb2c944b2b053cdf5ccc +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 15:52:25 2009 +0100 + + [cpp] add function to query for document "permissions" + + cpp/poppler-document.cpp | 23 +++++++++++++++++++++++ + cpp/poppler-document.h | 1 + + cpp/poppler-global.h | 4 ++++ + 3 files changed, 28 insertions(+) + +commit 30e90c7c1b41c62ddc21905e7ccdea4c95547e80 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 15:33:36 2009 +0100 + + [cpp] add is_encrypted and is_linearized for document + + cpp/poppler-document.cpp | 10 ++++++++++ + cpp/poppler-document.h | 2 ++ + 2 files changed, 12 insertions(+) + +commit 93fd588c519958a1f66231c111ea8a6b0a759be1 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 13:19:24 2009 +0100 + + [cpp] add the possibility to load a document from raw data + + cpp/poppler-document-private.h | 5 +++++ + cpp/poppler-document.cpp | 35 ++++++++++++++++++++++++++++++++++- + cpp/poppler-document.h | 3 +++ + 3 files changed, 42 insertions(+), 1 deletion(-) + +commit 53996365b159cf84adf2cac56c76b8bda8dfb12e +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 12:57:41 2009 +0100 + + [cpp] use the byte_array typedef + + cpp/poppler-embedded-file.cpp | 6 +++--- + cpp/poppler-embedded-file.h | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit e4969c1aaed4a8eb770d8b54920f2476129bbcb7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 6 16:19:36 2009 +0100 + + [annots] Refactor Annot::setColor to receive an AnnotColor + + Removes duplicated code since color arrays are already parsed in + AnnotColor + + poppler/Annot.cc | 136 + ++++++++++++++++++++++++++++-------------------------- + poppler/Annot.h | 4 +- + 2 files changed, 73 insertions(+), 67 deletions(-) + +commit cfb4f5dfabf31de22d68aa0d5796cb7a33d8b462 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 11:06:36 2009 +0100 + + [cpp] add a byte_array typedef, and use it for utf8 string data + + cpp/poppler-global.cpp | 12 +++--------- + cpp/poppler-global.h | 5 ++++- + cpp/poppler-private.cpp | 5 ++--- + 3 files changed, 9 insertions(+), 13 deletions(-) + +commit 2d13ac31671b2007e44a90f45a82cb3adfa9c80c +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 02:30:06 2009 +0100 + + update ignore files + + .gitignore | 1 + + cpp/.gitignore | 1 + + 2 files changed, 2 insertions(+) + +commit 01e902e40ca15acf0319e37d39a271d6875bfce9 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 02:02:47 2009 +0100 + + [cpp] add a version header+functions + + this way, it is possible to get (either at build time and at runtime) + the version of the current poppler-cpp library + + poppler-config.h is generated by the build system (autotools or cmake) + with the correct version information + + configure.ac | 2 ++ + cpp/CMakeLists.txt | 5 +++++ + cpp/Makefile.am | 6 ++++-- + cpp/poppler-version.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ + cpp/poppler-version.h.in | 39 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 91 insertions(+), 2 deletions(-) + +commit b3f5e5d60bc9109da961940f6216722f9db4a87b +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:56:15 2009 +0100 + + [CMake] add the configure check for the Cairo blend modes support + (as in autotools) + + cmake/modules/FindCairo.cmake | 18 ++++++++++++++++++ + config.h.cmake | 3 +++ + 2 files changed, 21 insertions(+) + +commit f6ba877e0c22538cfe34d32d69814f660de59d2c +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:44:55 2009 +0100 + + [CMake] add configure check for sys/mman.h (as in autotools) + + ConfigureChecks.cmake | 1 + + config.h.cmake | 3 +++ + 2 files changed, 4 insertions(+) + +commit e12801320ae030628fc62c073983c06b39ee13d7 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:42:20 2009 +0100 + + minor spello + + config.h.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6428907ebcf33d4391673aadcfa71c3061f6d352 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:41:49 2009 +0100 + + [CMake] add configure check for fcntl.h (as in autotools) + + ConfigureChecks.cmake | 1 + + config.h.cmake | 3 +++ + 2 files changed, 4 insertions(+) + +commit 916ab7163249e23bd5ba00922fdcad9caaf92c75 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:34:59 2009 +0100 + + [CMake] oops, those should have been '#cmakedefine' and not '#define' + + config.h.cmake | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ea655d8c7e24e97ee710110a783ed9c209cf76e3 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:33:51 2009 +0100 + + [CMake] move and rename to match more the autotools output + + config.h.cmake | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit 9f0146c5b2f9326e834104b89791f66b18f85adc +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 14 00:28:04 2009 +0100 + + [CMake] add checks for gmtime_r and localtime_r + + ConfigureChecks.cmake | 2 ++ + config.h.cmake | 6 ++++++ + 2 files changed, 8 insertions(+) + +commit 9d0cf201e96044dd679c26bea6255d986a6cd246 +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 13 23:45:39 2009 +0100 + + [cpp] add ignore file + + cpp/.gitignore | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit d783e92b863d8b22de6ca326328115fec63193ed +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 13 23:42:33 2009 +0100 + + [cpp] don't forget the cmake stuff when packing with the autotools + + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0105caefe860e7a45fc7d3a1bd1162fe56bcfe6a +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 13 23:40:55 2009 +0100 + + [cpp] add the pkg-config stuff + + CMakeLists.txt | 3 +++ + Makefile.am | 7 +++++-- + configure.ac | 3 ++- + poppler-cpp.pc.cmake | 9 +++++++++ + poppler-cpp.pc.in | 9 +++++++++ + 5 files changed, 28 insertions(+), 3 deletions(-) + +commit d5a74f78df0dca24fd537b30424fd2ebb3efe3e2 +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 13 23:35:06 2009 +0100 + + [cpp] add the (rest of the) CMake build system for it + + CMakeLists.txt | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 0e41f937946e4e4c1b660406bd74e4afe8825b5f +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 13 23:31:46 2009 +0100 + + [cpp] add the autotools buildsystem for it + + Makefile.am | 6 +++++- + configure.ac | 15 +++++++++++++++ + cpp/Makefile.am | 32 ++++++++++++++++++++++++++++++++ + 3 files changed, 52 insertions(+), 1 deletion(-) + +commit 9727fdc0c682742335e44ddc2f32d60e4c59983a +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 13 22:55:28 2009 +0100 + + Start of a pure C++ frontend for Poppler. + + This initial version (called 'poppler-cpp') includes preliminary + support for: + - document (loading from file name, some query methods, unlocking, + font listing, embedded files) + - page (some query methods) with page transitions + - TOC + + Modelled a bit on the Qt4 API, it provides also an own "ustring" + typedef representing UTF-16 strings, + with methods to convert back/to UTF-8 and Latin 1. + + Most probably it has bugs, but nevertheless worth testing and + developing. + + cpp/CMakeLists.txt | 34 ++++ + cpp/poppler-document-private.h | 55 ++++++ + cpp/poppler-document.cpp | 316 + +++++++++++++++++++++++++++++++++++ + cpp/poppler-document.h | 92 ++++++++++ + cpp/poppler-embedded-file-private.h | 40 +++++ + cpp/poppler-embedded-file.cpp | 116 +++++++++++++ + cpp/poppler-embedded-file.h | 55 ++++++ + cpp/poppler-font.cpp | 166 ++++++++++++++++++ + cpp/poppler-font.h | 91 ++++++++++ + cpp/poppler-global.cpp | 162 ++++++++++++++++++ + cpp/poppler-global.h | 86 ++++++++++ + cpp/poppler-page-private.h | 44 +++++ + cpp/poppler-page-transition.cpp | 95 +++++++++++ + cpp/poppler-page-transition.h | 82 +++++++++ + cpp/poppler-page.cpp | 121 ++++++++++++++ + cpp/poppler-page.h | 62 +++++++ + cpp/poppler-private.cpp | 70 ++++++++ + cpp/poppler-private.h | 66 ++++++++ + cpp/poppler-rectangle.h | 60 +++++++ + cpp/poppler-toc-private.h | 62 +++++++ + cpp/poppler-toc.cpp | 136 +++++++++++++++ + cpp/poppler-toc.h | 74 ++++++++ + 22 files changed, 2085 insertions(+) + +commit 62854051f4e47028147cc93a5faac39e2fa2c9fd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 12 17:22:08 2009 +0100 + + Initialize profileCommands in Gfx constructor + + poppler/Gfx.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 4e6af25a028d16608111634c5467420e31fa399b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Dec 9 19:45:40 2009 +0100 + + [cairo] Update font of TextPage in CairoOutputDev::updateAll() + + Fixes a crash with some documents, see Evince bug + https://bugzilla.gnome.org/show_bug.cgi?id=603934 + + poppler/CairoOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6798d3e52e36e91bceff3a1a96372e9d9c6f3813 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 6 15:34:36 2009 +0100 + + Use fixed size array in AnnotColor + + glib/poppler-annot.cc | 2 +- + poppler/Annot.cc | 24 +++++------------------- + poppler/Annot.h | 5 ++--- + poppler/Gfx.cc | 2 +- + qt4/src/poppler-annotation.cc | 2 +- + 5 files changed, 10 insertions(+), 25 deletions(-) + +commit 92fab93bee3748a73c09429cc8a105c16f21fed0 +Author: Axel Struebing <axel.struebing@freenet.de> +Date: Sat Dec 5 22:31:29 2009 +0000 + + Add a empty space after null + + Fixes bug 25465 + + poppler/PDFDoc.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 32103f45d0193b31e95269ea9123b8011d93e994 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 5 10:14:18 2009 +0100 + + [annots] Add isVisible() to check whether annot is visible before + drawing it + + It takes into account annot flags and optional content. + + poppler/Annot.cc | 29 ++++++++++++++--------------- + poppler/Annot.h | 1 + + 2 files changed, 15 insertions(+), 15 deletions(-) + +commit c14dfc7102341f5e1ed67a05c0738d55befab1ec +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 5 10:07:46 2009 +0100 + + [annots] Do not check if annot is a link in Annot::draw() + + AnnotLink already implements draw() + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ddf85d4a51f605eed998c633857b8bb5c74ab590 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 4 14:59:41 2009 +0100 + + Make the code a bit more resilient + + By checking the GooString we are going to use really exists + + poppler/PSOutputDev.cc | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +commit 78b4afa0a44048b8d40438d400652dbae4cb99b1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 4 14:57:10 2009 +0100 + + Accept Fontname if FontName is not present + + Fixes KDE bug 217013 + + poppler/GfxFont.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit fee5cb0eec2ddb8d596289e9a6285cf04d97632e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 4 13:26:42 2009 +0100 + + [annots] Remove redundant flags definition + + poppler/Annot.cc | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +commit 3a94e8ce90c0a4d11c5c5aa8805c167c8a0434e5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 27 15:23:11 2009 +0100 + + [cairo] Revert commit 77c2e154c2cb57300116ecd4295f1e67b06b411f + + And fix bug #24575 jut by checking pointer is not null before + using it. + + poppler/CairoOutputDev.cc | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +commit a093b768e64d477ebdd5f6b519d80a6c45706e7e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 22 20:23:49 2009 +0100 + + Add copyrights + + poppler/CairoFontEngine.cc | 2 +- + poppler/CairoOutputDev.cc | 4 ++-- + poppler/CairoOutputDev.h | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 77c2e154c2cb57300116ecd4295f1e67b06b411f +Author: David Benjamin <davidben@mit.edu> +Date: Sun Nov 22 20:19:29 2009 +0100 + + Do not crash on malformed files + + bug 24575 + + poppler/CairoOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 1d0cb9b2cfd4d4d9aa9b0ad83ad6408544263a09 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 22 19:59:34 2009 +0100 + + [cairo] Initialize fill_color and stroke_color + + poppler/CairoOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 32de2ac62fb87570e1a59152f37b86e571a01180 +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Sun Nov 22 19:51:54 2009 +0100 + + Improve the reconstruction of the XRef + + Makes load a file Ilya can't share + + poppler/XRef.cc | 165 + ++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 95 insertions(+), 70 deletions(-) + +commit 039c6dffbfbed46a11e207048a3247d6921d6b02 +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Sun Nov 22 15:14:20 2009 +0100 + + Correctly initialize fileName + + poppler/Link.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit b905caf1785ee207cc0480953da69be302d3d4e9 +Author: David Benjamin <davidben@mit.edu> +Date: Sat Nov 21 02:43:21 2009 +0100 + + Be more lenient with /Decode key on images + + The spec requires the field be [1 0] or [0 1]. Adobe accepts + floating point + values as well. This fixes bug #17439. + + poppler/Gfx.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit d99e7a88845a5f4b35e2c538c597316b2ad541ca +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 20 22:09:44 2009 +0100 + + Check for openjpeg in the C++ part as it uses bool in the header + + Bug 25103 + + configure.ac | 61 + +++++++++++++++++++++++++++++----------------------------- + 1 file changed, 30 insertions(+), 31 deletions(-) + +commit 55261a2dc86241c8d132e590e76e7398b3ca5090 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 18 22:26:01 2009 +0100 + + replace floor with a cast to int for numbers > 0 + + bug-poppler13487.pdf gets a 15% faster rendering + + splash/SplashMath.h | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +commit 28df9fb323f14dc632c9502655abf69984b7d67e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 18 21:57:02 2009 +0100 + + Remove unused label + + poppler/Catalog.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 037979a01a6fcafc61360e758dbc4a5eb056825e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Nov 17 19:12:30 2009 +0100 + + [cairo] If there's a soft mask available when filling, apply the + mask instead of filling + + Fixes bug #8474. + + poppler/CairoOutputDev.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 46380d36f004d71dd2c2e7bc82836af248684b51 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 17 20:48:22 2009 +0100 + + i didn't want to commit this + + configure.ac | 60 + ++++++++++++++++++++++++++------------------------- + splash/SplashMath.h | 5 ++--- + utils/pdftoppm.cc | 8 ------- + 3 files changed, 33 insertions(+), 40 deletions(-) + +commit 1844e0927ae89824f59b2b3378bf5e00a51a251c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 17 20:34:24 2009 +0100 + + do not use setAttribute with doubles + + it is evil and locale dependant, we do NOT want that so use + QString::number + + configure.ac | 60 +++++++++++++++--------------- + qt4/src/poppler-annotation.cc | 82 + ++++++++++++++++++++--------------------- + splash/SplashMath.h | 5 ++- + utils/pdftoppm.cc | 8 ++++ + 4 files changed, 81 insertions(+), 74 deletions(-) + +commit 572d79f4b8a7bf1717b88dbd2609d8fa9b036dee +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 15 20:40:56 2009 +0100 + + Only calculate the matrix when it is really needed + + That only happens when outputting to 1 bit images + Speeds out rendering on some pdf up to 40% + + splash/SplashScreen.cc | 35 +++++++++++++++++++++++++++++++++-- + splash/SplashScreen.h | 16 ++++++++++++++++ + 2 files changed, 49 insertions(+), 2 deletions(-) + +commit 1c3113361fa376093e6fedfbf48feee7dcbc46b7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 15 19:43:18 2009 +0100 + + Write out fixed-content portion of Type 1 fonts in PSOutputDev + + If /Length3 of a Type 1 FontFile is > 0 the fixed-content from the + FontFile should be used instead of adding the generic 512 zeros and + cleartomark. + + poppler/PSOutputDev.cc | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +commit 2d30dc605cd984f6c32124af9aa7b877d416d141 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 15 17:31:36 2009 +0100 + + [glib-demo] Show attachment name in FileAttachment annot properties + table + + glib/demo/annots.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 6c8ae140256818401351a331787c83e043fdba09 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 15 17:31:13 2009 +0100 + + [glib] Add poppler_annot_file_attachment_get_name() + + glib/poppler-annot.cc | 36 +++++++++++++++++++++++++++++------- + glib/poppler-annot.h | 1 + + 2 files changed, 30 insertions(+), 7 deletions(-) + +commit ecf5173eb288187a1f076fd4b116f1212fa9e203 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 15 17:14:29 2009 +0100 + + [glib-demo] Add properties of FileAttachment annotations + + glib/demo/annots.c | 67 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 67 insertions(+) + +commit 8f4fdd864d79e4fa83951a3eb006ea8287c3a1ba +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 15 17:12:43 2009 +0100 + + [glib-demo] Add pgd_table_add_property_with_custom_widget() + + To be able to add properties to a table that are not labels + + glib/demo/utils.c | 31 +++++++++++++++++++++---------- + glib/demo/utils.h | 30 +++++++++++++++++------------- + 2 files changed, 38 insertions(+), 23 deletions(-) + +commit 061b85f7a442107cda67e385bd772ec8565a936e +Author: Thomas Viehmann <tv@beamnet.de> +Date: Sun Nov 15 17:11:43 2009 +0100 + + [glib] Add support for file attachment annotations + + glib/poppler-annot.cc | 69 + +++++++++++++++++++++++++++++++++++++++++++++--- + glib/poppler-annot.h | 8 ++++++ + glib/poppler-page.cc | 3 +++ + glib/poppler-private.h | 1 + + glib/poppler.h | 49 +++++++++++++++++----------------- + 5 files changed, 102 insertions(+), 28 deletions(-) + +commit 189c45332991bce51e40bcaf65da67d2d644045a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 15 16:42:21 2009 +0100 + + [glib] Remove PopplerDocument from PopplerAttachment + + Since we are duplicating the stream we don't need to hold a + reference of + PopplerDocument anymore. + + glib/poppler-attachment.cc | 13 +------------ + glib/poppler-document.cc | 2 +- + glib/poppler-private.h | 3 +-- + 3 files changed, 3 insertions(+), 15 deletions(-) + +commit e55bfeb1ddc60053c5ee5fef840c409891781ce6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 13 00:55:37 2009 +0100 + + jpeg_start_decompress can fail, check it + + Fixes KDE bug #214317 + + poppler/DCTStream.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit c59d93061cf71d13916872a20aed37ecfbb3bfa4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Nov 9 18:32:55 2009 +0100 + + [cairo] Do nothing when image mask is 1x1 and the pixel is 0 + + poppler/CairoOutputDev.cc | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 448f03cfc429d33bfa5527e3dc964ef5da10ee94 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Nov 9 22:52:39 2009 +1030 + + Don't render the color white in type 3 glyphs in the cairo backend + + PDF allows the "g" operator in Type 3 charprocs but cairo user fonts + will render any stroke or fill in the font color. + + As the only PDFs I've seen with "g" in the charprocs are only using + the gray values 0 or 1, a workaround is to disable strokes and fills + of the charproc when the gray level is > 0.5. + + poppler/CairoOutputDev.cc | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 3fead2a3b53681ef95116f18f17f1a9febec6e48 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Nov 9 11:25:24 2009 +0100 + + Transitions dictionary can be a Ref too + + poppler/Page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac4955d03a532cab1933698aeb667d44300e52d0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Nov 9 11:12:48 2009 +0100 + + [glib-demo] Explicitely add gio as dependency for GTK+ tests + + configure.ac | 4 ++-- + glib/demo/main.c | 1 + + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 32ea667ec8f18311539123c7b80c7ab4767070cb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 19:17:52 2009 +0100 + + [cairo] Mark images dirty + + After directly manipulating the pixel values we need to mark the + surface + as dirty. This means that cairo will refresh any caches it may + have taken + of the surface will the new data. + + poppler/CairoOutputDev.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 10a41150c4067bb3ab85e25dae76e0968a6cd586 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 19:17:06 2009 +0100 + + [cairo] Use colToDbl() to avoid rounding error. + + poppler/CairoOutputDev.cc | 37 +++++++++++++++++++------------------ + 1 file changed, 19 insertions(+), 18 deletions(-) + +commit c9491319689f04edd57adda7ee85f84f17fd1c47 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 18:07:17 2009 +0100 + + [cairo] Reduce the number of redundant pattern creations + + poppler/CairoOutputDev.cc | 84 + +++++++++++++++++++++++++++------------------ + 1 file changed, 51 insertions(+), 33 deletions(-) + +commit ead78d9f703c8b2d556c94be3c47dbae7469eda8 +Author: Reece Dunn <msclrhd@gmail.com> +Date: Thu Nov 5 22:25:14 2009 +0100 + + fontpos is never set to -1, so remove the checks in HtmlOutputDev. + + utils/HtmlOutputDev.cc | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit 55dd6024a4672a1787e8b1a8276bd78fff94e2cd +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Wed Nov 4 22:07:18 2009 +0100 + + Do not error on files without "Count" and "Kids" + + It is not spec compliant not to have those fields but Adobe Reader and + FoxIt seems to allow it so try to behave like them. See bug 24720 + to see why one would want such file + + poppler/Catalog.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 58a1d42aed7352c008d201b8f355f6e4146f71e5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Oct 29 18:38:22 2009 +0100 + + [cairo] Don't render patterns when using CairoImageOutputDev + + poppler/CairoOutputDev.h | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit 7670cc48dcf3ffd77e3ffa29056a3e13b2926709 +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Wed Oct 28 19:20:41 2009 +0100 + + There are some pdf where Aspect values are reals, use getNum + + Fixes bug 24733 + + poppler/Annot.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 4fe89e520a04a6ab6d6ec6a8294896b2f427c7da +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 25 21:55:55 2009 +0100 + + do not accept negative interval lengths in the page labels tree + + See bug 24721 + + poppler/PageLabelInfo.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b174ebd6b323c7a58a19d59c1a9e4ac4e6cba7d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 23 21:57:42 2009 +0200 + + Move the iccColorSpaceCache from a static in GfxState to a member + of Gfx + + Fixes the problem that the keys are per document but we had a static + that lived as much as the library. Now the cache only lives the + rendering + of a page so it's a bit slower but at least it's correct. Fixes + bug 24686 + + poppler/Gfx.cc | 49 +++++++++++++++++---------- + poppler/Gfx.h | 13 +++++-- + poppler/GfxState.cc | 94 + +++++++++++++++++++++++++-------------------------- + poppler/GfxState.h | 33 +++++++++--------- + poppler/Page.cc | 4 +-- + 5 files changed, 107 insertions(+), 86 deletions(-) + +commit 4a9bdd30dc353865685e03eb1c1ac6093797695a +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 22 21:26:29 2009 +0200 + + initialize len at 0 when reading the font fails + + See bug 24525 for more info + + poppler/GfxFont.cc | 1 + + 1 file changed, 1 insertion(+) + +commit c839b706092583f6b12ed3cc634bf5af34b7a2bb +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Oct 20 10:09:13 2009 +0200 + + [glib] Fix CVE-2009-3607 + + glib/poppler-page.cc | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 44462e0ca39392e5629020226b901e4026089b46 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Oct 19 23:33:58 2009 +0200 + + fix memory leak + + poppler/PSOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit d701aaa9eaa62567210070129f5feffe24bf1936 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 18 01:22:16 2009 +0200 + + This include is needed as this file uses Ref + + poppler/OutputDev.h | 1 + + 1 file changed, 1 insertion(+) + +commit d4202536e1b62c326c301d5088fa0e176c523e85 +Author: Pino Toscano <pino@kde.org> +Date: Sat Oct 17 01:35:11 2009 +0200 + + SplashGlyphBitmap is a struct and not a class + + poppler/ArthurOutputDev.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 654176dee7c9325aa5a24a2de3c070faa16e8a9c +Author: Michael Jansen <kde@michael-jansen.biz> +Date: Sat Oct 17 01:30:40 2009 +0200 + + CMake: add the possibility to pass LIB_SUFFIX. + + This allows to tune the installation libdir by adding a suffix for it + (making it eg lib, lib32, or lib64) + + CMakeLists.txt | 16 +++++++++------- + glib/CMakeLists.txt | 2 +- + poppler-cairo.pc.cmake | 2 +- + poppler-glib.pc.cmake | 2 +- + poppler-qt.pc.cmake | 2 +- + poppler-qt4.pc.cmake | 2 +- + poppler-splash.pc.cmake | 2 +- + poppler.pc.cmake | 2 +- + qt/CMakeLists.txt | 2 +- + qt4/src/CMakeLists.txt | 2 +- + 10 files changed, 18 insertions(+), 16 deletions(-) + +commit 43829ae4b25a88ace06f05fa6750e5732539f4be +Author: Pino Toscano <pino@kde.org> +Date: Sat Oct 17 01:21:39 2009 +0200 + + put a space so MSVC won't try to see it as comment + + poppler/GfxState.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f64086ea22a4e8cb3d4e7116db2a9541ac2fb19f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 17 00:48:58 2009 +0200 + + check the document is not locked when printing + + qt4/src/poppler-ps-converter.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 85d1015480b7ab3f21cc5f78dc53d4c5efdc6e60 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 17 00:48:27 2009 +0200 + + fix file name comment + + qt4/src/poppler-ps-converter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 270764ad1bf2cfe95aed0b6850d2347361b4268d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 17 00:47:34 2009 +0200 + + Add a way for converters to return more exact errors they had when + converting + + qt4/src/poppler-base-converter.cc | 8 +++++++- + qt4/src/poppler-converter-private.h | 3 ++- + qt4/src/poppler-pdf-converter.cc | 11 ++++++++++- + qt4/src/poppler-ps-converter.cc | 6 +++++- + qt4/src/poppler-qt4.h | 14 ++++++++++++++ + 5 files changed, 38 insertions(+), 4 deletions(-) + +commit 1082e1671afd8ab91583dabc876304008acb021c +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 16 23:17:22 2009 +0200 + + Some "security" fixes based on newly released Xpdf 3.02pl4 + + poppler/Stream.cc | 4 ++++ + poppler/XRef.cc | 19 +++++++++++++++---- + splash/Splash.cc | 7 +++++++ + splash/SplashBitmap.cc | 37 ++++++++++++++++++++++++++++++------- + splash/SplashErrorCodes.h | 4 +++- + 5 files changed, 59 insertions(+), 12 deletions(-) + +commit c2458275e02f56226779b82d73c13defcbbda563 +Author: Glenn Ganz <glenn.ganz@uptime.ch> +Date: Fri Oct 16 20:54:32 2009 +0200 + + fix constructor of DCTStream + + poppler/Stream.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fd91b79c053bb5cd01a766032b90981dbc5e5dd3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 10 14:53:42 2009 +0200 + + fix compiling with automake + + goo/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c3031b4318af6f85256f2478c8678dedd0d6acd1 +Author: Pino Toscano <pino@kde.org> +Date: Fri Oct 9 16:17:16 2009 +0200 + + cmake: simplify the linking to libpng + + CMakeLists.txt | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 96688dd7a091f8fa141fad2b3d05bae04b0b86fb +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Fri Oct 9 16:09:46 2009 +0200 + + MSVC: add _CRT_SECURE_NO_WARNINGS to the define's + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit f346c1f6b55f87ebd6bb0b0932462d5514aa40ff +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 9 00:29:06 2009 +0200 + + add -ansi flag to default warnings + + cmake/modules/PopplerMacros.cmake | 2 +- + configure.ac | 2 +- + utils/parseargs.c | 30 +++++++++++++++--------------- + utils/parseargs.h | 26 +++++++++++++------------- + 4 files changed, 30 insertions(+), 30 deletions(-) + +commit 53e0016b772f1b78d998506e2f3106011d32cef3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 9 00:15:52 2009 +0200 + + Add virtual destructor to ImgWriter + + CMakeLists.txt | 1 + + goo/ImgWriter.cc | 15 +++++++++++++++ + goo/ImgWriter.h | 2 ++ + goo/Makefile.am | 1 + + 4 files changed, 19 insertions(+) + +commit 699dcacced7be05b788c414c231dc2b5c07de06e +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 9 00:13:11 2009 +0200 + + Add -Wnon-virtual-dtor flag + + cmake/modules/PopplerMacros.cmake | 4 ++-- + configure.ac | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit d1e4fca4a8602994b010fae4f4fea5cd4df9276e +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 9 00:10:03 2009 +0200 + + build on cmake too + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit d67511c92022121066f43003f01b955962ddcd33 +Author: Stefan Thomas <thomas@eload24.com> +Date: Fri Oct 9 00:09:23 2009 +0200 + + Add -jpeg to pdftoppm + + goo/ImgWriter.h | 28 +++++++++++++++ + goo/JpegWriter.cc | 92 + ++++++++++++++++++++++++++++++++++++++++++++++++ + goo/JpegWriter.h | 42 ++++++++++++++++++++++ + goo/Makefile.am | 2 ++ + goo/PNGWriter.cc | 5 +-- + goo/PNGWriter.h | 10 +++--- + splash/SplashBitmap.cc | 46 ++++++++++++++++-------- + splash/SplashBitmap.h | 5 +-- + splash/SplashTypes.h | 11 ++++++ + utils/pdftoppm.1 | 3 ++ + utils/pdftoppm.cc | 22 +++++++++--- + 11 files changed, 239 insertions(+), 27 deletions(-) + +commit 388196df1fb05fb2d88ae82bd81e823a23588ec1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Oct 7 17:11:58 2009 +0200 + + [glib-demo] Show some of the annot flags in annots treeview + + glib/demo/annots.c | 35 +++++++++++++++++++++++++++++++++-- + 1 file changed, 33 insertions(+), 2 deletions(-) + +commit 034907c6582c1f50782ec9c58a29b140c6fc0688 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 6 00:52:10 2009 +0200 + + Forgot to update the year here + + qt4/src/poppler-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fef89acebf5312324c104fb52e629563fbc2de76 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 6 00:42:52 2009 +0200 + + Add the possibility of enabling hinting + + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-private.h | 1 + + qt4/src/poppler-qt4.h | 3 ++- + 3 files changed, 4 insertions(+), 2 deletions(-) + +commit 485252844b5e0964ee724b74e2a7ba2b820b259e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 6 00:41:57 2009 +0200 + + rework how hinting is used in the splash backend + + Basically we default to no hinting now with the possibility to + enable it + + poppler/ArthurOutputDev.cc | 2 +- + poppler/GlobalParams.cc | 19 ------------- + poppler/GlobalParams.h | 3 -- + poppler/SplashOutputDev.cc | 8 +++++- + poppler/SplashOutputDev.h | 3 ++ + splash/SplashFTFont.cc | 64 + +++++++++--------------------------------- + splash/SplashFTFont.h | 4 +-- + splash/SplashFTFontEngine.cc | 8 +++--- + splash/SplashFTFontEngine.h | 7 +++-- + splash/SplashFontEngine.cc | 5 ++-- + splash/SplashFontEngine.h | 3 +- + 11 files changed, 40 insertions(+), 86 deletions(-) + +commit 8194c156cf2167834779e1690a89b5068baf8d58 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Oct 5 00:55:55 2009 +0200 + + Fix includes for those using internal headers + + goo/FixedPoint.h | 2 +- + goo/gmem.h | 2 +- + poppler/OutputDev.h | 2 +- + poppler/PSOutputDev.h | 2 +- + poppler/PageLabelInfo.h | 2 +- + utils/ImageOutputDev.h | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +commit 091f68ccd59413d6890dfbfcf8911f112e690b50 +Author: Kovid Goyal <kovid@kovidgoyal.net> +Date: Mon Oct 5 00:39:36 2009 +0200 + + Use _WIN32 instead of WIN32 + + More info at http://bugs.freedesktop.org/show_bug.cgi?id=24259 + + goo/GooMutex.h | 16 +++++++++++++++- + goo/gfile.cc | 33 +++++++++++++++++---------------- + goo/gfile.h | 5 +++-- + msvc/poppler/poppler-config.h | 2 +- + poppler-config.h.cmake | 2 +- + poppler/ABWOutputDev.h | 3 ++- + poppler/FileSpec.cc | 7 ++++--- + poppler/GlobalParams.cc | 37 + +++++++++++++++++++------------------ + poppler/GlobalParams.h | 4 ++-- + poppler/Link.cc | 3 ++- + poppler/PDFDoc.cc | 4 ++-- + poppler/PDFDoc.h | 3 ++- + poppler/PSOutputDev.cc | 5 +++-- + poppler/TextOutputDev.cc | 5 +++-- + poppler/XpdfPluginAPI.cc | 13 ++++++++++++- + poppler/poppler-config.h.in | 2 +- + splash/SplashFontEngine.cc | 9 +++++---- + test/perf-test.cc | 24 ++++++++++++------------ + utils/HtmlOutputDev.h | 3 ++- + 19 files changed, 108 insertions(+), 72 deletions(-) + +commit 7fd8bdfa450db4e323e4e5d12159359fbc47f9ed +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Oct 5 00:21:15 2009 +0200 + + Remove spurious ; + + Found by -Wextra i think we should add more warnings to our default + flags + + qt4/src/poppler-annotation.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d46f7343e446331489d3fe6711a7cf778e0bd902 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 2 22:04:46 2009 +0200 + + Strings can have 0 inside so use the length + + Fixes saving some files + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2bc2040081919340415f576ce8266356deadbfcd +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 2 22:04:03 2009 +0200 + + Increase decimals from 5 to 10, a double has that precision + + Makes saving more faithful for some files + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 05eb7342d5234732f27c9c67b7fc1f9e40a4e075 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 2 22:03:40 2009 +0200 + + If the stream was wrongly formed save the correct length + + Fixes saving of some files + + poppler/PDFDoc.cc | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit b98faa4c162392d9416a5a93c9042b41f82d8657 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 2 22:02:13 2009 +0200 + + Return the save status as program status + + test/pdf-fullrewrite.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit f73f59f2c7bb7c7d57eb70cdc1bc30b80a92d0b7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 2 22:01:45 2009 +0200 + + If the Length entry of the stream is wrong, fix it + + Fixes saving some files + + poppler/Parser.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 91135c7e788bc32e414e1a9c9ab43b326a07e970 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 2 22:00:12 2009 +0200 + + increase the range of characters we sanitize + + Fixes saving of some files + + goo/GooString.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9dcb3e8be2cd52a795605548e43d6bfc149b2ea5 +Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net> +Date: Sun Sep 27 17:17:32 2009 +0200 + + Fix the linking not to use the .so directly but the lib + + Fixes check on cygwin + + m4/qt.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ed4a6f1cfc7ccd2717d939841c092347c3307547 +Author: Kovid Goyal <kovid@kovidgoyal.net> +Date: Sat Sep 26 19:26:19 2009 +0200 + + Do not crash when saving files that come from a stream without name + + Bug 24090 + + poppler/PDFDoc.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 04b232d48930af9bc614d7fef47f79ce247713a4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 26 18:30:41 2009 +0200 + + Write the Info into the trailer dict if there is one + + Bug 24091 + + poppler/PDFDoc.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 343e4f9aceb935eb393ad94bbef4dbb1b1a450ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 26 18:28:40 2009 +0200 + + Plug leak + + test/pdf-fullrewrite.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 2ea0032283c4717f1bb285fab7956fc38f375e87 +Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net> +Date: Sat Sep 26 15:01:35 2009 +0200 + + Patch to make poppler work on Cygwin + + Bug 4195 + + configure.ac | 3 +++ + qt/Makefile.am | 2 +- + qt4/src/Makefile.am | 2 +- + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit 074dc5e5e39cebc1fbe9bf6a15b2cae2391006c1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 26 14:56:38 2009 +0200 + + Improve realibility for Streams with broken Length + + Fixes bug 6841 + + poppler/Parser.cc | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +commit b7702820245fb6cdbf77afba37c53c03d4362a25 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 21 21:58:26 2009 +0200 + + Print with a . and not with a , in all locales + + This is a regression after the removal of setting LC_NUMERIC + + poppler/PDFDoc.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit d31080d8195694cef740d4e77484179bb38d1f26 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 20 17:21:13 2009 +0200 + + CharCodeToUnicode is not mandatory in fonts, don't crash one fonts + that do not have it + + Fixes bug #24036 + + poppler/Annot.cc | 33 ++++++++++++++++++++------------- + 1 file changed, 20 insertions(+), 13 deletions(-) + +commit a729d005a7204791fa8415de5aa0834136073ce8 +Author: Pino Toscano <pino@kde.org> +Date: Thu Sep 17 20:12:20 2009 +0200 + + Windows32/MSVC: initialize the font list once per GlobalParams, + instead of once at all + + this fixes the font list being empty at the second (and following) + GlobalParams creation + thanks for Christian Ehrlicher for reporting the bug and testing + its fix + + poppler/GlobalParams.cc | 1 + + poppler/GlobalParams.h | 1 + + poppler/GlobalParamsWin.cc | 1 - + 3 files changed, 2 insertions(+), 1 deletion(-) + +commit 68711d8494e2765c4a24ea59ce8d904981f0f917 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 9 23:24:22 2009 +0200 + + uint -> Guint + + some compilers don't know about uint + + poppler/Gfx.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 943a13c9354dec18cb023642aebbe5d3bb920ed7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 9 20:04:06 2009 +0200 + + poppler 0.12.0 + + CMakeLists.txt | 4 ++-- + NEWS | 18 ++++++++++++++++++ + configure.ac | 4 ++-- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 26 insertions(+), 8 deletions(-) + +commit e8ed7210346cb18f6e4588ad557f993c6d42f4a3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 9 19:21:21 2009 +0200 + + increase library to 3.2.0 + + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit e950107006a3b1889646d3705323c1b3d41eaa49 +Author: David Benjamin <davidben@mit.edu> +Date: Wed Sep 9 01:19:38 2009 +0200 + + Fix infinite loop in JBIG2Decoder + + Bug 23025 + Also fixes problems in bug-poppler6881-2.pdf and bug-poppler6500.pdf + + poppler/JBIG2Stream.cc | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 1cb25a4adaaf3e2da50724312a3db6928991f425 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 6 10:45:56 2009 +0200 + + [glib] Ignore attachments with an invalid embedded file + + Fixes bug #10386 + + glib/poppler-document.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 842e00f3114666609ef4dec6fa613d46f330a40c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 5 15:20:35 2009 +0200 + + Add EmbeddedFile::isValid + + Also do not crash if data() is called on an invalid file + + qt4/src/poppler-embeddedfile.cc | 10 +++++++++- + qt4/src/poppler-qt4.h | 9 ++++++++- + 2 files changed, 17 insertions(+), 2 deletions(-) + +commit 9d40b268f5a9a9a0fb79da0e1627dd8eebc4db6a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 5 15:19:27 2009 +0200 + + Add EmbFile::isOk + + At the moment returns false if the object stream is not really + a stream + + poppler/Catalog.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 642650b6f70425c8fff2df978ae71249a5ae07f3 +Author: David Benjamin <davidben@mit.edu> +Date: Sat Sep 5 01:12:49 2009 +0200 + + Better fallback when there's a type mismatch + + Bug #17252 + + poppler/GfxFont.cc | 38 ++++++++++++++++++++++++++++++++------ + 1 file changed, 32 insertions(+), 6 deletions(-) + +commit bf5811f5331292ccf30f1b0f089fe43d351d96be +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 26 00:43:46 2009 +0200 + + Improve shading color rendering + + Shading is not necessarily lineal so require another bisection to + assume all the area in between have the same color. Fixes bug #20238 + + poppler/Gfx.cc | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit e94430b790fde6ce7b7cb163c2e0adf2d071c81d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 26 00:42:49 2009 +0200 + + Make code a bit more readable + + poppler/Gfx.cc | 23 +++++++++++------------ + 1 file changed, 11 insertions(+), 12 deletions(-) + +commit 465212780557705fd939dfe54f96913505bfc96e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 25 21:55:45 2009 +0200 + + forgot to update my copyright + + poppler/JPEG2000Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4f6016d01ced32002bef22b9b5d5426a74e55842 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 25 21:10:07 2009 +0200 + + Fix format security warnings + + Don't just directly print strings of unknown content; use "%s". + + poppler/JPEG2000Stream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4616b23382b5d155f8b2f1942733037cf5730844 +Author: Christian Persch <chpe@gnome.org> +Date: Tue Aug 25 21:09:40 2009 +0200 + + Fix format security warnings + + Don't just directly print strings of unknown content; use "%s". + + poppler/GfxState.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6c5c8d008456d1e4f3d60bc182209747c2a175dc +Author: Christian Persch <chpe@gnome.org> +Date: Tue Aug 25 21:03:16 2009 +0200 + + Support AM_SILENT_RULES + + When using automake 1.11, should support silent build rules. + + Makefile.am | 2 +- + configure.ac | 1 + + glib/Makefile.am | 4 ++-- + qt4/demos/Makefile.am | 2 +- + qt4/src/Makefile.am | 2 +- + qt4/tests/Makefile.am | 2 +- + 6 files changed, 7 insertions(+), 6 deletions(-) + +commit e7dd1c47b01d8f31599ee686eafbe7c54d7c023a +Author: Christian Persch <chpe@gnome.org> +Date: Tue Aug 25 21:01:13 2009 +0200 + + Fix automake check, and add automake 1.11 support + + Fix the automake checks to take the *newest* version available, + not the + oldest one. Add support for automake 1.11. FDO#23473. + + autogen.sh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 493d2c5aa78a3241e70108c5d7eccba9ac72f834 +Author: Rex Dieter <rdieter@math.unl.edu> +Date: Mon Aug 24 20:08:46 2009 +0200 + + Use Requires.private if available + + The following patch minimizes pkg-config deps similar to how the + glib-related pkg-config deps are done. + + poppler-qt.pc.cmake | 3 ++- + poppler-qt.pc.in | 3 ++- + poppler-qt4.pc.cmake | 3 ++- + poppler-qt4.pc.in | 3 ++- + 4 files changed, 8 insertions(+), 4 deletions(-) + +commit 341cd3ecd08a39cd146c1c57f356b50a2881c03f +Author: Jakub Wilk <ubanus@users.sf.net> +Date: Mon Aug 24 19:51:34 2009 +0200 + + common options for pdftoabw + + The attached patch fixes command line handling for pdftoabw and + implements some + common options (e.g., --help) that are already found in other + pdftosomething + utilities. + + utils/pdftoabw.cc | 39 ++++++++++++++++++++++++++++++++------- + 1 file changed, 32 insertions(+), 7 deletions(-) + +commit 365683d5faea6e0a7570b139d1f3366c22271f8e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 18 21:18:13 2009 +0200 + + 0.11.3 + + CMakeLists.txt | 2 +- + NEWS | 22 ++++++++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 28 insertions(+), 6 deletions(-) + +commit cb28bc8a637d300664b3c7569263445275333878 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Aug 17 14:14:03 2009 +0200 + + [glib] Add FORMAT_MAJOR/MINOR properties to get the PDF version + + See bug #23076. + + glib/poppler-document.cc | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +commit 1b5612841b0c663f6d391d4581f65f68a2975db0 +Author: Pino Toscano <pino@kde.org> +Date: Mon Aug 17 01:04:04 2009 +0200 + + [Qt] add Document::getPdfVersion(int *major, int *minor) for the + document PDF version numbers + + This new function reads the version of the PDF specification of the + document, putting major and minor numbers in own variables. + + qt/poppler-document.cc | 8 ++++++++ + qt/poppler-qt.h | 12 ++++++++++++ + 2 files changed, 20 insertions(+) + +commit aef8ecda1e80b921228f415a53c9c5a52df87d94 +Author: Pino Toscano <pino@kde.org> +Date: Mon Aug 17 00:57:08 2009 +0200 + + [Qt4] deprecate Document::pdfVersion() + + ... in favour of getPdfVersion() + + qt4/src/poppler-qt4.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 830140f70e48e8033ad4411b6bd405d5ad7358a3 +Author: Pino Toscano <pino@kde.org> +Date: Mon Aug 17 00:51:13 2009 +0200 + + [Qt4] add Document::getPdfVersion(int *major, int *minor) for the + document PDF version numbers + + This new function reads the version of the PDF specification of the + document, putting major and minor numbers in own variables. + Add them to the relative unit test. + + qt4/src/poppler-document.cc | 8 ++++++++ + qt4/src/poppler-qt4.h | 13 +++++++++++++ + qt4/tests/check_metadata.cpp | 4 ++++ + 3 files changed, 25 insertions(+) + +commit 5491d16dfbd73f0256c62e49d02622dc3185012e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 17 00:24:41 2009 +0200 + + Move poppler core away from using a double as PDF file version + + Frontends are yet to come + + glib/poppler-document.cc | 2 +- + poppler/PDFDoc.cc | 7 ++++--- + poppler/PDFDoc.h | 8 +++++--- + qt/poppler-document.cc | 4 ++-- + qt4/src/poppler-document.cc | 4 ++-- + utils/pdfinfo.cc | 4 ++-- + 6 files changed, 16 insertions(+), 13 deletions(-) + +commit efd5dd63a5b08249529d9a9f5906aefe806fb3aa +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 17 00:21:22 2009 +0200 + + Forgot to update copyright info + + fofi/FoFiType1C.cc | 14 ++++++++++++++ + poppler/PDFDoc.cc | 2 +- + utils/parseargs.c | 2 +- + 3 files changed, 16 insertions(+), 2 deletions(-) + +commit 25ff4be0b4521cc3d2de386cdeb589beb245d435 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 17 00:15:10 2009 +0200 + + No need to change the locale since we use gatof that does the + right thing + + poppler/PDFDoc.cc | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit a6f698b4edc42c0414dd4690e1e037088321db2c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 17 00:14:35 2009 +0200 + + Use gatof instead of atof + + fofi/FoFiType1C.cc | 3 ++- + poppler/Annot.cc | 5 +++-- + poppler/Function.cc | 3 ++- + poppler/PDFDoc.cc | 3 ++- + utils/parseargs.c | 4 +++- + 5 files changed, 12 insertions(+), 6 deletions(-) + +commit 807b121cae45832d2e5832bad19c31e77420bfec +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 17 00:10:30 2009 +0200 + + Add a custom strtod that comes from libspectre + + Works over C locale integers without changing locale settings + + CMakeLists.txt | 2 + + goo/Makefile.am | 6 ++- + goo/gstrtod.cc | 147 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + goo/gstrtod.h | 43 ++++++++++++++++ + 4 files changed, 196 insertions(+), 2 deletions(-) + +commit 914bf7677a14494b69857b1d8070092a9999fe79 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 16 20:50:02 2009 +0200 + + When writing the cm matrix write 4 significant digits not 4 decimals + + This fixes bug 23332 + Maybe we want to make this the default behaviour of 'g' instead of + a new 'gs' case, but i prefer to be on the safe side for the moment + + goo/GooString.cc | 27 +++++++++++++++++++++++++-- + goo/GooString.h | 4 +++- + poppler/PSOutputDev.cc | 4 ++-- + 3 files changed, 30 insertions(+), 5 deletions(-) + +commit b7dfca1aa52b825eb3b8f1cc0470398c31615b30 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Aug 16 19:28:37 2009 +0200 + + [cairo] CairoImageOutputDev doesn't implement patterns + + poppler/CairoOutputDev.h | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit d20d65111aee2ee4b8cdea2962ed1bb149122ba9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Aug 16 17:36:14 2009 +0200 + + [cairo] Implement tiling patterns in cairo backend + + Fixes bug #13518 for the cairo backend. + + poppler/CairoOutputDev.cc | 56 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 10 ++++++++ + 2 files changed, 66 insertions(+) + +commit e965d0686d979c775b64a93f8e2f775f81885417 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 13 14:48:10 2009 +0200 + + Change OutputDev::tilingPatternFill to return a GBool + + It allows outputdevs to decide whether render the pattern or not + depending + on the parameters, like shaded patterns currently do. + + poppler/Gfx.cc | 37 +++++++++++++++++++------------------ + poppler/OutputDev.h | 11 ++++++----- + poppler/PSOutputDev.cc | 12 +++++++----- + poppler/PSOutputDev.h | 10 +++++----- + 4 files changed, 37 insertions(+), 33 deletions(-) + +commit ce70ef7d6afc800e24031dae43da301e9e542f0e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 15 17:45:57 2009 +0200 + + Fix backwards search + + qt4/src/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5b7b1cdc5c3b8652d3ae583b4d7b8b6de625adc2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 15 17:45:05 2009 +0200 + + Add an autotest showing previousresult fails + + qt4/tests/check_search.cpp | 51 + ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 51 insertions(+) + +commit 2484b0dcb8eb62f8e2c147498c58871ec04630b5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 14 11:47:11 2009 +0200 + + Implement the alpha path + + I wonder if this is the correct fix why it was not implemented + but if fixes rendering of files in KDE bug 145868, KDE bug 193657, + poppler bug 17473.pdf, poppler bug 21651, poppler bug 22143 and + poppler bug 22152 and causes no regression in all the other files + i have in my test dir so i'm commiting it + + poppler/SplashOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 03970d8b6d7624444664320470baa6d1b1299622 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Aug 11 12:01:07 2009 +0200 + + [build] Fix build with autotools + + utils/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 15752b7cd5c94620e3ad3b6afd9c70ccc754c9b3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Aug 10 20:02:13 2009 +0200 + + [cairo] Add empty updateBlendMode to CairoImageOutputDev + + Fixes a crash when using CairoImageOutputDev with a document with + blend + modes. + + poppler/CairoOutputDev.h | 1 + + 1 file changed, 1 insertion(+) + +commit 45dae4e66b2b833f95656850b5f1b0ffd1d96f1d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Aug 10 20:00:04 2009 +0200 + + [cairo] Use current fill_opacity when drawing images + + Fixes launchpad bug #342282 (page 2 of the attached document) + + poppler/CairoOutputDev.cc | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit b1cd54546844f2f7cd6bf7cc14b7584c84c3fc14 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Aug 10 19:55:44 2009 +0200 + + [cairo] Do not save the font file twice for FreeType fonts + + Fixes bug #20491. + + poppler/CairoFontEngine.cc | 19 ++----------------- + 1 file changed, 2 insertions(+), 17 deletions(-) + +commit 4181a0ff11195eb7a56d76be23994b843e20b483 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 10 19:58:09 2009 +0200 + + this branch is unlikely to happen + + poppler/Lexer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2a3025f32951ce7b7343aeef111902615d71595e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 10 19:55:40 2009 +0200 + + fix overflow calculation not to depend on the variable overflowing + + poppler/Lexer.cc | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit a38001f724f78231c2fdadd28e647a35b41bab74 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 9 23:26:02 2009 +0200 + + Check for overflow when parsing integers + + Fixes bug 23078 + + poppler/Lexer.cc | 28 ++++++++++++++++++++++------ + 1 file changed, 22 insertions(+), 6 deletions(-) + +commit 4c4c0e44452d07bea88d98b7df0c01fadd7693cc +Author: Jakub Wilk <ubanus@users.sf.net> +Date: Sat Aug 8 17:26:14 2009 +0200 + + Silence some warnings when using internal headers and not compiling + with -Wno-write-strings + + People should not be using internal headers but it's just two lines + + poppler/Object.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit e2c319ba18ab473fd969db9519a9231be67538c3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 8 00:48:18 2009 +0200 + + Also implement mono so that -mono in pdftoppm -png works + + Totally not optimized + + splash/SplashBitmap.cc | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +commit c669e7f3ca421265e78161cc3fdecd2a0c7510c9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 8 00:38:50 2009 +0200 + + Support splashModeMono8 in writePNGFile + + Works though is non optimal + + splash/SplashBitmap.cc | 55 + ++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 39 insertions(+), 16 deletions(-) + +commit 92744b72df9084fd2d69ba78406898378884aed8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 8 00:20:52 2009 +0200 + + Add the -png flag to pdftoppm to output to PNG + + Based on a patch by Shen Liang <shenzhuxi@gmail.com> + Also factored common PNG code from HtmlOutputDev to PNGWriter + + CMakeLists.txt | 5 +++ + goo/Makefile.am | 9 +++- + goo/PNGWriter.cc | 110 + +++++++++++++++++++++++++++++++++++++++++++++ + goo/PNGWriter.h | 43 ++++++++++++++++++ + poppler/Makefile.am | 8 ++++ + splash/SplashBitmap.cc | 70 +++++++++++++++++++++++++++++ + splash/SplashBitmap.h | 5 +++ + splash/SplashErrorCodes.h | 4 +- + utils/CMakeLists.txt | 4 -- + utils/HtmlOutputDev.cc | 66 +++++---------------------- + utils/Makefile.am | 4 -- + utils/pdftoppm.1 | 3 ++ + utils/pdftoppm.cc | 21 +++++++-- + 13 files changed, 283 insertions(+), 69 deletions(-) + +commit e4439ff527bb202d0239f78e647452983b733411 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Aug 7 15:23:57 2009 +0200 + + [cairo] Don't apply masks when fill color space mode is csPattern + + In that case the mask is used for clipping when drawing images. Fixes + bug #22216. + + poppler/CairoOutputDev.cc | 59 + +++++++++++++++++++++++++++++---------------- + 1 file changed, 38 insertions(+), 21 deletions(-) + +commit 7194f59a18e4f6997ae560af3db1bd101d6f726e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 11:24:22 2009 +0100 + + [cairo] Use FT_New_Memory_Face() for mmapped fonts + + If we hold a mapping for the font, then we can pass that memory to + FreeType for it to use as well. This saves on FreeType having to + read the + file into a fresh block of memory. + + poppler/CairoFontEngine.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 7e2bbcf6f85111d1006b0d5bc1503cadaba83c9f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 4 00:10:58 2009 +0200 + + Set KDAB via gamaral copyright + + poppler/Form.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ed5918e16dafebc9ecf6db8ce0186f407ecbf7d5 +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 1 20:00:22 2009 +0200 + + [Qt4 apidox] make example for FontIterator... not leak ;) + + qt4/src/poppler-qt4.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit f3b36d9c992491e614e88dbf1a84b5433a7647f4 +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 1 19:54:52 2009 +0200 + + [Qt4] Add color management API. + + Add few wrapper functions to get/set color profiles. + Add a function to know whether the color management functions actually + do anything (ie support compiled or not). + Add few basic API docs for the new functions. + Based on an initial patch by Hal V. Engel <hvengel@astound.net>, + heavily reindented, polished and massaged in its API by me. + + qt4/src/poppler-document.cc | 52 + +++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 50 + +++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 102 insertions(+) + +commit 78a1969d040018c0c2bb74c94f5507f786e4666e +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 1 18:00:06 2009 +0200 + + [Qt] add unhandled cases and remove unused code + + qt/poppler-page.cc | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +commit bddebec0712e92e13b57d3d05d652673fe737866 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 1 17:12:22 2009 +0200 + + 0.11.2 + + CMakeLists.txt | 2 +- + NEWS | 30 ++++++++++++++++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 36 insertions(+), 6 deletions(-) + +commit 87e2af3454348f5568d155c15af5d85268e47f1b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Aug 1 15:48:02 2009 +0200 + + [glib-demo] Add cast to make sure the comparison is always valid + + glib/demo/attachments.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 464e95ef451103daddc9a30cd26b986291f02176 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Aug 1 15:47:25 2009 +0200 + + [glib-demo] Add missing return + + glib/demo/attachments.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7f48369e4d29b2a71abffa9e1966e3a2252de895 +Author: Guillermo Antonio Amaral Bastidas <gamaral@amaral.com.mx> +Date: Sat Aug 1 15:41:34 2009 +0200 + + Call fillChildrenSiblingsID in fillChildrenSiblingsID instaed of + loadChildrenDefaults + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e21a3e40bf6f4365064cea751ae186580d8f81f5 +Author: William Bader <williambader@hotmail.com> +Date: Sat Aug 1 15:23:03 2009 +0200 + + Add the possibility of disabling font substitution in pdftops + + Bug #23030 + + poppler/GlobalParams.cc | 17 ++++++++++++++ + poppler/GlobalParams.h | 4 ++++ + poppler/PSOutputDev.cc | 59 + ++++++++++++++++++++++++++--------------------- + poppler/PSOutputDev.h | 2 ++ + utils/pdftops.1 | 8 ++++++- + utils/pdftops.cc | 7 ++++++ + 6 files changed, 70 insertions(+), 27 deletions(-) + +commit bd68c90338cbf16f468e5db59722610300a629e1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 1 15:19:48 2009 +0200 + + Forgot to add my copyright + + poppler/GfxState.h | 1 + + 1 file changed, 1 insertion(+) + +commit 173451730948c320f16a0f5924a58302603eca0b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 1 15:13:35 2009 +0200 + + Try to workaround some incorrect PDF + + Fixes rendering of PDF where forms/patterns have more q than Q. Fixes + rendering in splash of pdf in bugs #22835, #21899 and #16402 + + poppler/Gfx.cc | 13 +++++++++++++ + poppler/GfxState.h | 1 + + 2 files changed, 14 insertions(+) + +commit 35c408ca49be08144bcf14aa112505fd556725d2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 31 23:27:02 2009 +0200 + + add the overloaded virtual warning also the autotools based build + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1c32bd2d101e5dfb37e28276ecad699f121b27b7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 31 23:22:25 2009 +0200 + + Add my copyright to files i just edited + + poppler/OutputDev.cc | 1 + + poppler/OutputDev.h | 1 + + utils/HtmlOutputDev.h | 2 +- + 3 files changed, 3 insertions(+), 1 deletion(-) + +commit 10717a48c85f1dbeff1c6bcd094006a9ecc92efc +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 31 23:22:10 2009 +0200 + + Add -Woverloaded-virtual as default CXX flag + + cmake/modules/PopplerMacros.cmake | 1 + + 1 file changed, 1 insertion(+) + +commit db5f736655f01575ac5d7c524cbf131924ae91fa +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 31 23:12:00 2009 +0200 + + rename the function + + That way the name is different from the OutputDev function and does + not seem like a wrong overload + + utils/HtmlOutputDev.cc | 4 ++-- + utils/HtmlOutputDev.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 4be87f87509b93c4fe4025f9bd788e9412416663 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 31 23:11:32 2009 +0200 + + Remove Outputdev::beginMarkedContent as noone uses it + + poppler/Gfx.cc | 2 -- + poppler/OutputDev.cc | 3 --- + poppler/OutputDev.h | 1 - + 3 files changed, 6 deletions(-) + +commit 6ab2ec8a89519d2bd1576c8d62f8aec51b04479a +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 31 23:10:56 2009 +0200 + + Warning-- + + poppler/PSOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53c3d636ad645a350b576160e1498726238a7bd1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 31 18:23:57 2009 +0200 + + [cairo] Implement radialShadedFill in cairo backend using cairo + gradients + + Fixes bugs #10942, #14160 + + poppler/CairoOutputDev.cc | 28 +++++++++ + poppler/CairoOutputDev.h | 2 + + poppler/Gfx.cc | 141 + +++++++++++++++++++++++++++------------------ + poppler/OutputDev.h | 2 +- + poppler/PSOutputDev.cc | 3 +- + poppler/PSOutputDev.h | 2 +- + 6 files changed, 117 insertions(+), 61 deletions(-) + +commit 2ba937545d1a2b9fa798f04fee755ccdf0e74ec7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 31 17:49:18 2009 +0200 + + [cairo] Use cairo_pattern_set_extend for linear gradients + + poppler/CairoOutputDev.cc | 9 +++++++++ + poppler/CairoOutputDev.h | 1 + + poppler/Gfx.cc | 34 ++++++++++++++++++++++++++++------ + poppler/OutputDev.h | 4 ++++ + 4 files changed, 42 insertions(+), 6 deletions(-) + +commit b054756113f0df6b59935823882f412486e96db5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jun 17 11:10:15 2009 +0200 + + [cairo] Implement blend mdoes in cairo backend + + It requires cairo from git master to work at the moment. Fixes bugs + #22384, #12979, #13603, #17919, #22255 + + configure.ac | 27 +++++++++++++++++++++ + poppler/CairoOutputDev.cc | 59 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 1 + + 3 files changed, 87 insertions(+) + +commit bf8964726c9311e7e82b1faf49cc2272e5c1e339 +Author: William Bader <williambader@hotmail.com> +Date: Thu Jul 30 22:08:43 2009 +0200 + + Fix some double to int warnings by explicit casting + + poppler/Gfx.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit fdbd0c548e963461b2bc4bdf1beaa1577cafcea7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 30 21:05:18 2009 +0200 + + Update gtk-doc build files + + gtk-doc.make | 102 + ++++++++++++++++++++++++++++++++++++++------------------- + m4/gtk-doc.m4 | 74 ++++++++++++++++++++++------------------- + 2 files changed, 110 insertions(+), 66 deletions(-) + +commit ae84dce5cea4d249526a6ed5b2feb2d3f241da1b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 30 20:45:39 2009 +0200 + + Revert "Remove unneeded files from repo" + + This reverts commit 4cc9dee35e03d7b295a476f937ec0f2c43bb6592. + + See bug #22697. + + configure.ac | 2 +- + glib/reference/Makefile.am | 4 +- + gtk-doc.make | 155 + ++++++++++++++++++++++++++++++++++++++++++++ + m4/gtk-doc.m4 | 53 +++++++++++++++ + 4 files changed, 211 insertions(+), 3 deletions(-) + +commit 7e14516a78b16453c747eb92b08665632e5f6844 +Author: Sanjoy Mahajan <sanjoy@mit.edu> +Date: Mon Jul 27 23:20:50 2009 +0200 + + Fix displayPages call + + Parameters are outputdev, first, last, dpi, dpi, rotate, usemediabox, + crop, printing + and we were doing + usemediabox = !noCrop + crop = gFasle + the correct is + usemediabox = noCrop + crop = !noCrop + + utils/pdftops.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3d53a0eb14420d54c0ebf8590e34c018b8da105d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 19 16:02:33 2009 +0200 + + Copy byte_lookup in copy constructor + + poppler/GfxState.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 8f7271acf17c46e663cd48d90c382b04a834fba2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 19 15:53:49 2009 +0200 + + Don't use byte_lookup table when color space doesn't support getLine + methods + + For color spaces that don't implement getRGBLine or getGrayLine + methods, + getRGB or getGray are called for every pixel, however we were + allocating + the byte_lookup table and converting colors in those cases + too. Instead + of falling back to generic methods in the base class, the new methods + useGetRGBLine and useGetGrayLine have been added to he base class, + so that + when they are not suopported in the current color space byte_lookup + table is + not used at all. + + Fixes bug #11027. + + poppler/GfxState.cc | 125 + ++++++++++++++++++++++++++++++--------------------- + poppler/GfxState.h | 21 +++++++-- + 2 files changed, 91 insertions(+), 55 deletions(-) + +commit 1bc737796bef1c65289a101b2d4c367267b9c974 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 19 15:51:43 2009 +0200 + + Remove unused variable + + poppler/GfxState.h | 1 - + 1 file changed, 1 deletion(-) + +commit 512b2c654fd80c83b82e7adc828a478a18de17ab +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 26 19:35:06 2009 +0200 + + [cairo] Use CAIRO_EXTEND_PAD in drawImageMaskPrescaled too + + poppler/CairoOutputDev.cc | 32 +++++++++++++++----------------- + 1 file changed, 15 insertions(+), 17 deletions(-) + +commit ad26e34bede53cb6300bc463cbdcc2b5adf101c2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 26 18:36:06 2009 +0200 + + [cairo] Use rectangle + clip instead of invert + tranform + + This is just for consistency of drawImage methods + + poppler/CairoOutputDev.cc | 30 ++++++++++++++---------------- + 1 file changed, 14 insertions(+), 16 deletions(-) + +commit ee6b761a55baef4c3bbe4614b0c3b3d761a3111f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 26 16:19:15 2009 +0200 + + [cairo] Apply a clip for masked drawImage + + In order to use EXTEND_PAD with a mask, we need to apply a clip (to + constrain the image to the appropriate region). The complicating + factor for + drawSoftImage() is that mask size is independent of the image size, + so we + need to compute the intersection of the mask with in the image + in userspace. + + poppler/CairoOutputDev.cc | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit 499c6c972bac14936b5370276da723a6e98861b3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 26 11:30:08 2009 +0200 + + [cairo] Use CAIRO_EXTEND_PAD when drawing images + + poppler/CairoOutputDev.cc | 306 + +++++++++++++++++++++------------------------ + 1 file changed, 140 insertions(+), 166 deletions(-) + +commit f91eb7d01cef0897727c63267db309bc92297d37 +Author: Koji Otani <sho@bbr.jp> +Date: Sat Jul 25 16:34:12 2009 +0200 + + Fix generation of ps for some files + + For example fixes second pdf in bug 18908 + + poppler/PSOutputDev.cc | 68 + ++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 51 insertions(+), 17 deletions(-) + +commit f93f5e17d8f23f3e2862f3411f43a95b334e6c91 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 20 17:10:37 2009 +0200 + + [cairo] Improve performance when rendering one-channel images + + It implements the same idea already used in SplashOutputDev, for + one-channel (monochrome/gray/separation) images we build a lookup + table + so that we won't need to call colorMap->getRGBLine when filling the + image buffer. Fixes bug #18017. + + poppler/CairoOutputDev.cc | 36 ++++++++++++++++++++++++++++++++++-- + 1 file changed, 34 insertions(+), 2 deletions(-) + +commit e7475062b6ae5c495fa72faaf8fb3d97391f8544 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 14 17:22:52 2009 +0200 + + [cairo] Handle fontType1COT fonts in CairoFontEngine + + poppler/CairoFontEngine.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit d42b9425fb2f98fa79e7a60e4f71ef14f5bacfe9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 12 19:55:14 2009 +0200 + + glade is not used anymore + + cmake/modules/FindGTK.cmake | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 454f7468c6a6a442a5064b5daa24d65ebf4fc6b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 9 10:43:00 2009 +0100 + + [cairo] Fix drawImage() for non-1x1 images + + Carlos noticed a nasty bug with converting drawImage() to use PAD + + fill, + instead of NONE + paint. That is the image was being padded out + far beyond + the correct output extents. The cause is that the caller pre-scales + the + context for the image, so the output rectangle was many times the true + image size - obliterating large amounts of the page. The temporary + fix is + to counter-act the scaling on the context. Longer term, after + fixing all + painters to use PAD correctly, we need to review the callers to remove + unnecessary pre-scaling. + + poppler/CairoOutputDev.cc | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit f8d93eae3c7b9388feabac71f2380d0b42a855e7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 8 20:14:35 2009 +0200 + + Lookup UF and F entries before Unix, MAC and DOS in getFileSpec + + poppler/FileSpec.cc | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 767c534f5fdf6ccbccfd85a0086d72c215c278f1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 8 19:13:54 2009 +0200 + + Use UF entry when present in dict in getFileSpecName() too + + poppler/FileSpec.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 569627ac4d56ddd58e109ce2a37179a85e042030 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 8 13:02:16 2009 +0200 + + Implement axialShadedFill in cairo backend using cairo gradients + + See bug #10942. + + poppler/CairoOutputDev.cc | 29 +++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 10 ++++++++++ + poppler/Gfx.cc | 29 ++++++++++++++++++++--------- + poppler/OutputDev.h | 6 +++++- + poppler/PSOutputDev.cc | 2 +- + poppler/PSOutputDev.h | 2 +- + 6 files changed, 66 insertions(+), 12 deletions(-) + +commit 6ae0a6c0044713affa23eb1ee6a070785ed6c2f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 8 16:48:26 2009 +0100 + + [cairo] premultiply image mask + + Cairo uses a premultiplied colour-space, so when creating the + image mask + in drawImage() we need to remember to multiply by the alpha. In + this case + it just requires zeroing out the masked pixels. + + poppler/CairoOutputDev.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 646e5884e748ecce7094c673400484aa1d902bdd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 8 17:00:34 2009 +0100 + + [cairo] maskColors is an array of ints, no scaling required + + drawImage() was erroneously scaling the maskColors from what it + believed + to be [0:1] to [0:255]. However maskColors is already an integer + array, + [0:255]. + + poppler/CairoOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d75feb1ee84385a9f94308cf47a43f4583092ddf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 8 16:37:19 2009 +0100 + + [cairo] cleanse DrawImage() + + Just a small bit of code rearrangement to reduce repetition and + invalid checks. + + poppler/CairoOutputDev.cc | 102 + ++++++++++++++++++--------------------------- + 1 file changed, 41 insertions(+), 61 deletions(-) + +commit 52f3704fed16cfc1e9dd85f72dde7922371e4099 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 8 11:40:52 2009 +0200 + + [TODO] Update TODO file + + TODO | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ef261f5f72d37a0aa2709611ee2bad7d55340ed8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 7 10:57:31 2009 +0200 + + Do not use F and UF entries if Unix or DOS are present in FileSpec + dict + + poppler/FileSpec.cc | 114 + +++++++++++++++++++++++---------------------------- + 1 file changed, 51 insertions(+), 63 deletions(-) + +commit cafd4653dc6c7574214e80aa09489dcd24e347a6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 1 11:41:32 2009 +0200 + + [glib-demo] Fix a typo + + glib/demo/utils.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a3c9c6d0c0ee55dccd2d03f20d5683ae300cdc6b +Author: Pino Toscano <pino@kde.org> +Date: Wed Jul 8 02:01:39 2009 +0200 + + start updating the TODO file + + TODO file had quite some rust and dust in it, making quite "difficult" + for others to understand what can be done for helping. + First step has been removing all the items done. + Next is grouping items by areas, so it is more clear what should be + done in what area; current areas are: + - general items: for general stuff to be done, not specific to some + area; an example could have been "use littlecms for color management?" + - core: stuff which is specific to the core library + - Qt4/Qt/glib/etc frontend: stuff specific for that frontend + - new frontends: ideas for possible new frontends + + I was not sure about some items and Jeff Muizelaar's TODO, so I left + them there. + + TODO | 47 +++++++++++++++-------------------------------- + 1 file changed, 15 insertions(+), 32 deletions(-) + +commit 92ad0ef89fe7690d83854b4821178dfdb2e22897 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 4 00:19:23 2009 +0200 + + [Qt4 demo] hopefully fix the page size on zoom change + + qt4/demos/pageview.cpp | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 97094d13bc0f144b25e13c1de7a5328608ab13e3 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 4 00:07:12 2009 +0200 + + [Qt4 demo] show a list of checked/unchecked items for the document + permissions + + qt4/demos/permissions.cpp | 25 ++++++++----------------- + qt4/demos/permissions.h | 6 +++--- + 2 files changed, 11 insertions(+), 20 deletions(-) + +commit 0d8f2ee0f03a14e7b8477c4b787c3441a758f26b +Author: Pino Toscano <pino@kde.org> +Date: Fri Jul 3 23:55:42 2009 +0200 + + [Qt4 demo] show page numbers in the toolbar as 1..n + + qt4/demos/navigationtoolbar.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b0d48df9121c55f8162ddf0ee63832f9adebf37b +Author: Pino Toscano <pino@kde.org> +Date: Fri Jul 3 17:55:31 2009 +0200 + + [Qt4 demo] correctly use DPI values for the page sizes + + qt4/demos/pageview.cpp | 12 +++++++++--- + qt4/demos/pageview.h | 2 ++ + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit dcc3c384919f1562b8f312ad3ac847e23f3e83ab +Author: Sebastien Bacher <seb128@ubuntu.com> +Date: Wed Jul 1 10:09:12 2009 +0200 + + [test] Use gtkbuilder rather than libglade + + Fixes bug #21673 + + cmake/modules/FindGTK.cmake | 1 - + configure.ac | 4 +- + test/Makefile.am | 2 +- + test/pdf-inspector.cc | 34 ++-- + test/pdf-inspector.glade | 434 + ------------------------------------------- + test/pdf-inspector.ui | 416 + +++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 439 insertions(+), 452 deletions(-) + +commit 28208d1c9b8afbb769a5f4d9b0655b99fd4af16e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 1 09:52:12 2009 +0200 + + [glib-demo] Do not use gio if glib < 2.15 + + Fixes bug #22530. + + glib/demo/main.c | 33 +++++++++++++++++++++++++++++++-- + 1 file changed, 31 insertions(+), 2 deletions(-) + +commit 6ef83414ab55294cf46b6b05813927bb04066986 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 30 23:07:00 2009 +0200 + + Check getFileSpecNameForPlatform succeeded before using it's return + value + + Fixes crash on bug 22551 + + poppler/Annot.cc | 7 ++++--- + poppler/Link.cc | 30 +++++++++++++++++------------- + poppler/Sound.cc | 8 +++++--- + 3 files changed, 26 insertions(+), 19 deletions(-) + +commit 4b9db83841a8b97df1e0991c1b853897b7095777 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 11:24:29 2009 +0200 + + [glib-demo] Do not fill the surface before rendering + + The surface is guaranteed to be cleared + + glib/demo/render.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +commit 5deb6db5d340c08f337d2ba67aa1fd690e4eedd8 +Author: William Bader <williambader@hotmail.com> +Date: Mon Jun 29 21:55:49 2009 +0200 + + Fix interpolate parameter position + + poppler/SplashOutputDev.cc | 3 ++- + utils/ImageOutputDev.cc | 5 +++-- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit e1e9ae2826eff1665d798b4b50b5c63e8282246b +Author: Pino Toscano <pino@kde.org> +Date: Sun Jun 28 20:11:42 2009 +0200 + + [Qt4 demo] do not crash when changing the zoom with no document + + qt4/demos/pageview.cpp | 3 +++ + 1 file changed, 3 insertions(+) + +commit a98de97137cb343182bd03c443fc08ff4e0fd9a5 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jun 28 19:08:02 2009 +0200 + + [Qt4 demo] add a zoom combobox + + qt4/demos/navigationtoolbar.cpp | 33 ++++++++++++++++++++++++++++++++- + qt4/demos/navigationtoolbar.h | 7 ++++++- + qt4/demos/pageview.cpp | 14 ++++++++++++-- + qt4/demos/pageview.h | 6 +++++- + qt4/demos/viewer.cpp | 2 ++ + 5 files changed, 57 insertions(+), 5 deletions(-) + +commit 40002d2c765398869a3b7d8d92715f0608e39ab3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 28 16:45:19 2009 +0200 + + Make sure the array is big enough to read from it + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0a1b41ff6de5a41e3450ecbcb1ba754dc06c29d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 26 19:31:22 2009 +0200 + + Do not crash when we can't find onStr + + Fixes crash in bug #22485 + Not sure this is the best solution, but Adobe doesn't even open + the file + + poppler/Form.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 6cb846664e57b02c99f1e6ad2b4e9128c9622e0a +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Thu Jun 25 20:13:29 2009 +0200 + + Initilize AnnotColot properly when the Array is not correct + + poppler/Annot.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5fdc3acb8dded2e7d08e6ef30f4c5ae1a4a11b5e +Author: Till Kamppeter <till.kamppeter@gmail.com> +Date: Mon Jun 22 21:38:23 2009 +0200 + + Only change the page size when it really changes, otherwise duplex + commands are lost + + poppler/PSOutputDev.cc | 10 +++++++++- + poppler/PSOutputDev.h | 4 ++++ + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit bf69beeb257cfd750c6ddc8b68aeb859b36380b2 +Author: David Benjamin <davidben@mit.edu> +Date: Sat Jun 20 23:51:09 2009 +0200 + + Make DecryptStream return sane values for getPos() + + Many streams (notably JBIG2Stream) expect wrapped streams to return + correct + values for getPos(), i.e. increments by 1 when readChar() called, etc. + Fixes bug #19706. + + poppler/Decrypt.cc | 8 ++++++++ + poppler/Decrypt.h | 3 +++ + 2 files changed, 11 insertions(+) + +commit 5ee4ff2aaf98e2eaa1ec2dc9f7e659b3b01ba7bf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 20 15:00:16 2009 +0200 + + [glib-demo] Allow using relative paths in demo application + + glib/demo/main.c | 17 +++++------------ + 1 file changed, 5 insertions(+), 12 deletions(-) + +commit a568248d3255407fcaa7368c4925c20e95619d20 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 19 21:07:39 2009 +0200 + + 0.11.1 + + CMakeLists.txt | 2 +- + NEWS | 50 + ++++++++++++++++++++++++++++++++++++++++++++++++-- + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 54 insertions(+), 8 deletions(-) + +commit ac99e239f2726db32617ff03174a6ce74361ea1b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 19 21:03:29 2009 +0200 + + ship PopplerCache.h + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 84984d2aa25917d68c9971cefe636e626eada13d +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 19 20:54:15 2009 +0200 + + Ship PopplerCache.h too + + poppler/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 3a52d46e5df8eb926b550d7f7a82f316dbf6808f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jun 19 17:45:44 2009 +0200 + + [glib-demo] Destroy pattern after using it + + glib/demo/render.c | 1 + + 1 file changed, 1 insertion(+) + +commit 2e97524e5d82a4c33a4e6410fead444681db6749 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jun 19 14:20:16 2009 +0200 + + [glib-demo] Use a transparent surface and fill it in white after + rendering + + glib/demo/render.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 009937842d5a8bfc12394e9e3ab71b7c33340a85 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jun 19 14:10:05 2009 +0200 + + [glib-demo] Use cairo_paint instead of rectangle + fill + + glib/demo/render.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 7248da095f67d57c3999cee7d980e62fd8a7cf49 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jun 19 09:37:02 2009 +0200 + + Use Interpolate flag to decide whether applying image interpolation + during rendering + + Fixes bug #9860 + + poppler/ArthurOutputDev.cc | 4 +- + poppler/ArthurOutputDev.h | 5 ++- + poppler/CairoOutputDev.cc | 92 + +++++++++++++++++++++++++------------------ + poppler/CairoOutputDev.h | 48 ++++++++++++---------- + poppler/Gfx.cc | 49 +++++++++++++++++++---- + poppler/OutputDev.cc | 17 +++++--- + poppler/OutputDev.h | 13 +++--- + poppler/PSOutputDev.cc | 8 ++-- + poppler/PSOutputDev.h | 8 ++-- + poppler/PreScanOutputDev.cc | 25 ++++++++++-- + poppler/PreScanOutputDev.h | 25 ++++++++++-- + poppler/SplashOutputDev.cc | 16 +++++--- + poppler/SplashOutputDev.h | 12 ++++-- + utils/HtmlOutputDev.cc | 16 ++++---- + utils/HtmlOutputDev.h | 7 ++-- + utils/ImageOutputDev.cc | 20 +++++----- + utils/ImageOutputDev.h | 12 ++++-- + 17 files changed, 248 insertions(+), 129 deletions(-) + +commit 37e3f877ee725648734ff41e1e83870a210bcbd7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 19 00:37:21 2009 +0200 + + Handle Streams in CMap definitions + + Fixes bug 22334 + + poppler/CMap.cc | 50 + +++++++++++++++++++++++++++++------------------ + poppler/CMap.h | 17 +++++++++++----- + poppler/GfxFont.cc | 41 ++++++++++++++++++++++++++------------ + poppler/GlobalParams.cc | 6 +++--- + poppler/GlobalParams.h | 5 +++-- + 5 files changed, 77 insertions(+), 42 deletions(-) + +commit 47de8eef46300832556ce5ed869e391e477fd843 +Author: David Benjamin <davidben@mit.edu> +Date: Fri Jun 19 00:30:35 2009 +0200 + + Fix some bugs in JBIG2Stream handling + + For more info see bug 12014 and [poppler] Bug in JBIG2Stream from + 08-June-2009 + + poppler/JBIG2Stream.cc | 88 + ++++++++++++++++++++++++++---------------------- + poppler/JBIG2Stream.h | 15 +++++++++ + 2 files changed, 63 insertions(+), 40 deletions(-) + +commit d30b1013ea3ce45b5ea942fe7357c0fd07ff47f4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 2 11:44:08 2009 +0200 + + Add setOpen() and setIcon() in AnnotText + + poppler/Annot.cc | 25 +++++++++++++++++++++++++ + poppler/Annot.h | 3 +++ + 2 files changed, 28 insertions(+) + +commit 287feffc1c1c0aa42a398fc071b489acef9ef22e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 2 11:26:40 2009 +0200 + + Add setLabel() and setPopup() to AnnotMarkup + + poppler/Annot.cc | 36 ++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 4 ++++ + 2 files changed, 40 insertions(+) + +commit 2a938af5624fbc79316dd6bee5e550f2b4270a76 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 2 10:59:44 2009 +0200 + + Add setParent() and setOpen() to AnnotPopup + + poppler/Annot.cc | 19 +++++++++++++++++++ + poppler/Annot.h | 4 ++++ + 2 files changed, 23 insertions(+) + +commit 0af5464352dfa51f0458c57a3590c847a45964c7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 2 10:37:49 2009 +0200 + + Save parent reference of popup annotations + + poppler/Annot.cc | 16 +++++----------- + poppler/Annot.h | 4 ++-- + 2 files changed, 7 insertions(+), 13 deletions(-) + +commit fc4bc43dcd6f6871a47b9198e8c2571a5d448c3e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 1 14:52:21 2009 +0200 + + Fix a crash in pdf-inspector + + test/pdf-inspector.cc | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 3da7a2657892fde52b62e1f73476cb33d6c75e96 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 29 13:35:39 2009 +0200 + + Add Annot::setColor() + + poppler/Annot.cc | 19 ++++++++++++++++++- + poppler/Annot.h | 6 +++++- + 2 files changed, 23 insertions(+), 2 deletions(-) + +commit 3eabdf57729852205855cf74ff2d2f9d7bc03f73 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 29 13:23:26 2009 +0200 + + Add construtors to create AnnotColor objects directly from color + values + + poppler/Annot.cc | 26 ++++++++++++++++++++++++++ + poppler/Annot.h | 3 +++ + 2 files changed, 29 insertions(+) + +commit 8045e7a1a84a3d54a1c9415ac63b5b9df5ecc349 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 29 13:06:40 2009 +0200 + + Add Page::addAnnot() to add a new annotation to the page + + poppler/Page.cc | 28 ++++++++++++++++++++++++++++ + poppler/Page.h | 2 ++ + 2 files changed, 30 insertions(+) + +commit fe80eb84ec711b7400cef95e791a74c8fd259af7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 29 13:00:19 2009 +0200 + + Add getRef() to get the annotation reference + + poppler/Annot.h | 1 + + 1 file changed, 1 insertion(+) + +commit 1c92657be72c44dba7185808ffb00dd85c5ab289 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 29 12:14:02 2009 +0200 + + Save page object and ref in Page class + + This is needed to be able to modify the page object. + + poppler/Catalog.cc | 2 +- + poppler/Page.cc | 6 +++++- + poppler/Page.h | 4 +++- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 4ad2d663262008e4b97342c4ed67c686ff5abd13 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 29 11:43:30 2009 +0200 + + Add annot constructors to create annot objects without a dict + + This allows to create annotation objects to be added to the document. + Required fields on the annotation dictionary are constructor + arguments, + setters will be added for the other fields. + + poppler/Annot.cc | 300 + ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + poppler/Annot.h | 22 +++- + 2 files changed, 315 insertions(+), 7 deletions(-) + +commit e5c4862b0c1b08a0fab47070cb9c862026e93567 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 10 23:28:03 2009 +0200 + + ignore++ + + m4/.gitignore | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 572779f8037763c1e0ee64c47a3dad6df0d3b693 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Jun 10 22:55:26 2009 +0200 + + Fix dashed line in page 1 of bug 20011 + + poppler/Gfx.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit b97591672e0d9c31a3d044fe52e34cc80a491221 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Jun 10 22:54:57 2009 +0200 + + Fix "Conditional jump or move depends on uninitialised value" + + When stroking with a pattern, set strokeColor with a copy of + fillColor. + This is wrong and the fillColor may be uninitialized. + See bug 20011 + + poppler/Gfx.cc | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit a92b38836b1e4475d5a7a1b9cb8f3e9429cef275 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 9 22:39:19 2009 +0200 + + Correctly duplicate the cache on PostScriptFunction(PostScriptFunction + *func) + + poppler/Function.cc | 28 ++++++++++++++++++++++++++++ + poppler/PopplerCache.cc | 20 ++++++++++++++++++++ + poppler/PopplerCache.h | 14 ++++++++++++++ + 3 files changed, 62 insertions(+) + +commit 2cecdf922f4c8178b0e55d3ddf86c31f8be3313a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 9 11:04:39 2009 +0200 + + [glib] Fix a crash when a destination points to an invalid page + + glib/poppler-action.cc | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +commit 831288c13c3a7502bbccd1313c6e376283be367c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 7 18:37:20 2009 +0200 + + Optimize roll() a bit + + If the number of times to roll is > than half the number of items + rotate in the reverse direction + Makes it be 33% of exec() instead of 42% + + poppler/Function.cc | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +commit 3d40dcad850a2bc0e28845a15722db0c79920135 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 7 13:38:50 2009 +0200 + + Move the GfxState cache to the new poppler cache class + + poppler/GfxState.cc | 97 + ++++++++++++++++++++++++--------------------------- + poppler/GfxState.h | 19 ++-------- + 2 files changed, 49 insertions(+), 67 deletions(-) + +commit 2619e09833f421fb3d8cc68d41d15081ae6824e4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 7 13:37:40 2009 +0200 + + Implement a cache for PostscriptFunction transforms + + Makes time of rendering of bug 21562 go down from 24 to 8 seconds + + poppler/Function.cc | 76 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Function.h | 2 ++ + 2 files changed, 78 insertions(+) + +commit 588bfe3c14f42be492066c2a98e30482475a6926 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 7 13:36:39 2009 +0200 + + Add a code to a generic cache based on Koji's code for GfxState cache + + CMakeLists.txt | 1 + + poppler/Makefile.am | 1 + + poppler/PopplerCache.cc | 82 + +++++++++++++++++++++++++++++++++++++++++++++++ + poppler/PopplerCache.h | 47 +++++++++++++++++++++++++++ + 4 files changed, 131 insertions(+) + +commit d09478fcc44b5c594f1803fc24654af5e10fa129 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 7 01:34:01 2009 +0200 + + Move index and pop to class definition too + + poppler/Function.cc | 32 +++++++++++++++----------------- + 1 file changed, 15 insertions(+), 17 deletions(-) + +commit 2083264e8ab0fd9976294de08a18de615d5a1168 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 7 01:21:19 2009 +0200 + + Move the implementations to the class definition + + Make gcc inline the functions and time to render a heavy PSFunction + doc goes from 28 to 20 secs + + poppler/Function.cc | 151 + ++++++++++++++++++++++++--------------------------- + 1 file changed, 71 insertions(+), 80 deletions(-) + +commit 24580fcd2be74db5f3140bdb2ebff8431b7d3f1e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 6 16:17:26 2009 +0200 + + Add a debug saying how much rendering took + + qt4/tests/test-poppler-qt4.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit 50cf7cffff760e41774957ad8f1f92803142438e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 6 16:04:54 2009 +0200 + + Use g_path_get_basename instead of g_basename in gtk-cairo-test + + Fixes bug #21361. + + test/gtk-cairo-test.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4cc9dee35e03d7b295a476f937ec0f2c43bb6592 +Author: Christian Persch <chpe@gnome.org> +Date: Sat Jun 6 12:13:48 2009 +0200 + + Remove unneeded files from repo + + See bug #22094 + + configure.ac | 2 +- + glib/reference/Makefile.am | 4 +- + gtk-doc.make | 155 + -------------------------------------------- + m4/gtk-doc.m4 | 53 --------------- + 4 files changed, 3 insertions(+), 211 deletions(-) + +commit c94e476dbff9e527c72e52377d830f35f29ba3d6 +Author: Pino Toscano <pino@kde.org> +Date: Fri Jun 5 11:09:44 2009 +0200 + + when showing the tooltip for a text rect, show also its index in + the page text boxes list + + qt4/tests/test-poppler-qt4.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 2298acac267257b1916c802bdb902428e69e683b +Author: Pino Toscano <pino@kde.org> +Date: Fri Jun 5 11:08:51 2009 +0200 + + [Qt4 apidox] FontInterator is new in 0.12 + + qt4/src/poppler-qt4.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 37c48c2521c623c485841472c4a174a1841aea33 +Author: Pino Toscano <pino@kde.org> +Date: Fri Jun 5 10:54:30 2009 +0200 + + [CMake] Add poppler version defines and version check macro + + Add POPPLER_[MAJOR|MINOR|MICRO]_VERSION defines and + POPPLER_CHECK_VERSION macro. FDO bug #22091. + + CMakeLists.txt | 5 ++++- + glib/poppler-features.h.cmake | 9 +++++++++ + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 26f6fb1d79c2589829cd896d57da63d16641f307 +Author: Pino Toscano <pino@kde.org> +Date: Fri Jun 5 10:51:26 2009 +0200 + + [CMake] switch poppler-features.h.cmake to a more autotools-like + syntax + + glib/CMakeLists.txt | 2 +- + glib/poppler-features.h.cmake | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 89704635b727db42f6c72ba101091eb7eddb967a +Author: Pino Toscano <pino@kde.org> +Date: Fri Jun 5 10:39:17 2009 +0200 + + [Qt4 demo] compile the new thumbnail module with autotools as well + + qt4/demos/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit 291bafe64c8755fe5f85a51b184ac6e3d3170e1d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jun 5 10:07:16 2009 +0200 + + [glib] Use g_strerror instead of strerror + + Fixes bug #22095. + + glib/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0ca7e214fb5f9c9fb59792149bd23c1617d38cac +Author: Christian Persch <chpe@gnome.org> +Date: Thu Jun 4 22:35:40 2009 +0200 + + Add poppler version defines and version check macro + + Add POPPLER_[MAJOR|MINOR|MICRO]_VERSION defines and + POPPLER_CHECK_VERSION macro. FDO bug #22091. + + configure.ac | 11 +++- + glib/poppler-features.h.in | 9 ++++ + glib/reference/poppler-docs.sgml | 1 + + glib/reference/poppler-sections.txt | 10 ++++ + glib/reference/tmpl/poppler-features.sgml | 80 + +++++++++++++++++++++++++++++ + 5 files changed, 110 insertions(+), 1 deletion(-) + +commit 4ce04da0040e5a2626c110f94a128e2d272401b9 +Author: Matthias Drochner <M.Drochner@fz-juelich.de> +Date: Thu Jun 4 23:05:22 2009 +0200 + + Use the correct value when creating the V field + + PDF Spec says: + For items represented in the Opt array by a two-element array, + the name string is the second of the two array elements. + + poppler/Form.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 7e01e37a834bfdd75d739ea2b48e9127ca7f259e +Author: Till Kamppeter <till.kamppeter@gmail.com> +Date: Thu Jun 4 20:25:55 2009 +0200 + + Add part of fix for bug 20420, the other part was checked in with + Thomas patches + + poppler/PSOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 50a7b4bcaa6e5f56cc25fe6936f9dc537a1b4b37 +Author: Jeremy C. Reed <reed@reedmedia.net> +Date: Thu Jun 4 20:19:03 2009 +0200 + + [glib] Hyphenate UTF-8 and UTF-16BE + + Fixes bug #21953. + + where iconv() is called to fill in a text field, use "UTF-8" and + "UTF-16BE" as encoding names rather than the less portable + "UTF8" and "UTF16BE" -- this makes it work on NetBSD. + + glib/poppler-annot.cc | 2 +- + glib/poppler-form-field.cc | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 2cf9e6a2318b770ae62572944c687576d1801d31 +Author: Till Kamppeter <till.kamppeter@gmail.com> +Date: Thu Jun 4 19:48:42 2009 +0200 + + Support multiple page sizes when converting to PS + + Fixes byg #19777 + + poppler/PSOutputDev.cc | 31 +++++++++++++++++++++++++++++-- + poppler/PSOutputDev.h | 4 +++- + utils/pdftops.1 | 26 +++++++++++++++++++++----- + utils/pdftops.cc | 17 ++++++++++++----- + 4 files changed, 65 insertions(+), 13 deletions(-) + +commit 30fb7cb7e47cf6a8008c5083c8d0978fdfdf8e62 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 4 19:25:22 2009 +0200 + + Add missing { } + + poppler/Gfx.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1beec21ed3a016998fee3849d460166895db9047 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 3 22:37:43 2009 +0200 + + Give an error when using level1sep without having CMYK support + + Fixes bug #22026 + + poppler/PSOutputDev.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e80d645c34c7d44d1f35da0a25669d1c4cde6e7f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 3 22:00:49 2009 +0200 + + Also accept tokens with to leading 00 + + Fixes bug 22025, based on a patch by William Bader + + poppler/CharCodeToUnicode.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit e521c1efaeba3f35d10e46bca3d9650dabd2d889 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 3 22:08:57 2009 +0930 + + Implement text in pattern colorspace for the cairo backend + + poppler/CairoOutputDev.cc | 47 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 19 ++++++++++++++++++ + 2 files changed, 66 insertions(+) + +commit a87978b09a026b2db6b0f80271d87b44b336a121 +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 3 13:49:56 2009 +0200 + + [Qt4 demo] show the checksum for embedded files + + qt4/demos/embeddedfiles.cpp | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit db5102842494a124d813db1696bb60820db3442b +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 3 13:21:22 2009 +0200 + + [Qt4 demo] remove checks for Qt >= 4.2 + + poppler-qt4 requires Qt 4.3, so checking for 4.2 is no more needed + + qt4/demos/embeddedfiles.cpp | 2 -- + qt4/demos/fonts.cpp | 2 -- + qt4/demos/info.cpp | 2 -- + qt4/demos/optcontent.cpp | 2 -- + qt4/demos/permissions.cpp | 2 -- + qt4/demos/toc.cpp | 2 -- + 6 files changed, 12 deletions(-) + +commit e8d897581656ee4a20e9bb87dd999425663ace3b +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 3 02:54:29 2009 +0200 + + [Qt4 demo] simplier way to change page from the thumbnail view + + qt4/demos/pageview.cpp | 5 ----- + qt4/demos/pageview.h | 3 --- + qt4/demos/thumbnails.cpp | 2 +- + qt4/demos/thumbnails.h | 3 --- + qt4/demos/viewer.cpp | 1 - + 5 files changed, 1 insertion(+), 13 deletions(-) + +commit f69a4fe47d3478cccbc03e4ac0929c7eada681c0 +Author: Pino Toscano <pino@kde.org> +Date: Wed Jun 3 01:24:21 2009 +0200 + + [Qt4 demo] Add a thumbnail dock widget + + Useful to show the embedded page thumbnails in the document, if any. + Based on a patch by Shawn Rutledge <shawn.t.rutledge@gmail.com>, + reworked by me to be a QListWidget showing the page items at their + full size. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/thumbnails.cpp | 84 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/thumbnails.h | 51 ++++++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 11 +++++- + 4 files changed, 146 insertions(+), 1 deletion(-) + +commit 2f24ac0f4bbd6de1c9f137110b3ac2bd3b23b0b9 +Author: Shawn Rutledge <shawn.t.rutledge@gmail.com> +Date: Wed Jun 3 01:22:31 2009 +0200 + + [Qt4 demo] add a public slot to set the current page + + qt4/demos/pageview.cpp | 5 +++++ + qt4/demos/pageview.h | 3 +++ + 2 files changed, 8 insertions(+) + +commit 1f1baf186f9e37606765e51ec5b9893ddfbfa893 +Author: Shawn Rutledge <shawn.t.rutledge@gmail.com> +Date: Wed Jun 3 01:19:16 2009 +0200 + + [Qt4] Add Page::thumbnail() + + This function can be used to get the embedded thumbnail of the page, + present in the document. + Reindented by me, and avoid a memory leak because of non-freed data. + + qt4/src/poppler-page.cc | 21 ++++++++++++++++++++- + qt4/src/poppler-qt4.h | 11 +++++++++++ + 2 files changed, 31 insertions(+), 1 deletion(-) + +commit 5cc24be1e9af0a27ab88ffa719bcabc2378868e4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 3 00:05:54 2009 +0200 + + Remove unused variables + + poppler/SplashOutputDev.cc | 3 --- + 1 file changed, 3 deletions(-) + +commit 45823bf8f4abacbbf257f6708264de074eda3cf4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 3 00:02:54 2009 +0200 + + Make it compile :-/ + + poppler/SplashOutputDev.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit f5ae14907261a46c121f3ed7aea9d7ad9b9c55de +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 2 23:52:59 2009 +0200 + + Really fix the typo + + README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5d4b1995cdd57db7cef3d88704850aaf66ed7fff +Author: William Bader <williambader@hotmail.com> +Date: Tue Jun 2 23:10:53 2009 +0200 + + Fix three typos in README + + README | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 104f9286ceb5fcb5f4795bca7633029142d5f6a4 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Jun 2 22:59:42 2009 +0200 + + Support colorizing text in pattern colorspace + + This implements commits the final patches for bug 19670 and 19994 + Also fixes bugs 15819 and 2807 + Also implements blending for SPLASH_CMYK in Splash + It's a quite big change but i've done regression testing over my whole + pdf suite and did not fit anything that went worse, just improvements + Missing the Cairo support + + CMakeLists.txt | 1 + + poppler/Gfx.cc | 135 ++++++++++++--- + poppler/Gfx.h | 7 + + poppler/GfxState.cc | 58 +------ + poppler/GfxState_helpers.h | 80 +++++++++ + poppler/Makefile.am | 1 + + poppler/OutputDev.h | 14 ++ + poppler/PSOutputDev.cc | 285 ++++++++++++++++++------------- + poppler/PSOutputDev.h | 18 ++ + poppler/SplashOutputDev.cc | 404 + +++++++++++++++++++++++++++++++++++++------- + poppler/SplashOutputDev.h | 19 +++ + 11 files changed, 766 insertions(+), 256 deletions(-) + +commit d3e4563146cbff4cb507522783e60462461c7524 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun May 31 23:23:07 2009 +0200 + + Set memory to 0 after allocation, fixes problems on Sun machines, + should not hurt for others + + poppler/GfxState.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 78a58931b4347ecb505bad5a51104382ef5f91c7 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun May 31 22:52:23 2009 +0200 + + Add splashClearColor that assigns white to the given colorptr + + splash/SplashTypes.h | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 47c26747b32c242ec8ac60e7b93150a67eb22e31 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun May 31 22:51:22 2009 +0200 + + Fix splashColorModeNComps to correctly include all values for each + SplashColorMode + + splash/SplashState.cc | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit 41775d8c0b44bf591d8ff5ede7fad276e8fa9eef +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 1 15:24:24 2009 +0200 + + [glib-demo] Use poppler_annot_markup_has_popup() + + glib/demo/annots.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit f542c5294394e837298cb7e7d1d94bb336bfd09d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 1 15:24:04 2009 +0200 + + [glib] Add poppler_annot_markup_has_popup() + + glib/poppler-annot.cc | 20 ++++++++++++++++++++ + glib/poppler-annot.h | 1 + + 2 files changed, 21 insertions(+) + +commit af32d56af779edcc539b680e634755941d1bf45c +Author: Petr Gajdos <pgajdos@novell.com> +Date: Thu May 21 00:37:18 2009 +0200 + + Add the possibility of forcing no hinting of fonts + + poppler/ArthurOutputDev.cc | 2 ++ + poppler/GlobalParams.cc | 20 +++++++++++ + poppler/GlobalParams.h | 4 +++ + poppler/SplashOutputDev.cc | 2 ++ + splash/SplashFTFont.cc | 76 + ++++++++++++++++++++++++++---------------- + splash/SplashFTFont.h | 2 ++ + splash/SplashFTFontEngine.cc | 8 +++-- + splash/SplashFTFontEngine.h | 6 ++-- + splash/SplashFontEngine.cc | 4 ++- + splash/SplashFontEngine.h | 2 ++ + 10 files changed, 91 insertions(+), 35 deletions(-) + +commit 1a69d9638214943b3c2278f570694d9722a5de15 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 20 23:58:44 2009 +0200 + + Do not create the GfxColorTransform if the lcms could not be created + + Fixes crash on pdf from bug 20108 + + poppler/GfxState.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 95246d39c1289111a4ba3eb2ffbec50d7702e5eb +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 20 23:20:20 2009 +0200 + + Check Mask entries are int before using them, also if they are real + cast to int and try to use them + + Fixes bug #21841 + + poppler/Gfx.cc | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 0c3517bfb4e1e1a28962f8d490ad69ec5766b6a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 20 23:08:41 2009 +0200 + + Fix pdftops crash on file from KDE bug 174899 + + Still does not generate a correct ps file, but at least the program + does not crash now + + fofi/FoFiTrueType.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 548c72600b8a5e076647041660ed5031feedc7cc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 20 22:43:11 2009 +0200 + + Do not exit(1) on a pdf i have lying around + + PDF is 0f03b3539a436a9f18d7e4e29d410f89 6607907.pdf + + poppler/JBIG2Stream.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit f78d3a7ff5ef4b500d76d84ebc45aac3be162dab +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 18 20:44:40 2009 +0200 + + Move lcms.h include to GfxState.cc, replace lcms typedefs by void * + + poppler/GfxState.cc | 70 + ++++++++++++++++++++++++++++++++++++++++++++------- + poppler/GfxState.h | 64 +++++++++++----------------------------------- + 2 files changed, 75 insertions(+), 59 deletions(-) + +commit ec2467f9981b7e7c23d5dcd8eabf2e7c8cdf8930 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 17 20:00:53 2009 +0200 + + Use the lcms include dir + + CMakeLists.txt | 3 +++ + poppler/Makefile.am | 2 ++ + 2 files changed, 5 insertions(+) + +commit e0fcf7055af480498a81a000dcd9f977a783df66 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 17 12:07:05 2009 +0200 + + Use pkgconfig for autotools cms check + + configure.ac | 12 +++++++----- + poppler/Makefile.am | 2 +- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 657734c19274ab281328cba9297eca45e48777aa +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 17 12:06:47 2009 +0200 + + Better lcms check comming from kdelibs + + cmake/modules/FindLCMS.cmake | 95 + +++++++++++++++++++++++++++++++----------- + 1 file changed, 71 insertions(+), 24 deletions(-) + +commit 0974b7b4bfe3f8cf3a1408741ddf01c667c28044 +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Thu May 14 16:15:22 2009 +0200 + + [Win32] Build fix for MSVC. + + poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit d1c0e8a6c63361304cd453bb4c51e84a1aab7efa +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 14 00:29:18 2009 +0200 + + Kill support for specifying extension in openTmpFile + + We don't use it and it would not work anyway, see bug #21713 + + goo/gfile.cc | 58 + ++++++++++-------------------------------- + goo/gfile.h | 3 ++- + poppler/CairoFontEngine.cc | 6 ++--- + splash/SplashFTFontEngine.cc | 3 ++- + splash/SplashT1FontEngine.cc | 3 ++- + splash/SplashT1FontFile.cc | 3 ++- + 6 files changed, 24 insertions(+), 52 deletions(-) + +commit e237d8b5c2ae8805487a0790d9fb218263686712 +Author: Pino Toscano <pino@kde.org> +Date: Wed May 13 18:37:07 2009 +0200 + + [Qt4] we don't need an output device anymore (since long, even) + for resolving destinations + + qt4/src/poppler-document.cc | 3 --- + 1 file changed, 3 deletions(-) + +commit 9a2a851da93ef1a0c291fc9523a468e808ffd08e +Author: Pino Toscano <pino@kde.org> +Date: Wed May 13 18:19:11 2009 +0200 + + [Qt4] Do not try to resolve named destinations for GoTo links pointing + to external documents. + + In such cases, the named destination is a destination in the external + document, so we would try to look up a destination which is not in + the current document (thus the look up is unuseful). + It is task of the users of poppler-qt4 detect such + situations, and resolve the named when necessary, using + Document::linkDestination(QString). + + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-link.cc | 2 +- + qt4/src/poppler-page.cc | 6 ++++-- + qt4/src/poppler-private.cc | 4 ++-- + qt4/src/poppler-private.h | 5 +++-- + 5 files changed, 11 insertions(+), 8 deletions(-) + +commit 51f6cc26fc5fdccce1ba4d4816dec374ce85d67a +Author: Pino Toscano <pino@kde.org> +Date: Wed May 13 17:38:00 2009 +0200 + + [Qt4] start a (basic) unit test for links & destinations + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 5 +++ + qt4/tests/check_links.cpp | 96 + +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 102 insertions(+) + +commit 174f8087f5e09c5d1915de128b7a15acf47c1e13 +Author: Pino Toscano <pino@kde.org> +Date: Wed May 13 16:44:59 2009 +0200 + + [Qt4] set the destination name only when it is not resolved + + qt4/src/poppler-link.cc | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit fb0cb2add9443992f166acdf744fbec875faaabf +Author: Pino Toscano <pino@kde.org> +Date: Tue May 12 01:53:43 2009 +0200 + + [Qt4] Add LinkDestination::destinationName() that returns the name + of the current destination. + + qt4/src/poppler-link.cc | 10 ++++++++++ + qt4/src/poppler-link.h | 7 +++++++ + 2 files changed, 17 insertions(+) + +commit b8bd44f1302f7b6a6923d41c98ec74c118a5abb8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 11 20:49:34 2009 +0200 + + Poppler 0.11.0 aka 0.12 Alpha 1 + + CMakeLists.txt | 4 +- + NEWS | 142 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +-- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 150 insertions(+), 8 deletions(-) + +commit 79bcedd5602729b959f21aed222445de621e7ecb +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon May 11 19:59:57 2009 +0200 + + Update copyright headers for previous patches + + poppler/ArthurOutputDev.cc | 1 + + poppler/CairoOutputDev.cc | 2 +- + poppler/Page.cc | 2 +- + poppler/Stream.cc | 1 + + poppler/Stream.h | 1 + + utils/HtmlOutputDev.cc | 1 + + utils/ImageOutputDev.cc | 1 + + 7 files changed, 7 insertions(+), 2 deletions(-) + +commit f16e36df3a74e1adf14513a6340be2e8665f8d65 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 10 19:24:32 2009 +0200 + + Don't include popups annots with a parent in annots list + + poppler/Annot.cc | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 5051ebed1477ff3f7721606f79d66d56a80c1145 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 10 19:10:51 2009 +0200 + + Make sure ImageStream::close() is called after ImageStream::reset() + + poppler/ArthurOutputDev.cc | 1 + + poppler/CairoOutputDev.cc | 20 +++++++++++++++++--- + poppler/Page.cc | 1 + + poppler/Stream.cc | 4 ++++ + poppler/Stream.h | 3 +++ + utils/HtmlOutputDev.cc | 1 + + utils/ImageOutputDev.cc | 1 + + 7 files changed, 28 insertions(+), 3 deletions(-) + +commit 829ed964374676ddfa4a9048c940dc20a309ca47 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 10 23:39:11 2009 +0200 + + Fix axial shading fix to ensure the painting passes by the four + edges of the bbox + + When j and teoricalj are the same, just change the value of ta[] + not the next[] ones + + poppler/Gfx.cc | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit 68d9644499676ed1553b2bfcdbfc9a5677c75345 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 9 22:25:12 2009 +0200 + + Hidden property depends on parent being hidden, not only yourself + + Fixes bug #16093 + + poppler/Gfx.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 810a71ea66f0e07d9849a5e9bf28911472482d1b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 8 09:36:31 2009 +0200 + + [glib] Add poppler_annot_markup_get_popup_rectangle + + glib/demo/annots.c | 8 ++++++++ + glib/poppler-annot.cc | 35 +++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 2 ++ + 3 files changed, 45 insertions(+) + +commit 5d328282da4713356fbe4283bd992ac2fc9010a2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 7 23:11:55 2009 +0200 + + bitmap->h can be 0, move to _checkoverflow variant, code already + knows how to deal with NULL + + splash/SplashFTFont.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5b0fb6f94d6d54b1b0c97762db61e2ab0dd07c85 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 6 22:59:55 2009 +0200 + + Fix format printing + + poppler/JBIG2Stream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c21b08a254f42f53d4b59ad4fb308c7c68c32d15 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed May 6 15:56:21 2009 +0200 + + [glib] Several fixes in poppler_annot_get_color() + + PopplerColor is compatible with GdkColor where every component is + in the + range of 0 to 65535, we were returning values between 0 and 1 but + converted to guint16. + We were also showing a warning when AnnotColor::colorTransparent is + used, but we decided to return a PopplerColor * to be able to + represent + transparent color returning NULL, so it's actually supported. + + glib/demo/annots.c | 25 +++++++++++-------------- + glib/poppler-annot.cc | 36 +++++++++++++++++++++--------------- + 2 files changed, 32 insertions(+), 29 deletions(-) + +commit 63cc40ec02498e1ec249d5f74e23f574c665872e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 2 14:08:23 2009 +0200 + + Link pdftoabw to abiword libs + + Fixes bug #21520 + + utils/Makefile.am | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit 70e06e9ae28d08bb7495a7f2eb03b0b5714a1e54 +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Wed Apr 29 09:52:21 2009 +0900 + + PopplerAttachment refers its document. + + glib/poppler-attachment.cc | 41 + +++++++++++++++++++++++++++++++++++------ + 1 file changed, 35 insertions(+), 6 deletions(-) + +commit 977a13f1091700bf7e7b31859e0e6632dc323462 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Apr 25 19:07:01 2009 +0200 + + [glib] Only create checksum string for valid checksums + + glib/poppler-attachment.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit fb6e7141e3008ae230ae5819e2c7a0425296d8d2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 24 10:13:53 2009 +0200 + + Update copyright headers + + glib/poppler-annot.cc | 1 + + glib/poppler-annot.h | 1 + + poppler/Annot.cc | 2 +- + poppler/Annot.h | 2 +- + poppler/DateInfo.cc | 1 + + poppler/DateInfo.h | 1 + + 6 files changed, 6 insertions(+), 2 deletions(-) + +commit fc7e52fef0317f9c85ead2c4f8a0e9b688decca3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 24 09:53:41 2009 +0200 + + Fix typos in Annot::setContents() documentation + + poppler/Annot.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df0032cf5f6e5dc44bad056c659180e4065d32e2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Apr 23 13:19:25 2009 +0200 + + Document Annot::setContents() method + + poppler/Annot.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 86a37a8f3f93e3378b446f8d81d80571267c7660 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Apr 23 13:16:04 2009 +0200 + + Update the annotation last modified time when it's modified + + poppler/Annot.cc | 26 ++++++++++++++++---------- + poppler/Annot.h | 7 ++++--- + 2 files changed, 20 insertions(+), 13 deletions(-) + +commit 9662bfa2b4b2282d0fc29d2a327b62d8bde56ff2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Apr 23 13:13:07 2009 +0200 + + Add timeToDateString() to DateInfo + + This function converts a time_t into a string in PDF date format. + + configure.ac | 1 + + poppler/DateInfo.cc | 47 + +++++++++++++++++++++++++++++++++++++++++++++++ + poppler/DateInfo.h | 7 +++++++ + 3 files changed, 55 insertions(+) + +commit dc4cf0c29b53cda5c1c2badc5026af3429502e3a +Author: Pino Toscano <pino@kde.org> +Date: Tue Apr 21 21:51:52 2009 +0200 + + add poppler-date.{cc,h} + + glib/CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0750c6502faeabff571f5730b567097e793dca64 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 20:04:27 2009 +0200 + + [glib-demo] Fix dates handling in annots demo + + glib/demo/annots.c | 69 + +++++++++++----------------------------------------- + 1 file changed, 14 insertions(+), 55 deletions(-) + +commit fe73bf9771e8294af4c8a11ec4c2891ff8f8d859 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 20:02:25 2009 +0200 + + [glib-demo] GTime is deprecated, use time_t instead + + glib/demo/utils.c | 2 +- + glib/demo/utils.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 6d468cfa0cb89760e5d6cca43521cde6d99aa52e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 20:00:20 2009 +0200 + + [glib-demo] Use format_date from utils and remove duplicated code + + glib/demo/info.cc | 27 ++------------------------- + 1 file changed, 2 insertions(+), 25 deletions(-) + +commit e5f5ea01d0da4c4d877b93755523dc2a7f2ec049 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 19:57:11 2009 +0200 + + [glib] Fix poppler_annot_markup_get_date() + + Date field in Markup annots is also a PDF format date string, so it + should be parsed and the resulting time_t used to create a correct + GDate. + + glib/poppler-annot.cc | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 876ad1bcc8a7b2f37656bf15cee7eb888fd46ed4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 19:36:33 2009 +0200 + + [glib] Add info about the return value in poppler_annot_get_modified() + doc + + glib/poppler-annot.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8c54a15e1715721ee7af7e82c90b8dda3689c65f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 19:35:14 2009 +0200 + + [glib] Fix a typo in poppler_date_parse documentation + + glib/poppler-date.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 39d09fa237d06fa93b02eb916d2c0242c4e8fe85 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 19:29:32 2009 +0200 + + [glib] Add poppler_date_parse to parse PDF format date strings + + We need to make this public because the field M in the Annot + dictionary + might be a Date string (in PDF date format) or a text + string. According + to the PDF spec: "The preferred format is a date string as described + in + Section 3.8.3, “Dates,” but viewer applications should be + prepared to + accept and display a string in any format". The only way to know + whether + it's a PDF date string or not, is by trying to parse it. For this + reason + poppler_annot_get_modified() returns a gchar * instead of a + time_t. So, + viewers should try to parse the string in order to convert it to a + time_t, and if it fails to parse, use the date string as provided + by the + document. + + glib/Makefile.am | 2 ++ + glib/poppler-attachment.cc | 4 +-- + glib/poppler-date.cc | 66 + ++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-date.h | 30 ++++++++++++++++++++ + glib/poppler-document.cc | 45 ++++++------------------------ + glib/poppler-private.h | 2 +- + glib/poppler.h | 1 + + 7 files changed, 110 insertions(+), 40 deletions(-) + +commit 9c2714a3e1c02f445661618e24bcd27f1392b2b7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 18:08:06 2009 +0200 + + [glib] Implement poppler_annot_set_contents() + + glib/poppler-annot.cc | 25 +++++++++++++++++++++++++ + glib/poppler-annot.h | 2 ++ + 2 files changed, 27 insertions(+) + +commit eec550e8b3cf96aefed9b03a78d365c2848fb8f2 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Apr 21 18:06:34 2009 +0200 + + Add setContents() to modify the annot contents + + poppler/Annot.cc | 26 +++++++++++++++++++++++++- + poppler/Annot.h | 4 ++++ + 2 files changed, 29 insertions(+), 1 deletion(-) + +commit 047a8870a8cea9b680080e0d3bf68d0685431233 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 20 23:38:53 2009 +0200 + + In case of err3 or err2 in readPageTree we need to free kidRef too + + poppler/Catalog.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit cb61b555f2c4db8685dec5491ca86570c962aab6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Apr 18 18:30:04 2009 +0200 + + Extend test-poppler-glib to show more page annotations and actions + + Based on path by Thomas Viehmann <tv@beamnet.de> + + glib/test-poppler-glib.cc | 68 + +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 68 insertions(+) + +commit 2221b8a9ae5e986c79ea3f6c9f3b0246d328c7ab +Author: Matthias Franz <matthias@ktug.or.kr> +Date: Sun Apr 19 23:29:18 2009 +0200 + + Fix decryption using owner password on some pdf + + See bug #21270 + + poppler/Decrypt.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e20efbf6cc676758b8ef7d2ad607560fcdbbf89e +Author: Peter Kerzum <kerzum@yandex-team.ru> +Date: Fri Apr 17 22:14:26 2009 +0200 + + Fix typo in GfxFont.cc + + poppler/GfxFont.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit b760debea03380280d72cd39d792cbc1a380a87c +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 17 21:04:26 2009 +0200 + + Fix rendering of axial shadings + + Fixes bug #19896 + + poppler/Gfx.cc | 102 + ++++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 62 insertions(+), 40 deletions(-) + +commit 9f1312f3d7dfa7e536606a7c7296b7c876b11c00 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 16 22:13:26 2009 +0200 + + Fix problems that happen when parsing broken JBIG2 files + + Fixes + CVE-2009-0799 xpdf OOB Read + CVE-2009-0800 xpdf Multiple Input Validation Flaws + CVE-2009-1179 xpdf Integer Overflow + CVE-2009-1180 xpdf Invalid free() + CVE-2009-1181 xpdf NULL dereference DoS + CVE-2009-1182 xpdf MMR Decoder Buffer Overflows + CVE-2009-1183 xpdf MMR Infinite Loop DoS + + Patch based on a patch by Derek Noonburg + Some files still hit the exit(1) in goo.c but at least none is + really crashing + + poppler/JBIG2Stream.cc | 447 + ++++++++++++++++++++++++++++++++++-------------- + poppler/JBIG2Stream.h | 4 + + 2 files changed, 324 insertions(+), 127 deletions(-) + +commit 284a92899602daa4a7f429e61849e794569310b5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 13 21:51:12 2009 +0200 + + Did a mistake in the gmalloc -> gmallocn commit, it's a 4 here not a 3 + + poppler/SplashOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9cf2325fb22f812b31858e519411f57747d39bd8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 11 00:31:57 2009 +0200 + + More gmalloc → gmallocn + + glib/poppler-page.cc | 2 +- + splash/Splash.cc | 8 ++++---- + splash/SplashBitmap.cc | 6 +++--- + splash/SplashFTFont.cc | 2 +- + 4 files changed, 9 insertions(+), 9 deletions(-) + +commit c399b2d512aa073b0d7cd8eb5413a4b43f0d6aef +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 11 00:26:23 2009 +0200 + + Revert part of last commit, i need more math classes :D + + poppler/JBIG2Stream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7b2d314a61fd0e12f47c62996cb49ec0d1ba747a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 11 00:23:04 2009 +0200 + + Be paranoid, use gmallocn or gmallocn3 in all gmalloc with * + + poppler/ArthurOutputDev.cc | 4 ++-- + poppler/CairoOutputDev.cc | 14 +++++++------- + poppler/GfxState.cc | 8 ++++---- + poppler/JBIG2Stream.cc | 4 ++-- + poppler/PSOutputDev.cc | 6 +++--- + poppler/SplashOutputDev.cc | 20 ++++++++++---------- + 6 files changed, 28 insertions(+), 28 deletions(-) + +commit 0131f0a01cba8691d10a18de1137a4744988b346 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 11 00:20:55 2009 +0200 + + Add gmallocn3 that does the same as gmallocn but with 3 arguments + + goo/gmem.cc | 22 ++++++++++++++++++++++ + goo/gmem.h | 2 ++ + 2 files changed, 24 insertions(+) + +commit 75c3466ba2e4980802e80b939495981240261cd5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 10 18:05:54 2009 +0200 + + Make it compile in Solaris + + See bug #21080 + + poppler/CairoFontEngine.cc | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 3210970dc1d6faf51bce59bb7ecb6b881f9c0fe6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 10 13:09:37 2009 +0200 + + [glib] Print annotations with the print flag enabled + + glib/poppler-page.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit b0b9798c85c7c6d6f336f73135a98974897b9f60 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 30 23:26:39 2009 +0200 + + Fix clip test for fonts + + Fixes bug 20950 + I really don't remember why i put that -1 maybe i got mislead by + SplashClip::testRect + having a +1, but the idea of the +1 is correct because it's ints + vs floats + + splash/SplashFTFont.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5c08f57aa80092954746d722bb13655aee3f162c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 29 23:52:31 2009 +0200 + + Forgot Ross copyright + + poppler/TextOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit c6d3e7884010ebdcc961d81ca8c692870fc9b139 +Author: Ross Moore <ross@maths.mq.edu.au> +Date: Sun Mar 29 23:46:09 2009 +0200 + + Fix extraction of some ActualText content + + Fixes bug #20013 + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4b3f7cbcb6ccdfa8b18d8da5f7074f4140b776a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 25 22:16:07 2009 +0100 + + Fix getGlyphAdvance to behave correctly on font size changes + + Fixes bug #20769 + + splash/SplashFTFont.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4acde05ac4d0b03466c949138321cc3445a14158 +Author: Eric Toombs <ewtoombs@uwaterloo.ca> +Date: Wed Mar 25 21:11:03 2009 +0100 + + Remove case-insensitive matching of filenames in PDFDoc constructor + + poppler/PDFDoc.cc | 39 ++++++++++----------------------------- + 1 file changed, 10 insertions(+), 29 deletions(-) + +commit 120c7f6697ed1edaff6e17ae1ed202c69f03a73c +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 24 22:56:33 2009 +0100 + + declare the matrix at the beginning + + poppler/ArthurOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 441a9cd56935bfe2d8fddc5d3bc2c0104aeffaca +Author: Eric Toombs <ewtoombs@uwaterloo.ca> +Date: Sun Mar 22 22:50:14 2009 +0100 + + Improved error reporting of ErrOpenFile errors + + See bug #20660 for more information + + glib/poppler-document.cc | 14 +++++++++--- + poppler/PDFDoc.cc | 54 + +++++++++++++++++++++++++++------------------- + poppler/PDFDoc.h | 8 +++++++ + 3 files changed, 51 insertions(+), 25 deletions(-) + +commit 16af0ced4a0762f2f538135bd8dd72b469f6fdca +Author: Michael K. Johnson <a1237@danlj.org> +Date: Sat Mar 21 16:14:06 2009 +0100 + + Support rendering non-square pixels in pdftoppm + + Bug #20702 + + utils/pdftoppm.1 | 16 ++++++++++++++-- + utils/pdftoppm.cc | 37 ++++++++++++++++++++++++++++++++----- + 2 files changed, 46 insertions(+), 7 deletions(-) + +commit a103c60abd5fe4c721b099c005daf22d6350c355 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 21 15:47:12 2009 +0100 + + Update version we need of Qt4 + + CMakeLists.txt | 2 +- + configure.ac | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit c4b1754fdd3a4649551556de2655c8291daafddf +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 21 13:29:38 2009 +0100 + + Bump cairo dependency to 1.8.4 + + Cairo 1.8.4 fixes and important bug that affects the Type 3 font + rendering + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 50c4ee413929e5a70133839e3cde039da738fab2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 18 22:00:05 2009 +0100 + + Add more _checkoverflow variants, rework internals + + goo/gmem.cc | 92 + +++++++++++++++++++++++++++++------------------------------ + goo/gmem.h | 4 ++- + 2 files changed, 48 insertions(+), 48 deletions(-) + +commit 121c44db0884f0d70ba1470a66aa78441257c421 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 20 23:25:19 2009 +1030 + + Fix cairo luminosity smask when cairo ctm != identity + + poppler/CairoOutputDev.cc | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit 3f55aff56a1d2002ba79f3efba5eb77e94575439 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Mar 19 22:34:23 2009 +1030 + + Fix bug in cairo backend with nested masks + + The previous smask was not restored after a q/Q pair or form xobject. + + poppler/CairoOutputDev.cc | 18 +++++++++++++++++- + poppler/CairoOutputDev.h | 5 +++++ + 2 files changed, 22 insertions(+), 1 deletion(-) + +commit 4cc3cb8992ac554352d68e97563823b9bbd556ce +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Mar 20 12:38:28 2009 +0100 + + Bump cairo dependency to 1.8.4 + + Cairo 1.8.4 fixes and important bug that affects the Type 3 font + rendering + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit da94fe717a1ab60fb074fae61d582d1ee7151fc2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 16 22:54:27 2009 +0100 + + Fix parsing of border arrays + + Fixes 19761 + + poppler/Annot.cc | 54 + ++++++++++++++++++++++++++++++++++++------------------ + 1 file changed, 36 insertions(+), 18 deletions(-) + +commit 8df0323f1ca4548a5d5824ece8736b356ce7ca42 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 12 00:09:03 2009 +0100 + + Really fix jpeg lib init order? + + poppler/DCTStream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12aac6774fc6f92def3d5567051117951cc32223 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 11 23:00:37 2009 +0100 + + fontCIDType2OT fonts can also have a CIDToGIDMap + + Fixes bug #20605 + + poppler/GfxFont.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0ca9ae2848808d15e7a2b00f5eb33bb8f990c887 +Author: Vincent Torri <vtorri@univ-evry.fr> +Date: Wed Mar 11 00:39:59 2009 +0100 + + remove the fortran check during the initialisation of libtool + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 710e329a3a6a9ee2eed997c9eeaea21c44237423 +Author: Vincent Torri <vtorri@univ-evry.fr> +Date: Wed Mar 11 00:37:11 2009 +0100 + + Add AC_CONFIG_MACRO_DIR([m4]) + + It is used by autoreconf to trace changes in m4 macros that are in + the m4/ subdirectory. + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit d15e47158ae31909212d3875159046afb208de97 +Author: Vincent Torri <vtorri@univ-evry.fr> +Date: Wed Mar 11 00:36:27 2009 +0100 + + Better check for pkg-config + + configure.ac | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit b3f569f9a6c117c097acac52ae6552209fcd2101 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 11 00:25:07 2009 +0100 + + Check there is an optional content config before using it + + Fixes bug #20587 + + poppler/Gfx.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7a5d1e57b2757c986da17f7238415b927e73127f +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Mar 9 22:54:58 2009 +0100 + + Check for pkgconfig before using it + + At the moment if pkgconfig is not installed, an unhelpful syntax + error appears when testing for freetype. Identify the problem + earlier on + + configure.ac | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 8dc9e4d57a4759de2b56a87d9bace80d5d563fef +Author: Marc Kleine-Budde <mkl@pengutronix.de> +Date: Sun Mar 8 15:29:02 2009 +0100 + + use AC_CHECK_HEADER to find headers + + The original m4/libjpeg.m4 used AC_FIND_FILE to look for jpeg + header file. + This test is not cross-compiling save. This patch uses the autoconf + function + AC_CHECK_HEADER to look for the jpeg header, which works in the + native and + the cross compiling scenaria. + Bug #20538 + + m4/libjpeg.m4 | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit bf2e2f056cadbc488cd3e9576b44beb34689ec81 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 8 13:44:44 2009 +0100 + + Add the new croptting options explanations + + utils/pdftotext.1 | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 663d9e5a448641421d290dd228be692a0f236b9c +Author: Jan Jockusch <jan@jockusch.de> +Date: Sun Mar 8 13:44:20 2009 +0100 + + Make pdftotext to accept cropping options like pdftoppm + + Bug #20331 + + utils/pdftotext.cc | 29 ++++++++++++++++++++++++++++- + 1 file changed, 28 insertions(+), 1 deletion(-) + +commit cc4b61f19b69c31d9a73ae7361c4b6a94345d1c2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 8 12:55:45 2009 +0100 + + Fix the previous fix + + I should stop listening to people without checking that what they + say is + correct + + poppler/DCTStream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a4a73cd9f9ee9767d74fbb44ffe083d2057a9d61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 8 12:44:06 2009 +0100 + + I should compile before commiting :-/ + + poppler/DCTStream.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 6a6b3cc91053e771a67dffa979076d130f87ff11 +Author: Ryszard Trojnacki <rysiek@menel.com> +Date: Sun Mar 8 12:38:42 2009 +0100 + + set up the error-manager before calling jpeg_create_decompress + + Bug #20484 + + poppler/DCTStream.cc | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 4dfa7460ddc4b5684d5ef8db17efa50b95b7b735 +Author: Nick Jones <nick.jones@network-box.com> +Date: Tue Mar 3 00:55:53 2009 +0100 + + Do not blindly follow loops parsing OutlineItem + + More details in bug 18364 + + poppler/Outline.cc | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit de3131ae38fc9442b198d4d7b0c57c6939ad66ce +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 2 15:20:07 2009 +0100 + + [Qt4] adapt to the new PDFDoc saving API + + store the error code instead of the bool + + qt4/src/poppler-pdf-converter.cc | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit dac0542eb793603090416f1b7712ca08253f1e7f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 2 09:54:22 2009 +0100 + + [glib] Correctly handle doc->saveAs() error code. + + Fixes bug #19915. + + glib/poppler-document.cc | 37 +++++++++++++++++++++++++++++++++---- + 1 file changed, 33 insertions(+), 4 deletions(-) + +commit bfc6572614727565d883b9545d4b6665f3c2fdfe +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 28 13:16:49 2009 +0100 + + Return an error code instead of a GBool when saving + + poppler/PDFDoc.cc | 22 +++++++++++----------- + poppler/PDFDoc.h | 8 ++++---- + 2 files changed, 15 insertions(+), 15 deletions(-) + +commit f7c88148fdb671736d81dd5f01a3fb68f944510c +Author: Koji Otani <sho@bbr.jp> +Date: Wed Feb 25 23:38:35 2009 +0100 + + Fix cache shifting + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 305af8cdb6822858e152e1f930bba2ce3904bf1b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 25 22:40:24 2009 +0100 + + Make JBIG2Stream not crash in 2009-41414141.pdf + + poppler/JBIG2Stream.cc | 151 + +++++++++++++++++++++++++++--------------------- + 1 file changed, 85 insertions(+), 66 deletions(-) + +commit 26a8217160c1eaeeadb92023b27e68f402e38dd0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 22 18:14:15 2009 +0100 + + Check if cairo_shape is not NULL before using it. + + We were checking shape instead. It fixes a crash with some documents. + See bug #17337. + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5e68e52da65b4d8c3817e5fbb6f1a937da321d48 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 21 18:03:15 2009 +0100 + + [Qt4] do not assume the destination file name for links is ASCII + + qt4/src/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 439cb397fed33df627a09c70788d72bef20dc872 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 21 18:02:36 2009 +0100 + + [Qt] do not assume the destination file name for links is ASCII + + qt/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3ea5f45ad3e5a55e577a2e45f61b55932ed17013 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 21 17:46:30 2009 +0100 + + [glib] Make sure filename is valid utf-8 for remote dests + + glib/poppler-action.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit b5989e4ffece6c1831610ee163d05fd80386a001 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 21 17:45:18 2009 +0100 + + Use the UF entry when present in Filespec dictionary + + poppler/FileSpec.cc | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 943fca42b5fa815fad650e42da4ad6e806adc3b1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 21 12:08:00 2009 +0100 + + [glib] Add a macro to define boxed types + + glib/poppler-action.cc | 26 +----------- + glib/poppler-annot.cc | 15 ++----- + glib/poppler-document.cc | 44 +++++---------------- + glib/poppler-page.cc | 99 + +++++++++------------------------------------- + glib/poppler-private.h | 20 ++++++++++ + 5 files changed, 53 insertions(+), 151 deletions(-) + +commit 7406337ed2d38a86308f20f8273a152538e524de +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 21 11:11:20 2009 +0100 + + [glib] Use template files to create poppler-enums + + glib/Makefile.am | 43 + ++++++++++++---------------------------- + glib/poppler-enums.c.template | 44 + +++++++++++++++++++++++++++++++++++++++++ + glib/poppler-enums.h.template | 25 +++++++++++++++++++++++ + 3 files changed, 82 insertions(+), 30 deletions(-) + +commit 29bc9d1dd115b5d400975533c3924993c3adae30 +Author: Thomas Viehmann <tv@beamnet.de> +Date: Sat Jan 17 13:16:38 2009 +0100 + + glib small doc comment corrections + + glib/poppler-attachment.cc | 2 +- + glib/poppler-layer.cc | 2 ++ + glib/poppler.cc | 2 -- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit a06e715d89a99b909b8e7b73b733066c67b1ade3 +Author: Thomas Viehmann <tv@beamnet.de> +Date: Sat Jan 17 12:58:20 2009 +0100 + + Make glib API reference more complete + + glib/reference/poppler-docs.sgml | 2 + + glib/reference/poppler-sections.txt | 55 +++++ + glib/reference/tmpl/poppler-action.sgml | 9 +- + glib/reference/tmpl/poppler-annot.sgml | 368 + +++++++++++++++++++++++++++++++ + glib/reference/tmpl/poppler-layer.sgml | 79 +++++++ + 5 files changed, 511 insertions(+), 2 deletions(-) + +commit 3a21dafa46d42d86daec440a85b9d63b292a3c88 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 3 21:33:00 2009 +0100 + + Fix cache shifting + + If we do + for (i = 0;i < GFX_ICCBASED_CACHE_SIZE-1 && cache[i].num > 0;i++) { + cache[i+1] = cache[i]; + what we do at the end is copy position 0 to all others so + we need to do it in the reverse order + + poppler/GfxState.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 0ed3fd52bb2d3375ed302285b18f076721b8028e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 1 10:37:25 2009 +0100 + + [glib-demo] Fix a typo in format string + + glib/demo/page.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2df6d530cd9acd8648a6196031218ef10e7b3891 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 29 00:51:13 2009 +0100 + + Add line that for some reason was not imported from xpdf file + + Fixes bug 19789 + + utils/ImageOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1fc342eadcbbb41302f190b215c5daf23c9ec9b1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 28 22:53:43 2009 +0100 + + Fix crash on unexepcted Form Opt value + + Fixes crash on bug 19790 + + poppler/Form.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b1d4efb082ac3dadd7752a557e5aeb6651e17471 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 27 00:26:08 2009 +0100 + + PostScriptFunction::transform optimization + + Do not create and destroy a PSStack each time + PostScriptFunction::transform is called gives a 7% speedup on heavy + PostScriptFunction::transform pdf like nytimes firefox ad + + poppler/Function.cc | 12 ++++++++---- + poppler/Function.h | 15 +++++++++++++++ + 2 files changed, 23 insertions(+), 4 deletions(-) + +commit 90f95127d8d89cfcadeb7d701437ab07ce4a8a61 +Author: Koji Otani <sho@bbr.jp> +Date: Sun Jan 25 23:17:39 2009 +0100 + + Cache last 5 GfxICCBasedColorSpace + + poppler/GfxState.cc | 60 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/GfxState.h | 15 +++++++++++++ + 2 files changed, 75 insertions(+) + +commit d3f04f537fb3e963c149a7e2d8d83c7cb19da8c0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 23 23:08:46 2009 +0100 + + Do not crash in some PDF we don't parse correctly + + Fixes bug 19702 + + poppler/JBIG2Stream.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 3990c9e52da7b17215506857c792c90a37ebac79 +Author: Koji Otani <sho@bbr.jp> +Date: Mon Jan 19 09:53:00 2009 +0100 + + Fix a problem in cairo backend when using a CMYK Profile + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6e51ae7fe8b9dc8ad52b735f2fe056f8ea8f1dcb +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 15 22:33:04 2009 +0100 + + calculate the limit in a way that one does not access an invalid + index of the matrix + + poppler/DCTStream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ea2aa7bd1ceb0e3282398f52683e4f52ef401f74 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 15 22:18:48 2009 +0100 + + Forgot my copyrights + + poppler/DCTStream.cc | 2 +- + poppler/DCTStream.h | 2 +- + poppler/Stream.cc | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit d65dd23752ec14635d0d224afa7dd605f98a10a4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 15 22:17:14 2009 +0100 + + Minor optimizations + + poppler/DCTStream.cc | 17 ++++++++--------- + poppler/DCTStream.h | 3 ++- + poppler/Stream.cc | 3 ++- + 3 files changed, 12 insertions(+), 11 deletions(-) + +commit d3d2910f757dfc3e141aed62aa970136f9d7186f +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 11 00:40:46 2009 +0100 + + fix a (relatively small) memory leak when asking for a document-level + JS + + poppler/Catalog.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 869584a84eed507775ff1c3183fe484c14b6f77b +Author: Jonathan Kew <jonathan_kew@sil.org> +Date: Sat Jan 10 18:28:47 2009 +0100 + + Add the possibility of setting the datadir on runtime + + poppler/GlobalParams.cc | 27 ++++++++++++++++++++------- + poppler/GlobalParams.h | 5 ++++- + 2 files changed, 24 insertions(+), 8 deletions(-) + +commit cf112dceb1d6653beae73ce2fac6fb5eee48ff33 +Author: Koji Otani <sho@bbr.jp> +Date: Sat Jan 10 18:11:20 2009 +0100 + + Fix some problems with color management in CMYK Color Profile. + + Fixes bug 19483 + + poppler/GfxState.cc | 106 + +++++++++++++++++++++++++-------------------------- + 1 file changed, 53 insertions(+), 53 deletions(-) + +commit 6dd77338d16f80760ae32ff9f3e2be9768fc0c49 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 8 11:49:45 2009 +0100 + + [Qt4] use the cropbox for the annotations coordinates + + Fixes bug #18558. + + qt4/src/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 69c07c031159d36dde52609bffa6d48c3c56cef5 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 8 00:59:19 2009 +0100 + + update Poppler copyright to 2009 + + msvc/poppler/poppler-config.h | 2 +- + poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 79e0eea85cf063c6323caafbec97f3d71fc04ca2 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 8 00:57:03 2009 +0100 + + remove old cmake modules, add a new one + + Makefile.am | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 0e6420ece2d6fcc046d5814b48a2754fb86771e2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 7 23:33:02 2009 +0100 + + Require cmake 2.6.0, remove two cmake files provided upstream + + CMakeLists.txt | 4 +- + cmake/modules/FindFreetype.cmake | 74 + --------------------- + cmake/modules/FindPackageHandleStandardArgs.cmake | 58 ---------------- + glib/CMakeLists.txt | 2 +- + 4 files changed, 3 insertions(+), 135 deletions(-) + +commit a69add73bf7bef17c677c735db77934ba67188a5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 7 19:06:13 2009 +0100 + + Update copyright notices + + poppler/FontInfo.cc | 1 + + poppler/FontInfo.h | 1 + + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-fontinfo.cc | 2 +- + qt4/src/poppler-form.cc | 1 + + qt4/src/poppler-form.h | 1 + + qt4/src/poppler-private.h | 2 +- + qt4/src/poppler-qt4.h | 2 +- + 8 files changed, 8 insertions(+), 4 deletions(-) + +commit 18d584158a781fecb4f696b01fb4d17803ce7d7a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 7 17:55:48 2009 +0100 + + Add lcms option to cmake buildsystem + + CMakeLists.txt | 9 +++++++++ + cmake/modules/FindLCMS.cmake | 37 +++++++++++++++++++++++++++++++++++++ + config.h.cmake | 3 +++ + 3 files changed, 49 insertions(+) + +commit 140b8ed97416f9c2ec02eb749ca45ca50bd651a8 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Jan 7 17:43:44 2009 +0100 + + Add initial support for color management + + configure.ac | 19 ++ + poppler/GfxState.cc | 697 + +++++++++++++++++++++++++++++++++++++++++++++++---- + poppler/GfxState.h | 74 +++++- + poppler/Makefile.am | 5 + + 4 files changed, 738 insertions(+), 57 deletions(-) + +commit bdc76dc811a6e4d5fd929bbdc8cd3300aeaea31f +Author: Pino Toscano <pino@kde.org> +Date: Tue Jan 6 15:45:37 2009 +0100 + + [Qt4] apidox improvements for the font functions of Document; mark + scanForFonts() as deprecated + + qt4/src/poppler-qt4.h | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 6630e715714161cd803fc064f5d3cf880f42b0a5 +Author: Pino Toscano <pino@kde.org> +Date: Tue Jan 6 15:36:19 2009 +0100 + + tell Doxygen to consider Q_DECL_DEPRECATED as empty + + qt4/src/Doxyfile | 1 + + 1 file changed, 1 insertion(+) + +commit d748d430b106580b8be29ca3ec75caf05b55812e +Author: Pino Toscano <pino@kde.org> +Date: Tue Jan 6 15:24:25 2009 +0100 + + [Qt4] Add a FontIterator for iterating through the fonts of the + document, page by page. + + This new iterator class is the new preferred way for getting the + fonts of a document in a page-by-page mode. + * Document::fonts() is adapted to use it, instead of relying on + scanForFonts() + * scanForFonts() is ported to FontIterator, but keeping the old + behaviour ("i can scan the document only once") + * added unit tests for fonts(), scanForFonts() and FontIterator + + qt4/src/poppler-document.cc | 27 +++++--- + qt4/src/poppler-fontinfo.cc | 36 +++++++++++ + qt4/src/poppler-private.h | 27 ++++++-- + qt4/src/poppler-qt4.h | 65 +++++++++++++++++++ + qt4/tests/check_fonts.cpp | 149 + +++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 291 insertions(+), 13 deletions(-) + +commit b9804542bb50216786dc11ca16efd84304f4b832 +Author: Pino Toscano <pino@kde.org> +Date: Tue Jan 6 15:16:53 2009 +0100 + + Add the possibility to set the first page to scan. + + The default value is 0 (= first page), so it should be compatible + with any usage so far. + + poppler/FontInfo.cc | 4 ++-- + poppler/FontInfo.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit af74fef03bfbd79334da5612c63c7793952542f9 +Author: Warren Toomey <poppler@tuhs.org> +Date: Tue Jan 6 01:36:31 2009 +0100 + + Add forgotten file to let the autotools based system build + + m4/libpng.m4 | 99 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 99 insertions(+) + +commit ae588500f62bab5666174ff3b1564c414c5a76c5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 6 01:35:38 2009 +0100 + + Fix the cmake buildsystem + + CMakeLists.txt | 6 ++++++ + config.h.cmake | 3 +++ + utils/CMakeLists.txt | 4 ++++ + 3 files changed, 13 insertions(+) + +commit 940d060a14712c09da427e2fac4ec579f7291b0f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 6 01:27:06 2009 +0100 + + do not leak fName if fopen fails + + utils/HtmlOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 7be9198adb940ad7c5fffc6db0158cf7042e1b8f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 6 01:24:15 2009 +0100 + + Do not leak pgNum and imgnum if fopen fails + + utils/HtmlOutputDev.cc | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit dfba6c022b150553cb2b18b027e661b3b4625ce7 +Author: Warren Toomey <poppler@tuhs.org> +Date: Tue Jan 6 01:16:31 2009 +0100 + + Make pdftohtml output png images when the image stream is not a jpeg + + configure.ac | 14 ++++++ + utils/HtmlOutputDev.cc | 126 + +++++++++++++++++++++++++++++++++++++++++++++--- + utils/HtmlOutputDev.h | 3 +- + utils/Makefile.am | 4 ++ + 4 files changed, 140 insertions(+), 7 deletions(-) + +commit 0963c276ba972a36c2895e4fe1c7475acd489738 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 4 16:54:32 2009 +0100 + + Fix some checked checkboxes not rendering correctly + + If we are forcing ZaDb/ZapfDingbats to correctly draw a checkmark + in the checkbox, but the file does not have such font defined we + need to create a fake one so the system really renders it + Fixes bug 19359 + + poppler/Annot.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- + poppler/Annot.h | 2 ++ + poppler/Gfx.h | 7 ++++--- + 3 files changed, 53 insertions(+), 5 deletions(-) + +commit 46128cf83b322c112eb0c409c20052bdb2ea4a37 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 4 14:21:15 2009 +0100 + + Remove wrong and unused FormWidget(FormWidget *dest) contructor + + poppler/Form.cc | 11 ----------- + poppler/Form.h | 3 +-- + 2 files changed, 1 insertion(+), 13 deletions(-) + +commit 5203aefc41fa47c461812cc46f28281edd226515 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 4 14:03:16 2009 +0100 + + Plug some memory leaks + + poppler/Annot.cc | 5 ++++- + poppler/Form.cc | 4 +++- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 5fb7ec7e6af4cfb2b256a5b9b9752e68330b4aec +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 30 23:46:59 2008 +0100 + + If Length2 is zero just write until we find EOF of the stream + + Fixes exporting to PS of the two pdf i have that have fonts with + Length2 set to 0 + + poppler/PSOutputDev.cc | 26 +++++++++++++++++++++----- + 1 file changed, 21 insertions(+), 5 deletions(-) + +commit ca35fdbc7c31dae432d775b6c087a83fa9b897fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 30 23:03:57 2008 +0100 + + We need spaces here too to satify other consumer parsers + + poppler/PDFDoc.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3c07c73e07a9cb59ee4c23ca60d2adce92de45f7 +Author: Pino Toscano <pino@kde.org> +Date: Tue Dec 30 22:21:27 2008 +0100 + + [Qt4-demo] load a document when passed via command line + + qt4/demos/main_viewer.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +commit aba0aaa896d634a51fbb3a3e6eae411be462f930 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 29 00:31:18 2008 +0100 + + More improvements in document writing + + Dictionary keys are names so need to be sanitized + Add a space after num gen obj + + poppler/PDFDoc.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit e5b93a847ae4e20a77fecef0938da4f14dfbe3eb +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 28 22:59:14 2008 +0100 + + Let compiler figure out CDECL + + CDECL is a compiler specific macro to specify C calling convention. + + On Windows, some functions must be forced to use this calling + convention. + To do this, you can use the macro CDECL, which is defined in windef.h. + + Poppler should not try to be smarter than the compiler and try + to guess + the correct definition for CDECL. Instead it should rely on the + definitions in the windef.h file provided by the compiler. + + On Unix, specifying a calling convention is not nescessary, so + CDECL can + be an empty definition. + + poppler-config.h.cmake | 8 ++------ + poppler/poppler-config.h.in | 8 ++------ + 2 files changed, 4 insertions(+), 12 deletions(-) + +commit de70c0aeb37d788f595b0574796844f51ddedec1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 28 21:21:12 2008 +0100 + + [qt4] improve doc a bit + + qt4/src/poppler-form.h | 2 +- + qt4/src/poppler-qt4.h | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit effb32658019e09dc86c017e39154fd554fc94f8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 28 02:56:30 2008 +0100 + + Form Rects are against the cropbox, not the media box + + Fixes second pdf at kde bug 161327 + + qt4/src/poppler-form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f10561f3b1c90acc030d973399316bfca5f495e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 28 01:44:25 2008 +0100 + + Fix my last commit, copy&paste is really evil + + goo/GooString.cc | 9 +++++---- + goo/GooString.h | 2 +- + 2 files changed, 6 insertions(+), 5 deletions(-) + +commit 217b46484ff56bfd5906b293ebee70b82cc0263d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 28 01:29:41 2008 +0100 + + Move PSOutputDev::filterPSName to GooString::sanitizedName so i can + use it from PDFDoc::writeObject + + goo/GooString.cc | 36 +++++++++++++++++++++++++++++++++++ + goo/GooString.h | 7 +++++++ + poppler/PDFDoc.cc | 7 ++++++- + poppler/PSOutputDev.cc | 49 + +++++++++--------------------------------------- + poppler/PSOutputDev.h | 3 +-- + 5 files changed, 59 insertions(+), 43 deletions(-) + +commit f41fa9ee71aef5539cf9976c79b32bf1713c8167 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 26 22:56:12 2008 +0100 + + Change the overflow check to the same used in gmem.cc, much more + easy to understand + + poppler/XRef.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit b8ae7d91dedc9a75200b6050628ec2740af84b98 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Dec 26 22:28:09 2008 +0100 + + Fix compile warnings on auto imports for mingw32 + + configure.ac | 3 +++ + glib/Makefile.am | 2 +- + glib/demo/Makefile.am | 2 ++ + test/Makefile.am | 2 ++ + utils/Makefile.am | 2 ++ + 5 files changed, 10 insertions(+), 1 deletion(-) + +commit ba47bd2ba05f883306606eda30bff17bd4a8eec6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 26 19:47:42 2008 +0100 + + BaseFile.h has never been used and it fact it's not part of xpdf + sources + + Fixes bug 19298 + + CMakeLists.txt | 1 - + poppler/BaseFile.h | 82 + --------------------------------------------------- + poppler/Makefile.am | 1 - + 3 files changed, 84 deletions(-) + +commit 84366d9e63b0d6a5ee1aae2463648cfc2ff5e1b8 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Dec 24 19:27:19 2008 +0100 + + Let libtool build DLLs on windows too + + configure.ac | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 08cef528f2e51cc62cff4125f179021ad9555317 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Dec 24 17:48:46 2008 +0100 + + Fix compile warning on string literal format + + test/pdf-inspector.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0606b4bba8e889204c7b7c9d376f63b659f83a4f +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Dec 24 17:48:10 2008 +0100 + + Fix compile warnings on parentheses and/or + + poppler/CairoOutputDev.cc | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit eba2232cabd5fb1e177db2a6053f0d1a0aee882b +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Dec 24 17:46:32 2008 +0100 + + Fix some more warnings + + test/gtk-cairo-test.cc | 11 ----------- + test/pdf-inspector.cc | 9 +++++---- + 2 files changed, 5 insertions(+), 15 deletions(-) + +commit c80431eb1626d89e7b615e5a5149d3436b554b66 +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Dec 22 09:28:47 2008 +0100 + + Fix compile warning on format type + + glib/test-poppler-glib.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fda181c35b7c7500b6d3c6ca9d454addd54929c5 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 22 00:53:44 2008 +0100 + + group condition within brackets + + poppler/ArthurOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c1beeecbd6cbf82811d70c75cb24059b4b492abe +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 22 00:46:49 2008 +0100 + + [demo] use the proper format field for gsize types + + glib/demo/attachments.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bfb975466f0ff78e9e292b6af7cac66e4c331456 +Merge: 3e27892 ea3546f +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 22 00:29:38 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 3e2789257f5fc4ae0573a0c62ea380d8e83a5bb5 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 22 00:24:23 2008 +0100 + + [Qt] deserialize also the value of 'right' + + qt/poppler-link.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 7c053ab7623cea1ac650d3e960d2d91a1ef21557 +Author: Pino Toscano <pino@kde.org> +Date: Mon Dec 22 00:19:02 2008 +0100 + + [Qt] move in a .cc file the implementation of the QString<->GooString + functions and DocumentData::addTocChildren() + + qt/CMakeLists.txt | 1 + + qt/Makefile.am | 1 + + qt/poppler-document.cc | 10 ---- + qt/poppler-page.cc | 1 + + qt/poppler-private.cc | 147 + ++++++++++++++++++++++++++++++++++++++++++++++++ + qt/poppler-private.h | 106 +++------------------------------- + 6 files changed, 157 insertions(+), 109 deletions(-) + +commit ea3546f84c5335c58cdb2906b1a1a4656be9c8ea +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 23:33:49 2008 +0100 + + Fix compile warnings on signed/unsigned comparison + + goo/gfile.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ca672ae51d2c1fa59a891717b418ba86b5e7345c +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 23:33:00 2008 +0100 + + Fix compile warnings on ignored pragma with mingw compiler + + poppler/Gfx.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 86cfe8ab2b4e0b600f3f6682701c2fcfbe5d0ca9 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 23:08:56 2008 +0100 + + Fix compile warnings on signed/unsigned comparison + + poppler/GfxFont.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit e34af7ffe0a4024e2eb39314bdb09eb9a662e53e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 21 22:16:39 2008 +0100 + + Update copyright of last commits + + poppler/TextOutputDev.cc | 1 + + poppler/TextOutputDev.h | 2 +- + qt4/src/poppler-page.cc | 1 + + 3 files changed, 3 insertions(+), 1 deletion(-) + +commit f6d84dcfc9cc587c7408af79b1ee7658d456f8d8 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 22:09:00 2008 +0100 + + Fix compile warning to suggest parentheses and/or + + poppler/TextOutputDev.cc | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 15205403eaa95d6fba0e36983de993877dd3a983 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 21:59:45 2008 +0100 + + Fix warning to suggest parentheses inside shift + + poppler/PSOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit cc24f37e582bfc0069faf286da97a48fe4794db1 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 21:35:29 2008 +0100 + + Fix compile warning on ambiguous else + + test/perf-test.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a8cc4ad8c2da804f25db8cca1c85433d5a63307c +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 21:34:28 2008 +0100 + + Fix compile warning on format not a string literal + + test/perf-test.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3cbbf8226730aa7ee6273e154e4a9d58670a3cda +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 21 21:30:54 2008 +0100 + + Fix compile warning about uninitialized variable + + poppler/ABWOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit f675916277cb76cd1293225a1271f835a02148fb +Author: Pino Toscano <pino@kde.org> +Date: Sat Dec 20 23:23:10 2008 +0100 + + reset to NULL after being deleted + + found with poppler-qt4 unit tests =) + + poppler/TextOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit c976770c64e4c991fff27e413414473583b6fd86 +Author: Pino Toscano <pino@kde.org> +Date: Sat Dec 20 22:25:55 2008 +0100 + + [Qt4] use QHash instead of QMap where applicable + + using a hash table instead of a map mapes lookup faster; + in these cases we don't need the sorting a map gives + + qt4/src/poppler-page.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 944f6049a50eb3be9fb29174d67adc4ad1d0b9fe +Author: Pino Toscano <pino@kde.org> +Date: Sat Dec 20 20:13:43 2008 +0100 + + add find.c and text.c + + glib/demo/CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit ba91b889c3b50239e339938f3c9d31fffcd87d44 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 20 19:29:40 2008 +0100 + + Make destructor private in TextPage + + poppler/TextOutputDev.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 0da16537aa83f6ed6d8895c7e54266263a71c1cf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 19 19:08:21 2008 +0100 + + Refactor actual text code adding a new ActualText class + + It's used by both Text and Cairo ouput devices avoiding duplicated + code + in such classes. + + poppler/CairoOutputDev.cc | 108 +++--------------------- + poppler/CairoOutputDev.h | 7 +- + poppler/TextOutputDev.cc | 206 + ++++++++++++++++++++++++++------------------- + poppler/TextOutputDev.h | 34 ++++++-- + 4 files changed, 160 insertions(+), 195 deletions(-) + +commit 0f8ab301c633133eea3dbd4f2254f31c50e3c4a9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 14 13:12:34 2008 +0100 + + [glib-demo] Add find demo + + glib/demo/Makefile.am | 2 + + glib/demo/find.c | 282 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/find.h | 31 ++++++ + glib/demo/main.c | 4 +- + 4 files changed, 318 insertions(+), 1 deletion(-) + +commit 88df9e9aa9adb53f0a9714ea404d46f111495df3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 14 11:54:35 2008 +0100 + + [glib-demo] Add Text demo + + glib/demo/Makefile.am | 2 + + glib/demo/main.c | 4 +- + glib/demo/text.c | 175 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/text.h | 31 +++++++++ + 4 files changed, 211 insertions(+), 1 deletion(-) + +commit 5b0f2355d55a5104820fd0bf16b4e76b25959de4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 14 11:49:00 2008 +0100 + + [glib] Use TextPage instead of TextOutputDev when cairo is enabled + + glib/poppler-page.cc | 148 + +++++++++++++++++++++++++++++++++--------------- + glib/poppler-private.h | 4 ++ + 2 files changed, 107 insertions(+), 45 deletions(-) + +commit 3ced71fb68d62308db7b9535367eafefb55d1cde +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 14 11:18:00 2008 +0100 + + Add optionally text support to CairoOutputDev + + If a TextPage is set, it'll be used when rendering so that we + don't need + to use TextOutputDev and render again. + + poppler/CairoOutputDev.cc | 144 + +++++++++++++++++++++++++++++++++++++++++++-- + poppler/CairoOutputDev.h | 19 +++++- + 2 files changed, 155 insertions(+), 8 deletions(-) + +commit 0bdad35cc4cfdb8da5acaf44678920b7a0025f99 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 14 11:14:12 2008 +0100 + + Add refcount support to TextPage + + poppler/TextOutputDev.cc | 12 +++++++++++- + poppler/TextOutputDev.h | 5 +++++ + qt4/src/poppler-page.cc | 2 +- + 3 files changed, 17 insertions(+), 2 deletions(-) + +commit f86514c3fbc867fc6457feacba23451e89993524 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Dec 17 00:36:39 2008 +0100 + + Fix wrong PS generation when a large image is in Patterns + + Bug 18908 + + poppler/PSOutputDev.cc | 114 + ++++++++++++++++++++++++++++++------------------ + 1 file changed, 72 insertions(+), 42 deletions(-) + +commit fc395eb90b418e43453acefb42cd04baf0b7ad40 +Author: Richard Airlie <richard.airlie@maglabs.net> +Date: Tue Dec 16 21:11:53 2008 +0100 + + Allow the use of cropbox in pdftoppm + + utils/pdftoppm.cc | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 80f415176952635a485356cf36048eee53396c25 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 16 20:37:39 2008 +0100 + + Make destructors private/protected since you are not supposed to + use them + + poppler/GfxFont.cc | 2 +- + poppler/GfxFont.h | 11 +++++------ + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit dbcebda953cb36a45a125aada68e85249fb73f43 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 15 20:10:31 2008 +0100 + + Do not leak on AnnotScreen destructor + + Fixes bug 19095 + + poppler/Annot.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit aaeb0d137232bf1cb11dc5e37b8b45b50c6f9c6a +Author: Pino Toscano <pino@kde.org> +Date: Fri Dec 12 00:43:19 2008 +0100 + + update the xpdf headers installation + + CMakeLists.txt | 32 +++++++++++++++++++++----------- + 1 file changed, 21 insertions(+), 11 deletions(-) + +commit 7c6527fa05389f705872aaaaff12e739b5d1577e +Author: Pino Toscano <pino@kde.org> +Date: Fri Dec 12 00:41:21 2008 +0100 + + don't install Function.cc, as it is not an header + + poppler/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 0179e21b128ffccb5afd13203137ab8435197609 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 12 00:16:38 2008 +0100 + + Be more helpful with bad boys that want to use poppler core directly + + fofi/Makefile.am | 10 ++++++++++ + splash/SplashClip.h | 2 +- + splash/SplashPath.h | 2 +- + splash/SplashXPath.h | 2 +- + 4 files changed, 13 insertions(+), 3 deletions(-) + +commit 401632e4eeb4b10b1183a820f32461da77e8e4f2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 12 00:14:04 2008 +0100 + + Try harder to look for openjpeg + + cmake/modules/FindLIBOPENJPEG.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ab539f46089702f60b96b1ba2b2bc1544173c264 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 11 23:15:45 2008 +0100 + + Fix crash when reading outline + + Fixes bug 19024. Last as reference is required if the item has + children (Table 8.4) so if there is no last reference, don't try to + read children. + + poppler/Outline.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit c9a755f9fd14511f43a2ca7fcda36bdd64bb1d87 +Author: Ilya Gorenbein <igorenbein@finjan.com> +Date: Sun Dec 7 17:59:19 2008 +0100 + + Fix memory leak + + Bug 18924 + + poppler/Page.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4cd364c179ae91ed383a8237ba1ad263952fd7aa +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 30 16:57:52 2008 +0100 + + add my copyright here + + qt4/src/poppler-private.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 6b1676deb773675d90469adc84c3de8dcdaf174c +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 30 16:56:43 2008 +0100 + + [Qt4] support URI actions for TOC items + + qt4/src/poppler-private.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit b5cd58b5565055fd0c13771461245ddcd80edfcf +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 30 16:34:57 2008 +0100 + + extract the LinkAction "serialization" in an own function, and make + it more safe + + qt4/src/poppler-private.cc | 85 + ++++++++++++++++++++++++++++++-------------- + 1 file changed, 59 insertions(+), 26 deletions(-) + +commit ee191363e22940ae7b06945e68c4738b17c78348 +Author: Pino Toscano <pino@kde.org> +Date: Sun Nov 30 16:17:32 2008 +0100 + + move the addTocChildren() implementation in the cpp + + qt4/src/poppler-form.cc | 1 + + qt4/src/poppler-page.cc | 1 + + qt4/src/poppler-private.cc | 65 + ++++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-private.h | 64 + ++----------------------------------------- + 4 files changed, 69 insertions(+), 62 deletions(-) + +commit f8eaabf1aa7e384619129a7509be85d0c3bfb825 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 30 13:33:12 2008 +0100 + + Update copyrights of the last commits + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5f4fedfae6098e25644ffe5d4b1ed0bac043841d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 29 19:51:27 2008 +0100 + + Use the Length specified in the Stream as initial bufSize + + This is a optimization to save a few reallocations, if the Length + value is incorrect it will still work + + poppler/JPEG2000Stream.cc | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 12f6d6ba2052fbdc8ea4ba7c7c9277e75bf170a5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 23 18:20:14 2008 +0100 + + Fix a crash when the second argument of opMarkPoint is not a + dictionary + + According to the spec "If any of the values are indirect references to + objects outside the content stream, the property list dictionary must + instead be defined as a named resource. + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 817e123a28e9f6b7e5be23f7ac2ba3bcec5e3f3f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 22 21:48:37 2008 +1030 + + Don't compare print flag for non Type 3 fonts in cairo font cache + + poppler/CairoFontEngine.cc | 7 ++++++- + poppler/CairoFontEngine.h | 4 +++- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit 68f8ade28764855d4f663607c50c8202b1268296 +Author: Albert Astals Cid <tsdgeos@samsung.localdomain> +Date: Sun Nov 23 10:54:46 2008 +0100 + + Compile with -pedantic + + Thanks to Bernard Leak for notifying + + test/pdf-inspector.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4a4fa7ed44a87e47a6078a1f7bb6f41071672ea7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Nov 18 20:11:07 2008 +0100 + + Fix a crash when selecting text in word mode + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a6f5032ab0d6edbf3879f39efff7916b1f7233da +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 16 18:24:06 2008 +0100 + + optContentConfig is not actually stored in PDFDoc but in Catalog + + poppler/PDFDoc.h | 1 - + 1 file changed, 1 deletion(-) + +commit b843ac34c6c4ca1580f99fa2220c59dfcd91f026 +Author: Pino Toscano <pino@kde.org> +Date: Sat Nov 15 14:49:02 2008 +0100 + + [Qt4] deserialize the value of the 'right' coordinate, too + + qt4/src/poppler-link.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 03061fdae49842556c9ff48e61914fc88502e1d8 +Author: Tim Mooney <enchanter@users.sourceforge.net> +Date: Thu Nov 13 22:32:22 2008 +0100 + + Fix build on Solaris 10 + Sun Studio 12. + + Fixes bug 17496 + + configure.ac | 14 ++++++++++++++ + test/Makefile.am | 6 ++++-- + 2 files changed, 18 insertions(+), 2 deletions(-) + +commit 17b18be4fd25f2ca2b4ed7382d9fda50410c44f1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 12 20:40:57 2008 +1030 + + Ensure cairo font matrix is invertable + + Fixes bugs #18254 and #18429 + + poppler/CairoOutputDev.cc | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit e2257e6916cd1067d43db9ed45f944413c61ed64 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 9 22:44:48 2008 +0100 + + Update copyrights of the last commits + + poppler/CairoFontEngine.cc | 1 + + poppler/CairoFontEngine.h | 1 + + poppler/Form.cc | 2 +- + poppler/Gfx.h | 1 + + poppler/OptionalContent.h | 1 + + qt4/src/poppler-optcontent.cc | 1 + + 6 files changed, 6 insertions(+), 1 deletion(-) + +commit 069f8ad9453e612e907b561aa50983c34400193d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 9 20:36:06 2008 +0100 + + MakeItBuild + + glib/CMakeLists.txt | 1 + + glib/demo/CMakeLists.txt | 1 + + 2 files changed, 2 insertions(+) + +commit 04025c4f65bbb7e4330f6d17d917a035c0906f3d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 9 17:03:20 2008 +0100 + + Fix a crash when initializing an Annot with a null catalog + + Forms crate a temp annot just to get the font size of the form field + passing a NULL catalog. + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 471255c5a3850984997d91c7850759eb0c7e8a9c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Nov 8 20:58:57 2008 +0100 + + [glib-demo] Add Optional Content demo + + glib/demo/Makefile.am | 2 + + glib/demo/layers.c | 511 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/layers.h | 31 +++ + glib/demo/main.c | 4 +- + 4 files changed, 547 insertions(+), 1 deletion(-) + +commit 7363c25e1d83332932d9b4fe16d7fb4e364da628 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 26 19:47:35 2008 +0100 + + [glib] Add Optional Content support + + glib/Makefile.am | 2 + + glib/poppler-document.cc | 377 + +++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-document.h | 12 ++ + glib/poppler-layer.cc | 201 ++++++++++++++++++++++++ + glib/poppler-layer.h | 43 ++++++ + glib/poppler-private.h | 21 +++ + glib/poppler.h | 3 + + glib/test-poppler-glib.cc | 52 ++++++- + 8 files changed, 710 insertions(+), 1 deletion(-) + +commit c674566f458b54097f21aae0d4bf8637146565c5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 26 19:42:53 2008 +0100 + + Fix memory leaks in OptionalContent + + poppler/OptionalContent.cc | 13 +++---------- + poppler/OptionalContent.h | 10 ++++++---- + 2 files changed, 9 insertions(+), 14 deletions(-) + +commit 06ca313b8ecb8abb8dec3b418d118525b7bb0fdf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 26 19:11:45 2008 +0100 + + Check annotation optional content properties before drawing it + + poppler/Annot.cc | 20 ++++++++++++-------- + poppler/Annot.h | 4 ++-- + 2 files changed, 14 insertions(+), 10 deletions(-) + +commit a6d58927b048aa043cb6b6ed3ee9aeb213578924 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Nov 8 20:50:40 2008 +0100 + + Do not show hidden optional content + + Before any draw operation we first check whether we are inside an + optional marked content element that is currently hidden. + + poppler/Gfx.cc | 113 + +++++++++++++++++++++++++++++++++++++++----------------- + poppler/Gfx.h | 7 +++- + 2 files changed, 84 insertions(+), 36 deletions(-) + +commit 5f168f991477e291290350a28f4a60a565e187b9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Oct 20 17:56:11 2008 +0200 + + [glib] Show action titles when printing the index in test program + + glib/test-poppler-glib.cc | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit a906d12e16748d9a40c0db4043a576fd3d004341 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Nov 8 20:20:00 2008 +0100 + + Minor code cleanup and consistency issues + + poppler/OptionalContent.cc | 22 +++++++++++----------- + poppler/OptionalContent.h | 8 ++++---- + qt4/src/poppler-optcontent.cc | 6 +++--- + qt4/tests/check_optcontent.cpp | 8 ++++---- + 4 files changed, 22 insertions(+), 22 deletions(-) + +commit e73c2ce906b7e1f06d641f7e0733aad6336b4091 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 19 12:44:13 2008 +0200 + + Delete the optContent object if it's invalid + + poppler/Catalog.cc | 4 ++++ + poppler/OptionalContent.cc | 3 +++ + poppler/OptionalContent.h | 5 +++++ + 3 files changed, 12 insertions(+) + +commit 2900e7e4c920d735d5a727e9e39f71df97bd7b93 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 8 18:12:47 2008 +0100 + + A new cairo is needed + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aaaecd2e86769d3a99e21577448a193711985958 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 22:47:30 2008 +0100 + + Do not abort if indexHighA is 'invalid', move it to the closest + valid value and try with it + + For the bug 18374 it works and does not seem a security problem + + poppler/GfxState.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 82f4228a50efe6447c68f7f6d34a7805b7e4b75e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 20:57:17 2008 +0100 + + Add myself here + + qt4/demos/viewer.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit 8df7d83439f0e9ab200840f912f1c08bbf44bd6e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 20:49:01 2008 +0100 + + [Qt4Demo] Fix leak + + qt4/demos/viewer.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit d3c424e0362f53bda5c4e2e415823d78ace76253 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 20:14:17 2008 +0100 + + Rename i to j so that code is more clear by not shadowing the + function parameter + + poppler/Catalog.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 9d12de9b59de4336eabb423f7bf0363b6a35e2a8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 20:00:01 2008 +0100 + + Fix crash in case indices is NULL + + Putting more than one "logical line" per "real line" is evil, we + think if will group it, but does not + + poppler/UnicodeTypeTable.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit fc61dad9daa15f83802ffa5c3cd9b59d80bb310b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 19:52:00 2008 +0100 + + [Qt] Fix leak + + qt/poppler-link.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 981fb857b0afb1cda7836744dcf37906285512b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 19:49:18 2008 +0100 + + [Qt] Fix memory leak + + qt/poppler-document.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e925e92d5cbfc009c138ece117227a3b0894ead6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 5 19:44:40 2008 +0100 + + Do not leak uBuf in the error case + + poppler/CharCodeToUnicode.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 0741a402632ec5a8641ff11707142bf2731c1833 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 22:27:48 2008 +1030 + + Restore the cairo Type3 font image prescaling funtionality + + poppler/CairoFontEngine.cc | 49 + ++++++++++++++++++++++++++------------------ + poppler/CairoFontEngine.h | 20 ++++++++++-------- + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 2 +- + 4 files changed, 43 insertions(+), 30 deletions(-) + +commit 91a7c3fdd44f30b0b50ed05a3313bbb1b5c86e71 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 20:57:24 2008 +1030 + + Remove cairo font matrix y flip when inside a Type 3 char + + Not sure why this was previously required but it now produces + incorrect results. + + poppler/CairoOutputDev.cc | 5 ----- + 1 file changed, 5 deletions(-) + +commit 3bf4d7d75b455a9a0b5ee3a8c78b218e5af5185a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 20:50:07 2008 +1030 + + Transform the glyph advance by the font matrix + + poppler/CairoFontEngine.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 4aa32bad61d008a854fdc9e902d6834bb1687d7e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 20:49:04 2008 +1030 + + Use the font BBox, not the font matrix to set the Gfx BBox + + poppler/CairoFontEngine.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 987955440c7711f440c3d2b5cc8c05ec07228a77 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 20:47:05 2008 +1030 + + Ensure both the font matrix and y-axis flip are in the matrix + + we use for transforming the glyph metrics. + + poppler/CairoFontEngine.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5c051aa117477cba5d350adfc539acb4b5f2a56a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 01:59:07 2008 +1030 + + Require cairo 1.8.2 for user-font support + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a3edfa30680864b95a5196c5619846de42980857 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 01:57:32 2008 +1030 + + Implement Type 3 fonts in cairo backend using cairo user-fonts + + poppler/CairoFontEngine.cc | 174 + ++++++++++++++++++++++++++++++++++++++++++-- + poppler/CairoFontEngine.h | 18 +++++ + poppler/CairoOutputDev.cc | 9 ++- + poppler/CairoOutputDev.h | 4 +- + 4 files changed, 194 insertions(+), 11 deletions(-) + +commit feab1e982a2ee39bb372d593633a06b6a499822f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 01:21:39 2008 +1030 + + Add CairoOutputDev functions for getting Type 3 glyph metrics + + poppler/CairoOutputDev.cc | 10 ++++++++++ + poppler/CairoOutputDev.h | 7 +++++++ + 2 files changed, 17 insertions(+) + +commit a75efe208d899d4a23d5e2fcef200e4225721636 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 1 00:26:40 2008 +1030 + + Make the catalog available to CairoFontEngine + + glib/poppler-document.cc | 3 ++- + poppler/CairoFontEngine.cc | 2 +- + poppler/CairoFontEngine.h | 3 ++- + poppler/CairoOutputDev.cc | 7 +++++-- + poppler/CairoOutputDev.h | 3 ++- + test/pdf-inspector.cc | 2 +- + 6 files changed, 13 insertions(+), 7 deletions(-) + +commit 941d3976c496b75a3c5a9d19b80044fc2b57bd98 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 31 22:44:41 2008 +1030 + + Allow multiple instances of CairoOutputDev to be created + + for the same document that shares the same CairoFontEngine. + + poppler/CairoOutputDev.cc | 16 +++++++++++----- + poppler/CairoOutputDev.h | 4 +++- + 2 files changed, 14 insertions(+), 6 deletions(-) + +commit 94cff513d8589f51b243fcb078f82cb931bb6d35 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 31 21:11:01 2008 +1030 + + Use correct return type in _ft_new_face + + poppler/CairoFontEngine.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0b5ee897a24ce1edfca19a3b843f9b7ee7026d07 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 31 20:55:14 2008 +1030 + + Refactor CairoFont + + Create a CairoFreeType subclass and move the FreeType specific code + into it. + + poppler/CairoFontEngine.cc | 197 + +++++++++++++++++++++++++------------------- + poppler/CairoFontEngine.h | 26 ++++-- + 2 files changed, 131 insertions(+), 92 deletions(-) + +commit a5865dae5b414de5f6dbda2a512101050c374e06 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Oct 28 10:30:59 2008 +0100 + + [glib] Add DISABLE_SINGLE_INCLUDES flags and fix glib-demo + + configure.ac | 4 ++++ + glib/Makefile.am | 3 ++- + glib/demo/Makefile.am | 3 ++- + glib/demo/annots.h | 2 +- + glib/demo/attachments.h | 2 +- + glib/demo/fonts.h | 2 +- + glib/demo/forms.h | 2 +- + glib/demo/images.h | 2 +- + glib/demo/info.h | 2 +- + glib/demo/links.h | 2 +- + glib/demo/outline.h | 2 +- + glib/demo/page.h | 2 +- + glib/demo/render.h | 2 +- + glib/demo/transitions.h | 2 +- + glib/demo/utils.h | 2 +- + 15 files changed, 20 insertions(+), 14 deletions(-) + +commit e07bfb54b77430e10e50c33151cf0afc9854006c +Author: Christian Persch <chpe@gnome.org> +Date: Tue Oct 28 10:29:51 2008 +0100 + + [glib] Fix build when compiling with GTK_DISABLE_SINGLE_INCLUDES + + glib/poppler-page.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit a84d272ffd2b593ac98148e71b83fba299c60fea +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Oct 28 10:01:00 2008 +0100 + + [glib] Add disable deprecated compile flags and fix compile warnings + + configure.ac | 6 ++++++ + glib/Makefile.am | 3 ++- + glib/demo/Makefile.am | 4 +++- + glib/demo/attachments.c | 4 ++-- + 4 files changed, 13 insertions(+), 4 deletions(-) + +commit 43f2b84a81625abee84c93cdced7fb92c99cd944 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 21 23:00:55 2008 +0200 + + [Qt4] Small docu improvement + + qt4/src/poppler-qt4.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit 00f9995b4960575cd1f392474c585f2140c8e587 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 12 14:20:01 2008 +0200 + + Do not crash if there is not font + + See bug 18023 for more info + + poppler/TextOutputDev.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 084cc4335cfe2c0e66219eba4c1177ee7ff018c5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 10 23:15:35 2008 +0200 + + obj4 should be the index 1 on the Array, not the 0, that's already + obj3 + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7442c90206d4b7a8ebc58f995647eb87ac35f42 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 9 22:53:00 2008 +0200 + + If Name is a Ref we want to get the String it references, not the Ref + + poppler/OptionalContent.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 93f8dd9e837557bbfc0f058a664c356e3d6e82c0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 9 21:28:27 2008 +0200 + + Poppler 0.10.0 + + CMakeLists.txt | 2 +- + NEWS | 16 ++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 22 insertions(+), 6 deletions(-) + +commit cdd9bf016de0d3f96b1d5e304c9d02f2bf71ff18 +Author: Mark Kaplan <mkaplan@finjan.com> +Date: Wed Oct 8 22:29:11 2008 +0200 + + Initialize properly OptionalContentGroup::m_name + + poppler/OptionalContent.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c7b87f3b8cbbcca29a1974debc2233f621a2e33b +Author: Carlo Bramini <carlo.bramix@libero.it> +Date: Mon Oct 6 19:32:27 2008 +0200 + + Fix link on Mingw+Msys + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e92255296511cae9cbbac8de800d8b26e5f681f1 +Author: Pino Toscano <pino@kde.org> +Date: Sun Oct 5 15:57:06 2008 +0200 + + [Qt4] when the PDF exporting fails, delete the file if it was + created by + the (failed) exporting + + qt4/src/poppler-pdf-converter.cc | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 360f470b852e37d400949343763a18bf598820e8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 20:04:44 2008 +0200 + + Remove unused var + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df7317f1320513b4f66cb6618d753b82042671f5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 19:48:57 2008 +0200 + + free the object + + poppler/PDFDoc.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 9946d9af9dd5d5b96d5c777413a3e253dfd1f291 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 19:39:46 2008 +0200 + + If we try saving a document that was encrypted, we break everything, + so just fail early + + poppler/PDFDoc.cc | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 108959432af7714cb8ffe42d98d40c97f936a2e6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 19:39:24 2008 +0200 + + Correctly return wheter it was saved or not + + qt4/src/poppler-pdf-converter.cc | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 4c6cb1c204d782e2ac2113b57f6d372b4716017d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 01:46:58 2008 +0200 + + Remove spurious // + + fofi/FoFiType1.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e8e7809ab4b115cbe67251da12989fc024912514 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 01:43:02 2008 +0200 + + There are files that have more than one encoding definition per line, + make them work + + Fixes bug 17018, while at it, i've added some comments and some + error() to make things a bit clearer + + fofi/FoFiType1.cc | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +commit 7604e025038fee24c2cb3001f2100d5d1e48efe1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 4 00:35:46 2008 +0200 + + Fix Poppler::Link::linkArea for rotated pages + + we suck :-( Fixes kde bug 172105 + + qt4/src/poppler-link-extractor.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 450b21e4528a8e890d3dda37ecb0a68602f8efaa +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 1 00:46:29 2008 +0200 + + I've changed these files this year too, update copyright + + goo/gmem.cc | 2 +- + goo/gmem.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 98310ca24841789cf53b10d34e271ceb4e054001 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 30 23:59:43 2008 +0200 + + Fix StitchingFunction(StitchingFunction *func) and + GfxAxialShading(GfxAxialShading *shading) + + Fixes bug 17852 + + poppler/Function.cc | 2 ++ + poppler/GfxState.cc | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit d12f5f4395eb18f8d29182e24acddd3e2b5cfe88 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 30 23:20:26 2008 +0200 + + 0.9.3 + + CMakeLists.txt | 2 +- + NEWS | 17 +++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 23 insertions(+), 6 deletions(-) + +commit d61e464754521555a06ed0901955f49be4def29a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 30 19:26:17 2008 +0200 + + Timothy also agreed, now Ed Catmur is the last one missing to answer + + utils/ImageOutputDev.cc | 3 +++ + utils/ImageOutputDev.h | 3 +++ + 2 files changed, 6 insertions(+) + +commit 3225f54fea7cbb6b25d7223268cdeccfdd823375 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 30 00:27:49 2008 +0200 + + And Marco said yes to GPLv2+ + + Only Timothy Lee and Ed Catmur left :-) + + poppler/Catalog.cc | 3 +++ + poppler/Outline.cc | 3 +++ + poppler/Outline.h | 3 +++ + splash/Splash.cc | 3 +++ + splash/Splash.h | 3 +++ + 5 files changed, 15 insertions(+) + +commit 268d803c9dd67b7f78f8dcdc3c7653c8b2c2d08f +Author: Warren Toomey <wkt@tuhs.org> +Date: Mon Sep 29 21:14:40 2008 +0200 + + Let HmtlOutputDev process images + + utils/HtmlOutputDev.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a29984ab777c64a1cb286b667a6a91ad9b191f40 +Merge: f399afe 6865872 +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 28 23:39:08 2008 +0200 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit f399afe6f6b9c250327d0e4c5b3f2839889d7095 +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 28 23:38:34 2008 +0200 + + [Qt4] various apidox improvements + + qt4/src/Mainpage.dox | 10 +--- + qt4/src/poppler-link.h | 92 ++++++++++++++++++++++++++++++++---- + qt4/src/poppler-qt4.h | 121 + ++++++++++++++++++++++++++++++++---------------- + 3 files changed, 168 insertions(+), 55 deletions(-) + +commit 68658721583b05ebacb1165ac36e91d49735bbd9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 28 19:29:06 2008 +0200 + + If tables is null, don't try to write to file as it'll crash, fixes + crash on 17811 when using cairooutputdev + + fofi/FoFiTrueType.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 3cb5b7fc5ae168ef58fd1905f61c1b9abe6cb86c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 28 19:25:53 2008 +0200 + + Introduce greallocn_checkoverflow and use it in FoFiTrueType::parse + + Fixes the other part of bug 17811 + + fofi/FoFiTrueType.cc | 4 ++-- + goo/gmem.cc | 21 +++++++++++++++++++++ + goo/gmem.h | 1 + + 3 files changed, 24 insertions(+), 2 deletions(-) + +commit aa7ef03af49f74ed558dcbab8ad4c594bb2b7d53 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 28 19:24:43 2008 +0200 + + If libjpeg tells us to abort, let's abort :D + + Fixes part of bug 17811 + + poppler/DCTStream.cc | 1 + + 1 file changed, 1 insertion(+) + +commit e2461c9aa4d74b5511621d7222979948e31541ad +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 28 18:07:25 2008 +0200 + + [Qt4] Activate the 'printing' flag by default in the PSConverter. + + qt4/src/poppler-ps-converter.cc | 2 +- + qt4/src/poppler-qt4.h | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 957d7acb66635e9748c6bc7a31cdbbcbb8da9011 +Author: Carlo Bramini <carlo.bramix@libero.it> +Date: Sat Sep 27 17:23:20 2008 +0200 + + Misc mingw fixes + + configure.ac | 2 +- + glib/Makefile.am | 2 +- + glib/demo/info.cc | 1 + + m4/libjpeg.m4 | 2 +- + 4 files changed, 4 insertions(+), 3 deletions(-) + +commit b3828203c4e594754957033ea826e8e22164fd5b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 26 23:08:14 2008 +0200 + + Carl agreed too, so CairoOutputDev.cc is done + + Only miss, Marco Pesenti Gritti, Timothy Lee and Ed Catmur + + poppler/CairoOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit a197a07728d19abc2708979c95b4ef53e88fcb55 +Author: Carlo Bramini <carlo.bramix@libero.it> +Date: Fri Sep 26 18:42:05 2008 +0200 + + Compile where localtime_r is not available + + glib/demo/info.cc | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 38884e1722ac7e15c62cece20035c5fb0020f4b3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 24 14:18:38 2008 +0200 + + Do what Jeff really want to do, mark the font as invalid if it matches + any of the known collections that Identity is not a good fallback + + Fixes pdf on KDE bug 171365 + + poppler/GfxFont.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0e080aaf44816e5d5b9008f3c2fb54868932f0ac +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 24 13:12:13 2008 +0200 + + Remove non-needed X includes + + Spotted by Carlo Bramini + + test/gtk-cairo-test.cc | 3 --- + test/pdf-inspector.cc | 3 --- + 2 files changed, 6 deletions(-) + +commit 6888b023fdb199d3c5fb705bd928aedf68eeffdb +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 23 23:28:04 2008 +0200 + + Only do the scale to 'm' size trick on non embedded fonts as it was + meant to be + + Fixes bug 17744 + + poppler/SplashOutputDev.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 539d29f4f3b24b98c9fc5f88d3477e427fbe409d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 23 22:39:50 2008 +0200 + + 0.9.2 + + CMakeLists.txt | 2 +- + NEWS | 19 +++++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 25 insertions(+), 6 deletions(-) + +commit abd070a79d8345bda3853395a39e4e2882c4ff8a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 22 20:23:11 2008 +0200 + + Check the types here too + + Benchmarking in release mode, both in "human feel" and callgrind + the benefit/lost is almost inexistant + + poppler/Object.h | 36 ++++++++++++++++++++++-------------- + 1 file changed, 22 insertions(+), 14 deletions(-) + +commit df47e4c441e4ec79b1bb40de7044c9501f243b76 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 12:56:04 2008 +0100 + + Check for duplicate open fonts. + + Before creating a new FT_Face for a font, check to see if there is a + duplicate amongst the list of open fonts, kept alive by either + Poppler's + or Cairo's font cache . + + A quick example of the benefit of this check is that it reduces the + RSS of + the Poppler converter in the Cairo test suite from over 900 MiB to + just 90 + MiB. + + configure.ac | 1 + + poppler/CairoFontEngine.cc | 214 + ++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 190 insertions(+), 25 deletions(-) + +commit 41d1edddcf84ca23c0fc39c5f4f3a49e408a9f1a +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Sun Sep 21 16:33:33 2008 +0200 + + [glib-demo] Fix a crash in forms demo + + glib/demo/forms.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit fe26075353226be9a02c8cf1a6a29586de15ce86 +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 21 12:03:21 2008 +0200 + + really use the key passed to it + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8aa531cb478d6ae838a94f9f31e6a0bbd0dd957c +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 21 11:18:22 2008 +0200 + + Read the 'readOnly' attribute directly in the FormField constructor. + + poppler/Form.cc | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +commit b56f64d676bdabd4a3ebe0eb2237f4c202a3707d +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 21 00:53:54 2008 +0200 + + Handle streams as entries for the catalog JS name tree. + + poppler/Catalog.cc | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +commit 93386d67b3d7adbd87547e9742e4df1c10eadbc1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 20 16:20:03 2008 +0200 + + Compile with -pedantic + + poppler/Form.h | 4 ++-- + qt4/src/poppler-embeddedfile.cc | 4 ++-- + qt4/src/poppler-movie.cc | 3 ++- + qt4/src/poppler-sound.cc | 3 ++- + qt4/src/poppler-textbox.cc | 2 +- + 5 files changed, 9 insertions(+), 7 deletions(-) + +commit 6961fd8efe3db6ee7077dc2ed072498696dae31a +Author: Tomas Are Haavet <tomasare@gmail.com> +Date: Sat Sep 20 16:13:37 2008 +0200 + + Remove some warnings and errors when compiling with gcc and -pedantic + + fofi/FoFiTrueType.cc | 3 ++- + glib/poppler-annot.cc | 8 ++++---- + glib/poppler-attachment.cc | 2 +- + glib/poppler-document.cc | 6 +++--- + glib/poppler-form-field.cc | 2 +- + glib/poppler-page.cc | 2 +- + poppler/Annot.h | 5 +++-- + splash/SplashTypes.h | 3 ++- + 8 files changed, 17 insertions(+), 14 deletions(-) + +commit 4e9a04da358b1527a08102e601a52f07930532f2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 20 16:10:50 2008 +0200 + + Add mention of GPLv2 or later in poppler changes to all files except + Splash.cc and Splash.h, i've still no answer from Marco :-( + + splash/SplashBitmap.cc | 3 +++ + splash/SplashBitmap.h | 3 +++ + splash/SplashErrorCodes.h | 3 +++ + splash/SplashFTFont.cc | 3 +++ + splash/SplashFTFont.h | 3 +++ + splash/SplashFTFontEngine.cc | 3 +++ + splash/SplashFTFontEngine.h | 3 +++ + splash/SplashFTFontFile.cc | 3 +++ + splash/SplashFTFontFile.h | 3 +++ + splash/SplashFont.cc | 3 +++ + splash/SplashFont.h | 3 +++ + splash/SplashFontEngine.cc | 3 +++ + splash/SplashFontEngine.h | 3 +++ + splash/SplashFontFile.cc | 3 +++ + splash/SplashFontFile.h | 3 +++ + splash/SplashT1Font.cc | 3 +++ + splash/SplashT1Font.h | 3 +++ + splash/SplashT1FontEngine.cc | 3 +++ + splash/SplashT1FontFile.cc | 3 +++ + splash/SplashT1FontFile.h | 3 +++ + splash/SplashTypes.h | 3 +++ + splash/SplashXPathScanner.cc | 3 +++ + 22 files changed, 66 insertions(+) + +commit beb87362072d5b480cf6b2c02445ec17c119ff56 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 20 15:47:25 2008 +0200 + + Add Tomas' Copyright + + utils/HtmlFonts.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 8ccb1bb651b129875ef802356c4a229b2ce31973 +Author: Tomas Are Haavet <tomasare@gmail.com> +Date: Sat Sep 20 15:45:47 2008 +0200 + + Initialize pos the correct value to not have crashes + + utils/HtmlFonts.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 77bf8ec94e36fef7e120f1dc4bb1390be71cfb97 +Author: Tomas Are Haavet <tomasare@gmail.com> +Date: Sat Sep 20 14:17:06 2008 +0200 + + Fix memory leak + + utils/HtmlOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit b22be54dc2205269974315ca748d835d0990d6da +Author: Tomas Are Haavet <tomasare@gmail.com> +Date: Sat Sep 20 14:16:26 2008 +0200 + + Fix mismatched free/delete + + utils/HtmlOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ac16174da1d6f19445f78e7cd7c4a18cb9524dde +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 20 00:52:19 2008 +0200 + + make sure the image is setup before using it, otherwise some things + don't print correctly like PDF from bug 17645 + + poppler/PSOutputDev.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ffa4ffdf7fe83035c72addd8c4c8ee566621ba06 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 17 23:27:30 2008 +0200 + + 0.9.1 + + CMakeLists.txt | 2 +- + NEWS | 13 +++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 19 insertions(+), 6 deletions(-) + +commit f57cbe32bcde0808943b9be2456dd69fa5b6dd27 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 14 22:18:38 2008 +0200 + + If when looking for an object we get objSomeNumberAfter assume it + was an int of SomeNumberAfter + + Fixes bug 17568 and i don't see how it can break existing things + because it's already on an error path + + poppler/XRef.cc | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +commit 1a852064ff5a1a15bc315ddca472a0ad74292581 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Sep 13 12:11:41 2008 +0200 + + [glib-demo] Do not try to get info about remote destinations + + glib/demo/utils.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 951cffeb2cbff4e179043033b5ac7f5eb764d6dc +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 12 12:05:53 2008 +0200 + + Make sure DecryptAESState::bufIdx is never bigger than 16, otherwise + we crash + + I am not sure this is the correct fix, but fixes crash on files of + bugs 13972, 16092 and 17523 and they seem to work ok + + poppler/Decrypt.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 491109edbe827860e764b5fcb67456867923858d +Author: Haruyuki Kawabe <Haruyuki.Kawabe@unisys.co.jp> +Date: Wed Sep 10 23:00:32 2008 +0200 + + Generate the outline file at the same place the other files are + generated + + Fixes bug 17504 + + utils/HtmlOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7dfc1e4c9348d537896bda7b0f2ae591afc72866 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 10 00:03:50 2008 +0200 + + we want to distribute this file too + + qt4/src/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ddb73e8dc1ccbddf3b170e12c7153ccaf716d7cc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 9 23:47:33 2008 +0200 + + We want to distribute cmake/modules/FindLIBOPENJPEG.cmake too + + Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 646ccc2bb8563d411dc25bdbab53725ae08572ba +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 9 23:22:17 2008 +0200 + + m_doc->doc->getOptContentConfig() can be null, so check for it + + qt4/src/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7f0bce67101f37f8d3e69d7d701388bcdc7200f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 9 23:18:49 2008 +0200 + + Qt4 frontend had timezone parsing that got lost when moving to the + common function, i suck + + glib/poppler-document.cc | 6 ++++-- + poppler/DateInfo.cc | 20 ++++++++++++++------ + poppler/DateInfo.h | 2 +- + qt/poppler-document.cc | 6 ++++-- + qt4/src/poppler-document.cc | 22 +++++++++++++++++++--- + utils/pdfinfo.cc | 6 ++++-- + utils/pdftohtml.cc | 6 ++++-- + 7 files changed, 50 insertions(+), 18 deletions(-) + +commit 0af8609e6c932de2d85168cc9147854ee84b3a1b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 9 20:55:27 2008 +0200 + + i want this packaged too + + utils/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit dd0f4c1510382e17cf33d3fe163e384da1d6d289 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 9 20:48:04 2008 +0200 + + Fix includepath + + fofi/FoFiTrueType.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 16c0842c3e01608a72709af55cc5cb8b567efedf +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 9 20:36:18 2008 +0200 + + API changed, so increase soname + + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 217c0d1f80a78713977a7bfbe680fce90f1c6b36 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 8 23:56:28 2008 +0200 + + change version to 0.9.0 + + Now only need to wait for Carlos and Iñigo's answer to a BIC change + in glib/ and we'll have 0.9.0 :-) + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit e34022a8fcfb9fe211dd6b561377d855972b2087 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 8 23:36:04 2008 +0200 + + Increase soname for libpoppler, i'm almost sure we broke BC there + + CMakeLists.txt | 2 +- + poppler/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit bc275049d6ef083daf71a043ccf23fd0634f5c4d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 8 23:33:24 2008 +0200 + + soname 3.1.0 for qt4 libs, we are BC/SC but got new API + + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 06743a25a73adc3fba95f7b4ad74a6dde1a54ead +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 8 23:23:06 2008 +0200 + + added news for 0.9.0 + + NEWS | 115 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 115 insertions(+) + +commit d35ca2ce5df12d40e295873e44b1f18ea40ba897 +Author: Pino Toscano <pino@kde.org> +Date: Sun Sep 7 01:13:33 2008 +0200 + + [Qt4] apidox improvements + + qt4/src/poppler-annotation.h | 70 + +++++++++++++++++++++++++++++++++++++++--- + qt4/src/poppler-link.h | 12 +++++--- + qt4/src/poppler-qt4.h | 22 +++++++++++-- + 3 files changed, 93 insertions(+), 11 deletions(-) + +commit 796d4c002d47c85716775d173eddfb2ae8866eaf +Author: Pino Toscano <pino@kde.org> +Date: Sat Sep 6 22:48:13 2008 +0200 + + no more need for including the qt3 paths + + qt4/demos/CMakeLists.txt | 1 - + qt4/src/CMakeLists.txt | 1 - + qt4/tests/CMakeLists.txt | 1 - + 3 files changed, 3 deletions(-) + +commit db7ee3b3ae0f42155f9245691e4bfdef98a8ed6f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 6 23:16:05 2008 +0200 + + [Qt4] Fix docu + + qt4/src/poppler-qt4.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3366059a25611f19ab592cda18c5efe0b9359771 +Author: Pino Toscano <pino@kde.org> +Date: Sat Sep 6 16:34:58 2008 +0200 + + [Qt4] add option flags for the PS converter + + - map the 'strictMargins' and 'forceRasterize' bool options as flags + - add a flag for setting the "printing" mode + + qt4/src/poppler-ps-converter.cc | 34 ++++++++++++++++++++++++++-------- + qt4/src/poppler-qt4.h | 26 ++++++++++++++++++++++++++ + 2 files changed, 52 insertions(+), 8 deletions(-) + +commit afa26d5c9ac9feb61aad30eb65dc00c9854d7f2e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 6 15:46:12 2008 +0200 + + we are printing so pass the print flag as true + + qt/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f5d1eb5eaabaf3ab4bb87b8b4b901bbf30b20b29 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 6 15:43:32 2008 +0200 + + We are pringint here, so pass the printing flag as true + + Fixes KDE bug 170459, you'd wonder how many times i've made the + same mistake... + + qt4/src/poppler-ps-converter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 58e828d732f06bae9133dd518d89fa4348f1cca8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 5 18:45:23 2008 +0200 + + Only like QtTest to the tests, not to the lib itself + + configure.ac | 13 +++++++++++-- + qt4/tests/Makefile.am | 22 +++++++++++----------- + 2 files changed, 22 insertions(+), 13 deletions(-) + +commit 49b3e4560f62a9a7db350d94d50e229f5e1208bf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 5 18:17:45 2008 +0200 + + Movie filename is not a string, but a File Specification + + Fixes a crash when filename is a dictionary + + poppler/Annot.cc | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 996d2e176057e22acbc374cff7a712ce6fd92d93 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 5 18:17:25 2008 +0200 + + Unify multiple File Specification parsers + + CMakeLists.txt | 2 + + poppler/FileSpec.cc | 146 + ++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/FileSpec.h | 24 ++++++++ + poppler/Link.cc | 104 +++++----------------------------- + poppler/Link.h | 4 -- + poppler/Makefile.am | 2 + + poppler/PSOutputDev.cc | 35 +----------- + poppler/PSOutputDev.h | 1 - + poppler/Sound.cc | 7 ++- + 9 files changed, 197 insertions(+), 128 deletions(-) + +commit 31f3eb2d6b43f7fbf4d978730d109b08b1563989 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 3 21:49:23 2008 +0200 + + Only set the state to true if the AS value is the same as parent's V + + Fixes bug 16121 and 15535 + + poppler/Form.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit c75abac7ba07990ef54a46fa0d429eea580a71ef +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 2 19:16:55 2008 +0200 + + Kjartan was missing and just agreed + + utils/HtmlOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 630aa133017d15ddc7bf96c79f43c5b60fa9749a +Merge: b2bc9b3 de82255 +Author: Pino Toscano <pino@kde.org> +Date: Tue Sep 2 01:25:55 2008 +0200 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit b2bc9b3f59ef8e5fea18f0bc91b71fc9eb9a4157 +Author: Pino Toscano <pino@kde.org> +Date: Tue Sep 2 01:24:39 2008 +0200 + + [Qt4] small apidox improvements + + mostly the start of the \since marker addition, plus few other + documentation addition/improvements + + qt4/src/poppler-annotation.h | 9 +++++++ + qt4/src/poppler-form.h | 8 ++++++ + qt4/src/poppler-link.h | 14 +++++++--- + qt4/src/poppler-optcontent.h | 11 ++++++++ + qt4/src/poppler-qt4.h | 59 + ++++++++++++++++++++++++++++++++++++------ + 5 files changed, 90 insertions(+), 11 deletions(-) + +commit 6bc4881477ea15d70d420e57b5663052f2f9df76 +Author: Pino Toscano <pino@kde.org> +Date: Tue Sep 2 00:47:56 2008 +0200 + + expand the macros, extract poppler-optcontent.h + + enable the macro expansion and define POPPLER_QT4_EXPORT to be + empty, so + we don't have it in the apidox + + qt4/src/Doxyfile | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit de822554acdb1b2bc9e70c0668c43a10c0ec129a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 1 23:50:37 2008 +0200 + + Initialize widget to null before calling initialize not after :-( + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1a7b7199112d97e816a099cbc1a5672c83e64156 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 1 20:42:06 2008 +0200 + + Add my copyright + + poppler/Dict.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 1fef34782a003f46fceab0d3bed36212bbf32c4c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 1 20:35:37 2008 +0200 + + Find reverse way in Dict + + This fixes Greg Stolze - Marriage Of Virtue & Viciousness.pdf + The issue with this pdf is that has a Dict with two entries with + the same key + The pdf spec says if that happens, results are undefined, but Acroread + uses the + second key while we were using the first, searching backwards we + use the second now too and the pdf works + + poppler/Dict.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bb7996eaaad6a70404891bb2ff530160737ea3d7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 1 20:29:25 2008 +0200 + + Do not crash on documents with no pages + + qt4/tests/test-poppler-qt4.cpp | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 0c11d390e4b0e3765ae20968359c7562c9857db7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 1 20:13:33 2008 +0200 + + All poppler commiters to these files agreed to GPLv2+ + + Still missing to answer + Marco Pesenti Gritti + Catalog.cc + Outline.cc + Outline.h + + Kjartan Maraas + HtmlOutputDev.cc + + Timothy Lee + ImageOutputDev.h + ImageOutputDev.cc + + Carl Worth + CairoOutputDev.cc + + Ed Catmur + GfxFont.cc + GlobalParams.cc + TextOutputDev.cc + TextOutputDev.h + UnicodeTypeTable.cc + UnicodeTypeTable.h + + poppler/Annot.cc | 3 +++ + poppler/Annot.h | 3 +++ + poppler/Array.cc | 3 +++ + poppler/Array.h | 3 +++ + poppler/ArthurOutputDev.cc | 3 +++ + poppler/ArthurOutputDev.h | 3 +++ + poppler/CMap.cc | 3 +++ + poppler/CMap.h | 3 +++ + poppler/CairoFontEngine.cc | 3 +++ + poppler/CairoFontEngine.h | 3 +++ + poppler/CairoOutputDev.h | 3 +++ + poppler/Catalog.h | 3 +++ + poppler/CharCodeToUnicode.cc | 3 +++ + poppler/CharCodeToUnicode.h | 3 +++ + poppler/Decrypt.cc | 3 +++ + poppler/Decrypt.h | 3 +++ + poppler/Dict.cc | 3 +++ + poppler/Dict.h | 3 +++ + poppler/Error.cc | 3 +++ + poppler/Error.h | 3 +++ + poppler/Function.cc | 3 +++ + poppler/Gfx.cc | 3 +++ + poppler/Gfx.h | 3 +++ + poppler/GfxFont.h | 3 +++ + poppler/GfxState.cc | 3 +++ + poppler/GfxState.h | 3 +++ + poppler/GlobalParams.h | 3 +++ + poppler/JBIG2Stream.cc | 3 +++ + poppler/JPXStream.cc | 3 +++ + poppler/Lexer.cc | 3 +++ + poppler/Lexer.h | 3 +++ + poppler/Link.cc | 3 +++ + poppler/Link.h | 3 +++ + poppler/Object.cc | 3 +++ + poppler/Object.h | 3 +++ + poppler/OutputDev.cc | 3 +++ + poppler/OutputDev.h | 3 +++ + poppler/PDFDoc.cc | 3 +++ + poppler/PDFDoc.h | 3 +++ + poppler/PDFDocEncoding.cc | 3 +++ + poppler/PDFDocEncoding.h | 3 +++ + poppler/PSOutputDev.cc | 3 +++ + poppler/PSOutputDev.h | 3 +++ + poppler/PSTokenizer.cc | 3 +++ + poppler/PSTokenizer.h | 3 +++ + poppler/Page.cc | 3 +++ + poppler/Page.h | 3 +++ + poppler/Parser.cc | 3 +++ + poppler/Parser.h | 3 +++ + poppler/SplashOutputDev.cc | 3 +++ + poppler/SplashOutputDev.h | 3 +++ + poppler/Stream-CCITT.h | 3 +++ + poppler/Stream.cc | 3 +++ + poppler/Stream.h | 3 +++ + poppler/UTF8.h | 3 +++ + poppler/XRef.cc | 3 +++ + poppler/XRef.h | 3 +++ + utils/HtmlFonts.cc | 3 +++ + utils/HtmlLinks.cc | 3 +++ + utils/HtmlOutputDev.h | 3 +++ + utils/parseargs.c | 3 +++ + utils/parseargs.h | 3 +++ + utils/pdffonts.cc | 3 +++ + utils/pdfimages.cc | 3 +++ + utils/pdfinfo.cc | 3 +++ + utils/pdftohtml.cc | 3 +++ + utils/pdftoppm.cc | 3 +++ + utils/pdftops.cc | 3 +++ + utils/pdftotext.cc | 3 +++ + 69 files changed, 207 insertions(+) + +commit 8670bfed7900586725b30e3af67f6849acc6efda +Author: Vasile Gaburici <gaburici@cs.umd.edu> +Date: Sat Aug 30 12:47:13 2008 +0200 + + Fix extraction of images + + See bug 16999 for more info + + utils/ImageOutputDev.cc | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 1c98f197664b1a2c06e2caf32116a8487f4054bf +Author: Vasile Gaburici <gaburici@cs.umd.edu> +Date: Sat Aug 30 12:44:02 2008 +0200 + + Read sMap reverse so CMap entries take precedence + + See bug 17321 for a more in depth explanation + + poppler/CharCodeToUnicode.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 8f1deb3f8000bdeb845a6c786a654bc7eb684f0a +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 29 23:06:19 2008 +0200 + + Are we a lib or aren't we? Unify String to Date parsing so we all + behave the same way + + CMakeLists.txt | 2 ++ + glib/poppler-document.cc | 29 ++-------------- + poppler/DateInfo.cc | 62 + +++++++++++++++++++++++++++++++++++ + poppler/DateInfo.h | 27 +++++++++++++++ + poppler/Makefile.am | 2 ++ + qt/poppler-document.cc | 22 ++----------- + qt4/src/poppler-annotation-helper.h | 16 ++------- + qt4/src/poppler-document.cc | 52 +++-------------------------- + utils/pdfinfo.cc | 16 ++------- + utils/pdftohtml.cc | 9 ++--- + 10 files changed, 111 insertions(+), 126 deletions(-) + +commit c39f23dca98d3efe8d094c9a3e1bd460ba57d1ce +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 29 20:50:57 2008 +0200 + + Add a readme for contributors with licensing and misc info + + README.contributors | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 35a72590ffd3284e63601af79599e5fa025e567f +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 28 00:58:11 2008 +0200 + + Be more protective against huge font sizes in bogus documents like + the one in http://bugs.freedesktop.org/show_bug.cgi?id=17326 + + 10 MB in size is a font of 3200x3200, huge enough to be discarted + + poppler/SplashOutputDev.cc | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +commit 33727cf6773b12d736ba245fdd146559ce93102d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 20:36:13 2008 +0200 + + fix location of the comment + + fofi/FoFiType1.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit abe29b4fdb33f449649fdea5d7af2deeb702f0bb +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 20:24:35 2008 +0200 + + All changes made to fofi/ files under the poppler project are by + people that accepts to license the code under GPLv2+ + + fofi/FoFiBase.cc | 3 +++ + fofi/FoFiTrueType.cc | 3 +++ + fofi/FoFiTrueType.h | 3 +++ + fofi/FoFiType1.cc | 3 +++ + fofi/FoFiType1C.h | 3 +++ + 5 files changed, 15 insertions(+) + +commit 6346d7050a03935c71336c65d5f8f0fe2860d321 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 20:23:50 2008 +0200 + + All changes made to goo/ files under the poppler project are by + people that accepts to license the code under GPLv2+ + + goo/GooString.cc | 3 +++ + goo/GooString.h | 3 +++ + goo/gfile.cc | 3 +++ + goo/gfile.h | 3 +++ + goo/gmem.cc | 3 +++ + goo/gmem.h | 3 +++ + 6 files changed, 18 insertions(+) + +commit d6e1f1fb4e83527d3ece51d98fa20262713b7da1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 20:22:06 2008 +0200 + + .cc -> .h + + poppler/FontInfo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9f0ac70f7ad806cadce379d4fabb90eff697ad52 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 19:25:27 2008 +0200 + + Add missing addresses + + poppler/ABWOutputDev.cc | 4 ++-- + poppler/ABWOutputDev.h | 2 +- + poppler/FlateStream.cc | 2 +- + poppler/FlateStream.h | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +commit 22f6af73961686895f207fe13022a21333455862 +Merge: 12a9e42 6d6913a +Author: Pino Toscano <pino@kde.org> +Date: Sun Aug 24 19:03:24 2008 +0200 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 12a9e427fb487165b1797f81d52d733c27bfa2e1 +Author: Pino Toscano <pino@kde.org> +Date: Sun Aug 24 18:57:52 2008 +0200 + + [Qt4] add showControl and playMode properties of MovieObject's + + qt4/src/poppler-movie.cc | 14 ++++++++++++++ + qt4/src/poppler-qt4.h | 20 ++++++++++++++++++++ + 2 files changed, 34 insertions(+) + +commit c444c652859b6e52160e5571e84f8eb1292d65f1 +Author: Pino Toscano <pino@kde.org> +Date: Sun Aug 24 18:47:58 2008 +0200 + + [Qt4] make the MovieObject ctor private, with only Page able to use it + + qt4/src/poppler-qt4.h | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 6d6913a79779769ce0fe2f0b516a90a50e51b947 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 18:45:45 2008 +0200 + + fix Jeff's entry + + poppler/DCTStream.cc | 2 +- + poppler/DCTStream.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 25bd5967f9f550a32e20eea91cd00cbeff98249e +Author: Pino Toscano <pino@kde.org> +Date: Sun Aug 24 18:45:25 2008 +0200 + + [Qt4] initialize the MovieObject from an AnnotMovie + + the annotation has all the data we need, so just init from that + + qt4/src/poppler-movie.cc | 8 ++++---- + qt4/src/poppler-page.cc | 4 +--- + qt4/src/poppler-qt4.h | 4 ++-- + 3 files changed, 7 insertions(+), 9 deletions(-) + +commit 47f54ad4de111f62a5b8c25520ef6b2bca6026d2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 24 18:18:13 2008 +0200 + + Add more correct copyright statements on fofi, goo, poppler and + util directories to be more compliant with GPL that requires such + modification statements to be present. Meanwhile i did that, i did + qt and qt4 dirs too, glib is missing if someone wants to fix it, + but it's not crucial as it's not a fork of some other GPL software + + AUTHORS | 4 +++- + fofi/FoFiBase.cc | 11 +++++++++++ + fofi/FoFiTrueType.cc | 14 ++++++++++++++ + fofi/FoFiTrueType.h | 12 ++++++++++++ + fofi/FoFiType1.cc | 12 ++++++++++++ + fofi/FoFiType1C.h | 11 +++++++++++ + goo/GooString.cc | 13 +++++++++++++ + goo/GooString.h | 12 ++++++++++++ + goo/GooTimer.cc | 3 +++ + goo/GooTimer.h | 8 ++++++-- + goo/GooVector.h | 12 ++++++++++++ + goo/gfile.cc | 13 +++++++++++++ + goo/gfile.h | 11 +++++++++++ + goo/gmem.cc | 13 +++++++++++++ + goo/gmem.h | 13 +++++++++++++ + poppler/ABWOutputDev.cc | 3 ++- + poppler/ABWOutputDev.h | 2 +- + poppler/Annot.cc | 19 +++++++++++++++++++ + poppler/Annot.h | 17 +++++++++++++++++ + poppler/Array.cc | 11 +++++++++++ + poppler/Array.h | 11 +++++++++++ + poppler/ArthurOutputDev.cc | 14 +++++++++++++- + poppler/ArthurOutputDev.h | 13 ++++++++++++- + poppler/CMap.cc | 12 ++++++++++++ + poppler/CMap.h | 11 +++++++++++ + poppler/CairoFontEngine.cc | 17 +++++++++++++++++ + poppler/CairoFontEngine.h | 17 +++++++++++++++++ + poppler/CairoOutputDev.cc | 19 +++++++++++++++++++ + poppler/CairoOutputDev.h | 16 ++++++++++++++++ + poppler/Catalog.cc | 19 +++++++++++++++++++ + poppler/Catalog.h | 16 ++++++++++++++++ + poppler/CharCodeToUnicode.cc | 14 ++++++++++++++ + poppler/CharCodeToUnicode.h | 13 +++++++++++++ + poppler/DCTStream.cc | 5 ++++- + poppler/DCTStream.h | 6 +++++- + poppler/Decrypt.cc | 12 ++++++++++++ + poppler/Decrypt.h | 11 +++++++++++ + poppler/Dict.cc | 13 +++++++++++++ + poppler/Dict.h | 13 +++++++++++++ + poppler/Error.cc | 13 +++++++++++++ + poppler/Error.h | 13 +++++++++++++ + poppler/FlateStream.cc | 2 ++ + poppler/FlateStream.h | 2 ++ + poppler/FontInfo.cc | 22 ++++++++++++++++++++++ + poppler/FontInfo.h | 21 +++++++++++++++++++++ + poppler/Form.cc | 10 +++++++++- + poppler/Form.h | 6 +++++- + poppler/Function.cc | 12 ++++++++++++ + poppler/Gfx.cc | 23 +++++++++++++++++++++++ + poppler/Gfx.h | 13 +++++++++++++ + poppler/GfxFont.cc | 19 +++++++++++++++++++ + poppler/GfxFont.h | 16 ++++++++++++++++ + poppler/GfxState.cc | 14 ++++++++++++++ + poppler/GfxState.h | 13 +++++++++++++ + poppler/GlobalParams.cc | 19 +++++++++++++++++++ + poppler/GlobalParams.h | 15 +++++++++++++++ + poppler/JBIG2Stream.cc | 13 +++++++++++++ + poppler/JPXStream.cc | 11 +++++++++++ + poppler/Lexer.cc | 12 ++++++++++++ + poppler/Lexer.h | 12 ++++++++++++ + poppler/Link.cc | 14 ++++++++++++++ + poppler/Link.h | 12 ++++++++++++ + poppler/Movie.cc | 17 ++++++++++++++++- + poppler/Object.cc | 11 +++++++++++ + poppler/Object.h | 12 ++++++++++++ + poppler/OptionalContent.cc | 5 ++++- + poppler/Outline.cc | 11 +++++++++++ + poppler/Outline.h | 11 +++++++++++ + poppler/OutputDev.cc | 13 +++++++++++++ + poppler/OutputDev.h | 14 ++++++++++++++ + poppler/PDFDoc.cc | 15 +++++++++++++++ + poppler/PDFDoc.h | 15 +++++++++++++++ + poppler/PDFDocEncoding.cc | 13 ++++++++++++- + poppler/PDFDocEncoding.h | 11 +++++++++++ + poppler/PSOutputDev.cc | 15 +++++++++++++++ + poppler/PSOutputDev.h | 14 ++++++++++++++ + poppler/PSTokenizer.cc | 12 ++++++++++++ + poppler/PSTokenizer.h | 11 +++++++++++ + poppler/Page.cc | 20 ++++++++++++++++++++ + poppler/Page.h | 16 ++++++++++++++++ + poppler/PageLabelInfo.cc | 12 ++++++++++++ + poppler/PageLabelInfo.h | 12 ++++++++++++ + poppler/PageTransition.h | 18 ++++++++++++++++++ + poppler/Parser.cc | 12 ++++++++++++ + poppler/Parser.h | 11 +++++++++++ + poppler/SplashOutputDev.cc | 16 ++++++++++++++++ + poppler/SplashOutputDev.h | 11 +++++++++++ + poppler/Stream-CCITT.h | 11 +++++++++++ + poppler/Stream.cc | 14 ++++++++++++++ + poppler/Stream.h | 13 +++++++++++++ + poppler/TextOutputDev.cc | 18 ++++++++++++++++++ + poppler/TextOutputDev.h | 15 +++++++++++++++ + poppler/UTF8.h | 11 +++++++++++ + poppler/UnicodeTypeTable.cc | 13 +++++++++++++ + poppler/UnicodeTypeTable.h | 11 +++++++++++ + poppler/XRef.cc | 17 ++++++++++++++++- + poppler/XRef.h | 14 ++++++++++++++ + qt/poppler-document.cc | 3 +++ + qt/poppler-fontinfo.cc | 3 +-- + qt/poppler-page.cc | 7 ++++++- + qt/poppler-private.h | 4 ++++ + qt/poppler-qt.h | 5 ++++- + qt4/src/poppler-annotation-helper.h | 1 + + qt4/src/poppler-annotation.cc | 3 ++- + qt4/src/poppler-annotation.h | 4 +++- + qt4/src/poppler-document.cc | 4 +++- + qt4/src/poppler-embeddedfile.cc | 1 + + qt4/src/poppler-fontinfo.cc | 5 ++++- + qt4/src/poppler-form.cc | 2 +- + qt4/src/poppler-form.h | 2 +- + qt4/src/poppler-link-extractor-private.h | 2 +- + qt4/src/poppler-link-extractor.cc | 2 +- + qt4/src/poppler-link.cc | 3 ++- + qt4/src/poppler-link.h | 1 + + qt4/src/poppler-optcontent-private.h | 1 + + qt4/src/poppler-optcontent.cc | 1 + + qt4/src/poppler-optcontent.h | 1 + + qt4/src/poppler-page-private.h | 2 ++ + qt4/src/poppler-page.cc | 4 ++++ + qt4/src/poppler-private.h | 4 +++- + qt4/src/poppler-ps-converter.cc | 1 + + qt4/src/poppler-qt4.h | 5 ++++- + qt4/src/poppler-textbox.cc | 2 ++ + splash/Splash.cc | 12 ++++++++++++ + splash/Splash.h | 12 ++++++++++++ + splash/SplashBitmap.cc | 12 ++++++++++++ + splash/SplashBitmap.h | 11 +++++++++++ + splash/SplashErrorCodes.h | 11 +++++++++++ + splash/SplashFTFont.cc | 12 ++++++++++++ + splash/SplashFTFont.h | 11 +++++++++++ + splash/SplashFTFontEngine.cc | 11 +++++++++++ + splash/SplashFTFontEngine.h | 11 +++++++++++ + splash/SplashFTFontFile.cc | 11 +++++++++++ + splash/SplashFTFontFile.h | 11 +++++++++++ + splash/SplashFont.cc | 11 +++++++++++ + splash/SplashFont.h | 11 +++++++++++ + splash/SplashFontEngine.cc | 11 +++++++++++ + splash/SplashFontEngine.h | 11 +++++++++++ + splash/SplashFontFile.cc | 12 ++++++++++++ + splash/SplashFontFile.h | 12 ++++++++++++ + splash/SplashT1Font.cc | 11 +++++++++++ + splash/SplashT1Font.h | 11 +++++++++++ + splash/SplashT1FontEngine.cc | 11 +++++++++++ + splash/SplashT1FontFile.cc | 11 +++++++++++ + splash/SplashT1FontFile.h | 11 +++++++++++ + splash/SplashTypes.h | 11 +++++++++++ + splash/SplashXPathScanner.cc | 11 +++++++++++ + utils/HtmlFonts.cc | 24 ++++++++++++++++++++++++ + utils/HtmlFonts.h | 12 ++++++++++++ + utils/HtmlLinks.cc | 23 +++++++++++++++++++++++ + utils/HtmlLinks.h | 12 ++++++++++++ + utils/HtmlOutputDev.cc | 13 +++++++++++++ + utils/HtmlOutputDev.h | 11 +++++++++++ + utils/ImageOutputDev.cc | 13 +++++++++++++ + utils/ImageOutputDev.h | 12 ++++++++++++ + utils/parseargs.c | 13 +++++++++++++ + utils/parseargs.h | 11 +++++++++++ + utils/pdffonts.cc | 12 ++++++++++++ + utils/pdfimages.cc | 11 +++++++++++ + utils/pdfinfo.cc | 12 ++++++++++++ + utils/pdftoabw.cc | 26 + +++++++++++++++++++------- + utils/pdftohtml.cc | 11 +++++++++++ + utils/pdftoppm.cc | 11 +++++++++++ + utils/pdftops.cc | 12 ++++++++++++ + utils/pdftotext.cc | 12 ++++++++++++ + 165 files changed, 1795 insertions(+), 37 deletions(-) + +commit 0dfbb8996ee91aa044eb2bdf2859ef64005116f8 +Author: Loïc Minier <lool@dooz.org> +Date: Wed Aug 20 22:10:07 2008 +0200 + + Fixes escaping of hyphens in man pages + + utils/pdfinfo.1 | 2 +- + utils/pdftops.1 | 16 ++++++++-------- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit 6cfa0e598a81460e5d0a7d60d8584366d2a70165 +Author: Loïc Minier <lool@dooz.org> +Date: Wed Aug 20 19:57:42 2008 +0200 + + Fix synopsis of pdftops in man page to clarify that a PDF file is + required in all cases + + utils/pdftops.1 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 48a73cc709a8bed9d2d0f9cbd2a9d2b6c0dad05b +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 19:26:01 2008 +0200 + + [Qt4] convert the title of movie annotations + + qt4/src/poppler-page.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 419ec15ac825f2e0052b411462f00ac57fed030e +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 19:25:04 2008 +0200 + + [Qt4] get/set the title for movie annotations + + qt4/src/poppler-annotation.cc | 13 +++++++++++++ + qt4/src/poppler-annotation.h | 3 +++ + 2 files changed, 16 insertions(+) + +commit 63bcaf113fcb5a4a9e5c120df2c3dafb2977c90a +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 01:58:30 2008 +0200 + + [Qt4] convert the movie annotation from the core type to the Qt4 one + + qt4/src/poppler-page.cc | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 5cc490de74af12726bdeb9b5a6a0f0d1d79383b5 +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 01:55:41 2008 +0200 + + [Qt4] first version of a MovieAnnotation + + right mow it just holds the movie object + + qt4/src/poppler-annotation.cc | 74 + +++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-annotation.h | 26 ++++++++++++++- + 2 files changed, 99 insertions(+), 1 deletion(-) + +commit 3d5c2e22d790d7c139e1cd28aebb21cfe76b8b6b +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 01:54:30 2008 +0200 + + compile the new poppler-movie.cc + + qt4/src/CMakeLists.txt | 1 + + qt4/src/Makefile.am | 1 + + 2 files changed, 2 insertions(+) + +commit 599698a9b133999f1f0bb0548489111e9d7b6f05 +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 01:52:58 2008 +0200 + + [Qt4] first version of a MovieObject object for movies + + slightly differs from the version in core + + qt4/src/poppler-movie.cc | 73 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 34 +++++++++++++++++++++ + 2 files changed, 107 insertions(+) + +commit 820f15009845870701e1f4e7f4fc4fb93312ab3e +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 01:45:07 2008 +0200 + + fix Movie::copy() + + the default copy ctor already does the vertbatim copies, so no need to + do them on our own; what needs to be done is checking whether + an object + is valid before either doing a "smart copy" or "postprocessing" it + + poppler/Movie.cc | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit c3a006ae35250e9a5638c2ce713b7470380751c7 +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 23 01:04:34 2008 +0200 + + compile attachments.c in the demo with cmake as well + + glib/demo/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit b5a7987a50b3d28fbfa219e2cef85b9e53aaf079 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 21 20:40:18 2008 +0200 + + [glib-demo] Fix attachments demo with documents that don't contain + attachments + + glib/demo/attachments.c | 27 ++++++++++++++++++++------- + 1 file changed, 20 insertions(+), 7 deletions(-) + +commit a2b0aefedbdb20ce0ef8398a700202021fcf00db +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 21 20:14:50 2008 +0200 + + [glib-demo] Fix typo + + glib/demo/attachments.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9e563d6d877624b1caf82ac30c5ae30a1eb48f21 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 21 20:12:33 2008 +0200 + + [glib-demo] Add checksum validation to attachments demo + + glib/demo/attachments.c | 101 + +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 101 insertions(+) + +commit e233325e6f13d8b232bf68a2812fe755e7fccd4d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 21 19:03:32 2008 +0200 + + [glib-demo] Add demo for attachments + + glib/demo/Makefile.am | 2 + + glib/demo/attachments.c | 242 + +++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/attachments.h | 31 ++++++ + glib/demo/main.c | 4 +- + glib/demo/utils.c | 23 +++++ + glib/demo/utils.h | 1 + + 6 files changed, 302 insertions(+), 1 deletion(-) + +commit 0e2efa0fce5bf059ce85d3e3bec2293b405ec3c9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 21 19:02:24 2008 +0200 + + [glib] Make sure name and descripction are valid utf8 strings + + glib/poppler-attachment.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 15a73704ab6b009ca5e07c08f0b12d970adc387d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 19 09:18:03 2008 +0100 + + Memleak and invalid free. + + CairoOutputDev::setSoftMask() fails to free the cairo_t and mask + it uses + to draw the opaque soft mask and attempts to destroy a reference to a + surface it does not own (this bug was masked by the fact that + a reference + was still being held by the unfreed cairo_t). + + poppler/CairoOutputDev.cc | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit d3110e392097db54e9ee59300213e490dee39126 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 19 19:19:09 2008 +0200 + + Fix include so it can be used in the unsupported way of installing + internal poppler/ headers + + Notified by Caolan McNamara <caolanm@redhat.com> + + poppler/PreScanOutputDev.h | 2 +- + poppler/SecurityHandler.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 303249e5548bfbf6823e97850e498970d802b4a0 +Author: Albert Astals Cid <tsdgeos@samsung.localdomain> +Date: Fri Aug 15 01:52:52 2008 +0200 + + Revert 123a87aff2e35b10efe6a1d715585b427e4a9afa it creates problems + with some pdf files + + poppler/Gfx.cc | 14 ++------------ + poppler/Gfx.h | 3 --- + 2 files changed, 2 insertions(+), 15 deletions(-) + +commit 27ddf3c5e839358c8553d41743faa8ee304767bf +Author: Pino Toscano <pino@kde.org> +Date: Wed Aug 13 13:55:57 2008 +0200 + + [Qt4] make sure to use the correct page width/height for form + widgets coordinates + + qt4/src/poppler-form.cc | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 2e7b0eb4af8cf5938833e5659d01b77096e7b7f7 +Author: Pino Toscano <pino@kde.org> +Date: Tue Aug 12 13:49:52 2008 +0200 + + [Qt4] add a method to get the activation action of a FormField + + qt4/src/poppler-form.cc | 19 +++++++++++++++++++ + qt4/src/poppler-form.h | 8 ++++++++ + 2 files changed, 27 insertions(+) + +commit f9e679adbd6830da26eb9909bcb16e3bdf0da6b4 +Author: Pino Toscano <pino@kde.org> +Date: Tue Aug 12 13:47:15 2008 +0200 + + create a static version of PageData::convertLinkActionToLink() + + qt4/src/poppler-page-private.h | 2 ++ + qt4/src/poppler-page.cc | 5 +++++ + 2 files changed, 7 insertions(+) + +commit a6ecc864ea3e94d7232cff6a2e8f49919d8f24ff +Author: Albert Astals Cid <tsdgeos@samsung.localdomain> +Date: Tue Aug 12 01:23:21 2008 +0200 + + initialize widget, fixes crash on EC2006.pdf + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 123a87aff2e35b10efe6a1d715585b427e4a9afa +Author: Albert Astals Cid <tsdgeos@samsung.localdomain> +Date: Tue Aug 12 00:37:09 2008 +0200 + + Cache the last created GfxResource, very useful because some pdf + created by pstopdf push and pop the same GfxResource all the time + + This brings us a speedup of 16 times (from 11 seconds to about 600 + msec) in kde bug 168663 + + poppler/Gfx.cc | 14 ++++++++++++-- + poppler/Gfx.h | 3 +++ + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit 5ad1a12183f4b8e328f32386a74b5616e7e59070 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 4 20:34:42 2008 +0200 + + Be less strict when parsing TTF tables + + With this change and freetype from CVS i can render Bug 16940 using + the splash renderer + + fofi/FoFiTrueType.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit d322720428fa416b7d5f23acc72d1d4b4f74d041 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 4 20:16:50 2008 +0200 + + Report an error when FoFiTrueType::load or FoFiTrueType::make fail + + poppler/SplashOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 901ebc84ff7c0872c3f9f5e6eaf418ba6400fa10 +Author: Pino Toscano <pino@kde.org> +Date: Sun Aug 3 10:54:09 2008 +0200 + + [Qt4] Make the paper color setting working as it should. + + A BGR colorspace means that colors should be set as blue,green,red, + and + not red,green,blue. + + qt4/src/poppler-private.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 66b34c78943be598778a3ef438b0cefac668c6a2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 2 13:54:34 2008 +0200 + + This should not be here, breaks jpeg rendering when not using libjpeg + + That was included erroneously when the file writing code was added + + poppler/Stream.cc | 1 - + 1 file changed, 1 deletion(-) + +commit fd8d71ea8b12393201ece9c09372fd69c7573025 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 23:47:51 2008 +0200 + + These defines are unneeded too + + msvc/poppler/poppler-config.h | 30 ------------------------------ + poppler-config.h.cmake | 30 ------------------------------ + poppler/poppler-config.h.in | 30 ------------------------------ + 3 files changed, 90 deletions(-) + +commit 391b5d5cdd9f63fe90229f88cdad628fb63c0206 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 23:36:09 2008 +0200 + + Get rid of more defines, say our version on command line tools, + also say our copyright + + Did not modify PSOutputDev.cc output as PS is too fragile + + msvc/poppler/poppler-config.h | 9 +-------- + poppler-config.h.cmake | 9 +-------- + poppler/PSOutputDev.cc | 2 +- + poppler/poppler-config.h.in | 9 +-------- + utils/pdffonts.cc | 3 ++- + utils/pdfimages.cc | 3 ++- + utils/pdfinfo.cc | 3 ++- + utils/pdftohtml.cc | 3 ++- + utils/pdftoppm.cc | 3 ++- + utils/pdftops.cc | 3 ++- + utils/pdftotext.cc | 3 ++- + 11 files changed, 18 insertions(+), 32 deletions(-) + +commit d14fb1513be045363f7edec21cee04fd4937ede2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 23:14:28 2008 +0200 + + Add GooList *getEncodingNames(); + + Forgot to commit this earlier :-( + + poppler/GlobalParams.cc | 19 +++++++++++++++++++ + poppler/GlobalParams.h | 2 ++ + 2 files changed, 21 insertions(+) + +commit 9fd34443d765ccd61864d18bceadc049d905b957 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 23:09:39 2008 +0200 + + remove defines we don't use at all + + msvc/poppler/poppler-config.h | 4 ---- + poppler-config.h.cmake | 4 ---- + poppler/poppler-config.h.in | 4 ---- + 3 files changed, 12 deletions(-) + +commit 0f13013dc3079915572b6b002dac8d01d2dbde04 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 23:06:50 2008 +0200 + + xpdfrc has been dead for a while + + msvc/poppler/poppler-config.h | 25 ------------------------- + poppler-config.h.cmake | 25 ------------------------- + poppler/poppler-config.h.in | 25 ------------------------- + 3 files changed, 75 deletions(-) + +commit 96392667d1331d2f8750f27c116e34bbf9282dca +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 22:20:55 2008 +0200 + + Provide a default constructor for FontInfo so you can use it as + metatype for qvariant + + qt4/src/poppler-fontinfo.cc | 5 +++++ + qt4/src/poppler-private.h | 7 +++++++ + qt4/src/poppler-qt4.h | 5 +++++ + 3 files changed, 17 insertions(+) + +commit 9fd1077e63d97a316380b8df4821bf4c9434fb52 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 17:47:51 2008 +0200 + + Build with cmake too + + utils/CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d8d6a3f46620d45c279b7ca1a4a2fa3a36285cde +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 1 17:44:07 2008 +0200 + + Improve manpages and add -listenc to pdfinfo and pdftotext in the way + + Our manpages listed things like xpdfrc and -cfg options we don't + support at all. + Also some options were missing from the man pages + Finally there was the -enc option you completely had to guess which + string to pass, + so i've added the -listenc option to get the user the list of + encodings he can use + + utils/Makefile.am | 2 ++ + utils/pdffonts.1 | 18 ------------------ + utils/pdfimages.1 | 14 -------------- + utils/pdfinfo.1 | 28 ++++------------------------ + utils/pdfinfo.cc | 16 ++++++++++++++-- + utils/pdftoppm.1 | 42 +++++++++++++++++++++--------------------- + utils/pdftops.1 | 41 +++-------------------------------------- + utils/pdftotext.1 | 32 ++++---------------------------- + utils/pdftotext.cc | 16 ++++++++++++++-- + utils/printencodings.cc | 34 ++++++++++++++++++++++++++++++++++ + utils/printencodings.h | 24 ++++++++++++++++++++++++ + 11 files changed, 120 insertions(+), 147 deletions(-) + +commit f5b0ca794b0879e3d239bf1d6138b15ead27d9ca +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 29 20:18:33 2008 +0930 + + Fix ActualText string length check in TextOutputDev.cc + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 21bbdc9d663995336900f1ce97cf294f04464e01 +Author: Boris Toloknov <tlknv@yandex.ru> +Date: Mon Jul 28 21:02:07 2008 +0200 + + make xml output valid xml + + utils/HtmlLinks.cc | 33 +++++++++++++++++-- + utils/HtmlOutputDev.cc | 85 + ++++++++++++++++++++++++++++++------------------ + 2 files changed, 85 insertions(+), 33 deletions(-) + +commit dccfc4c2910b47a77cd7b6019d9365f1684ffd0c +Author: Boris Toloknov <tlknv@yandex.ru> +Date: Mon Jul 28 20:58:13 2008 +0200 + + Limit ascent and descent are to reasonable values. + + See bug 16592 to cases where this helps + + utils/HtmlOutputDev.cc | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 0fd5a3db1ddad447d44b64eff9abfb077a7853a0 +Author: Boris Toloknov <tlknv@yandex.ru> +Date: Mon Jul 28 20:52:19 2008 +0200 + + Make html output to keep all the spaces with   + + utils/HtmlFonts.cc | 2 ++ + utils/HtmlOutputDev.cc | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 650c73fa0f570f699d907e33060fb23290940b42 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 28 20:44:13 2008 +0200 + + findDest crashes on null goostrings so rework the ifs a bit + + utils/HtmlOutputDev.cc | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit adee9c0e9e8b2de20309b3ae6eb8e6d6ed05cf85 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jul 26 00:04:03 2008 +0200 + + We are not storing the ctu, so decref and leak-- :-) + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit e7b3e3ae3080bd6f239f7d96761729ad30b075ae +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 23:52:28 2008 +0200 + + Fix leak + + qt4/src/poppler-form.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 006b974d4faae53e6bd51a4281dd923ab1c2d4e8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 23:15:11 2008 +0200 + + Fix memory leak + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 3a549d75acceedfa25dcf79074d0cdfb643c746e +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 23:08:21 2008 +0200 + + Free the previous modified object in case it exists + + poppler/XRef.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 040d244b97a554342061c777a286e99dbb9acabd +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 21:31:55 2008 +0200 + + Need this or otherwise it crashes on complete overwrite + + poppler/PDFDoc.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 11ebceeef938a7e6fa9b5437e65b5b4b822f3018 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 21:30:24 2008 +0200 + + Fix my last fix about saving, i think this is the correct one + + - One incremental update only write the modified entries xref, + not all + - Update gen to 0 when resizing entries + - On XRef::add correctly initialize all newly allocated entries + + poppler/PDFDoc.cc | 4 ++-- + poppler/XRef.cc | 57 + ++++++++++++++++++++++++++++++++++++++++++----------- + poppler/XRef.h | 2 +- + 3 files changed, 49 insertions(+), 14 deletions(-) + +commit 03d445f485f90972ab1c05d79b2999b763ab7377 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 20:16:54 2008 +0200 + + Fix XRef::writeToFile after my change + + poppler/XRef.cc | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 136fa97576f2df0d7a7563b34651ca222927ea57 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 25 20:12:51 2008 +0200 + + Fix XRef::add and XRef::addIndirectObject, also remove num from + XRefEntry + + Previous code was under some incorrect assumptions: + * our XRef does not maintain the free link list so if you want to + find a free entry you have to go though all of them + * our XRefEntry does not need a num because the index itself is + the num + + Conflicts: + + poppler/XRef.cc + + poppler/XRef.cc | 70 + ++++++++++++++++++++----------------------------------- + poppler/XRef.h | 1 - + 2 files changed, 25 insertions(+), 46 deletions(-) + +commit 55572b77da95c47393b78f3aff804ea9c5ae17e5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 22 22:50:00 2008 +0200 + + Really do what the comment says and also init changeLeft, changeTop + and changeZoom + + poppler/Link.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 8dc7afaeea08183de331ecfd41ce1971e7772fd0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 22 21:05:03 2008 +0200 + + Some documents have loops in XObject dictionaries, make sure we + don't get in an infinite loop while traversing them + + Fixes infinite loop on http://bugs.kde.org/show_bug.cgi?id=166145 + + poppler/FontInfo.cc | 44 ++++++++++++++++++++++++++++++++++++-------- + poppler/FontInfo.h | 4 ++++ + 2 files changed, 40 insertions(+), 8 deletions(-) + +commit 9fb17c952dcff798e45280eeb9c718680147e766 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 20 13:47:11 2008 +0200 + + Fix condition, we want thumb to be a Stream, not to be non null + + Fixes bug 16579 + + glib/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3696025977fd345b12767f75a2de6ed7e9467365 +Author: Pino Toscano <pino@kde.org> +Date: Fri Jul 18 23:32:25 2008 +0200 + + initialize pageWidgets, otherwise it can be a rubbish pointer + is Annots + is not a valid object + + poppler/Page.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 0189ff8b86de18486f7397076f7a0fbf133a1a33 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 1 20:16:50 2008 +0200 + + Fix condition, we want fetched_thumb to be a Stream, not to be + non null + + Fixes bug 16579 + + poppler/Page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5bd77dcdd5220d63934f4b3e78d85a936947a53d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 1 00:49:01 2008 +0200 + + forgot about we use autofoo too + + qt4/tests/Makefile.am | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 5ed2503003d973b5461594af15485af49591451d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 1 00:43:26 2008 +0200 + + unittesting about ActualText + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/check_actualtext.cpp | 33 +++++++++++++++++++++++++++++++++ + 2 files changed, 34 insertions(+) + +commit f3bb2eb556f5248242f6db85052ef045fcb697c6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 1 00:41:35 2008 +0200 + + Unbreak ActualText extraction + + poppler/Gfx.cc | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +commit 9e9543b105b39f8b0048c00fc94741e43ad615e9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jun 26 20:19:06 2008 +0200 + + use FindPackageHandleStandardArgs + + cmake/modules/FindLIBOPENJPEG.cmake | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +commit fec41ceddebe194f139bcc5b2f3fa74e7d1ae502 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jun 26 20:18:27 2008 +0200 + + need to use LIBOPENJPEG_FOUND, as it really represents whether + libopenjpeg was found or not + + CMakeLists.txt | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 5498d93e59a0b79e5add3dc6181d5e98ba689217 +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Fri Jun 20 21:42:34 2008 -0700 + + Use a single global FT_Library in CairoOutputDev + + Cairo may internally keep references to the FreeType fonts loaded in + CairoFontEngine even after poppler is done with them. Commit + 42db4890e829 + ("Do not call FT_Done_Face on a live cairo_font_face_t") introduced + a fix + for one use-after-free bug, by delaying deleting an FT_Face objects + until + cairo is done with it. + + That fix doesn't correct all the bugs. An FT_Library object is + created for + each CairoOutputDev object, and deleted when the CairoOutputDev + goes away. + But the FT_Library object should not be deleted while fonts loaded + using it + are still in use. And cairo can keep references to fonts around + more or + less indefinitely. + + To more fully fix the problem, we can either: + 1. Keep a count of not-yet-deleted fonts associated with each + FT_Library, + and wait to call FT_Done_FreeType until it drops to zero. + 2. Never call FT_Done_FreeType. + + The second option is the simplest. To avoid leaking memory FT_Library + objects, use a single global FT_Library instead of a + per-CairoOutputDev + copy. + + poppler/CairoOutputDev.cc | 18 +++++++++++++++--- + poppler/CairoOutputDev.h | 4 +++- + 2 files changed, 18 insertions(+), 4 deletions(-) + +commit c75632d62a052d3c3739b96f5586f97c68baf25b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 24 02:31:43 2008 +0200 + + Open in WriteOnly mode, fixes the fact that when writing to an + existing file, the contents beyond what we wrote were still there + + qt4/src/poppler-base-converter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9810fdfc54aac80aa99561a9d820d11b062e4637 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 24 02:12:21 2008 +0200 + + the entry is not updated here either, fix uninitialized variable use + + poppler/XRef.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 2da15db4751d3cb93d40b48e348dbc51f6e7a29f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jun 20 11:39:08 2008 +0200 + + Do not create an OCGs object if there isn't an OCProperties dictionary + in the Catalog + + poppler/Catalog.cc | 5 +++-- + poppler/Gfx.cc | 12 +++++++++++- + poppler/OptionalContent.cc | 25 +++++-------------------- + 3 files changed, 19 insertions(+), 23 deletions(-) + +commit d6fb5dcb7b7596961800d9744d17b6adb8d9a2ad +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Wed Jun 18 11:24:05 2008 -0700 + + Fix a crash in the cairo backend with Type 3 glyphs + + Commit 86b7e8a3bee7 ("Ensure cairo renders Type 3 glyphs with only + the fill + color") introduced a bug into the Cairo backend, causing evince + to crash + with the message + evince: cairo-pattern.c:679: cairo_pattern_destroy: Assertion + `((*&(&pattern->ref_count)->ref_count) > 0)' failed. + Fix this by updating reference counts to the fill and stroke + patterns when + modifying them in beginType3Char. + + Simplify the code as well by not saving the old stroke pattern before + overriding it; this is already done since beginType3Char/endType3Char + is + wrapped by calls to saveState/restoreState in Gfx::doShowText. + + poppler/CairoOutputDev.cc | 4 ++-- + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit c3a00c83f1d24c1f88e7ed3b3f772460e578f3cc +Author: Pino Toscano <pino@kde.org> +Date: Sun Jun 15 02:39:31 2008 +0200 + + poppler-page-transition.h is here now + + qt4/src/Doxyfile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2affed0fc97b958ae46f531c471a3cf0b04c0f55 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 14 01:24:49 2008 +0200 + + Give warnings if the build configuration for stream decoders is + different from default one + + configure.ac | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +commit 8e74bc612cb4102891324ffdbfcdb47293ecb95e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 14 01:13:53 2008 +0200 + + Warn the user if he does not have any enabled rendering backend + + configure.ac | 3 +++ + 1 file changed, 3 insertions(+) + +commit 99d2361032cbaafd69bd796170757ed6482f208d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 14 00:53:38 2008 +0200 + + Add a JPEG2000 decoder based on OpenJPEG + + Enabled by default since it's generally better than xpdf one + See + http://lists.freedesktop.org/archives/poppler/2008-June/003874.html + for more information + + CMakeLists.txt | 30 +++++- + cmake/modules/FindLIBOPENJPEG.cmake | 44 +++++++++ + configure.ac | 33 +++++++ + poppler/JPEG2000Stream.cc | 181 + +++++++++++++++++++++++++++++++++++ + poppler/JPEG2000Stream.h | 48 ++++++++++ + poppler/Makefile.am | 22 ++++- + poppler/Stream.cc | 7 +- + 7 files changed, 360 insertions(+), 5 deletions(-) + +commit e368838d7f9691c7b1adf7d7f62f65abed91eea7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 11 00:48:53 2008 +0200 + + [Qt4] Add the possibility of getting a QByteArray with the data of + an embedded font + + qt4/src/poppler-document.cc | 23 +++++++++++++++++++++++ + qt4/src/poppler-private.h | 3 +++ + qt4/src/poppler-qt4.h | 5 +++++ + 3 files changed, 31 insertions(+) + +commit 184292ffb8fef5aa5a72bdbfcc0c95b663f452bd +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 10 23:00:11 2008 +0200 + + Make the fontRef and the embRef accessible to FontInfo users + + poppler/FontInfo.cc | 2 +- + poppler/FontInfo.h | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 86b7e8a3bee74c5b89c451137cf9c2758ba6913f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 8 18:00:05 2008 +0930 + + Ensure cairo renders Type 3 glyphs with only the fill color + + poppler/CairoOutputDev.cc | 3 +++ + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 99e2d95728f41c91ab59a01c62d82b19a7a2e083 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 1 00:49:32 2008 +0930 + + glib: save/restore cairo state when rendering a page + + glib/poppler-page.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6f40ee4af6b59f9d2c326adc8d2574e45f4d4d29 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 8 23:46:04 2008 +0200 + + Make sure we use Qt4 moc to generate moc files of the qt4 frontend + + configure.ac | 20 ++++++++++++++++++++ + qt4/demos/Makefile.am | 2 +- + qt4/src/Makefile.am | 2 +- + qt4/tests/Makefile.am | 2 +- + 4 files changed, 23 insertions(+), 3 deletions(-) + +commit 86aa8fc0708f7da4a907a8bdb1845e53d29892b7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 5 19:21:08 2008 +0200 + + Fix leak on ABWOutputDev.cc + + poppler/ABWOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 979ef1cafa968d776a2b804ce555b11212212397 +Author: Koji Otani <sho@bbr.jp> +Date: Tue Jun 3 21:07:15 2008 +0200 + + Support for surrogates outside the BMP plane + + poppler/TextOutputDev.cc | 19 ++++++++++++++++++- + poppler/UTF8.h | 14 ++++++++++++++ + 2 files changed, 32 insertions(+), 1 deletion(-) + +commit 1614ab3036cf25c9b94967163996678d386ce0ac +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 1 16:32:55 2008 +0200 + + Do not limit CharCodeToUnicodeString to 8 characters + + poppler/Annot.cc | 10 +++++----- + poppler/CharCodeToUnicode.cc | 37 ++++++++++++++++++++---------------- + poppler/CharCodeToUnicode.h | 2 +- + poppler/Gfx.cc | 8 ++++---- + poppler/GfxFont.cc | 43 + +++++++++++++++++++++++------------------- + poppler/GfxFont.h | 6 +++--- + poppler/PSOutputDev.cc | 4 ++-- + 7 files changed, 60 insertions(+), 50 deletions(-) + +commit bf95c6970dacaa62512de858cf60ff6cf0c1bf7c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 1 00:07:11 2008 +0200 + + [Qt] Fix leak when calling Poppler::Document::scanForFonts + + qt/poppler-document.cc | 1 + + 1 file changed, 1 insertion(+) + +commit d21d7271fc74ab78cd157549138d0027cf179471 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 31 23:57:31 2008 +0200 + + Make sure file exists before printing it + + utils/HtmlOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0480a788c0f25af1bc09360b599debb37f831e10 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 27 23:20:32 2008 +0200 + + require gthread-2.0 + + cmake/modules/FindGTK.cmake | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 2e40ef652eb9fca7fe947acb2adfecc96ad3c50e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 26 22:13:38 2008 +0200 + + Do not shadow a paramer with a local variable name + + qt4/src/poppler-page.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 1fd856aa1fb48869111e5b86f263bfd94fa7af17 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 26 20:52:53 2008 +0200 + + Do not leak tSplash if transpGroupStack->blendingColorSpace is NULL + + poppler/SplashOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 492209ec8648342a3a5447611f3f1ce63b63e8e9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 26 20:51:06 2008 +0200 + + Move variables only used inside the loop inside the loop, fix delete + of uninitialized data due to my previous patch + + poppler/Page.cc | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +commit 79ab8cceb318f3bb5ebad431824e3ae593aea340 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 26 20:38:59 2008 +0200 + + Do not leak memory if data_out is NULL + + poppler/Page.cc | 35 ++++++++++++++++++----------------- + 1 file changed, 18 insertions(+), 17 deletions(-) + +commit f44c33344d4af31ee008826179bcd92db445f35a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 25 19:16:12 2008 +0200 + + [glib] Init glib threads in demo app as required by g_timer + + configure.ac | 4 ++-- + glib/demo/main.c | 4 ++++ + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 58d5b7b9ab9ac245481299c4765f3bd305580d2e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 21 22:18:29 2008 +0200 + + [Qt4] Fix text() method + + I'm not sure this is the real and correct fix, but it works more + than previous code so it's and improvement + + qt4/src/poppler-page.cc | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit e3e4113c73128f49f99289b592446d4382b5d65c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 12 15:39:43 2008 +0200 + + Add getters to some TextBlock members. + + Needed by some reader using poppler internals, bad you! + + poppler/TextOutputDev.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ff699e64bd1de78915aad4ddb79d6f529aef2b87 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 11 23:44:50 2008 +0200 + + Check the OC we found exists before using it + + Fixes crash http://bugs.freedesktop.org/show_bug.cgi?id=15899 + + poppler/OptionalContent.cc | 33 ++++++++++++++++++--------------- + 1 file changed, 18 insertions(+), 15 deletions(-) + +commit ac26ba5148b99a03a56e37ba201ad420b8619943 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 9 20:17:37 2008 +0200 + + Do not crash on unlock with wrong password + + qt/poppler-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 19ec5a531cb03a7bee1cfcc9c7d5c4390fbd069d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 8 23:15:58 2008 +0200 + + Fix build with --enable-fixedpoint + + splash/Splash.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1cf5f0fda542efef575a123622637d81b9c42053 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 7 18:49:28 2008 +0200 + + [Qt] Fix Document::unlock + + qt/poppler-document.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b5041924eb023cc095f2445935ff713cf65dacce +Author: Pino Toscano <pino@kde.org> +Date: Wed May 7 16:44:03 2008 +0200 + + do not delete the GooString owned by an Object + + poppler/Annot.cc | 4 ---- + 1 file changed, 4 deletions(-) + +commit 546a7b700862db00240de9fd50bdba1dd347765b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 4 15:26:26 2008 +0200 + + Fix leaks on error conditions + + poppler/Annot.cc | 6 ++++++ + poppler/ArthurOutputDev.cc | 1 + + poppler/JBIG2Stream.cc | 1 + + 3 files changed, 8 insertions(+) + +commit 914f1b1d814ab3d958aa0ca21ad73ef5aed20b89 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 3 18:21:28 2008 +0200 + + A widget annot does not always belong to a form, so check before + accessing the widget member + + poppler/Annot.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c907e41ab18dda10cd3c9789bd0e7fe71b6402a8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 30 00:42:34 2008 +0200 + + findSegment can return NULL check for it + + poppler/JBIG2Stream.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8b7f29b577bca3295e99fea4a5cf4a6bb7ba2617 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 30 00:26:28 2008 +0200 + + new[] implies delete[] + + poppler/ABWOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 926c13825d5f7364286975db8ffa507b92f4b3ab +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:44:51 2008 +0200 + + add lost return when adding kees patch + + poppler/Object.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ba9283f6bc78e97006e52ef5de20c958ee9e1a37 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:42:00 2008 +0200 + + make the function static + + utils/pdftoppm.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 931a8272f556ba8a35342f0c5bf53bdb57ea7a31 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:41:31 2008 +0200 + + make the variable static + + utils/pdftoabw.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1887d2910d2006c7fc3ecc95db0150f1537e9d0a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:35:17 2008 +0200 + + constify some static arrays + + poppler/CompactFontTables.h | 2 +- + poppler/Decrypt.cc | 8 ++++---- + poppler/Function.cc | 2 +- + poppler/GfxFont.cc | 6 +++--- + poppler/GfxState.cc | 4 ++-- + poppler/JBIG2Stream.cc | 10 +++++----- + poppler/JPXStream.cc | 4 ++-- + poppler/Lexer.cc | 2 +- + poppler/PSOutputDev.cc | 6 +++--- + poppler/PSTokenizer.cc | 2 +- + poppler/SplashOutputDev.cc | 2 +- + poppler/Stream-CCITT.h | 12 ++++++------ + poppler/Stream.cc | 10 +++++----- + poppler/UnicodeTypeTable.cc | 2 +- + 14 files changed, 36 insertions(+), 36 deletions(-) + +commit 51140e2d9490696d716f77d3225da0bfdfc212b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:14:59 2008 +0200 + + more static markers + + poppler/Annot.cc | 2 +- + poppler/DCTStream.cc | 2 +- + poppler/Object.cc | 2 +- + poppler/SplashOutputDev.cc | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 893703cb9eee879f728db329f7ee1fc19e7f980e +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:03:51 2008 +0200 + + add static + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7333bc913111e56ee241b7ef2bf6e9fea68b7da2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 23:01:13 2008 +0200 + + add static + + poppler/JBIG2Stream.cc | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 1ea36507f9c9f163b6772268046e7560d0c00dbc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 22:47:19 2008 +0200 + + make findModifier static + + poppler/GlobalParams.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit be9961571dbfabb982e6f69abd3bbc98fa971864 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 21:48:09 2008 +0200 + + make variables not used outside static + + utils/pdftohtml.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b157064a85350da6ea9c4f46e965e45ebc59d227 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 21:43:23 2008 +0200 + + constify setPSPaperSize + + utils/pdftops.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ee57ead8a6f34fa8de044399e5912395e0f3a425 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 21:37:57 2008 +0200 + + constify argDesc arrays + + Gives me binaries 2KB smaller (in total) in release build + + utils/parseargs.c | 18 +++++++++--------- + utils/parseargs.h | 4 ++-- + utils/pdffonts.cc | 2 +- + utils/pdfimages.cc | 2 +- + utils/pdfinfo.cc | 2 +- + utils/pdftoabw.cc | 2 +- + utils/pdftohtml.cc | 2 +- + utils/pdftoppm.cc | 2 +- + utils/pdftops.cc | 2 +- + utils/pdftotext.cc | 2 +- + 10 files changed, 19 insertions(+), 19 deletions(-) + +commit 9f93d9eb464877e0d23dcf205295da9162f03253 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 29 20:45:01 2008 +0200 + + make psOpNames static + + Makes my release build 64 bytes smaller + + poppler/Function.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 29e3e779c68371b7c4aadcf68ee0712046f39c6d +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 23:47:01 2008 +0200 + + remember to call the base implementation here + + qt4/demos/optcontent.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit a188f3cd36775d78ace5b5d62c8ab7c059b3b2b1 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 23:42:09 2008 +0200 + + reset the current page to 0, when closing a document + + qt4/demos/viewer.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit 7eca6da6436ffc1c41cfed1a07be4dafa1172463 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 23:41:45 2008 +0200 + + no need to manually disconnect from the model, as it will be deleted + by the document anyway + + qt4/demos/optcontent.cpp | 1 - + 1 file changed, 1 deletion(-) + +commit 6cddda7f3c3b8ddb95e6aba1b234a27c4454c23d +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 22:41:59 2008 +0200 + + sync updateFont() with SplashOutputDev + + poppler/ArthurOutputDev.cc | 75 + ++++++++++++++++++++++++++++++++++---------- + 1 file changed, 59 insertions(+), 16 deletions(-) + +commit ddc7c1f8c24762bae615e7dec92e92a58c827478 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 18:12:51 2008 +0200 + + construct AnnotPolygon for Polygon and PolyLine annotations + + poppler/Annot.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f9c7e8037b7165b6271ce7aea0d315053c4d66a5 +Merge: 59d33d8 f5fec4f +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 18:09:59 2008 +0200 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 59d33d8e99673f73ccf2ad9a62bd25fca51f0eb8 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 17:56:42 2008 +0200 + + use the base implementation to update all the states + + poppler/ArthurOutputDev.cc | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit 45d2a9529bf241554c59437118cb8c705554dc27 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 17:55:39 2008 +0200 + + Set the font antialiasing from the painter settings, instead of the + global settings. + + poppler/ArthurOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5faa72fd70e0d85268e807a8b870d80dda9189a9 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 26 17:53:28 2008 +0200 + + Get the font and painter matrices, and reenable the font drawing. + + poppler/ArthurOutputDev.cc | 28 +++++++++++++++++++++------- + 1 file changed, 21 insertions(+), 7 deletions(-) + +commit f5fec4fdedd8d316b19968545e447e2036a1bb47 +Author: Kees Cook <kees@outflux.net> +Date: Wed Apr 23 19:53:03 2008 +0200 + + provide type-checking for union pointer accesses + + poppler/Object.h | 68 + ++++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 43 insertions(+), 25 deletions(-) + +commit a567c921ce538616f4ba0b7933086ef5a8ab0f55 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Tue Apr 22 23:09:10 2008 +0200 + + Little change to avoid AnnotWidget crashing when they aren't related + to FormWidgets. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +commit 73798c95b8a4c0504e9246e6f73fd31f812ad6fa +Author: Albert Astals Cid <tsdgeos@bluebox.(none)> +Date: Mon Apr 21 19:56:52 2008 +0200 + + Link to pthread when needed + + Should fix bug 15625 + + configure.ac | 2 + + m4/acx_pthread.m4 | 280 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Makefile.am | 4 + + 3 files changed, 286 insertions(+) + +commit 6c248bdad77235a45402d9693a0b822cc208b6b9 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 20 18:32:59 2008 +0200 + + the dtor should be virtual + + qt4/src/poppler-converter-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 68dba1a452ca70add5b05ab8e2adab838bc2cb73 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 20 16:21:10 2008 +0200 + + if ncand is a Guint cand should be one too + + poppler/CMap.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0b91eb19f5a3d07b625ee5188f1fcb4b4b1544ea +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 20 16:17:50 2008 +0200 + + Unused var-- + + poppler/GfxFont.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1ed3cc40987b691319fd9f1a30296d80de5732fd +Author: Pino Toscano <pino@kde.org> +Date: Wed Apr 16 15:45:45 2008 +0200 + + fix border style conversion + + qt4/src/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7c8feb4e3627bde2052a7e536d2d49d1cbbce8ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 15 21:57:31 2008 +0200 + + Hack to "support" 16 bits images + + Everywhere we assume a component fits in 8 bits, with this hack + we treat 16 bit images as 8 bit ones until it's fixed correctly. + Fixes http://bugs.kde.org/show_bug.cgi?id=158165 + + poppler/GfxState.cc | 6 ++++++ + poppler/Stream.cc | 9 +++++++++ + 2 files changed, 15 insertions(+) + +commit f338a9ded5d42dd65853c5c7bbe27f6724096416 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 21:41:51 2008 +0200 + + [Qt4] convert the sound annotations + + qt4/src/poppler-page.cc | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit 733d51fca04ee682fed2242f868edd545f3755fa +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 21:38:25 2008 +0200 + + [Qt4] First version of a SoundAnnotation. + + qt4/src/poppler-annotation.cc | 87 + +++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-annotation.h | 30 +++++++++++++- + 2 files changed, 116 insertions(+), 1 deletion(-) + +commit feb1ea091111bd7292879c465590acfd7671c876 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 21:36:26 2008 +0200 + + First version of AnnotSound. + + poppler/Annot.cc | 37 ++++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 26 ++++++++++++++++++++++++++ + 2 files changed, 62 insertions(+), 1 deletion(-) + +commit ec2cf81edf1b2c6707de4d30316ff5f5e24534d4 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 18:31:21 2008 +0200 + + [Qt4] convert the file attachment annotations + + qt4/src/poppler-page.cc | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit 9fa2e96c96d365ae67859545ebd635d726784fca +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 18:29:00 2008 +0200 + + [Qt4] Initial version of FileAttachmentAnnotation + + qt4/src/poppler-annotation.cc | 88 + +++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-annotation.h | 29 +++++++++++++- + 2 files changed, 116 insertions(+), 1 deletion(-) + +commit 5899aff11f94e707654574e830e0757b1df558d4 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 10:50:39 2008 +0200 + + [Qt4] Read the annotations from the core, instead of own parsing. + + Almost all the data are converted correctly, the results seem to be + the same. + Added TODOs in the few parts (not essential) I was not able to figure + out how to convert, yet. + Covert also the Caret annotations. + + qt4/src/poppler-annotation-helper.h | 2 +- + qt4/src/poppler-page.cc | 851 + ++++++++++++++++------------------- + 2 files changed, 393 insertions(+), 460 deletions(-) + +commit 40a12793c5ccea206d79e0c17e2f2d0cf74bb4f3 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 02:21:55 2008 +0200 + + add getters for the AnnotPolygon properties + + poppler/Annot.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 9311f75d4c3da991efb8afd00701a0ce1cbae1b0 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Apr 13 01:52:36 2008 +0200 + + Almost full AnnotPolygon support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 99 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 37 ++++++++++++++++++++ + 2 files changed, 136 insertions(+) + +commit 01aa052ed761a4ada471d196985825986bb58627 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Apr 13 01:13:49 2008 +0200 + + Extend AnnotPath behaviour to include cooordinate array parsing. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 96 + +++++++++++++++++++++++++++++------------------------- + poppler/Annot.h | 4 ++- + 2 files changed, 55 insertions(+), 45 deletions(-) + +commit ca52830e9519ae7b778f98e5c2547daef7da5f09 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Apr 13 00:54:13 2008 +0200 + + Added OptionalContent support to Annots. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 9 +++------ + poppler/Annot.h | 5 +++-- + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit 4b87196b7829c87d15af4e8b4138ca97548fb519 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 00:18:24 2008 +0200 + + Isolate the embedded file reading logic into a new EmbFile + constructor. + + This way, it can be shared and reused in various places (Catalog, + AnnotFileAttachment, etc). + + poppler/Catalog.cc | 205 + ++++++++++++++++++++++++++++------------------------ + poppler/Catalog.h | 1 + + 2 files changed, 112 insertions(+), 94 deletions(-) + +commit 45b407e51905948690065749085a4af1cbb29a8e +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 13 00:14:38 2008 +0200 + + correctly get the FileSpec dictionary + + poppler/Annot.cc | 4 +++- + poppler/Annot.h | 2 +- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit c3aa3a97d9c553ea7976741d798901352fb5381c +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 12 22:45:57 2008 +0200 + + properly initialize an AnnotPath + + poppler/Annot.cc | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit a3406fb2ace1390db1c181823a7bfc66c9174d98 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 12 22:40:42 2008 +0200 + + properly dispose the memory of the ink lists + + poppler/Annot.cc | 13 ++++++++++++- + poppler/Annot.h | 1 + + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 0dad70e2d12e8b587cab8ce2d914c81c6897a1d1 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 12 22:15:35 2008 +0200 + + make AnnotInk working. + + - get the point indexes in the correct way + - dispose with free what you allocate with malloc + - fix logic when checking for an even number of points + + poppler/Annot.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 77404e24ea1e175fc9b55097dc5b35cc34760659 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 12 21:08:54 2008 +0200 + + a length is an int + + poppler/Annot.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bc2b2ffd2144f951c311e968fba4bc50b7c43ff3 +Merge: cd5afe6 bacc1dd +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Apr 12 17:40:49 2008 +0200 + + Fixed merging conflict. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + +commit cd5afe6d9eca687ee224ff7680a8cba28d81a36d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 12 00:44:08 2008 +0200 + + Do not take into account Colorspace resource subdictionary for + image XObjects + + Fixes bug 15125 + The motivation under that change is on section 4.5.2 of the spec: + Certain objects, such as image XObjects, specify a + color space as an explicit parameter, often associated with the + key ColorSpace. + In this case, the color space array or name is always defined + directly as a PDF + object, not by an entry in the ColorSpace resource + subdictionary. This conven- + tion also applies when color spaces are defined in terms of other + color spaces. + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bacc1dd9f37ff19c5e54878a5b08e7d734584bbf +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 12 17:20:09 2008 +0200 + + Read the "in reply to" reference as such, without reading the + associated annotation dictionary. + + poppler/Annot.cc | 10 ++++------ + poppler/Annot.h | 4 ++-- + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit ffe09454a0948a6107bcc38f23ba2068151c547d +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Apr 12 17:17:59 2008 +0200 + + Initial Annot3D parsing a few general improvements. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 130 + ++++++++++++++++++++++++++++++++++++++++++++++++++---- + poppler/Annot.h | 84 +++++++++++++++++++++++++++++------ + 2 files changed, 193 insertions(+), 21 deletions(-) + +commit 8757c577241dda31bc59c7d1c208c159ad428877 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Apr 12 10:38:07 2008 +0200 + + AnnotFileAttachment support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 38 ++++++++++++++++++++++++++++++++++++-- + poppler/Annot.h | 25 +++++++++++++++++++++++++ + 2 files changed, 61 insertions(+), 2 deletions(-) + +commit 36989658149fc9e5e8a049ce070a102f35b7bddc +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Apr 12 09:55:26 2008 +0200 + + AnnotInk support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 113 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 45 ++++++++++++++++++++++ + 2 files changed, 158 insertions(+) + +commit 464b171d0e9b989196c287f2ee4dfbbc14212aa9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 12 00:44:08 2008 +0200 + + Do not take into account Colorspace resource subdictionary for + image XObjects + + Fixes bug 15125 + The motivation under that change is on section 4.5.2 of the spec: + Certain objects, such as image XObjects, specify a + color space as an explicit parameter, often associated with the + key ColorSpace. + In this case, the color space array or name is always defined + directly as a PDF + object, not by an entry in the ColorSpace resource + subdictionary. This conven- + tion also applies when color spaces are defined in terms of other + color spaces. + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42db4890e8295aaec5a1be12d1414fc0a9048550 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 27 10:52:22 2008 +0000 + + Do not call FT_Done_Face on a live cairo_font_face_t. + + Currently CairoFont calls FT_Done_Face on its deletion, but the + FT_Face + is usually still in use within cairo. This causes a failure later when + cairo tries to create a glyph from its cairo_font_face_t. + + From http://bugs.freedesktop.org/show_bug.cgi?id=15216: + ==13745== Invalid read of size 4 + ==13745== at 0x51BE572: FT_Load_Glyph (ftobjs.c:549) + ==13745== by 0x4A24921: _cairo_ft_scaled_glyph_init + (cairo-ft-font.c:1922) + ==13745== by 0x4A117AB: _cairo_scaled_glyph_lookup + (cairo-scaled-font.c:1674) + ==13745== by 0x4A12A5A: _cairo_scaled_font_glyph_device_extents + (cairo-scaled-font.c:1124) + ==13745== by 0x4A21ECD: _cairo_analysis_surface_show_glyphs + (cairo-analysis-surface.c:516) + ==13745== by 0x4A144DC: _cairo_surface_show_glyphs + (cairo-surface.c:2086) + ==13745== by 0x4A1FCC8: _cairo_meta_surface_replay_internal + (cairo-meta-surface.c:816) + ==13745== by 0x4A214B1: _paint_page (cairo-paginated-surface.c:299) + ==13745== by 0x4A2171E: _cairo_paginated_surface_show_page + (cairo-paginated-surface.c:445) + ==13745== by 0x4A14BDF: cairo_surface_show_page + (cairo-surface.c:1702) + ==13745== by 0x49FF661: cairo_show_page (cairo.c:2155) + ==13745== by 0xA267D97: + pdf_document_file_exporter_end_page(_EvFileExporter*) + (ev-poppler.cc:1753) + ==13745== Address 0x55c5630 is 88 bytes inside a block of size + 552 free'd + ==13745== at 0x402269C: free (vg_replace_malloc.c:326) + ==13745== by 0x51B7ABC: ft_free (ftsystem.c:158) + ==13745== by 0x51BB319: ft_mem_free (ftutil.c:171) + ==13745== by 0x51BC318: destroy_face (ftobjs.c:856) + ==13745== by 0x51BC3B2: FT_Done_Face (ftobjs.c:1972) + ==13745== by 0x4363704: CairoFont::~CairoFont() + (CairoFontEngine.cc:251) + ==13745== by 0x436401D: CairoFontEngine::getFont(GfxFont*, XRef*) + (CairoFontEngine.cc:335) + ==13745== by 0x4366915: CairoOutputDev::updateFont(GfxState*) + (CairoOutputDev.cc:318) + ==13745== by 0x5093BF1: Gfx::opShowText(Object*, int) (Gfx.cc:3073) + ==13745== by 0x508F901: Gfx::execOp(Object*, Object*, int) + (Gfx.cc:726) + ==13745== by 0x50906FF: Gfx::go(int) (Gfx.cc:594) + ==13745== by 0x5090C96: Gfx::display(Object*, int) (Gfx.cc:557) + + The solution is to release the reference to the cairo_font_face_t upon + destruction of the CairoFont, and then to release the FT_Face from the + destroy notify of the cairo_font_face_t. + + poppler/CairoFontEngine.cc | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +commit 5f60843824582ece36d806508ec388330ddee854 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Tue Apr 8 00:30:57 2008 +0200 + + Added AnnotCoord support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 64 + +++++++++++++++++--------------------------------- + poppler/Annot.h | 69 + +++++++++++++++++++++++++----------------------------- + 2 files changed, 54 insertions(+), 79 deletions(-) + +commit a6f70f465a3e6719d63cefbe3c27bae015be43c1 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 6 13:12:01 2008 +0200 + + add getters for the coordinates in an AnnotLine + + poppler/Annot.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1d83d6edf9a843335e37a4d1e0e0dd71eb23d93b +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 6 12:24:42 2008 +0200 + + [Qt4] the caret symbol is an enum value, now + + qt4/src/poppler-annotation.cc | 35 ++++++++++++++++++++++++++++------- + qt4/src/poppler-annotation.h | 7 +++++-- + 2 files changed, 33 insertions(+), 9 deletions(-) + +commit 229d991a3258cb9b56f5e00f2deb3c976253cf68 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 6 12:23:04 2008 +0200 + + the caret symbol does not seem to allow additional values, so convert + it to an enum + + poppler/Annot.cc | 11 +++++++---- + poppler/Annot.h | 9 +++++++-- + 2 files changed, 14 insertions(+), 6 deletions(-) + +commit fc24500ddd9182f97d23c46eaafc6be79a6721eb +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 6 11:43:49 2008 +0200 + + propetly initialise a couple of members; leak less + + poppler/ArthurOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 9409de1e7c5b3770c7ef00c01ee376953dd532a5 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Apr 6 01:38:25 2008 +0200 + + Changed AnnotFreeText RD field to the new parseDiffRectangle. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 35 ++--------------------------------- + 1 file changed, 2 insertions(+), 33 deletions(-) + +commit 28c5ee2e9fc2a24d2f2efb3d74d5cf882a106239 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 23:19:33 2008 +0200 + + typo fix + + poppler/Annot.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed02769688466ca72bf35d4223c3822a1245604b +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 19:36:21 2008 +0200 + + read the destination of a link annotation + + poppler/Annot.cc | 5 ++++- + poppler/Annot.h | 4 ++-- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit ca31bf12a9d70bac88e457f7799e9935aba58640 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 16:48:53 2008 +0200 + + variable forgotten in the copy&paste... + + qt4/src/poppler-annotation.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4168daa141b76e5fcd07d046aca8dac2f3037ff9 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 16:34:12 2008 +0200 + + [Qt4] deserialize also CaretAnnotation's + + qt4/src/poppler-annotation.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit b55bcc2aa95825863bef23ab96364b350a49949d +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 16:31:31 2008 +0200 + + [Qt4] first version of a CaretAnnotation. + + qt4/src/poppler-annotation.cc | 80 + +++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-annotation.h | 25 ++++++++++++- + 2 files changed, 104 insertions(+), 1 deletion(-) + +commit 4c9a02b7e49666efe10fdc16e7a03d8d520b65ec +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 16:01:58 2008 +0200 + + First version of AnnotCaret. + + poppler/Annot.cc | 36 +++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 22 ++++++++++++++++++++++ + 2 files changed, 57 insertions(+), 1 deletion(-) + +commit d260fe9e514c667b66969b982119429cc922eb07 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 15:54:29 2008 +0200 + + isolate the code for parsing a "difference rectangle" in an own + function + + poppler/Annot.cc | 54 + +++++++++++++++++++++++++++++++----------------------- + 1 file changed, 31 insertions(+), 23 deletions(-) + +commit 760833e409c122c0a61f7c87fd3133eebc10b402 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 15:36:43 2008 +0200 + + First version of AnnotGeometry. + + poppler/Annot.cc | 77 + ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + poppler/Annot.h | 24 +++++++++++++++++ + 2 files changed, 99 insertions(+), 2 deletions(-) + +commit 95d9d2362534c0524ad0448818b2d69b0909d482 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 03:23:00 2008 +0200 + + finally, load the QuadPoints correctly + + when checking the validity of the coordinate, do the comparison just + with the proper one (either X or Y); + free the "point" object after each iteration + + poppler/Annot.cc | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit af1ffcbcec1730332d11f8da4a7ddac833b22408 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 02:54:00 2008 +0200 + + More robust reading of QuadPoints (reset the allocated memory, + use the heap) + + poppler/Annot.cc | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 68fd98d69bac20282665cf6b824da30c3b310f0b +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 02:51:41 2008 +0200 + + Really implement AnnotTextMarkup. + + poppler/Annot.cc | 29 +++++++++++++++++++++++++---- + poppler/Annot.h | 2 +- + 2 files changed, 26 insertions(+), 5 deletions(-) + +commit 69a2ecfaf8f8cffd3027db5c3cc88c41413e42f1 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 01:38:28 2008 +0200 + + Add the Stamp annotation type. + + poppler/Annot.cc | 28 +++++++++++++++++++++++++++- + poppler/Annot.h | 20 ++++++++++++++++++++ + 2 files changed, 47 insertions(+), 1 deletion(-) + +commit 97be4332818bcf58461816be995d88926809a4e5 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Fri Apr 4 23:49:12 2008 +0200 + + Updated glib bindings. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + glib/demo/annots.c | 32 +++++--------------------------- + glib/poppler-annot.cc | 27 +++++---------------------- + glib/poppler-annot.h | 13 +------------ + 3 files changed, 11 insertions(+), 61 deletions(-) + +commit 5caac407cdaf58621ac27e5561b31a995404ccb3 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Fri Apr 4 23:36:46 2008 +0200 + + Fixed icon name in AnnotText. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 25 ++++++------------------- + poppler/Annot.h | 15 +++------------ + 2 files changed, 9 insertions(+), 31 deletions(-) + +commit 0b714a61383da1b62daf2a60e3f6fcda09b4e9f2 +Author: Adam Batkin <adam@batkin.net> +Date: Thu Apr 3 20:02:52 2008 +0200 + + FindFirstFile returns INVALID_HANDLE_VALUE and not NULL on error + + goo/gfile.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit be765f27cc5430d9bb2a3e113eb245d67c20a376 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Mar 31 12:37:33 2008 +0200 + + [glib] Fix a crash in outline demo due to page_num == dest_page_num + - 1 + + glib/demo/utils.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e991e9ac6fcc0b6928b96fe8326eebcf3cb720ca +Author: Albert Astals Cid <tsdgeos@localhost.(none)> +Date: Sat Mar 29 13:25:52 2008 +0100 + + Add the export macro + + qt4/src/poppler-page-transition.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b70ca35dce6da6efdff254c11a63de4f44228278 +Author: Albert Astals Cid <tsdgeos@localhost.(none)> +Date: Sat Mar 29 00:30:31 2008 +0100 + + Duplicate page-transition files on qt4 + + qt4/src/CMakeLists.txt | 4 +- + qt4/src/Makefile.am | 4 +- + qt4/src/poppler-page-transition-private.h | 28 ++++++ + qt4/src/poppler-page-transition.cc | 95 +++++++++++++++++++ + qt4/src/poppler-page-transition.h | 146 + +++++++++++++++++++++++++++++ + 5 files changed, 273 insertions(+), 4 deletions(-) + +commit b5312785063235cef7584ab6a5d198fb72de0988 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Wed Mar 26 23:56:49 2008 +0100 + + Improved glib annot demo. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + glib/demo/annots.c | 314 + +++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 289 insertions(+), 25 deletions(-) + +commit 7cc8fd70f68d2cdab7ab83a0ecf6c8896c971d62 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 21:03:34 2008 +0100 + + remove damn error + + qt4/src/poppler-page.cc.orig | 1317 + ------------------------------------------ + 1 file changed, 1317 deletions(-) + +commit 7a47ff3b54678a3de6964d25050e02186484f39a +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 21:00:32 2008 +0100 + + [Qt4] Add support for JavaScript links, and create them when present. + + qt4/src/poppler-link.cc | 36 ++ + qt4/src/poppler-link.h | 32 +- + qt4/src/poppler-page.cc | 7 + + qt4/src/poppler-page.cc.orig | 1317 + ++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 1391 insertions(+), 1 deletion(-) + +commit a6f2c10ee01ee62ae945b50f6b6eae380377fe03 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 20:59:21 2008 +0100 + + [Qt4] Read the document-level JavaScript scripts. + + qt4/src/poppler-document.cc | 15 +++++++++++++++ + qt4/src/poppler-qt4.h | 8 ++++++++ + 2 files changed, 23 insertions(+) + +commit b8a471e55b998836c09c65ff736afdef8ac55189 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 20:56:01 2008 +0100 + + Add support for JavaScript actions, and read them when found. + + poppler/Link.cc | 33 +++++++++++++++++++++++++++++++++ + poppler/Link.h | 23 +++++++++++++++++++++++ + 2 files changed, 56 insertions(+) + +commit 2fd85dc1b8b2ababadfc60e285c08a844737e4bb +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 20:53:42 2008 +0100 + + Read the JavaScript codes in the NameTree of the Catalog. + + poppler/Catalog.cc | 39 +++++++++++++++++++++++++++++++++++++++ + poppler/Catalog.h | 7 +++++++ + 2 files changed, 46 insertions(+) + +commit 312f14f5b7be1f0d62620477222919423c3869e0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 20:05:31 2008 +0100 + + compile++ + + fofi/FoFiBase.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5bd750062e1fb136f77a55d1f35b2d6fabaad1b3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 19:42:43 2008 +0100 + + update version + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit 10d4a8b9aed51902157c04d9deea0e99d829c4f6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 19:42:36 2008 +0100 + + fill news + + NEWS | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 2069826d61ebd527768b6455689276c0a8288085 +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 16:05:06 2008 +0100 + + missing break + + qt4/src/poppler-page.cc | 1 + + 1 file changed, 1 insertion(+) + +commit d6a0c6a6803a03f402c2dcde41c6195e951470ba +Author: Pino Toscano <pino@kde.org> +Date: Wed Mar 26 15:50:39 2008 +0100 + + initialize posterStream to avoid crashing later + + poppler/Movie.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 0be811b3ad86b1cb14be94a017e70c65b8e64730 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 25 22:59:22 2008 +0100 + + Don't end up in an infinite recursive loop in case resObj dict is + the same we are already in + + poppler/FontInfo.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0222c6ceb0fcf1d7c4422691a68a035a558ad614 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 24 17:14:07 2008 +0100 + + fix build when using cmake, not sure it's completely ok, but at + least i can compile + + CMakeLists.txt | 1 + + cmake/modules/FindGTK.cmake | 23 ++++++++++++++++------- + config.h.cmake | 3 +++ + glib/CMakeLists.txt | 17 +++++++++++------ + glib/poppler-page.cc | 2 +- + glib/test-poppler-glib.cc | 2 +- + 6 files changed, 33 insertions(+), 15 deletions(-) + +commit 3e4164f2db69358adf07596195842dd00458b621 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 24 15:10:31 2008 +0100 + + fix some cmake HAVE_foo + + CMakeLists.txt | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 22f615aee488cc363a078330861e80f389f47061 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Mar 23 13:22:07 2008 +0100 + + Fixed wrong functions. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + glib/poppler-annot.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cccfe42ed9c53d27cf6a1403ae55bf34a053012d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 19:12:05 2008 +0100 + + Fix rm line not to error when no *moc file is present + + qt4/src/Makefile.am | 2 +- + qt4/tests/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit e60d39ba0e8b9742106a0c9b1385b1c907729c3f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 19:11:17 2008 +0100 + + Fix rm line not to error if no *moc file is present + + qt4/demos/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d9d52e622c6b28a9941168bb73839ec335ca7232 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 19:10:40 2008 +0100 + + Fix configure to not require gdk when we are on try mode + + configure.ac | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 9b8809298dd16cdbffcc12b6db8e274578934063 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 15:49:02 2008 +0100 + + It's really only an error if < 0 + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0fb1e697cc4100ce23298141c8b5829273872423 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 15:46:44 2008 +0100 + + remove unneeded variable + + poppler/PDFDoc.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 3404cb626ee9b4520d6fe601e07560745a4cb42a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 15:44:50 2008 +0100 + + Remove OutStream::reset since noone uses it + + This way we have a fseek less to care about if worked or not + + poppler/Stream.cc | 5 ----- + poppler/Stream.h | 5 ----- + qt4/src/poppler-qiodeviceoutstream-private.h | 1 - + qt4/src/poppler-qiodeviceoutstream.cc | 5 ----- + 4 files changed, 16 deletions(-) + +commit 066595dd06c930997d5ec65a06c822616af9baa0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 15:43:07 2008 +0100 + + Check the document stream is seekable when opening it + + Fixes bug 14126 + + poppler/PDFDoc.cc | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 23b6475463f8973b5ac83bb21a6b7b6000cc435b +Author: Ed Avis <eda@waniasset.com> +Date: Sat Mar 22 13:55:59 2008 +0100 + + Check for fseek return values + + fofi/FoFiBase.cc | 14 ++++++++++++-- + poppler/GfxFont.cc | 12 ++++++++++-- + 2 files changed, 22 insertions(+), 4 deletions(-) + +commit b33bb282e45cf1a083cfbb13603ac465d386c28d +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Fri Mar 21 13:53:21 2008 +0100 + + Fixed poppler glib public api. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + glib/poppler-annot.cc | 4 ++-- + glib/poppler-annot.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 371932f413d570d7784c668f30834d3d92d7aa80 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 20 11:44:32 2008 +0100 + + [glib] Remove unused variable. + + glib/poppler-document.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 21fa476ac384256c15a954b708e009f2b336b06f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Mar 20 11:42:32 2008 +0100 + + [glib] Do not cache image_dev in poppler page. + + Thanks to Kouhei Sutou who caught the problem. + + glib/poppler-page.cc | 60 + ++++++++++++++++++++++++++------------------- + glib/poppler-private.h | 3 --- + glib/test-poppler-glib.cc | 9 ++++++- + 3 files changed, 43 insertions(+), 29 deletions(-) + +commit 22cd70d8fc308fb8b19d36d0172014ba532230fb +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 19 21:52:14 2008 +0100 + + poppler_annot_markup_get_opacity returns a double so use %f + + glib/demo/annots.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b9a5fd4671638caa91f8a389be278d993391f499 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 19 21:28:49 2008 +0100 + + updated by gtk-doc + + glib/reference/tmpl/poppler-action.sgml | 1 + + glib/reference/tmpl/poppler.sgml | 3 +++ + 2 files changed, 4 insertions(+) + +commit b7e0b740578ea1e84ac0ef850b5a03c66b2863e3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 19 21:28:01 2008 +0100 + + Fill 0.7.3 news + + NEWS | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 3adaff1dad8127fdd06653cf49196027ad414a08 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 19 21:27:46 2008 +0100 + + Bump version to 0.7.3 + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit 52dd710b63911be2d8c960de0232c497c35ecac8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 19 18:35:35 2008 +0100 + + [glib] Update outline and links demos to the new POPPLER_ACTION_NONE + + glib/demo/utils.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6a22f0a20df38156c06e8ba10649e0828a1da102 +Author: Eugen Dedu <Eugen.Dedu@pu-pm.univ-fcomte.fr> +Date: Wed Mar 19 18:32:48 2008 +0100 + + [glib] Consider no action as an action of type None instead of Unknown + + glib/poppler-action.cc | 2 +- + glib/poppler-action.h | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 185d5818fd546f85934b041d5b0cdcdf1849b1dc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Mar 18 20:08:21 2008 +0100 + + Improve error handling when creating a document + + glib/poppler-document.cc | 40 ++++++++++++++++++++++++++++------------ + glib/poppler.h | 5 ++++- + 2 files changed, 32 insertions(+), 13 deletions(-) + +commit 9bba2748985049515bfd9c9b44f26b92fa704078 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 15 01:11:39 2008 +0100 + + Some more free + + poppler/OptionalContent.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit bfc308935fa138e27c4d2ad0e1c1cad20eba8e8a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 15 01:05:32 2008 +0100 + + Use error instead of printf + + poppler/OptionalContent.cc | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 998b1523ee653c1585f03b4a580e0d95ba694aca +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Mar 15 01:02:31 2008 +0100 + + Some free + + poppler/OptionalContent.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit c65a66a82259f547927cbb918611bcf4a8e264b2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 14 20:29:53 2008 +0100 + + xx0 is non exclusive so that should be < not <= + + Fixes several warnings about writes on bad places + + splash/SplashXPathScanner.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit bd2272f3079319d1c05ca93f7fb6eb0a5370b938 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 14 19:52:04 2008 +0100 + + Fix "Make sure we don't draw outside the bitmap on Splash::fillGlyph2" + when painting with no aa + + Fixes bug 15009 + + splash/Splash.cc | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 5bf8d864e68854f0855e07fb67aa124e06c739cd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 12 22:48:07 2008 +0100 + + fix build + + glib/reference/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit d0be5c86dcd3310062d820b3515c31e4720af2ca +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 12 22:40:59 2008 +0100 + + Update version to 0.7.2 and fill NEWS + + CMakeLists.txt | 2 +- + NEWS | 20 ++++++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 5 files changed, 26 insertions(+), 6 deletions(-) + +commit 0b2ecf39572821a99374e6acec7c1bd438911bbc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 12 22:38:57 2008 +0100 + + update soname here too + + glib/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f5065016b168e4896e2fe774cd22bbd900849b52 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 12 22:06:53 2008 +0100 + + Make GDK dependency option for glib bindings + + Fixes bug #13719. + + configure.ac | 45 ++- + glib/Makefile.am | 7 +- + glib/demo/page.c | 88 +++++- + glib/demo/render.c | 4 + + glib/poppler-action.h | 1 - + glib/poppler-annot.cc | 26 +- + glib/poppler-annot.h | 2 +- + glib/poppler-document.h | 2 - + glib/poppler-features.h.in | 1 + + glib/poppler-page.cc | 695 + ++++++++++++++++++++++++++------------------ + glib/poppler-page.h | 76 +++-- + glib/poppler.h | 2 +- + glib/test-poppler-glib.cc | 2 +- + 13 files changed, 610 insertions(+), 341 deletions(-) + +commit 46d4fab82332e71d0b68c0a8deeac78f2201ed14 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 12 20:35:33 2008 +0100 + + Increment version of libpoppler and libpoppler-qt4 + + CMakeLists.txt | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 550c1fc73a6d2af65728751fd0b59ccc7110fa8b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 12 20:34:48 2008 +0100 + + Init to false updated field of XRefEntries plus indenting fixes + + poppler/XRef.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 6a671686c6265ecdb4c48f04392de9c56d4e0936 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Mar 12 21:43:12 2008 +1030 + + Fix regression in cairo output when transforming ctm + + The commit: + ec01926e5a9dc16e200060497c43e79a1623698d "Avoid setting a singular + ctm" + introduced a regression in the output when using a ctm. + + The check for an invertable matrix had the side effect of inverting + the matrix. Instead, make a copy of the matrix before testing if it is + invertable. + + poppler/CairoOutputDev.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 0b2c3bb25c908b07e760d824dbfe93c6051812aa +Merge: 362fe01 9c472f7 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Wed Mar 12 00:23:58 2008 +0100 + + Merge branch 'master' of + ssh://inigomartinez@git.freedesktop.org/git/poppler/poppler + +commit 362fe013c0d96698b52d70cf5226cddca7fe52d4 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Wed Mar 12 00:07:12 2008 +0100 + + Enabled back the AnnotWidget support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c472f76d2462d0e775c851fdbac6ca2bc9812ea +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 12 00:00:20 2008 +0100 + + cmake build + + glib/demo/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 821858f5c36786955d9475044bfee57f5060ad2f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 11 23:58:05 2008 +0100 + + Return char bounding box instead of edge, it's much more useful for + character positioning + + qt4/src/poppler-page.cc | 8 ++++++-- + qt4/src/poppler-private.h | 3 +-- + qt4/src/poppler-qt4.h | 6 ++---- + qt4/src/poppler-textbox.cc | 4 ++-- + 4 files changed, 11 insertions(+), 10 deletions(-) + +commit d7e642732ced592362d9787bddadb7a110dcc5a5 +Merge: 3642f0c 2d6c605 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Tue Mar 11 23:41:59 2008 +0100 + + Merge branch 'master' of + ssh://inigomartinez@git.freedesktop.org/git/poppler/poppler + +commit 3642f0c48bc49cd4d698e769544c1d8604c6482f +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Tue Mar 11 23:13:33 2008 +0100 + + glib annots demo. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + glib/demo/Makefile.am | 2 + + glib/demo/annots.c | 468 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/annots.h | 31 ++++ + glib/demo/main.c | 4 +- + 4 files changed, 504 insertions(+), 1 deletion(-) + +commit 2d6c60537317bd3ac9e0582e0da09e7365729097 +Author: Pino Toscano <pino@kde.org> +Date: Tue Mar 11 22:54:44 2008 +0100 + + For now we cannot handle MovieLink's, so comment them out. + + qt4/src/poppler-annotation.cc | 2 ++ + qt4/src/poppler-link.cc | 4 ++++ + qt4/src/poppler-link.h | 2 ++ + 3 files changed, 8 insertions(+) + +commit a354f7198c493990613a1db131c662ec27948863 +Author: Hugo Mercier <hmercier31@gmail.com> +Date: Tue Mar 11 22:49:00 2008 +0100 + + Initial Movie support (2) + + Now with the forgotten files + + poppler/Movie.cc | 443 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Movie.h | 177 ++++++++++++++++++++++ + 2 files changed, 620 insertions(+) + +commit 43e5dd941d4bc35c4eebbad66c13235639e0c1a0 +Merge: aab1768 4fdd254 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 11 22:31:22 2008 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit 4fdd254370ea6055e95c8ebee51b69e06c501714 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Mar 11 22:31:00 2008 +0100 + + Fix build + + glib/poppler-page.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit aab17684dc3f21ff2b1ee6eacdc0c565d368df78 +Author: Hugo Mercier <hmercier31@gmail.com> +Date: Tue Mar 11 22:28:28 2008 +0100 + + Initial Movie support + + CMakeLists.txt | 2 + + poppler/Annot.cc | 316 + ++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 125 ++++++++++++++++++++ + poppler/Link.cc | 108 +++++++++++++++--- + poppler/Link.h | 64 ++++++++++- + poppler/Makefile.am | 2 + + 6 files changed, 591 insertions(+), 26 deletions(-) + +commit 13a0d2390b9e4684af070c213f385485715353df +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 11 22:27:38 2008 +0100 + + Add poppler-annot to the cmake build system + + glib/CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 19f0e3b40bce4d8157d8c8bd04eaf6bacbef38b8 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Tue Mar 11 22:09:04 2008 +0100 + + Add preliminary annotations support in the glib frontend + + glib/Makefile.am | 2 + + glib/poppler-annot.cc | 776 + ++++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 181 +++++++++++ + glib/poppler-page.cc | 166 +++++++++++ + glib/poppler-page.h | 15 + + glib/poppler-private.h | 5 +- + glib/poppler.h | 7 + + 7 files changed, 1151 insertions(+), 1 deletion(-) + +commit 6fa3ab20fee311b4aff92be18870fd0e1730a81f +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Tue Mar 11 18:44:27 2008 +0100 + + Changed AnnotMarkup inheritance + + poppler/Annot.cc | 9 +++++---- + poppler/Annot.h | 10 +++++----- + 2 files changed, 10 insertions(+), 9 deletions(-) + +commit 3111cfe2ccb32f9680baaad0c3f0678dd5969f8b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 10 22:12:36 2008 +0100 + + And free the memory + + qt4/tests/test-poppler-qt4.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit 58f88c23402ac2e678dc655f64d93d89bb1812be +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 10 22:08:43 2008 +0100 + + Add the -textRects option to the test app so we can check text rects + are correct + + qt4/tests/test-poppler-qt4.cpp | 45 + +++++++++++++++++++++++++++++++++++----- + 1 file changed, 40 insertions(+), 5 deletions(-) + +commit 94ceb3cae79dc7786fa59fd889a87160780ed5df +Merge: 0f9e843 35f34bd +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 9 23:34:11 2008 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit 0f9e84302ac2108f05bdbb10e7e57ae19ad1e9f3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 9 23:33:11 2008 +0100 + + Do not force default values to fontconfig patterns as fontconfig + already fills in default values for us + + Fixes bug 14883 + + poppler/GlobalParams.cc | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 35f34bd44c74eeb76a58b30acfbb0303d7285f06 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 9 17:38:54 2008 +0100 + + Fix build when compiling without cairo support + + glib/demo/images.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 32637db19dd80a9b8452f86eb677b10e77290627 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 9 00:57:08 2008 +0100 + + proper lib64 Qt detection + + Fixes bug 14583 + + m4/qt.m4 | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit 65a88a95a5c54c890048e8a986df361585d601dd +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 8 03:11:36 2008 +0100 + + Provide the mime type for an embedded file, if known. + + Adapt the unit test for that. + + qt4/src/poppler-embeddedfile.cc | 5 +++++ + qt4/src/poppler-qt4.h | 5 +++++ + qt4/tests/check_attachments.cpp | 7 +++++++ + 3 files changed, 17 insertions(+) + +commit 23da27a229c8b3cc2a0a0dd6354c40723934390c +Author: Pino Toscano <pino@kde.org> +Date: Sat Mar 8 03:10:58 2008 +0100 + + Optionally read the mimetype for the embedded files. + + poppler/Catalog.cc | 17 +++++++++-------- + poppler/Catalog.h | 7 ++++++- + 2 files changed, 15 insertions(+), 9 deletions(-) + +commit 42c254b978c61e2ccfda083dfeffec9fc35a5fe7 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 3 16:56:09 2008 +0100 + + be safe about out-of-range values + + qt4/src/poppler-textbox.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5db75df77938eb7620867d0618058be52ed2d3cb +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 3 16:53:39 2008 +0100 + + initialize nicely + + qt4/src/poppler-private.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 3ad0ab7e4abd37528284269c69be3cdfb8d31d2e +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 3 16:49:23 2008 +0100 + + apidox + + qt4/src/poppler-link.h | 17 +++++++++++++++++ + qt4/src/poppler-qt4.h | 23 ++++++++++++++++++++++- + 2 files changed, 39 insertions(+), 1 deletion(-) + +commit ec01926e5a9dc16e200060497c43e79a1623698d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Mar 2 20:15:20 2008 -0500 + + Avoid setting a singular ctm + + Ignoring singular ctm's gives a better result than having + our cairo context error and turn off. Related to #14398. + + poppler/CairoOutputDev.cc | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 4882d7a118b93fdb5c441d70757e485be7ee25d7 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 28 15:12:23 2008 +0100 + + printf -> qDebug + + qt4/src/poppler-optcontent.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 31ce4049bf12c2716be7ec0fb8eda502d989f66e +Author: Brad Hards <bradh@saxicola.cuneata.net> +Date: Thu Feb 28 22:09:30 2008 +1100 + + Respect PageMode for optional content and embedded files. + + This makes the PDF 1.7 spec open with the embedded files showing. + + qt4/demos/embeddedfiles.cpp | 7 +++++++ + qt4/demos/embeddedfiles.h | 1 + + qt4/demos/optcontent.cpp | 8 ++++++++ + qt4/demos/optcontent.h | 1 + + 4 files changed, 17 insertions(+) + +commit ff938c431799d49325c0f46f1e6cbe1033993a83 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 27 23:12:53 2008 +0100 + + do not forget to distribute GlobalParamsWin.cc next time + + poppler/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 277382b8186d137a9f2a62bc2d22e9f0cda7d923 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 27 22:56:33 2008 +0100 + + fix typo + + glib/demo/images.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5b2f8f21fca63508570a0c77c6f7221a322e6e57 +Merge: 7e65118 4254f12 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 22:10:12 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 7e651186f483976f9833de245b6c7add38e77a16 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 22:03:17 2008 +0100 + + Properly enable/disable the contents when their parents are changed. + + Now, the children maintain the "checked state" they had, when their + parent is unchecked; + but, they are really disabled, both in the possibility to be checked + and in the drawing of their associated content [applying the same + to their children, and so on]. + + qt4/src/poppler-optcontent-private.h | 8 +++++++- + qt4/src/poppler-optcontent.cc | 37 + +++++++++++++++++++++++++++++----- + 2 files changed, 39 insertions(+), 6 deletions(-) + +commit 4254f1237ebed09b8e1c85f935a20bde3d8f36ff +Merge: ed6c0c2 0569ae7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 27 20:44:27 2008 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit 8d384c06f96ba8cb3e73c275b3c708c64da4595d +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 20:39:09 2008 +0100 + + small header cleanup + + qt4/src/poppler-optcontent-private.h | 9 +++++++-- + qt4/src/poppler-optcontent.cc | 7 ++++--- + 2 files changed, 11 insertions(+), 5 deletions(-) + +commit ed6c0c260837a0025279765ef7778b83d6ee2209 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 27 20:43:45 2008 +0100 + + fix build and distcheck with autools + + qt4/demos/Makefile.am | 3 +++ + qt4/src/Makefile.am | 5 ++++- + qt4/tests/Makefile.am | 3 +++ + 3 files changed, 10 insertions(+), 1 deletion(-) + +commit 344d55539b1b6bcabec609fd828db372a07491b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 27 20:43:13 2008 +0100 + + fill the NEWS for 0.7.1 + + NEWS | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 1c47633ba782021978fa34d41a4ab0badf3af9d3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 27 20:42:55 2008 +0100 + + Increase version number to 0.7.1 + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + msvc/config.h | 6 +++--- + qt4/src/Doxyfile | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit 0569ae76b6af1723b4606af189242a23199f387d +Merge: f395531 d8eba8c +Author: Brad Hards <bradh@kde.org> +Date: Thu Feb 28 06:26:09 2008 +1100 + + Merge branch 'master' of + ssh://bradh@git.freedesktop.org/git/poppler/poppler + +commit d8eba8c10834116b4f0f295375805172f5216993 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 19:07:46 2008 +0100 + + export the OptContentModel + + qt4/src/poppler-optcontent.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 0445e64a4124af7c1b84673f237022e133eb8542 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 19:04:03 2008 +0100 + + make only the Document able to create OptContentsModel's + + qt4/src/poppler-optcontent.h | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit c965437b67a4f97ee8365a217bd10406fba3767a +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 18:58:31 2008 +0100 + + setRootNode() is private (and unused) API + + qt4/src/poppler-optcontent-private.h | 2 ++ + qt4/src/poppler-optcontent.cc | 8 ++++---- + qt4/src/poppler-optcontent.h | 4 ---- + 3 files changed, 6 insertions(+), 8 deletions(-) + +commit e293bfc384e2dfc4ef04582053ce18d8c0bcb7b3 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 18:50:35 2008 +0100 + + small cleanup + + qt4/src/poppler-optcontent.cc | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit f11aa0008585e845ce509172d76f72f941be497d +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 18:44:09 2008 +0100 + + adapt the tests to the new layout of the contents model + + qt4/tests/check_optcontent.cpp | 66 + ++++++++++++++-------------------------- + 1 file changed, 23 insertions(+), 43 deletions(-) + +commit 4a324484b5c77ddc348746e7bcf6051ade28e389 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 18:04:52 2008 +0100 + + free some objects (thus leak less) + + poppler/Gfx.cc | 2 ++ + poppler/OptionalContent.cc | 2 ++ + 2 files changed, 4 insertions(+) + +commit 0f4e7791ab6884072a1aee56e9cec212d8cea263 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 15:58:21 2008 +0100 + + ignore any generated .moc here + + qt4/src/.gitignore | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 136ae44f155b17d9e8b041b67f75531d8544337c +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 15:56:09 2008 +0100 + + keep track of the items changed when toggling an item, so we can + update them properly + + qt4/src/poppler-optcontent-private.h | 4 ++-- + qt4/src/poppler-optcontent.cc | 38 + +++++++++++++++++++++++++++------- + 2 files changed, 32 insertions(+), 10 deletions(-) + +commit b73e2afef7e5e1b68d82a10c94bca3c201c5f8b3 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 15:52:06 2008 +0100 + + fix indexFromItem once again, and make parent() call it with the + right node + + qt4/src/poppler-optcontent-private.h | 2 +- + qt4/src/poppler-optcontent.cc | 19 +++++++++---------- + 2 files changed, 10 insertions(+), 11 deletions(-) + +commit 803787f763578320aa5f405ed49c64e6b924bad3 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 15:30:18 2008 +0100 + + compile with the autotools + + (second patch I forgot to apply with the first) + + qt4/src/Makefile.am | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 0b527a8ed62677bb09df4587f072a310c2959750 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 14:34:13 2008 +0100 + + Extract the OptContentItem -> QModelIndex creation in an own function. + + qt4/src/poppler-optcontent-private.h | 1 + + qt4/src/poppler-optcontent.cc | 7 ++++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit c94d6cc95c6838f31e27832cb3090389bf4d8227 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 14:30:26 2008 +0100 + + Make index(), data() and setData() more safe. + + Errors spotted using ModelTest. + + qt4/src/poppler-optcontent-private.h | 2 +- + qt4/src/poppler-optcontent.cc | 15 +++++++++------ + 2 files changed, 10 insertions(+), 7 deletions(-) + +commit b8e833733d84eaa93d6bae522710feb3075ca329 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 14:05:19 2008 +0100 + + fix build with the autotools + + qt4/src/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f89ba474bae281f1cdeddb72ac8425dee1087e35 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 13:28:50 2008 +0100 + + Put the check states of the optional contents in the same column as + the name. + + This feels a bit more elegant than changing a value in a different + column. + Cleanup data()/setData() so they can be extended easily. + + qt4/src/poppler-optcontent.cc | 74 + +++++++++++++++++++++-------------------- + 1 file changed, 38 insertions(+), 36 deletions(-) + +commit defa0ecb2790402a4069fea3b3c285a50675682d +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 12:24:16 2008 +0100 + + Add a skeleton of OptContentModel::headerData(). + + It does nothing yet, but we can add stuff later on w/o breaking BC. + + qt4/src/poppler-optcontent.cc | 5 +++++ + qt4/src/poppler-optcontent.h | 2 ++ + 2 files changed, 7 insertions(+) + +commit f395531a3e8f71a46b3c942f8f437ade1d9fdb57 +Author: Brad Hards <bradh@kde.org> +Date: Wed Feb 27 22:22:51 2008 +1100 + + Minor cleanup. + + qt4/src/poppler-optcontent.cc | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 0a19486cb4de57c0c987cc4ce2434a96bbd18338 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 12:15:44 2008 +0100 + + refresh the current page when the data of the content model change + + qt4/demos/optcontent.cpp | 8 ++++++++ + qt4/demos/optcontent.h | 3 +++ + 2 files changed, 11 insertions(+) + +commit 09b7cc2efb7d21fa4dabd23d2d2de877cc7d86ee +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 12:15:18 2008 +0100 + + optional method to reload the current page + + qt4/demos/documentobserver.cpp | 5 +++++ + qt4/demos/documentobserver.h | 1 + + 2 files changed, 6 insertions(+) + +commit 39fe905be8f2ae79d9c26cd87547f3ea2608411e +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 12:00:29 2008 +0100 + + Add a dock for showing the optional content tree. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 3 +++ + qt4/demos/optcontent.cpp | 55 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/optcontent.h | 43 ++++++++++++++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 7 ++++++ + 5 files changed, 109 insertions(+) + +commit f17dd5539501a996479b903ac9b8aceb3c4cfafe +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 11:53:32 2008 +0100 + + cleanup + + qt4/src/poppler-optcontent-private.h | 3 ++- + qt4/src/poppler-optcontent.h | 4 +--- + 2 files changed, 3 insertions(+), 4 deletions(-) + +commit f3cc894559f10dbd4277fa9f30de9931ed69dfd4 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 11:43:34 2008 +0100 + + OptContentModel::itemFromRef() and OptContentItem are private API. + + Hide them in the implementation. + + qt4/src/poppler-optcontent-private.h | 43 + ++++++++++++++++++++++++++++++++++ + qt4/src/poppler-optcontent.cc | 8 +++---- + qt4/src/poppler-optcontent.h | 42 + --------------------------------- + 3 files changed, 47 insertions(+), 46 deletions(-) + +commit 48e8b2105cf8f177ca655b969470e45e2407db82 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 11:28:16 2008 +0100 + + move all the private stuff of OptContentModel into its d-pointer + + qt4/src/poppler-optcontent-private.h | 9 +++++++-- + qt4/src/poppler-optcontent.cc | 29 +++++++++++++++-------------- + qt4/src/poppler-optcontent.h | 4 ---- + 3 files changed, 22 insertions(+), 20 deletions(-) + +commit b78a7f7a0e8d5a9c22014d34754090d863030e0d +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 27 11:06:57 2008 +0100 + + use a QPointer for the OptContentModel, so we are safe about + ownership. + + qt4/src/poppler-document.cc | 4 ++-- + qt4/src/poppler-private.h | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 48557da71adb0fe6bd4da2fb32433796a96c3576 +Author: Brad Hards <bradh@kde.org> +Date: Wed Feb 27 19:39:18 2008 +1100 + + We need to install the optional content header. + + qt4/src/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 6e2bb03b5ef256c03a8da1cbf9bbc87c593942ad +Author: Brad Hards <bradh@kde.org> +Date: Wed Feb 27 19:23:49 2008 +1100 + + Partial d-pointer implementation. + + qt4/src/poppler-optcontent-private.h | 57 + ++++++++++++++++++++++++++++++++++ + qt4/src/poppler-optcontent.cc | 49 +++++++++++++++++------------ + qt4/src/poppler-optcontent.h | 24 +++----------- + 3 files changed, 92 insertions(+), 38 deletions(-) + +commit c627b7aa10ae9cdceb78b751a7e826170f402af0 +Author: Brad Hards <bradh@kde.org> +Date: Wed Feb 27 16:12:38 2008 +1100 + + A couple of cleanups suggested by Pino. + + qt4/src/poppler-document.cc | 6 +++--- + qt4/src/poppler-qt4.h | 8 +++++--- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 81891667e18fcf164af02f5f366de07f78d67c8f +Author: Brad Hards <bradh@kde.org> +Date: Wed Feb 27 15:47:03 2008 +1100 + + Add in the initial part of the optional content support. + + To see this work, compare ClarityOCGs.pdf with and + without this change. + + Right now we only handle optional content using + XObjects. Optional content using Marked Content has + infrastructure, but is not implemented. That will be + quite invasive in Gfx, and I'm not confident enough + to do it this late in the process. + + CMakeLists.txt | 1 + + poppler/Catalog.cc | 9 + + poppler/Catalog.h | 4 + + poppler/Gfx.cc | 65 +++++- + poppler/Gfx.h | 12 +- + poppler/Makefile.am | 2 + + poppler/OptionalContent.cc | 322 ++++++++++++++++++++++++++ + poppler/OptionalContent.h | 85 +++++++ + poppler/PDFDoc.h | 5 + + poppler/PSOutputDev.cc | 6 +- + poppler/Page.cc | 2 +- + qt4/src/.gitignore | 1 + + qt4/src/CMakeLists.txt | 3 + + qt4/src/Makefile.am | 6 + + qt4/src/poppler-document.cc | 13 ++ + qt4/src/poppler-optcontent.cc | 354 ++++++++++++++++++++++++++++ + qt4/src/poppler-optcontent.h | 122 ++++++++++ + qt4/src/poppler-private.h | 4 + + qt4/src/poppler-qt4.h | 18 ++ + qt4/tests/.gitignore | 1 + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 5 + + qt4/tests/check_optcontent.cpp | 499 + ++++++++++++++++++++++++++++++++++++++++ + 23 files changed, 1532 insertions(+), 8 deletions(-) + +commit 11b70bcda905e618c199a067db6b0246612e101d +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 26 23:01:27 2008 +0100 + + fixup the default export macro name (added by cmake); _WIN32 is + defined only on win32 (remove a plethora of warnings) + + qt4/src/poppler-export.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d4d6c14cd83d04c61daa6618c3148a0bb47dc292 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 26 22:57:02 2008 +0100 + + install the export header + + qt4/src/CMakeLists.txt | 1 + + qt4/src/Makefile.am | 1 + + 2 files changed, 2 insertions(+) + +commit 4ba2e2d21710135656adbf93c5994cfb46502308 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 26 22:55:30 2008 +0100 + + no need to include the export header in private headers + + qt4/src/poppler-annotation-helper.h | 1 - + qt4/src/poppler-annotation-private.h | 1 - + qt4/src/poppler-converter-private.h | 1 - + qt4/src/poppler-link-extractor-private.h | 1 - + qt4/src/poppler-page-private.h | 1 - + qt4/src/poppler-private.h | 1 - + qt4/src/poppler-qiodeviceoutstream-private.h | 1 - + 7 files changed, 7 deletions(-) + +commit 0a466c09fb70b92f39df19bc315b6575e419ad5b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 26 22:47:31 2008 +0100 + + We also need to distribute poppler-export.h + + qt4/src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 2034d57c700049bc9a6565bbb818e1c9f4467784 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 26 22:46:29 2008 +0100 + + Now for real: Add special casing in cmake buildsystem for MSVC, + also add Export markers to qt4 classes, although symbol visibility + is only used on MSVC at the moment + + CMakeLists.txt | 5 +++++ + qt4/src/CMakeLists.txt | 3 +++ + qt4/src/poppler-annotation-helper.h | 1 + + qt4/src/poppler-annotation-private.h | 1 + + qt4/src/poppler-annotation.h | 19 ++++++++++--------- + qt4/src/poppler-converter-private.h | 1 + + qt4/src/poppler-export.h | 6 +++--- + qt4/src/poppler-form.h | 9 +++++---- + qt4/src/poppler-link-extractor-private.h | 1 + + qt4/src/poppler-link.h | 17 +++++++++-------- + qt4/src/poppler-page-private.h | 1 + + qt4/src/poppler-private.h | 1 + + qt4/src/poppler-qiodeviceoutstream-private.h | 1 + + qt4/src/poppler-qt4.h | 21 +++++++++++---------- + qt4/tests/CMakeLists.txt | 6 ++++++ + 15 files changed, 59 insertions(+), 34 deletions(-) + +commit b931920f63f4276ec355118faa061bafa5ac5244 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 26 22:42:16 2008 +0100 + + Add special casing in cmake buildsystem for MSVC, also add Export + markers to qt4 classes, although symbol visibility is only used on + MSVC at the moment + + qt4/src/poppler-export.h | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit 1778fddb36d6cb2c7f7848bee06189158f69f16e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 24 23:02:08 2008 +0100 + + Add the cmake files to EXTRA_DIST so they get added when i do make + dist to get the release tarball + + Makefile.am | 39 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 39 insertions(+) + +commit 51f171e10a42d492c8c32a5e2578d05b73d89238 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 24 22:47:46 2008 +0100 + + ignore more + + qt4/demos/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit adb1ccdb9265f0583cb348c456a39efac610aff1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 24 22:46:33 2008 +0100 + + ignore + + qt4/demos/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 101e526c63175ffc1a75e1b68da7bb4fff9cd530 +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Feb 24 20:52:41 2008 +0100 + + define snprintf to _snprintf if we are building on MSVC + + config.h.cmake | 4 ++++ + 1 file changed, 4 insertions(+) + +commit f7f8ab488257c3979d20e5c0690ec5d7c2cd831b +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Feb 24 20:43:11 2008 +0100 + + define M_PI in case it is not defined + + poppler/Function.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit f00436b63bf9a42dcb2728a07db9c20f1f23d0bc +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Sun Feb 24 20:39:42 2008 +0100 + + Add proper dirent.h guards + + utils/pdftoabw.cc | 2 ++ + utils/pdftohtml.cc | 2 ++ + 2 files changed, 4 insertions(+) + +commit e1463451c584181f918265438cf6ddcb408bf731 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 21 20:43:56 2008 +0100 + + Code uses if USE_EXCEPTIONS, so we need to defined it to 1, not just + define it + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 88d4bbbcf828e3247454c8ba3c2fb0fb58207b6a +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Thu Feb 21 19:53:03 2008 +0100 + + If a bitmap's dimensions are invalid, do not try to display it. + + poppler/Gfx.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 452ae6f5674b00b43955952961f7ca0583f73e27 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 21 19:46:19 2008 +0100 + + Make sure we don't draw outside the bitmap on Splash::fillGlyph2 + + splash/Splash.cc | 76 + +++++++++++++++++++++++++++++++++++------------------- + 1 file changed, 49 insertions(+), 27 deletions(-) + +commit 7f60fa806bd6d3d28917f349a2a19b52f97f593a +Author: James Cloos <cloos@jhcloos.com> +Date: Thu Feb 21 13:00:05 2008 -0500 + + Fix typo + + Signed-off-by: James Cloos <cloos@jhcloos.com> + + qt4/demos/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 053ecae534a4522d152b0139b6aed6da2059d760 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 17:21:27 2008 -0800 + + Keep cairo and cairo_shape consistent + + The 'cairo_shape' state was not always being modified at the same + time as 'cairo'. In some cases this led to a sequence of ever + larger matrix scale factors until things just blew up. + + poppler/CairoOutputDev.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit bf6dd890994150406b4464e45355a4a99870fc60 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 21 01:23:07 2008 +0100 + + Add a dock for showing the document metadata. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 3 +++ + qt4/demos/metadata.cpp | 50 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/metadata.h | 43 +++++++++++++++++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 7 +++++++ + 5 files changed, 104 insertions(+) + +commit b6f0c8f83924c08be20b602b128651bf018172a3 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 21 00:54:26 2008 +0100 + + Do not assign conflicting accelerators. + + qt4/demos/viewer.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e0c27a968c7e7a0f6a89a050ddbfe328229f431d +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 21 00:53:24 2008 +0100 + + Apply the antialias settings w/o notify the observers. + + qt4/demos/viewer.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2c6149abcecda15c6f73a1dee537072240ddd545 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 21 00:51:21 2008 +0100 + + Add a settings menu to choose the render backend. + + qt4/demos/viewer.cpp | 28 ++++++++++++++++++++++++++++ + qt4/demos/viewer.h | 3 +++ + 2 files changed, 31 insertions(+) + +commit db2b0778dca364751a1d22294be29f8c7799e2e9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 21 00:33:23 2008 +0100 + + Add a dock for showing the embedded files. + + TODO: show the checksum in a pretty format. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 3 ++ + qt4/demos/embeddedfiles.cpp | 75 + +++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/embeddedfiles.h | 43 +++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 7 ++++ + 5 files changed, 129 insertions(+) + +commit 51fba47ccb12a66282769fc504bac4c9f5123f75 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 17 01:49:59 2008 +0100 + + clear the page label when the document is closed + + qt4/demos/pageview.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit e964e2b9fbbe9b52b137ecd06729a06530835227 +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Tue Feb 19 23:22:55 2008 +0100 + + Allow grouped checkboxes to be selected individually. + + When checkboxes are in a group, they ought to behave like a + collection of + radio buttons. However, when deciding whether to draw a checkbox as + selected or not, the checkbox-drawing code was looking up the value + of the + V field in the form dictionary, which is shared among all checkboxes + in the + group. Thus, checkboxes would either all be on or off in unison. + + Instead, look up the AS (appearance state) value in each checkbox's + annotation dictionary, so that different checkboxes can be drawn + differently. + + poppler/Annot.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 702fdd6c56b5369554c683d8c8e0e2c66e80886c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 00:18:04 2008 +0100 + + changes from gtk-doc + + glib/reference/tmpl/poppler-document.sgml | 1 + + glib/reference/tmpl/poppler-page.sgml | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 9e13b91ba38c20989d283588e73490a1601f5bb0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 00:10:24 2008 +0100 + + distribute the headers too + + qt4/demos/Makefile.am | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 194e0ced7c38514ec3126666531862e3b29b4b77 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 23:34:06 2008 +0100 + + Fill NEWS and increase version number to 0.7 + + CMakeLists.txt | 2 +- + NEWS | 96 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + msvc/config.h | 6 ++-- + qt4/src/Doxyfile | 2 +- + 5 files changed, 102 insertions(+), 6 deletions(-) + +commit 3c407efe9f1f0cc3f6366d3a2b6e9b687656cc95 +Merge: 51f0cea 7f4acb8 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 18 21:30:42 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 51f0cea0e3ba1acfc63877752e950fdd8c07e258 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 18 21:29:41 2008 +0100 + + make the poppler_qt4viewer compile with the auto"tools" + + qt4/demos/Makefile.am | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit 7f4acb879d300e18dfaff768027c88195d7d8f1b +Author: Timothy Lee <timothy.lee@siriushk.com> +Date: Mon Feb 18 20:56:35 2008 +0100 + + Implement ImageOutputDev::drawMaskedImage and + ImageOutputDev::drawSoftMaskedImage so all images are exported when + using pdfimages + + utils/ImageOutputDev.cc | 19 +++++++++++++++++++ + utils/ImageOutputDev.h | 11 +++++++++++ + 2 files changed, 30 insertions(+) + +commit 064b316648e35416bb49336639da1d8d288d1ecf +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 20:17:37 2008 +0100 + + xref can be null so check for it before checking we went out of bounds + + Fixes bug 14549 + + poppler/Lexer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b287b611b1c7b7dd00e12518cee3a6c35044e161 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 17 01:21:07 2008 +0100 + + Really niptick: help menu with about dialog for us and Qt. + + qt4/demos/viewer.cpp | 15 +++++++++++++++ + qt4/demos/viewer.h | 2 ++ + 2 files changed, 17 insertions(+) + +commit 6400254fdabf3d0d32f27ebd00faa6958be62019 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 17 01:12:27 2008 +0100 + + Add a title to the viewer :) + + qt4/demos/viewer.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit b363c0568c9c61e7ee8ed86d808f0eed0b93b525 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 17 01:09:57 2008 +0100 + + Add the possibility to save a copy of the file. + + qt4/demos/viewer.cpp | 29 +++++++++++++++++++++++++++++ + qt4/demos/viewer.h | 2 ++ + 2 files changed, 31 insertions(+) + +commit 42987dcdd8d7432145f78cfc550f0c099e6e7311 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 17 00:33:01 2008 +0100 + + Add a Permissions dock. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 1 + + qt4/demos/permissions.cpp | 77 + +++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/permissions.h | 43 +++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 7 +++++ + 5 files changed, 129 insertions(+) + +commit 9d1dda64de1d9e3f6fc81e40a0c2246a6270dfa8 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 23:56:17 2008 +0100 + + Add settings for antialias. + + qt4/demos/viewer.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ + qt4/demos/viewer.h | 4 ++++ + 2 files changed, 45 insertions(+) + +commit 3abb8703d7d8b7a5fbcbb3c19d8e84d640abe88c +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 22:25:11 2008 +0100 + + Add a TOC info dock. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 1 + + qt4/demos/toc.cpp | 90 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/toc.h | 43 ++++++++++++++++++++++ + qt4/demos/viewer.cpp | 7 ++++ + 5 files changed, 142 insertions(+) + +commit 80925f06d125ebfc9909e36bdbe5d37fd0e48bdc +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 21:51:10 2008 +0100 + + Adapt the Fonts and Info docks to the new abstract info dock. + + qt4/demos/fonts.cpp | 10 +++------- + qt4/demos/fonts.h | 11 +++++------ + qt4/demos/info.cpp | 10 +++------- + qt4/demos/info.h | 11 +++++------ + 4 files changed, 16 insertions(+), 26 deletions(-) + +commit c03531d691e56aba2b4c6538cf9e2463e1e0aa29 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 21:43:19 2008 +0100 + + Introduce a base info dock for handling the "dirty" work. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 1 + + qt4/demos/abstractinfodock.cpp | 57 + ++++++++++++++++++++++++++++++++++++++++ + qt4/demos/abstractinfodock.h | 48 +++++++++++++++++++++++++++++++++ + 4 files changed, 107 insertions(+) + +commit 0f7d51c7fc2439ee9392c166576c341238f00f36 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 18:49:52 2008 +0100 + + Delete the poppler page after usage. + + qt4/demos/pageview.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit b41d069cdd1435ddb14b3de2986875069523c814 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 18:48:57 2008 +0100 + + Initialize the current page number correctly. + + qt4/demos/viewer.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 75e516af0e72a2e3041660300e522ad00869372b +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 18:43:56 2008 +0100 + + Add a side dock for showing the fonts of the document. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 1 + + qt4/demos/fonts.cpp | 78 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/fonts.h | 44 ++++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 7 +++++ + 5 files changed, 131 insertions(+) + +commit 8e642d1cbd48d4790a6769287cbfd90c3bc9fc34 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 17:21:30 2008 +0100 + + Add a View menu where the dock widget toogle actions will be. + + As start, put the Info dock there. + + qt4/demos/viewer.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +commit c1feb7c2b5008cc04edb3c028f888072920ce4dc +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 17:14:00 2008 +0100 + + Add a side dock for showing the info keys. + + qt4/demos/CMakeLists.txt | 1 + + qt4/demos/Makefile.am | 1 + + qt4/demos/info.cpp | 78 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/info.h | 44 ++++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 5 +++ + 5 files changed, 129 insertions(+) + +commit abc9b00c6470f9f6b66c280455f544ad0ee3aa8c +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 16:09:52 2008 +0100 + + Basic work in the demo PDF viewer, open documents and navigate into + the pages. + + An observer structure was introduced, so extra components can be + easily added and made aware of the document/page changes. + Both the navigation toolbar and the page view are implemented as + observers. + + qt4/demos/CMakeLists.txt | 3 ++ + qt4/demos/Makefile.am | 3 ++ + qt4/demos/documentobserver.cpp | 45 ++++++++++++++++++ + qt4/demos/documentobserver.h | 49 ++++++++++++++++++++ + qt4/demos/navigationtoolbar.cpp | 98 + +++++++++++++++++++++++++++++++++++++++ + qt4/demos/navigationtoolbar.h | 56 ++++++++++++++++++++++ + qt4/demos/pageview.cpp | 60 ++++++++++++++++++++++++ + qt4/demos/pageview.h | 44 ++++++++++++++++++ + qt4/demos/viewer.cpp | 98 + +++++++++++++++++++++++++++++++++++++-- + qt4/demos/viewer.h | 17 +++++++ + 10 files changed, 470 insertions(+), 3 deletions(-) + +commit 14c88853a5675f40efb72f3ef01f49eb06ab846c +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 00:32:30 2008 +0100 + + Compile the poppler_qt4viewer. + + qt4/demos/CMakeLists.txt | 7 +++++++ + qt4/demos/Makefile.am | 12 ++++++++++-- + 2 files changed, 17 insertions(+), 2 deletions(-) + +commit aeb591f015d5e7a2643ed75d872358d2b1256b99 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 16 00:31:46 2008 +0100 + + Add a very minimal base PDF viewer. + + So minimal that it does nothing at the moment... + + qt4/demos/main_viewer.cpp | 29 ++++++++++++++++++++++++++++ + qt4/demos/viewer.cpp | 46 + +++++++++++++++++++++++++++++++++++++++++++++ + qt4/demos/viewer.h | 45 + ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 120 insertions(+) + +commit 8da490b090487c4c37290b63bdc9abcfaf6d6940 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 15 23:59:39 2008 +0100 + + Add a skeleton of directory where PopplerQt4 demos will be. + + configure.ac | 1 + + qt4/CMakeLists.txt | 1 + + qt4/Makefile.am | 2 +- + qt4/demos/CMakeLists.txt | 10 ++++++++++ + qt4/demos/Makefile.am | 20 ++++++++++++++++++++ + 5 files changed, 33 insertions(+), 1 deletion(-) + +commit e24b49d52a5c1716641695ee731dd49848a114d9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 14 22:21:54 2008 +0100 + + do not print it as string + + qt4/src/poppler-private.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2316455864e9c900c08d051c59b9508eddcb7c34 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 14 21:02:20 2008 +0100 + + Pipe the poppler error messages through the Qt debug system. + + qt4/src/poppler-private.cc | 21 +++++++++++++++++++++ + qt4/src/poppler-private.h | 8 +++++++- + 2 files changed, 28 insertions(+), 1 deletion(-) + +commit d985d3b0cdc57370137865add2a5f3a7802109c7 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 14 14:56:18 2008 +0100 + + Use what FormWidgetText give us. + + qt4/src/poppler-form.cc | 13 +++---------- + 1 file changed, 3 insertions(+), 10 deletions(-) + +commit a69bd442e52f4495f8d6bfd3bb58b3ebd1be1a63 +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Thu Feb 14 12:52:22 2008 +0100 + + Provide Unicode mappings for some control characters in + PDFDocEncoding. + + Though they do not represent glyphs, values such as carriage return + can be + found in text strings in PDFDocEncoding. Provide mappings for + these bytes + to Unicode. + + Additionally, map unknown characters to U+FFFD instead of U+0000, + so that + unknown characters do not result in nulls (which can truncate strings + early, particularly if the string is later re-encoded into + null-terminated + UTF-8). + + poppler/PDFDocEncoding.cc | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +commit ce17383e0ed21770b471e88f25046a64a23e7e45 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 13 20:56:39 2008 +0100 + + Yet another fix for buggy documents, do not use the cache if the + cache could not be created because it ought to be too big + + Fixes http://bugs.kde.org/show_bug.cgi?id=157777 + + splash/SplashFont.cc | 48 + ++++++++++++++++++++++++++++-------------------- + 1 file changed, 28 insertions(+), 20 deletions(-) + +commit 15a61cac718ae8cbf83911e299b4cfdd24cdf178 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 13 20:55:18 2008 +0100 + + add images.c + + glib/demo/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 9cfe10ab7f51d329647e102e446baaef043d8cc6 +Merge: e918729 7d65b4d +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 13 20:53:43 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 7d65b4da1bc060aeb94d67c2ff26912cef48c030 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Feb 13 20:32:43 2008 +0100 + + Add images demo + + glib/demo/Makefile.am | 2 + + glib/demo/images.c | 338 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/images.h | 31 +++++ + glib/demo/main.c | 4 +- + 4 files changed, 374 insertions(+), 1 deletion(-) + +commit e9187292701e72db1020f7701d0725d83eee4b00 +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 13 19:41:57 2008 +0100 + + Do the one-time initialisation in initTestCase(). + + qt4/tests/check_dateConversion.cpp | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit fb996c46e3c6b56a2c67819620000bcd804aacd6 +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Wed Feb 13 18:44:41 2008 +0100 + + Major rework of text display in form fields code. + + This adds support for UTF-16 strings as input, and will recode them + to the + appropriate character set for the font. + + The method Annot::layoutText packs a lot of functionality together, + but I + couldn't see a good way to split it apart. It will convert an + input text + string from PDFDocEncoding or UTF-16 (encoding is autodetected) to the + appropriate encoding for the font which will be used to display + the form + field. At the same time, it can compute the width of the resulting + string, + and optionally break the string at a specified width to aid in + wrapping + multi-line text. Text wrapping is integrated with encoding conversion + since wrapping is easiest with the original text (where spaces + and newlines + are easily identified), but text widths can only be computed after + re-encoding. + + Support for composite fonts is included, so long as those fonts use an + identity CMap, but this is still untested. Support for more + complex CMaps + is missing. + + The rewrite also includes a minor improvement to the formatting + of comb + fields; characters are now centered in the comb cells. + + poppler/Annot.cc | 507 + ++++++++++++++++++++++++++++++++++-------------------- + poppler/Annot.h | 9 +- + 2 files changed, 327 insertions(+), 189 deletions(-) + +commit 88c780aed4c9855f879e3c7a9f82500a859635a2 +Author: Michael Vrable <mvrable@cs.ucsd.edu> +Date: Wed Feb 13 18:42:49 2008 +0100 + + Fix what look to be a few bugs in functions for mapping to/from + Unicode. + + - Endianness fix in pdfDocEncodingToUTF16 (previously looked to + assume a + little-endian processor) + - Add support for CharCodeToUnicode::mapToCharCode for Unicode + codepoints + above 255. + + poppler/CharCodeToUnicode.cc | 4 ++-- + poppler/Form.cc | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 7574cb71f24ce5b32427f243c39b6029fb58ec81 +Merge: e798802 4e45e5c +Author: Pino Toscano <pino@kde.org> +Date: Wed Feb 13 01:07:31 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 4e45e5ca4ab0ba2a6586505d80ed81f4b3426752 +Author: Patrick Spendrin <ps_ml@gmx.de> +Date: Tue Feb 12 21:41:26 2008 +0100 + + Do the right thing with CDECL, that is, undefine it if it is defined + so we can redefine it later + + poppler-config.h.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e798802f00bff0a24ee6d1312d6c62624395865a +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 12 20:57:56 2008 +0100 + + Apidox fix: state which checksum is returned (if available). + + qt4/src/poppler-qt4.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4e2ba70a88c40fef6775053b1cc5fa30e622cea7 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 12 11:25:34 2008 +0100 + + Free the Object after you use it. + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 039545fcd2c12631c7b8aea89c35f36cb387a17a +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 12 11:13:27 2008 +0100 + + Return the siblings even for checkboxes. + + qt4/src/poppler-form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fe5ee75cdf3e11e314318af12edf9d5bc8986250 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 12 11:12:01 2008 +0100 + + Initialize correctly; free your memory. + + poppler/Form.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit e0eff92c7067d43faa8e93baed1f061863111251 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Feb 11 20:32:41 2008 +0100 + + Update the field dict instead of the annot dict for non composed dicts + + We were always updating the annot dictionary, adding or updating + the V field. While this is correct for composed dicts (annot + field) + it isn't for non composed ones since the annot dictionary doesn't + contain any V field because it's a field of the form field dictionary. + In these cases the form field is not correctly updated and if the + document is saved it will be wrong. + + poppler/Form.cc | 44 +++++++++++++++++++++++++++++++------------- + poppler/Form.h | 2 ++ + 2 files changed, 33 insertions(+), 13 deletions(-) + +commit 905e6da9795fee94329022c0cafbc229055fd4f6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 10 19:22:50 2008 +0100 + + Move forms specific draw methods from Annot to AnnotWidget class + + poppler/Annot.cc | 3433 + +++++++++++++++++++++++++++--------------------------- + poppler/Annot.h | 87 +- + poppler/Form.cc | 39 +- + poppler/Form.h | 2 + + poppler/Page.cc | 9 +- + 5 files changed, 1765 insertions(+), 1805 deletions(-) + +commit 78afbc4d7819654e8742d4457c9847ad02b73bf1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Feb 10 17:12:59 2008 +0100 + + Some code refactoring and cleanup + + - Unused 'field' attribute in FormWidget class is now used and + getField() method has been added + - Method isReadOnly() in FormWidget class is not virtual anymore + but implemented in the base class + - Unused attribute 'catalog' in Form class has been removed and + 'acroForm' has been added instead with a getObj() method to get it. + - createFieldFromDict() method is now static + + poppler/Form.cc | 128 + ++++++++++++++++++++++++++++--------------------------- + poppler/Form.h | 41 +++++++++--------- + 2 files changed, 84 insertions(+), 85 deletions(-) + +commit 5f8e2f9140ee2ede841700726b974768ec863672 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 11 20:16:44 2008 +0100 + + Use QVarLengthArray instead of relying on gcc-ism. + + qt4/src/poppler-page.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7499764d382366823519aa13a38e1e44781c78af +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 11 11:57:50 2008 +0100 + + Add FormFieldButton::siblings(). + + This is needed for grouping together the radio buttons. + + qt4/src/poppler-form.cc | 14 ++++++++++++++ + qt4/src/poppler-form.h | 8 ++++++++ + 2 files changed, 22 insertions(+) + +commit 85bfa4f499a90d45b13df4d0a8760a7da6fc1532 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 11 02:40:37 2008 +0100 + + Small apidox fix. + + qt4/src/poppler-form.h | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +commit ada05055c91e967dc3e2af32a2176dd12cb7fe70 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 11 02:27:19 2008 +0100 + + Preliminary support for "button" form fields (ie, push buttons, + check boxes, and radio buttons). + + qt4/src/poppler-form.cc | 55 + +++++++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-form.h | 54 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-page.cc | 6 ++++++ + 3 files changed, 115 insertions(+) + +commit 278b33f25df418ef12798100002845a3e2ceebd3 +Merge: c730b33 fdb0a4a +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 11 00:57:24 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit fdb0a4a2f1d86aec7a3b0fcd4b4d48455791ecad +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Feb 10 18:47:40 2008 -0500 + + Avoid prescaling images when printing. + + Adds a function for letting the CairoOutputDev know whether it is + targetting a + screen or not. It then uses this knowledge to avoid prescaling + images. This way + cairo gets the full resolution image for use in the printed output. + + glib/poppler-page.cc | 1 + + poppler/CairoOutputDev.cc | 3 ++- + poppler/CairoOutputDev.h | 2 ++ + 3 files changed, 5 insertions(+), 1 deletion(-) + +commit c730b33f1ec2032c4b8c2660738448d954eb0f7d +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 11 00:46:20 2008 +0100 + + Keep the EmbFile object, and use this for getting the data. + + qt4/src/poppler-embeddedfile.cc | 33 +++++++++++---------------------- + qt4/src/poppler-private.h | 1 - + 2 files changed, 11 insertions(+), 23 deletions(-) + +commit 5915e57e7785370ce305cbbb3c2fedf36886689f +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 10 03:19:18 2008 +0100 + + const & in foreach + + qt4/tests/poppler-fonts.cpp | 2 +- + qt4/tests/stress-poppler-dir.cpp | 2 +- + qt4/tests/stress-poppler-qt4.cpp | 2 +- + qt4/tests/test-password-qt4.cpp | 2 +- + qt4/tests/test-poppler-qt4.cpp | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit d8374e0c2eb3ba05be101687e20c5fcbc42c1ad0 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 10 01:32:24 2008 +0100 + + Include only what needed; remove extra includes. + + qt4/tests/poppler-attachments.cpp | 4 +++- + qt4/tests/poppler-fonts.cpp | 4 +++- + qt4/tests/stress-poppler-dir.cpp | 9 ++++++--- + qt4/tests/stress-poppler-qt4.cpp | 9 ++++++--- + qt4/tests/test-password-qt4.cpp | 10 ++++++---- + qt4/tests/test-poppler-qt4.cpp | 12 ++++++++---- + 6 files changed, 32 insertions(+), 16 deletions(-) + +commit fa01a1115c4554b18c3462b568d76860d2fbe17b +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 10 01:09:57 2008 +0100 + + Comment out unused vars. + + utils/pdftoabw.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d3275e4263372b534c276f81d0c997ecb6675487 +Merge: c2186c1 5347a97 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 9 23:57:03 2008 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit c2186c1829c695c4ddb6c471ef8ad4ffa23c1b70 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 9 23:56:32 2008 +0100 + + Only check if we are out of bounds if the object we are searching + for has a known id (0 also means not known) + + Found by Michael Vrable + + poppler/Lexer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5347a97e39388ae38cf2ab9c67f953b0f7a02a13 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 18:26:41 2008 +0100 + + Add the operators for the flags we have. + + qt4/src/poppler-qt4.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit 329ade4f936bf063539cdc887aaf9a1722a5b8e0 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 18:23:59 2008 +0100 + + Add options for the PDF export; add the WithChanges flag for saving + the changes to the document as well. + + qt4/src/poppler-pdf-converter.cc | 25 +++++++++++++++++++++++-- + qt4/src/poppler-qt4.h | 14 ++++++++++++++ + 2 files changed, 37 insertions(+), 2 deletions(-) + +commit afb255366d56551bdc307766199bef9c5021d3ac +Merge: 8c44b17 8cb0e75 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 17:58:49 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 8c44b175081983c492821858341109fee9e86b16 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 17:57:57 2008 +0100 + + Do not rely on GNU extensions, but at least use Qt. + + qt4/src/poppler-qiodeviceoutstream.cc | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit 8cb0e75203daa01439413d1a775482b48e784baa +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 9 17:56:13 2008 +0100 + + Domain order is x_min x_max y_min y_max and not x_min y_min x_max + y_max + + poppler/GfxState.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c8f734ba4258059fa4521a4d364f62ca1632840b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 9 13:37:04 2008 +0100 + + PS cos and sin input values are degrees so convert to radians so we + can use the cos and sin cmath functions + + poppler/Function.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5fb0c9d31c1abf2e6ad306c112fbd2a7c33d8772 +Merge: 2655663 2255c85 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 9 13:15:15 2008 +0100 + + Merge branch 'master' of + ssh://carlosgc@git.freedesktop.org/git/poppler/poppler + +commit 26556636e71d5abcbfdd1373f5576d1233532cf8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 9 13:14:41 2008 +0100 + + Add saveWithoutChangesAs method to be able to save the document + ignoring changes made in forms or annots + + glib/poppler-document.cc | 41 ++++++++++++++++++++++++++++++++++++++++- + glib/poppler-document.h | 3 +++ + poppler/PDFDoc.cc | 38 ++++++++++++++++++++++++++++++++------ + poppler/PDFDoc.h | 4 ++++ + 4 files changed, 79 insertions(+), 7 deletions(-) + +commit 2255c85e4939a0752083dca21984ff4398baf8d2 +Merge: 5ba9287 56c9246 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 12:49:45 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 5ba928762471e1ea8b81acd4644dfd3f58d18f77 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 12:48:04 2008 +0100 + + Fix placeholders in printf-like functions. + + glib/demo/page.c | 2 +- + glib/test-poppler-glib.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 56c924609223196c5c41b9e6d9102bc248bad947 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 9 12:26:06 2008 +0100 + + atan operator must yield a degrees result between 0 and 360 + + See testcase at http://bugs.kde.org/show_bug.cgi?id=157497 + + poppler/Function.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 2a39932ae35a2716842bd2a1c3d4f9ce6b1e3dd8 +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 01:31:20 2008 +0100 + + Few improvements to the password test. + + - QString::fromUtf8() instead of QFile::encodeName() to correctly + pass the utf8 filenames + - QVERIFY(!foo) instead of QCOMPARE(foo, false) + - QVERIFY() also the return value of unlock() + + qt4/tests/check_password.cpp | 31 ++++++++++++++++--------------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +commit cc9c124d4d859b845eebf4ca1e4397870a35fd4e +Author: Pino Toscano <pino@kde.org> +Date: Sat Feb 9 01:09:02 2008 +0100 + + Add an unit test case for few invalid dates. + + qt4/tests/check_dateConversion.cpp | 34 + ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit eca91761741de5b340f7a2160db5b33401feb935 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 18:42:14 2008 +0100 + + Remove unneeded headers. + + qt4/src/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 899627505a4645fb1cc7d3599adbeec449c57041 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 18:41:13 2008 +0100 + + The return value is QString, so return QString's... + + qt4/src/poppler-document.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a1606fa4ff438983e3a7f55dd2d10a66f72e6711 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 17:31:32 2008 +0100 + + Move checkDocument() inside the private class. + + qt4/src/poppler-document.cc | 6 +++--- + qt4/src/poppler-private.h | 2 ++ + qt4/src/poppler-qt4.h | 2 +- + 3 files changed, 6 insertions(+), 4 deletions(-) + +commit f1ec70a83f807493dab5118761df31c0f67decad +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 17:26:41 2008 +0100 + + Remove C-ism. + + qt4/src/poppler-document.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3e994e8586fa1c87ef7e7f82af1cdacf2cd36310 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 12:21:56 2008 +0100 + + Add the missing font types. + + qt4/src/poppler-fontinfo.cc | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit ba07963f85d777a441349e23d4c2f510e45c73be +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 12:19:04 2008 +0100 + + Be safe against self-assignment. + + qt4/src/poppler-fontinfo.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 834b86548e09f4b24cdb2f194299d053b9b55022 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 12:15:16 2008 +0100 + + Small apidox fix. + + qt4/src/poppler-qt4.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 11a61eac5b8cde04bf762bbbe0deab5c0bd52951 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 02:21:32 2008 +0100 + + Pack few bools together. + + qt4/src/poppler-annotation.cc | 8 ++++---- + qt4/src/poppler-link.cc | 10 +++++----- + qt4/src/poppler-private.h | 4 ++-- + 3 files changed, 11 insertions(+), 11 deletions(-) + +commit 1aeba15b5eb9b30943259824678ebc9e4f56e870 +Merge: a489063 22d10c1 +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 01:39:16 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit a4890637a2c2ab1623311d9a6920e82131c2597c +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 01:36:56 2008 +0100 + + Move QStringToUnicodeGooString() and QStringToGooString() to the + private module. + + qt4/src/poppler-document.cc | 10 ---------- + qt4/src/poppler-form.cc | 15 --------------- + qt4/src/poppler-private.cc | 25 +++++++++++++++++++++++++ + qt4/src/poppler-private.h | 4 ++++ + 4 files changed, 29 insertions(+), 25 deletions(-) + +commit 5e44241c4976b819f7be6badd2d183fbfb8ee6de +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 01:30:07 2008 +0100 + + Move the string functions implementation in a .cc file. + + qt4/src/CMakeLists.txt | 1 + + qt4/src/Makefile.am | 1 + + qt4/src/poppler-private.cc | 70 + ++++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-private.h | 46 +++-------------------------- + 4 files changed, 76 insertions(+), 42 deletions(-) + +commit 124d92139241ad95da559d22af48254b45ac4a2e +Author: Pino Toscano <pino@kde.org> +Date: Fri Feb 8 01:07:43 2008 +0100 + + Include own header first, remove extra includes. + + qt4/src/poppler-document.cc | 1 - + qt4/src/poppler-embeddedfile.cc | 3 ++- + qt4/src/poppler-form.cc | 4 +++- + qt4/src/poppler-link-extractor-private.h | 2 ++ + qt4/src/poppler-link-extractor.cc | 7 +++++-- + qt4/src/poppler-page-private.h | 6 +++++- + qt4/src/poppler-private.h | 4 +++- + qt4/src/poppler-qt4.h | 2 -- + qt4/src/poppler-sound.cc | 4 ++-- + 9 files changed, 22 insertions(+), 11 deletions(-) + +commit 22d10c19e232dea143bda372c92aa12b999e4921 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 7 23:38:50 2008 +0100 + + PDF spec says name tokens have a maximum length of 127, but there are + some docs in the wild with more than that and they work on acroread + so increase the allowed length to 128+127 + + poppler/Lexer.cc | 25 +++++++++++++++++++++---- + 1 file changed, 21 insertions(+), 4 deletions(-) + +commit ee9f85915feb86b54ace1a403baa13bbdd7c3966 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 7 18:07:53 2008 +0100 + + Having a PageData is mandatory. + + Just assert when constructing instead of checking for it in each + link iteration. + + qt4/src/poppler-link-extractor.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ad4b1361f6c25359e6ddb38599bfc1e4e3e80408 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 7 18:03:30 2008 +0100 + + Precalc stuff we don't need to recalc in each link iteration. + + qt4/src/poppler-link-extractor-private.h | 3 ++- + qt4/src/poppler-link-extractor.cc | 14 ++++++++------ + 2 files changed, 10 insertions(+), 7 deletions(-) + +commit 82432dbc62a0879f4513640c2e0f594fda9347ad +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 7 17:51:50 2008 +0100 + + Store the ::Page internally, so we don't need to get it again + everytime. + + qt4/src/poppler-page-private.h | 3 +++ + qt4/src/poppler-page.cc | 37 + ++++++++++++++----------------------- + 2 files changed, 17 insertions(+), 23 deletions(-) + +commit 8ec51f7ca518aa6a4a69f30d373722d05f50cf07 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 7 16:48:16 2008 +0100 + + Compile the stress-poppler-dir test as well. + + qt4/tests/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 8a946b76ae2e7c2c5238b4e580c1c226eb457dc9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Feb 7 01:07:28 2008 +0100 + + Micro-touches to the debug messages. + + qt4/src/poppler-page.cc | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit c31990dfe50c7a0e3999e6d967699fce5ccb3339 +Merge: 7701e2a 6d58cda +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 5 00:38:00 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 7701e2a5c7d18fdaa0fa40c190e6ee0524746046 +Author: Pino Toscano <pino@kde.org> +Date: Tue Feb 5 00:37:01 2008 +0100 + + Add a AnnotColor -> QColor conversion method. + + qt4/src/poppler-annotation-helper.h | 6 ++++++ + qt4/src/poppler-annotation.cc | 31 + +++++++++++++++++++++++++++++++ + 2 files changed, 37 insertions(+) + +commit 6d58cda82b0181f2cca6e9d95b15877793be0812 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 4 23:33:51 2008 +0100 + + Protect us against weird dateString values + + qt4/src/poppler-document.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit aa0435f1544fe1adcf10173e34eaeaf2a7a703c7 +Merge: b43f4e9 37600b5 +Author: Pino Toscano <pino@kde.org> +Date: Mon Feb 4 20:56:53 2008 +0100 + + Merge branch 'master' of + ssh://pino@git.freedesktop.org/git/poppler/poppler + +commit 37600b5e848386d2c92c3dff8219c9dda16b0dca +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Feb 3 22:42:51 2008 +0100 + + Minor changes to Annot related stuff. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 15 ++++----------- + poppler/Annot.h | 12 ++++++++++-- + poppler/Gfx.cc | 7 ++++--- + poppler/Page.cc | 9 +++++++++ + poppler/Page.h | 3 +++ + 5 files changed, 30 insertions(+), 16 deletions(-) + +commit b43f4e9a161a1fd7b827244dc21b1bd2a6df7054 +Author: Pino Toscano <pino@kde.org> +Date: Sun Feb 3 20:32:15 2008 +0100 + + Pass the DocumentData to the Page (simplify a bit some code). + + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-link-extractor-private.h | 4 +- + qt4/src/poppler-link-extractor.cc | 8 ++-- + qt4/src/poppler-page-private.h | 4 +- + qt4/src/poppler-page.cc | 64 + +++++++++++++++--------------- + qt4/src/poppler-qt4.h | 5 +-- + 6 files changed, 42 insertions(+), 45 deletions(-) + +commit 4e0bb0307fccefc21f74a4c5a3a0d7e8e687b550 +Author: Pino Toscano <pino@draco.(none)> +Date: Sat Feb 2 12:57:25 2008 +0100 + + Fix include guard. + + poppler/ArthurOutputDev.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6f11ef660540fd13aad1350385beb90758ca86af +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Feb 1 23:55:37 2008 +0100 + + Fix for end condition, init ucode to 0 + + poppler/GfxFont.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1da2091807ae7f7d4d3f446953c41b4c440d4b1b +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 31 23:52:20 2008 +0100 + + Ensure we don't draw outside the main bitmap on + SplashOutputDev::setSoftMask + + Fixes crash on http://bugs.kde.org/show_bug.cgi?id=157000 + + poppler/SplashOutputDev.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit ecabc9469b137e8251344e5502de1cbf875223b9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 31 00:20:55 2008 +0100 + + Set RelWithDebInfo as default build type, if not specified. + + cmake/modules/PopplerMacros.cmake | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 19da87a20b3906523a330e3c956903a58a3ede7f +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 31 00:11:58 2008 +0100 + + Support the different CMake build modes. + + Now you can specify (using -DCMAKE_BUILD_TYPE=type) a CMake build + type to have GCC or ICC w/ tuned C(XX)FLAGS. + The supported build types are: None (as in no type is specified on + command line), RelWithDebInfo, Release, Debug, DebugFull, Profile. + + CMakeLists.txt | 7 ------- + cmake/modules/PopplerMacros.cmake | 29 +++++++++++++++++++++++++++++ + 2 files changed, 29 insertions(+), 7 deletions(-) + +commit 37d2055137c310ceb217164a76814b188be3b1b2 +Author: Pino Toscano <pino@draco.(none)> +Date: Wed Jan 30 23:12:03 2008 +0100 + + Introduce the CMake-based build system. + + Mostly works nicely as the autotools, and it mimics (almost) all + the autotools behaviours. + Copied some scripts from the KDE cmake scripts (BSD-licensed). + TODO: gtk-doc. + + CMakeLists.txt | 390 +++++++ + ConfigureChecks.cmake | 47 + + cmake/modules/COPYING-CMAKE-SCRIPTS | 22 + + cmake/modules/FindCairo.cmake | 44 + + cmake/modules/FindFontconfig.cmake | 47 + + cmake/modules/FindFreetype.cmake | 74 ++ + cmake/modules/FindGTK.cmake | 70 ++ + cmake/modules/FindPackageHandleStandardArgs.cmake | 58 + + cmake/modules/FindQt3.cmake | 319 +++++ + cmake/modules/FindQt4.cmake | 1295 + +++++++++++++++++++++ + cmake/modules/MacroBoolTo01.cmake | 20 + + cmake/modules/MacroEnsureVersion.cmake | 117 ++ + cmake/modules/MacroOptionalFindPackage.cmake | 28 + + cmake/modules/MacroPushRequiredVars.cmake | 47 + + cmake/modules/PopplerDefaults.cmake | 10 + + cmake/modules/PopplerMacros.cmake | 83 ++ + config.h.cmake | 149 +++ + glib/CMakeLists.txt | 107 ++ + glib/demo/CMakeLists.txt | 17 + + glib/poppler-features.h.cmake | 24 + + poppler-cairo.pc.cmake | 9 + + poppler-config.h.cmake | 160 +++ + poppler-glib.pc.cmake | 13 + + poppler-qt.pc.cmake | 12 + + poppler-qt4.pc.cmake | 12 + + poppler-splash.pc.cmake | 9 + + poppler.pc.cmake | 11 + + qt/CMakeLists.txt | 33 + + qt4/CMakeLists.txt | 2 + + qt4/src/CMakeLists.txt | 43 + + qt4/tests/CMakeLists.txt | 47 + + test/CMakeLists.txt | 52 + + utils/CMakeLists.txt | 84 ++ + 33 files changed, 3455 insertions(+) + +commit 1ea831d3eee6eda35fadfb3c75962a0c708e6c7b +Author: Pino Toscano <pino@kde.org> +Date: Wed Jan 30 22:17:38 2008 +0100 + + Preprocessor #warning is GCC-specific. + + poppler/ArthurOutputDev.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4c738cc6bd51f9d9e23ba83949c490c5c8691345 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 29 23:45:52 2008 +0100 + + Scale text to match 'm' size + + Fixes bug 12304 + + poppler/SplashOutputDev.cc | 37 +++++++++++++++++++++++++++++ + splash/SplashFTFont.cc | 55 + +++++++++++++++++++++++++++++++++++++++++++- + splash/SplashFTFont.h | 4 ++++ + splash/SplashFont.h | 4 ++++ + splash/SplashFontFile.cc | 1 + + splash/SplashFontFile.h | 2 ++ + 6 files changed, 102 insertions(+), 1 deletion(-) + +commit 64f16cf6ebf2870852fe8d937b25be58869ad40a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 29 23:41:15 2008 +0100 + + Enable antialias by default on the test tool + + qt4/tests/test-poppler-qt4.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit 90f0e6bc1e96d9f1666cb8476a92e127f5b927d4 +Author: Jonathan Kew <jonathan_kew@sil.org> +Date: Tue Jan 29 20:23:08 2008 +0100 + + Provide gstrndup as a portable substitue of strndup + + configure.ac | 1 - + goo/gmem.cc | 7 +++++++ + goo/gmem.h | 5 +++++ + poppler/GfxFont.cc | 8 +------- + 4 files changed, 13 insertions(+), 8 deletions(-) + +commit 77b91c852ad3d5554afc03aee92a1d928f233401 +Merge: 0babb0e 0533696 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 28 20:44:34 2008 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit 0babb0eb1afa343fb12a3fd037b98d2d1c794a1c +Author: Jonathan Kew <jonathan_kew@sil.org> +Date: Mon Jan 28 20:42:44 2008 +0100 + + Introduce a check for strndup and alternative for systems without it + + configure.ac | 1 + + poppler/GfxFont.cc | 6 ++++++ + 2 files changed, 7 insertions(+) + +commit 053369678963206a4afa88a614de1994872c7c5a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 27 19:36:28 2008 +0100 + + Add ok_to_fill_form permission flag + + glib/poppler-document.cc | 2 ++ + glib/poppler-document.h | 3 ++- + glib/test-poppler-glib.cc | 21 +++++++++++++++++++-- + 3 files changed, 23 insertions(+), 3 deletions(-) + +commit 3085a9495ad87a54758da0024372610fdaf88d57 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 27 19:15:34 2008 +0100 + + Fix slice rendering in poppler glib demo + + glib/demo/render.c | 41 ++++++++++++++++++++++++----------------- + 1 file changed, 24 insertions(+), 17 deletions(-) + +commit 7ad6c4ba110b970516d5380444a03ae217496ddf +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 24 21:14:44 2008 +0100 + + Incrementing the iterator would be a good idea + + qt4/src/poppler-annotation.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 7c99ec4635a4971321bbead7d1bc723da59b755e +Author: Julien Rebetez <julien@fhtagn.net> +Date: Thu Jan 24 19:18:15 2008 +0100 + + Revert unwanted change on Dict, fix leak on writeTrailer + + poppler/Dict.cc | 2 +- + poppler/PDFDoc.cc | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 2335fb6034d2e9ec304abba400119b88302b3160 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 23 23:26:20 2008 +0100 + + Draw underlined Links correctly + + See http://bugs.kde.org/show_bug.cgi?id=151359 for an example + + poppler/Gfx.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 96c532ea4b56a147de1deb965126e31f87df588b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jan 23 13:30:12 2008 +0100 + + Fix memory leak + + poppler/Form.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6bca64407c675ca837f83a12c0f655f975f14407 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jan 23 13:27:45 2008 +0100 + + Make sure default values are not loaded more than once for the + same widget. + + poppler/Form.cc | 18 +++++++++++++++++- + poppler/Form.h | 1 + + 2 files changed, 18 insertions(+), 1 deletion(-) + +commit eccf84b51a1cf5d478c0ec84be3fc9be8e458f4f +Author: Pino Toscano <pino@kde.org> +Date: Tue Jan 22 23:28:16 2008 +0100 + + Refactor the PSConverter and add a PDFConverter (for PDF export/save). + + Add an OutStream subclass to redirect the output to a QIODevice. + Split the PSConverter in a base class (BaseConverter) w/ d_ptr + structure. + Add a new PDFConverter that inherit BaseConverter, and do the + actual export + making use of the new QIODeviceOutStream. + The BaseConverter now handles automatically file or QIODevice output. + + qt4/src/Makefile.am | 5 + + qt4/src/poppler-base-converter.cc | 99 ++++++++++++++++ + qt4/src/poppler-converter-private.h | 48 ++++++++ + qt4/src/poppler-document.cc | 5 + + qt4/src/poppler-pdf-converter.cc | 68 +++++++++++ + qt4/src/poppler-ps-converter.cc | 162 + +++++++++++--------------- + qt4/src/poppler-qiodeviceoutstream-private.h | 47 ++++++++ + qt4/src/poppler-qiodeviceoutstream.cc | 71 +++++++++++ + qt4/src/poppler-qt4.h | 85 +++++++++++--- + 9 files changed, 483 insertions(+), 107 deletions(-) + +commit 547db8be1ab0b2987f0f06d8529eaaed2414028c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jan 22 13:22:20 2008 +0100 + + Fix a crash when createAnnot returns NULL due to invalid annot dict. + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0d558841142587d66bd3b2025e5a9ca39f7a6159 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 21 21:43:39 2008 +0100 + + Fix another reversed comparison due to cmp + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb6a87e39336e2e3893f3e5f577e4d176d237a9f +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Mon Jan 21 10:07:35 2008 +0100 + + Fixed a few compare issues with Annots. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 7cf85dc8d7c895a211684c7d36757063ed4f469b +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Mon Jan 21 21:27:49 2008 +0100 + + The glade file needs to be distributed + + test/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 46e93d31dd9b5909ecd8f7a8f8de23329444a7bc +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Sun Jan 20 19:56:51 2008 +0100 + + we need time.h if we use time() + + poppler/PDFDoc.cc | 1 + + 1 file changed, 1 insertion(+) + +commit a0adb006c38ea07f010a01d9c0bb07ca0f48939d +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 20 19:55:55 2008 +0100 + + Added a saveAs() overload which takes a plain OutStream + + poppler/PDFDoc.cc | 9 +++++++-- + poppler/PDFDoc.h | 2 ++ + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit fcdd5c51f370d040ae57aa64801c9bd4dbe88752 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jan 19 18:00:10 2008 +0100 + + Do not render images when getting the image mapping, it can be done + later on demand. + + glib/poppler-page.cc | 81 +++++++++++++++------------- + glib/poppler-page.h | 6 ++- + poppler/CairoOutputDev.cc | 131 + ++++++++++++++++++++++++++------------------- + poppler/CairoOutputDev.h | 12 ++++- + 4 files changed, 135 insertions(+), 95 deletions(-) + +commit 37ae465775d9a53e7c06cf51aa215439214fd79c +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Sat Jan 19 14:00:31 2008 +0100 + + ignore pdf-fullrewrite binary + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 1d160935ea4c1116b745c584ed7f1fd03fbbfb46 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Jan 19 13:59:46 2008 +0100 + + AnnotWidget support and few fixes + + poppler/Annot.cc | 243 + +++++++++++++++++++++++++++++++++++++++++++++++++++--- + poppler/Annot.h | 142 ++++++++++++++++++++++++++++--- + 2 files changed, 365 insertions(+), 20 deletions(-) + +commit 0e91a3973e525d65236d15930a8ea0e5bbb6a6cc +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Jan 19 13:59:25 2008 +0100 + + AnnotTextMarkup support and improved AnnotQuadrilaterals + + poppler/Annot.cc | 356 + +++++++++++++++++++++++++++++++++++++++++++----------- + poppler/Annot.h | 130 +++++++++++++++++--- + 2 files changed, 400 insertions(+), 86 deletions(-) + +commit c13952cd56a40bad14a1bf28699b137f65162f10 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Jan 19 13:59:02 2008 +0100 + + Changed AnnotQuadrilateral parsing inside AnnotLink + + poppler/Annot.cc | 246 + +++++++++++++++++++++++++++++------------------------- + poppler/Annot.h | 19 +++-- + 2 files changed, 144 insertions(+), 121 deletions(-) + +commit 2f821f10fbbba9363405201c86494cd861cec2b2 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sat Jan 19 13:49:43 2008 +0100 + + Add AnnotQuadPoints class + + poppler/Annot.cc | 16 ++++++++++++++++ + poppler/Annot.h | 23 +++++++++++++++++++++++ + 2 files changed, 39 insertions(+) + +commit de4c8fa6607e55c199bede1dc731227692ef4f53 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Dec 30 21:21:56 2007 +0100 + + AnnotFreeText support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 232 + +++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 127 ++++++++++++++++++++++++++++++ + 2 files changed, 358 insertions(+), 1 deletion(-) + +commit c3504a87933ae1516b1ef05e527fd1c039091235 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Sun Dec 30 19:37:18 2007 +0100 + + Improved AnnotLink support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 116 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 51 ++++++++++++++++++++++++ + 2 files changed, 167 insertions(+) + +commit a20468cc38bb590124b2b028a08f364f90f2487f +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 13:02:17 2008 +0100 + + Adds a test application to test full rewrite functionnality. + + test/Makefile.am | 11 ++++++++++- + test/pdf-fullrewrite.cc | 44 + ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 54 insertions(+), 1 deletion(-) + +commit 246294714c6011651fd0e5b3649bd65919058c72 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:59:03 2008 +0100 + + FormWidget's 'modified' member variable is now updated correctly + each time an update is done. + + Before, only text FormWidget had their 'modified' field set to 'true' + if they had been updated. + It is now the case for the other type of FormWidgets. + + poppler/Form.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 6e0f297b8b17afb95779724b8618ca39016e664a +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:54:09 2008 +0100 + + Annot will save their generated appearance in their AP dict. + + poppler/Annot.cc | 42 ++++++++++++++++++++++++++++++++++++++---- + poppler/Annot.h | 1 + + 2 files changed, 39 insertions(+), 4 deletions(-) + +commit e20f6a8e9ac3936b4bc03710a71fe390dfc4c094 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:52:02 2008 +0100 + + Add deep copy constructor to Dict. + + poppler/Dict.cc | 14 +++++++++++++- + poppler/Dict.h | 1 + + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit e8d46cab77c7167edb0896296118daafc0f13b6d +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:51:44 2008 +0100 + + Adds the ability to save PDF using either incremental update or by + rewriting completly the PDF. + + poppler/PDFDoc.cc | 379 + ++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/PDFDoc.h | 18 ++- + poppler/XRef.cc | 12 +- + poppler/XRef.h | 3 +- + 4 files changed, 402 insertions(+), 10 deletions(-) + +commit 742b0c3dec01d8672b84f56d5bb0e2890b178594 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:51:27 2008 +0100 + + Make the md5 method of Decrypt public so it can be used by other + files. + + poppler/Decrypt.cc | 5 ++--- + poppler/Decrypt.h | 1 + + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit bb7867976740dea259d4110c072552fc5953910f +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:51:07 2008 +0100 + + Modify the writeToFile method of XRef so it uses OutStream instead + of a C file descriptor. + + poppler/XRef.cc | 10 +++++----- + poppler/XRef.h | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit d80736587fdbc0e163077f27bfd21c5e3a7fa4c7 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:50:49 2008 +0100 + + Adds addIndirectObject method to XRef. This method allow the creation + of new indirect objects. + + poppler/XRef.cc | 39 +++++++++++++++++++++++++++++++++++++++ + poppler/XRef.h | 1 + + 2 files changed, 40 insertions(+) + +commit 8bd00dd0872191b8806e9411d9a1adc441f08a47 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:50:16 2008 +0100 + + Add some unfiltered methods to input stream. + + With these methods, it is possible to read the raw content from the + stream, without any filtering (even not the headers). + + poppler/Stream.cc | 41 ++++++++++++++++++++++++++++------------- + poppler/Stream.h | 26 ++++++++++++++++++++++++++ + 2 files changed, 54 insertions(+), 13 deletions(-) + +commit 8bcda287ddd316f90b3e47a3a307fbe63a5c21f7 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:46:53 2008 +0100 + + Add setNeedFree method to MemStream so it is possible to choose if + the stream should take care of deleting the buffer. + + poppler/Stream.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4fbd143de7e3a8ab386dd14b057e62b3b9fe04e4 +Author: Julien Rebetez <julien@fhtagn.net> +Date: Sat Jan 19 12:45:54 2008 +0100 + + Add Outstream, a base class for output streams and FileOutStream, + which implements OutStream for output to a file. + + poppler/Stream.cc | 55 +++++++++++++++++++++++++++++++++++++++++++++ + poppler/Stream.h | 64 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 119 insertions(+) + +commit 696eaa47169fb063b7e6998c876926c578b6fbfa +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jan 17 15:56:59 2008 +0100 + + Fix a crash when editing text form fields + + poppler/Annot.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9ec1b28dcdade12498b94b650c26483581294ee6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jan 17 14:54:34 2008 +0100 + + Fix a crash when a form field contains reference to non existant + children + + poppler/Form.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit f7ed40c465033bad26dfda008c5984954baa0607 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jan 16 21:01:50 2008 +0100 + + Add a cast to fix build + + glib/demo/info.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1c0aa21e598b879ec49d96700e6438ccb8ac2283 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Fri Jan 11 20:28:49 2008 +0100 + + rename info.c to info.cc to fix bug 14024 + + glib/demo/Makefile.am | 2 +- + glib/demo/info.c | 243 + ------------------------------------------------- + glib/demo/info.cc | 243 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 244 insertions(+), 244 deletions(-) + +commit 88f8bf850b6c41d25b9576597b5fc5bd75a122f4 +Author: Kjartan Maraas <kmaraas@gnome.org> +Date: Thu Jan 10 23:51:54 2008 +0100 + + Fix two use after free bugs in HtmlOutputDev.cc + + utils/HtmlOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 348f4f9d9d5b0f91da6f46e0fcefec80255d4179 +Merge: 8a8a4f0 4eca2e0 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Sat Jan 5 23:03:06 2008 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit 8a8a4f01272fb86898fafbda07129c0cbc03d527 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jan 5 23:02:22 2008 +0100 + + Make Document::renderHints return the correct render hints + + qt4/src/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4eca2e041c93349e0c4666e83ad1ca3caff91dee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jan 1 14:34:00 2008 +0100 + + Add page transitions demo + + glib/demo/Makefile.am | 2 + + glib/demo/main.c | 16 +-- + glib/demo/transitions.c | 321 + +++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/transitions.h | 31 +++++ + 4 files changed, 363 insertions(+), 7 deletions(-) + +commit e92b50bbd3dfc8657b611e3c33129d7c5bae2319 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Dec 26 18:56:01 2007 +0100 + + Use getEmbeddedFontID instead of getEmbeddedFontName to check if a + font is embedded or not + + poppler/GfxFont.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 30e9bae97e3742913015f7ea46636b2b80937612 +Author: Ed Catmur <ed@catmur.co.uk> +Date: Sat Dec 22 22:54:51 2007 +0100 + + Fixlets for Adobe Glyph Naming convention implementation + + poppler/GfxFont.cc | 94 + +++++++++++++++++++++++++++------------------------- + 1 file changed, 48 insertions(+), 46 deletions(-) + +commit 40551e616b007ceb15c9d6e3d77c24538ffec924 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Sat Dec 22 14:31:50 2007 +0100 + + Check the destination page of the link does exist + + qt4/src/poppler-link.cc | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit c06d6f2236d854f05e7621be280109ff27dc73b9 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Thu Dec 20 20:13:08 2007 +0100 + + Use UnicodeParsedString that does exactly what this code does + + qt4/src/poppler-document.cc | 28 +--------------------------- + 1 file changed, 1 insertion(+), 27 deletions(-) + +commit 5f9f06a10fdb72a9d809ee1f779e1a8f549840e7 +Author: Koji Otani <sho@bbr.jp> +Date: Thu Dec 20 19:59:26 2007 +0100 + + Fix for latest CJK code + + See + http://lists.freedesktop.org/archives/poppler/2007-December/003244.html + for more information + + poppler/GfxFont.cc | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit bb49e1e3909fc7392c197dc67d9b7f5312fd0dad +Author: Ed Catmur <ed@catmur.co.uk> +Date: Tue Dec 18 20:20:11 2007 +0100 + + Implement Adobe Glyph Naming convention + + poppler/GfxFont.cc | 183 + +++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 154 insertions(+), 29 deletions(-) + +commit 5634d63abdd64d371f2e8687a1c172f55b052008 +Author: Koji Otani <sho@bbr.jp> +Date: Mon Dec 17 20:43:41 2007 +0100 + + Allow seting some more Graphics States (Font, LW, LC, LJ, ML, D, + RI, FL) by operator 'gs' + + poppler/Gfx.cc | 67 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 67 insertions(+) + +commit 7a9e7fc96b47b9d833300233ac38bbd60097f425 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 16 21:21:08 2007 +0100 + + Add AnnotLink class so that link annots are properly recognized + + Right now, all of the annots except Text, are created using the + base class Annot which sets the type to unknown. For link annots this + causes the border never be drawn, since we are checking first + whether the + annot is a Link and it's always false. + + poppler/Annot.cc | 12 +++++++++++- + poppler/Annot.h | 10 ++++++++++ + 2 files changed, 21 insertions(+), 1 deletion(-) + +commit 796d9cb9b188a8af69d7fbf9bccbb408cbf6a71a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 15 15:21:49 2007 +0100 + + Fix a crash when trying to create a temp annot with catalog = NULL + + poppler/Annot.cc | 7 +++++++ + poppler/Annot.h | 1 + + poppler/Form.cc | 6 ++---- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit 99f049f0dfbfd9c22bea56ae96253837ae421e23 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 14 15:26:24 2007 +0100 + + Use the default dash array when it's not correct in AnnotBorderBS + + poppler/Annot.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit cb2a997aa6f9dd5508ca8b04e63815da893497ef +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 14 14:12:14 2007 +0100 + + Fix another crash due to uninitialized variables + + poppler/Annot.cc | 18 ++++++++---------- + poppler/Annot.h | 1 + + 2 files changed, 9 insertions(+), 10 deletions(-) + +commit f704e86d8c72bacbd9443c4d828cd284d3a11753 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 14 12:58:12 2007 +0100 + + Fix several crashes due to uninitialized variables in Annots. + + poppler/Annot.cc | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 0820a93ba1c0e893681024feb9f9bd120a9eeb4d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 14 12:38:58 2007 +0100 + + Check whether top and left should be changed in FitH, FitV, FitBH + and FitBV destinations + + According to the spec, if a null value is specified for top or left + parameter in such + destinations, the parameter should be retained unchanged. + + poppler/Link.cc | 36 ++++++++++++++++++++++++++++-------- + 1 file changed, 28 insertions(+), 8 deletions(-) + +commit 0fb42a2f557d5ec83b42326eb6b0be41622ca328 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Wed Dec 12 01:02:31 2007 +0100 + + Changed getters to const + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 28 ++++++++++----------- + poppler/Annot.h | 72 + +++++++++++++++++++++++++++--------------------------- + 2 files changed, 50 insertions(+), 50 deletions(-) + +commit 29d39a8ae120e6045a16a7aa0944c36560b42508 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Mon Dec 10 17:56:44 2007 +0100 + + AnnotText support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 123 + +++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/Annot.h | 65 ++++++++++++++++++++++++----- + 2 files changed, 177 insertions(+), 11 deletions(-) + +commit 2acecde458122bd67487cc302478befa78bf6fbe +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Mon Dec 10 16:45:46 2007 +0100 + + AnnotMarkup support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 115 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 51 ++++++++++++++++++++++++ + 2 files changed, 166 insertions(+) + +commit 1f8c1fe34e04688d2ba200f1166cfdd1ffe563f0 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Mon Dec 10 16:34:01 2007 +0100 + + AnnotPopup support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 34 ++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 21 +++++++++++++++++++++ + 2 files changed, 55 insertions(+) + +commit 6c83e06fb2eb77d0dbefd1ebfbcac3e5f0cbb622 +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Mon Dec 10 16:24:38 2007 +0100 + + Prepare code to Annotation Subtype support. + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + glib/poppler-page.cc | 11 +--- + poppler/Annot.cc | 160 + ++++++++++++++++++++++++++++++++++++-------------- + poppler/Annot.h | 54 ++++++++++++++--- + poppler/Form.cc | 6 +- + 4 files changed, 167 insertions(+), 64 deletions(-) + +commit fa0bb5bbea5bf2769c8b3084f78770b7781002eb +Author: Iñigo Martínez <inigomartinez@gmail.com> +Date: Mon Dec 10 15:41:38 2007 +0100 + + Various Annot improvements + + Signed-off-by: Iñigo Martínez <inigomartinez@gmail.com> + + poppler/Annot.cc | 613 + +++++++++++++++++++++++++++++++++++------------------- + poppler/Annot.h | 140 +++++++++++-- + poppler/Gfx.cc | 21 +- + poppler/Gfx.h | 5 +- + 4 files changed, 543 insertions(+), 236 deletions(-) + +commit e0f49fd5aef3c798798ad7e7dba55857bde1b4c0 +Author: Koji Otani <sho@bbr.jp> +Date: Thu Dec 13 23:40:46 2007 +0100 + + Some CJK charecters are displayed vertical glyphs incorrectly when + horizontal mode + + poppler/GfxFont.cc | 46 +++++++++++++++++++++++++--------------------- + 1 file changed, 25 insertions(+), 21 deletions(-) + +commit 85901922bf354a1268037d0b6ec5cbf14da979a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 13 23:30:59 2007 +0100 + + Yet another gmallocn to gmallocn_checkoverflow + + Fixes http://bugs.kde.org/show_bug.cgi?id=153949 + + poppler/SplashOutputDev.cc | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit f24259cddb9c5e02cf9d2071bfa0106f3e88bd59 +Author: Koji Otani <sho@bbr.jp> +Date: Mon Dec 10 23:24:14 2007 +0100 + + Display characters outside of unicode BMP with TT font + + fofi/FoFiTrueType.cc | 33 +++++++++++++++++++--- + fofi/FoFiTrueType.h | 2 +- + poppler/CMap.cc | 34 +++++++++++++++++++++++ + poppler/CMap.h | 4 +++ + poppler/GfxFont.cc | 75 + +++++++++++++++++++++++++++++++------------------- + 5 files changed, 115 insertions(+), 33 deletions(-) + +commit 7cbabbf378cf5a9c0411558ff02b44dec2040ea1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Dec 10 22:00:30 2007 +0100 + + Fix a crash when marked content properties operator is not a dict. + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e807f9c72c7f0c5cc0655918f676f4af54739442 +Merge: bf57117 e2ea743 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 9 18:07:30 2007 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit bf57117df8786778faf31e5d843533004f867ff3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 9 18:07:00 2007 +0100 + + Add support for ActualText entries + + Patch by Adrian Johnson with two minor changes by me (one fordward + declaration and a leak fix) + + poppler/Form.cc | 2 +- + poppler/Gfx.cc | 2 +- + poppler/OutputDev.cc | 2 +- + poppler/OutputDev.h | 2 +- + poppler/PDFDocEncoding.h | 4 ++ + poppler/TextOutputDev.cc | 98 + +++++++++++++++++++++++++++++++++++++++++++++- + poppler/TextOutputDev.h | 11 ++++++ + 7 files changed, 116 insertions(+), 5 deletions(-) + +commit e2ea7430e7d6db50cbfdac34713915e5b0942a89 +Author: Albert Astals Cid <tsdgeos@localhost.(none)> +Date: Sat Dec 8 23:21:34 2007 +0100 + + disable warnings about assigning const char * to char * + + We have them all over the place and we are not going to fix it as + that'll be too much overhead when re-merging xpdf changes + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit acf70c666d4f534cd97de64d4378bf6399e31fd4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 6 23:58:26 2007 +0100 + + Disable gtk tests if the user disabled glib frontend + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bb0ec68f21d355081ff75aad641bc3809141e398 +Merge: 5a34cdd b925ea2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 6 18:38:54 2007 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit b925ea232b6ed5028712600f9aebe453f3b2ba06 +Author: Brad Hards <bradh@kde.org> +Date: Tue Dec 4 19:11:13 2007 +1100 + + Remove redundant check. + + poppler/PSOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 275afca4ef24020273df652ccfdf76c6994e9294 +Author: Brad Hards <bradh@kde.org> +Date: Sun Dec 2 19:45:16 2007 +1100 + + Preserve PDF page labels when we output as postscript. + + Resolves bug 13338. + + poppler/PSOutputDev.cc | 81 + +++++++++++++++++++++++++++++++++++++++++++++++- + poppler/PSOutputDev.h | 2 ++ + 2 files changed, 82 insertions(+), 1 deletion(-) + +commit 641edb83a457083c13f3e374f6ac6c570dd54d7f +Author: Brad Hards <bradh@kde.org> +Date: Wed Nov 28 19:42:53 2007 +1100 + + Minor API documentation update + + qt4/src/poppler-annotation.h | 81 + ++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 79 insertions(+), 2 deletions(-) + +commit 3635ec6fcbc89daf633c03efb644df9031b80f59 +Author: Brad Hards <bradh@kde.org> +Date: Wed Nov 28 19:42:22 2007 +1100 + + Update doxygen configuration file to version 1.5.3 + + qt4/src/Doxyfile | 185 + +++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 141 insertions(+), 44 deletions(-) + +commit 02c7ea6e1fd3e225de1eda231813f4db0ffb9fdb +Author: Brad Hards <bradh@kde.org> +Date: Wed Nov 28 19:41:54 2007 +1100 + + Fix off-by-one in printCommands path. + + poppler/Gfx.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 74af7c1209f47ed39addf7fde3ea106a7c77a408 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Nov 24 18:12:00 2007 +0100 + + Convert passwords from utf-8 to latin-1 when needed. Fixes bug #4557 + + glib/poppler-document.cc | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit 5a34cddf043cb484549cb411e034786a7d8688a3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 23 23:13:57 2007 +0100 + + add a ignore + + glib/demo/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 21a58562cc1e575ec3d81b6e34bfcb21306eb67f +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 23 23:12:06 2007 +0100 + + sscanf does not like null strings, so don't call it on empty qstrings + + qt/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6f8451cf9d19f57f658d1568643ecb0f953e1075 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Nov 11 21:29:40 2007 -0500 + + Add support for knockout groups to the cairo backend + + This is sort of hacky because we need to keep track of shape and + opacity + seperately. It is also probably not entirely correct. However, + it should be + closer than previously. + + poppler/CairoOutputDev.cc | 309 + +++++++++++++++++++++++++++++++++++++++++++-- + poppler/CairoOutputDev.h | 8 +- + 2 files changed, 303 insertions(+), 14 deletions(-) + +commit b0fbfb0ac366434d7e4c0350a9be83ddda7b03cf +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Nov 11 16:06:16 2007 -0500 + + Track the AlphaIsShape and TextKnockout state + + Parse, store and notify the OutputDevices about these entries. + + poppler/Gfx.cc | 14 ++++++++++++++ + poppler/GfxState.h | 6 ++++++ + poppler/OutputDev.h | 2 ++ + 3 files changed, 22 insertions(+) + +commit f6429b13a972f2deb25b3d3a9948dca024a54841 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Nov 10 14:08:09 2007 -0500 + + Fix accidental mode change. + + 0 files changed + +commit 5797f50a99d1494767edc5928f9c3e9d927b946d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Nov 10 01:52:00 2007 -0500 + + Scale text to match 'm' size + + This adds back the hack that was removed when fontconfig support + was added long + ago. It's not a great solution but lets us be at least as good as + xpdf. Fixes + #12304 with the cairo backend. The problem persists with the splash + backend. + + poppler/CairoFontEngine.cc | 56 + +++++++++++++++++++++++++++++++++++++++++--- + poppler/CairoFontEngine.h | 7 +++++- + poppler/CairoOutputDev.cc | 8 +++++-- + 3 files changed, 65 insertions(+), 6 deletions(-) + +commit 551212e55127c7e46d9aff3318015fd9b5385687 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Nov 10 11:56:15 2007 +0100 + + Fix uninitialized variable access + + Supported by Derek B. Noonburg + + poppler/GfxState.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 934a5ae45eb17bd0e2010be89f55510e8a69816b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Nov 3 13:08:51 2007 -0400 + + Avoiding using floating point when converting to luminance. + + The code now also does proper rounding instead of just truncating. + + poppler/CairoOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1b3f045a25e5d172357bc87c15ba591c8e1511a7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 8 23:34:07 2007 +0100 + + Move another gmallocn to gmallocn_checkoverflow. Fixes crashes on + incorrect pdf sent by Red Hat + + poppler/Stream.cc | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +commit 944d327fd7036332a33b4ad6476ceca7a650ef6e +Merge: fb1d1f4 c340255 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 7 23:52:47 2007 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit fb1d1f459784a6c19034212a617268f7f5a90e9c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 7 23:51:58 2007 +0100 + + merge ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl2.patch + + poppler/Stream.cc | 417 + ++++++++++++++++++++++++++++++----------------------- + poppler/Stream.h | 10 +- + 2 files changed, 245 insertions(+), 182 deletions(-) + +commit c340255f46bc95b5f850abcd3d9bcdc8594199bb +Author: Brad Hards <bradh@kde.org> +Date: Mon Nov 5 20:36:23 2007 +1100 + + Update .gitignore + + Suppress the noise a bit. + + qt4/.gitignore | 1 + + qt4/tests/.gitignore | 3 +++ + test/.gitignore | 2 ++ + 3 files changed, 6 insertions(+) + +commit cebf770379e7d71166e729aebf771a4ca291d48b +Author: Brad Hards <bradh@kde.org> +Date: Mon Nov 5 20:31:18 2007 +1100 + + Add a new unit test, for non-ASCII searching. + + There is a bug report (bug:7063) about not being able + to find text that isn't ASCII. I think that the problem isn't + in poppler core code - this unit test shows we can find + characters as long as they are properly encoded (which the + Qt4 front end does). + + qt4/tests/Makefile.am | 7 ++++++- + qt4/tests/check_search.cpp | 40 + ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 46 insertions(+), 1 deletion(-) + +commit 570fe464a2aae4f22d0b47cce73b8bc36b116e9f +Merge: 1c7b7a0 7875067 +Author: Brad Hards <bradh@kde.org> +Date: Mon Nov 5 15:55:39 2007 +1100 + + Merge branch 'minor-fixes' + +commit 78750679e213d7307cce38166b6af32562e871b8 +Author: Brad Hards <bradh@kde.org> +Date: Mon Nov 5 15:54:36 2007 +1100 + + Additional check for password protected documents + + We need to bail out on locked documents. In the future, + we could probably go interactive, and ask the user for + a password. + + qt4/tests/test-poppler-qt4.cpp | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 1c7b7a0c581b542945cac257202bbb819d33694c +Author: Brad Hards <bradh@kde.org> +Date: Mon Nov 5 15:49:45 2007 +1100 + + Minor Qt4 API documentation fix + + Also, this is a test of my git newbie-ness. + + qt4/src/poppler-form.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b86fc565d175835cf27e9c8632da47a5e0b50237 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 5 00:14:55 2007 +0100 + + Fix FSF address + + glib/demo/fonts.c | 2 +- + glib/demo/fonts.h | 2 +- + glib/demo/forms.c | 2 +- + glib/demo/forms.h | 2 +- + glib/demo/info.c | 2 +- + glib/demo/info.h | 2 +- + glib/demo/links.c | 2 +- + glib/demo/links.h | 2 +- + glib/demo/main.c | 2 +- + glib/demo/outline.c | 2 +- + glib/demo/outline.h | 2 +- + glib/demo/page.c | 2 +- + glib/demo/page.h | 2 +- + glib/demo/render.c | 2 +- + glib/demo/render.h | 2 +- + glib/demo/utils.c | 2 +- + glib/demo/utils.h | 2 +- + glib/poppler-action.cc | 2 +- + glib/poppler-action.h | 2 +- + glib/poppler-attachment.cc | 2 +- + glib/poppler-attachment.h | 2 +- + glib/poppler-document.cc | 2 +- + glib/poppler-document.h | 2 +- + glib/poppler-features.h.in | 2 +- + glib/poppler-form-field.cc | 2 +- + glib/poppler-form-field.h | 2 +- + glib/poppler-page.cc | 2 +- + glib/poppler-page.h | 2 +- + glib/poppler.cc | 2 +- + glib/poppler.h | 2 +- + poppler/PageTransition.cc | 2 +- + poppler/Sound.cc | 2 +- + poppler/Sound.h | 2 +- + qt/poppler-document.cc | 2 +- + qt/poppler-fontinfo.cc | 2 +- + qt/poppler-link-qt3.h | 2 +- + qt/poppler-link.cc | 2 +- + qt/poppler-page-transition-private.h | 2 +- + qt/poppler-page-transition.cc | 2 +- + qt/poppler-page-transition.h | 2 +- + qt/poppler-page.cc | 2 +- + qt/poppler-private.h | 2 +- + qt/poppler-qt.h | 2 +- + qt4/src/poppler-annotation-helper.h | 2 +- + qt4/src/poppler-annotation-private.h | 2 +- + qt4/src/poppler-annotation.cc | 2 +- + qt4/src/poppler-annotation.h | 2 +- + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-embeddedfile.cc | 2 +- + qt4/src/poppler-fontinfo.cc | 2 +- + qt4/src/poppler-form.cc | 2 +- + qt4/src/poppler-form.h | 2 +- + qt4/src/poppler-link-extractor-private.h | 2 +- + qt4/src/poppler-link-extractor.cc | 2 +- + qt4/src/poppler-link.cc | 2 +- + qt4/src/poppler-link.h | 2 +- + qt4/src/poppler-page-private.h | 2 +- + qt4/src/poppler-page.cc | 2 +- + qt4/src/poppler-private.h | 2 +- + qt4/src/poppler-ps-converter.cc | 2 +- + qt4/src/poppler-qt4.h | 2 +- + qt4/src/poppler-sound.cc | 2 +- + qt4/src/poppler-textbox.cc | 2 +- + 63 files changed, 63 insertions(+), 63 deletions(-) + +commit 37776afc6f8a5733b41da6fb0f45e7ace4edf737 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 5 00:03:55 2007 +0100 + + Update from http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + + COPYING | 27 +++++++++++++-------------- + 1 file changed, 13 insertions(+), 14 deletions(-) + +commit 34a90b35998b65539cf1e8f09194d45db71064a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 4 14:03:35 2007 +0100 + + Remove duplicate checking + + poppler/JBIG2Stream.cc | 8 -------- + 1 file changed, 8 deletions(-) + +commit d694e1dd042fb97fbc62046b69cafe30d6f9ea58 +Merge: ba5b31c 432e657 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 4 13:26:47 2007 +0100 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit ba5b31c6a8b2317332bfa148f6d80f66891fb9ce +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Nov 4 13:25:12 2007 +0100 + + Require fontconfig >= 2.0 Fixes bug 9020 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 432e657a49cb097638a79e38c141088039572816 +Author: Jeff Muizelaar <jeff@freiheit.infidigm.net> +Date: Mon Sep 17 19:15:21 2007 -0400 + + Use realloc/free instead of new/delete when resizing GooStrings + + This allows for a large performance improvement when appending a + large number + of characters to a GooString. This is especially helpful for + TextOutputDev on + large PDFs. For example, the following code has the potential to be + O(n) instead of + O(n²) with a good implementation of realloc. + + while (n) { + string.append(character); + n--; + } + + goo/GooString.cc | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +commit cb80112afed2c5b9642c3c43f1cc001ed88d08cb +Author: Jonathan Kew <jonathan_kew@sil.org> +Date: Thu Nov 1 20:53:05 2007 +0100 + + Do not try to parse directories when processing nameToUnicode + dir. Fixes ugly warnings on mingw32 + + poppler/GlobalParams.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit ad6b888edff7b30be72df948c4052b9934a37705 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Thu Nov 1 20:48:21 2007 +0100 + + Add some castings to make it compile + + glib/test-poppler-glib.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a968dcc759379f48265c91bea63ca4cf987d94a9 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Wed Oct 31 23:53:39 2007 +0100 + + Tests for passwords + + qt4/tests/Makefile.am | 13 +++++- + qt4/tests/check_password.cpp | 87 + ++++++++++++++++++++++++++++++++++++++ + qt4/tests/stress-poppler-dir.cpp | 63 +++++++++++++++++++++++++++ + qt4/tests/test-poppler-qt4.cpp | 15 ++++++- + 4 files changed, 175 insertions(+), 3 deletions(-) + +commit 7b7a08863a8278dee7aa1fe7789cf72223c26b35 +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Oct 31 23:53:27 2007 +0100 + + Improve documentation + + qt4/src/poppler-qt4.h | 64 + ++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 56 insertions(+), 8 deletions(-) + +commit 96493c9409186a7e964e894c7f730962b6995fd7 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Wed Oct 31 23:51:25 2007 +0100 + + remove old file + + glib/test-poppler-glib.c | 514 + ---------------------------------------------- + 1 file changed, 514 deletions(-) + +commit 951a05f7a11af4a44e4cb85a015939d6a3e513f5 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Sat Oct 27 12:33:22 2007 +0200 + + Remove fordward declaration of a non-existant class + + poppler/Form.h | 1 - + 1 file changed, 1 deletion(-) + +commit 289679405ab143bc2106cf269227c514a1602e56 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Oct 25 22:16:10 2007 -0400 + + Avoid drawing borders unless /W and /S are specified in /BS + + Acroread doesn't sometimes doesn't draw borders when you'd + expect it to. Special case that behaviour so that we do the + same thing. + + poppler/Annot.cc | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit ab0a6c37faf9916edcd70e128d9f2654eb795ace +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Thu Oct 25 20:56:58 2007 +0200 + + Fix compilation on mingw. Bug 12493 + + Added a check for localtime_r in configure.ac + Moved test-poppler-glib.c to test-poppler-glib.cc to get the correct + compiler + + configure.ac | 1 + + glib/Makefile.am | 2 +- + glib/test-poppler-glib.cc | 520 + +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 522 insertions(+), 1 deletion(-) + +commit 6bd637dc135045b20abf024d394538d7a3160795 +Merge: c01ab71 25b273d +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Tue Oct 23 23:27:01 2007 +0200 + + Merge branch 'master' of + ssh://aacid@git.freedesktop.org/git/poppler/poppler + +commit c01ab714ecd42e39ecb0be1c0c2504635251ac01 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Tue Oct 23 23:26:21 2007 +0200 + + Provide setters for some methods that only had getters. Fixes + bug 12894 + + poppler/GlobalParams.cc | 49 + +++++++++++++++++++++++++++++++++++++++++++++++ + poppler/GlobalParams.h | 7 +++++++ + 2 files changed, 56 insertions(+) + +commit 25b273db677815c8df11e52fe9df29fe857a8a88 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Oct 22 23:01:37 2007 -0400 + + Unset the font if it doesn't exist or we can not load it properly + + Previously, the previous font stayed current and glyphs would be + drawn using + it. This resulted in random glyphs being chosen unless the encodings + happened + to match. Now, instead, we draw nothing which matches the behaviour of + acroread. + + poppler/Gfx.cc | 4 ++++ + poppler/GfxFont.cc | 4 ++++ + 2 files changed, 8 insertions(+) + +commit 57331767ed5306eba1f9bf60e48fc88debdc2198 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Mon Oct 22 23:33:59 2007 +0200 + + builddir != srcdir fixes by Christian Persch <chpe gnome org> + + autogen.sh | 7 ++++--- + glib/demo/Makefile.am | 1 + + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit 2a333e5a618b5c92f3c703816b950321f25d3aab +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Mon Oct 22 22:14:43 2007 +0200 + + Splash rework, check if font is inside clip area before rendering + it to a temporary bitmap. Fixes KDE bug 150693 + + This change is not trivial. What i did is: + It is getGlyph the one that does the intersection between clip area + and rendering area of the font instead fillGlyph2 + That means some clipRes = state->clip->testRect but we win more + robustness against broken pdf that specify HUGE fonts + + splash/Splash.cc | 207 + ++++++++++++++++++++++++------------------------ + splash/Splash.h | 4 +- + splash/SplashFTFont.cc | 23 +++++- + splash/SplashFTFont.h | 4 +- + splash/SplashFont.cc | 29 +++++-- + splash/SplashFont.h | 5 +- + splash/SplashT1Font.cc | 11 ++- + splash/SplashT1Font.h | 4 +- + 8 files changed, 162 insertions(+), 125 deletions(-) + +commit cf785cd12ae77e8dd778ed043584f8f26efe675f +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Mon Oct 22 21:59:35 2007 +0200 + + Add gmallocn_checkoverflow, it's the same as gmallocn but returns + NULL on overflow instead of doing exit() + + goo/gmem.cc | 18 ++++++++++++++++++ + goo/gmem.h | 3 +++ + 2 files changed, 21 insertions(+) + +commit 37e16ac301a35ceca2e3535f8c6100d4cf723c82 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Mon Oct 22 21:54:02 2007 +0200 + + exit(1) is bad in library code, use the src.abort method to describe + failure + + poppler/DCTStream.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit dbe975c129999a3efceb1c86518fa6fda74f685c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Oct 22 11:25:37 2007 +0200 + + Fix a crash with invalid TrueType fonts + + fofi/FoFiTrueType.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 8bfe30a48fd7021591ab307bd51f86c06ff202b9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Oct 19 15:46:50 2007 +0200 + + Do not generate appearance stream for radio button that are not active + + poppler/Annot.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1a531dcfee1c6fc79a414c38cbe7327fbf9a59d8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Oct 19 13:12:24 2007 +0200 + + Fix a crash with invalid embedded fonts + + poppler/CairoFontEngine.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit e1740278457e512676b623bcdf9968193f0a8d7b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Oct 19 12:21:54 2007 +0200 + + Do not draw annotations when rendering for printing + + glib/poppler-page.cc | 25 ++++++++++++++++++++++--- + poppler/Annot.h | 2 ++ + 2 files changed, 24 insertions(+), 3 deletions(-) + +commit a4d25f79dfc1a7e4998e2e113ef92312bd4af553 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Oct 16 15:24:08 2007 +0200 + + Detect form fields at any depth level + + We were ignoring non root form fields that contain only a kids + dictionary. + See evince bug: http://bugzilla.gnome.org/show_bug.cgi?id=486957 + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03e1da99f7393fb1103643311b0b5af7b875e09c +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Oct 13 19:38:15 2007 -0400 + + Add an implementation of CairoOutputDev::startPage() + + The implementation initializes fill_pattern and stroke_pattern + to black matching SplashOutputDev. This fixes #12504. + + poppler/CairoOutputDev.cc | 9 +++++++++ + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 825c942d46e0c3e254028441015c5dd8440cc734 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Fri Oct 12 13:47:09 2007 +0200 + + Copy the embeddef file description string correctly + + poppler/Catalog.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 5e60da78695eff44cc10dbce46ef170727f682b1 +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Fri Oct 12 13:46:52 2007 +0200 + + Correctly delete the embedded file stream + + qt4/src/poppler-embeddedfile.cc | 1 + + qt4/src/poppler-private.h | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 1627fbbde8be01af3bdd2583f3439897a37d5215 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Oct 6 23:27:40 2007 -0400 + + Use maskWidth and maskHeight for reading from the mask image in + CairoOutputDev::drawMaskedImage() + + Previously, drawMaskedImage() was incorrectly using the image width + and height which is + wrong when width != maskWidth or heigh != maskHeight. Fixes #12668. + + poppler/CairoOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3156d560c5eaf6970da422d0b09fd2e95bfe6d1d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Oct 5 11:34:01 2007 +0200 + + Fix a crash when Form Fields array contains references + to non existent objects. Fixes bug #11865 + + poppler/Form.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit f0b5e6286e94c6153c8247b5fae63a18622c48d3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Oct 4 15:22:01 2007 +0200 + + Do not return unknown field type for signature form fields + + glib/poppler-form-field.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 498fd7fb99b01a879d07e2ad12c0b9462a8fc438 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Oct 4 12:36:39 2007 +0200 + + Add poppler_page_render_for_printing() and + poppler_page_render_to_pixbuf_for_printing() + + We were unconditionally passing printing=gFalse to displaySlice. With + these new + functions we can render to a pixbuf or cairo surface passing + printing=gTrue to + displaySlice. + + glib/poppler-page.cc | 135 + ++++++++++++++++++++++++++++++++++++++++---------- + glib/poppler-page.h | 10 ++++ + 2 files changed, 119 insertions(+), 26 deletions(-) + +commit 56af69787c78c2edbb69266e86a5a5b639ca6d3e +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Oct 3 23:02:25 2007 -0400 + + Error out if we can't find a .cidToUnicode for a known character + collection + + This situation was caused by the fixes for bug #11413. I'm not sure + it's the best thing to do, but it seems better. + + poppler/GfxFont.cc | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 3d0df46908379bce1d196b9dc41153b1adb5f725 +Author: Michael Wolf <maw@ximian.com> +Date: Wed Oct 3 19:43:55 2007 +0200 + + Fix compile warning + + glib/test-poppler-glib.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit aba29e12528025c2cc71bf46e02e76ac4db2b193 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 28 21:01:50 2007 +0200 + + Add forms demo to glib poppler demo + + glib/demo/Makefile.am | 2 + + glib/demo/forms.c | 489 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/forms.h | 31 ++++ + glib/demo/main.c | 8 +- + glib/demo/utils.c | 1 - + 5 files changed, 527 insertions(+), 4 deletions(-) + +commit d0c0f26d2c95232c216e3daa15e98a3aff14ac27 +Merge: 59d55f7 38d5bb1 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Tue Sep 25 03:33:52 2007 -0700 + + Merge branch 'master' of + ssh://kjk@git.freedesktop.org/git/poppler/poppler + +commit 38d5bb150a5fe883da1d4256463d1f796d201283 +Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)> +Date: Tue Sep 25 16:13:51 2007 -0700 + + Silence deprecation warnings - annoying with msvc 2005. + + makefile.vc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 59d55f7371bee81c9392fa2d4174ceffaacde471 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Tue Sep 25 01:21:19 2007 -0700 + + Fix misleading comment. + + goo/GooTimer.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c36d8afc984795aca0a12a94ec7668092067db82 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Tue Sep 25 00:32:29 2007 -0700 + + Revert "replace extremely confusing 'a*(int)sizeof(foo)/sizeof(foo) + != a' which, due to type promotions, if a is int, is equivalent to + a < 0; fix problems revealed by the change" + + This reverts commit 08bf7c1151d594d4c7d253a2c89f4f3a088ad8ec. + + poppler/XRef.cc | 25 +++++++++++++++++++++---- + 1 file changed, 21 insertions(+), 4 deletions(-) + +commit ff25e83abae1ca17e2e7dd6f20946026fca69fff +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 23:57:25 2007 -0700 + + Make perf-test compile on unix as well. + + test/Makefile.am | 16 +++++- + test/perf-test-preview-dummy.cc | 1 + + test/perf-test.cc | 104 + ++++++++++++++++----------------------- + 3 files changed, 59 insertions(+), 62 deletions(-) + +commit 70f3bf42b3028d9a2e4aefdc2e1a458b3c77b0e7 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 21:26:54 2007 -0700 + + Let perf-test.cc manage lifetime of rendered bitmap. + + test/perf-test-preview-win.cc | 7 ------- + 1 file changed, 7 deletions(-) + +commit b622b252cba068a15eae77df5deb261dd98affaf +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 21:20:12 2007 -0700 + + Disable my_error for now - seems to corrupt memory. + + test/perf-test.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit bde8c9669ca6b43cb6a664bd14df164a718041ea +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 21:08:58 2007 -0700 + + Con't copy the file unless COPY_FILE is defined. + + test/perf-test.cc | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit bf9b46b012c64624818a2110af7c4b7e3b419728 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 20:13:54 2007 -0700 + + Respect -loadonly cmd-line arg. + + test/perf-test.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2f664b654ca19135f0f8a0fe89872b9e0d526fa2 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 19:41:45 2007 -0700 + + Fix msvc debug build. Fix bitmap leak in perf-test. + + makefile.vc | 6 ++++-- + test/perf-test.cc | 1 + + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 05d41cd5aec39b4e3c8949445a9986e5ca8b50dd +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 08:10:37 2007 -0700 + + Use GooTimer instead of my own timer. + + test/perf-test.cc | 98 + +++++------------------------------------------------ + 1 file changed, 8 insertions(+), 90 deletions(-) + +commit 05fbce5b6657e883ece9054c79576b25271a05a4 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Mon Sep 24 08:01:11 2007 -0700 + + Make GooTimer work for Windows/msvc build. + + goo/GooTimer.cc | 69 + +++++++++++++++++++++++++++++++++++++------------------ + goo/GooTimer.h | 28 +++++++++++++--------- + poppler/Gfx.cc | 11 ++------- + 3 files changed, 66 insertions(+), 42 deletions(-) + +commit 6347915085a487da08d39a859f4261fa812dab09 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Mon Sep 24 01:08:17 2007 -0700 + + Add Error.cc in msvc build and use setErrorFunction in perf-test. + + makefile.vc | 3 +-- + test/perf-test.cc | 10 +++++----- + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit ed01b3965c57ce2a4eabf9c46b5319ea627d3324 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Mon Sep 24 01:03:09 2007 -0700 + + Match declaration of setErrorFunction with its definition. + + Also enable this code for Windows, since CDECL was what + was throwing msvc off. + + poppler/Error.cc | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +commit 71fb15f8bd131a13d8cf0f394fe601cfbb6e1772 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Mon Sep 24 00:38:29 2007 -0700 + + Even less compiler warnings. + + poppler/CairoOutputDev.cc | 6 +++--- + qt/poppler-page.cc | 3 +++ + utils/HtmlOutputDev.cc | 10 ++++++---- + 3 files changed, 12 insertions(+), 7 deletions(-) + +commit 7ba3f198a0651d2a7c91b7d9e10a5173dc3de0a3 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Mon Sep 24 00:32:37 2007 -0700 + + Even less compiler warnings. + + qt/poppler-document.cc | 8 ++++++++ + qt/poppler-private.h | 8 -------- + qt4/src/poppler-document.cc | 10 ++++++++++ + qt4/src/poppler-form.cc | 15 +++++++++++++++ + qt4/src/poppler-private.h | 25 ------------------------- + 5 files changed, 33 insertions(+), 33 deletions(-) + +commit ab1059f594cb9fccd8568ca2a535a363c7521daa +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Mon Sep 24 00:14:01 2007 -0700 + + Don't break aliasing. + + poppler/GlobalParams.cc | 40 ++++++++++++++++++---------------------- + 1 file changed, 18 insertions(+), 22 deletions(-) + +commit 71c47b30adf687a0bcece22834933267053360de +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 23:49:31 2007 -0700 + + Reduce compiler warnings. + + poppler/JBIG2Stream.cc | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit 8466d94929844c976bbad8bb7d1ea7f7f77cc196 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 23:34:52 2007 -0700 + + Reduce compiler warnings. Tabs to spaces. + + fofi/FoFiType1C.cc | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit c53b8ccfba6fa4345086493f9e44212721c11d0a +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 23:23:34 2007 -0700 + + Reduce number of compiler warnings. + + poppler/CharCodeToUnicode.cc | 2 +- + poppler/Gfx.cc | 6 ++---- + poppler/PageLabelInfo.cc | 2 ++ + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit abede2a06c5c9dc97b40479deda49621458f1171 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 23:03:36 2007 -0700 + + Reduce number of compiler warnings. + + glib/poppler-action.cc | 1 - + glib/poppler-document.cc | 9 ++------- + glib/poppler-page.cc | 3 +-- + qt/poppler-document.cc | 1 - + qt4/src/poppler-annotation.cc | 16 +++++++++++++--- + 5 files changed, 16 insertions(+), 14 deletions(-) + +commit 60f5bcea4a920441e25ae11d677636242aabb2db +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 22:48:06 2007 -0700 + + Remove unused variables. + + utils/pdftoppm.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3179eee44eb0afbc642675268b9a4abb16ccdde3 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 22:47:21 2007 -0700 + + Remove unused variables. + + utils/HtmlOutputDev.cc | 23 ----------------------- + 1 file changed, 23 deletions(-) + +commit e9dc379190aa3166870d0b11a05ccc4e9dad2706 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 22:41:59 2007 -0700 + + Remove unused variables. + + poppler/ArthurOutputDev.cc | 16 +++++----------- + 1 file changed, 5 insertions(+), 11 deletions(-) + +commit 08bf7c1151d594d4c7d253a2c89f4f3a088ad8ec +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Sun Sep 23 22:28:16 2007 -0700 + + replace extremely confusing 'a*(int)sizeof(foo)/sizeof(foo) != a' + which, due to type promotions, if a is int, is equivalent to a < 0; + fix problems revealed by the change + + poppler/XRef.cc | 25 ++++--------------------- + 1 file changed, 4 insertions(+), 21 deletions(-) + +commit 5a1f670a4d16affeed86cdf643ab22f481caa3a5 +Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)> +Date: Sun Sep 23 20:42:59 2007 -0700 + + ignore *.o files + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit c156aed7234f82dea4cb384c1b8a7acdd34545be +Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)> +Date: Sun Sep 23 20:41:19 2007 -0700 + + remove unused variables + + poppler/ABWOutputDev.cc | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +commit d0bdef4752be5fa609a0766ee87aa54d51611d9a +Author: Krzysztof Kowalczyk <kkowalczyk@kjkubu.(none)> +Date: Sat Sep 22 13:38:03 2007 -0700 + + undo accidental changes to file permissions + + 0 files changed + +commit 6c69473f2f4a49757614ddd249e65bb7a13c63c1 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 08:09:53 2007 -0700 + + undo accidental mode change + + 0 files changed + +commit e7e386e7ce8cb8eb8a7037ebdaa601524d332ae7 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 08:08:53 2007 -0700 + + more simplification by removing unneded code + + makefile.vc | 2 +- + test/perf-test.cc | 60 + ++++++++--------------------------------------------- + 2 files changed, 10 insertions(+), 52 deletions(-) + +commit 3e10604637ec193269a3155985476d3b83dc7d62 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 07:48:38 2007 -0700 + + for portability use bool/true/false instead of BOOL/TRUE/FALSE + + test/perf-test.cc | 176 + ++++++++++++++++++++++++++--------------------------- + 1 file changed, 86 insertions(+), 90 deletions(-) + +commit 634718936f2a95fac2a9d12fcea483b3d0ca8fa6 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 07:41:14 2007 -0700 + + simplify perf-test + + test/perf-test-pdf-engine.h | 78 + ----------------------------------------- + test/perf-test-preview-win.cc | 5 ++- + test/perf-test.cc | 75 + +++++++++++++++++++++++++++++++++++++-- + 3 files changed, 75 insertions(+), 83 deletions(-) + +commit 617550199762fab42ca2e202e641e047b3efbac0 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 05:20:16 2007 -0700 + + simplify perf-test code + + test/perf-test-pdf-engine.h | 67 +++-------------------- + test/perf-test-preview-dummy.cc | 3 +- + test/perf-test-preview-win.cc | 80 +++++++++++++++++++++++---- + test/perf-test.cc | 114 + ++++----------------------------------- + 4 files changed, 86 insertions(+), 178 deletions(-) + +commit fb5bf808b88992c1772a10e4ed9fe788fb618417 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 03:03:26 2007 -0700 + + more msvc build fixes + + makefile.vc | 2 +- + test/perf-test.cc | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 60829b08a7440f36014f68ec54bee7a742412738 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 03:02:34 2007 -0700 + + msvc build fixes + + msvc/poppler/poppler-config.h | 143 + +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 143 insertions(+) + +commit 853c22a174bae81139edc9aeded7f26ae2655cef +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Thu Sep 20 23:21:35 2007 -0700 + + add pre-made config.h for msvc build + + msvc/config.h | 62 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 62 insertions(+) + +commit 31c43b118bd4372134018be6f6693f77d1f6a39b +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Thu Sep 20 22:10:09 2007 -0700 + + remove unused variables + + poppler/CairoFontEngine.cc | 6 ++---- + poppler/CairoOutputDev.cc | 14 ++------------ + splash/SplashFTFontEngine.cc | 2 ++ + 3 files changed, 6 insertions(+), 16 deletions(-) + +commit 01b99f60e36dd955817f23911ef38947360f61f7 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Thu Sep 20 21:14:17 2007 -0700 + + remove unused variables + + poppler/GfxState.cc | 11 ++--------- + poppler/SplashOutputDev.cc | 9 +++------ + poppler/TextOutputDev.cc | 3 --- + 3 files changed, 5 insertions(+), 18 deletions(-) + +commit 7c406400532d68524a43cf963d894d3c4b269400 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Thu Sep 20 20:57:44 2007 -0700 + + remove unused variables + + poppler/Catalog.cc | 1 - + poppler/Form.cc | 5 ----- + poppler/GfxFont.cc | 6 ++---- + poppler/Page.cc | 2 +- + splash/Splash.cc | 5 ++++- + 5 files changed, 7 insertions(+), 12 deletions(-) + +commit 70f23389c97b1870b7311d97322cdd16b580a79d +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Thu Sep 20 20:23:59 2007 -0700 + + don't silence warnings about unused variables/functions to keep + programmers honest + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cdb6fcf98137473efd993e1374a6f010e9db67db +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Thu Sep 20 20:00:56 2007 -0700 + + Remove unused variables + + poppler/Annot.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 0e76b49ac852a5a7ebae4c1f67b153e0b7c9f905 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Tue Sep 18 01:04:50 2007 -0700 + + Explain how to compile on Windows using msvc makefile. + + README.windows | 63 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 63 insertions(+) + +commit c002b4dc75b2688ffe8a734cf3e15f5891797842 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Tue Sep 18 00:04:47 2007 -0700 + + Add Windows/msvc makefile. + + Add native msvc windows makefile and pre-made + config.h for windows in msvc directory. + + makefile.vc | 149 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 149 insertions(+) + +commit 1f33fc58201c92120c587189d2e0e819f83167da +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Mon Sep 17 23:53:02 2007 -0700 + + Start on a test program. + + Test program can be used for regression testing and + performance testing. It renders a page (or pages) + in a given PDF (or PDFs) and records rendering times. + For historical reasons the code is ugly and probably + only compiles on windows, but it'll get better. + + test/perf-test-pdf-engine.h | 131 ++++ + test/perf-test-preview-dummy.cc | 22 + + test/perf-test-preview-win.cc | 222 ++++++ + test/perf-test.cc | 1428 + +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 1803 insertions(+) + +commit b96db4ad27535c2666fccdfe0a3c04cc7c37792d +Author: Jeff Muizelaar <jeff@freiheit.infidigm.net> +Date: Mon Sep 17 20:28:38 2007 -0400 + + Avoid double free caused by 302 merge + + The ownership of the the string returned by getKey() changed with + the 302 merge + but this code was not updated. Found by Matthew Woehlke. + + qt4/src/poppler-document.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 2a495f19d4465e15fd2fa96656d904315c79a443 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Sep 17 16:52:45 2007 -0400 + + Simplify ChangeLog rule a bit. + + ChangeLog.mk | 81 + ---------------------------------------------------------- + Makefile.am | 7 ++--- + 2 files changed, 4 insertions(+), 84 deletions(-) + +commit 7d5abbeec55e4b90b139671d96cfdf58bdab70b8 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Sep 17 15:45:26 2007 -0400 + + Add dist hook to generate ChangeLog. + + Taken from cairo. It still need some tweaking. + + ChangeLog.mk | 81 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Makefile.am | 4 +++ + configure.ac | 2 +- + 3 files changed, 86 insertions(+), 1 deletion(-) + +commit 15ad81c64cd8b1cb438d41be402daa19a239db3d +Author: Albert Astals Cid <tsdgeos@bluebox.localdomain> +Date: Mon Sep 17 19:39:29 2007 +0200 + + Use = instead of == in qt.m4 + + m4/qt.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70fabcb96e207b9b889bb32c0cf5ea3fc0aa08f8 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Sep 16 20:40:53 2007 -0400 + + Rename .cvsignore files to .gitignore and drop ChangeLog file. + + .cvsignore | 25 - + .gitignore | 25 + + ChangeLog | 4586 + --------------------------------------------- + fofi/.cvsignore | 8 - + fofi/.gitignore | 8 + + glib/.cvsignore | 11 - + glib/.gitignore | 11 + + glib/reference/.cvsignore | 18 - + glib/reference/.gitignore | 18 + + goo/.cvsignore | 8 - + goo/.gitignore | 8 + + poppler/.cvsignore | 10 - + poppler/.gitignore | 10 + + qt/.cvsignore | 7 - + qt/.gitignore | 7 + + qt4/.cvsignore | 3 - + qt4/.gitignore | 3 + + qt4/src/.cvsignore | 8 - + qt4/src/.gitignore | 8 + + qt4/tests/.cvsignore | 20 - + qt4/tests/.gitignore | 20 + + splash/.cvsignore | 8 - + splash/.gitignore | 8 + + test/.cvsignore | 11 - + test/.gitignore | 11 + + utils/.cvsignore | 12 - + utils/.gitignore | 12 + + 27 files changed, 149 insertions(+), 4735 deletions(-) + +commit c9f9403ffc5b95ae790c3c81284c7786afe33f4d +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Fri Sep 14 20:50:07 2007 +0000 + + Windows implementation for matching fonts that doesn't use fontconfig + + ChangeLog | 6 + + poppler/GlobalParamsWin.cc | 285 + ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 291 insertions(+) + +commit d18b5361a0504458da805ed6be037c9d648f9372 +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Fri Sep 14 20:47:11 2007 +0000 + + Update ChangeLog for previous checkin + + ChangeLog | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 3330763ddca66b30d5ee60aab94d6fe0bbae9c8f +Author: Krzysztof Kowalczyk <kkowalczyk@gmail.com> +Date: Fri Sep 14 06:17:35 2007 +0000 + + windows/msvc compilation fixes + + poppler/DCTStream.h | 2 +- + poppler/Error.cc | 6 ++++++ + poppler/FlateStream.h | 2 +- + poppler/GlobalParams.cc | 12 ++++++++++-- + poppler/GlobalParams.h | 17 +++++++++++++++++ + poppler/Stream.cc | 2 +- + splash/SplashFTFontEngine.cc | 2 ++ + splash/SplashFontEngine.cc | 2 +- + splash/SplashFontFile.cc | 2 ++ + splash/SplashFontFile.h | 3 ++- + splash/SplashT1FontEngine.cc | 2 +- + 11 files changed, 44 insertions(+), 8 deletions(-) + +commit 6eb159ef34eb7e2fb8adcfc48afd84d5f50efbbd +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 10 17:38:05 2007 +0000 + + * autogen.sh: Support automake-1.10. + Patch by Krzysztof Kowalczyk <kkowalczyk@gmail.com> + + ChangeLog | 5 +++++ + autogen.sh | 11 ++++++----- + 2 files changed, 11 insertions(+), 5 deletions(-) + +commit 31bbc8c727cfecc79bd8da962ad8d99a0d1d3d33 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 8 10:40:17 2007 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-ps-converter.cc: + Add PSConverter::setOutputDevice() to set a QIODevice where + writing the resulting PS. + + ChangeLog | 7 ++++++ + qt4/src/poppler-ps-converter.cc | 51 + ++++++++++++++++++++++++++++++++++++--- + qt4/src/poppler-qt4.h | 5 +++- + 3 files changed, 58 insertions(+), 5 deletions(-) + +commit b3d63d03c310f01cc5b23d00ffd2103c6891fef2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 5 20:22:32 2007 +0000 + + * qt4/src/poppler-ps-converter.cc: Fix Right<->Left + interchange + + ChangeLog | 1 + + qt4/src/poppler-ps-converter.cc | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 64368582d5ca4e28c236f440482c96f1dd3a8897 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 5 18:22:52 2007 +0000 + + * poppler/PSOutputDev.cc: Fix printing of second parameter + + ChangeLog | 4 ++++ + poppler/PSOutputDev.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit eaf9d06cf0d08ccdc183759e0331dc2439a6f10f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Sep 5 10:57:09 2007 +0000 + + 2007-09-05 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-page.cc: + * glib/demo/render.c: Fix build with --disable-cairo-output. + + ChangeLog | 5 +++++ + glib/demo/render.c | 31 +++++++++++++++++++++++++++---- + glib/poppler-page.cc | 22 ++++++++++++---------- + 3 files changed, 44 insertions(+), 14 deletions(-) + +commit c0f488c2b0e115be3e1b7e4dc7baa38db5837498 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 4 22:04:52 2007 +0000 + + did not want to commit this + + gtk-doc.make | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3462851b4ea342651095f1803cd488bc3b3f5749 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 4 22:02:06 2007 +0000 + + * utils/pdftoppm.cc: Fix build on Sun Studio compiler. + Patch by Brian Cameron <brian.cameron@sun.com> + + ChangeLog | 5 +++++ + gtk-doc.make | 2 +- + utils/pdftoppm.cc | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit cdf3b9062cc54d558b8dbeefb3211a920ff2cb94 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 3 19:23:11 2007 +0000 + + write news + fix qt4 build + + NEWS | 13 +++++++++++++ + qt4/src/Makefile.am | 3 ++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit c82208a44f3b09c27bc33831641e4f746dd4361f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 3 18:28:44 2007 +0000 + + * configure.ac: Bump version to 0.6 + * glib/Makefile.am + * poppler/Makefile.am + * qt/Makefile.am + * qt4/src/Makefile.am: Bump sonames + + ChangeLog | 8 ++++++++ + configure.ac | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt/Makefile.am | 2 +- + qt4/src/Makefile.am | 2 +- + 6 files changed, 13 insertions(+), 5 deletions(-) + +commit 2a12409ebbf96ea3ca4556b71231a45ae37cb052 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 3 17:09:01 2007 +0000 + + * poppler/JBIG2Stream.cc: + * poppler/Stream.cc: Patch by Derek B. Noonburg + <derekn@foolabs.com> + to fix some errors in CCITTFaxStream and JBIG2Stream.cc + + ChangeLog | 6 ++++++ + poppler/JBIG2Stream.cc | 7 ++++--- + poppler/Stream.cc | 2 +- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 0b483e71ef02b4040b665935c1018c8b30b9c1ca +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Sep 3 08:54:01 2007 +0000 + + 2007-09-03 Carlos Garcia Campos <carlosgc@gnome.org> + * gtk-doc.make: + * glib/poppler-document.cc: + * glib/poppler-form-field.cc: + * glib/poppler-page.cc: + * glib/reference/poppler-docs.sgml: + * glib/reference/poppler-sections.txt: + * glib/reference/poppler.types: + * glib/reference/tmpl/poppler-action.sgml: + * glib/reference/tmpl/poppler-attachment.sgml: + * glib/reference/tmpl/poppler-document.sgml: + * glib/reference/tmpl/poppler-enums.sgml: + * glib/reference/tmpl/poppler-form-field.sgml: + * glib/reference/tmpl/poppler-page.sgml: + * glib/reference/tmpl/poppler-private.sgml: + * glib/reference/tmpl/poppler.sgml: Update glib bindings API + documentation. + + ChangeLog | 19 ++ + glib/poppler-document.cc | 10 + + glib/poppler-form-field.cc | 205 +++++++++++++++++ + glib/poppler-page.cc | 12 +- + glib/reference/poppler-docs.sgml | 2 + + glib/reference/poppler-sections.txt | 108 ++++++++- + glib/reference/poppler.types | 2 + + glib/reference/tmpl/poppler-action.sgml | 36 ++- + glib/reference/tmpl/poppler-attachment.sgml | 65 ++++++ + glib/reference/tmpl/poppler-document.sgml | 50 +++++ + glib/reference/tmpl/poppler-enums.sgml | 60 +++++ + glib/reference/tmpl/poppler-form-field.sgml | 315 + +++++++++++++++++++++++++++ + glib/reference/tmpl/poppler-page.sgml | 236 +++++++++++++++++++- + glib/reference/tmpl/poppler-private.sgml | 6 + + glib/reference/tmpl/poppler.sgml | 49 +++++ + gtk-doc.make | 34 +-- + 16 files changed, 1181 insertions(+), 28 deletions(-) + +commit 289e3893cda45055951bb8d3b82a45644bc0b6c6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 2 17:02:55 2007 +0000 + + * poppler/GfxState.cc: Pad zeroes instead of aborting when + rendering + 1-bit images and the stream is "too short" to mimic + Acroread and + ghostscript behaviour. Patch by <darren.kenny@sun.com>. Fixes + #12208 + + ChangeLog | 3 +++ + poppler/GfxState.cc | 4 ++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 6f6c2180aca2e26ea0e3c2f21f11bc8f457c19c0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 2 16:31:19 2007 +0000 + + * glib/demo/Makefile.am: Add + $(top_builddir)/poppler/libpoppler.la + * poppler/TextOutputDev.cc: Patch from Ed Catmur + <ed@catmur.co.uk> to + improve matching of half strings of decomposed + characters/ligatures. + + ChangeLog | 3 +++ + glib/demo/Makefile.am | 1 + + poppler/TextOutputDev.cc | 21 +++++++++++++-------- + 3 files changed, 17 insertions(+), 8 deletions(-) + +commit be1b5a0196cdfc78f74e08a023b477cac16eb0f3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 2 16:06:03 2007 +0000 + + poppler/PDFDoc.cc: Don't enforce %%EOF at the end of file + + ChangeLog | 4 ++++ + poppler/PDFDoc.cc | 3 ++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 500a87af9240344806c18ebbd05a89f4f4c69955 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Sep 2 00:53:42 2007 +0000 + + 2007-09-01 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/Error.cc: + * poppler/Error.h: Report any cairo errors when destroying + the cairo + context. + + ChangeLog | 7 +++++++ + poppler/CairoOutputDev.cc | 7 ++++++- + poppler/Error.cc | 7 +++++++ + poppler/Error.h | 1 + + 4 files changed, 21 insertions(+), 1 deletion(-) + +commit 0c22556bf70ff67eb388cdcd9784603030397785 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Sep 1 23:38:04 2007 +0000 + + 2007-09-01 Jeff Muizelaar <jeff@infidigm.net> + + * glib/demo/Makefile.am: Only build the demo app if the cflags + will be + appropriately set. + + ChangeLog | 5 +++++ + glib/demo/Makefile.am | 2 ++ + 2 files changed, 7 insertions(+) + +commit a23d45dd6cd8a2ac4181170a9ee924fe49a9781b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Sep 1 23:00:59 2007 +0000 + + 2007-09-01 Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-page.cc: Add note about clipping + + ChangeLog | 4 ++++ + glib/poppler-page.cc | 2 ++ + 2 files changed, 6 insertions(+) + +commit bf489d5cebc467807f2b38f74f6a6e34a503a9ca +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 30 18:39:51 2007 +0000 + + * poppler/Form.h: Remove unused methods. Fixes 12013 + + ChangeLog | 4 ++++ + poppler/Form.h | 3 --- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit a81cc06c855385911dffa826b9e1407d6097e8c8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 30 18:15:34 2007 +0000 + + 2007-08-30 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/TextOutputDev.cc: + * poppler/TextOutputDev.h: + * glib/poppler.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/test-poppler-glib.c: Add support for word and line + selections. Based on patch by Kristian Høgsberg. + + ChangeLog | 10 ++++++ + glib/poppler-page.cc | 81 + ++++++++++++++++++++++++++++++++++++++++------ + glib/poppler-page.h | 2 ++ + glib/poppler.h | 4 +-- + glib/test-poppler-glib.c | 2 +- + poppler/TextOutputDev.cc | 74 + +++++++++++++++++++++++++++++------------- + poppler/TextOutputDev.h | 34 ++++++++++++++----- + 7 files changed, 163 insertions(+), 44 deletions(-) + +commit 59ddb5cc8bec54305b6d256ad9975e95ecdcb935 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 27 18:37:55 2007 +0000 + + * poppler/UnicodeTypeTable.cc: Fix error on the NFKC text + matching + routine. Fixes bug #11775. Patch by Ed Catmur + <ed@catmur.co.uk> + + ChangeLog | 5 +++++ + poppler/UnicodeTypeTable.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit a6e46ce61670679f368e66c1a98a7d5d1c960c5b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 27 17:56:29 2007 +0000 + + * qt4/src/Doxyfile: + * qt4/src/Mainpage.dox: + * qt4/src/poppler-annotation.h: + * qt4/src/poppler-form.h: + * qt4/src/poppler-link.h: + * qt4/src/poppler-qt4.h: + A few API documentation fixes and improvements. + + ChangeLog | 10 +++++++ + qt4/src/Doxyfile | 26 ++++++----------- + qt4/src/Mainpage.dox | 26 ++++++++++------- + qt4/src/poppler-annotation.h | 34 +++++++++++++++++++++++ + qt4/src/poppler-form.h | 18 ++++++------ + qt4/src/poppler-link.h | 63 + +++++++++++++++++++++++++++++++++++++++--- + qt4/src/poppler-qt4.h | 44 +++++++++++++++++++---------- + 7 files changed, 166 insertions(+), 55 deletions(-) + +commit a7f8d92fba8c45d6ca83568c045d5e324158ee6b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 27 17:17:14 2007 +0000 + + * qt4/src/poppler-link.cc: + * qt4/src/poppler-link.h: + Initialise correctly, and missing empty destructor. + * qt4/src/poppler-annotation.cc: + Don't leak the private class. + + ChangeLog | 9 +++++++++ + qt4/src/poppler-annotation.cc | 4 ++-- + qt4/src/poppler-link.cc | 8 ++++++-- + qt4/src/poppler-link.h | 1 + + 4 files changed, 18 insertions(+), 4 deletions(-) + +commit 2b1ef8f06879eb0b79288d57540c238ea833db24 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 26 21:39:22 2007 +0000 + + Fix bug 12121 + + ChangeLog | 4 ++++ + utils/ImageOutputDev.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 20bcac5ee1988befb9c590a0d16cb615f0c49901 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 26 21:28:34 2007 +0000 + + forgot to cvs add + + qt4/src/poppler-annotation-private.h | 49 + ++++++++++++++++++++++++++++++++++ + 1 file changed, 49 insertions(+) + +commit e48de657db0ef439457b4b5ca39b937da25d531e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 26 18:11:01 2007 +0000 + + * qt4/src/poppler-annotation.cc: + * qt4/src/poppler-annotation.h: + Move all the private members of the *Annotation classes into + a common + shared private. + + ChangeLog | 4 + + qt4/src/poppler-annotation.cc | 969 + ++++++++++++++++++++++++++++++++++------- + qt4/src/poppler-annotation.h | 277 ++++++++---- + qt4/src/poppler-page.cc | 249 +++++++---- + 4 files changed, 1155 insertions(+), 344 deletions(-) + +commit 392f050f909b6a1250acf1971446a1849534482c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 26 16:42:46 2007 +0000 + + * qt4/src/poppler-document.cc: + * qt4/src/poppler-embeddedfile.cc: + * qt4/src/poppler-fontinfo.cc: + * qt4/src/poppler-form.cc: + * qt4/src/poppler-form.h: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-sound.cc: + * qt4/src/poppler-textbox.cc: + API work: remove 'const' and 'const&' from return values + with Qt + classes; make the non-copiable classes really non-copiable; + uninline a Document::page() method; other related small + changes. + * qt4/src/poppler-link.cc: + * qt4/src/poppler-link.h: + Make LinkDestination an implicitely shared class, with all + the private + members into the private class; move all the private members + of the + Link* classes into a common shared private. + + ChangeLog | 23 ++- + qt4/src/poppler-document.cc | 7 +- + qt4/src/poppler-embeddedfile.cc | 12 -- + qt4/src/poppler-fontinfo.cc | 12 +- + qt4/src/poppler-form.cc | 16 +- + qt4/src/poppler-form.h | 14 +- + qt4/src/poppler-link.cc | 373 + ++++++++++++++++++++++++++++++--------- + qt4/src/poppler-link.h | 67 ++++--- + qt4/src/poppler-qt4.h | 32 ++-- + qt4/src/poppler-sound.cc | 7 - + qt4/src/poppler-textbox.cc | 4 +- + 11 files changed, 404 insertions(+), 163 deletions(-) + +commit f215aca25fdd8fe287b717dde53f0be273d995e4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Aug 26 10:52:19 2007 +0000 + + 2007-08-26 Carlos Garcia Campos <carlosgc@gnome.org> + * configure.ac: + * glib/Makefile.am: + * glib/demo/Makefile.am: + * glib/demo/fonts.[ch]: + * glib/demo/info.[ch]: + * glib/demo/links.[ch]: + * glib/demo/main.c: + * glib/demo/outline.[ch]: + * glib/demo/page.[ch]: + * glib/demo/render.[ch]: + * glib/demo/utils.[ch]: Add poppler glib demo tool. + + ChangeLog | 14 ++ + configure.ac | 1 + + glib/Makefile.am | 2 +- + glib/demo/Makefile.am | 26 +++ + glib/demo/fonts.c | 276 +++++++++++++++++++++++++++ + glib/demo/fonts.h | 31 +++ + glib/demo/info.c | 243 ++++++++++++++++++++++++ + glib/demo/info.h | 31 +++ + glib/demo/links.c | 289 ++++++++++++++++++++++++++++ + glib/demo/links.h | 31 +++ + glib/demo/main.c | 205 ++++++++++++++++++++ + glib/demo/outline.c | 218 ++++++++++++++++++++++ + glib/demo/outline.h | 31 +++ + glib/demo/page.c | 249 +++++++++++++++++++++++++ + glib/demo/page.h | 31 +++ + glib/demo/render.c | 498 + +++++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/render.h | 31 +++ + glib/demo/utils.c | 234 +++++++++++++++++++++++ + glib/demo/utils.h | 42 +++++ + 19 files changed, 2482 insertions(+), 1 deletion(-) + +commit 7c9529b70dc44bb001d21a3b47fc65916813dec1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Aug 23 20:39:31 2007 +0000 + + 2007-08-23 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-page.cc: Add missing comma. + + ChangeLog | 4 ++++ + glib/poppler-page.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 3c4a85503261ee81a829a1683f1f5fa85d41f8ee +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Aug 23 20:15:46 2007 +0000 + + 2007-08-23 Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-page.cc: pass in -1 to displaySlice so that it + sets up + the slice size for us. This fixes the case of the wrong values + being + used when the pdf was rotated on its side. + Fixes #11913. + + ChangeLog | 7 +++++++ + glib/poppler-page.cc | 5 ++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit 3ba088d8caee3c40c2aba0cd85adcf9195ae88a3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 22 21:29:32 2007 +0000 + + * splash/SplashBitmap.cc: + * splash/SplashBitmap.h: + * utils/pdftoppm.cc: Add the following features to pdftoppm + - if omitting input filename or using - for input filename + reads pdf from stdin + - if omitting output filename, prints output to stdout + - create image of a cropped rectangle of the pdf + - scale pdf to fit in a square of wanted size + Patch by Ilmari Heikkinen <ilmari.heikkinen@gmail.com> + + ChangeLog | 12 ++++++ + splash/SplashBitmap.cc | 18 ++++++-- + splash/SplashBitmap.h | 2 + + utils/pdftoppm.cc | 107 + ++++++++++++++++++++++++++++++++++++++++-------- + 4 files changed, 119 insertions(+), 20 deletions(-) + +commit 567e82c13aace4f40c7a555a62a3a4d223a46d92 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Aug 22 19:34:02 2007 +0000 + + 2007-08-22 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GlobalParams.cc: Fix debug spew. Patch from Matthias + Clasen. + + ChangeLog | 4 ++++ + poppler/GlobalParams.cc | 1 - + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit bc499987074d046baf29deafe4a29d57039c0c5e +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Aug 22 19:28:24 2007 +0000 + + 2007-08-22 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Fix the computation of the padding + in the + image scaling code. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 6 ++++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit d9719233447cb4f85f2bf9d9ec6ef089caa21140 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Aug 19 16:20:21 2007 +0000 + + 2007-08-19 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Avoid allocating the glyph array if + currentFont is not set in beginString. This closes a possible + memory leak. + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.cc | 3 +++ + 2 files changed, 9 insertions(+) + +commit 099eb56896046e020f4ef0365e1ee382f85ec1ab +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 15 18:52:20 2007 +0000 + + * poppler/JBIG2Stream.cc: Quick fix for bug #12014 + + ChangeLog | 4 ++++ + poppler/JBIG2Stream.cc | 16 +++++++++++----- + 2 files changed, 15 insertions(+), 5 deletions(-) + +commit 3b7e3645c85c7a3d341457f105835b58c935bd67 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 15 00:04:48 2007 +0000 + + RC2 is out! (0.5.91) + + ChangeLog | 1 + + NEWS | 18 ++++++++++++++++++ + configure.ac | 2 +- + 3 files changed, 20 insertions(+), 1 deletion(-) + +commit c240daefe660ac3456dc0c5f5dc82aa53ebc3313 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 14 23:10:37 2007 +0000 + + * poppler/Stream.cc: Fix CVE-2007-3387 by merging xpdf-3.02pl1.patch + + ChangeLog | 1 + + poppler/Stream.cc | 12 +++++------- + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit 1ba884b6b98ac8d755c9adc9f23a7a68d8b17b54 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 14 22:47:30 2007 +0000 + + * configure.ac: + * pòppler/Makefile.am: Patch by Vincent Torri + <vtorri@univ-evry.fr> to + fix linking under MinGW + + ChangeLog | 6 ++++++ + configure.ac | 13 +++++++++++++ + poppler/Makefile.am | 5 +++-- + 3 files changed, 22 insertions(+), 2 deletions(-) + +commit 3c31f923fcf1aeb361910eb1e9445cc28aa5b3ca +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Aug 7 16:22:12 2007 +0000 + + 2007-08-07 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Don't use the prescaleMethod + when we have a rotation as that case has not been tested. + Also make sure that scaledHeight is at least 1. + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.cc | 7 ++++++- + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit af97e5f8e0f3beeb43acde92a0788c02d9718adf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Aug 6 17:41:17 2007 +0000 + + 2007-08-06 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Annot.cc: + * poppler/Annot.h: + * poppler/Form.cc: + * poppler/Form.h: + * poppler/Page.cc: Do not always regenerate appearance stream for + every form widget, but only when it's actually needed. + + ChangeLog | 9 ++++++ + poppler/Annot.cc | 86 + +++++++++++++++++++++++++++++++++--------------------- + poppler/Annot.h | 8 ++--- + poppler/Form.cc | 25 +++------------- + poppler/Form.h | 4 ++- + poppler/Page.cc | 8 ++--- + 6 files changed, 74 insertions(+), 66 deletions(-) + +commit 74627e71388ca0a4c0938a472c291ef87186f370 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jul 31 21:40:19 2007 +0000 + + 2007-07-31 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GlobalParams.cc: s/GList/GooList/ some Windows code. + + ChangeLog | 4 ++++ + poppler/GlobalParams.cc | 8 ++++---- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit f421e2151345ac855b75e819e19343a90789b3bf +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jul 31 16:50:06 2007 +0000 + + 2007-07-31 Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-document.cc: + * glib/poppler-document.h: Add poppler_fonts_iter_get_file_name. + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 16 ++++++++++++++++ + glib/poppler-document.h | 1 + + 3 files changed, 22 insertions(+) + +commit 4d57b8a12b845d5d5ac321d7a4bca980d60d429f +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jul 31 16:48:35 2007 +0000 + + 2007-07-31 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.h: Add comment about + CairoImageOutputDevice's + implementation. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.h | 1 + + 2 files changed, 6 insertions(+) + +commit f04a67006abdb5843ab481aa1e25b51abd1b1b64 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 31 11:41:53 2007 +0000 + + 2007-07-31 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Form.cc: + * poppler/Form.h: Fix memory leak. + + ChangeLog | 5 +++++ + poppler/Form.cc | 9 +++++---- + poppler/Form.h | 4 ++-- + 3 files changed, 12 insertions(+), 6 deletions(-) + +commit ee9d556a8b413160911a535a0e9089b919ca29f5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 31 11:40:22 2007 +0000 + + 2007-07-31 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/CairoOutputDev.h: Empty implementation of transparency + groups and soft masks in CairoImageOutputDev. Fixes a crash in + poppler_page_get_image_mapping. + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.h | 11 +++++++++++ + 2 files changed, 17 insertions(+) + +commit e08779856c801b9968dc2d47e28e86abc1ec7110 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jul 31 05:29:57 2007 +0000 + + 2007-07-31 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GfxFont.cc: Fix the case where the Encoding is + "Identity" + and ToUnicode exists. GfxCIDFont::getCodeToGIDMap makes + CIDTOGID map + from ToUnicde map, but when encoding is Identity, it should + not use + ToUnicode map to get GID. If encoding is Identity, No CIDTOGID + map is + needed. + Patch by Koji Otani. + Fixes #11413. + + ChangeLog | 10 ++++++++++ + poppler/GfxFont.cc | 1 + + 2 files changed, 11 insertions(+) + +commit 86fc9a6f343be920f5159e745947401227e41a37 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Jul 30 19:28:17 2007 +0000 + + 2007-07-30 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Prescale image masks before giving + them + to cairo to improve the quality of the scaled image. Improves + #5589. + + ChangeLog | 6 + + poppler/CairoOutputDev.cc | 300 + +++++++++++++++++++++++++++++++++++++++++++-- + poppler/CairoOutputDev.h | 10 +- + 3 files changed, 303 insertions(+), 13 deletions(-) + +commit f754246e47161e9bf99887201e283c1419ade4f1 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Jul 30 19:07:45 2007 +0000 + + 2007-07-30 Jeff Muizelaar <jeff@infidigm.net> + + * configure.ac: Update require cairo version to 1.4 + + ChangeLog | 4 ++++ + configure.ac | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit bb20249ac676995725b617ef442f5feb01f78205 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Jul 30 18:44:41 2007 +0000 + + 2007-07-30 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Add transparency group support. + Fixes #7856. + + ChangeLog | 6 ++ + poppler/CairoOutputDev.cc | 133 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 21 ++++++- + 3 files changed, 159 insertions(+), 1 deletion(-) + +commit a85acecaeb0d122becbc52a385d918561e995eca +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Jul 30 00:22:35 2007 +0000 + + 2007-07-29 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: transform the original matrix for + type3 fonts + instead of using set_matrix() + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.cc | 20 +++++++++++++++++--- + poppler/CairoOutputDev.h | 1 + + 3 files changed, 24 insertions(+), 3 deletions(-) + +commit a81a082169de32d01c36c969616a5c2279f1bac7 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Jul 30 00:18:59 2007 +0000 + + 2007-07-29 Jeff Muizelaar <jeff@infidigm.net> + + * glib/test-poppler-glib.c: include <time.h> to fix compilation. + + ChangeLog | 4 ++++ + glib/test-poppler-glib.c | 1 + + 2 files changed, 5 insertions(+) + +commit 81393cb30f6287caf5195265cdc039555f2767d3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 28 08:22:40 2007 +0000 + + 2007-07-28 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Annot.cc: + * poppler/Annot.h: + * poppler/Form.cc: + * poppler/Form.h: Make fieldLookup static in Form and use it from + both Form and Annot. + + ChangeLog | 8 +++++++ + poppler/Annot.cc | 43 ++++++++++------------------------- + poppler/Annot.h | 1 - + poppler/Form.cc | 66 + ++++++++++++++++++++++++++---------------------------- + poppler/Form.h | 2 ++ + 5 files changed, 54 insertions(+), 66 deletions(-) + +commit 81b669dcb14bf821a49c9879f8d4129075647f5f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 28 08:05:11 2007 +0000 + + 2007-07-28 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-page.h: Remove unneeded declarations. Fixes bug + #11744. Patch by Kouhei Sutou <kou@cozmixng.org>. + + ChangeLog | 5 +++++ + glib/poppler-page.h | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit f2c4e5305009f1da770c99d3e2e3371ff37c75f3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 27 09:17:40 2007 +0000 + + 2007-07-27 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-private.h: + * glib/test-poppler-glib.c: Make PopplerFontInfo GObject. Patch by + Kouhei Sutou <kou@cozmixng.org>. + + ChangeLog | 8 ++++++++ + glib/poppler-document.cc | 44 + ++++++++++++++++++++++++++++++++++++++++---- + glib/poppler-document.h | 6 +++++- + glib/poppler-private.h | 1 + + glib/test-poppler-glib.c | 2 +- + 5 files changed, 55 insertions(+), 6 deletions(-) + +commit 975c7cff10d9b00359e147329ae2c7a93f8a3833 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 25 17:20:06 2007 +0000 + + micro optimization + + qt4/src/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 525a7f49dd95f2644870a1c59ca15124e30026b4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 24 16:45:25 2007 +0000 + + 2007-07-24 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Annot.cc: + * poppler/Form.cc: Several fixes in forms. Generate appearance for + field buttons that don't have an AP dict. Do not remove the first + character of the second and following lines in multiline text + fields. Fix a crash with pdf documents created by ooo which have + radio buttons. Look for some inheritable attributes in the + parent when needed. + + ChangeLog | 10 +++++++ + poppler/Annot.cc | 27 ++++++++++--------- + poppler/Form.cc | 77 + ++++++++++++++++++++++++++++++++++++++---------------- + 3 files changed, 78 insertions(+), 36 deletions(-) + +commit 633a1cde65f86ee6577a68f4f8d36de43d14c714 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 15 21:03:50 2007 +0000 + + * utils/HtmlOutputDev.cc: + * utils/HtmlOutputDev.h: Create the html files in the + correct place, + not in the invocation dir. Fixes bug #11610 + + ChangeLog | 6 ++++++ + utils/HtmlOutputDev.cc | 37 ++++++++++--------------------------- + utils/HtmlOutputDev.h | 4 ---- + 3 files changed, 16 insertions(+), 31 deletions(-) + +commit ccb2d420ca8d818aa9ba1d64f08f5e94ab313a72 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 15 17:09:29 2007 +0000 + + * poppler/DCTStream.cc + * poppler/DCTStream.h: Implement less evil error handling. On + a + error_exit level error we don't want to actually exit the + program. See + http://bugs.kde.org/show_bug.cgi?id=147878 for a pdf with this + problem. libjpeg was printing "Bogus Huffman table definition" + and + exiting the program. + * poppler/Stream.cc: Remove bogus #warning + + ChangeLog | 10 ++++++++++ + poppler/DCTStream.cc | 17 ++++++++++++++++- + poppler/DCTStream.h | 1 + + poppler/Stream.cc | 1 - + 4 files changed, 27 insertions(+), 2 deletions(-) + +commit f9d82dfd299ae23a1baf3e35e2c3cd351129c525 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jul 14 18:23:42 2007 +0000 + + * utils/pdftops.cc: init width/height to -1 so it is + calculated if not + specified + + ChangeLog | 5 +++++ + utils/pdftops.cc | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 1c04136e9538ccfaa2d6b968861682ca3b69ffb3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 14 15:23:31 2007 +0000 + + 2007-07-14 Pino Toscano <pino@kde.org> + * glib/poppler-action.h: + * glib/poppler-document.h: Remove trailing comma from the last + item of enums. + + ChangeLog | 6 ++++++ + glib/poppler-action.h | 2 +- + glib/poppler-document.h | 8 ++++---- + 3 files changed, 11 insertions(+), 5 deletions(-) + +commit b9b68cabce19a5e23911e5432ace8c13bd237391 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 14 15:15:57 2007 +0000 + + 2007-07-14 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: Make is_password a property instead of + a text form field type, since a text field could be multiline and + password at the same time. + + ChangeLog | 8 ++++++++ + glib/poppler-form-field.cc | 10 ++++++++-- + glib/poppler-form-field.h | 2 +- + glib/test-poppler-glib.c | 4 ++-- + 4 files changed, 19 insertions(+), 5 deletions(-) + +commit 14a8361039d708661b8699b2e7c4496135021a85 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 13 22:18:05 2007 +0000 + + * fofi/FoFiTrueType.cc + * fofi/FoFiTrueType.h + * poppler/CairoFontEngine.cc + * poppler/CharCodeToUnicode.cc + * poppler/CharCodeToUnicode.h + * poppler/GfxFont.cc + * poppler/GfxFont.h + * poppler/SplashOutputDev.cc: Patch by + Koji Otani <sho@bbr.jp> to fix several problems with + Japanese fonts. + Fixes bug 11413 + + ChangeLog | 13 ++ + fofi/FoFiTrueType.cc | 305 + ++++++++++++++++++++++++++++++++++++++++++ + fofi/FoFiTrueType.h | 12 ++ + poppler/CairoFontEngine.cc | 47 ++----- + poppler/CharCodeToUnicode.cc | 16 +++ + poppler/CharCodeToUnicode.h | 1 + + poppler/GfxFont.cc | 230 +++++++++++++++++++++++++++---- + poppler/GfxFont.h | 2 + + poppler/SplashOutputDev.cc | 53 ++------ + 9 files changed, 577 insertions(+), 102 deletions(-) + +commit 8389099d8e8940e3f8920b14a83075d69bcd8e6c +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 13 18:21:02 2007 +0000 + + * poppler/FontInfo.cc: Fix the FontInfoScanner::scan method to + actually scan the number of requested pages + + ChangeLog | 6 ++++++ + poppler/FontInfo.cc | 12 ++++++------ + 2 files changed, 12 insertions(+), 6 deletions(-) + +commit 9ced4442372d08375e0ded62f79052d8a3ec9cd6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 13 18:08:44 2007 +0000 + + * poppler/GlobalParams.cc: Remove dead unused code from + Win32 ifdef + + ChangeLog | 4 ++++ + poppler/GlobalParams.cc | 6 ------ + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit fb89fdb8de608ff94082e16819f042cddabf2bcc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 11 18:52:12 2007 +0000 + + * poppler/PSOutputDev.cc + * poppler/PSOutputDev.h + * utils/pdftohtml.cc: Fix bug 9746. pdftohtml complex mode + had text + twice + + ChangeLog | 7 +++++++ + poppler/PSOutputDev.cc | 5 +++++ + poppler/PSOutputDev.h | 2 ++ + utils/pdftohtml.cc | 3 +-- + 4 files changed, 15 insertions(+), 2 deletions(-) + +commit 0c9fa59bf5edf3cfcca1792da51b904a7c7f7615 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 11 18:30:19 2007 +0000 + + 2007-07-11 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Form.cc: + * poppler/XRef.cc: + * poppler/XRef.h: Fix memory leak. + + ChangeLog | 6 ++++++ + poppler/Form.cc | 49 ++++++++++++++++++++++++------------------------- + poppler/XRef.cc | 22 ++++++++++------------ + poppler/XRef.h | 2 +- + 4 files changed, 41 insertions(+), 38 deletions(-) + +commit 4ae7d43bd54c5b3e2f08c48441f741d3099e228f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 11 18:12:26 2007 +0000 + + * goo/GooVector.h: Rename guard from _VECTOR_H to GOO_VECTOR_H + * goo/gfile.cc: GString -> GooString in Windows code + * poppler/GlobalParams.cc: GString -> GooString in Windows + code + * splash/SplashT1FontEngine.cc + * splash/SplashT1FontEngine.h + * splash/SplashT1FontFile.cc + * splash/SplashT1FontFile.h: T1 code is not supported, + but at least + make it compile :-D + + ChangeLog | 11 +++++++++++ + goo/GooVector.h | 4 ++-- + goo/gfile.cc | 6 +++--- + poppler/GlobalParams.cc | 26 +++++++++++++------------- + splash/SplashFontEngine.cc | 2 +- + splash/SplashT1FontEngine.cc | 8 ++++---- + splash/SplashT1FontEngine.h | 7 +++---- + splash/SplashT1FontFile.cc | 8 +++++--- + splash/SplashT1FontFile.h | 4 ++-- + 9 files changed, 44 insertions(+), 32 deletions(-) + +commit 7bd125ce96c603fd5cf42d7c6a29b542e82dd4ec +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 11 18:08:07 2007 +0000 + + 2007-07-11 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Form.cc: + * poppler/Form.h: + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: Add a method to get the max length + allowed in text form fields. + + ChangeLog | 9 +++++++++ + glib/poppler-form-field.cc | 8 ++++++++ + glib/poppler-form-field.h | 1 + + glib/test-poppler-glib.c | 1 + + poppler/Form.cc | 11 +++++++++++ + poppler/Form.h | 4 ++++ + 6 files changed, 34 insertions(+) + +commit 8a68855735e9d295d71685e82de39204d639ea7a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 9 08:52:58 2007 +0000 + + 2007-07-09 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Annot.cc: + * poppler/Annot.h: Render '*' instead of the actual content in + password form fields. Patch by Julien Rebetez <julien@fhtagn.net> + + ChangeLog | 6 ++++++ + poppler/Annot.cc | 52 + +++++++++++++++++++++++++++++----------------------- + poppler/Annot.h | 5 +++-- + 3 files changed, 38 insertions(+), 25 deletions(-) + +commit 53cf7d7084dc03a28239f11c94f2095bb02d6108 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 7 16:23:56 2007 +0000 + + 2007-07-07 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Form.cc: + * poppler/Form.h: + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: Add a method to get the type of a Form + Field Button. + + ChangeLog | 9 +++++++++ + glib/poppler-form-field.cc | 18 ++++++++++++++++++ + glib/poppler-form-field.h | 8 ++++++++ + glib/test-poppler-glib.c | 26 +++++++++++++++++++++++--- + poppler/Form.cc | 5 +++++ + poppler/Form.h | 2 ++ + 6 files changed, 65 insertions(+), 3 deletions(-) + +commit de0a40181e5832a0dc263d40ed0a269867764623 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jul 7 15:28:29 2007 +0000 + + 2007-07-07 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Form.cc: Fix a crash when setting state on buttons that + don't have state. + + ChangeLog | 5 +++++ + poppler/Form.cc | 3 +++ + 2 files changed, 8 insertions(+) + +commit a33518a3283ff25aa5517bc535ddb61383b1cfdc +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 6 09:08:44 2007 +0000 + + * poppler/Form.cc: Fix a bug with FormField's destructor + which was not + checking if the FormField is terminal to determine wether + it needs to + delete children or widgets. Patch by + Julien Rebetez <julien@fhtagn.net> + + ChangeLog | 4 ++++ + poppler/Form.cc | 17 +++++++++++------ + 2 files changed, 15 insertions(+), 6 deletions(-) + +commit 43f0d5b9bb198cdcbc2f7111f294c6f947105314 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 6 08:47:11 2007 +0000 + + * goo/GooString.cc: + * poppler/ABWOutputDev.cc: Build on Sun Force compiler, + patch by + Darren Kenny <darren.kenny@sun.com> + + ChangeLog | 6 ++++++ + goo/GooString.cc | 2 +- + poppler/ABWOutputDev.cc | 4 +++- + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 4e7405071b69889362e4d49de3f881f0e3e261e3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 5 13:04:01 2007 +0000 + + 2007-07-05 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: Allow to set NULL in form fields + that can contain text. + + ChangeLog | 5 +++++ + glib/poppler-form-field.cc | 30 ++++++++++++------------------ + 2 files changed, 17 insertions(+), 18 deletions(-) + +commit 625510797c528257527003477fe28adbacfe80e7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 5 08:13:51 2007 +0000 + + 2007-07-05 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-attachment.cc: + * glib/poppler-attachment.h: + * glib/test-poppler-glib.c: Rename cdate and mdate again to ctime + and mtime, since they are public attributes and we don't want to + break the API. + + ChangeLog | 8 ++++++++ + glib/poppler-attachment.cc | 4 ++-- + glib/poppler-attachment.h | 4 ++-- + glib/test-poppler-glib.c | 4 ++-- + 4 files changed, 14 insertions(+), 6 deletions(-) + +commit 9b2640f156f24b07c797d9461f84e64d550efa1a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 4 13:57:31 2007 +0000 + + * qt4/src/poppler-form.cc: QStringToGooString -> + QStringToUnicodeGooString has FormWidgetText::setContent + wants to have + the unicode formated string + * qt4/src/poppler-private.h: create QStringToUnicodeGooString + + ChangeLog | 7 +++++++ + qt4/src/poppler-form.cc | 2 +- + qt4/src/poppler-private.h | 15 +++++++++++++++ + 3 files changed, 23 insertions(+), 1 deletion(-) + +commit b70115cf979b29f75c644518ae0e9c0dd9892ebf +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 4 13:06:38 2007 +0000 + + 2007-07-04 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: Convert strings from UTF8 to UTF16BE + before setting them. + + ChangeLog | 5 +++++ + glib/poppler-form-field.cc | 34 ++++++++++++++++++++++++---------- + 2 files changed, 29 insertions(+), 10 deletions(-) + +commit d37843877a6f93a9f27502d07ad82cba79e9aa73 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Jul 4 08:26:52 2007 +0000 + + 2007-07-04 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-attachment.cc: + * glib/poppler-attachment.h: Add size, creation and modification + date and checksum properties to attachments. Fix memory leaks. + * glib/test-poppler-glib.c: + * glib/poppler.h: + * glib/poppler-private.h: + * glib/poppler-document.cc: Add a function to convert a pdf date + into a GTime that is used by attachments and document + properties. Fix memory leak in attachments. + + ChangeLog | 12 ++++ + glib/poppler-attachment.cc | 25 +++++++- + glib/poppler-attachment.h | 16 ++--- + glib/poppler-document.cc | 142 + +++++++++++++++++++++++--------------------- + glib/poppler-private.h | 6 +- + glib/poppler.h | 1 + + glib/test-poppler-glib.c | 56 ++++++++++++++--- + 7 files changed, 171 insertions(+), 87 deletions(-) + +commit d933f47d4af0992059148259a189373b42499bbe +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 3 20:31:20 2007 +0000 + + * qt4/tests/poppler-fonts.cpp: For the sake of completeness, + add all + the enums + + ChangeLog | 2 ++ + qt4/tests/poppler-fonts.cpp | 28 ++++++++++++++++++++-------- + 2 files changed, 22 insertions(+), 8 deletions(-) + +commit d90b166cfbdc4857351baa627d158d5e0b6652b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 3 16:46:51 2007 +0000 + + * poppler/Catalog.cc: Fix crash, + embeddedFileNameTree.getName(i) + returns a reference to its own data so does not have to + be deleted + * qt4/tests/poppler-attachments.cpp: Delete the doc, just + for sake of + correctness + + ChangeLog | 7 +++++++ + poppler/Catalog.cc | 1 - + qt4/tests/poppler-attachments.cpp | 1 + + 3 files changed, 8 insertions(+), 1 deletion(-) + +commit 7fa87eb2b093770271bc3a72de5b0b9dc228aa1b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 3 14:01:40 2007 +0000 + + 2007-07-03 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: Add choice_commit_on_change function + to glib bindings. + + ChangeLog | 7 +++++++ + glib/poppler-form-field.cc | 8 ++++++++ + glib/poppler-form-field.h | 1 + + glib/test-poppler-glib.c | 2 ++ + 4 files changed, 18 insertions(+) + +commit 8b67e0403f6eaab6770cc0b7861074ae0b6d85bb +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 3 13:49:18 2007 +0000 + + 2007-07-03 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: Fix a typo. + + ChangeLog | 6 ++++++ + glib/poppler-form-field.cc | 2 +- + glib/poppler-form-field.h | 2 +- + glib/test-poppler-glib.c | 2 +- + 4 files changed, 9 insertions(+), 3 deletions(-) + +commit 33a5765eb404a4b321b09c26af74c1ed64a5d474 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 3 13:22:54 2007 +0000 + + * poppler/Catalog.cc: + * poppler/Catalog.h: Add size and checksum properties to + the embeded + files + * qt4/src/poppler-embeddedfile.cc: + * qt4/src/poppler-qt4.h: Add size and checksum properties + to the qt4 + frontend + + ChangeLog | 9 +++++++++ + poppler/Catalog.cc | 19 ++++++++++++++++--- + poppler/Catalog.h | 13 +++++++++++-- + qt4/src/poppler-embeddedfile.cc | 16 ++++++++++++++++ + qt4/src/poppler-qt4.h | 14 ++++++++++++++ + 5 files changed, 66 insertions(+), 5 deletions(-) + +commit c7d21f9354bbe090cce6459124dcaadf1e46639e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 2 13:39:32 2007 +0000 + + 2007-07-02 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: + Use FILE_SELECT instead of FILESELECT and fix a typo. Patch by + Kouhei Sutou + + ChangeLog | 9 +++++++++ + glib/poppler-form-field.cc | 2 +- + glib/poppler-form-field.h | 2 +- + glib/test-poppler-glib.c | 2 +- + 4 files changed, 12 insertions(+), 3 deletions(-) + +commit 5e301064c62c6d58f488839d7bf804af912a3de1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 2 13:34:26 2007 +0000 + + 2007-07-02 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/test-poppler-glib.c: + Add poppler_form_field_is_read_only to glib bindings. Patch by + Kouhei Sutou + + ChangeLog | 9 +++++++++ + glib/poppler-form-field.cc | 8 ++++++++ + glib/poppler-form-field.h | 1 + + glib/test-poppler-glib.c | 6 +++++- + 4 files changed, 23 insertions(+), 1 deletion(-) + +commit 11875746ce28e8999bcad46167fcfea131cd267a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 30 08:33:30 2007 +0000 + + 2007-06-30 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-page.cc: Use poppler_page_transition_get_type + instead of poppler_page_transition which doesn't exist. Patch by + Kouhei Sutou + + ChangeLog | 6 ++++++ + glib/poppler-page.cc | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 0a5acaae3b9bfcd731bc4e072f35f9433aa773da +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 30 08:25:15 2007 +0000 + + 2007-06-30 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/Makefile.am: + * glib/poppler-form-field.cc: + * glib/poppler-form-field.h: + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * glib/poppler.h: + * glib/test-poppler-glib.c: Improve forms API in the glib bindings + in order to make it more consistent with the current API and + easier to use. + + ChangeLog | 15 +++ + glib/Makefile.am | 2 + + glib/poppler-document.cc | 197 ++------------------------- + glib/poppler-document.h | 55 +------- + glib/poppler-form-field.cc | 316 + ++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-form-field.h | 96 ++++++++++++++ + glib/poppler-page.cc | 210 ++++++++++++----------------- + glib/poppler-page.h | 55 ++------ + glib/poppler-private.h | 11 +- + glib/poppler.h | 40 +++--- + glib/test-poppler-glib.c | 119 ++++++++++++++--- + 11 files changed, 662 insertions(+), 454 deletions(-) + +commit 2212874e57a6eb9db733b2e9a98f0cfcb88a8fc1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 26 21:31:07 2007 +0000 + + * poppler/Form.cc: Don't crash on documents with AcroForm + but no + AcroForm->Fields (it's mandatory but...) + + ChangeLog | 5 +++++ + poppler/Form.cc | 54 + +++++++++++++++++++++++++++++------------------------- + 2 files changed, 34 insertions(+), 25 deletions(-) + +commit e48ee9c4af6bf98b6988c51dcab9ee9ef6e3cafe +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 23 18:06:07 2007 +0000 + + 2007-06-23 Carlos Garcia Campos <carlosgc@gnome.org> + * poppler/Annot.cc: + * poppler/Form.cc: Fix memory leaks. + + ChangeLog | 5 +++++ + poppler/Annot.cc | 2 +- + poppler/Form.cc | 13 +++++++++---- + 3 files changed, 15 insertions(+), 5 deletions(-) + +commit d874a2753e3ac51b6f539dfdf980435c8c381b4f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 20 20:07:15 2007 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-document.cc: Allow access to a document's + metadata contents + from the qt4 binding. Based on patch by Jason Kivlighn + * qt4/tests/test-poppler-qt4.cpp: Print metadata if it exists + + ChangeLog | 5 +++++ + qt4/src/poppler-document.cc | 13 +++++++++++++ + qt4/src/poppler-qt4.h | 5 +++++ + qt4/tests/test-poppler-qt4.cpp | 1 + + 4 files changed, 24 insertions(+) + +commit 08d4c437e735ac50a340c4ae17ee0eeccd00dc20 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 20 18:40:03 2007 +0000 + + * glib/poppler-document.cc: Allow access to a document's + metadata stream + through the glib binding. Patch by Jason Kivlighn + <jkivlighn@gmail.com> Approved by Carlos + + ChangeLog | 6 ++++++ + glib/poppler-document.cc | 21 +++++++++++++++++++++ + 2 files changed, 27 insertions(+) + +commit cdd2a49dc99aa16ded674c58dbb50298f06cf18a +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 15 18:15:53 2007 +0000 + + * poppler/ABWOutputDev.cc: Replaces the getBiggestSeperator + function + at the ABWoutputdev with one that is easier to read/debug + and less likely to contain bugs. Some cosmetic fixes at the + functions recursiveXYC and splitnodes. Patch by + Jauco Noordzij <jauco.noordzij@gmail.com>. More info at + bug #11273 + + ChangeLog | 8 + + poppler/ABWOutputDev.cc | 384 + ++++++++++++----------------------------------- + 2 files changed, 106 insertions(+), 286 deletions(-) + +commit 7f23383197b0e2fa24be7b4925ea6f39eb95bbc1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 13 20:39:21 2007 +0000 + + * poppler/ABWOutputDev.cc + * poppler/ABWOutputDev.h: Remove dependency on debugxml. Patch + by + Jauco Noordzij <jauco.noordzij@gmail.com>. Fixes bug #11187 + + ChangeLog | 6 ++++ + poppler/ABWOutputDev.cc | 80 + ++++++++++++++++++++++++++++++++++++++++++++++- + poppler/ABWOutputDev.h | 1 + + 3 files changed, 86 insertions(+), 1 deletion(-) + +commit 948520cd529ce47d1970aae6a0b8058128e37c30 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 13 18:50:40 2007 +0000 + + * goo/FixedPoint.h + * goo/gmem.h + * poppler/SecurityHandler.h + * poppler/poppler-config.h.in + * utils/ImageOutputDev.h: + Patch by Axel Howind <Axel.Howind@htp-tel.de> + - include USE_EXCEPTIONS and USE_FIXEDPOINT in + poppler-config.h.in + - fix typo (MULTITHREADED/MULTITHREADING) in + poppler.config.h.in + - change installed headers to include poppler-config.h + instead of + config.h + - use <poppler/poppler-config.h> instead of <poppler-config.h> + so that + installed headers can be used without including + .../include/poppler + in the include path + + ChangeLog | 16 ++++++++++++++++ + goo/FixedPoint.h | 2 +- + goo/gmem.h | 2 +- + poppler/SecurityHandler.h | 2 +- + poppler/poppler-config.h.in | 12 +++++++++++- + utils/ImageOutputDev.h | 2 +- + 6 files changed, 31 insertions(+), 5 deletions(-) + +commit 825461e47b05595805e87a0d2960b07197c8da8b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 13 18:24:56 2007 +0000 + + configure.ac: Fix detection of glib + + ChangeLog | 4 ++++ + configure.ac | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit a67a93fc6b4812a4f892b311c5b299e59283cd47 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 11 21:14:22 2007 +0000 + + * poppler/CMap.h: + * poppler/CharCodeToUnicode.h: + * poppler/GlobalParams.h: + * poppler/PageLabelInfo.h: + * poppler/UnicodeMap.h: Further include cleanup. Patch by + Axel Howind + on bug #11228 + + ChangeLog | 9 +++++++++ + poppler/CMap.h | 2 +- + poppler/CharCodeToUnicode.h | 2 +- + poppler/GlobalParams.h | 2 +- + poppler/PageLabelInfo.h | 6 +++--- + poppler/UnicodeMap.h | 2 +- + 6 files changed, 16 insertions(+), 7 deletions(-) + +commit 051b31af053cac4727718169b79b25451a4bdd95 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 11 21:11:05 2007 +0000 + + * qt/poppler-qt.h + * qt4/src/poppler-qt4.h: Headers cleanup + + ChangeLog | 5 +++++ + qt/poppler-qt.h | 6 +++--- + qt4/src/poppler-qt4.h | 8 ++++---- + 3 files changed, 12 insertions(+), 7 deletions(-) + +commit 3e1597b80fc6750f1ec3269f9819aa8225879524 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 8 22:39:23 2007 +0000 + + poppler/Annot.cc: Fix leak + + ChangeLog | 4 ++++ + poppler/Annot.cc | 1 + + 2 files changed, 5 insertions(+) + +commit 49535c20b4f71d1c1381134233e2e1449cf560c0 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Jun 7 21:23:03 2007 +0000 + + 2007-06-07 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/ABWOutputDev.cc: Change "and", "or", "not" to "&&", + "||", + "!" for consistency with the rest of the code. Patch by Jens + Granseuer + + ChangeLog | 5 +++ + poppler/ABWOutputDev.cc | 93 + ++++++++++++++++++++++++----------------------- + 2 files changed, 52 insertions(+), 46 deletions(-) + +commit dd8fa975bf51dd18120369d0ef2d8f1781e04d93 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 2 09:18:11 2007 +0000 + + correct form of patch 11102 + + utils/HtmlFonts.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit cdf70857ece0748f13b11c923ccf9626094555b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 1 18:34:48 2007 +0000 + + * poppler/ArthurOutputDev.cc + * splash/SplashFTFont.cc + * splash/SplashMath.h: Make it compile with + --enable-fixedpoint. Fixes + bug 11110 + + ChangeLog | 7 +++++++ + poppler/ArthurOutputDev.cc | 8 ++++---- + splash/SplashFTFont.cc | 8 ++++---- + splash/SplashMath.h | 2 +- + 4 files changed, 16 insertions(+), 9 deletions(-) + +commit 90b1a404629a884cc32737a3a729c9a75f7a59c1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 30 18:33:24 2007 +0000 + + * configure.ac: Fix to check for glib-2.0 not glib that is + 1.0. Patch + came though Pardus developers and they don't remember where + they got + it from. + + ChangeLog | 6 ++++++ + configure.ac | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 03d766ea1ddd4ce6d938f96b53906a7dc8bd179a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 30 18:29:57 2007 +0000 + + make dist needs this + + qt4/src/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit d540c04268047fdd125ad932ca05c7553a97c0fe +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 30 17:50:00 2007 +0000 + + * utils/HtmlFonts.cc: Make pdftohtml not pollute stdout. Patch + by + Nanning Buitenhuis <nanning@elvenkind.com> + + And some changes in glib/reference/tmpl + + ChangeLog | 5 + + glib/reference/tmpl/poppler-document.sgml | 4 + + glib/reference/tmpl/poppler-enums.sgml | 150 + +++++++++++++++++++++++++++++ + glib/reference/tmpl/poppler-page.sgml | 5 +- + glib/reference/tmpl/poppler-unused.sgml | 130 + ------------------------- + utils/HtmlFonts.cc | 2 +- + 6 files changed, 162 insertions(+), 134 deletions(-) + +commit ce414f2a36f4d97a3bddfd42baabdc1e34bf9321 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 29 22:01:58 2007 +0000 + + 2007-05-29 Kristian Høgsberg <krh@redhat.com> + + * poppler/gen-unicode-tables.py: Add this script to fix distcheck. + + ChangeLog | 4 ++++ + poppler/gen-unicode-tables.py | 38 + ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 42 insertions(+) + +commit 97e602752b05f3690acb1821bdca31c5771361e1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 27 11:24:40 2007 +0000 + + 2007-05-27 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/test-poppler-glib.c: Add forms test + * glib/poppler-page.cc: + * glib/poppler-page.h: + Fix indentation, some code cleanups and memory leaks. + + ChangeLog | 7 ++ + glib/poppler-page.cc | 198 + ++++++++++++++++++++++++++++------------------ + glib/poppler-page.h | 6 +- + glib/test-poppler-glib.c | 39 +++++++++ + 4 files changed, 168 insertions(+), 82 deletions(-) + +commit 3d31c2b1ea913fc80211f1c6fed9b3666f124049 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 27 10:12:56 2007 +0000 + + 2007-05-27 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-page.cc: + * glib/poppler-page.h: + Add missing image mapping type definition. + + ChangeLog | 6 ++++++ + glib/poppler-page.cc | 48 + +++++++++++++++++++++++++++++++++++++++++++++--- + glib/poppler-page.h | 5 +++++ + 3 files changed, 56 insertions(+), 3 deletions(-) + +commit 8284a769568322066a9d4626bd9b2cf3d18a6487 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 26 23:20:12 2007 +0000 + + * configure.ac: + * NEWS: Bump release to 0.5.9 (0.6 Release Candidate) + + ChangeLog | 2 ++ + NEWS | 15 +++++++++++++++ + configure.ac | 2 +- + 3 files changed, 18 insertions(+), 1 deletion(-) + +commit e6ff9e0d95e058f6aff3c72d5f4d7d7ccf661999 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 26 22:33:21 2007 +0000 + + * poppler-qt.pc.in: + * poppler-qt4.pc.in: + * qt/Makefile.am: + * qt4/src/Makefile.am: Install qt3 and qt4 headers in + separate dirs. + That way be can reuse poppler-page-transition.h and distros + don't get + conflicts when making separate qt3 and qt4 packages + + ChangeLog | 9 +++++++++ + poppler-qt.pc.in | 2 +- + poppler-qt4.pc.in | 2 +- + qt/Makefile.am | 2 +- + qt4/src/Makefile.am | 2 +- + 5 files changed, 13 insertions(+), 4 deletions(-) + +commit fefefe495a182c1745314186b99441b9e76ba5b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 25 23:17:58 2007 +0000 + + * qt4/src/poppler-link-extractor-private.cc: + * qt4/src/poppler-link-extractor-private.h: + * qt4/src/poppler-link.cc: + * qt4/src/poppler-link.h: Return link coordinates in 0..1 + range + instead of 0..size, much more easier to do user<->dev + transformations + * qt4/src/poppler-private.h: Fix indentation + + ChangeLog | 6 ++++++ + qt4/src/poppler-link-extractor-private.h | 1 + + qt4/src/poppler-link-extractor.cc | 12 ++++++------ + qt4/src/poppler-link.cc | 25 +++++++++++++++---------- + qt4/src/poppler-link.h | 7 ++++++- + qt4/src/poppler-private.h | 15 ++++++++------- + 6 files changed, 42 insertions(+), 24 deletions(-) + +commit ecaeaa9512d1dae4a036703ea8739102a8e463f0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 25 22:30:20 2007 +0000 + + * qt4/src/poppler-link-extractor.cc: Use correct page box + to extract + link clickable area + + ChangeLog | 5 +++++ + qt4/src/poppler-link-extractor.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 774a9456c668ef70b2e8f17d59f8f427aa97bad5 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Fri May 25 18:43:04 2007 +0000 + + 2007-05-25 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GfxFont.cc: + * poppler/GfxFont.h: + * poppler/GlobalParams.cc: + Don't cache DisplayFontParams by font name, instead cache them + in GfxFont. Fixes #8140. + + ChangeLog | 8 ++++++++ + poppler/GfxFont.cc | 2 ++ + poppler/GfxFont.h | 6 ++++++ + poppler/GlobalParams.cc | 4 ++-- + 4 files changed, 18 insertions(+), 2 deletions(-) + +commit a88fadf0bb9af55c83c9c4f7d08deb17d6aa9ae4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri May 25 17:33:37 2007 +0000 + + 2007-05-25 Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler.h: + Add selection style parameter to render_selection in order + to allow + requesting selections of words and paragraphs. + + ChangeLog | 8 ++++++++ + glib/poppler-page.cc | 30 ++++++++++++++++-------------- + glib/poppler-page.h | 6 ++++-- + glib/poppler.h | 7 +++++++ + 4 files changed, 35 insertions(+), 16 deletions(-) + +commit bf195b489c22875695e202d6ca6659144ef57e61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 23 21:20:58 2007 +0000 + + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: + Better handle the setting of the vector antialiasing for + Splash. + * qt4/src/Mainpage.dox: + * qt4/src/poppler-link.h: + * qt4/src/poppler-qt4.h: + A few of API documentation fixes and improvements. + + ChangeLog | 10 ++++++++ + qt4/src/Mainpage.dox | 8 ++---- + qt4/src/poppler-document.cc | 5 ++-- + qt4/src/poppler-link.h | 4 ++- + qt4/src/poppler-private.h | 1 + + qt4/src/poppler-qt4.h | 57 + ++++++++++++++++++++++++++++--------------- + 6 files changed, 57 insertions(+), 28 deletions(-) + +commit 36d1fe292778ba29990a389c50a0df0d51f11913 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 21 21:42:38 2007 +0000 + + Fix assert in bug 11023 + + ChangeLog | 4 ++++ + glib/poppler-action.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 5b411246a2cce6ed3bb2d8c9e9d856227b6aba7f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 21 21:39:08 2007 +0000 + + * glib/poppler-page.cc: + * glib/poppler-page.h: + poppler_page_render_section() for cairo. Bug 7023 + + ChangeLog | 6 ++++ + glib/poppler-page.cc | 88 + ++++++++++++++++++++++++++++++++++++++++++++------ + glib/poppler-page.h | 9 ++++++ + 3 files changed, 93 insertions(+), 10 deletions(-) + +commit 409f2a9cb31add29accb87011331c50dc08110cd +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 21 21:35:10 2007 +0000 + + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * glib/poppler.h: + * glib/test-poppler-glib.c: + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Extend CairoOutputdev to do + image caching when rendering + + ChangeLog | 11 +++ + glib/poppler-page.cc | 161 +++++++++++++++++++++++++++++++-- + glib/poppler-page.h | 10 +++ + glib/poppler-private.h | 3 + + glib/poppler.h | 9 +- + glib/test-poppler-glib.c | 27 +++++- + poppler/CairoOutputDev.cc | 215 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 122 +++++++++++++++++++++++++ + 8 files changed, 545 insertions(+), 13 deletions(-) + +commit afd11ec66430dae084b5a5560333e933460fc637 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 21 21:29:09 2007 +0000 + + * poppler/Annot.cc: avoid crashing if the font for the + drawing methods + can not be found + * poppler/Form.cc: fix memory leak + * qt4/src/poppler-private.h: fix the UnicodeParsedString + function to + really work and not crash + * splash/SplashTypes.h: RGB8X mode makes max number of + components in + any SplashColor always be 4 + + ChangeLog | 11 +++++++++++ + poppler/Annot.cc | 6 ++++++ + poppler/Form.cc | 1 + + qt4/src/poppler-private.h | 5 ++++- + splash/SplashTypes.h | 6 +----- + 5 files changed, 23 insertions(+), 6 deletions(-) + +commit f019c8a8efde004e1663ea88cb48c0e46318d936 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 17 21:32:57 2007 +0000 + + 2007-05-17 Pino Toscano <pino@kde.org> + + * qt4/src/poppler-link.cc: + Give some default values to LinkDestination + * qt4/src/poppler-private.h: + Fix memory leak when converting QString -> GooString + + ChangeLog | 7 +++++++ + qt4/src/poppler-link.cc | 12 ++++++++++++ + qt4/src/poppler-private.h | 4 +++- + 3 files changed, 22 insertions(+), 1 deletion(-) + +commit d68a4eb44b5390b3093774f39a6805ad2e95c146 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun May 13 00:53:43 2007 +0000 + + 2007-05-12 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Annot.cc: Only do appearance generation for text, + choice or + other fields that contain text. Patch by Julien Rebetez. + + ChangeLog | 5 +++++ + poppler/Annot.cc | 52 + ++++++++++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 51 insertions(+), 6 deletions(-) + +commit 96f8731e90af1abce67d00a3febc11880c69ce62 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 7 18:41:09 2007 +0000 + + * Catalog.cc: Fix leak + * Form.cc: Fix leak, provide empty + FormPageWidgets::~FormPageWidgets + implementation + * Page.cc: Fix leak + + ChangeLog | 7 +++++++ + poppler/Catalog.cc | 1 + + poppler/Form.cc | 5 +++++ + poppler/Page.cc | 1 + + 4 files changed, 14 insertions(+) + +commit d46553d696b2d7fe416ce8db40db54dd1d7c6733 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 30 22:34:21 2007 +0000 + + * poppler/Makefile.am: Don't link cairo to all poppler, + just to + poppler_cairo so when compiling the qt frontend and the + glib frontend + the qt one does not end up depending on cairo + + ChangeLog | 6 ++++++ + poppler/Makefile.am | 1 - + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit d5c52409c532a126bcb8eb65f6f1390113a5f258 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 29 17:37:38 2007 +0000 + + jeff committed this line by mistake + + ChangeLog | 1 - + 1 file changed, 1 deletion(-) + +commit 6ddc11ef4c534369ee104422bfb989603c466790 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 29 17:33:58 2007 +0000 + + 2007-04-29 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/UnicodeTypeTable.cc: Make some of the unicode tables + const + which gets rid of about 20k of data. + + text data bss dec hex filename + before: 1415838 128864 8 1544710 179206 libpoppler.so + after: 1404574 140128 8 1544710 179206 libpoppler.so + + ChangeLog | 10 ++++++++++ + poppler/UnicodeTypeTable.cc | 24 ++++++++++++------------ + 2 files changed, 22 insertions(+), 12 deletions(-) + +commit c5613ab5ce65fc84eb3a5584cee1454171173fa7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 23:25:59 2007 +0000 + + * poppler/SplashOutputDev.cc: + * qt/poppler-private.h: + * qt4/src/poppler-private.h: + * splash/Splash.cc: + * splash/SplashBitmap.cc: + * splash/SplashTypes.h: Rename splashModeRGBX8 to + splashModeXBGR8 and + hopefully fix qt frontends image generation + + ChangeLog | 10 +++++ + poppler/SplashOutputDev.cc | 102 + ++++++++++++++++++++++++++++++++------------ + qt/poppler-private.h | 2 +- + qt4/src/poppler-private.h | 2 +- + splash/Splash.cc | 44 ++++++++++--------- + splash/SplashBitmap.cc | 16 +++---- + splash/SplashTypes.h | 4 +- + 7 files changed, 120 insertions(+), 60 deletions(-) + +commit 6479ce224f1393235ca9888dfe0710327fbfccd2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 22:12:22 2007 +0000 + + fix merging problems + + splash/Splash.cc | 1 + + splash/SplashBitmap.cc | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit e2ac4ada3e29139053871ff7f53772e1ccc7adc0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 15:39:36 2007 +0000 + + \n at the end of the printf + Although i'm not sure we want to printf this... + + poppler/GlobalParams.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b8133940638c95940edcb9b98126ca9a4f7b8d4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 12:00:38 2007 +0000 + + * qt4/src/Makefile.am: + * qt4/src/poppler-document.cc: + * qt4/src/poppler-ps-converter.cc: + * qt4/src/poppler-qt4.h: Replace Document::print function + with lots of + arguments with a helper class with lots of functions. Will + help + mantaining BC in case we decide to add more functionality + to the + printing process. + + ChangeLog | 10 +++ + qt4/src/Makefile.am | 1 + + qt4/src/poppler-document.cc | 39 ++------ + qt4/src/poppler-ps-converter.cc | 190 + +++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 119 ++++++++++++++++++++---- + 5 files changed, 307 insertions(+), 52 deletions(-) + +commit 26d5fefcd4c858e2ebd689d963a65773957ac808 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 11:35:34 2007 +0000 + + * qt4/src/poppler-page.cc: + Hopefully fix the calculation of the image size when rendering + using + ArthurOutputDev. + + ChangeLog | 6 ++++++ + qt4/src/poppler-page.cc | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 218364bc4951682de8e63e1bd3f061636b08b615 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 11:34:14 2007 +0000 + + * glib/poppler-document.h: + * poppler/FontInfo.h: + * qt/poppler-qt.h: + * qt4/src/poppler-qt4.h: GfxFontType changed, adapt enums + of the + frontends and helper classes. Forgot to do it before merging. + + ChangeLog | 8 ++++++++ + glib/poppler-document.h | 6 +++++- + poppler/FontInfo.h | 6 +++++- + qt/poppler-qt.h | 6 +++++- + qt4/src/poppler-qt4.h | 20 ++++++++++++-------- + 5 files changed, 35 insertions(+), 11 deletions(-) + +commit c1a40d3b4e9b27e34c94c9477a0313534563a394 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 11:20:58 2007 +0000 + + * qt4/src/poppler-annotation.h: + Make the header clean. + + ChangeLog | 5 +++++ + qt4/src/poppler-annotation.h | 3 +++ + 2 files changed, 8 insertions(+) + +commit 3f4bf880b95e28a1ae7a38b18b341e089860780c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 28 11:16:49 2007 +0000 + + * qt4/src/Makefile.am: + * qt4/src/poppler-link-extractor-private.h: + * qt4/src/poppler-link-extractor.cc: + * qt4/src/poppler-page-private.h: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: + Getting the links of a page now is not more dependant on + the current + output device, and can be done anytime; thus, the doLinks + parameter + of the Page::render() can be dropped. + + ChangeLog | 13 ++++++ + qt4/src/Makefile.am | 3 +- + qt4/src/poppler-link-extractor-private.h | 55 ++++++++++++++++++++++ + qt4/src/poppler-link-extractor.cc | 74 + ++++++++++++++++++++++++++++++ + qt4/src/poppler-page-private.h | 38 +++++++++++++++ + qt4/src/poppler-page.cc | 52 ++++----------------- + qt4/src/poppler-private.h | 5 +- + qt4/src/poppler-qt4.h | 4 +- + 8 files changed, 195 insertions(+), 49 deletions(-) + +commit 7f9eec9ef4e7dc895d2a3e38014b6368cc7564b6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 27 22:41:10 2007 +0000 + + 2007-04-28 Albert Astals Cid <aacid@kde.org> + + * qt4/*: Stop requyring users to declare UNSTABLE_POPPLER_QT4 + + ChangeLog | 4 ++++ + qt4/src/Doxyfile | 2 +- + qt4/src/Mainpage.dox | 3 +-- + qt4/src/poppler-document.cc | 2 -- + qt4/src/poppler-embeddedfile.cc | 2 -- + qt4/src/poppler-fontinfo.cc | 2 -- + qt4/src/poppler-form.cc | 1 - + qt4/src/poppler-link.cc | 2 -- + qt4/src/poppler-page.cc | 1 - + qt4/src/poppler-qt4.h | 3 --- + qt4/src/poppler-sound.cc | 2 -- + qt4/src/poppler-textbox.cc | 2 -- + qt4/tests/check_attachments.cpp | 1 - + qt4/tests/check_dateConversion.cpp | 1 - + qt4/tests/check_fonts.cpp | 1 - + qt4/tests/check_metadata.cpp | 1 - + qt4/tests/check_pagelayout.cpp | 1 - + qt4/tests/check_pagemode.cpp | 1 - + qt4/tests/check_permissions.cpp | 1 - + qt4/tests/poppler-attachments.cpp | 1 - + qt4/tests/poppler-fonts.cpp | 1 - + qt4/tests/stress-poppler-qt4.cpp | 1 - + qt4/tests/test-password-qt4.cpp | 1 - + qt4/tests/test-poppler-qt4.cpp | 1 - + 24 files changed, 6 insertions(+), 32 deletions(-) + +commit 45993a6faafd7646075bc6630d5d2ad7a44f7e20 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 27 22:26:09 2007 +0000 + + 2007-04-28 Carlos Garcia Campos <carlosgc@gnome.org> + reviewed and some code by: Albert Astals Cid <aacid@kde.org> + + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler.h: + * glib/test-poppler-glib.c: + * poppler/Makefile.am: + * poppler/PageTransition.cc: + * poppler/PageTransition.h: + * qt/poppler-page-transition.cc: + * qt/poppler-page-transition.h: Move Page Transition parsing + from qt + frontends to poppler core. Expose Page transitions on the glib + frontend. + + ChangeLog | 15 ++++ + glib/poppler-page.cc | 122 +++++++++++++++++++++++++ + glib/poppler-page.h | 111 +++++++++++++---------- + glib/poppler.h | 58 ++++++++---- + glib/test-poppler-glib.c | 60 +++++++++++++ + poppler/Makefile.am | 2 + + poppler/PageTransition.cc | 197 + +++++++++++++++-------------------------- + poppler/PageTransition.h | 86 ++++++++++++++++++ + qt/poppler-page-transition.cc | 145 ++++++------------------------ + qt/poppler-page-transition.h | 9 +- + 10 files changed, 497 insertions(+), 308 deletions(-) + +commit 877d6b202a75eb12119b16e740f85cc8b477d589 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 27 21:25:30 2007 +0000 + + * glib/poppler-page.cc: + * poppler/PSOutputDev.cc: + * poppler/PSOutputDev.h: + * qt/poppler-document.cc: + * qt4/src/poppler-document.cc: + * qt4/src/poppler-qt4.h: + * utils/pdftohtml.cc: + * utils/pdftops.cc: + Add option to force rasterizing the pages when printing them + Add functionality to output the title field on the PS file + Only Qt4 frontend exposes the functionality + + Bringing this features from KPDF 3.5.7 to poppler + Testers welcome + Patches for other frontends more than welcome + Comments and suggestions even more than welcome :-) + + ChangeLog | 14 +++++++++++++ + glib/poppler-page.cc | 3 ++- + poppler/PSOutputDev.cc | 48 + +++++++++++++++++++++++++++++-------------- + poppler/PSOutputDev.h | 17 +++++++++------ + qt/poppler-document.cc | 2 +- + qt4/src/poppler-document.cc | 9 ++++++-- + qt4/src/poppler-qt4.h | 2 +- + utils/pdftohtml.cc | 2 +- + utils/pdftops.cc | 2 +- + 9 files changed, 71 insertions(+), 28 deletions(-) + +commit 99053be5357235c47a87775985646ef8d9880ed9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 26 17:57:01 2007 +0000 + + * goo/Makefile.am: Remove duplicate gmem.h + + ChangeLog | 4 ++++ + goo/Makefile.am | 1 - + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit f6adb46cd88d23b34f1918d3be31c05b68b6a443 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 25 21:31:17 2007 +0000 + + ignore pdftoabw binary + + utils/.cvsignore | 1 + + 1 file changed, 1 insertion(+) + +commit e09f231ac6c03ac2c3606f1bf20ba1bde3d85abd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 25 21:25:06 2007 +0000 + + 2007-04-25 Albert Astals Cid <aacid@kde.org> + + * qt4/src/poppler-document.cc: remove a delete[] no longer + needed + * qt4/src/poppler-private: initilize m_hints + + ChangeLog | 5 +++++ + qt4/src/poppler-document.cc | 1 - + qt4/src/poppler-private.h | 1 + + 3 files changed, 6 insertions(+), 1 deletion(-) + +commit bf7e0e980bf29994021cb1228f89f582adddf284 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 25 19:59:09 2007 +0000 + + Merge xpdf302branch in HEAD as noone vetoed it. + Testing more than welcome + + ChangeLog | 140 + + configure.ac | 4 + + fofi/FoFiTrueType.cc | 458 +++- + fofi/FoFiTrueType.h | 42 +- + fofi/FoFiType1.cc | 65 +- + fofi/FoFiType1C.cc | 590 +++-- + fofi/FoFiType1C.h | 7 +- + glib/poppler-action.cc | 12 +- + glib/poppler-document.cc | 5 +- + glib/poppler-page.cc | 8 +- + goo/FixedPoint.cc | 31 +- + goo/FixedPoint.h | 5 + + goo/GooString.cc | 444 +++- + goo/GooString.h | 41 +- + goo/Makefile.am | 2 +- + goo/gfile.cc | 54 +- + goo/gmem.c | 238 -- + goo/gmem.cc | 264 ++ + goo/gmem.h | 27 +- + poppler/ABWOutputDev.cc | 1 - + poppler/ABWOutputDev.h | 1 - + poppler/Annot.cc | 1685 +++++++++--- + poppler/Annot.h | 83 +- + poppler/ArthurOutputDev.cc | 13 +- + poppler/Catalog.cc | 79 +- + poppler/Catalog.h | 16 +- + poppler/CharCodeToUnicode.cc | 31 +- + poppler/DCTStream.cc | 2 +- + poppler/DCTStream.h | 4 +- + poppler/Decrypt.cc | 427 ++- + poppler/Decrypt.h | 54 +- + poppler/Dict.cc | 23 +- + poppler/Dict.h | 27 +- + poppler/FontInfo.cc | 1 - + poppler/Form.cc | 19 +- + poppler/Form.h | 2 +- + poppler/Function.cc | 65 +- + poppler/Function.h | 8 +- + poppler/Gfx.cc | 1247 ++++++--- + poppler/Gfx.h | 39 +- + poppler/GfxFont.cc | 45 +- + poppler/GfxFont.h | 7 +- + poppler/GfxState.cc | 209 +- + poppler/GfxState.h | 42 +- + poppler/GlobalParams.cc | 399 ++- + poppler/GlobalParams.h | 41 +- + poppler/JBIG2Stream.cc | 96 +- + poppler/JBIG2Stream.h | 4 +- + poppler/JPXStream.cc | 246 +- + poppler/JPXStream.h | 8 +- + poppler/Lexer.cc | 18 +- + poppler/Link.cc | 150 +- + poppler/Link.h | 49 +- + poppler/Makefile.am | 4 +- + poppler/Object.cc | 5 +- + poppler/Object.h | 29 +- + poppler/Outline.cc | 1 - + poppler/OutputDev.cc | 2 + + poppler/OutputDev.h | 62 +- + poppler/PDFDoc.cc | 100 +- + poppler/PDFDoc.h | 21 +- + poppler/PSOutputDev.cc | 2715 ++++++++++++++----- + poppler/PSOutputDev.h | 58 +- + poppler/PSTokenizer.cc | 2 +- + poppler/Page.cc | 227 +- + poppler/Page.h | 22 +- + poppler/PageLabelInfo.cc | 1 - + poppler/Parser.cc | 66 +- + poppler/Parser.h | 11 +- + poppler/PreScanOutputDev.cc | 255 ++ + poppler/PreScanOutputDev.h | 128 + + poppler/SecurityHandler.cc | 17 +- + poppler/SecurityHandler.h | 5 + + poppler/SplashOutputDev.cc | 1480 ++++++----- + poppler/SplashOutputDev.h | 41 +- + poppler/Stream.cc | 338 +-- + poppler/Stream.h | 39 +- + poppler/TextOutputDev.cc | 537 +++- + poppler/TextOutputDev.h | 77 +- + poppler/UGooString.cc | 182 -- + poppler/UGooString.h | 79 - + poppler/XRef.cc | 29 +- + poppler/XRef.h | 6 +- + qt/poppler-document.cc | 15 +- + qt/poppler-page-transition.cc | 1 - + qt/poppler-page.cc | 4 +- + qt/poppler-private.h | 72 +- + qt4/src/poppler-annotation-helper.h | 38 +- + qt4/src/poppler-document.cc | 7 +- + qt4/src/poppler-embeddedfile.cc | 6 +- + qt4/src/poppler-form.cc | 12 +- + qt4/src/poppler-page.cc | 8 +- + qt4/src/poppler-private.h | 76 +- + splash/Splash.cc | 4994 + ++++++++++++++++++----------------- + splash/Splash.h | 137 +- + splash/SplashBitmap.cc | 110 +- + splash/SplashBitmap.h | 10 +- + splash/SplashClip.cc | 276 +- + splash/SplashClip.h | 28 +- + splash/SplashFTFont.cc | 104 +- + splash/SplashFTFont.h | 5 +- + splash/SplashFTFontEngine.cc | 54 +- + splash/SplashFTFontEngine.h | 9 +- + splash/SplashFTFontFile.cc | 19 +- + splash/SplashFTFontFile.h | 9 +- + splash/SplashFont.cc | 6 +- + splash/SplashFont.h | 13 +- + splash/SplashFontEngine.cc | 72 +- + splash/SplashFontEngine.h | 11 +- + splash/SplashFontFile.cc | 1 - + splash/SplashFontFile.h | 2 +- + splash/SplashMath.h | 15 +- + splash/SplashPath.cc | 42 +- + splash/SplashPath.h | 31 +- + splash/SplashPattern.cc | 28 - + splash/SplashPattern.h | 25 - + splash/SplashScreen.cc | 304 ++- + splash/SplashScreen.h | 18 +- + splash/SplashState.cc | 63 +- + splash/SplashState.h | 14 +- + splash/SplashT1Font.cc | 101 +- + splash/SplashT1Font.h | 6 +- + splash/SplashT1FontEngine.cc | 4 +- + splash/SplashT1FontFile.cc | 9 +- + splash/SplashT1FontFile.h | 7 +- + splash/SplashTypes.h | 72 +- + splash/SplashXPath.cc | 353 +-- + splash/SplashXPath.h | 26 +- + splash/SplashXPathScanner.cc | 143 + + splash/SplashXPathScanner.h | 13 + + utils/HtmlOutputDev.cc | 15 +- + utils/HtmlOutputDev.h | 15 +- + utils/pdffonts.cc | 15 +- + utils/pdfinfo.cc | 21 +- + utils/pdftoabw.cc | 1 - + utils/pdftohtml.cc | 3 +- + utils/pdftoppm.cc | 8 + + utils/pdftops.cc | 8 +- + utils/pdftotext.cc | 1 - + 139 files changed, 14538 insertions(+), 7039 deletions(-) + +commit ba74bb3b0632593d1937911d73709fc870480efd +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 16 21:25:46 2007 +0000 + + * qt4/src/poppler-private.h: + Add the information about the open/close item in the DOM tree + of the TOC. + + ChangeLog | 7 +++++++ + qt4/src/poppler-private.h | 5 ++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 6c7969f37c85f326327aca98e0346f2ebc86ffda +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 14 23:19:46 2007 +0000 + + * utils/HtmlFonts.cc: Fix rendering of text colors on + complex mode. + * utils/pdftohtml.cc: Fix rendering of links. + + ChangeLog | 5 +++++ + utils/HtmlFonts.cc | 8 ++++---- + utils/pdftohtml.cc | 2 +- + 3 files changed, 10 insertions(+), 5 deletions(-) + +commit add8515d7b3fba59c20ed1bbb058cea9e138c1a8 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Apr 14 07:29:04 2007 +0000 + + Not sure what this was intended to do, but it triggers a lot of + problems with the unit tests (essentially, duplicate delete's). + + CCMAIL: aacid@kde.org + + qt4/src/poppler-embeddedfile.cc | 1 - + 1 file changed, 1 deletion(-) + +commit f3ded10305f6ac682640c37c21f569db0f830756 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Apr 7 21:12:35 2007 +0000 + + 2007-04-07 Jeff Muizelaar <jeff@infidigm.net> + + * utils/pdftoabw.cc: Fixing passing the wrong type + to fprintf. Patch by Kouhei Sutou. Fixes #10554. + + ChangeLog | 5 +++++ + utils/pdftoabw.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 2fcb76df955c143153fe4b273d0388fcb7f67d8a +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Fri Apr 6 15:27:52 2007 +0000 + + 2007-04-06 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/ABWOutputDev.cc: + * utils/pdftoabw.cc: Fix a number of issues with the new + AbiWord code: + *) Allows you to save to a file other than stdout + *) Checks for error conditions when reading the PDF + doc and + writing the ABW doc + *) Removes dead code in pdftoabw.cc + *) Fixes a SEGV I encountered when converting my new + home's floor plan + *) Returns proper error conditions should the conversion + fail for any reason + Patch by Dominic Lachowicz + + ChangeLog | 12 ++++++ + poppler/ABWOutputDev.cc | 3 ++ + utils/pdftoabw.cc | 101 + +++++++++++++++++++++++++++-------------------- + 3 files changed, 74 insertions(+), 42 deletions(-) + +commit 29da65ec48b5ba91139084e197ce457d3cff3732 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 5 12:13:51 2007 +0000 + + * poppler/PSOutputDev.cc: Readd code wrongly removed when doing the + GlobalParams cleaning + + ChangeLog | 5 +++++ + poppler/PSOutputDev.cc | 5 +++++ + 2 files changed, 10 insertions(+) + +commit 722b2bd86f58f2d7a914571cccfa195485a70c47 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 4 02:42:29 2007 +0000 + + 2007-04-03 Jeff Muizelaar <jeff@infidigm.net> + + * configure.ac: + * poppler/ABWOutputDev.cc: + * poppler/ABWOutputDev.h: + * poppler/Makefile.am: + * utils/Makefile.am: + * utils/pdftoabw.cc: Add AbiWord output device and pdftoabw + program. + Patch by Jauco Noordzij. Autotools stuff by Dominic Lachowicz. + + ChangeLog | 10 + + configure.ac | 15 + + poppler/ABWOutputDev.cc | 1286 + +++++++++++++++++++++++++++++++++++++++++++++++ + poppler/ABWOutputDev.h | 140 ++++++ + poppler/Makefile.am | 17 + + utils/Makefile.am | 16 +- + utils/pdftoabw.cc | 138 +++++ + 7 files changed, 1620 insertions(+), 2 deletions(-) + +commit c9b467da290476da5ebbe8dc25699cd25e589b57 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 22 20:56:24 2007 +0000 + + * poppler/Gfx.cc: Accept reals for width and height of + images. Fixes + KDE bug 143322 + + ChangeLog | 5 +++++ + poppler/Gfx.cc | 14 ++++++++++---- + 2 files changed, 15 insertions(+), 4 deletions(-) + +commit ff8f8d44ef47a98f7dbdfaa4d27a720b1f37015f +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 15 20:16:13 2007 +0000 + + * glib/Makefile.am: Make it build with BSD/Make. Patch by + Henry Precheur <henry@precheur.org> + + ChangeLog | 5 +++++ + glib/Makefile.am | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit bbf7e78b6b2509ecdc476d7f55151ef327470d9d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 7 19:15:32 2007 +0000 + + 2007-03-07 Carlos Garcia Campos <carlosgc@gnome.org> + reviewed by: Albert Astals Cid <aacid@kde.org> + + * poppler/Page.cc: Consider 0x0 boxes as invalid. Fixes + http://bugzilla.gnome.org/show_bug.cgi?id=408682 + + 2007-03-06 Pino Toscano <pino@kde.org> + reviewed by: Albert Astals Cid <aacid@kde.org> + + * configure.ac: + * qt/Makefile.am: + * qt/poppler-link.cc: + * qt/poppler-page.cc: + * qt/poppler-private.h: + * qt4/poppler-link.cc: + Make the Qt4 frontend compilable again with no Splash. + Make the Qt3 frontend compilable with no Splash. + + ChangeLog | 18 ++++++++++++++++++ + configure.ac | 12 +----------- + poppler/Page.cc | 7 ++++++- + qt/Makefile.am | 1 - + qt/poppler-link.cc | 4 +++- + qt/poppler-page.cc | 16 +++++++++++++++- + qt/poppler-private.h | 11 ++++++++++- + qt4/src/poppler-link.cc | 10 ++++++---- + 8 files changed, 59 insertions(+), 20 deletions(-) + +commit 08dcc7121450cbfa163254001e73bb6a2670e055 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 6 22:27:18 2007 +0000 + + * poppler/Annot.cc: + * poppler/Form.cc: + Fix uninitialized variables. + Properly escape parenthesis and slash in text field + + ChangeLog | 9 ++++++++- + poppler/Annot.cc | 3 +++ + poppler/Form.cc | 1 + + 3 files changed, 12 insertions(+), 1 deletion(-) + +commit e8d3b21d08a59ec8b62503b48504fe046d746bfa +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Mar 4 07:30:31 2007 +0000 + + Switch to using pkg-config to find Qt4. + + ChangeLog | 9 +++ + configure.ac | 36 +++++------ + m4/qt.m4 | 165 + ------------------------------------------------- + poppler/Makefile.am | 2 +- + qt4/src/Makefile.am | 3 +- + qt4/tests/Makefile.am | 21 +++---- + 6 files changed, 36 insertions(+), 200 deletions(-) + +commit bd99616b9c06f96beadb68e015d2904b7fe2df1d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 25 00:34:21 2007 +0000 + + 007-02-25 Julien Rebetez <julienr@svn.gnome.org> + + reviewed by: Albert Astals Cid <aacid@kde.org> + + * poppler/Annot.cc: + * poppler/Annot.h: + * poppler/Form.cc: + * poppler/Form.h: + Fix compilation warnings. + + ChangeLog | 10 ++++++++++ + poppler/Annot.cc | 30 +++++++++++++++++------------- + poppler/Annot.h | 5 ++++- + poppler/Form.cc | 37 ++++++++++++++----------------------- + poppler/Form.h | 13 ++++++------- + 5 files changed, 51 insertions(+), 44 deletions(-) + +commit d8d23b56332618d8c7d8198f55ec6efafd24187e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 25 00:00:20 2007 +0000 + + forgot to commit these + + qt4/src/poppler-form.cc | 284 + +++++++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-form.h | 247 +++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 531 insertions(+) + +commit 984ce7f919aec27d5f4225376550cd6b58d4ae52 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 24 23:58:31 2007 +0000 + + 2007-02-25 Pino Toscano <pino@kde.org> + reviewed by: Albert Astals Cid <aacid@kde.org> + + * qt4/src/Doxyfile: + * qt4/src/Makefile.am: + * qt4/src/poppler-annotation-helper.h: + * qt4/src/poppler-form.cc: + * qt4/src/poppler-form.h: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: + Beginning of interactive forms support, first + implementation in the + Qt4 frontend. It supports text and choice fields in + a basic way. + + ChangeLog | 14 ++++++++++ + qt4/src/Doxyfile | 1 + + qt4/src/Makefile.am | 2 ++ + qt4/src/poppler-annotation-helper.h | 18 ++++++------ + qt4/src/poppler-page.cc | 36 ++++++++++++++++++++++++ + qt4/src/poppler-private.h | 52 + ++++++++++++++++++++++++++++++++++- + qt4/src/poppler-qt4.h | 7 +++++ + 7 files changed, 120 insertions(+), 10 deletions(-) + +commit de7a90fc724de14151ec994d18f860ada3be2ac8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 24 23:43:34 2007 +0000 + + 2007-02-25 Albert Astals Cid <aacid@kde.org> + + * configure.ac: + * glib/poppler-document.cc: + * poppler/GlobalParams.cc: + * poppler/GlobalParams.h: + * poppler/PSOutputDev.cc: + * qt/poppler-document.cc: + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: + * test/gtk-splash-test.cc: + * test/pdf-inspector.cc: + * utils/pdffonts.cc: + * utils/pdfimages.cc: + * utils/pdfinfo.cc: + * utils/pdftohtml.cc: + * utils/pdftoppm.cc: + * utils/pdftops.cc: + * utils/pdftotext.cc: Remove dependency on xpdfrc file + and cleanup + GlobalParams accordingly + + ChangeLog | 22 ++ + configure.ac | 1 - + glib/poppler-document.cc | 4 +- + poppler/GlobalParams.cc | 666 + +------------------------------------------ + poppler/GlobalParams.h | 59 +--- + poppler/PSOutputDev.cc | 8 - + qt/poppler-document.cc | 4 +- + qt4/src/poppler-document.cc | 2 +- + qt4/src/poppler-private.h | 2 +- + qt4/src/poppler-qt4.h | 6 +- + test/gtk-splash-test.cc | 2 +- + test/pdf-inspector.cc | 2 +- + utils/pdffonts.cc | 5 +- + utils/pdfimages.cc | 5 +- + utils/pdfinfo.cc | 5 +- + utils/pdftohtml.cc | 2 +- + utils/pdftoppm.cc | 15 +- + utils/pdftops.cc | 50 ++-- + utils/pdftotext.cc | 5 +- + 19 files changed, 72 insertions(+), 793 deletions(-) + +commit 74e70386b759a3cd9864d11eb4ca210010136aa5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 24 23:32:22 2007 +0000 + + 2007-02-25 Julien Rebetez <julienr@svn.gnome.org> + reviewed by: <aacid@kde.org> + + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * glib/poppler.h: + * poppler/Annot.cc: + * poppler/Annot.h: + * poppler/Catalog.cc: + * poppler/Catalog.h: + * poppler/CharCodeToUnicode.cc: + * poppler/CharCodeToUnicode.h: + * poppler/Dict.cc: + * poppler/Dict.h: + * poppler/Form.cc: + * poppler/Form.h: + * poppler/GfxFont.cc: + * poppler/GfxFont.h: + * poppler/Makefile.am: + * poppler/Object.h: + * poppler/Page.cc: + * poppler/Page.h: + * poppler/XRef.cc: + * poppler/XRef.h: + Beginning of Interactive Form support: + Add a bunch of new classes (FormWidget / FormField) + to deal with form + fields. + Add support for object modification through + XRef::setModifiedObject, as + well as a function to write the Xref to a file, + which will be used + to implement PDF writing. + Add some functions to glib wrapper to expose the + new form features. + + ChangeLog | 35 ++ + glib/poppler-document.cc | 192 +++++++ + glib/poppler-document.h | 55 ++ + glib/poppler-page.cc | 120 +++++ + glib/poppler-page.h | 55 ++ + glib/poppler-private.h | 4 + + glib/poppler.h | 15 +- + poppler/Annot.cc | 344 +++++++++--- + poppler/Annot.h | 21 +- + poppler/Catalog.cc | 17 +- + poppler/Catalog.h | 4 + + poppler/CharCodeToUnicode.cc | 34 ++ + poppler/CharCodeToUnicode.h | 3 + + poppler/Dict.cc | 32 ++ + poppler/Dict.h | 4 + + poppler/Form.cc | 1187 + ++++++++++++++++++++++++++++++++++++++++++ + poppler/Form.h | 470 +++++++++++++++++ + poppler/GfxFont.cc | 27 + + poppler/GfxFont.h | 5 + + poppler/Makefile.am | 2 + + poppler/Object.h | 4 + + poppler/Page.cc | 11 +- + poppler/Page.h | 8 +- + poppler/XRef.cc | 87 ++++ + poppler/XRef.h | 9 + + 25 files changed, 2666 insertions(+), 79 deletions(-) + +commit 5c4ea446f33248964431e79b14592b30362634fe +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 18 21:44:24 2007 +0000 + + * configure.ac: Change {datadir}/poppler to {datarootdir}/poppler so + that i get /usr/local/share/poppler in config.h + instead of + ${prefix}/poppler Better fixes are welcome. + + ChangeLog | 6 ++++++ + configure.ac | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit dd140dd63de661303b578863af4d515d82117cca +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 4 00:19:25 2007 +0000 + + fix date + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3c1ed68bf4ee49b27275f7f65d49f42933b1cfa0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 4 00:16:43 2007 +0000 + + * poppler/Lexer.cc: + * poppler/Lexer.h: Patch to fix regression introduced by + optimizations + in bugzilla issue 7808 + + ChangeLog | 6 ++++++ + poppler/Lexer.cc | 30 ++++++++++++++++++++---------- + poppler/Lexer.h | 2 +- + 3 files changed, 27 insertions(+), 11 deletions(-) + +commit 672408839de0deac4c6006b54df723336ee4be2d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 31 22:05:09 2007 +0000 + + * qt4/src/poppler-page.cc: + Patch by Pino Toscano <pino@kde.org> to remove a nonsense done + by him. + + * qt4/tests/test-poppler-qt4.cpp: + Simply a bit. Patch by Pino Toscano <pino@kde.org>. + + ChangeLog | 8 ++++++++ + qt4/src/poppler-page.cc | 2 -- + qt4/tests/test-poppler-qt4.cpp | 24 ++++++++++++------------ + 3 files changed, 20 insertions(+), 14 deletions(-) + +commit 9c64b8c754e09ff2858af56ce38ef013002bf8e4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 31 18:48:16 2007 +0000 + + * m4/qt.m4: Fix Qt4 detection on Mac. Patch by Benjamin Reed + <ranger@befunk.com> + + ChangeLog | 5 +++++ + m4/qt.m4 | 26 +++++++++++++++++++++++--- + 2 files changed, 28 insertions(+), 3 deletions(-) + +commit 1b81192ff2bb9fae4a7bbc685fafe1718f303a7b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 28 15:55:11 2007 +0000 + + * glib/poppler-page.cc: Make link mapping coordinates + follow page + rotation. Patch by Carlos Garcia Campos <carlosgc@gnome.org> + * glib/poppler-action.cc: Fix link destination + coordinates. Patch by + Carlos Garcia Campos <carlosgc@gnome.org> + + ChangeLog | 4 ++ + glib/poppler-action.cc | 15 +++++- + glib/poppler-page.cc | 124 + ++++++++++++++++++++++++++++++------------------ + 3 files changed, 97 insertions(+), 46 deletions(-) + +commit 75dcf94f53c2d7241111f0d527ee4d3a2ef0b0cf +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 28 15:36:08 2007 +0000 + + * glib/poppler-document.cc: Plug memory leak in + poppler-document. Patch by Carlos Garcia Campos <carlosgc@gnome.org> + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 30 ++++++++++++++---------------- + 2 files changed, 19 insertions(+), 16 deletions(-) + +commit 682a15fc38a2c569d9b1f9871e3e949b62b33cf8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 21 22:35:23 2007 +0000 + + * poppler-document.cc: + * poppler-page.cc: + * poppler-private.h: + * poppler-qt4.h: + No need to destroy the Splash output device to change its + paper color. + Add the possibility to set flags that affect the rendering + (some + backends supports only some of them, though). + Add a Page::label to get the label associated with a page. + Patches by Pino Toscano <pino@kde.org>. + + ChangeLog | 12 ++++++++++++ + qt4/src/poppler-document.cc | 20 ++++++++++++++++++++ + qt4/src/poppler-page.cc | 14 +++++++++++++- + qt4/src/poppler-private.h | 29 ++++++++++++++++++++++++----- + qt4/src/poppler-qt4.h | 25 +++++++++++++++++++++++++ + 5 files changed, 94 insertions(+), 6 deletions(-) + +commit 7331bc46c1cb323316501f05ae1740bea5655596 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 17 20:06:29 2007 +0000 + + * poppler/Sound.h: + * poppler/Sound.cc: + * qt4/src/poppler-sound.cc: Move most of the sound reading + code + into the Sound class, so frontends can use it easily. + Patch by Pino Toscano <pino@kde.org>. + + ChangeLog | 10 +++- + poppler/Sound.cc | 80 +++++++++++++++++++++++++- + poppler/Sound.h | 32 ++++++++++- + qt4/src/poppler-sound.cc | 144 + ++++++++++++++++------------------------------ + 4 files changed, 167 insertions(+), 99 deletions(-) + +commit 841bee94da7b6376d2e1fb3daaf8b727b90e42d8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jan 13 23:19:21 2007 +0000 + + * poppler/Stream.h: + * poppler/Stream.cc: Remove MemStream::setNeedFree method + i really did + not need it + * qt4/src/poppler-document.cc: + * qt4/src/poppler-link.cc: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-private.h: Make Document::loadFromData + work on + documents with a password and don't need to do a malloc and + a memcpy. + + ChangeLog | 11 +++++++ + poppler/Stream.cc | 5 --- + poppler/Stream.h | 1 - + qt4/src/poppler-document.cc | 74 + +++++++++++++++++++++++-------------------- + qt4/src/poppler-link.cc | 4 +-- + qt4/src/poppler-page.cc | 34 ++++++++++---------- + qt4/src/poppler-private.h | 24 ++++++++------ + 7 files changed, 84 insertions(+), 69 deletions(-) + +commit e1432fd7c4a6a2386789f450d39c6d954fd4e656 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jan 13 18:29:39 2007 +0000 + + * configure.ac + * poppler/Makefile.am + * qt4/src/Makefile.am + * qt4/src/poppler-document.cc + * qt4/src/poppler-link.cc + * qt4/src/poppler-page.cc + * qt4/src/poppler-private.h + * qt4/src/poppler-qt4.h: Make the Qt4 backend compilable + even with + no Splash backend. Patch by Pino Toscano <pino@kde.org>. + + ChangeLog | 12 ++++++++++++ + configure.ac | 5 ----- + poppler/Makefile.am | 5 +++-- + qt4/src/Makefile.am | 6 +++++- + qt4/src/poppler-document.cc | 16 ++++++++++++++-- + qt4/src/poppler-link.cc | 1 + + qt4/src/poppler-page.cc | 15 ++++++++++++--- + qt4/src/poppler-private.h | 8 +++++++- + qt4/src/poppler-qt4.h | 6 ++++++ + 9 files changed, 60 insertions(+), 14 deletions(-) + +commit 457038e97325720615c4390ffa075dd8283966ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jan 13 17:56:07 2007 +0000 + + * poppler/Stream.h: + * poppler/Stream.cc: Add MemStream::setNeedFree method + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: Add Document::loadFromData method + + ChangeLog | 8 ++++++++ + poppler/Stream.cc | 5 +++++ + poppler/Stream.h | 1 + + qt4/src/poppler-document.cc | 22 ++++++++++++++++++++++ + qt4/src/poppler-private.h | 17 +++++++++++++++-- + qt4/src/poppler-qt4.h | 16 ++++++++++++++++ + 6 files changed, 67 insertions(+), 2 deletions(-) + +commit 4e2a9c49ecab00b1f5d175570165cd490afdd31e +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 11 22:28:03 2007 +0000 + + goo/gmem.c: Merge change from xpdf-3.01pl2 + + ChangeLog | 4 ++++ + goo/gmem.c | 13 +++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit bce14b274fd788d728116950d6464a85e33a9966 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 11 22:12:11 2007 +0000 + + * poppler/Catalog.h: + * poppler/Catalog.cc: Limit max depth of recursive calls on + readPageTree to fix MOAB-06-01-2007 + + ChangeLog | 6 ++++++ + poppler/Catalog.cc | 20 +++++++++++++++----- + poppler/Catalog.h | 2 +- + 3 files changed, 22 insertions(+), 6 deletions(-) + +commit 3f0679a336ffaf2aff149f8526fa11f8f8cbda59 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jan 6 21:53:08 2007 +0000 + + Patch by Pino Toscano <pino@kde.org> to fix some memory leaks when + dealing with sounds. + + ChangeLog | 9 +++++++++ + poppler/Sound.cc | 1 + + qt4/src/poppler-link.cc | 5 +++++ + qt4/src/poppler-link.h | 1 + + qt4/src/poppler-page.cc | 4 ++++ + qt4/src/poppler-sound.cc | 7 ++++++- + 6 files changed, 26 insertions(+), 1 deletion(-) + +commit d41cd2f567a955031cb7498d9089e70e14df4a42 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 4 19:10:16 2007 +0000 + + qt4/src/poppler-private.h: gmallocn -> new[] + + ChangeLog | 4 ++++ + qt4/src/poppler-private.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit f8edfb6832144cbbd1b234f6b35e33325269255c +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 4 18:56:13 2007 +0000 + + qt/poppler-page-transition.cc: Fix memory leak. Patch by Tobias + Koenig <tokoe@kde.org> + + ChangeLog | 5 +++++ + qt/poppler-page-transition.cc | 1 + + 2 files changed, 6 insertions(+) + +commit 250a9f4b429344e0968c7bd0c0cebe7af373ae0a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 30 14:50:25 2006 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-document.cc: Add const & to some parameters. Patch + by Pino Toscano <pino@kde.org> + + ChangeLog | 6 ++++++ + qt4/src/poppler-document.cc | 4 ++-- + qt4/src/poppler-qt4.h | 4 ++-- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit 250c1f94cc9a53f980fd08364d6cce29db9fd067 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 29 14:08:35 2006 +0000 + + * poppler/UGooString.cc: Patch by Pino Toscano <pino@kde.org> so + that QStringToUGooString does not crash. + + ChangeLog | 5 +++++ + poppler/UGooString.cc | 1 + + 2 files changed, 6 insertions(+) + +commit 42770e5f07407b03dce31c73fd6956f9c8fc9a06 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Fri Dec 29 04:12:40 2006 +0000 + + 2006-12-28 Brad Taylor <brad@getcoded.net> + + * poppler/glib/poppler-document.h: + * poppler/glib/poppler-document.cc: Add + poppler_document_new_from_data + to allow loading PDFs out of memory. + + ChangeLog | 6 +++ + glib/poppler-document.cc | 113 + ++++++++++++++++++++++++++++++++++------------ + glib/poppler-document.h | 4 ++ + 3 files changed, 93 insertions(+), 30 deletions(-) + +commit 6fedd991b584e300b5710630fa7942d357fe7aaa +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 28 17:22:36 2006 +0000 + + * qt4/src/poppler-embeddedfile.cc: + * qt4/src/poppler-document.cc: + * qt/poppler-document.cc: Fix memory leaks + + ChangeLog | 6 ++++++ + qt/poppler-document.cc | 4 ++++ + qt4/src/poppler-document.cc | 4 +++- + qt4/src/poppler-embeddedfile.cc | 4 +++- + 4 files changed, 16 insertions(+), 2 deletions(-) + +commit 7da5885e45c33382060276c95d9a3bd117ae55c7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 28 15:51:44 2006 +0000 + + * goo/GooString.cc + * goo/GooString.h + * goo/gmem.c + * goo/gmem.h + * poppler/Lexer.cc + * poppler/Lexer.h + * poppler/PageLabelInfo.cc + * poppler/Parser.cc + * poppler/UGooString.cc + * poppler/UGooString.h: Patch by Krzysztof Kowalczyk + <kkowalczyk@gmail.com> to improve performance. See bug 7808 for + details. + + ChangeLog | 15 ++++ + goo/GooString.cc | 186 + +++++++++++++++++++++++----------------------- + goo/GooString.h | 28 +++++-- + goo/gmem.c | 3 +- + goo/gmem.h | 2 +- + poppler/Lexer.cc | 19 +++-- + poppler/Lexer.h | 10 +++ + poppler/PageLabelInfo.cc | 1 + + poppler/Parser.cc | 17 +++-- + poppler/UGooString.cc | 137 +++++++++++++++++++++++++++------- + poppler/UGooString.h | 40 ++++++++-- + 11 files changed, 313 insertions(+), 145 deletions(-) + +commit fbc05a6791fc28ee26a9d9188722ea3453c65ddc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Dec 27 23:15:06 2006 +0000 + + * poppler/Annot.cc: + * poppler/Annot.h: Add type checking to processing of "Rect". Patch + by Scott Turner <scotty1024@mac.com> + + ChangeLog | 6 ++++++ + poppler/Annot.cc | 48 +++++++++++++++++++++++++++++------------------- + poppler/Annot.h | 1 + + 3 files changed, 36 insertions(+), 19 deletions(-) + +commit dc6b372358ac629c43aa2faabd644942cb0ed98b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Dec 27 15:23:04 2006 +0000 + + Remove , after last value of enum. Thanks to André Wöbbeking + + ChangeLog | 1 + + poppler/Catalog.h | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit c7d19539a95927eb277966a521f13393c9e116bb +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Dec 27 12:38:58 2006 +0000 + + qt4/src/poppler-qt4.h: Remove , after last value of enum. Thanks to + André Wöbbeking + + ChangeLog | 5 +++++ + qt4/src/poppler-qt4.h | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit b29429c702e6540b9f35689b0a164f30e747d5d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 26 20:07:03 2006 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-page.cc: Add Page::duration() function to the + qt4 frontend. + + ChangeLog | 6 ++++++ + qt4/src/poppler-page.cc | 8 ++++++++ + qt4/src/poppler-qt4.h | 9 ++++++++- + 3 files changed, 22 insertions(+), 1 deletion(-) + +commit 62dfc58903b496c4cc720c8b2c759c6fb82fb443 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 26 19:56:28 2006 +0000 + + * glib/test-poppler-glib.c: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * poppler/Page.cc: + * poppler/Page.h: Implement /Dur entry in page object. Patch + by Carlos + Garcia Campos <carlosgc@gnome.org> + + ChangeLog | 9 +++++++++ + glib/poppler-page.cc | 16 ++++++++++++++++ + glib/poppler-page.h | 1 + + glib/test-poppler-glib.c | 7 +++++++ + poppler/Page.cc | 13 +++++++++++++ + poppler/Page.h | 6 ++++++ + 6 files changed, 52 insertions(+) + +commit 34e5aa62f4d3ba7a2d94a68a91c11a48277a4119 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 23 13:12:13 2006 +0000 + + * poppler/PSTokenizer.cc: Enhance PSTokenizer::getToken + performance. + Patch by Scott Turner <scotty1024@mac.com>. In a random pdf + i tested + the patchs improves PSTokenizer::getToken performance by 15% + + ChangeLog | 6 ++++++ + poppler/PSTokenizer.cc | 33 +++++++++++++++++++++------------ + poppler/PSTokenizer.h | 1 + + 3 files changed, 28 insertions(+), 12 deletions(-) + +commit 1a5fa1d2ced62e7d027e085663e987cff625ce0b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 22 23:39:41 2006 +0000 + + poppler/Page.cc: Fix memory leak when reading a wrong color map in + a thumbnail. Patch by Scott Turner <scotty1024@mac.com> + + ChangeLog | 3 +++ + poppler/Page.cc | 1 + + 2 files changed, 4 insertions(+) + +commit dd1c134dcf085338a85188c7f205fc300396dc86 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 22 23:27:53 2006 +0000 + + qt/poppler-page.cc: Fix memory leak in Page::textList. Patch by + Jerry Epplin <jepplin@globalvelocity.com> + + ChangeLog | 5 +++++ + qt/poppler-page.cc | 4 +++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 87e474a018c4808d6251fd79f9e9640e0f733551 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Dec 21 01:01:30 2006 +0000 + + 2006-12-20 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Fix scaling of maskedImage + masks. They + should be scaled to the size of the image not the size of + the mask. + Fixes #9403. + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.cc | 8 ++------ + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 769a89623c680f51690db1751522b016b02b83a8 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Dec 20 19:55:55 2006 +0000 + + 2006-12-20 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GlobalParams.cc: Try to make zero-width lines as + close to + one pixel wide as we can. Fixes #9393. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 10 ++++++++-- + 2 files changed, 13 insertions(+), 2 deletions(-) + +commit 5c4bca18373528f293bd5e080efca572977fc1ff +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 19 20:27:55 2006 +0000 + + poppler/SplashOutputDev.cc: Fix gray calculation. Patch by Scott + Turner <scotty1024@mac.com> + + ChangeLog | 5 +++++ + poppler/SplashOutputDev.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit fba99578f6001ae0c0df0442bb73040b55109b1d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Dec 12 05:23:59 2006 +0000 + + 2006-12-12 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Change a cairo_set_matrix to + cairo_transform so that we don't blindly clobber the existing + matrix. + Patch by Daniel Colascione. + Fixes #9190. + + ChangeLog | 7 +++++++ + poppler/CairoOutputDev.cc | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 9a6ffa1c6e009f8606a055f873efdcd5829fcfa2 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Dec 10 05:24:56 2006 +0000 + + 2006-12-09 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Function.cc: Initialize PostScriptFunction::codeString + to + NULL so that it can safely deleted if initialization fails. + Fixes #9263. + + ChangeLog | 6 ++++++ + poppler/Function.cc | 1 + + 2 files changed, 7 insertions(+) + +commit e92d63a179ae022270156da4e396c15ff9236d89 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 23 19:01:44 2006 +0000 + + * m4/libjpeg.m4: Make JPEG library header search work under + MSYS. Patch by Alexis Wilke + + ChangeLog | 5 +++++ + m4/libjpeg.m4 | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 3913110f698fd006b394a395b5b0adfde30af31b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 22 21:55:27 2006 +0000 + + there should not be any whitespace after the \ + + qt4/src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c3ab7addec5a7990872949b813c2b727b1614d64 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 19 18:51:23 2006 +0000 + + Another leak fix on qt4/src/poppler-page.cc the previous changelog + is enough for this one ;-) + + qt4/src/poppler-page.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 9e9b82da91abacb916b05302d40bf822af6ac7f1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Nov 19 12:59:48 2006 +0000 + + * qt4/src/poppler-link.cc: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-textbox.cc: Fix memory leaks + * splash/Splash.cc: Initialize the values of nClipRes + + ChangeLog | 8 ++++++++ + qt4/src/poppler-link.cc | 6 ++++++ + qt4/src/poppler-page.cc | 4 +++- + qt4/src/poppler-qt4.h | 1 + + qt4/src/poppler-textbox.cc | 5 +++++ + splash/Splash.cc | 2 +- + 6 files changed, 24 insertions(+), 2 deletions(-) + +commit b9faacc62182efcbc84df2471e4c5dcf2b03bda8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 18 17:08:04 2006 +0000 + + * qt4/src/poppler-document.cc + * qt4/src/poppler-qt4.h: Add int marginRight, int + marginBottom, int + marginLeft, int marginTop, bool strictMargins to + Document::print() + + ChangeLog | 6 ++++++ + qt4/src/poppler-document.cc | 11 +++++++++-- + qt4/src/poppler-qt4.h | 6 +++++- + 3 files changed, 20 insertions(+), 3 deletions(-) + +commit da8e6d4c3e0afdaa031413649ae20545c8a1f845 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 16 21:03:27 2006 +0000 + + really commit pino's patch :-S + + qt4/src/Doxyfile | 11 ++-- + qt4/src/Mainpage.dox | 26 +++++----- + qt4/src/poppler-annotation.h | 33 +++++++----- + qt4/src/poppler-link.h | 68 +++++++++++++++++++++---- + qt4/src/poppler-qt4.h | 115 + +++++++++++++++++++++++++++--------------- + 5 files changed, 171 insertions(+), 82 deletions(-) + +commit 4f26e65096e3133a39fc0c9e82084c90cf77dda9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 16 21:00:10 2006 +0000 + + * qt4/src/Mainpage.dox: + * qt4/src/Doxyfile: + * qt4/src/poppler-annotation.h: + * qt4/src/poppler-link.h: + * qt4/src/poppler-qt4.h: Improve API documentation. Patch by + Pino Toscano. + + Generated docu at http://people.freedesktop.org/~aacid/docs/qt4/ + + ChangeLog | 9 +++++++++ + qt4/src/Mainpage.dox | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit e68b6f3f8fea1e4f036eba0f19bb7e0c423d408c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 15 21:07:50 2006 +0000 + + 2006-11-15 Albert Astals Cid <aacid@kde.org> + + * qt4/src/poppler-link.cc: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: Generalize the way we render + the pages: + merge all the Page::renderTo* functions in only one that + renders on + a QImage, taking into account the currently chosen backend. + It is possible to switch rendering backend using the Document. + Patch by Pino Toscano. + + * qt4/tests/stress-poppler-qt4.cpp: + * qt4/tests/test-password-qt4.cpp: + * qt4/tests/test-poppler-qt4.cpp: Adapt the tests to the + changes in + the rendering API of Page. Patch by Pino Toscano. + + ChangeLog | 17 ++++++ + qt4/src/poppler-document.cc | 14 +++++ + qt4/src/poppler-link.cc | 2 +- + qt4/src/poppler-page.cc | 123 + ++++++++++++++++++++------------------ + qt4/src/poppler-private.h | 32 ++++++---- + qt4/src/poppler-qt4.h | 75 +++++++---------------- + qt4/tests/stress-poppler-qt4.cpp | 3 +- + qt4/tests/test-password-qt4.cpp | 12 ++-- + qt4/tests/test-poppler-qt4.cpp | 17 +++--- + 9 files changed, 152 insertions(+), 143 deletions(-) + +commit 37088dd3335be6e7641c47bea9b1ddd689b07372 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 13 19:16:44 2006 +0000 + + * poppler/ArthurOutputDev.cc: Small fix to get colors right + + ChangeLog | 4 ++++ + poppler/ArthurOutputDev.cc | 8 ++++---- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 302e2cab9fd626222c69ad40f7e40be2e65d34a9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Nov 11 15:41:27 2006 +0000 + + Fix typo when outputing PS scale + + ChangeLog | 4 ++++ + poppler/PSOutputDev.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit e3550fb286dae98992b30edbf4a9300fa58d2e77 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Nov 7 23:53:31 2006 +0000 + + 2006-11-07 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: take horizontal scaling into account + when updating the font. Also, cleanup some unused code. Fixes + #8924. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 9 ++------- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit f020b64a72ad5c82c3e7bdcf15039bb0037b1f22 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 18 18:43:59 2006 +0000 + + 2006-10-18 Albert Astals Cid <aacid@kde.org> + + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: Do not crash when opening a + encrypted document. Do not crash when unlocking a locked + document. + + ChangeLog | 7 +++++++ + qt4/src/poppler-document.cc | 41 + ++++++++++++++++------------------------- + qt4/src/poppler-private.h | 14 ++++++++++++++ + 3 files changed, 37 insertions(+), 25 deletions(-) + +commit 577330ee1d4d1021174cf1bd59557a83a017e06f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 11 23:09:24 2006 +0000 + + * splash/Splash.cc: + * splash/SplashErrorCodes.h: Do not crash on documents that + report a + 0x0 mask for an image, like + http://bugs.kde.org/attachment.cgi?id=18083&action=view + + ChangeLog | 7 +++++++ + splash/Splash.cc | 2 ++ + splash/SplashErrorCodes.h | 2 ++ + 3 files changed, 11 insertions(+) + +commit 42c016c6d3c6de65fd92b51b9d6cc96d52404689 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 8 20:38:47 2006 +0000 + + * poppler/Link.cc: + * poppler/Link.h: + * poppler/Makefile.am: + * poppler/Page.cc: + * poppler/Page.h: + * poppler/Sound.cc: + * poppler/Sound.h: Make poppler able to read Sound objects, + Sound + actions and Opening/Closing page actions. Patch by Pino + Toscano. + + * qt4/src/Makefile.am: + * qt4/src/poppler-link.cc: + * qt4/src/poppler-link.h: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-sound.cc: Support for sounds, sound links + and page + actions in the Qt4 backend. Patch by Pino Toscano. + + ChangeLog | 19 +++++ + poppler/Link.cc | 53 ++++++++++++++ + poppler/Link.h | 32 +++++++++ + poppler/Makefile.am | 2 + + poppler/Page.cc | 8 +++ + poppler/Page.h | 4 ++ + poppler/Sound.cc | 65 +++++++++++++++++ + poppler/Sound.h | 46 ++++++++++++ + qt4/src/Makefile.am | 1 + + qt4/src/poppler-link.cc | 35 +++++++++ + qt4/src/poppler-link.h | 26 ++++++- + qt4/src/poppler-page.cc | 32 +++++++++ + qt4/src/poppler-qt4.h | 87 +++++++++++++++++++++++ + qt4/src/poppler-sound.cc | 177 + ++++++++++++++++++++++++++++++++++++++++++++++ + 14 files changed, 586 insertions(+), 1 deletion(-) + +commit 1da064d7e7403ec7111eecb2b9613e27a2c4bb5d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 30 16:28:35 2006 +0000 + + * qt4/src/poppler-page.cc: PA is optional, H is a name not a string + + ChangeLog | 4 ++++ + qt4/src/poppler-page.cc | 15 +++++++++------ + 2 files changed, 13 insertions(+), 6 deletions(-) + +commit 29366d8e470ab2207cdfdab115c2fa9618c4c74e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 25 20:43:18 2006 +0000 + + * glib/Makefile.am + * qt/Makefile.am + * qt4/src/Makefile.am + * qt4/tests/Makefile.am + * test/Makefile.am + * utils/Makefile.am: Add FONTCONFIG_CFLAGS FONTCONFIG_LIBS + for people + that need them. Patch by morfoh@opensde.org. Fixes bug #8415 + + ChangeLog | 10 ++++++++++ + glib/Makefile.am | 2 ++ + qt/Makefile.am | 6 ++++-- + qt4/src/Makefile.am | 2 ++ + qt4/tests/Makefile.am | 2 ++ + test/Makefile.am | 6 ++++-- + utils/Makefile.am | 6 ++++-- + 7 files changed, 28 insertions(+), 6 deletions(-) + +commit 957c1e59df213a01ca87f03d067a8dab5dc09fb6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 25 20:05:28 2006 +0000 + + ignore poppler-features.h + + glib/.cvsignore | 1 + + 1 file changed, 1 insertion(+) + +commit 3158b54375bdfdc82779362cc9442aade87f84f6 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Sep 22 00:55:54 2006 +0000 + + 2006-09-21 Kristian Høgsberg <krh@redhat.com> + + * NEWS: Update list of bugs fixes, release 0.5.4. + + ChangeLog | 2 ++ + NEWS | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 17dd1f60f9328ae68fbe262ae0745be976ff9f95 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Sep 21 23:28:14 2006 +0000 + + 2006-09-21 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Check for gtk+ 2.8 for the gtk+ test case, invert + help text for zlib option (#7788, #7661). + + ChangeLog | 3 +++ + configure.ac | 12 +++++------- + 2 files changed, 8 insertions(+), 7 deletions(-) + +commit ddbbd697424b9122ce1f0541ddada3fe8bb38fb1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Sep 21 22:58:31 2006 +0000 + + 2006-09-21 Kristian Høgsberg <krh@redhat.com> + + * utils/pdftops.cc: Get duplex setting from GlobalParams. + + ChangeLog | 2 ++ + utils/pdftops.cc | 3 ++- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 0d25592a1a5811ee8fffbd70307c7bcaaaacadf3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Sep 21 22:40:52 2006 +0000 + + 2006-09-21 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (_poppler_page_new): Make PopplerPage + reference its document throughout the lifetime of the page + (#7005). + + ChangeLog | 3 +++ + glib/poppler-page.cc | 5 ++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit b834755c7ae45eb4020e9cdbc3852eac0151fcdc +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Sep 21 22:37:00 2006 +0000 + + 2006-09-21 Kristian Høgsberg <krh@redhat.com> + + * poppler/Gfx.cc: Remove the right out->updateAll() call. + + ChangeLog | 4 ++++ + poppler/Gfx.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 181e2af1edf2cbc3c8edadad0dce215a64a990dd +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Sep 21 01:05:23 2006 +0000 + + 2006-09-20 Kristian Høgsberg <krh@redhat.com> + + * NEWS: Sum up changes. + + * configure.ac: Bump release to 0.5.4. + + ChangeLog | 4 ++++ + NEWS | 10 ++++++++++ + configure.ac | 2 +- + 3 files changed, 15 insertions(+), 1 deletion(-) + +commit cc9c17a6730422be99ebcd69991fcf5d7b569640 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Sep 21 00:56:33 2006 +0000 + + 2006-09-20 Kristian Høgsberg <krh@redhat.com> + + * poppler/Gfx.cc: Remove last remnant of erroneous type3 commit a + while back, fixing #8182. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 1 - + poppler/Gfx.cc | 1 - + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit 83be722b56d9266b89946fe994023351e47eb4fd +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Sep 20 20:22:19 2006 +0000 + + 2006-09-20 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/TextOutputDev.cc: TextFontInfo stores a copy of + a pointer + to a GfxFont but does not increment the reference count. Fix the + problem by calling incRefCnt and decRefCnt appropriately. Fixes + #4649 + + ChangeLog | 6 ++++++ + poppler/TextOutputDev.cc | 4 ++++ + 2 files changed, 10 insertions(+) + +commit 1cf60015d7d78668c83737be6015dc880fd04ebf +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Sep 19 04:39:07 2006 +0000 + + 2006-09-19 Kristian Høgsberg <krh@redhat.com> + + * poppler/GlobalParams.cc: Add scanEncodingDirs() to automatically + scan in any encodings found under ${datadir}/poppler. + + * m4/define-dir.m4: New file, adds AC_DEFINE_DIR macro. + + ChangeLog | 7 +++ + configure.ac | 16 +------ + goo/gfile.cc | 16 +++---- + goo/gfile.h | 2 + + m4/define-dir.m4 | 34 ++++++++++++++ + poppler/GlobalParams.cc | 116 + +++++++++++++++++++++++++++++++---------------- + poppler/GlobalParams.h | 7 ++- + 7 files changed, 136 insertions(+), 62 deletions(-) + +commit 821c883f9df9cc0e5b81aa2e070727996cf3bc4e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Sep 18 15:40:50 2006 +0000 + + 2006-09-13 Kristian Høgsberg <krh@redhat.com> + + * poppler/Makefile.am (libpoppler_la_LIBADD): Add cairo libs to + link if configured. + + ChangeLog | 3 +++ + poppler/Makefile.am | 4 ++++ + 2 files changed, 7 insertions(+) + +commit d8ab8ebc94c32d32ad17ed54cede453de25d7dd5 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Sep 13 20:25:03 2006 +0000 + + 2006-09-13 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Tighten glib check (#7906), add check for C++ + compiler (#8048). + + ChangeLog | 5 +++++ + configure.ac | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 7c748075e18cfe95be6a56adf09ce7f2f032b86f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 12 19:48:47 2006 +0000 + + sorry Jeff + + ChangeLog | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 6cdcfae0e1c6fbec07ee5273e6ad97ef04110868 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 11 21:20:56 2006 +0000 + + 2006-09-11 Albert Astals Cid <aacid@kde.org> + + * qt4/src/poppler-annotation.cc: + * qt4/src/poppler-annotation.h: + * qt4/src/poppler-page.cc: Add support for + LinkAnnotation. Patch by + Pino Toscano + + ChangeLog | 10 +- + qt4/src/poppler-annotation.cc | 230 + ++++++++++++++++++++++++++++++++++++++- + qt4/src/poppler-annotation.h | 22 +++- + qt4/src/poppler-page.cc | 237 + +++++++++++++++++++++++++---------------- + 4 files changed, 392 insertions(+), 107 deletions(-) + +commit 8335c7eea2aa62a580170f47323d8674bd89e412 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Fri Sep 8 23:28:22 2006 +0000 + + 2006-09-08 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: The work-around for 1x1 imagemasks + was not + calling cairo_set_source causing the rectangles to be drawn + the wrong + colour occasionally. Fix by moving the existing call to + cairo_set_source above the work-around. Fixes #7113. + + ChangeLog | 7 +++++++ + poppler/CairoOutputDev.cc | 8 ++++---- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit 02d505aa0176b6e5a54ee82426d8333a9ef8f000 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Sep 7 04:01:39 2006 +0000 + + 2006-09-06 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Avoid crashing in CairoOutputDev if + endString is called without a corresponding beginString. Fixes + #4515. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 8 +++++++- + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit 3ea0aada0434c9f815814253dd9d1374ae6643cc +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Sep 6 23:54:30 2006 +0000 + + 2006-09-06 Jeff Muizelaar <jeff@infidigm.net> + + * configure.ac: + * poppler/FlateStream.cc: + * poppler/FlateStream.h: Fix FlateStream to not read more than it + needs. This has a performance impact because our input buffer + is now + only 1 byte large, however correctness is better than performance. + This should fix #3948. + + ChangeLog | 9 +++++++++ + configure.ac | 2 +- + poppler/FlateStream.cc | 35 +++++++++++++++++++++++++---------- + poppler/FlateStream.h | 3 ++- + 4 files changed, 37 insertions(+), 12 deletions(-) + +commit 1d2e6aedca0b8fcce6ac84ae2576ab067912886b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Sep 5 01:21:50 2006 +0000 + + 2006-09-04 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Initialize currentFont to NULL before + use. Found by Pascal Terjan. Fixes #7924. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 1 + + 2 files changed, 6 insertions(+) + +commit 7905adaa21f2347346927fa567c64be60e2bc69c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 3 09:27:21 2006 +0000 + + * poppler/Dict.cc: + * poppler/Dict.h: + * poppler/Object.h: + * poppler/Parser.cc: Patch by Krzysztof Kowalczyk to increase + speed by + means of doing less copies between objects. See bug 8112 + for more + information. + + ChangeLog | 9 +++++++++ + poppler/Dict.cc | 4 ++-- + poppler/Dict.h | 11 +++++++++-- + poppler/Object.h | 12 ++++++++++++ + poppler/Parser.cc | 15 +++++++++------ + 5 files changed, 41 insertions(+), 10 deletions(-) + +commit 4da7c90a619002e54f436c4efee723b5bc42a112 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 24 22:32:31 2006 +0000 + + * qt4/src/poppler-private.h: Init m_fontInfoScanner to + NULL. Discovered by + Rafael Rodríguez <rafael.rodriguez.tf@gmail.com> + + ChangeLog | 5 +++++ + qt4/src/poppler-private.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 469202e117910beb4e0ad906d5c154a3bae5c98b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 16 14:35:14 2006 +0000 + + * qt/poppler-page.cc: Report correct page size. Backport from Qt4 + frontend. Patch by Wilfried Huss + + ChangeLog | 5 +++++ + qt/poppler-page.cc | 10 ++++++++-- + 2 files changed, 13 insertions(+), 2 deletions(-) + +commit b881844e4d31009c5d54c9321a6daaf0f354cf6b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 16 09:18:04 2006 +0000 + + did not want to commit that, thanks Brad for noticing! + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f52380e6d569280839d7c37362bd7cc59f2573c3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 15 22:27:31 2006 +0000 + + add a warning how nasty zlib can be, it can come and it your pdfs + and make your readers crash when you are not looking at it, so be + aware that if you enable it you are on your own ;-) + + ChangeLog | 4 ++++ + configure.ac | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 1caba84b1024f1fa7865deebbf70379855ce078d +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 11 13:12:11 2006 +0000 + + 2006-08-11 Albert Astals Cid <aacid@kde.org> + + * poppler/Catalog.cc: Fix leak + + ChangeLog | 4 ++++ + poppler/Catalog.cc | 1 + + 2 files changed, 5 insertions(+) + +commit 9b6455f6530e273afaa5f948b67ceeec8a06f976 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 10 16:08:51 2006 +0000 + + 2006-08-10 Albert Astals Cid <aacid@kde.org> + + * poppler/SplashOutputDev.cc: Try to fix refs to fonts + yet again + + ChangeLog | 4 ++++ + poppler/SplashOutputDev.cc | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 305f60e0437dcfc5babd449123a1fe4cd062a219 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 5 17:10:07 2006 +0000 + + 2006-08-05 Albert Astals Cid <aacid@kde.org> + + * poppler/Catalog.cc: The name array can contain references + to strings + instead of stings themselves, or at least PDF of + https://bugs.freedesktop.org/show_bug.cgi?id=7780 does. This + makes it + work with that file + * qt4/src/poppler-embeddedfile.cc: Use UGooString for + description + + ChangeLog | 8 ++++++++ + poppler/Catalog.cc | 12 ++++++++++-- + qt4/src/poppler-embeddedfile.cc | 3 ++- + 3 files changed, 20 insertions(+), 3 deletions(-) + +commit dd8758ea3f0f44e9f8362343f15b2064f428ad64 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 4 22:48:09 2006 +0000 + + 2006-08-05 Albert Astals Cid <aacid@kde.org> + + * utils/pdftotext.cc: + * utils/pdfinfo.cc: + * utils/pdffonts.cc: Add the posibility of reading a file + from stdin. + Patch by Dom Lachowicz + + ChangeLog | 7 +++++++ + utils/pdffonts.cc | 11 ++++++++++- + utils/pdfinfo.cc | 11 ++++++++++- + utils/pdftotext.cc | 11 ++++++++++- + 4 files changed, 37 insertions(+), 3 deletions(-) + +commit a418d844cf6baa797919796ceadaf21ef9b2e5b9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 3 10:34:52 2006 +0000 + + * configure.ac: Use the correct variable to output the + utils status. + Patch by Dom Lachowic + + ChangeLog | 5 +++++ + configure.ac | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 1673b895656143a8a1f1a45e07f777f39995940d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 30 20:31:31 2006 +0000 + + * poppler/GfxState.cc: make nGfxBlendModeNames define + return the + correct size of the gfxBlendModeNames array so it does + not access + invalid memory areas when the blend mode is not + found. Discovered by + Krzysztof Kowalczyk + + ChangeLog | 7 +++++++ + poppler/GfxState.cc | 12 +++++++----- + 2 files changed, 14 insertions(+), 5 deletions(-) + +commit e4561568d14e7b3b2aec6ecaf3cc09078bdf7a46 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 30 09:38:28 2006 +0000 + + * splash/SplashFontEngine.cc: + * poppler/SplashOutputDev.cc: Fix memory leak when using + embedded + fonts in the pdf file. Patch by Krzysztof Kowalczyk + + ChangeLog | 6 ++++++ + poppler/SplashOutputDev.cc | 8 ++++++-- + splash/SplashFontEngine.cc | 12 ++++++++---- + 3 files changed, 20 insertions(+), 6 deletions(-) + +commit 4a27502159a89992f54be2673b44bf7a8392b60d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jul 29 16:24:53 2006 +0000 + + push back thing i did not want to commit, sorry + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ba448afc0e97a9e779409ff228adcd4f627971f5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jul 29 16:22:52 2006 +0000 + + * configure.ac: Disable qt and qt4 frontends if splash + backend is + disabled + + ChangeLog | 5 +++++ + configure.ac | 18 ++++++++++++++---- + 2 files changed, 19 insertions(+), 4 deletions(-) + +commit 1e32d3baa5e8296caf55bd5853216a96618c74ac +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Jul 28 18:17:45 2006 +0000 + + 2006-07-28 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: Don't set font matrix translation + (fix from Behdad Esfahbod). + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 0bc1b0f35c28cb80dd27d24110367348e52c143b +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 27 18:21:28 2006 +0000 + + fix date, i don't live in the past + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2f27c3a0218608568f6cd1c718ef51b9879023a3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 27 18:17:50 2006 +0000 + + * poppler/Stream.cc: If you are going to test a variable, + better + initialize it first ;-) Fixes bug 7646 + + ChangeLog | 5 +++++ + poppler/Stream.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit f39ab43ca824cb7e5db73137c4545b3e85134425 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 26 18:16:01 2006 +0000 + + 2006-07-26 Albert Astals Cid <aacid@kde.org> + + * qt/poppler-document.cc: + * qt/poppler-private.h: + * qt/poppler-qt.h: Port the QDomDocument *Document::toc() + const method + from the qt4 frontend to the qt frontend. Patch by Wilfried + Huss + + ChangeLog | 7 ++++++ + qt/poppler-document.cc | 18 +++++++++++++++ + qt/poppler-private.h | 58 + ++++++++++++++++++++++++++++++++++++++++++++++++ + qt/poppler-qt.h | 16 +++++++++++++ + 4 files changed, 99 insertions(+) + +commit c3a9fd546b853c85b6be5fc8f4e5a78d8a7e7437 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 25 18:39:57 2006 +0000 + + * qt4/src/poppler-document.cc: Obey kdeprint masters in that + a library + should output as much device independent PS as posible, + so disabling + duplex printing for default is a good idea. + + ChangeLog | 6 ++++++ + qt4/src/poppler-document.cc | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit edc0499644b8083600ced9a5087ec0b0189e615b +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jul 24 19:49:51 2006 +0000 + + 2006-07-24 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: + * poppler/Makefile.am: Move fontconfig dependency to libpoppler. + + ChangeLog | 5 +++++ + configure.ac | 18 +++++++----------- + poppler/Makefile.am | 6 ++++-- + 3 files changed, 16 insertions(+), 13 deletions(-) + +commit 24b5a68a3f4cdba63fbcd01dc178a330b5f604a7 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jul 18 21:32:11 2006 +0000 + + 2006-07-18 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Gfx.cc: fix opCloseStroke to match the behaviour of + a separate opClose and opStroke. Previously, opCloseStroke only + closes if there is a path however opClose closes unconditionally. + + ChangeLog | 6 ++++++ + poppler/Gfx.cc | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit c57ebd40fcf85432b2e5045086d158a63af12525 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jul 18 21:26:57 2006 +0000 + + 2006-07-18 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/TextOutputDev.cc: call setDefaultCTM() after start page + like in Gfx.cc. This fixes a regression caused by the fix + to #6948. + + ChangeLog | 5 +++++ + poppler/TextOutputDev.cc | 1 + + 2 files changed, 6 insertions(+) + +commit 640d5d5a9d9e53f3f677eb05f3d18e6bfc74e95a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 16 18:22:23 2006 +0000 + + 2006-07-16 Albert Astals Cid <aacid@kde.org> + + * poppler/GfxState.cc: Do not crash when we can not + parse a GfxImageColorMap + Fixes crash on pdf that can be found at + + ChangeLog | 7 +++++++ + poppler/GfxState.cc | 4 ++++ + qt4/src/Doxyfile | 4 ++-- + 3 files changed, 13 insertions(+), 2 deletions(-) + +commit c6926d1d8ab04468f56f4687cdd3f06af206226b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 28 19:23:52 2006 +0000 + + * poppler/DCTStream.cc: + * poppler/DCTStream.h: Reset jpeg structures on reset. + Fixes crash while printing pdf at + http://bugs.kde.org/attachment.cgi?id=16818&action=view + + ChangeLog | 7 +++++++ + poppler/DCTStream.cc | 25 ++++++++++++++++++------- + poppler/DCTStream.h | 2 ++ + 3 files changed, 27 insertions(+), 7 deletions(-) + +commit 96ac8dec591a0325a822c1f7b7bc7e78b867e3a0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 25 16:59:31 2006 +0000 + + Ask for paper size width and height to pass it to PSOutputDev in + both qt frontends (qt got abi mantained, qt4 changed as you still + have to define UNSTABLE_POPPLER_QT4 to be able of using it, one day + we'll have to think of removing it) + + ChangeLog | 8 ++++++++ + qt/poppler-document.cc | 9 +++++++-- + qt/poppler-qt.h | 9 +++++++++ + qt4/src/poppler-document.cc | 4 ++-- + qt4/src/poppler-qt4.h | 10 +++++++++- + 5 files changed, 35 insertions(+), 5 deletions(-) + +commit 965011f2001fb1ea36857995d5555266f82b8d96 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 25 16:20:50 2006 +0000 + + put back a change that was not meant to be commited + + qt/poppler-qt.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4995d09c91173d34a435112828aff21a63b147e9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 25 16:19:32 2006 +0000 + + rename poppler-link.h to poppler-link-qt3.h to not get conflicts + on install + + qt/Makefile.am | 2 +- + qt/poppler-link-qt3.h | 188 +++++++++++++++++++++++++++++++++++ + qt/poppler-link.cc | 258 + +++++++++++++++++++++++++++++++++++++++++++++++++ + qt/poppler-qt.h | 4 +- + 4 files changed, 449 insertions(+), 3 deletions(-) + +commit 087921b134c2646e6d41960f471a1819c7c8790a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 25 10:29:22 2006 +0000 + + add link support to qt3 frontend. + Patch by Wilfried Huss based on Qt4 code + + ChangeLog | 11 ++++ + qt/Makefile.am | 4 +- + qt/poppler-document.cc | 19 ++++--- + qt/poppler-page.cc | 136 + +++++++++++++++++++++++++++++++++++++++++++++--- + qt/poppler-private.h | 33 +++++++++++- + qt/poppler-qt.h | 14 +++-- + 6 files changed, 196 insertions(+), 21 deletions(-) + +commit 831bd8942ef3224354b128d5e14e68fdfc57168b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 11 16:14:32 2006 +0000 + + optimization by Mario Teijeiro Otero + + poppler/UGooString.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1223fd4b200f6c13996f8299f3563c818af0c21d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 10 22:23:19 2006 +0000 + + * poppler/UGooString.cc: When any of the chars that we + are passing to the UGooString is not pdfencodable, do not + encode the string, because we loose information if we do, + this fixes rendering of + http://publikationen.ub.uni-frankfurt.de/volltexte/2005/890/pdf/TR_abs_g.pdf + and other docs with type3 fonts and ligatures + + ChangeLog | 9 +++++++++ + poppler/UGooString.cc | 8 ++++++++ + 2 files changed, 17 insertions(+) + +commit b85a39ddfc7de8c0621e995c114885ecd08fcdc2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 1 21:03:38 2006 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-page.cc: Add Rotation parameter that + is passed + to the respective output devs + + ChangeLog | 6 ++++++ + qt4/src/poppler-page.cc | 22 ++++++++++++++-------- + qt4/src/poppler-qt4.h | 14 +++++++++----- + 3 files changed, 29 insertions(+), 13 deletions(-) + +commit 2b5d3277f36864ff1ef44f1942f22de247d67ab6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 1 17:23:45 2006 +0000 + + * qt/poppler-document.cc: + * qt/poppler-qt.h: Add printing support, patch by + Stefan Kebekus <stefan.kebekus@math.uni-koeln.de> + + ChangeLog | 6 ++++++ + qt/poppler-document.cc | 18 ++++++++++++++++++ + qt/poppler-qt.h | 2 ++ + 3 files changed, 26 insertions(+) + +commit 5380d005b7b54cc6587ce6e8c3bbb358da5cd9a5 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Jun 1 06:42:25 2006 +0000 + + 2006-06-01 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/PSOutputDev.cc: + * poppler/PSOutputDev.h: Change filename parameter to PSOutputDev + constructor from char * to const char *. + + ChangeLog | 6 ++++++ + poppler/PSOutputDev.cc | 2 +- + poppler/PSOutputDev.h | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit c2a81ea8b01f3943a2eb737cf957acc0d05f7eed +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 31 20:14:04 2006 +0000 + + * poppler/SplashOutputDev.cc: + * splash/Splash.cc: Fix no splashModeRGB8Qt mode, that is, + make it + show images + + I'm sorry, really, i'll try to do better + + ChangeLog | 6 ++++++ + poppler/SplashOutputDev.cc | 10 ++++++++++ + splash/Splash.cc | 3 +++ + 3 files changed, 19 insertions(+) + +commit 643b310cf51474b6dfc077fe086ea121e807f6e1 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed May 31 19:18:28 2006 +0000 + + 2006-05-31 Jeff Muizelaar <jeff@infidigm.net> + + * TODO: Remove items's from my list that are done. + + ChangeLog | 4 ++++ + TODO | 3 --- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 96e582721dcb15ea258b989c7c500084bff9f56d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed May 31 17:31:49 2006 +0000 + + 2006-05-31 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Change the cairo backend to use the + transformation in cairo instead of doing all of the + transformations in + the OutputDevice. Fixes #6948. + + ChangeLog | 7 ++ + poppler/CairoOutputDev.cc | 200 + ++++++++++++++++++++------------------------- + poppler/CairoOutputDev.h | 1 + + 3 files changed, 96 insertions(+), 112 deletions(-) + +commit 00ffb9bf50b6b3b2e8eaa8af593aaa01d4a62a34 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 31 04:53:27 2006 +0000 + + 2006-05-31 Kristian Høgsberg <krh@redhat.com> + + * NEWS: Sum up changes. + + * configure.ac: Bump release to 0.5.3. + + ChangeLog | 6 ++++++ + NEWS | 8 ++++++++ + configure.ac | 2 +- + 3 files changed, 15 insertions(+), 1 deletion(-) + +commit 223a4bf3a679f666b6c963a8787cf5b5ac75c4b6 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 31 02:02:54 2006 +0000 + + 2006-05-30 Kristian Høgsberg <krh@redhat.com> + + * poppler-glib.pc.in: + * configure.ac: Add poppler as a private requires if pkg-config + supports it. + + ChangeLog | 6 ++++++ + configure.ac | 11 +++++++++++ + poppler-glib.pc.in | 3 ++- + 3 files changed, 19 insertions(+), 1 deletion(-) + +commit 7aaa4d3fbdb8ea2534d3cb80e68b2759b2e8fd2f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 30 21:46:06 2006 +0000 + + 2006-05-30 Kristian Høgsberg <krh@redhat.com> + + * test/gtk-cairo-test.cc: Add --page option to gtk-cairo-test. + + ChangeLog | 4 ++++ + test/gtk-cairo-test.cc | 21 ++++++++++++++++++--- + 2 files changed, 22 insertions(+), 3 deletions(-) + +commit f7c1d519b9695ad8adfdcf3af696de746cdcf375 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon May 29 18:44:17 2006 +0000 + + 2006-05-29 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoFontEngine.cc: + * poppler/CairoFontEngine.h: + * poppler/CairoOutputDev.cc: Allow CairoFont creation to fail more + gracefully. Fixes #4030. + + ChangeLog | 7 +++++++ + poppler/CairoFontEngine.cc | 27 +++++++++++++++++++++------ + poppler/CairoFontEngine.h | 4 +++- + poppler/CairoOutputDev.cc | 5 +++++ + 4 files changed, 36 insertions(+), 7 deletions(-) + +commit 84861800dad3649d4757d5c5539b9e86e2b2c644 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat May 27 17:27:37 2006 +0000 + + 2006-05-27 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Back out the rest of krh's type3 + font work. This fixes type3 fonts in CairoOutputDevice. + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.cc | 3 +++ + poppler/CairoOutputDev.h | 2 +- + 3 files changed, 10 insertions(+), 1 deletion(-) + +commit 6f5a89a0a2cf17d45d1c31ce105829be8c7ac456 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 23 20:49:16 2006 +0000 + + * poppler/SplashOutputDev.cc: + * qt4/src/poppler-private.h: + * splash/Splash.cc: + * splash/SplashBitmap.cc: + * splash/SplashTypes.h: bring splashModeRGB8 back to the + old code + (before Frank's patch), create splashModeRGB8Qt that has + Frank's + codepath and is used by Qt frontends. Fixes corruption on + other programs expecting the old behaviour. + + Remember dude we are now a lib! you can not change behaviour from + one day to another! + + /me hits himself + + ChangeLog | 11 +++ + poppler/SplashOutputDev.cc | 8 +++ + qt/poppler-private.h | 2 +- + qt4/src/poppler-private.h | 2 +- + splash/Splash.cc | 169 + ++++++++++++++++++++++++++++++++++++++++++++ + splash/SplashBitmap.cc | 26 ++++++- + splash/SplashTypes.h | 2 + + 7 files changed, 216 insertions(+), 4 deletions(-) + +commit 495d592c3ba7fe81e03774f5b2ed677e5aa560c7 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 23 19:16:37 2006 +0000 + + 2006-05-23 Kristian Høgsberg <krh@redhat.com> + + * qt4/src/Makefile.am (libpoppler_qt4_la_SOURCES): Add missing + + ChangeLog | 5 +++++ + qt4/src/Makefile.am | 1 + + 2 files changed, 6 insertions(+) + +commit eecd06c86585bca05c99cd2e9a1b1ff3bbae3c72 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 22 20:19:35 2006 +0000 + + 2006-05-22 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Bump release. + * NEWS: Sum up changes. + + ChangeLog | 5 +++++ + NEWS | 11 ++++++++++- + configure.ac | 2 +- + 3 files changed, 16 insertions(+), 2 deletions(-) + +commit 680f20dfd1cf0342d49516b3848a2aef5d2a3883 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 22 19:58:41 2006 +0000 + + 2006-05-22 Kristian Høgsberg <krh@redhat.com> + + Patch from Rainer Keller to fix the ImageOutputDev (#6984). + + * utils/ImageOutputDev.cc (drawImage): Upate to work with new + 16-bit color representation. + + * utils/ImageOutputDev.h: Return gTrue for needNonText(). + + ChangeLog | 9 +++++++++ + NEWS | 4 ++++ + utils/ImageOutputDev.cc | 6 +++--- + utils/ImageOutputDev.h | 2 +- + 4 files changed, 17 insertions(+), 4 deletions(-) + +commit e43a06bf6e953fa9af18476e2c9f27106398c09c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun May 21 23:26:45 2006 +0000 + + 2006-05-21 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: + * poppler/CairoFontEngine.h: Back out type3 font work committed by + accident. + + ChangeLog | 6 + + poppler/CairoFontEngine.cc | 347 + +++++--------------------------------------- + poppler/CairoFontEngine.h | 17 +-- + 3 files changed, 47 insertions(+), 323 deletions(-) + +commit 7d4bb0533f88f06449ebd64c1220d0b75001937d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 21 18:14:15 2006 +0000 + + fix all is blue issue on ppc machines + + ChangeLog | 7 +++++++ + qt/poppler-page.cc | 17 +++++++++++++++++ + qt4/src/poppler-page.cc | 17 +++++++++++++++++ + 3 files changed, 41 insertions(+) + +commit 655af1e0126ca96d75c9c718d7d8f928c898b1f6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 21 17:19:53 2006 +0000 + + hope to fix really Kouhei's name now + + ChangeLog | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit cc783a1ebe868ff75db5472775dabe0020ae501f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 21 11:54:30 2006 +0000 + + Fix Kouhei name + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4b6ad3bb873a6f334934921e6d56e9d26e06a9a +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:55:49 2006 +0000 + + Add bug number to ChangeLog entry. + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 46f5f070cceb2c0f3b53537c8e33340b9f1bba38 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:26:03 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-action.h: + * glib/poppler-action.cc: Add poppler_dest_get_type(), patch from + Kouhei Souto (#6907). + + ChangeLog | 4 ++++ + glib/poppler-action.cc | 13 +++++++++++++ + glib/poppler-action.h | 4 ++++ + 3 files changed, 21 insertions(+) + +commit 875dc5b112dfe2d4a48a7567b1ff79257447cc0d +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:21:35 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * poppler-glib.pc.in (Requires): Add gdk-2.0 dependency, from + Kouhei Souto (#6896). + + ChangeLog | 3 +++ + poppler-glib.pc.in | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit b66dda2640c088bbe205f698a0c4028144027922 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:19:21 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.h (POPPLER_TYPE_INDEX_ITER) + (POPPLER_TYPE_FONTS_ITER): Add these macros, patch from Kouhei + Souto (#6897). + + ChangeLog | 4 ++++ + glib/poppler-document.h | 2 ++ + 2 files changed, 6 insertions(+) + +commit 095730456c0d8312067af10dd55a3b9165a83736 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:16:25 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * glib/Makefile.am (INCLUDES): Add define for G_LOG_DOMAIN, from + Kouhei Souto (#6899). + + ChangeLog | 3 +++ + glib/Makefile.am | 1 + + 2 files changed, 4 insertions(+) + +commit b8d77633899c1dec5f3b9c9a0f075f39afa98965 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:12:38 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc (poppler_document_save): Memleak patch + from Paolo Borelli (#6908). + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 2 ++ + 2 files changed, 7 insertions(+) + +commit 488f77298fee9eebbca5983c1c9fb186b3b67aa3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 22:04:17 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * TextOutputDev.h: + * TextOutputDev.cc: + * UnicodeTypeTable.h: + * UnicodeTypeTable.cc: + * UnicodeCClassTables.h: + * UnicodeCompTables.h: + * UnicodeDecompTables.h: + * gen-unicode-tables.py: Patch from Ed Catmur (#2929) to convert + search string and document text to unicode NFKC (compatibility + composition) before matching so ligatures match correctly. + + ChangeLog | 13 + + poppler/Makefile.am | 5 + + poppler/TextOutputDev.cc | 41 +- + poppler/TextOutputDev.h | 3 + + poppler/UnicodeCClassTables.h | 1827 +++++++++ + poppler/UnicodeCompTables.h | 665 ++++ + poppler/UnicodeDecompTables.h | 8526 + +++++++++++++++++++++++++++++++++++++++++ + poppler/UnicodeTypeTable.cc | 235 ++ + poppler/UnicodeTypeTable.h | 3 + + 9 files changed, 11303 insertions(+), 15 deletions(-) + +commit ecb942e54a1ab0f7eded91b7d1278f0ac62e2071 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 21:42:54 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_prepare_output_dev): Fix the + rotation bug for real. + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 16 +++++++++------- + 2 files changed, 14 insertions(+), 7 deletions(-) + +commit 28ae789afe0625a641525e4a0768d51fa8bd667c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 20:54:13 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + Patch from Kouhei Sutou (#6905). + + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-private.h: + * glib/reference/tmpl/poppler-private.sgml: + * glib/reference/tmpl/poppler.sgml: Make PopplerPSOutput a proper + glib object. + + ChangeLog | 11 +++++++ + glib/poppler-document.cc | 51 + ++++++++++++++++++++++++------ + glib/poppler-document.h | 4 +++ + glib/poppler-private.h | 2 ++ + glib/reference/tmpl/poppler-private.sgml | 1 + + glib/reference/tmpl/poppler.sgml | 1 + + 6 files changed, 61 insertions(+), 9 deletions(-) + +commit 02cf7fd7df0b2d8c2b1c6f108e581bc1c7a973b1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 20:35:43 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_prepare_output_dev): Fix + rotation bug (#6913, #6926). + + ChangeLog | 3 +++ + glib/poppler-page.cc | 12 +++++++++++- + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit 78ae3efd9541d7b63ff5a2c4de3fde300806688f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 19:21:59 2006 +0000 + + 2006-05-19 Kristian Høgsberg <krh@redhat.com> + + Memory leak patch from Carlos Garcia Campos (#6947). + + * glib/poppler-action.cc: + * glib/poppler-document.cc: + * glib/poppler-page.cc: + * poppler/CairoFontEngine.cc: + * poppler/CairoFontEngine.h: + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: + * poppler/Gfx.cc: + * poppler/TextOutputDev.cc: Fix various memory leaks. + + ChangeLog | 14 ++ + glib/poppler-action.cc | 9 +- + glib/poppler-document.cc | 31 +++- + glib/poppler-page.cc | 2 + + poppler/CairoFontEngine.cc | 347 + +++++++++++++++++++++++++++++++++++++++----- + poppler/CairoFontEngine.h | 17 ++- + poppler/CairoOutputDev.cc | 5 +- + poppler/CairoOutputDev.h | 2 +- + poppler/Gfx.cc | 1 + + poppler/TextOutputDev.cc | 9 ++ + 10 files changed, 381 insertions(+), 56 deletions(-) + +commit 354c1926b7181fd668f221e1d672974e04fda747 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 19 17:24:19 2006 +0000 + + * qt4/src/poppler-link.cc: Patch by Pino Toscano, ensure the + splashoutput is created when parsing the TOC. + + ChangeLog | 5 +++++ + qt4/src/poppler-link.cc | 5 +++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 3c9a5f37704781c9a51e72edd18451870452b9a7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 14 16:11:54 2006 +0000 + + * poppler/FontInfo.cc: Fix possible crash, half patch + by Kouhei Sutou <kou@cozmixng.org> + + ChangeLog | 5 +++++ + poppler/FontInfo.cc | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 436f578fe762e8ceccce95a0f2003406527dde64 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 13 16:01:57 2006 +0000 + + * poppler/GfxState.cc: + * poppler/GfxState.h: Fix memleak, patch by + Carlos Garcia Campos <carlosgc@gnome.org> + + ChangeLog | 6 ++++++ + poppler/GfxState.cc | 8 ++++++++ + poppler/GfxState.h | 3 +-- + 3 files changed, 15 insertions(+), 2 deletions(-) + +commit 906515769097f2e38f6b2c2aff598919b9d1ee0d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 13 15:58:37 2006 +0000 + + * qt4/src/poppler-document.cc: leak-- + * qt4/src/poppler-private.h: Refcount globalparams + * qt4/tests/test-poppler-qt4.cpp: Some leaks less + + ChangeLog | 6 ++++++ + qt4/src/poppler-document.cc | 10 +++++----- + qt4/src/poppler-private.h | 8 ++++++++ + qt4/tests/test-poppler-qt4.cpp | 6 ++++-- + 4 files changed, 23 insertions(+), 7 deletions(-) + +commit 46fd63c44369c882d8dac473d4156001d9d4ed18 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 13 11:14:24 2006 +0000 + + numbers for easier casting + + qt4/src/poppler-link.h | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 35500375e3f790c444ab7e7d0a687d270c5a66b1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 12 21:02:01 2006 +0000 + + fixing compile problems for some people + + qt4/src/poppler-page.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 181f09829cf4831965059e3064114d83348c51b5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 12 20:40:05 2006 +0000 + + * qt4/src/Makefile.am + * qt4/src/poppler-annotation-helper.h + * qt4/src/poppler-annotation.cc + * qt4/src/poppler-annotation.h + * qt4/src/poppler-link.cc + * qt4/src/poppler-link.h + * qt4/src/poppler-page.cc + * qt4/src/poppler-qt4.h: Code for annotations stripped + from oKular, + it's all based on Enrico's work, so ask him for details, + the problem + is that he left KDE development a while ago. + + ChangeLog | 14 + + qt4/src/Makefile.am | 2 + + qt4/src/poppler-annotation-helper.h | 213 ++++++++++ + qt4/src/poppler-annotation.cc | 792 + +++++++++++++++++++++++++++++++++++ + qt4/src/poppler-annotation.h | 257 ++++++++++++ + qt4/src/poppler-link.cc | 4 +- + qt4/src/poppler-link.h | 2 +- + qt4/src/poppler-page.cc | 691 ++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 8 +- + 9 files changed, 1980 insertions(+), 3 deletions(-) + +commit 3a48e89dfbe54af73a68ed8e917938f14ad17f01 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 9 20:07:06 2006 +0000 + + * qt4/src/Makefile.am: + * qt4/src/poppler-document.cc: + * qt4/src/poppler-link.cc: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: Adding links extraction code, + should work as + it is basically stripped out from kpdf, but comments are + obviously welcome as always + + ChangeLog | 10 +++ + qt4/src/Makefile.am | 1 + + qt4/src/poppler-document.cc | 13 +--- + qt4/src/poppler-link.cc | 129 +++++++++++++++++++++++++++++-- + qt4/src/poppler-link.h | 178 + +++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-page.cc | 139 +++++++++++++++++++++++++++++---- + qt4/src/poppler-private.h | 9 ++- + qt4/src/poppler-qt4.h | 56 +++----------- + 8 files changed, 456 insertions(+), 79 deletions(-) + +commit f628e1506e576a8553a9699c1d7f05ef55c24fa2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 8 19:03:51 2006 +0000 + + memleak-- by carlos + + ChangeLog | 5 +++++ + poppler/Catalog.cc | 5 ++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 1fce6266564583d356817a21f43c6b1ad8ce3716 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat May 6 10:57:07 2006 +0000 + + fix code, i suck + + qt4/src/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit be913b90d59da35a347498b86fdd3edb065aef23 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 5 20:51:01 2006 +0000 + + * poppler/Function.cc: quick fix for KDE bug #126760 + + Better solutions are of course accepted + + ChangeLog | 4 ++++ + poppler/Function.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 2b085293bd73b4e77da848b3fe63a7e82e9ba5e5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 4 19:10:55 2006 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-page.cc: Implement search functionality + + more code to make oKular qt4popplered possible, probably not most + quickest code around, feel free to comment/optimize + + ChangeLog | 5 +++++ + qt4/src/poppler-page.cc | 43 + +++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 16 ++++++++++++++++ + 3 files changed, 64 insertions(+) + +commit a9b0c7977aba7bc85a8673c7f95187ff17ee4173 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 2 04:38:39 2006 +0000 + + 2006-05-02 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * poppler/Gfx.cc: + * poppler/GfxFont.cc: + * poppler/GfxFont.h: + * poppler/GfxState.cc: + * poppler/TextOutputDev.cc: Patch from Gary Coady to add reference + counting to GfxFont so we don't crash on text selection. + + ChangeLog | 10 ++++++++++ + glib/poppler-page.cc | 2 +- + poppler/Gfx.cc | 2 ++ + poppler/GfxFont.cc | 14 +++++++++++++- + poppler/GfxFont.h | 4 ++++ + poppler/GfxState.cc | 7 +++++++ + poppler/TextOutputDev.cc | 1 + + 7 files changed, 38 insertions(+), 2 deletions(-) + +commit 57af0207334ff1a407899370281ebb90fe953a32 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 1 18:33:47 2006 +0000 + + * qt4/src/poppler-page.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-textbox.cc: Add nextWord(), hasSpaceAfter() + and + edge() to TextBox + + More things to make poppler-qt4Okular nearer + + ChangeLog | 8 ++++++++ + qt4/src/poppler-page.cc | 14 ++++++++++++++ + qt4/src/poppler-private.h | 11 +++++++++++ + qt4/src/poppler-qt4.h | 8 ++++++++ + qt4/src/poppler-textbox.cc | 23 ++++++++++++++++------- + 5 files changed, 57 insertions(+), 7 deletions(-) + +commit 61b126390f764fd38c79b6a64160a7dc7870bd4a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 1 13:41:14 2006 +0000 + + revert thing that should not have gone in + + poppler/PageLabelInfo.cc | 43 + +++++++++++++++++++++++++++++++++++++++++++ + poppler/PageLabelInfo.h | 44 + -------------------------------------------- + 2 files changed, 43 insertions(+), 44 deletions(-) + +commit f2424ef63e86d82b2be277e2b268b48aae29601e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 1 13:32:31 2006 +0000 + + * qt4/src/poppler-document.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: Add the possibility of setting + the paper + color + + One step more to make oKular fully use the qt4 bindings + + ChangeLog | 7 +++++++ + poppler/PageLabelInfo.cc | 43 + ------------------------------------------ + poppler/PageLabelInfo.h | 44 + +++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-document.cc | 10 ++++++++++ + qt4/src/poppler-private.h | 22 +++++++++++++++++----- + qt4/src/poppler-qt4.h | 6 ++++++ + 6 files changed, 84 insertions(+), 48 deletions(-) + +commit 4147400e2b692df7f70c3772e8a4b576d4d85294 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 29 15:23:41 2006 +0000 + + Fix memory leak. Bug 6765 + + ChangeLog | 5 +++++ + poppler/JBIG2Stream.cc | 1 + + 2 files changed, 6 insertions(+) + +commit 960d60467d62d28f20b127d07e8de1af42eec568 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Apr 27 17:26:36 2006 +0000 + + 2006-04-27 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: delete imgStr if some of the cairo + functions fail. Fixes coverty reports #2106, #2107, #2077 and + bug #6764. Patch by Kjartan Maraas. + + ChangeLog | 6 ++++++ + poppler/CairoOutputDev.cc | 34 +++++++++++++++++++++++++--------- + 2 files changed, 31 insertions(+), 9 deletions(-) + +commit 155112131c6e25bfde752cf5daa80a6c9712cfed +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 23 15:50:52 2006 +0000 + + qt4/src/poppler-private.h: Protect us against a link not having + a destination or a namedDestination + + ChangeLog | 5 +++++ + qt4/src/poppler-private.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit c902a3a22bcceedc8ee8ca377064efcc8a9178ca +Author: Brad Hards <bradh@frogmouth.net> +Date: Fri Apr 21 12:02:19 2006 +0000 + + Add another path to search for Qt4 libs and includes. + + CCMAIL: montel@kde.org + + m4/qt.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 18f8e1f1d213dbcda27cd0ec429273801f65e208 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 18 19:11:56 2006 +0000 + + * goo/GooVector.h: Fix typo that was preventing build with MSVC8 + Discovered by Reece Dunn <msclrhd@hotmail.com> + + ChangeLog | 5 +++++ + goo/GooVector.h | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit cbbb28a5959343d20dffe945ea83272c0b2e287b +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Apr 16 22:59:44 2006 +0000 + + 2006-04-16 Carlos Garcia Campos <carlosgc@gnome.org> + + * glib/poppler-action.cc: + * glib/poppler-action.h: + * glib/poppler-private.h: + * glib/poppler.h: + Add support for named destinations and named actions. + + * glib/poppler-document.cc: + * glib/poppler-document.h: + Allow to find named destinations in document. + + ChangeLog | 12 +++ + glib/poppler-action.cc | 152 + ++++++++++++++++++++++++----- + glib/poppler-action.h | 7 +- + glib/poppler-document.cc | 37 +++++++ + glib/poppler-document.h | 4 +- + glib/poppler-private.h | 2 + + glib/poppler.h | 1 + + glib/reference/tmpl/poppler-action.sgml | 2 + + glib/reference/tmpl/poppler-document.sgml | 4 - + 9 files changed, 189 insertions(+), 32 deletions(-) + +commit 85687a1e0e4c6be2dbfb23ba00018b9c7c7454f5 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 12 06:52:07 2006 +0000 + + 2006-04-12 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Add support for masked images to + the cairo + backend. CairoOutputDevice really should have been refactored + before + committing this, but the results were so pretty I couldn't resist. + Fixes #6174. + + ChangeLog | 8 +++ + poppler/CairoOutputDev.cc | 118 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 8 +++ + 3 files changed, 134 insertions(+) + +commit 6039d4fc65cb25bef20efa29bc29d42086fc0854 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 12 05:46:44 2006 +0000 + + 2006-04-12 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Fix breakage by krh by only calling + cairo_destroy on non-null. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 4 +++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit d839a0bd78361930e5e2fe889df12e1e853ffed3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Apr 12 02:07:07 2006 +0000 + + 2006-04-11 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: + * poppler-glib.pc.in: + * glib/Makefile.am: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler.h: + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: + * glib/poppler-features.h.in: + Make the CairoOutputDev render to a cairo_t instead of a + cairo_surface_t and expose that functionality in the glib wrapper + (poppler_page_render). + + * test/Makefile.am: + * test/gtk-cairo-test.cc: + Update gtk-cairo-test to use this new interface and add a spin + button for changing page (#5951). + + * utils/Makefile.am (EXTRA_DIST): Fix warning where this was + assigned twice. + + ChangeLog | 23 ++++ + configure.ac | 8 ++ + glib/Makefile.am | 10 +- + glib/poppler-features.h.in | 24 ++++ + glib/poppler-page.cc | 63 +++++++--- + glib/poppler-page.h | 10 ++ + glib/poppler.h | 1 + + poppler-glib.pc.in | 2 +- + poppler/CairoOutputDev.cc | 23 ++-- + poppler/CairoOutputDev.h | 6 +- + test/Makefile.am | 4 +- + test/gtk-cairo-test.cc | 286 + +++++++++++++------------------------------- + utils/Makefile.am | 6 +- + 13 files changed, 221 insertions(+), 245 deletions(-) + +commit b198c9801c668014c0979c57033a0637e7e046e2 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Apr 10 18:12:44 2006 +0000 + + 2006-04-10 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: take originX and originY into + account in + drawChar() to draw vertical text properly. Fixes #6551. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit fd251f52efc7748fda91cc77fb9d3966e0f02ac8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 9 11:05:51 2006 +0000 + + m4/qt.m4: Improve for systems that need -pthread to be linked when + linking Qt. Patch by Diego Pettenò + + ChangeLog | 5 +++++ + m4/qt.m4 | 28 +++++++++++++++++++++++++++- + 2 files changed, 32 insertions(+), 1 deletion(-) + +commit 36de9747153a2ea9b3cf86c41e75a521441a2e06 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 8 10:44:43 2006 +0000 + + * poppler/Makefile.am: + * qt4/src/Makefile.am: Don't link Qt4 in libpoppler when using + Qt4 frontend + Patch by Stefan Schweizer + + ChangeLog | 6 ++++++ + poppler/Makefile.am | 11 +++++------ + qt4/src/Makefile.am | 1 + + 3 files changed, 12 insertions(+), 6 deletions(-) + +commit bf7afe161d76c50fd1c480eb236607145782e59d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 5 18:20:56 2006 +0000 + + poppler/JBIG2Stream.cc: Fix for some buggy JBIG2 documents, patch + by Raj Kumar and Paul Walmsley. Fixes bug 6500 + + ChangeLog | 5 +++++ + poppler/JBIG2Stream.cc | 43 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 48 insertions(+) + +commit 315f8e488d3db848f88a06c7568b6583bbf0e432 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 5 17:20:56 2006 +0000 + + 2006-04-05 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: use a separate matrix for the + softmask. + fixes #6492. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 11 ++++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 0d311518f678a479c1efeaec15011e0a34de80fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 4 21:01:01 2006 +0000 + + * splash/Splash.cc: + * splash/SplashBitmap.cc: Make Splashbitmap RGB8 use 32bits + internally + * qt/poppler-page.cc: + * qt4/src/poppler-page.cc: Adapt to splashbitmap change so + copying to + QImage is faster. + Patch by Frank Meerkötter slightly modified by Albert + Astals Cid + + I'll leave adapting the glib frontend for you guys, i tried to adapt + it but i got lost at gdk_pixbuf_get_n_channels (pixbuf); + + ChangeLog | 9 ++++++ + qt/poppler-page.cc | 18 ++++------- + qt4/src/poppler-page.cc | 15 ++++----- + splash/Splash.cc | 81 + ++++++++++++++++++++++++----------------------- + splash/SplashBitmap.cc | 10 +++--- + 5 files changed, 67 insertions(+), 66 deletions(-) + +commit 888bd41b42507f0a1af55c55495d31d802ce7706 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Apr 4 20:42:08 2006 +0000 + + Fix crash when using fixedpoint math. Patch by Frank Meerkoetter + + ChangeLog | 5 +++++ + splash/SplashFTFont.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 56c98450160b639790931226a045ce4712e7d45e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 2 18:07:59 2006 +0000 + + Improvements to the Qt4 frontend, comments welcome + + ChangeLog | 7 +++ + m4/qt.m4 | 4 +- + qt4/src/Makefile.am | 1 + + qt4/src/poppler-document.cc | 85 ++++++++++++++++++++------ + qt4/src/poppler-link.cc | 138 + +++++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-page.cc | 9 ++- + qt4/src/poppler-private.h | 95 ++++++++++++++++++++++++++++- + qt4/src/poppler-qt4.h | 86 ++++++++++++++++++++++++--- + 8 files changed, 395 insertions(+), 30 deletions(-) + +commit c80ebf237e9c6232a1d0567a2688a294acfd481b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 1 11:25:57 2006 +0000 + + Fix bug 6454 + + ChangeLog | 5 +++++ + poppler/XRef.cc | 22 +++++++++++++--------- + 2 files changed, 18 insertions(+), 9 deletions(-) + +commit fe8142fbc12127682b8024673fe1af57b47bb5c9 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Mar 21 04:25:53 2006 +0000 + + 2006-03-20 Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-page.cc: Avoid strdup in poppler_page_get_property + and + make code cleaner. Combined with the memleak fix closes #6187. + Patch by chpe. + + ChangeLog | 6 ++++++ + glib/poppler-page.cc | 5 +---- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 4f961df2e6e91a0dc0a024ae5acdefa394179a05 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Mar 21 04:19:18 2006 +0000 + + 2006-03-20 Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-page.cc: Fix memory leak in poppler_page_get_text + Patch by chpe. + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit ff4febab0a519732972c21bf76d7693c98265e0f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 20 20:07:36 2006 +0000 + + Use UGooString for dates, fixes KDE bug 123938 + + ChangeLog | 6 ++++++ + qt/poppler-document.cc | 2 +- + qt4/src/poppler-document.cc | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 75ac6de8cd651b1cbe2d6a7ffa4574097088041f +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Mar 20 19:12:29 2006 +0000 + + 2006-03-20 Carlos Garcia Campos <calosgc@gnome.org> + + reviewed by: Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-document.cc: Fix memory leak in + poppler_font_info_free + + ChangeLog | 6 ++++++ + glib/poppler-document.cc | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 784f6d9a0888dab34c586ffe14db8e55b8a11f51 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Mar 20 19:02:10 2006 +0000 + + 2006-03-20 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoFontEngine.h: remove unused variables + + ChangeLog | 4 ++++ + poppler/CairoFontEngine.h | 1 - + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 847436779d7c82b428acfd6339130228bfadca24 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 19 19:19:42 2006 +0000 + + fix date + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 401bae69cc7ade676cacd89b483f0a93a653c7a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 19 17:01:05 2006 +0000 + + fix htmloutputdev + + ChangeLog | 4 ++++ + utils/HtmlOutputDev.cc | 2 +- + utils/HtmlOutputDev.h | 2 +- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit d56330e688c0a40b4e206ed3bbddd06d7f3ee66c +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 16 22:04:56 2006 +0000 + + * poppler/Page.cc: Remove a #ifdef that was never defined + (nice to + have so sucky W args), probably came from gpdf (it's not + on xpdf + sources) and was causing bugs 6079 and 6167 + + Might be worth backporting to the stable branch + + ChangeLog | 8 +++++++- + poppler/Page.cc | 2 -- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 7ed6737b00ece7ca00cee1d148752b11700370e6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 16 19:21:11 2006 +0000 + + poppler/FontInfo.cc: Embedded fonts don't have a font file + + ChangeLog | 4 ++++ + poppler/FontInfo.cc | 20 ++++++++++++-------- + 2 files changed, 16 insertions(+), 8 deletions(-) + +commit a34688ee29e1cdfcbaca232cf005af55af87f796 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 14 19:34:10 2006 +0000 + + * qt4/src/poppler-qt4.h: Fix compilation with gcc4.1, patch by + Michael Olbrich + + ChangeLog | 5 +++++ + qt4/src/poppler-qt4.h | 10 +++++----- + 2 files changed, 10 insertions(+), 5 deletions(-) + +commit 1a90b3aaf6be4ca3ebb47e904842b1e14a0e8dfc +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 11 15:19:02 2006 +0000 + + * poppler/FontInfo.cc: + * poppler/FontInfo.h: Add getFile() function that returns + the path of the font that is beign used in the system to + represent that font + * qt4/src/poppler-document.cc: + * qt4/src/poppler-fontinfo.cc: + * qt4/src/poppler-private.h: + * qt4/src/poppler-qt4.h: Add the file() function + * qt4/tests/poppler-fonts.cpp: Show the path of the font + used to represent each font + + May be interesting to have in the other frontends + + ChangeLog | 13 +++++++++++++ + poppler/FontInfo.cc | 10 ++++++++++ + poppler/FontInfo.h | 2 ++ + qt4/src/poppler-document.cc | 14 +------------- + qt4/src/poppler-fontinfo.cc | 29 +++++++++-------------------- + qt4/src/poppler-private.h | 29 +++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 8 ++++++-- + qt4/tests/poppler-fonts.cpp | 5 +++-- + 8 files changed, 73 insertions(+), 37 deletions(-) + +commit 22b1618185ec70895ec644d9e590c266ff98c9db +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 9 21:56:07 2006 +0000 + + Build with cairo disabled, patch by Eduardo de Barros Lima + + ChangeLog | 5 +++++ + glib/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 50ecfadab36a9769b09e4c2c1670d86448a0e1ee +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Feb 28 23:24:59 2006 +0000 + + 2006-02-28 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Bump release to 0.5.1. + + * NEWS: Sum up 0.5.1 changes so far. + + * TextOutputDev.h: add getters for a couple of attributes. + + * glib/Makefile.am: + * poppler/Makefile.am: Move cairo link dependency to glib + bindings. + + ChangeLog | 11 +++++++++++ + NEWS | 10 ++++++++++ + configure.ac | 2 +- + glib/Makefile.am | 11 ++++++----- + poppler/Makefile.am | 19 ++++++++----------- + poppler/TextOutputDev.h | 7 +++++-- + qt/Makefile.am | 1 + + test/Makefile.am | 16 +++++++++------- + utils/Makefile.am | 29 +++++++++++++++++------------ + 9 files changed, 68 insertions(+), 38 deletions(-) + +commit b9e951ac68b9977ab7217ad0346bcf46a3fa3dfe +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Feb 28 19:59:58 2006 +0000 + + 2006-02-28 Kristian Høgsberg <krh@redhat.com> + + * goo/gmem.c: (gmalloc), (grealloc): + * poppler/JBIG2Stream.cc: + * poppler/Stream.cc: + * poppler/Stream.h: + * splash/SplashXPathScanner.cc: + + More integer overflow fixes from Derek Noonburg (#5922). + + ChangeLog | 10 ++++++++++ + goo/gmem.c | 9 +++++---- + poppler/JBIG2Stream.cc | 12 ++++++++++-- + poppler/Stream.cc | 7 +++++++ + poppler/Stream.h | 2 +- + 5 files changed, 33 insertions(+), 7 deletions(-) + +commit 46db73a142d65a0c944910388d5971debc06ecbf +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Feb 28 18:31:59 2006 +0000 + + 2006-02-28 Kristian Høgsberg <krh@redhat.com> + + * poppler/PSOutputDev.cc: Make PSOutputDev constructor respect + passed in paper size (#5946, #5749). + + ChangeLog | 5 +++++ + poppler/PSOutputDev.cc | 14 ++++++++------ + 2 files changed, 13 insertions(+), 6 deletions(-) + +commit 0f7f2182b2abe965b382937f5569b65a8828fc93 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Feb 28 18:25:00 2006 +0000 + + 2006-02-28 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc (info_dict_get_string): Refactor + _popper_goo_string_to_utf8() out into it's own function. + + * glib/poppler-page.cc (poppler_page_get_property): Use + _popper_goo_string_to_utf8() here to convert ucs2 page labels. + + * glib/poppler-page.cc (poppler_page_get_selection_region): + Add + braces to fix warning. + + * poppler/PageLabelInfo.cc: If the label prefix string has + a ucs2 + marker, append the number part of the label as ucs2 (#5952). + + ChangeLog | 14 +++ + glib/poppler-document.cc | 52 +++++------ + glib/poppler-page.cc | 23 +++-- + glib/poppler-private.h | 3 + + glib/reference/tmpl/poppler-enums.sgml | 150 + ------------------------------- + glib/reference/tmpl/poppler-unused.sgml | 130 + +++++++++++++++++++++++++++ + glib/test-poppler-glib.c | 2 +- + goo/GooString.cc | 5 ++ + goo/GooString.h | 4 + + poppler/PageLabelInfo.cc | 39 +++++--- + poppler/PageLabelInfo.h | 2 +- + 11 files changed, 228 insertions(+), 196 deletions(-) + +commit 1bf83cdc8b75e1c76956ae643ee273e0b558fd08 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 25 12:30:30 2006 +0000 + + fix warning + + ChangeLog | 4 ++++ + poppler/Object.cc | 3 ++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit eb5642f396c8772c83b2cf27da437413b692c952 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 23 22:26:05 2006 +0000 + + Don't build pdftoppm when splashoutput is disabled as it does not link + + ChangeLog | 5 +++++ + utils/Makefile.am | 13 +++++++++++-- + 2 files changed, 16 insertions(+), 2 deletions(-) + +commit 7c5c1361045429a429a6f40d936f8c7c01fe0d07 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Feb 18 20:17:00 2006 +0000 + + 2006-02-18 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: + * poppler/GfxState.cc: + * poppler/GfxState.h: Add support for drawSoftMaskedImage to + CairoOutputDev. Ugly but works. + + ChangeLog | 8 ++++ + poppler/CairoOutputDev.cc | 101 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 6 +++ + poppler/GfxState.cc | 50 ++++++++++++++++++++++ + poppler/GfxState.h | 2 + + 5 files changed, 167 insertions(+) + +commit dcb748f68112bd5f99fea8a3da06666be6cff0c5 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Feb 16 19:41:17 2006 +0000 + + 2006-02-16 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Work around cairo bug when scaling + 1x1 bitmaps. Fixes #3387. Also gives a performance improvement. + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 33 ++++++++++++++++++++++++--------- + 2 files changed, 29 insertions(+), 9 deletions(-) + +commit ef1070f6ca2d1e74c5f94728f3aaae22f0990c17 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 16 19:28:54 2006 +0000 + + Update soname + + ChangeLog | 8 ++++++++ + glib/Makefile.am | 2 ++ + poppler/Makefile.am | 2 ++ + qt/Makefile.am | 2 ++ + qt4/src/Makefile.am | 2 ++ + 5 files changed, 16 insertions(+) + +commit 24b9f5c33fb00ff80a79b34444282a57288f636c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 13 23:04:54 2006 +0000 + + * poppler/ArthurOutputDev.cc: Make it compile after changing code + so we did not pass files to freetype but buffers + + ChangeLog | 5 +++++ + poppler/ArthurOutputDev.cc | 53 + ++++++++++++++++---------------------------- + 2 files changed, 24 insertions(+), 34 deletions(-) + +commit 0bda90310b267d3a4963096293eb2bd29b120768 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 13 22:38:44 2006 +0000 + + Probably the last of inner patches missing from kpdf + Everybody will we happy now, kpdf has been finally assimilated + + ChangeLog | 5 ++ + poppler/PSOutputDev.cc | 124 + ++++++++++++++++++++++++++++++++++++++++++++---- + poppler/PSOutputDev.h | 4 +- + 3 files changed, 123 insertions(+), 10 deletions(-) + +commit cf9867fbbee2468a955b5845016585eeedf2debe +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 6 20:49:21 2006 +0000 + + Various fixes from Frank Meerkötter to enable fixedpoint arithmetic + + ChangeLog | 8 ++++++++ + configure.ac | 2 +- + goo/FixedPoint.h | 2 +- + splash/Splash.cc | 4 ++-- + splash/SplashTypes.h | 2 +- + 5 files changed, 13 insertions(+), 5 deletions(-) + +commit f04e2c4f20f821ff8cb9465a715ccbb22091d449 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 6 18:50:10 2006 +0000 + + Jeff Muizelaar's improvements to my yesterday's small patches + + ChangeLog | 6 ++++++ + poppler/Annot.cc | 9 ++++----- + poppler/JBIG2Stream.cc | 2 +- + 3 files changed, 11 insertions(+), 6 deletions(-) + +commit 33e98f81cdfda0935ac7ea79a691976465ec790b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 5 15:46:10 2006 +0000 + + Some small fixes from kpdf + + ChangeLog | 8 ++++++++ + poppler/Gfx.cc | 1 + + poppler/GfxFont.cc | 1 + + poppler/JBIG2Stream.cc | 2 +- + poppler/SplashOutputDev.cc | 1 - + 5 files changed, 11 insertions(+), 2 deletions(-) + +commit 6d9e6489d24b3105204ff4233f6493136e9b5715 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Feb 4 21:10:41 2006 +0000 + + 2006-02-04 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Gfx.cc: + * poppler/OutputDev.cc: + * poppler/OutputDev.h: Let output devices know about pdf grouping + operators. + Patch by Thorkild Stray. + + ChangeLog | 8 ++++++++ + poppler/Gfx.cc | 14 ++++++++++++++ + poppler/OutputDev.cc | 16 ++++++++++++++++ + poppler/OutputDev.h | 10 ++++++++++ + 4 files changed, 48 insertions(+) + +commit b4e34d905cd0ca5815a450de35b4c2774f4887c9 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Feb 4 20:48:25 2006 +0000 + + 2006-02-04 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GlobalParams.cc: Check all fonts returned by fontconfig. + Discard the ones that are not truetype or type1. Fixes #5758. + Patch by Ed Catmur. + + ChangeLog | 6 ++++++ + poppler/GlobalParams.cc | 51 + ++++++++++++++++++++++++++--------------------- + 2 files changed, 34 insertions(+), 23 deletions(-) + +commit fd85a0afdd7b4cafc68df400d4f94fccaea18c76 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 4 20:34:13 2006 +0000 + + Remove bug from "do not use an external file to pass fonts to + Freetype" patch, patch by Stefan Schweizer + + ChangeLog | 3 +++ + poppler/SplashOutputDev.cc | 14 ++++++++++---- + 2 files changed, 13 insertions(+), 4 deletions(-) + +commit 67ca9d01f8badcf542f60b23521c384c9840ca1b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 4 20:31:00 2006 +0000 + + Added a DTD of the xml pdftohtml creates patch by Stefan Schweizer + + ChangeLog | 2 ++ + utils/Makefile.am | 2 ++ + utils/pdf2xml.dtd | 28 ++++++++++++++++++++++++++++ + 3 files changed, 32 insertions(+) + +commit f4df23ca7f396883a906f16dfc8db1ebd528e04a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 4 20:24:03 2006 +0000 + + ignore++ + + utils/.cvsignore | 1 + + 1 file changed, 1 insertion(+) + +commit 93ad488679f594e45547a67e2a7397f4c8bd2820 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 4 20:07:07 2006 +0000 + + Actually create pdftoppm patch by Stefan Schweizer + + ChangeLog | 44 +++++++++++++++++++++++++------------------- + utils/Makefile.am | 10 ++++++++-- + utils/pdftoppm.cc | 9 +++++---- + 3 files changed, 38 insertions(+), 25 deletions(-) + +commit 7d2be955e6345a052590b06b29a6d2fb2111e2e6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 2 23:06:20 2006 +0000 + + CVE-2006-0301 fix by Derek though KDE security team + + ChangeLog | 5 +++++ + splash/SplashXPathScanner.cc | 32 ++++++++++++++++++++------------ + 2 files changed, 25 insertions(+), 12 deletions(-) + +commit c191e7d0f13ea429017e4d4f79ce803e84c72e40 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 2 22:54:27 2006 +0000 + + i should learn on which day i live + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1ddeed60d07c3a7e011f3f594fa9299379d0b000 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 2 22:50:01 2006 +0000 + + don't use files to pass fonts to freetype + + ChangeLog | 26 ++++++++++++ + fofi/FoFiTrueType.cc | 43 +++++++++++++++---- + fofi/FoFiTrueType.h | 7 ++-- + fofi/FoFiType1C.h | 2 +- + goo/gfile.cc | 8 ++++ + poppler/GfxFont.cc | 49 +++++++++++++++++++++- + poppler/GfxFont.h | 2 + + poppler/GlobalParams.cc | 1 + + poppler/GlobalParams.h | 1 + + poppler/SplashOutputDev.cc | 94 + +++++++++++++++++++++--------------------- + splash/SplashFTFontEngine.cc | 44 +++++++++++++------- + splash/SplashFTFontEngine.h | 16 ++++--- + splash/SplashFTFontFile.cc | 47 +++++++++++++-------- + splash/SplashFTFontFile.h | 18 ++++---- + splash/SplashFontEngine.cc | 46 ++++++++------------- + splash/SplashFontEngine.h | 16 ++++--- + splash/SplashFontFile.cc | 70 +++++++++++++++++++++++++++---- + splash/SplashFontFile.h | 25 +++++++++-- + splash/SplashT1FontEngine.cc | 29 +++++++------ + splash/SplashT1FontFile.cc | 30 +++++++++++--- + splash/SplashT1FontFile.h | 4 +- + 21 files changed, 396 insertions(+), 182 deletions(-) + +commit 34df4cfa5cd8788ccf2ea698cbedd05b209041f5 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Feb 1 03:52:12 2006 +0000 + + 2006-01-31 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GlobalParams.cc (GlobalParams::getDisplayFont): + Allow ttc fonts to be used. + + ChangeLog | 5 +++++ + poppler/GlobalParams.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 0184e7c928ec60c0aa3f8634d96ae0cf0ad6d157 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jan 29 05:16:31 2006 +0000 + + 2006-01-28 Jeff Muizelaar <jeff@infidigm.net> + + * glib/poppler-attachment.h: fix compile by adding <time.h> + include. + Acked-by: Jonathan Blanford <jrb@redhat.com> + + ChangeLog | 5 +++++ + glib/poppler-attachment.h | 1 + + 2 files changed, 6 insertions(+) + +commit c805e25f2f074640e4345f8b71eef8d7de677109 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jan 26 19:25:07 2006 +0000 + + 2006-01-26 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: Patch from Christian Krause; + handle + 0-width lines (#5545). + + ChangeLog | 5 +++++ + poppler/CairoOutputDev.cc | 6 +++++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 4f48abcd4c21460d4c5b718a7ba18cdceb30c2d1 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Tue Jan 24 06:21:39 2006 +0000 + + Tue Jan 24 01:19:40 2006 Jonathan Blandford <jrb@redhat.com> + + * glib/Makefile.am: + * glib/poppler-attachment.cc: + * glib/poppler-attachment.h: + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-page.cc: + * glib/poppler-private.h: + * glib/poppler.h: + * glib/test-poppler-glib.c: + * glib/reference/tmpl/poppler-enums.sgml: + * glib/reference/tmpl/poppler-unused.sgml: glib bindings + for the + embedded file support. It doesn't support mtime and + ctime yet, + but the rest works. + + ChangeLog | 16 +++ + glib/Makefile.am | 2 + + glib/poppler-attachment.cc | 223 + +++++++++++++++++++++++++++++++ + glib/poppler-attachment.h | 67 ++++++++++ + glib/poppler-document.cc | 63 +++++++++ + glib/poppler-document.h | 6 + + glib/poppler-page.cc | 2 +- + glib/poppler-private.h | 6 +- + glib/poppler.h | 1 + + glib/reference/tmpl/poppler-enums.sgml | 150 +++++++++++++++++++++ + glib/reference/tmpl/poppler-unused.sgml | 130 ------------------ + glib/test-poppler-glib.c | 26 +++- + 12 files changed, 559 insertions(+), 133 deletions(-) + +commit 052bf4b80c8a0dc45f6222617bfd8ae1b9c40410 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jan 23 18:52:48 2006 +0000 + + 2006-01-23 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: + * poppler/GlobalParams.cc: + * poppler/poppler-config.h.in: + * utils/pdftohtml.cc: + * utils/pdftops.cc: Respect command line paper size settings + (#5641). + Drop the built-in paper sizes. + + ChangeLog | 9 +++++++++ + configure.ac | 1 - + poppler/GlobalParams.cc | 23 ++--------------------- + poppler/poppler-config.h.in | 5 ----- + utils/pdftohtml.cc | 4 +--- + utils/pdftops.cc | 4 +++- + 6 files changed, 15 insertions(+), 31 deletions(-) + +commit fb2054a5031d60aac3ccc9a36b3ed88a32188e33 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jan 23 15:40:54 2006 +0000 + + 2006-01-23 Kristian Høgsberg <krh@redhat.com> + + * glib/test-poppler-glib.c (print_document_info, print_index): + Move variable declarations to top (#5692). + + * utils/*.cc: Move config.h #include to top of #include's + (#5693). + + ChangeLog | 5 +++++ + glib/test-poppler-glib.c | 5 +++-- + poppler/FontInfo.cc | 2 +- + utils/HtmlOutputDev.cc | 2 +- + utils/ImageOutputDev.cc | 2 +- + utils/pdffonts.cc | 2 +- + utils/pdfimages.cc | 2 +- + utils/pdfinfo.cc | 2 +- + utils/pdftohtml.cc | 4 ++-- + utils/pdftoppm.cc | 2 +- + utils/pdftops.cc | 2 +- + utils/pdftotext.cc | 2 +- + 12 files changed, 19 insertions(+), 13 deletions(-) + +commit 836af3529e827e25f20cb4710cbbf9ed0371a42c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jan 23 14:45:30 2006 +0000 + + 2006-01-23 Kristian Høgsberg <krh@redhat.com> + + * splash/SplashFTFont.cc: Don't use deprecated freetype + include + files. + + ChangeLog | 5 +++++ + splash/SplashFTFont.cc | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 60e13bf84e4f020a264811e4a5bf85d67e15d6df +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Jan 21 21:56:40 2006 +0000 + + 2006-01-21 Jeff Muizelaar <jeff@infidigm.net> + + * TODO: Add my todo list. + + ChangeLog | 4 ++++ + TODO | 10 ++++++++++ + 2 files changed, 14 insertions(+) + +commit cebba06563d1b691a8bbb83828e47c9cc91e231a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 18 22:40:26 2006 +0000 + + ok, ok, lasts files, i promise :-/ + + qt4/tests/check_attachments.cpp | 151 + +++++++++++++++++++++++++++++++++++++ + qt4/tests/poppler-attachments.cpp | 37 +++++++++ + 2 files changed, 188 insertions(+) + +commit 0b12e7cce6c6633b1d07e2902a9fa13ff52079e7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 18 22:38:59 2006 +0000 + + YAMF = Yet Another Missing File + + qt4/src/poppler-embeddedfile.cc | 106 + +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 106 insertions(+) + +commit 38c8f3a53b3eb2be1fbfa360f77285037d89b719 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 18 22:36:01 2006 +0000 + + as usual i foget some files + + poppler/UGooString.cc | 86 + +++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/UGooString.h | 55 +++++++++++++++++++++++++++++++ + 2 files changed, 141 insertions(+) + +commit ad6e7d862c8fa6e10a7dbbb3391cbb0b6c922375 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 18 22:32:13 2006 +0000 + + Brad patch for embedded document extraction, only has Qt4 bindings + for now, needs Qt3 and glib work + + ChangeLog | 42 +++++++++++++ + glib/poppler-action.cc | 2 +- + glib/poppler-document.cc | 1 + + poppler/Annot.cc | 1 + + poppler/Catalog.cc | 133 + ++++++++++++++++++++++++++++++++++++++--- + poppler/Catalog.h | 60 +++++++++++++++++-- + poppler/Dict.cc | 17 +++--- + poppler/Dict.h | 15 ++--- + poppler/FontInfo.cc | 1 + + poppler/Function.cc | 1 + + poppler/Gfx.cc | 1 + + poppler/GfxFont.cc | 5 +- + poppler/GfxState.cc | 1 + + poppler/Link.cc | 9 +-- + poppler/Link.h | 9 +-- + poppler/Makefile.am | 2 + + poppler/Object.h | 17 +++--- + poppler/Outline.cc | 1 + + poppler/PDFDoc.cc | 1 + + poppler/PDFDoc.h | 2 +- + poppler/PSOutputDev.cc | 5 +- + poppler/Page.cc | 1 + + poppler/PageLabelInfo.cc | 1 + + poppler/Parser.cc | 2 + + poppler/SecurityHandler.cc | 1 + + poppler/Stream.cc | 1 + + poppler/XRef.cc | 1 + + qt/poppler-document.cc | 1 + + qt/poppler-page-transition.cc | 1 + + qt4/src/Makefile.am | 1 + + qt4/src/poppler-document.cc | 26 +++++++- + qt4/src/poppler-private.h | 2 + + qt4/src/poppler-qt4.h | 68 +++++++++++++++++++++ + qt4/tests/.cvsignore | 2 + + qt4/tests/Makefile.am | 16 ++++- + utils/HtmlOutputDev.cc | 1 + + utils/pdffonts.cc | 1 + + utils/pdfinfo.cc | 1 + + utils/pdftohtml.cc | 1 + + utils/pdftotext.cc | 1 + + 40 files changed, 401 insertions(+), 54 deletions(-) + +commit 550fb0b617ece7951ec39aec5fa5504cc90022fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 18 21:22:12 2006 +0000 + + Add some more documentation to PageTransition, patch by Stefan Kebekus + + ChangeLog | 6 ++++++ + qt/poppler-page-transition.h | 40 + +++++++++++++++++++++++++++++++++------- + qt4/src/Doxyfile | 2 +- + 3 files changed, 40 insertions(+), 8 deletions(-) + +commit d66f3647ff1c38318d4cd056cb4d4c7a32eb6603 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 18 18:54:12 2006 +0000 + + poppler/CharCodeToUnicode.cc: Fix check for length that was not + having into account that there could be \n or \r in tokens + an that + those do not have to be took into account. Fixes + http://bugs.kde.org/show_bug.cgi?id=120310 + + ChangeLog | 9 ++++++++- + poppler/CharCodeToUnicode.cc | 31 +++++++++++++++++++++++++++---- + 2 files changed, 35 insertions(+), 5 deletions(-) + +commit d78b670339c8f92a32ab5f0a574d0e21690806f8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 17 21:35:31 2006 +0000 + + When doing the parsing check with XREF we did not grow too much. Fixes + serialata10a.pdf + + ChangeLog | 10 ++++++++++ + poppler/Lexer.cc | 22 +++++++++++++++++++--- + poppler/Lexer.h | 8 +++++--- + poppler/Parser.cc | 6 +++--- + poppler/Parser.h | 2 +- + poppler/XRef.cc | 17 +++++++++++++++++ + poppler/XRef.h | 3 +++ + 7 files changed, 58 insertions(+), 10 deletions(-) + +commit f5db636af0cd6e05cd7ede37a8585001d51192a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 17 20:33:08 2006 +0000 + + i suck + i suck + i suck + i suck + i suck + A file i forgot to add to make it compile :-/ + + qt/poppler-page-transition-private.h | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit 9cc97908ea67ab431e58129f589e00f41f40a143 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Jan 12 23:54:08 2006 +0000 + + 2006-01-12 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/GlobalParams.cc: Make buildFcPattern() static. + + ChangeLog | 4 ++++ + poppler/GlobalParams.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit c7ce134fb1dadb46e2b3773d0976ea31da0a046f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jan 11 16:52:58 2006 +0000 + + 2006-01-11 Kristian Høgsberg <krh@redhat.com> + + * poppler/JBIG2Stream.cc: + * poppler/Stream.cc: Merge patch to fix CVE-2005-3624, + CVE-2005-3625 and CVE-2005-3627 issues. + + ChangeLog | 6 ++++++ + poppler/JBIG2Stream.cc | 32 +++++++++++++++++++++++++++++++- + poppler/Stream.cc | 8 +++++--- + 3 files changed, 42 insertions(+), 4 deletions(-) + +commit ec7fb41725c19bc7f2aad1073fe6397ea0a8da0d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 10 21:57:28 2006 +0000 + + * configure.ac: + * m4/qt.m4: Fix bugs created when splitting the code from + configure.ac, take QTDIR into account when looking for + QtTestLib and + do not die if it is not found as it is not mandatory + * qt/poppler-page-transition.cc: + * qt/poppler-page.cc: + * qt/poppler-private.h: + * qt4/tests/Makefile.am: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-page.cc: + * qt4/src/Makefile.am: Fix mess created my the moving and + renaming of + PageTransition.cc + + ChangeLog | 15 +++++++++++++++ + configure.ac | 14 ++++---------- + m4/qt.m4 | 5 +++++ + qt/poppler-page-transition.cc | 2 +- + qt/poppler-page.cc | 1 + + qt/poppler-private.h | 5 ----- + qt4/src/Makefile.am | 1 + + qt4/src/poppler-page.cc | 2 +- + qt4/src/poppler-qt4.h | 2 +- + qt4/tests/Makefile.am | 1 + + 10 files changed, 30 insertions(+), 18 deletions(-) + +commit d9bc53a741b3bbd2a202662c66fe70f49ac72a49 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jan 10 17:59:51 2006 +0000 + + 2006-01-10 Kristian Høgsberg <krh@redhat.com> + + * splash/Makefile.am: Only install splash headers if + --enable-xpdf-headers is given. + + * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Set this here. + + ChangeLog | 7 +++++++ + Makefile.am | 1 + + splash/Makefile.am | 4 ++++ + 3 files changed, 12 insertions(+) + +commit ea6d9b97cec6fabf8a5005c565bbdb378bed7f54 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jan 10 17:55:59 2006 +0000 + + 2006-01-10 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: + Fix the following fixme in CairoOutputDevice. + + // FIXME: This is quite right yet, we need to accumulate all + // glyphs within one text object before we clip. Right now this + // just add this one string. + + The fix uses a strategy similar to the one the Splash backend. + textClipPath is used to store the appended path from each call to + endString(). The accumulated path is clipped in endTextObject. + + ChangeLog | 14 ++++++++++++++ + poppler/CairoOutputDev.cc | 27 +++++++++++++++++++++++---- + poppler/CairoOutputDev.h | 1 + + 3 files changed, 38 insertions(+), 4 deletions(-) + +commit 9e8a655a2bd3ca8cff1a150dce0dd378aeca047b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jan 8 22:59:48 2006 +0000 + + 2006-01-08 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Don't try and load type3 fonts + (#4030). + + ChangeLog | 6 +++++- + poppler/CairoOutputDev.cc | 5 ++++- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit 25fd8e1ea87c41855a4ee702fbe47f5661a54c22 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jan 8 22:51:17 2006 +0000 + + 2006-01-08 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Page.cc: use colToByte for reading thumbnails (#5420). + + Patch by Nickolay V. Shmyrev. + + ChangeLog | 6 ++++++ + poppler/Page.cc | 6 +++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit df73ee2ec4b65ccf611f0fd76fb456cc797693d4 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Jan 7 06:10:15 2006 +0000 + + 2006-01-07 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/CairoOutputDev.cc: Initialize (fill|stroke)_opacity. + + ChangeLog | 4 ++++ + poppler/CairoOutputDev.cc | 2 ++ + 2 files changed, 6 insertions(+) + +commit 18eb8de66749082e4aa65cc6d369a533826fab33 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Jan 6 10:05:58 2006 +0000 + + 2006-01-06 Kristian Høgsberg <krh@redhat.com> + + * qt/poppler-page.cc: + * qt/poppler-private.h: + * qt/poppler-qt.h: + * qt4/src/Makefile.am: + * qt/Makefile.am: + * poppler/Makefile.am: Move PageTransition to qt bindings, + move + contents from Private.h to qt/poppler-private.h. + + * poppler/TextOutputDev.cc (visitWord): Remove #warning. + + * utils/Makefile.am (pdfimages_SOURCES): Add ImageOutputDev.h, + use + dist_man1_MANS so we actually dist the man pages. + + * goo/Makefile.am (poppler_goo_include_HEADERS): Add + GooVector.h. + + * glib/reference/Makefile.am: DOC_SOURCE_DIR must be + relative to + $(srcdir), fix this to make distchek run. + + * m4/qt.m4: + * m4/libjpeg.m4: + * acinclude.m4: + * configure.ac: Split out Qt and libjpeg checks from + configure.ac + and acinclude.m4 to m4/qt.m4 and m4/libjpeg.m4. + + ChangeLog | 26 ++++ + acinclude.m4 | 112 ---------------- + configure.ac | 223 + +++---------------------------- + glib/reference/Makefile.am | 2 +- + glib/reference/tmpl/poppler-enums.sgml | 150 --------------------- + glib/reference/tmpl/poppler-unused.sgml | 130 ++++++++++++++++++ + goo/Makefile.am | 1 + + m4/libjpeg.m4 | 109 +++++++++++++++ + m4/qt.m4 | 206 + ++++++++++++++++++++++++++++ + poppler/Makefile.am | 1 - + poppler/PageTransition.h | 118 ---------------- + poppler/Private.h | 30 ----- + poppler/TextOutputDev.cc | 2 - + qt/Makefile.am | 8 +- + qt/poppler-page-transition.cc | 187 ++++++++++++++++++++++++++ + qt/poppler-page-transition.h | 117 ++++++++++++++++ + qt/poppler-page.cc | 1 - + qt/poppler-private.h | 9 +- + qt/poppler-qt.h | 2 +- + qt4/src/Makefile.am | 8 +- + utils/Makefile.am | 54 ++++++-- + 21 files changed, 857 insertions(+), 639 deletions(-) + +commit 93921e77115ebe4d527f98675e438de485e84507 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 5 23:53:33 2006 +0000 + + * poppler/DCTStream.cc: Fix handling of malformed jpeg streams like + the one at http://bugs.kde.org/show_bug.cgi?id=119569 + + Might be worth backporting to 0.4.x + + ChangeLog | 5 +++++ + poppler/DCTStream.cc | 26 ++++++++++++++++---------- + 2 files changed, 21 insertions(+), 10 deletions(-) + +commit 0dc16af02071350a0dc11af4106799378c99cdad +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 5 13:53:58 2006 +0000 + + Introduce variants of renderTo that return a QImage and do not use + a QPixmap so threading is possible. + + ChangeLog | 8 +++++++ + qt/poppler-page.cc | 18 ++++++++++----- + qt/poppler-qt.h | 30 ++++++++++++++++++++---- + qt4/src/poppler-page.cc | 9 +++++++- + qt4/src/poppler-qt4.h | 59 + +++++++++++++++++++++++++---------------------- + 5 files changed, 85 insertions(+), 39 deletions(-) + +commit 5c2cbf5d327c6cc75c073b56c3ab1748c0d24387 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 2 14:24:31 2006 +0000 + + Use error() instead std::cerr in PageTranstion.cc + + ChangeLog | 4 ++++ + poppler/PageTransition.cc | 5 +++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit da5a4233498b56df611e1c7bca0090306cb5dbe0 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Mon Jan 2 00:06:45 2006 +0000 + + Sun Jan 1 18:50:51 2006 Jonathan Blandford <jrb@redhat.com> + + * Makefile.am: + * autogen.sh: + * configure.ac: + * gtk-doc.make: + * glib/Makefile.am: enable gtk-doc support. + + ChangeLog | 8 +++ + Makefile.am | 2 + + autogen.sh | 14 +++++ + configure.ac | 4 ++ + glib/Makefile.am | 1 + + gtk-doc.make | 153 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + m4/gtk-doc.m4 | 53 +++++++++++++++++++ + 7 files changed, 235 insertions(+) + +commit 372c34cc9728d7041bc4f6893c0bae50c9501c50 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 1 22:35:48 2006 +0000 + + * qt4/src/poppler-private.h: + * qt4/src/poppler-page.cc: + * qt4/src/poppler-document.cc: Don't create a SplashOutputDev + for + every splashRenderToPixmap + + ChangeLog | 4 ++++ + qt4/src/poppler-document.cc | 1 - + qt4/src/poppler-page.cc | 18 +++++------------- + qt4/src/poppler-private.h | 24 +++++++++++++++++++++++- + 4 files changed, 32 insertions(+), 15 deletions(-) + +commit 6ff83474ac594368015334db9c6b33d3a552079f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 1 22:18:47 2006 +0000 + + * qt/poppler-page.cc: + * qt/poppler-private.h: Don't create a SplashOutputDev for every + renderToPixmap. + + ChangeLog | 6 ++++++ + qt/poppler-page.cc | 8 +------- + qt/poppler-private.h | 24 +++++++++++++++++++++++- + 3 files changed, 30 insertions(+), 8 deletions(-) + +commit 6942646d4c82327a80b021838a38aa55c1026883 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Sun Jan 1 20:34:36 2006 +0000 + + Sun Jan 1 15:32:08 2006 Jonathan Blandford <jrb@redhat.com> + + * glib/reference/*: More gtk-doc work. Not enabled for + building + by default, but filled in. + + .cvsignore | 1 + + ChangeLog | 5 + + glib/reference/.cvsignore | 18 ++ + glib/reference/Makefile.am | 87 +++++++ + glib/reference/poppler-docs.sgml | 17 ++ + glib/reference/poppler-sections.txt | 151 +++++++++++ + glib/reference/poppler.types | 4 + + glib/reference/tmpl/poppler-action.sgml | 172 +++++++++++++ + glib/reference/tmpl/poppler-document.sgml | 354 + ++++++++++++++++++++++++++ + glib/reference/tmpl/poppler-enums.sgml | 169 ++++++++++++ + glib/reference/tmpl/poppler-page.sgml | 243 ++++++++++++++++++ + glib/reference/tmpl/poppler-private.sgml | 128 ++++++++++ + glib/reference/tmpl/poppler.sgml | 216 ++++++++++++++++ + glib/reference/tmpl/stamp-poppler-enums.sgml | 19 ++ + 14 files changed, 1584 insertions(+) + +commit 0fab1b711f153859e113cb3b6d734ddcb58fb87a +Author: Jonathan Blandford <jrb@redhat.com> +Date: Sat Dec 31 02:10:33 2005 +0000 + + Fri Dec 30 21:08:33 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/*{cc,h}: Update inline doc comments. This is in + preparation for gtk-doc support. + + ChangeLog | 5 ++ + glib/poppler-action.cc | 14 +++++ + glib/poppler-action.h | 2 - + glib/poppler-document.cc | 151 + +++++++++++++++++++++++++++++++++++++++++++++- + glib/poppler-document.h | 4 +- + glib/poppler-page.cc | 28 +++++++++ + glib/poppler.cc | 16 +++++ + glib/test-poppler-glib.c | 29 +++++++++ + 8 files changed, 243 insertions(+), 6 deletions(-) + +commit 313530036b204eaa5ddfa150730302e855560d6a +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 30 22:54:46 2005 +0000 + + A delete that slipped from the last patch-commit + + qt4/src/poppler-page.cc | 1 + + 1 file changed, 1 insertion(+) + +commit cf6f8123af19aca4200b58a454652f68ce8132e2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 30 22:31:32 2005 +0000 + + Puting PageTransition implementation into poppler "core", both Qt + and Qt4 frontends use it. + + poppler/Makefile.am | 1 + + poppler/PageTransition.cc | 188 + +++++++++++++++++++++++++++++++++++++++++++++ + poppler/PageTransition.h | 118 ++++++++++++++++++++++++++++ + poppler/Private.h | 30 ++++++++ + qt/Makefile.am | 2 +- + qt/poppler-page.cc | 111 +------------------------- + qt/poppler-qt.h | 72 +---------------- + qt4/src/Makefile.am | 2 +- + qt4/src/poppler-page.cc | 17 +++- + qt4/src/poppler-qt4.h | 14 +++- + 10 files changed, 374 insertions(+), 181 deletions(-) + +commit 56035ab199ac6deb5c1e07e745d120d1121a5960 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 30 21:59:58 2005 +0000 + + * utils/HtmlOutputDev.cc: + * utils/ImageOutputDev.cc: Fix build when using --disable-libjpeg + + ChangeLog | 5 +++++ + utils/HtmlOutputDev.cc | 2 ++ + utils/ImageOutputDev.cc | 2 ++ + 3 files changed, 9 insertions(+) + +commit 8b64dafc7f1d198fb0052c0d6f0da6de97bbb48d +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Dec 28 09:23:43 2005 +0000 + + Plug a few memory leaks in the Qt4 bindings. + + ChangeLog | 25 +++++++++++++++++++ + qt4/src/poppler-document.cc | 3 +++ + qt4/src/poppler-private.h | 7 +++++- + qt4/src/poppler-qt4.h | 3 +++ + qt4/tests/check_fonts.cpp | 8 ++++++ + qt4/tests/check_metadata.cpp | 50 + +++++++++++++++++++++++++++++++++----- + qt4/tests/check_pagelayout.cpp | 6 +++++ + qt4/tests/check_pagemode.cpp | 10 ++++++++ + qt4/tests/check_permissions.cpp | 2 ++ + qt4/tests/check_version.cpp | 22 ----------------- + qt4/tests/poppler-fonts.cpp | 1 + + qt4/tests/stress-poppler-qt4.cpp | 2 ++ + 12 files changed, 110 insertions(+), 29 deletions(-) + +commit 64c07a20a4ed844f3b3dd26e974f58d5877cf9fd +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Dec 27 06:10:01 2005 +0000 + + qt4/src/poppler-qt4.h and qt4/src/poppler-document.cc: add + convertDate() function that + turns char* PDF date strings into QDateTime. This version handles + the timezone conversions. Refactored the existing date() method + to use it. + + qt4/tests/check_dateConversion.cpp: unit tests for convertDate() + qt4/tests/check_metadata.cpp: update to reflect UTC. + qt4/tests/.cvsignore: suppress check_dateConversion + + ChangeLog | 9 ++++ + qt4/src/poppler-document.cc | 89 +++++++++++++++++++----------- + qt4/src/poppler-qt4.h | 5 ++ + qt4/tests/.cvsignore | 1 + + qt4/tests/Makefile.am | 11 ++-- + qt4/tests/check_dateConversion.cpp | 105 + ++++++++++++++++++++++++++++++++++++ + qt4/tests/check_metadata.cpp | 4 +- + 7 files changed, 188 insertions(+), 36 deletions(-) + +commit 4b2e3b5106b75f23c830837a886cd29beb1d1d1b +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Dec 27 05:08:34 2005 +0000 + + * qt4/src/Doxyfile (JAVADOC_AUTOBRIEF): Turned on automatic + \brief mode. + + * qt4/src/poppler-qt4.h: Update API documentation. Patch from + Stefan Kebekus, with some changes. Removed \brief entries. + + ChangeLog | 8 +++++ + qt4/src/Doxyfile | 2 +- + qt4/src/poppler-qt4.h | 81 + ++++++++++++++++++++++++++++++++++++++----------- + 3 files changed, 73 insertions(+), 18 deletions(-) + +commit 8d9cf43aaa73d5012428a6a4c5d7e2cccbd3036e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Dec 21 22:09:47 2005 +0000 + + 2005-12-21 Kristian Høgsberg <krh@redhat.com> + + * NEWS: Sum up 0.5 changes so far. + + * acinclude.m4: Split jpeg macros out into this file. + + * poppler/Stream.cc: Apply latest CVE-2005-3191 updates. + + ChangeLog | 8 ++++ + NEWS | 8 ++++ + acinclude.m4 | 112 + +++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 114 + -------------------------------------------------- + poppler/JPXStream.cc | 1 + + poppler/Stream.cc | 11 +++-- + 6 files changed, 137 insertions(+), 117 deletions(-) + +commit 97243286560cb4f264b875185c8768a6af09d554 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Dec 21 17:30:33 2005 +0000 + + 2005-12-21 Kristian Høgsberg <krh@redhat.com> + + * utils/Makefile.am: Add parseargs.h to sources and add + -I$(top_srcdir)/poppler to INCLUDES. + + * poppler/CairoFontEngine.cc: Apply patch from Hiroyuki + Ikezoe to + man non-embedded CJK fonts work. + + ChangeLog | 14 +++++++++--- + configure.ac | 2 +- + poppler/CairoFontEngine.cc | 52 + +++++++++++++++++++++++++++++++++++++++----- + utils/Makefile.am | 15 ++++++++----- + 4 files changed, 68 insertions(+), 15 deletions(-) + +commit cf887a9a9fae7272165d3aae05c85444ff5ca604 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 18 22:03:30 2005 +0000 + + * poppler/Page.cc: Only discard cropbox sizes one by one + and not + completely. Jeff and Martin were right + + ChangeLog | 2 ++ + poppler/Page.cc | 13 ++++++++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 495890b9cef9d5d61bb47e789add1cf2c3b8f83d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 18 21:56:15 2005 +0000 + + + .cvsignore + + utils/.cvsignore | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 5dca860bba6918e06fab3aa56a2c75f0ac9ecdfb +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 18 21:08:48 2005 +0000 + + Fix utils building on Slackware + + ChangeLog | 3 +++ + configure.ac | 3 +++ + utils/Makefile.am | 3 ++- + 3 files changed, 8 insertions(+), 1 deletion(-) + +commit 03e3d9164ffd71f03136b57a9941ea14fadb21aa +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 18 17:12:28 2005 +0000 + + 2005-12-18 Albert Astals Cid <aacid@kde.org> + + * configure.ac: Better jpeg detection, refer to ml PCbsd + problem + + ChangeLog | 4 ++ + configure.ac | 131 + ++++++++++++++++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 118 insertions(+), 17 deletions(-) + +commit 888d76a29c9c5ea6c90cc4299b230ca0c2c2944f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 12 20:21:08 2005 +0000 + + * poppler/Page.cc: Ignore cropBox if it seems incorrect + + ChangeLog | 4 ++++ + poppler/Page.cc | 7 +++++++ + 2 files changed, 11 insertions(+) + +commit bcc5e3afe27c8787ce7022a0701997c96eddb4fe +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Dec 12 20:15:11 2005 +0000 + + 2005-12-12 Kristian Høgsberg <krh@redhat.com> + + * Makefile.am: + * configure.ac: + * goo/GooVector.h: + * utils/HtmlFonts.cc: + * utils/HtmlFonts.h: + * utils/HtmlLinks.cc: + * utils/HtmlLinks.h: + * utils/HtmlOutputDev.cc: + * utils/HtmlOutputDev.h: + * utils/ImageOutputDev.cc: + * utils/ImageOutputDev.h: + * utils/Makefile.am: + * utils/parseargs.c: + * utils/parseargs.h: + * utils/pdffonts.1: + * utils/pdffonts.cc: + * utils/pdfimages.1: + * utils/pdfimages.cc: + * utils/pdfinfo.1: + * utils/pdfinfo.cc: + * utils/pdftohtml.1: + * utils/pdftohtml.cc: + * utils/pdftoppm.1: + * utils/pdftoppm.cc: + * utils/pdftops.1: + * utils/pdftops.cc: + * utils/pdftotext.1: + * utils/pdftotext.cc: Add command line utilities from xpdf. + + ChangeLog | 31 + + Makefile.am | 6 +- + configure.ac | 25 +- + goo/GooVector.h | 101 +++ + utils/HtmlFonts.cc | 326 ++++++++++ + utils/HtmlFonts.h | 85 +++ + utils/HtmlLinks.cc | 101 +++ + utils/HtmlLinks.h | 49 ++ + utils/HtmlOutputDev.cc | 1569 + +++++++++++++++++++++++++++++++++++++++++++++++ + utils/HtmlOutputDev.h | 302 +++++++++ + utils/ImageOutputDev.cc | 195 ++++++ + utils/ImageOutputDev.h | 76 +++ + utils/Makefile.am | 18 + + utils/parseargs.c | 190 ++++++ + utils/parseargs.h | 71 +++ + utils/pdffonts.1 | 128 ++++ + utils/pdffonts.cc | 294 +++++++++ + utils/pdfimages.1 | 96 +++ + utils/pdfimages.cc | 159 +++++ + utils/pdfinfo.1 | 157 +++++ + utils/pdfinfo.cc | 376 ++++++++++++ + utils/pdftohtml.1 | 85 +++ + utils/pdftohtml.cc | 429 +++++++++++++ + utils/pdftoppm.1 | 113 ++++ + utils/pdftoppm.cc | 189 ++++++ + utils/pdftops.1 | 224 +++++++ + utils/pdftops.cc | 336 ++++++++++ + utils/pdftotext.1 | 135 ++++ + utils/pdftotext.cc | 337 ++++++++++ + 29 files changed, 6194 insertions(+), 9 deletions(-) + +commit 5fbded32741acb5fac411189f80cb57aa11df517 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 10 10:52:15 2005 +0000 + + * qt4/src/poppler-page.cc: + * qt4/src/poppler-qt4.h: + * qt4/src/tests/test-poppler-qt4.cpp: The parameters x,y,w,h to the + method splashRenderToPixmap are now used. Convenient + defaults are provided. The test has been changed accordingly. Some + added documentation. Patch by Stefan Kebekus + + ChangeLog | 9 +++++++++ + qt4/src/poppler-page.cc | 4 ++-- + qt4/src/poppler-qt4.h | 31 +++++++++++++++++++++++-------- + qt4/tests/test-poppler-qt4.cpp | 2 +- + 4 files changed, 35 insertions(+), 11 deletions(-) + +commit bc6df8c41081c0c0107655cbf70ddb8b0c493c34 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Dec 9 20:49:59 2005 +0000 + + 2005-12-09 Kristian Høgsberg <krh@redhat.com> + + * poppler/GfxState.cc: Use colToByte() for converting + GxfColorComp + to bytes (really fix #5117). + + * poppler/Stream.cc: Remove duplicated check (#5243). + + ChangeLog | 5 +++++ + poppler/GfxState.cc | 6 +++--- + poppler/Stream.cc | 4 ---- + 3 files changed, 8 insertions(+), 7 deletions(-) + +commit 8a2464122455311c6d16ae62bb9ac9a0ae365a28 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Dec 9 19:40:40 2005 +0000 + + 2005-12-09 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: + * poppler/Makefile.am (poppler_includedir): + * goo/Makefile.am (poppler_goo_include_HEADERS): Make + installation + of xpdf header files optional. + + ChangeLog | 10 +++++++++- + configure.ac | 8 ++++++++ + goo/Makefile.am | 4 ++++ + poppler/Makefile.am | 4 ++++ + 4 files changed, 25 insertions(+), 1 deletion(-) + +commit 830b61bfd1c985fe14ec4d0f6724c8f70e924fc1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 8 18:17:42 2005 +0000 + + * configure.ac: Detect if gettimeofday is available, fixes + for correct + linking to Qt4 on windows + * goo/GooTimer.[cc|h]: Only build if gettimeofday is available + * poppler/Gfx.cc: Only use the timer for profiling if + gettimeofday is + available + * poppler/GlobalParams.cc: Remove extra unlockGlobalParams + that was + making windows hang + * splash/SplashFTFontEngine.cc: i need unistd.h on windows + also + * splash/SplashFontFile.cc: i need unistd.h on windows also + + ChangeLog | 12 ++++++++++++ + configure.ac | 14 +++++++++++++- + goo/GooTimer.cc | 3 +++ + goo/GooTimer.h | 4 ++++ + poppler/Gfx.cc | 6 ++++++ + poppler/GlobalParams.cc | 1 - + splash/SplashFTFontEngine.cc | 4 +--- + splash/SplashFontFile.cc | 4 +--- + 8 files changed, 40 insertions(+), 8 deletions(-) + +commit 0a1c33ed17fd7053ed455da3444856a5dab3c9b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 8 12:42:50 2005 +0000 + + Remove -DDATADIR we are not using if for anything and it shadows a + windows typedef + + ChangeLog | 8 ++++++++ + glib/Makefile.am | 3 +-- + poppler/Makefile.am | 3 +-- + qt/Makefile.am | 3 +-- + test/Makefile.am | 3 +-- + 5 files changed, 12 insertions(+), 8 deletions(-) + +commit adca042e666fd932f16213d0a4daba08b5021901 +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Dec 7 08:42:21 2005 +0000 + + Remove the version check. OK'd by krh. + + ChangeLog | 2 ++ + poppler/PDFDoc.cc | 6 +----- + 2 files changed, 3 insertions(+), 5 deletions(-) + +commit bc57f8dd73eef9a74e4a6e248ed6985c360db838 +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Dec 7 08:31:09 2005 +0000 + + Add infoKeys() - allows you to get a list of all the string names + (keys) + for the metadata. + + ChangeLog | 7 +++++++ + qt4/src/poppler-document.cc | 22 ++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 7 +++++++ + qt4/tests/check_metadata.cpp | 18 ++++++++++++++++++ + 4 files changed, 54 insertions(+) + +commit 7ec41df91e6dbf792e11676d929acc2f634bd382 +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Dec 6 09:58:04 2005 +0000 + + Add more unit tests for better coverage. + + ChangeLog | 6 ++++ + qt4/tests/check_fonts.cpp | 24 +++++++++++++++ + qt4/tests/check_metadata.cpp | 66 + ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 96 insertions(+) + +commit a92b10016306ac46775c9b95b52d249b233ff950 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 5 20:46:22 2005 +0000 + + * poppler/CairoFontEngine.cc: Correct fix for #5149, i broke it when + merging xpdf 3.01 patches + + ChangeLog | 5 +++++ + poppler/CairoFontEngine.cc | 4 +--- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 66096477d1a86f13fcb07ae25caff1cc02b1e7cd +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Dec 4 19:48:25 2005 +0000 + + Add checking for Type3 fonts in the unit test. + + ChangeLog | 5 +++++ + qt4/tests/check_fonts.cpp | 24 ++++++++++++++++++++++++ + 2 files changed, 29 insertions(+) + +commit 62345b0affed8e2e37728fca7f2b750879192c43 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 4 18:53:40 2005 +0000 + + Fix error in merging CAN-2005-3193 fix. Thanks Daniel Gryniewicz + for notifying + + ChangeLog | 5 +++++ + poppler/JPXStream.cc | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit ba4b3f88271892f197aa2ec076c80ff63a175887 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 4 11:30:00 2005 +0000 + + * qt/poppler-qt.h: + * qt/poppler-fontinfo.h: + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-fontinfo.cc: Implement copy constructor of + FontInfo needed + as Q[Value]List<FontInfo> uses it when appending + + ChangeLog | 8 ++++++++ + qt/poppler-fontinfo.cc | 9 +++++++++ + qt/poppler-qt.h | 2 ++ + qt4/src/poppler-fontinfo.cc | 9 +++++++++ + qt4/src/poppler-qt4.h | 2 ++ + 5 files changed, 30 insertions(+) + +commit e091231d98d12c19b0098ffbaec6ecda28097dff +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Dec 4 10:45:25 2005 +0000 + + Add new unit test to .cvsignore suppressions. + + ChangeLog | 2 ++ + qt4/tests/.cvsignore | 1 + + 2 files changed, 3 insertions(+) + +commit 6a7b1eaaedbfdd3a8e6b4d899477350f2b485641 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Dec 4 10:05:21 2005 +0000 + + * qt4/src/poppler-qt4.h: + qt4/src/fontinfo.cc: add implementation for FontInfo::typeName() + + * qt4/tests/check_fonts.cpp: + * qt4/tests/Makefile.am: add unit test for fonts + + * qt4/src/Mainpage.dox: Minor typo fixes. + + ChangeLog | 11 +++++++++++ + qt4/src/Mainpage.dox | 5 +++-- + qt4/src/poppler-fontinfo.cc | 24 ++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 14 +++++++++++++- + qt4/tests/Makefile.am | 5 +++++ + qt4/tests/check_fonts.cpp | 42 + ++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 98 insertions(+), 3 deletions(-) + +commit 31b28b4c59f7820901e9cf893197f381acbae8ce +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Dec 4 02:24:25 2005 +0000 + + 2005-12-03 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_set_selection_alpha): Use + Nickolays original fix instead of trying to be clever with + gdk_pixbuf_fill(). + + * poppler/CairoFontEngine.cc: Fix text corruption bug (#5149), + a rerun of an old classic (#3340). + + ChangeLog | 7 +++++++ + glib/poppler-page.cc | 8 +++++++- + poppler/CairoFontEngine.cc | 2 ++ + 3 files changed, 16 insertions(+), 1 deletion(-) + +commit 4d169c5c345cdac84a39026e759b928977643417 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Dec 4 01:42:29 2005 +0000 + + 2005-12-03 Kristian Høgsberg <krh@redhat.com> + + * poppler/GfxState.cc: Fixing another problem with new GfxRGB + representation causing images to show up as random pixels + (#5117). + + ChangeLog | 5 +++++ + poppler/GfxState.cc | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 58de0458e17b1639ce0bcae45a4b09b2c0a56618 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Dec 3 23:23:53 2005 +0000 + + 2005-12-03 Kristian Høgsberg <krh@redhat.com> + + * qt/Makefile.am (noinst_PROGRAMS): Only build qt test + program if + splash is enabled. + + * poppler/CairoOutputDev.cc: Remove unused grid snapping code, + sidestepping #4507. + + * glib/poppler-document.h (PopplerPermissions): Breaking enum + definition over multiple lines confuses glib-mkenums (#4600). + + * poppler/Makefile.am (libpoppler_la_LIBADD): Add + FREETYPE_LIBS + (#4515). + + * poppler/TextOutputDev.cc: + * qt/poppler-qt.h: GCC-4.1 fixes (#5031). + + ChangeLog | 17 +++++++++++++++++ + glib/poppler-document.h | 5 +---- + poppler/CairoOutputDev.cc | 35 +++++++++-------------------------- + poppler/CairoOutputDev.h | 2 +- + poppler/Makefile.am | 3 ++- + poppler/TextOutputDev.cc | 2 +- + qt/Makefile.am | 4 ++++ + qt/poppler-qt.h | 6 +++--- + 8 files changed, 38 insertions(+), 36 deletions(-) + +commit df45483f1437d8a96519e1428d1f4b3ffc08c2cd +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 3 22:39:06 2005 +0000 + + remove another chagne should not have gone in + + test/pdf-inspector.cc | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 7dfe02ee112dee51346525b62d877e6591135761 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 3 22:28:46 2005 +0000 + + Add the font retrieveing on the qt3 backend also, based on a patch + by Wilfried Huss + + ChangeLog | 3 ++ + qt/poppler-fontinfo.cc | 75 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 78 insertions(+) + +commit 655b9dd195ac9faf2f7ea0255880b8c83b249a06 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 3 22:26:07 2005 +0000 + + this should have not went in + + poppler/TextOutputDev.h | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit ab45eb562159d5b006e658ec66723a0a47908f65 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 3 22:20:54 2005 +0000 + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-fontinfo.cc: + * qt4/src/poppler-textbox.cc: Remove implementation of that classes + from the header, use pimpl + + ChangeLog | 9 ++++- + poppler/TextOutputDev.h | 10 +++--- + qt/Makefile.am | 1 + + qt/poppler-document.cc | 29 ++++++++++++++++ + qt/poppler-private.h | 2 ++ + qt/poppler-qt.h | 80 + ++++++++++++++++++++++++++++++++++++++++++- + qt4/src/Makefile.am | 2 ++ + qt4/src/poppler-fontinfo.cc | 69 +++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 43 +++++++++-------------- + qt4/src/poppler-textbox.cc | 49 ++++++++++++++++++++++++++ + test/pdf-inspector.cc | 9 +++-- + 11 files changed, 268 insertions(+), 35 deletions(-) + +commit 64079ad81caf6d2cf66b1f3a3de9454146e15c6c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Dec 3 21:55:36 2005 +0000 + + 2005-12-03 Kristian Høgsberg <krh@redhat.com> + + Fixes from Nickolay V. Shmyrev: + + * poppler/TextOutputDev.cc (TextLine::visitSelection, + TextBlock::visitSelection): Fix selection crash with + zero-width + word boxes or zero-height line boxes (#4402). + + * poppler/CairoOutputDev.h: Fix wrong cairo-ft.h include + (#4413). + + * poppler/CairoOutputDev.cc (eoFill, fill): + * glib/poppler-page.cc (poppler_page_render_selection): + Update to + work with new GfxColor definition and use + cairo_pattern_create_rgba() to cache cairo_pattern_t's for the + fill and stroke colors. + + * glib/poppler-page.cc (poppler_page_set_selection_alpha): + Zero + out pixbuf first. + + ChangeLog | 21 ++++++++++++++++ + glib/poppler-page.cc | 18 ++++++++------ + poppler/CairoOutputDev.cc | 59 + +++++++++++++++++++++++++++++++++------------ + poppler/CairoOutputDev.h | 6 ++--- + poppler/TextOutputDev.cc | 8 +++--- + 5 files changed, 82 insertions(+), 30 deletions(-) + +commit f3da21a3ecdd2694290e64af86c8e35fcb61371b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 3 21:35:45 2005 +0000 + + More docs for the Qt4 frontend, patch by Stefan Kebekus + + ChangeLog | 8 ++++ + qt4/src/.cvsignore | 3 +- + qt4/src/Doxyfile | 4 +- + qt4/src/Mainpage.dox | 91 + ++++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-page.cc | 20 +++------ + qt4/src/poppler-qt4.h | 57 +++++++++++++++++-------- + qt4/tests/test-poppler-qt4.cpp | 5 ++- + 7 files changed, 151 insertions(+), 37 deletions(-) + +commit 7b2c6e92611db9350ca5dcaf3fd730fe5e69afea +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 1 22:45:10 2005 +0000 + + Fix CAN-2005-3193 related bugs + Thanks Leonard for reporting + + ChangeLog | 6 ++++++ + poppler/JPXStream.cc | 9 ++++++++- + poppler/Stream.cc | 33 ++++++++++++++++++++++++++++++++- + poppler/Stream.h | 3 +++ + 4 files changed, 49 insertions(+), 2 deletions(-) + +commit a90f076af9ebb188895e7b223bcb7e5c3f4309c4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 28 22:50:19 2005 +0000 + + Fix QPixmap contents generation messed when doing the xpdf 3.01 + transition in qt4 frontend + Use Splash backend by default in the qt4 test, added -arthur option + to use the Arthur backend + + ChangeLog | 12 +++++++-- + qt4/src/poppler-page.cc | 47 ++++++++++++++++++++++++++--------- + qt4/src/poppler-qt4.h | 17 +++++++++---- + qt4/tests/test-poppler-qt4.cpp | 53 + +++++++++++++++++++++++++--------------- + 4 files changed, 91 insertions(+), 38 deletions(-) + +commit b7e4f0e7d175abde7fafb1fcc7ba129468bc8c1a +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Nov 27 01:33:51 2005 +0000 + + Convert Qt4 unit tests to use the new Qt4.1 QTestlib framework. + Add a little more API documentation + + ChangeLog | 7 +++++ + qt4/src/poppler-qt4.h | 11 +++++--- + qt4/tests/Makefile.am | 12 +++++--- + qt4/tests/check_metadata.cpp | 58 + +++++++++++++++++++-------------------- + qt4/tests/check_pagelayout.cpp | 14 +++++----- + qt4/tests/check_pagemode.cpp | 22 +++++++-------- + qt4/tests/check_permissions.cpp | 18 ++++++------ + 7 files changed, 78 insertions(+), 64 deletions(-) + +commit d036fa022dbb6f4421ccc8b12b8f9e4f0c8d7406 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 25 22:52:56 2005 +0000 + + patch from kebekus to add to the qt4 binding the same functions we + added to the qt3 one + + ChangeLog | 5 +++++ + qt4/src/poppler-page.cc | 44 + ++++++++++++++++++++++++++++++++++++++++++-- + qt4/src/poppler-qt4.h | 22 ++++++++++++++++++++++ + 3 files changed, 69 insertions(+), 2 deletions(-) + +commit 3c9f09d76dc70e4ba766930facee8b6f30bcd2da +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 22 21:50:44 2005 +0000 + + Fix page range in the inspector + + ChangeLog | 4 ++++ + test/pdf-inspector.cc | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit e64f63416dbce497cb2167272b95491664f213e8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 21 22:12:15 2005 +0000 + + PAtch to add some more functions to the qt binding by Stefan Kebekus + + ChangeLog | 5 ++++ + qt/poppler-page.cc | 69 + +++++++++++++++++++++++++++++++++++++++++++++++++++- + qt/poppler-qt.h | 41 +++++++++++++++++++++++++++++++ + 3 files changed, 114 insertions(+), 1 deletion(-) + +commit 8bd8cb4160b73da69d058783750352fbface66dc +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 21 19:44:09 2005 +0000 + + Fix a possible build problem + + ChangeLog | 4 ++++ + qt/Makefile.am | 1 + + 2 files changed, 5 insertions(+) + +commit fc59b79dc375544681032a1618e96c458515d724 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Nov 20 23:17:32 2005 +0000 + + 2005-11-20 Kristian Høgsberg <krh@redhat.com> + + * poppler/GfxState.cc: Fix the byte_lookup initialization + broken + by the merges (#4350). Modify GfxColorSpace::getRGBLine() + to work + with new GfXColor type. + + ChangeLog | 13 +++++++++++- + poppler/GfxState.cc | 59 + ++++++++++++++++++++++++++++++--------------------- + 2 files changed, 47 insertions(+), 25 deletions(-) + +commit 6fe2cb0fcd53211143dcd0c47bf8c8c7a8c11a39 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 17 21:37:34 2005 +0000 + + make it compile with freetype 2.2.0 preversions + + ChangeLog | 4 ++++ + splash/SplashFTFont.cc | 42 +++++++++++++++++++++++++++++++++++++----- + 2 files changed, 41 insertions(+), 5 deletions(-) + +commit 429d3521d788be702a3944bc290569f90ae04892 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 4 19:03:55 2005 +0000 + + Make it compile using --disable-cairo-output + + ChangeLog | 4 ++++ + glib/poppler-document.cc | 6 ++++-- + glib/poppler-page.cc | 27 +++++++++++++-------------- + 3 files changed, 21 insertions(+), 16 deletions(-) + +commit b96c118eb08d478914c2981204d749a95957cbb3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 1 15:29:32 2005 +0000 + + Comment some unused parameters to calm down compiler warnings when + using these heders on external projects with higher warning verbosity + + ChangeLog | 5 +++ + poppler/OutputDev.h | 125 + ++++++++++++++++++++++++++------------------------- + poppler/Stream.h | 24 +++++----- + 3 files changed, 80 insertions(+), 74 deletions(-) + +commit 51670972777510a3ec64a56649716b31167b9d0e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 30 20:29:05 2005 +0000 + + Last xpdf 3.01 merge (at least from my side) + It's very big, but noone has opposed in the 2 weeks time i gave on + the ml so either poppler is dead or people agree with the patch + + ChangeLog | 39 + + glib/poppler-page.cc | 32 +- + poppler/ArthurOutputDev.cc | 2 +- + poppler/ArthurOutputDev.h | 2 +- + poppler/CairoOutputDev.cc | 2 +- + poppler/CairoOutputDev.h | 2 +- + poppler/Gfx.cc | 645 +++++++++-- + poppler/Gfx.h | 17 +- + poppler/GfxState.cc | 1410 ++++++++++++++++++++--- + poppler/GfxState.h | 196 +++- + poppler/OutputDev.cc | 25 + + poppler/OutputDev.h | 46 +- + poppler/PDFDoc.cc | 98 +- + poppler/PDFDoc.h | 24 +- + poppler/PSOutputDev.cc | 1461 ++++++++++++++++++++---- + poppler/PSOutputDev.h | 48 +- + poppler/Page.cc | 115 +- + poppler/Page.h | 23 +- + poppler/SplashOutputDev.cc | 1525 ++++++++++++++++++++++--- + poppler/SplashOutputDev.h | 59 +- + poppler/TextOutputDev.cc | 230 ++-- + poppler/TextOutputDev.h | 16 +- + qt/poppler-page.cc | 34 +- + qt4/src/poppler-page.cc | 31 +- + splash/Splash.cc | 2656 + +++++++++++++++++++++++++++++++++----------- + splash/Splash.h | 75 +- + splash/SplashBitmap.cc | 216 ++-- + splash/SplashBitmap.h | 13 +- + splash/SplashPattern.cc | 22 +- + splash/SplashPattern.h | 19 +- + splash/SplashState.cc | 11 + + splash/SplashState.h | 3 + + splash/SplashTypes.h | 145 ++- + test/gtk-cairo-test.cc | 2 +- + test/gtk-splash-test.cc | 23 +- + test/pdf-inspector.cc | 2 +- + 36 files changed, 7685 insertions(+), 1584 deletions(-) + +commit 10dfa2254dafb9de93692def2bfb3133d9a39989 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Oct 17 02:17:51 2005 +0000 + + 2005-10-05 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_render_to_ps): + Fix another + off-by-one page number error (#4555). + + ChangeLog | 6 +++++- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 9830f0ea41f09fefada740e9429c491e067a5082 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 15:11:32 2005 +0000 + + GfxFont merges from xpdf 3.01 + + ChangeLog | 1 + + poppler/GfxFont.cc | 109 + +++++++++++++++++++++++++++++++++++----------------- + 2 files changed, 75 insertions(+), 35 deletions(-) + +commit 62b5ba221aca8c320e964916b0c0329efc8da572 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 15:04:39 2005 +0000 + + Stream[cc|h] merges from xpdf 3.01 + + ChangeLog | 1 + + poppler/Stream.cc | 714 + ++++++++++++++++++++++++++++++++++++++++++++++++----- + poppler/Stream.h | 19 +- + 3 files changed, 658 insertions(+), 76 deletions(-) + +commit b9fab51179f38e9798b10366be672f0432c874da +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 14:58:14 2005 +0000 + + Function.cc|h merges from xpdf 3.01 + + ChangeLog | 1 + + poppler/Function.cc | 76 + +++++++++++++++++++++++++++++---------------------- + poppler/Function.h | 42 ++++++++++++++++++++++++++++ + 3 files changed, 86 insertions(+), 33 deletions(-) + +commit c6e0242200f818c67508041763ff317e79daadd6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 14:54:17 2005 +0000 + + Annot.[cc|h] and related merges from xpdf 3.01 + + ChangeLog | 7 +- + poppler/Annot.cc | 234 + ++++++++++++++++++++++++++++++++++++++++++------ + poppler/Annot.h | 20 ++--- + poppler/FontInfo.cc | 2 +- + poppler/PSOutputDev.cc | 2 +- + poppler/Page.cc | 2 +- + 6 files changed, 221 insertions(+), 46 deletions(-) + +commit 65d574fdc009e45ad66d1d402d5e805e4e94f427 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 14:30:16 2005 +0000 + + Merge SplashFTFont.cc with xpdf 3.01 changes + + ChangeLog | 1 + + splash/SplashFTFont.cc | 64 + +++++++++++++++++++++++++++++++++--------------- + 2 files changed, 45 insertions(+), 20 deletions(-) + +commit f9d208e86433b213b21a75089f82fd00dcd746fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 14:25:32 2005 +0000 + + Merge SplashScreen.[cc|h] from xpdf 3.01 + + ChangeLog | 4 ++ + splash/SplashScreen.cc | 110 + +++++++++++++++++++++++++++++++----------------- + splash/SplashScreen.h | 12 +++++- + 3 files changed, 87 insertions(+), 39 deletions(-) + +commit 7d46ac000316566503a27b5e5c68621be9c081d0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 16 14:19:47 2005 +0000 + + Merging SplashXPathScanner.cc changes from xpdf 3.01 + + splash/SplashXPathScanner.cc | 80 + +++++++++++++++++++++++------------------- + 1 file changed, 43 insertions(+), 37 deletions(-) + +commit e34713a2187e05358f98e749ec2923210a40a862 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Oct 5 15:57:17 2005 +0000 + + 2005-10-05 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_render_to_ps): + Fix another + off-by-one page number error (#4555). + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit fdd0934430ed251f9aeb45158b6ec95684b3e7b4 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Mon Sep 26 19:29:45 2005 +0000 + + 2005-09-26 Marco Pesenti Gritti <mpg@redhat.com> + + * glib/poppler-action.cc: + + Initialize window title even if the action is unknown + + ChangeLog | 6 ++++++ + glib/poppler-action.cc | 5 +++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit e9753049ddfbdf28df7a222d35eccdbcbcbc848d +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Mon Sep 26 10:42:38 2005 +0000 + + 2005-09-26 Marco Pesenti Gritti <mpg@redhat.com> + + * glib/poppler-action.cc: + * glib/poppler-action.h: + + Implement launch action + + ChangeLog | 7 +++++++ + glib/poppler-action.cc | 11 ++++++++--- + glib/poppler-action.h | 1 + + 3 files changed, 16 insertions(+), 3 deletions(-) + +commit ab18b2cb6d1c62bb91173d105e8631fe4ef1bcfb +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 20 15:27:31 2005 +0000 + + Parser.cc merges from xpdf 3.01 + + ChangeLog | 1 + + poppler/Parser.cc | 19 +++++++++++-------- + 2 files changed, 12 insertions(+), 8 deletions(-) + +commit cf6723caaed24615c3b8965cee9c433007f80d77 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 20 15:08:52 2005 +0000 + + TextPage *TextOutpudDev::takeText() from xpdf 3.01 + + ChangeLog | 1 + + poppler/TextOutputDev.cc | 8 ++++++++ + poppler/TextOutputDev.h | 4 ++++ + 3 files changed, 13 insertions(+) + +commit e0cbb0ca2c611ad5ac0267e46279c9d61450902a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 20 14:59:43 2005 +0000 + + more 3.00 -> 3.01 merging + + ChangeLog | 1 + + poppler/XRef.cc | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 9c7adb318d395ff674c6febf6406a8d47e9e5bf6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 20 14:43:15 2005 +0000 + + * poppler/UnicodeMap.cc: More grealloc -> greallocn + * poppler/UnicodeTypeTable.cc: Merge from xpdf 3.01 + + ChangeLog | 2 ++ + poppler/UnicodeMap.cc | 4 ++-- + poppler/UnicodeTypeTable.cc | 4 ++-- + 3 files changed, 6 insertions(+), 4 deletions(-) + +commit 2c4c9b855b0df1dc0836d4f44e9471215a419ea6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 20 14:34:31 2005 +0000 + + Merge link.cc changes from xpdf 3.00 -> 3.01 + + ChangeLog | 1 + + poppler/Link.cc | 64 + ++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 62 insertions(+), 3 deletions(-) + +commit 4e9490c0219dd9c99ba0e5533c96663b8570a87b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 20 14:00:43 2005 +0000 + + Merge GlobalParam.* changes, they are worthless for us as poppler + but this way we are nearer to have the 3.01 sources merged, then we + can remove them if we decide we don't need this options. + Remove a setEncryption from the Xref.h marco probably forgot to + remove when merging + + ChangeLog | 3 +++ + poppler/GlobalParams.cc | 41 +++++++++++++++++++++++++++++++++++++++++ + poppler/GlobalParams.h | 22 ++++++++++++++++------ + poppler/XRef.h | 4 ---- + 4 files changed, 60 insertions(+), 10 deletions(-) + +commit 22da021bf69d83d641e3f30cc0e1bd62394e56a4 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Tue Sep 20 13:23:08 2005 +0000 + + 2005-09-20 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/XRef.cc: + + Remove duplicated initialization + + ChangeLog | 6 ++++++ + poppler/XRef.cc | 4 ---- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit 2a8778147938e3ed2af177226a9c35655f898c95 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Tue Sep 20 10:18:57 2005 +0000 + + 2005-09-20 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/GlobalParams.cc: + + s/G/Goo in not yet compiled plugins code + + ChangeLog | 6 ++++++ + poppler/GlobalParams.cc | 8 ++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 16f720b87cfc491db585dbdc99236cf492ffe85b +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Tue Sep 20 09:57:41 2005 +0000 + + 2005-09-20 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/Makefile.am: + + Add XPDFPlugin*. Thanks to TSDgeos that noticed this. + + * poppler/XpdfPluginAPI.cc: + + Fixup + + ChangeLog | 10 ++++++++++ + poppler/Makefile.am | 4 +++- + poppler/XpdfPluginAPI.cc | 2 +- + 3 files changed, 14 insertions(+), 2 deletions(-) + +commit 5f30791c3d87315ad1f742de64d2c1351ca70cb7 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 19:33:28 2005 +0000 + + *** empty log message *** + + ChangeLog | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit db62e07fcf57f45951b21f8aab44b0d943efe5d0 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 19:33:05 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/PDFDoc.cc: + * poppler/PDFDoc.h: + * poppler/XRef.cc: + * poppler/XRef.h: + + Merge more from 3.01 + + poppler/PDFDoc.cc | 20 ++++++++++++++++---- + poppler/PDFDoc.h | 19 +++++++++---------- + poppler/XRef.cc | 13 +++++++++++-- + poppler/XRef.h | 7 +++++-- + 4 files changed, 41 insertions(+), 18 deletions(-) + +commit 3acc7be594712fd0ce7ac07b7188d5b38b382782 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 19:05:00 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/XRef.cc: + + Merge some initialization that I lost before + + ChangeLog | 6 ++++++ + poppler/XRef.cc | 4 ++++ + 2 files changed, 10 insertions(+) + +commit 3badd82b72b2768be27e309b048cd8dcb1c80038 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:46:37 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/XRef.cc: + + Merge change from 3.01 + + ChangeLog | 6 ++++++ + poppler/XRef.cc | 8 -------- + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit 5474583e20ca773befa17242d4ad7b8f81d5bf99 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:38:58 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/CharCodeToUnicode.cc: + * poppler/CharCodeToUnicode.h: + + Improvements from xpdf 3.01 + + ChangeLog | 7 +++++++ + poppler/CharCodeToUnicode.cc | 31 +++++++++++++++++++------------ + poppler/CharCodeToUnicode.h | 4 ++++ + 3 files changed, 30 insertions(+), 12 deletions(-) + +commit b2a6eab113fecd3823885c64f3302bea4f372a9f +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:37:29 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/CMap.cc: + + Improvements from xpdf 3.01 + + ChangeLog | 6 ++++++ + poppler/CMap.cc | 30 +++++++++++++++++++++++++++--- + 2 files changed, 33 insertions(+), 3 deletions(-) + +commit 3f69f2158453b9dab9efc280ed1578ac3d0cebe8 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:35:29 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/NameToUnicodeTable.h: + * poppler/UnicodeTypeTable.cc: + * poppler/UnicodeTypeTable.h: + + Merge some unicode table changes from xpdf 3.01 + + ChangeLog | 8 + + poppler/NameToUnicodeTable.h | 168 +++++----- + poppler/UnicodeTypeTable.cc | 690 + ++++++++++++++++++++++++++++++++++++++++-- + poppler/UnicodeTypeTable.h | 2 + + 4 files changed, 764 insertions(+), 104 deletions(-) + +commit 6cbe76bc55d557fe5fca0f8f1b33bda95acdc0e9 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:32:29 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/SplashOutputDev.h: + * splash/Splash.cc: + * splash/Splash.h: + + Modified region support from xpdf 3.01 + + ChangeLog | 8 ++++++++ + poppler/SplashOutputDev.h | 5 +++++ + splash/Splash.cc | 31 +++++++++++++++++++++++++++++++ + splash/Splash.h | 11 +++++++++++ + 4 files changed, 55 insertions(+) + +commit a9df3f3203c14161e5d6bc6048ec7e123536e6d3 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:29:18 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * goo/Makefile.am: + * poppler/DCTStream.h: + * poppler/Decrypt.cc: + * poppler/Decrypt.h: + * poppler/FlateStream.h: + * poppler/GlobalParams.cc: + * poppler/GlobalParams.h: + * poppler/Makefile.am: + * poppler/PDFDoc.cc: + * poppler/PDFDoc.h: + * poppler/Parser.cc: + * poppler/Parser.h: + * poppler/Stream.cc: + * poppler/Stream.h: + * poppler/XRef.cc: + * poppler/XRef.h: + * poppler/poppler-config.h.in: + + Merge security plugins support from xpdf 3.01 + + ChangeLog | 24 +++ + goo/FixedPoint.cc | 95 +++++++++++ + goo/FixedPoint.h | 150 +++++++++++++++++ + goo/Makefile.am | 6 +- + poppler/DCTStream.h | 2 - + poppler/Decrypt.cc | 23 ++- + poppler/Decrypt.h | 6 +- + poppler/FlateStream.h | 2 - + poppler/GlobalParams.cc | 229 ++++++++++++++++++++++++++ + poppler/GlobalParams.h | 16 ++ + poppler/Makefile.am | 5 +- + poppler/PDFDoc.cc | 36 +++++ + poppler/PDFDoc.h | 1 + + poppler/Parser.cc | 20 --- + poppler/Parser.h | 4 - + poppler/SecurityHandler.cc | 376 + +++++++++++++++++++++++++++++++++++++++++++ + poppler/SecurityHandler.h | 157 ++++++++++++++++++ + poppler/Stream.cc | 18 --- + poppler/Stream.h | 8 - + poppler/XRef.cc | 162 ++----------------- + poppler/XRef.h | 13 +- + poppler/XpdfPluginAPI.cc | 262 ++++++++++++++++++++++++++++++ + poppler/XpdfPluginAPI.h | 341 + +++++++++++++++++++++++++++++++++++++++ + poppler/poppler-config.h.in | 2 - + 24 files changed, 1737 insertions(+), 221 deletions(-) + +commit a777e5c26483b90d0910e85c2be666640835d0bf +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:21:38 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * configure.ac: + * goo/Makefile.am: + * splash/Makefile.am: + * splash/SplashFTFont.cc: + * splash/SplashMath.h: + * splash/SplashTypes.h: + + Merge support for fixed point + + ChangeLog | 11 +++++++++++ + configure.ac | 4 ++++ + splash/Makefile.am | 1 + + splash/SplashFTFont.cc | 7 +++++++ + splash/SplashMath.h | 34 +++++++++++++++++++++++++++++++++- + splash/SplashTypes.h | 5 +++++ + 6 files changed, 61 insertions(+), 1 deletion(-) + +commit 00457c5f44a246c9f867a114a72be9f7b2dc1cf5 +Author: Marco Pesenti Gritti <mpg@redhat.com> +Date: Fri Sep 16 18:11:14 2005 +0000 + + 2005-09-16 Marco Pesenti Gritti <mpg@redhat.com> + + * poppler/ArthurOutputDev.cc: + * poppler/CairoFontEngine.cc: + * poppler/TextOutputDev.cc: + * poppler/UnicodeMap.cc: + + Use mallocn when possible + + ChangeLog | 9 +++++++++ + poppler/ArthurOutputDev.cc | 2 +- + poppler/CairoFontEngine.cc | 4 ++-- + poppler/TextOutputDev.cc | 2 +- + poppler/UnicodeMap.cc | 2 +- + 5 files changed, 14 insertions(+), 5 deletions(-) + +commit 09c9ff67ceae5753811a2f625e3ad810628c782e +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 16 18:00:43 2005 +0000 + + SplashXPath.cc merges from xpdf 3.00 -> 3.01 + + ChangeLog | 3 ++ + splash/SplashXPath.cc | 81 + ++++++++++++++++++++++++------------------------- + 2 files changed, 42 insertions(+), 42 deletions(-) + +commit 0555ba861d3b84d88c80da4fa247274338ff7817 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 16 17:42:56 2005 +0000 + + SplashFontEngine.cc merge from xpdf 3.00 -> 3.01 + + splash/SplashFontEngine.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit ddc72bd8354168d992631d1ef8cd0939b428966c +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 22:24:55 2005 +0000 + + Merge xpdf 3.00 -> 3.01 changes in SplashT1Font.* files + + splash/SplashT1Font.cc | 23 ++++++++++++++++++----- + splash/SplashT1Font.h | 2 ++ + 2 files changed, 20 insertions(+), 5 deletions(-) + +commit ba409db3157105f326b4bbc342ca7af859a44ce9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 22:20:37 2005 +0000 + + Merge xpdf 3.00 -> 3.01 changes in SplashPath.* files + + splash/SplashPath.cc | 3 ++- + splash/SplashPath.h | 5 +++++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 3ea00e853049d8c26ee88aaef8ea6c47c8d46956 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 22:15:47 2005 +0000 + + Merge xpdf 3.00 -> 3.01 changes in SplashFont.* files + + splash/SplashFont.cc | 6 ++++++ + splash/SplashFont.h | 10 +++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit e571dcbfd0c77a28e41710577859f632cc989de5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 22:09:50 2005 +0000 + + Merge the xpdf 3.01 change that uses runtime detection of freetype + version + + ChangeLog | 6 ++++++ + configure.ac | 14 +++----------- + poppler/CairoFontEngine.cc | 21 ++++++++++++++------- + poppler/CairoFontEngine.h | 3 ++- + splash/SplashFTFontEngine.cc | 19 +++++++++++-------- + splash/SplashFTFontEngine.h | 1 + + 6 files changed, 37 insertions(+), 27 deletions(-) + +commit 59fe2937db192dc7b59bf28c3f29909faf11aae3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 21:51:16 2005 +0000 + + Merge xpdf 3.00 -> 3.01 changes for that file + + splash/SplashClip.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit b2f94635249f2c5f0c876a1005826fe4c6eb6025 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 12:52:36 2005 +0000 + + Merge xpdf 3.00 -> xpdf 3.01 changes for Catalog.[cc|h] + + poppler/Catalog.cc | 5 ++++- + poppler/Catalog.h | 3 +++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 0fc2e70576b1c48cf47a686e8aa7e202a802bc9d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 12:32:25 2005 +0000 + + Another small merge from xpdf 3.01 + + ChangeLog | 3 +++ + poppler/Outline.cc | 6 +++--- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit f8983ceb3c55df72c94870806d71db139c11bdeb +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 12:28:34 2005 +0000 + + Another small xpdf 3.00 -> xpdf 3.01 merge + + poppler/Object.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 52efe9845cf3eb1dd836f90bfa203760baa2f87c +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 15 11:46:56 2005 +0000 + + bradh forgot to remove the two returns when merging xpdf 3.00 -> + xpdf 3.01 changes of this file + + poppler/JPXStream.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 4b4fc5c017bf147c9069bbce32fc14467bd2a81a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 14 21:20:36 2005 +0000 + + Merge all the fofi/ changes from xpdf 3.01, there is only one api + change that affects PSOutputDev (also has been updated the part + that uses this api not the whole file). All our fixes in that dir + are included in the upgrade. + + ChangeLog | 4 + + fofi/FoFiTrueType.cc | 406 + ++++++++++++++++++++++++++++++++++++++++++------ + fofi/FoFiTrueType.h | 15 +- + fofi/FoFiType1.cc | 25 ++- + fofi/FoFiType1C.cc | 134 +++++++++++++--- + fofi/FoFiType1C.h | 6 + + poppler/PSOutputDev.cc | 7 +- + poppler/PSOutputDev.h | 3 +- + 8 files changed, 515 insertions(+), 85 deletions(-) + +commit a68e8e6330418b1f623867973b9c128a9a139c0c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Sep 7 03:00:36 2005 +0000 + + 2005-09-06 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Enable A4_PAPER and OPI_SUPPORT by default. + There + is no reason to not enable OPI and the paper size should be + controlled by the application. + + * test/Makefile.am (EXTRA_DIST): Add pdf-operators.c + + ChangeLog | 8 ++++++++ + configure.ac | 17 ++--------------- + test/Makefile.am | 3 +++ + 3 files changed, 13 insertions(+), 15 deletions(-) + +commit b6490944c081ff53f623acea7ab7a600c3e54816 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Sep 3 11:53:44 2005 +0000 + + Switch the qt4/tests unittests to use QtTestLib. + + ChangeLog | 6 ++ + configure.ac | 66 ++++++++++++++++++++ + qt4/tests/.cvsignore | 17 ++---- + qt4/tests/Makefile.am | 71 +++++++--------------- + qt4/tests/README.unittest | 23 +++++++ + qt4/tests/check_author.cpp | 25 -------- + qt4/tests/check_linearised.cpp | 23 ------- + qt4/tests/check_metadata.cpp | 101 + +++++++++++++++++++++++++++++++ + qt4/tests/check_orientation.cpp | 40 ------------ + qt4/tests/check_pagelayout.cpp | 44 ++++++++++++++ + qt4/tests/check_pagelayout_facing.cpp | 22 ------- + qt4/tests/check_pagelayout_none.cpp | 22 ------- + qt4/tests/check_pagelayout_single.cpp | 22 ------- + qt4/tests/check_pagemode.cpp | 64 ++++++++++++++++++++ + qt4/tests/check_pagemode_attach.cpp | 22 ------- + qt4/tests/check_pagemode_fullscreen.cpp | 22 ------- + qt4/tests/check_pagemode_none.cpp | 22 ------- + qt4/tests/check_pagemode_oc.cpp | 22 ------- + qt4/tests/check_pagemode_thumbs.cpp | 22 ------- + qt4/tests/check_permissions.cpp | 60 +++++++----------- + 20 files changed, 354 insertions(+), 362 deletions(-) + +commit 3725841417871d1051772068833dc908ca70b7ce +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Sep 2 14:47:24 2005 +0000 + + 2005-09-02 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: Apply Marcos rotation fix. + + ChangeLog | 4 ++++ + glib/poppler-page.cc | 5 ++++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit ecf3dcadb948013cbc987e464952933daf78e4bf +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Aug 31 15:28:46 2005 +0000 + + Merge some missing parts of previous patches, and some other minor + cleanups from xpdf 3.0.1 + + poppler/Catalog.cc | 16 +- + poppler/JPXStream.cc | 380 + ++++++++++++++++++++++++++++++++---------------- + poppler/JPXStream.h | 25 +++- + poppler/Lexer.cc | 11 ++ + poppler/Lexer.h | 3 + + poppler/PSOutputDev.cc | 31 ++-- + poppler/Stream.h | 7 + + 7 files changed, 309 insertions(+), 164 deletions(-) + +commit de78738164319b733e54a9abfb5957870facd6cd +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Aug 31 09:51:41 2005 +0000 + + poppler/JArithmeticDecoder.cc + poppler/JArithmeticDecoder.h + poppler/JBIG2Stream.cc + poppler/JBIG2Stream.h: merge in some of the JBIG2 changes from + xpdf 3.0.1. + + ChangeLog | 9 ++ + poppler/JArithmeticDecoder.cc | 42 ++++++-- + poppler/JArithmeticDecoder.h | 22 +++- + poppler/JBIG2Stream.cc | 227 + +++++++++++++++++++++++++---------------- + poppler/JBIG2Stream.h | 4 +- + 5 files changed, 201 insertions(+), 103 deletions(-) + +commit 55952feb637e300b073691ae95d68e766521a769 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Aug 29 15:24:32 2005 +0000 + + 2005-08-29 Kristian Høgsberg <krh@redhat.com> + + * configure.ac (HAVE_FREETYPE_H): Patch from Hiroyuki + Ikezoe: Set + HAVE_FREETYPE_217_OR_OLDER to 0 if we found freetype using + pkg-config (#4223). + + ChangeLog | 6 ++++++ + configure.ac | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 244e5c1f8f65da41ba6314028766dfe5973f6132 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Aug 28 09:43:18 2005 +0000 + + Merge the Goo* improvements from xpdf 3.0.1. This change is based on + martink's work (7-xpdf-3.01-goo-improvements.patch), with some + tweaking + by me. + + ChangeLog | 13 ++++++++ + fofi/FoFiTrueType.cc | 1 + + goo/GooHash.cc | 24 ++++++++++++++ + goo/GooHash.h | 2 ++ + goo/GooList.cc | 5 +++ + goo/GooList.h | 5 +++ + goo/GooString.cc | 85 + +++++++++++++++++++++++++++++++++++++++++++++++++- + goo/GooString.h | 11 +++---- + goo/gmem.c | 3 ++ + poppler/Decrypt.cc | 1 + + 10 files changed, 142 insertions(+), 8 deletions(-) + +commit eb91b274245b4f5f5389bc9ddfde2c2806557665 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Aug 28 09:31:53 2005 +0000 + + This part of my previous gmallocn merge patch was missing. + + goo/GooHash.cc | 4 ++-- + goo/GooList.cc | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit b3474fd5e0efc96b5814d86e0cdedf39387e7ae3 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Aug 28 03:26:53 2005 +0000 + + add note about related bug + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ace2eb6ba518b970b96f30f61c4795c161e0cb79 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Aug 28 03:22:04 2005 +0000 + + 2005-08-27 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/FlateStream.cc: Fix predictor leak. + + ChangeLog | 4 ++++ + poppler/FlateStream.cc | 1 + + 2 files changed, 5 insertions(+) + +commit 96657c5480bf2ecf445ad5a105b8e7393ae53c8b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Aug 28 03:19:55 2005 +0000 + + 2005-08-27 Jeff Muizelaar <jeff@infidigm.net> + + * configure.ac: Disable the zlib-based decoder by default. + + ChangeLog | 4 ++++ + configure.ac | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit d1d715158223c7ca3ae279cea420a948cfdb0428 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Aug 27 08:43:42 2005 +0000 + + Merge the gmalloc -> gmallocn changes from xpdf 3.0.1. This change is + based on martink's work (13-xpdf-3.01-goo-allocn.patch) with some + tweaking by me. There may be some residual gmallocn changes still to + be merged. + + ChangeLog | 7 ++++++ + fofi/FoFiTrueType.cc | 12 ++++----- + fofi/FoFiType1.cc | 2 +- + fofi/FoFiType1C.cc | 14 +++++------ + goo/gmem.c | 22 +++++++++++++++++ + goo/gmem.h | 9 +++++++ + poppler/Annot.cc | 2 +- + poppler/Array.cc | 2 +- + poppler/BuiltinFont.cc | 2 +- + poppler/CMap.cc | 6 ++--- + poppler/Catalog.cc | 8 +++--- + poppler/CharCodeToUnicode.cc | 22 ++++++++--------- + poppler/Dict.cc | 2 +- + poppler/Function.cc | 20 +++++++-------- + poppler/Gfx.cc | 2 +- + poppler/GfxFont.cc | 24 +++++++++--------- + poppler/GfxState.cc | 54 + ++++++++++++++++++++--------------------- + poppler/JArithmeticDecoder.cc | 2 +- + poppler/JBIG2Stream.cc | 30 +++++++++++------------ + poppler/Link.cc | 6 ++--- + poppler/NameToCharCode.cc | 4 +-- + poppler/Outline.cc | 4 +-- + poppler/SplashOutputDev.cc | 8 +++--- + poppler/Stream.cc | 12 ++++----- + poppler/TextOutputDev.cc | 48 ++++++++++++++++++------------------ + poppler/XRef.cc | 18 +++++++------- + splash/SplashClip.cc | 12 ++++----- + splash/SplashFTFontFile.cc | 2 +- + splash/SplashFont.cc | 6 ++--- + splash/SplashPath.cc | 8 +++--- + splash/SplashScreen.cc | 4 +-- + splash/SplashState.cc | 4 +-- + splash/SplashT1FontFile.cc | 4 +-- + splash/SplashXPath.cc | 4 +-- + splash/SplashXPathScanner.cc | 4 +-- + 35 files changed, 214 insertions(+), 176 deletions(-) + +commit feb82c60b1f86a9d1260db57534d98c54ee615c4 +Author: Martin Kretzschmar <martink@gnome.org> +Date: Wed Aug 24 19:41:27 2005 +0000 + + * configure.ac: add /usr/include/qt4 to qt4_incdirs. That's what + Debian and Ubuntu use. Maybe we should just use pkg-config. If + it's usable with qt4. + + * test/.cvsignore: ignore pdf_inspector binary. + + ChangeLog | 8 ++++++++ + configure.ac | 2 +- + test/.cvsignore | 7 ++++--- + 3 files changed, 13 insertions(+), 4 deletions(-) + +commit 8dce80eb74f24f07ac7668905f1631e04a9c5841 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Aug 24 18:57:46 2005 +0000 + + 2005-08-24 Kristian Høgsberg <krh@redhat.com> + + * poppler/TextOutputDev.cc: Push rotation argument down to + GfxState constructor. This is still not completely + functional yet. + + * glib/poppler-page.cc (poppler_page_render_selection): Add + rotation argument so API is useful. Not yet implemented. + (poppler_page_prepare_output_dev): Patch from Marco to fix + rotation using the cairo backend. + + ChangeLog | 10 ++++++++++ + glib/poppler-page.cc | 22 ++++++++++++++++------ + glib/poppler-page.h | 1 + + poppler/TextOutputDev.cc | 11 ++++++++--- + poppler/TextOutputDev.h | 4 +++- + 5 files changed, 38 insertions(+), 10 deletions(-) + +commit b909b5ae98bc3e557ef6e658e2b9120e82951259 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Wed Aug 24 03:21:20 2005 +0000 + + Tue Aug 23 17:21:02 2005 Jonathan Blandford <jrb@redhat.com> + + * test/Makefile.am (gtk_cairo_test_LDADD): add + FREETYPE_{CFLAGS,LIBS} to the cairo deps + + ChangeLog | 5 +++++ + test/Makefile.am | 4 +++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit da3aac379f07ffedd6078707ec9923800fc0c0a5 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Tue Aug 23 18:20:45 2005 +0000 + + Tue Aug 23 13:38:01 2005 Jonathan Blandford <jrb@redhat.com> + + * configure.ac: + * poppler/Gfx.cc: + * poppler/Gfx.h: + * poppler/GlobalParams.cc: + * poppler/GlobalParams.h: + * poppler/Makefile.am: + * poppler/OutputDev.cc: + * poppler/OutputDev.h: + * poppler/ProfileData.cc: + * poppler/ProfileData.h: + * test/Makefile.am: + * test/pdf-inspector.cc: + * test/pdf-inspector.glade: + * test/pdf-operators.c: Initial cut at a pdf inspector. This + should help us look at PDF files. + + ChangeLog | 18 ++ + configure.ac | 4 +- + poppler/Gfx.cc | 30 ++++ + poppler/Gfx.h | 1 + + poppler/GlobalParams.cc | 16 ++ + poppler/GlobalParams.h | 3 + + poppler/Makefile.am | 2 + + poppler/OutputDev.cc | 17 ++ + poppler/OutputDev.h | 10 +- + poppler/ProfileData.cc | 44 +++++ + poppler/ProfileData.h | 41 +++++ + test/Makefile.am | 13 +- + test/pdf-inspector.cc | 358 ++++++++++++++++++++++++++++++++++++++ + test/pdf-inspector.glade | 434 + ++++++++++++++++++++++++++++++++++++++++++++++ + test/pdf-operators.c | 81 +++++++++ + 15 files changed, 1068 insertions(+), 4 deletions(-) + +commit 1aad886c6c19a964a3fc9e18f31acc8e115478e0 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Aug 22 18:20:12 2005 +0000 + + 2005-08-22 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * glib/test-poppler-glib.c: Patch from Marco to simplify + the glib + rotation API. + + ChangeLog | 8 +++ + glib/poppler-page.cc | 136 + ++++++---------------------------------------- + glib/poppler-page.h | 4 +- + glib/poppler-private.h | 1 - + glib/test-poppler-glib.c | 2 +- + 5 files changed, 28 insertions(+), 123 deletions(-) + +commit 6070b1dc4b76c236f3100fbd255c2d906e61c3c2 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Aug 21 23:14:04 2005 +0000 + + 2005-08-21 Kristian Høgsberg <krh@redhat.com> + + * poppler/Makefile.am (INCLUDES): Add FREETYPE_CFLAGS. + + * configure.ac: Make freetype check use pkg-config if + possible. + + ChangeLog | 6 ++++++ + configure.ac | 34 ++++++++++++++++++++++++---------- + poppler/Makefile.am | 1 + + 3 files changed, 31 insertions(+), 10 deletions(-) + +commit 2698ca6fa107ea91dc01eb8cfb0c93383fbca125 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Aug 17 16:54:01 2005 +0000 + + 2005-08-17 Kristian Høgsberg <krh@redhat.com> + + * poppler/GfxFont.cc: Add fix discussed in #3131 to only + use the + MacRoman char map if the font has one or the font dicts + specifies + /MacRoman. + + ChangeLog | 6 ++++++ + poppler/GfxFont.cc | 1 - + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 5dc9b14b99f2efa2fe018e9267dd363d1bcd78b1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 7 23:58:12 2005 +0000 + + Fix EOF checking + + ChangeLog | 4 ++++ + poppler/PDFDoc.cc | 10 +++++++++- + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 155d019d7b474f244a3e4bf64d192015f6a266c4 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Aug 6 18:09:51 2005 +0000 + + 2005-08-06 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h: Use GdkColor for specifying selection + colors, we alreay depend on GDK anyway. + + ChangeLog | 6 ++++++ + glib/poppler-page.cc | 20 +++++++++----------- + glib/poppler-page.h | 5 +++-- + 3 files changed, 18 insertions(+), 13 deletions(-) + +commit c710b645c8297d356c101b13a9889bcaba691176 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 6 11:58:59 2005 +0000 + + Update comment + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit de7953c8a8360d8bfc99298906c5fc1094684fc3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 6 11:47:37 2005 +0000 + + Increase EOF searching up to last 1024 characters + + ChangeLog | 7 +++++++ + poppler/PDFDoc.cc | 23 +++++++++++++---------- + 2 files changed, 20 insertions(+), 10 deletions(-) + +commit 5dd72618688763b50d5f5738d857c9294ef1b1c2 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Aug 6 02:15:58 2005 +0000 + + Add password arguments to document constructor. + + ChangeLog | 4 ++++ + qt4/src/poppler-document.cc | 8 ++++++-- + qt4/src/poppler-qt4.h | 4 +++- + 3 files changed, 13 insertions(+), 3 deletions(-) + +commit edbd7957b393eb63f48df7db6b220b355d4fc461 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Aug 6 02:07:55 2005 +0000 + + Make API extraction work again. + + ChangeLog | 3 +++ + qt4/src/Doxyfile | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit f43a6f1d1c27c042f5736746c94430083baa4c1d +Author: Brad Hards <bradh@frogmouth.net> +Date: Sat Aug 6 01:53:06 2005 +0000 + + Add new test code for encrypted files. + + ChangeLog | 5 ++ + qt4/tests/.cvsignore | 1 + + qt4/tests/Makefile.am | 7 +- + qt4/tests/test-password-qt4.cpp | 135 + +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 147 insertions(+), 1 deletion(-) + +commit 2ec26afaf80864b023899b890b8e229448da9bed +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Aug 5 22:30:20 2005 +0000 + + 2005-08-05 Kristian Høgsberg <krh@redhat.com> + + * poppler/TextOutputDev.cc (visitLine): Round selection + coordinates in device space, so selection isn't fuzzy. + + * poppler/GfxState.cc: + * poppler/GfxState.h: Add simple Matrix class. + + ChangeLog | 8 ++++++++ + poppler/CairoOutputDev.cc | 6 +++--- + poppler/GfxState.cc | 26 ++++++++++++++++++++++++++ + poppler/GfxState.h | 10 ++++++++++ + poppler/TextOutputDev.cc | 14 ++++++++++++++ + 5 files changed, 61 insertions(+), 3 deletions(-) + +commit ccba4f0773047eea5e4ad0ac736450160dd97664 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Aug 5 19:04:36 2005 +0000 + + 2005-08-05 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h: + * poppler/TextOutputDev.cc: + * poppler/TextOutputDev.h: Propagate selection colors to + the glib API. + + ChangeLog | 7 ++++++ + glib/poppler-page.cc | 63 + ++++++++++++++++++++++++++++++++++++++++------ + glib/poppler-page.h | 4 ++- + poppler/TextOutputDev.cc | 25 +++++++++--------- + poppler/TextOutputDev.h | 7 ++++-- + 5 files changed, 82 insertions(+), 24 deletions(-) + +commit 43e97129393f403c41f191ceae9a54793ece005f +Author: Brad Hards <bradh@frogmouth.net> +Date: Thu Aug 4 10:15:23 2005 +0000 + + Fix problem with drawing filled objects that was introduced in + Rev 1.4. + + ChangeLog | 5 +++++ + poppler/ArthurOutputDev.cc | 13 +++++++++++-- + 2 files changed, 16 insertions(+), 2 deletions(-) + +commit a75d80333a70d2e1ac7c9032d316034eebed9dd6 +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Aug 3 11:44:55 2005 +0000 + + Implement paging ability for Qt4, more than a little based + on Albert's work for Qt3. + Up arrow -> previous page + Down arrow -> next page + q -> quit. + + What more could you want from a PDF viewer :-) + + ChangeLog | 6 +++++ + qt4/tests/test-poppler-qt4.cpp | 47 + +++++++++++++++++++++++++++++++--------- + 2 files changed, 43 insertions(+), 10 deletions(-) + +commit f3e0a163b098da1cc389c2c4f47e28358b1bec77 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 1 19:15:40 2005 +0000 + + Fix problem in the patch to fix #3299 + + ChangeLog | 4 ++++ + poppler/DCTStream.cc | 15 ++++++++++----- + poppler/DCTStream.h | 1 + + 3 files changed, 15 insertions(+), 5 deletions(-) + +commit 5f7bd81bedd8c90e3312190256488ff0c15502e1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Aug 1 15:21:19 2005 +0000 + + 2005-08-01 Kristian Høgsberg <krh@redhat.com> + + Patch from Dan Winship <danw@novell.com> + + * glib/poppler-page.cc (poppler_page_copy_to_pixbuf): Set + alpha to + 0xff (opaque), not 0x00. + + ChangeLog | 7 +++++++ + glib/poppler-page.cc | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 22f509e60f60ccaea1f91d9ec1ef7ba8200bee8a +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Aug 1 08:09:00 2005 +0000 + + Fix up the fill problem with drawing text, where the "middle" + of glyphs + with a "hole" (like d, o, p, b, g) got filled. Also remove some + debugging + code. The glyphs are still ugly though. + + ChangeLog | 7 +++++++ + poppler/ArthurOutputDev.cc | 13 +------------ + 2 files changed, 8 insertions(+), 12 deletions(-) + +commit 7bf5d10c1f6edd538769c3a83a3b3d5df56d604b +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Jul 31 09:54:04 2005 +0000 + + An initial version of proper font handling, heavily based on work by + Albert Astals Cid. I changed it to stroke the glyphs based on the + SplashPath. In the longer term, Arthur should use FreeType paths + directly - hopefully that will be less ugly, and not fill everything. + + ChangeLog | 8 + + poppler/ArthurOutputDev.cc | 401 + ++++++++++++++++++++++++++++++++------------ + poppler/ArthurOutputDev.h | 15 +- + qt4/src/poppler-page.cc | 2 +- + splash/SplashPath.h | 2 + + 5 files changed, 314 insertions(+), 114 deletions(-) + +commit 8567b794628786b82e8db2a7daf75e4ad2398960 +Author: Brad Hards <bradh@frogmouth.net> +Date: Fri Jul 29 12:15:19 2005 +0000 + + Add some more test cases. + + ChangeLog | 4 ++++ + qt4/tests/.cvsignore | 4 ++++ + qt4/tests/Makefile.am | 10 +++++++++- + qt4/tests/check_pagelayout_facing.cpp | 22 ++++++++++++++++++++++ + qt4/tests/check_version.cpp | 22 ++++++++++++++++++++++ + 5 files changed, 61 insertions(+), 1 deletion(-) + +commit 59d660cf4d614fdea09d6a62b8889f7682c2b4f9 +Author: Brad Hards <bradh@frogmouth.net> +Date: Fri Jul 29 11:41:14 2005 +0000 + + Compile fix associated with last change. + + poppler/ArthurOutputDev.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 88c57c73f57820d6a57e26825093fbc688845e67 +Author: Brad Hards <bradh@frogmouth.net> +Date: Fri Jul 29 11:24:42 2005 +0000 + + A couple of minor changes to the Arthur backend. + + ChangeLog | 9 +++++++++ + poppler/ArthurOutputDev.cc | 18 ++++++++++++++---- + 2 files changed, 23 insertions(+), 4 deletions(-) + +commit 481db9d9eae5ea16e5b382f4ad21e6e624a70dcf +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Jul 29 05:48:33 2005 +0000 + + 2005-07-29 Kristian Høgsberg <krh@redhat.com> + + * poppler/TextOutputDev.cc: Finish TextSelectionDumper + class for + extracting the text from a selection. Add + TextPage::getSelectionText() and + TextOutputDev::getSelectionText() + methods to expose the new functionality. + + * glib/poppler-page.cc (poppler_page_get_text): Use + TextOutputDev::getSelectionText() to get the text from the + selection. + + * glib/poppler-document.cc (poppler_document_new_from_file): + * glib/poppler-page.cc (_poppler_page_new): Add extra NULL to + g_object_new() constructor to silence gcc warning about + missing + sentinel. + + ChangeLog | 16 +++++ + glib/poppler-document.cc | 2 +- + glib/poppler-page.cc | 31 +++++---- + poppler/TextOutputDev.cc | 164 + +++++++++++++++++++++++++++++++++++----------- + poppler/TextOutputDev.h | 8 +++ + 5 files changed, 164 insertions(+), 57 deletions(-) + +commit ad312dbded4e8f70c3a2eac9a0964fa00ecb6b2c +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 28 22:56:17 2005 +0000 + + Fix memory leaks in PageLabelInfo.cc + + ChangeLog | 4 ++++ + poppler/PageLabelInfo.cc | 11 +++++++++++ + poppler/PageLabelInfo.h | 2 ++ + 3 files changed, 17 insertions(+) + +commit b45ad9f3409d7b1ed147135a70553e5255913c61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 28 20:53:36 2005 +0000 + + - delete family; + + delete[] family; + as family is new[]'ed + + When assigning family if the font had "the proper info" and family + had to be deleted, do it. + + poppler/GlobalParams.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit f93dfc5c5133e0b1bd9f4786cfe18bd796cbac2a +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 28 18:51:17 2005 +0000 + + Remove the debugging + + poppler/GlobalParams.cc | 5 ----- + 1 file changed, 5 deletions(-) + +commit 8022315004e1623c0be320f7671fcd72c15c0de3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 28 18:37:17 2005 +0000 + + Wonder how that slipped here + + poppler/GlobalParams.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 82638babe89e402c0348619ec3205059b977c7e9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jul 28 17:34:19 2005 +0000 + + Fontconfig patch is here, rejoice + + ChangeLog | 15 +- + glib/poppler-document.cc | 1 - + poppler/CairoFontEngine.cc | 95 +-------- + poppler/CairoFontEngine.h | 2 - + poppler/CairoOutputDev.cc | 4 - + poppler/GlobalParams.cc | 473 + ++++++++++++++++++++----------------------- + poppler/GlobalParams.h | 17 +- + poppler/SplashOutputDev.cc | 132 +----------- + poppler/SplashOutputDev.h | 3 - + qt/poppler-document.cc | 1 - + qt4/src/poppler-document.cc | 1 - + test/gtk-cairo-test.cc | 1 - + test/gtk-splash-test.cc | 1 - + 13 files changed, 241 insertions(+), 505 deletions(-) + +commit e9015531b1d0e5f2c8d8ca2bc50d5f14aaf954bc +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jul 28 06:31:57 2005 +0000 + + 2005-07-28 Kristian Høgsberg <krh@redhat.com> + + * poppler/poppler-config.h.in: Add GCC_PRINTF_FORMAT macro to + annotate printf-like functions (#3638). + + * poppler/Error.h: Add GCC_PRINTF_FORMAT to error(). + + * poppler/PSOutputDev.h: Add GCC_PRINTF_FORMAT to + PSOutputDev::writePSFmt(). + + * poppler/PSOutputDev.cc, poppler/GlobalParams.cc: Quiet new + printf warnings. + + ChangeLog | 11 +++++++++++ + poppler/Error.h | 2 +- + poppler/GlobalParams.cc | 3 ++- + poppler/PSOutputDev.cc | 3 +-- + poppler/PSOutputDev.h | 2 +- + poppler/TextOutputDev.cc | 13 ++++++++++++- + poppler/poppler-config.h.in | 12 ++++++++++++ + 7 files changed, 40 insertions(+), 6 deletions(-) + +commit 9df89c495683e229b771b3d008ed25d478465c35 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jul 28 05:52:43 2005 +0000 + + 2005-07-28 Kristian Høgsberg <krh@redhat.com> + + * poppler/TextOutputDev.cc (TextBlock::visitSelection): Assign + start and stop coordinates in one place so we don't assign the + same point to both in some corner cases. + (TextWord::visitSelection): Initialize begin to len, not + len + 1 + to fix crash. + + (TextWord::visitSelection, TextLine::visitSelection): Change + selection trigger; now midpoint of glyph must be included in + selection area for glyph to be in selection. + + ChangeLog | 12 +++++ + poppler/CairoOutputDev.cc | 2 +- + poppler/TextOutputDev.cc | 113 + ++++++++++++++++++++++----------------------- + 3 files changed, 67 insertions(+), 60 deletions(-) + +commit a3d9b5849cedf1316c6fc5859872e957f3f7b593 +Author: Martin Kretzschmar <martink@gnome.org> +Date: Wed Jul 27 19:21:08 2005 +0000 + + * poppler/PSOutputDev.cc (PSOutputDev): change the constructor to + take paper size and duplex setting parameters. + (init): add paper size and duplex parameters. + (writeDocSetup): add duplex parameter. + + * poppler/PSOutputDev.h: update declarations. + + * glib/poppler-private.h (struct _PopplerPSFile): store necessary + information to eventually construct a PSOutputDev. + + * glib/poppler-page.cc (poppler_page_render_to_ps): initialize the + output dev if it doesn't exist yet. + + * glib/poppler-document.cc (poppler_ps_file_new): don't create the + PSOutputDev here, just store filename and page range. + (poppler_ps_file_set_paper_size, poppler_ps_file_set_duplex): new + functions. + (poppler_ps_file_free): free the filename which we strdup now. + + * glib/poppler-document.h: add prototypes. + + ChangeLog | 23 ++++++++++++++++++++++ + glib/poppler-document.cc | 49 + +++++++++++++++++++++++++++++++++++++++------- + glib/poppler-document.h | 15 +++++++++----- + glib/poppler-page.cc | 10 ++++++++++ + glib/poppler-private.h | 6 ++++++ + poppler/PSOutputDev.cc | 23 +++++++++++++--------- + poppler/PSOutputDev.h | 9 +++++++-- + 7 files changed, 112 insertions(+), 23 deletions(-) + +commit 7be920ecf13698c3cf4ab8df09c8c67f1a04bfa2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 26 21:52:09 2005 +0000 + + Fix mem leak in qt test app + + ChangeLog | 4 ++++ + qt/test-poppler-qt.cpp | 2 ++ + 2 files changed, 6 insertions(+) + +commit 2bc26dffd9f296799617d319055648c20f748c8a +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jul 26 20:34:13 2005 +0000 + + 2005-07-26 Kristian Høgsberg <krh@redhat.com> + + * fofi/FoFiType1.cc: Make check for end of encoding array + a bit + more liberal so we don't crash on complex encoding arrays + (#3344). + + ChangeLog | 5 +++++ + fofi/FoFiType1.cc | 21 +++++++-------------- + 2 files changed, 12 insertions(+), 14 deletions(-) + +commit 07911274e4e850a628b1e587cafc2a73c05f93fe +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 25 20:40:37 2005 +0000 + + Work on bad jpeg data that have garbage before the start marker. Fixes + bug #3299 + + ChangeLog | 5 +++++ + poppler/DCTStream.cc | 38 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 43 insertions(+) + +commit a1869eca39172fcb42f036a5846b19548be53568 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 22 11:01:25 2005 +0000 + + Fix bug #3586 + + ChangeLog | 5 +++++ + poppler/CairoFontEngine.cc | 2 ++ + 2 files changed, 7 insertions(+) + +commit 95529b41272484f08fb54393e1886bf7ff3e02c8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 22 10:45:19 2005 +0000 + + Make it possible to browse pages in test-poppler-qt + + ChangeLog | 13 +++++++++---- + qt/test-poppler-qt.cpp | 49 + +++++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 49 insertions(+), 13 deletions(-) + +commit 2d52650864eab0e9385ed1fe8fb594daac9d8322 +Author: Martin Kretzschmar <martink@gnome.org> +Date: Fri Jul 22 10:35:56 2005 +0000 + + * glib/poppler-document.cc (poppler_fonts_iter_get_name): if the + font is a subset, strip the ABCDEF+ tag. + (poppler_fonts_iter_get_full_name): does what the old get_name did. + (poppler_fonts_iter_get_font_type, poppler_fonts_iter_is_embedded) + (poppler_fonts_iter_is_subset): new wrappers. + + * glib/poppler-document.h (PopplerFontType): new enum. + Update prototypes. + + ChangeLog | 11 ++++++++++ + glib/poppler-document.cc | 54 + +++++++++++++++++++++++++++++++++++++++++++++- + glib/poppler-document.h | 38 ++++++++++++++++++++++---------- + 3 files changed, 91 insertions(+), 12 deletions(-) + +commit 43bed4aafcf1d291dc96fa5070efbd7936a6122f +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 22 10:33:54 2005 +0000 + + Fix bugs #3728 and #3750 + + ChangeLog | 4 ++++ + splash/Splash.cc | 10 ++++++++++ + 2 files changed, 14 insertions(+) + +commit c7bcef87493d354a077dd223d76f86640acc0ce3 +Author: Martin Kretzschmar <martink@gnome.org> +Date: Fri Jul 15 19:55:30 2005 +0000 + + update for 2005-06-27 change to actually display something again. + + ChangeLog | 5 +++++ + test/gtk-cairo-test.cc | 10 ++++++---- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit 6623711d2d50dc52454904ee16b25337f0aab130 +Author: Brad Hards <bradh@frogmouth.net> +Date: Sun Jul 10 09:34:03 2005 +0000 + + A general cleanup of the Arthur output renderer. + + ChangeLog | 5 +++ + poppler/ArthurOutputDev.cc | 105 + +++++++++++++++----------------------------- + 2 files changed, 41 insertions(+), 69 deletions(-) + +commit ea1cc9a7b12db9c44b89896c41d07e3ba932d054 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Jul 8 04:59:41 2005 +0000 + + 2005-07-08 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_set_selection_alpha): Add + this function to initialize the alpha channel when using the + splash backend. + + * poppler/TextOutputDev.cc (visitLine): Add missing scaling of + intra-line selection edges. + + ChangeLog | 9 +++++++ + glib/poppler-page.cc | 59 + +++++++++++++++++++++++++++++++++++++++++++++- + poppler/TextOutputDev.cc | 17 +++++++------ + 3 files changed, 77 insertions(+), 8 deletions(-) + +commit 1cd915397c9532ed80b4f905b6ed9c0126aa38f2 +Author: Brad Hards <bradh@frogmouth.net> +Date: Thu Jul 7 21:15:09 2005 +0000 + + Add support for page layout to the Qt4 bindings, plus + test cases. + + ChangeLog | 8 ++++++++ + qt4/src/poppler-document.cc | 22 ++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 26 ++++++++++++++++++++++++-- + qt4/tests/Makefile.am | 10 +++++++++- + qt4/tests/check_pagelayout_none.cpp | 22 ++++++++++++++++++++++ + qt4/tests/check_pagelayout_single.cpp | 22 ++++++++++++++++++++++ + 6 files changed, 107 insertions(+), 3 deletions(-) + +commit 4e050aef7ba132900f84205be221fd48808848c3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jul 7 17:19:36 2005 +0000 + + 2005-07-07 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_prepare_output_dev): + Account + for page rotation when creating the cairo surface. + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 17 +++++++++++++++-- + 2 files changed, 20 insertions(+), 2 deletions(-) + +commit 2eeab0b8afeb4897806df2de6e496889c25dda5e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jul 7 15:58:43 2005 +0000 + + 2005-07-06 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_copy_to_pixbuf): Add + out of + bounds checking (from Marco). + + ChangeLog | 6 +++++- + glib/poppler-page.cc | 5 +++++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit b1015f6bdbd93b2a2574a9f0e0e1cd7dbae9af78 +Author: Brad Hards <bradh@frogmouth.net> +Date: Thu Jul 7 11:13:24 2005 +0000 + + At least try to fix glib issues. If you care about glib, + then you should review this. + + ChangeLog | 4 ++++ + glib/poppler-document.cc | 2 ++ + 2 files changed, 6 insertions(+) + +commit 8bf787031e7a2e93b4e1202918bd1aee86675082 +Author: Brad Hards <bradh@frogmouth.net> +Date: Thu Jul 7 11:04:08 2005 +0000 + + Update for page mode - new mode from PDF-1.6, API docs fixes + and some tests. + + ChangeLog | 15 +++++++++++++++ + poppler/Catalog.cc | 2 ++ + poppler/Catalog.h | 3 ++- + qt4/src/poppler-document.cc | 2 ++ + qt4/src/poppler-qt4.h | 14 +++++++++----- + qt4/tests/Makefile.am | 22 +++++++++++++++++++++- + qt4/tests/check_pagemode_attach.cpp | 22 ++++++++++++++++++++++ + qt4/tests/check_pagemode_fullscreen.cpp | 22 ++++++++++++++++++++++ + qt4/tests/check_pagemode_none.cpp | 22 ++++++++++++++++++++++ + qt4/tests/check_pagemode_oc.cpp | 22 ++++++++++++++++++++++ + qt4/tests/check_pagemode_thumbs.cpp | 22 ++++++++++++++++++++++ + 11 files changed, 161 insertions(+), 7 deletions(-) + +commit 695e27fb4d6fcc3466e2c9c95b4f02821b07e823 +Author: Brad Hards <bradh@frogmouth.net> +Date: Thu Jul 7 11:01:27 2005 +0000 + + Suppress noise from new test files. + + qt4/tests/.cvsignore | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 8a8d57bdcf11ed2903913d938b9711053b9bb9f1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 6 17:12:36 2005 +0000 + + Extract family, stretch and weight from the font descriptor + + ChangeLog | 2 ++ + poppler/GfxFont.cc | 41 +++++++++++++++++++++++++++++++++++++++++ + poppler/GfxFont.h | 36 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 79 insertions(+) + +commit 3a1646c2f776f5a07b0e830fcb8e1b0a80efb41c +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 6 13:29:00 2005 +0000 + + Add checkFooter to check the document ends with %%EOF + + ChangeLog | 5 +++++ + poppler/PDFDoc.cc | 28 ++++++++++++++++++++++++++++ + poppler/PDFDoc.h | 1 + + 3 files changed, 34 insertions(+) + +commit 377c023d31cf74d8240aa5be9dba8e3838459a8c +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Jul 6 11:15:16 2005 +0000 + + Add unit tests for the isLinearized() property. + + ChangeLog | 4 ++++ + qt4/tests/Makefile.am | 6 +++++- + qt4/tests/check_linearised.cpp | 23 +++++++++++++++++++++++ + 3 files changed, 32 insertions(+), 1 deletion(-) + +commit 5fa869887a840a585340993718df0841010666cf +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Jul 6 09:52:30 2005 +0000 + + Remove boolean for unicode table lookup from Font + + ChangeLog | 14 ++++++++++++++ + qt4/src/poppler-document.cc | 2 -- + qt4/src/poppler-qt4.h | 14 +------------- + qt4/tests/poppler-fonts.cpp | 16 +++++++--------- + 4 files changed, 22 insertions(+), 24 deletions(-) + +commit 40469c5883e17e734f3d54872c59e76b95bc0f95 +Author: Brad Hards <bradh@frogmouth.net> +Date: Wed Jul 6 09:00:39 2005 +0000 + + Update to reflect recent changes. + + qt4/tests/.cvsignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6cea437208f913085a6a8c7183b0826a107cefb5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 5 21:15:48 2005 +0000 + + Don't crash with files that have fonts with no name + + ChangeLog | 7 +++++++ + qt4/src/poppler-document.cc | 13 ++++++++++--- + qt4/src/poppler-qt4.h | 2 +- + 3 files changed, 18 insertions(+), 4 deletions(-) + +commit 1323c74479848f5b87a3a13fa26e8b9e096e9f6a +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Jul 5 12:31:59 2005 +0000 + + Check in a couple more test apps + + qt4/tests/Makefile.am | 10 ++++++- + qt4/tests/check_author.cpp | 25 +++++++++++++++++ + qt4/tests/check_permissions.cpp | 59 + +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 93 insertions(+), 1 deletion(-) + +commit 839a798ec3725427185de5a48c58ac448596b25d +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Jul 5 12:25:00 2005 +0000 + + Add Qt4 bindings for new user permission properties. + + ChangeLog | 4 ++++ + qt4/src/poppler-document.cc | 25 +++++++++++++++++++++ + qt4/src/poppler-qt4.h | 51 + ++++++++++++++++++++++++++++++++++++++----- + 3 files changed, 75 insertions(+), 5 deletions(-) + +commit e10f6990d3339e3a7adeaa50b1754cf7ecf82f87 +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Jul 5 12:15:04 2005 +0000 + + Add some more user permissions properties - high resolution + printing, document assembly, extraction for accessibility + and form completion. + + ChangeLog | 8 ++++++++ + poppler/PDFDoc.h | 9 +++++++++ + poppler/XRef.cc | 55 + ++++++++++++++++++++++++++++++++++++++++++++++++++---- + poppler/XRef.h | 4 ++++ + 4 files changed, 72 insertions(+), 4 deletions(-) + +commit 3a8e1ba03cdec6412dd0b79f0cc59a4cd97dd4e7 +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 11:38:22 2005 +0000 + + A couple more little changes. + + ChangeLog | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit a44bd0b45bb89f29ddca5d0e8986a8de50f9db39 +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 11:37:21 2005 +0000 + + Change path to sample file to point to test module + + qt4/tests/check_orientation.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2a7079087c35651c242d3843c94703a3199e61ca +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 11:36:13 2005 +0000 + + Fix typo causing failure to pick up upside down pages. + + qt4/src/poppler-page.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 529a548044ae721a414c5b8e768c0498b1e6830b +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 08:30:29 2005 +0000 + + Update to reflect recent changes + + ChangeLog | 30 +++++++++++++++++++++++++++++- + qt4/tests/.cvsignore | 2 ++ + 2 files changed, 31 insertions(+), 1 deletion(-) + +commit 08cca4670f8ae65333beacda85834112e76489d1 +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 08:21:27 2005 +0000 + + Add in a simple demo/test application, similar to the pdffonts + application in xpdf. + + qt4/tests/Makefile.am | 9 ++++- + qt4/tests/poppler-fonts.cpp | 76 + +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 84 insertions(+), 1 deletion(-) + +commit 52af89d8303b50c45d5e4584d19ec8b7d7ebcf9b +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 08:18:52 2005 +0000 + + Update to reflect changes to rendering API. + + qt4/tests/stress-poppler-qt4.cpp | 4 ++-- + qt4/tests/test-poppler-qt4.cpp | 3 ++- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit d42998d0fc32b1e21a2aeef1311e0baf508ade3f +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 08:16:17 2005 +0000 + + Qt4 update. + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-document.cc complete Qt4 font metadata handling + + * qt4/src/poppler-qt4.h: + * qt4/src/poppler-page.cc: change the render API to make it more + Qt-like. + + qt4/src/poppler-document.cc | 7 ++++- + qt4/src/poppler-page.cc | 5 ++- + qt4/src/poppler-qt4.h | 73 + ++++++++++++++++++++++++++++++++++++++++--- + 3 files changed, 77 insertions(+), 8 deletions(-) + +commit 5d194b926d1ed642ed4bbd3304befa073d389cd4 +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 08:10:16 2005 +0000 + + Change FontInfo::type() to return an enumerated value, + rather than a GooString. + + poppler/FontInfo.cc | 16 ++-------------- + poppler/FontInfo.h | 16 +++++++++++++--- + 2 files changed, 15 insertions(+), 17 deletions(-) + +commit 1303020b2e97bc110ccf045cd2811daf59ec72ce +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Jul 4 07:42:32 2005 +0000 + + Fix up the unit test, now that I have a real sample + file. + + qt4/tests/check_orientation.cpp | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 96fc0ea3fc6c9c7d933e9e0c02a622b2aeef7617 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Jul 1 04:57:49 2005 +0000 + + 2005-07-01 Kristian Høgsberg <krh@redhat.com> + + * poppler/TextOutputDev.cc: Make selection also work when + dragging + backwards in the text flow. Currently this is a big pile of + if-statements, and there is certainly room for improvement. + + ChangeLog | 6 +++ + poppler/TextOutputDev.cc | 129 + +++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 111 insertions(+), 24 deletions(-) + +commit 06c49c496f28aba608101adcecd8cec34937ac78 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jun 30 19:44:33 2005 +0000 + + 2005-06-30 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.h: * glib/poppler-page.cc + (poppler_page_copy_to_pixbuf): Fix splash compilation + (patch from + Marco). + (poppler_page_render_to_pixbuf): Drop dest_x and dest_y + coordinates from this function. This functionality can be + achieved using a sub-GdkPixbuf. + + * glib/test-poppler-glib.c (main): Update test case. + + ChangeLog | 11 +++++++++++ + NEWS | 6 ++++++ + glib/poppler-page.cc | 27 ++++++++++----------------- + glib/poppler-page.h | 4 +--- + glib/test-poppler-glib.c | 2 +- + 5 files changed, 29 insertions(+), 21 deletions(-) + +commit b126785aeda6b5576a13fc3f3853b027bd7dd306 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jun 30 00:36:01 2005 +0000 + + 2005-06-29 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-private.h: Move TextOutputDev.h include + here from + poppler-page.cc + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 1 - + glib/poppler-private.h | 1 + + 3 files changed, 6 insertions(+), 1 deletion(-) + +commit b15a8caf003d7d0631d4f78db5ab54e55a5a000a +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 29 21:24:48 2005 +0000 + + 2005-06-29 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: + * poppler/Page.cc: + * poppler/Page.h: + * poppler/TextOutputDev.cc: + * poppler/TextOutputDev.h: Add support for rendering real + selection (based on text flow). + + ChangeLog | 20 ++- + configure.ac | 4 +- + glib/poppler-page.cc | 224 ++++++++++++++++++------ + glib/poppler-page.h | 65 ++++--- + glib/poppler-private.h | 3 + + poppler/CairoOutputDev.cc | 13 +- + poppler/CairoOutputDev.h | 2 +- + poppler/Page.cc | 59 +++++-- + poppler/Page.h | 12 ++ + poppler/TextOutputDev.cc | 414 + ++++++++++++++++++++++++++++++++++++++++++++- + poppler/TextOutputDev.h | 38 ++++- + 11 files changed, 743 insertions(+), 111 deletions(-) + +commit 3b5e20465e482eb0e75a106697ee94d60aea2fdc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 28 22:51:29 2005 +0000 + + Forgot assigning type on copy constructor + + poppler/FontInfo.cc | 1 + + 1 file changed, 1 insertion(+) + +commit e512cd1832a0e6d15149e12e8e67a39d335efc86 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 28 22:49:14 2005 +0000 + + Add FontInfo::getType() + + ChangeLog | 3 +++ + poppler/FontInfo.cc | 4 ++++ + poppler/FontInfo.h | 2 ++ + 3 files changed, 9 insertions(+) + +commit 8aeb5205f2876a9dc36eb1dc1e361bb87adf4e31 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 28 22:00:05 2005 +0000 + + use transformation matrix for image rendering in Arthur backend + + ChangeLog | 4 ++++ + poppler/ArthurOutputDev.cc | 12 +++++++----- + 2 files changed, 11 insertions(+), 5 deletions(-) + +commit a221d06fdc7b0688ca0744a1d6ad49d472c7f12c +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Jun 28 10:59:14 2005 +0000 + + Reduce cvs up noise + + .cvsignore | 1 + + ChangeLog | 7 +++++++ + qt4/.cvsignore | 3 +++ + qt4/src/.cvsignore | 7 +++++++ + qt4/tests/.cvsignore | 8 ++++++++ + 5 files changed, 26 insertions(+) + +commit ea58a20bbcf450a1ecb8fe00e8162cfdf76105f1 +Author: Brad Hards <bradh@frogmouth.net> +Date: Tue Jun 28 10:00:09 2005 +0000 + + Initial import of Qt4 bindings, and for a Qt4 "Arthur" (QPainter) + backend renderer. + + The bindings are currently unstable - you can expect substantial + change + in both source and binary interfaces. + + The Arthur renderer currently does a reasonable job of rendering path + and fill, but the image rendering doesn't work (for reasons that + aren't + clear to me) and text rendering doesn't use the right glyphs - it just + draws with the current font. There is a lot of work to do on this + too. Help is, of coure, welcome. + + ChangeLog | 12 + + Makefile.am | 10 +- + configure.ac | 94 ++- + poppler-qt4.pc.in | 12 + + poppler/ArthurOutputDev.cc | 604 +++++++++++++++++++ + poppler/ArthurOutputDev.h | 133 +++++ + poppler/Makefile.am | 20 + + qt4/Makefile.am | 1 + + qt4/src/Doxyfile | 1212 + ++++++++++++++++++++++++++++++++++++++ + qt4/src/Makefile.am | 22 + + qt4/src/poppler-document.cc | 309 ++++++++++ + qt4/src/poppler-page.cc | 170 ++++++ + qt4/src/poppler-private.h | 36 ++ + qt4/src/poppler-qt4.h | 286 +++++++++ + qt4/tests/Makefile.am | 34 ++ + qt4/tests/check_orientation.cpp | 40 ++ + qt4/tests/stress-poppler-qt4.cpp | 70 +++ + qt4/tests/test-poppler-qt4.cpp | 121 ++++ + 18 files changed, 3183 insertions(+), 3 deletions(-) + +commit 61e9bc76eb2fcb0b4b899ebfad1cc71c59fc8274 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jun 28 03:44:12 2005 +0000 + + 2005-06-27 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Change CairoOutputDev to render + to a + given surface and let the user create that surface. + + * glib/poppler-document.cc: + * glib/poppler-page.cc: + * glib/poppler-private.h: Create the cairo image surface here + instead and pass it to the CairoOutputDev for rendering. + + * poppler/CairoOutputDevImage.cc: + * poppler/CairoOutputDevImage.h: + * poppler/CairoOutputDevX.cc: + * poppler/CairoOutputDevX.h: + * poppler/Makefile.am: Remove specialized cairo output + devices. + + ChangeLog | 17 ++++ + glib/poppler-document.cc | 2 +- + glib/poppler-page.cc | 21 +++- + glib/poppler-private.h | 4 +- + poppler/CairoOutputDev.cc | 24 ++--- + poppler/CairoOutputDev.h | 8 +- + poppler/CairoOutputDevImage.cc | 80 --------------- + poppler/CairoOutputDevImage.h | 44 -------- + poppler/CairoOutputDevX.cc | 216 + ---------------------------------------- + poppler/CairoOutputDevX.h | 117 ---------------------- + poppler/Makefile.am | 8 +- + 11 files changed, 54 insertions(+), 487 deletions(-) + +commit 8079dce3f0ed91dd531465f45c6d3c568ab4ecd1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 27 01:04:32 2005 +0000 + + 2005-06-26 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDev.h: Switch back to using drawChar() + for + text, but utilize the beginString() and endString() hooks + so we + can use cairo_show_glyphs() efficiently. + + ChangeLog | 7 +++ + poppler/CairoOutputDev.cc | 107 + +++++++++++++-------------------------------- + poppler/CairoOutputDev.h | 12 ++++- + 3 files changed, 48 insertions(+), 78 deletions(-) + +commit 1aa48d6b7907a1d53830f0cf28085041f685368d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 26 23:35:26 2005 +0000 + + Add PageTransition class and PageTransition* Page::getTransition() + const; to the qt frontend. Code almost 100% copied from xpdf code + inside kpdf + + ChangeLog | 5 +++ + qt/poppler-page.cc | 121 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + qt/poppler-qt.h | 78 +++++++++++++++++++++++++++++++++ + 3 files changed, 204 insertions(+) + +commit 9d4327eecd94299a3629b0814e84f981a4be1dfb +Author: Martin Kretzschmar <martink@gnome.org> +Date: Sun Jun 26 15:54:16 2005 +0000 + + add poppler-enums.[ch]. + + ChangeLog | 2 ++ + glib/.cvsignore | 8 +++++--- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 768186514b9fc175cf330344408bb89ab4c909f3 +Author: Martin Kretzschmar <martink@gnome.org> +Date: Sun Jun 26 11:40:35 2005 +0000 + + require glib 2.4+ for g_value_take_string and G_DEFINE_TYPE. + + ChangeLog | 5 +++++ + configure.ac | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 5d40e34a367212c39af06332879f26824d6d62d2 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jun 26 00:01:39 2005 +0000 + + 2005-06-25 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Error.h: Maybe fix build on Solaris. + + ChangeLog | 4 ++++ + poppler/Error.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit c2780a3b3f4615bb28bfe394d649b388db4ccf4d +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 20 21:33:09 2005 +0000 + + 2005-06-20 Kristian Høgsberg <krh@redhat.com> + + * NEWS: + * configure.ac: Bump version to 0.3.3 and sum up changes since + last release. + + * glib/poppler-page.cc (poppler_page_find_text): Initialize + xMin + and yMin to avoid referencing unintialized memory (#3582). + + ChangeLog | 9 +++++++++ + NEWS | 10 ++++++++++ + configure.ac | 2 +- + glib/poppler-page.cc | 2 ++ + 4 files changed, 22 insertions(+), 1 deletion(-) + +commit 9023891f314ac37811b5c973be2e36b6de353cf2 +Author: Martin Kretzschmar <martink@gnome.org> +Date: Mon Jun 20 18:45:41 2005 +0000 + + (info_dict_get_string): convert from PDFDocEncoding to UTF-8. + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 16 +++++++++++++++- + 2 files changed, 20 insertions(+), 1 deletion(-) + +commit bbf2fe757f0fd08d0e90e3810709ab7152c779c0 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 20 17:58:38 2005 +0000 + + 2005-06-20 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler.h: Clean up glib rotation implementation and + add a + getter for rotation. Patch from Marco. + + ChangeLog | 7 +++++ + glib/poppler-page.cc | 69 + ++++++++++++++++++++++++++++---------------------- + glib/poppler-page.h | 57 +++++++++++++++++++++-------------------- + glib/poppler.h | 1 - + 4 files changed, 75 insertions(+), 59 deletions(-) + +commit c264d8a9f84587cd0f2ef67683a01fc8dd9395af +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 20 17:38:27 2005 +0000 + + 2005-06-20 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: + * poppler/FontInfo.cc: Fixes from Marco to handle fonts + without + name (typically type 3 fonts) and fix an iterator bug. + + ChangeLog | 6 ++++++ + glib/poppler-document.cc | 8 +++++++- + poppler/FontInfo.cc | 13 ++++++++++--- + 3 files changed, 23 insertions(+), 4 deletions(-) + +commit 4746e63a793a2881e904ac54d58b7d3e48b07dcf +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 20 17:22:35 2005 +0000 + + 2005-06-20 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_get_link_mapping): Adjust + link coordinates so they're relative to bounding box + lower left + corner (#3396). + + ChangeLog | 6 ++++++ + glib/poppler-page.cc | 6 ++++++ + 2 files changed, 12 insertions(+) + +commit bada3d03583ef6ed34d2aa743de8fd9ca4a5c748 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Jun 17 05:30:56 2005 +0000 + + 2005-06-17 Kristian Høgsberg <krh@redhat.com> + + * autogen.sh: Patch from Emil Soleyman-Zomalan to enable + checks + for automake >= 1.7 (#3554). + + ChangeLog | 5 +++ + autogen.sh | 104 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 109 insertions(+) + +commit 25db42831ddde500697126352458e092a9b0ab9b +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 15 15:02:46 2005 +0000 + + 2005-06-15 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: + * glib/poppler-document.h: Patch from Marco to get initial + status + (open or closed) for bookmark subtrees. + ----------------------------------------------------------- + + ChangeLog | 6 ++++++ + glib/poppler-document.cc | 9 +++++++++ + glib/poppler-document.h | 1 + + 3 files changed, 16 insertions(+) + +commit e54e306ac5d603001fefda3b9ecd81821e4bd09e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 13 17:18:32 2005 +0000 + + Forgot to add new files. + + poppler/FontInfo.cc | 197 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/FontInfo.h | 51 +++++++++++++ + 2 files changed, 248 insertions(+) + +commit 23e8ed5cbf4d7d999a8a1dcf714aaddaf339ceff +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 13 16:09:33 2005 +0000 + + 2005-06-13 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-private.h: + * glib/poppler.h: + * glib/test-poppler-glib.c: + * poppler/Makefile.am: Patch from Marco to extract font + info from + document. + + ChangeLog | 10 ++++ + glib/poppler-document.cc | 131 + ++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-document.h | 13 +++++ + glib/poppler-private.h | 7 +++ + glib/poppler.h | 2 + + glib/test-poppler-glib.c | 14 +++++ + poppler/Makefile.am | 2 + + 7 files changed, 179 insertions(+) + +commit fbb86d2983a28ad2c46b8c5d475a2df1f0f0e4b9 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 8 14:35:46 2005 +0000 + + 2005-06-08 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: Remember to delete tmpFileName. + Patch from Nikolai Weibull (#3491). + + ChangeLog | 5 +++++ + poppler/CairoFontEngine.cc | 37 +++++++++++++++++++------------------ + 2 files changed, 24 insertions(+), 18 deletions(-) + +commit 699b03025c1d38a42a49e39017097c5d0315fd6f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jun 7 20:25:48 2005 +0000 + + 2005-06-07 Kristian Høgsberg <krh@redhat.com> + + * qt/test-poppler-qt.cpp: Add stdlib.h include for exit(). + + ChangeLog | 4 ++++ + qt/test-poppler-qt.cpp | 1 + + 2 files changed, 5 insertions(+) + +commit 0017b1a72c58e2d016d22451079c466abdfff15c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jun 2 19:14:45 2005 +0000 + + 2005-06-02 Kristian Høgsberg <krh@redhat.com> + + * poppler/TextOutputDev.h: + * qt/poppler-qt.h: Patch from Stanislav Brabec + <sbrabec@suse.cz> + to fix gcc 4.0.1 warnings on undeclared friend classes. + + * test/gtk-splash-test.cc: Fix from Martin Kretzschmar + <martink@gnome.org> to compile with OPI enabled (#2911). + + ChangeLog | 9 +++++++++ + poppler/TextOutputDev.h | 3 +++ + qt/poppler-qt.h | 2 ++ + test/gtk-splash-test.cc | 2 +- + 4 files changed, 15 insertions(+), 1 deletion(-) + +commit 47c3b4ec2c7691e44f5100b1f5956df0005467c8 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jun 2 18:49:55 2005 +0000 + + 2005-06-02 Kristian Høgsberg <krh@redhat.com> + + Patch from Stanislav Brabec <sbrabec@suse.cz>: + + * configure.ac: + * poppler-cairo.pc.in: + * poppler-glib.pc.in: + * poppler-qt.pc.in: + * poppler-splash.pc.in: Misc fixes to pkg-config files. + + ChangeLog | 10 ++++++++++ + configure.ac | 6 ++++-- + poppler-cairo.pc.in | 3 +-- + poppler-glib.pc.in | 4 ++-- + poppler-qt.pc.in | 1 + + poppler-splash.pc.in | 3 +-- + 6 files changed, 19 insertions(+), 8 deletions(-) + +commit 9f0da96dd005defd5d82dd05b627ff1925430215 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Jun 2 00:35:44 2005 +0000 + + 2005-06-01 Jeff Muizelaar <jeff@infidigm.net> + + * poppler/Error.cc: + * poppler/Error.h: Make error handling function setable through + setErrorFunction. + + Based on a patch by Albert Astals Cid. + + ChangeLog | 8 ++++++++ + poppler/Error.cc | 29 ++++++++++++++++++++--------- + poppler/Error.h | 2 ++ + 3 files changed, 30 insertions(+), 9 deletions(-) + +commit f688aa11d066f1c6f4115cbdb604ac61fb8b5146 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun May 29 14:59:34 2005 +0000 + + 2005-05-29 Kristian Høgsberg <krh@redhat.com> + + * glib/*: Add more meta data properties to poppler document. + Patch by Emil Soleyman-Zomalan (#3359). + + ChangeLog | 5 ++ + glib/poppler-document.cc | 155 + +++++++++++++++++++++++++++++++++++++++++++++- + glib/poppler.gidl | 5 ++ + glib/test-poppler-glib.c | 46 +++++++++----- + 4 files changed, 194 insertions(+), 17 deletions(-) + +commit 9e6eeec574d48d2341ee620e16360d3b21c40103 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 26 13:03:35 2005 +0000 + + 2005-05-26 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc (clip): Remove snapToGrid + so clip() + prototype matches what Gfx actually calls (fixes clipping). + + * poppler/CairoOutputDev.cc: Update fill color, stroke + color, fill + opacity and stroke opacity from GfxState on restore, + since they + aren't handled by cairo_restore() (#3362). + + * poppler/CairoOutputDev.cc: Comment out tolerance setting + until + we figure out how cairo settings relate to pdf settings. + + * poppler/CairoOutputDev.cc: Support fill and stroke opacity. + + ChangeLog | 12 ++++++++++++ + poppler/CairoOutputDev.cc | 41 + ++++++++++++++++++++++++++++++----------- + poppler/CairoOutputDev.h | 6 +++++- + 3 files changed, 47 insertions(+), 12 deletions(-) + +commit 89a633edd860e3c6ded1e468edf6f28cfcb43d0e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 26 12:52:38 2005 +0000 + + 2005-05-26 Kristian Høgsberg <krh@redhat.com> + + * poppler/GfxState.cc: + * poppler/GfxState.h: Add GfxColorSpace::getRGBLine here and + implement in subclasses. + + * poppler/CairoOutputDev.cc (drawImage): Use getRGBLine here. + + ChangeLog | 8 +++ + poppler/CairoOutputDev.cc | 66 +++++++++---------- + poppler/GfxState.cc | 160 + ++++++++++++++++++++++++++++++++++++++++++++- + poppler/GfxState.h | 14 ++++ + 4 files changed, 212 insertions(+), 36 deletions(-) + +commit 4d8224819da7a85e4d99f96c9bbb047ece58130a +Author: Jonathan Blandford <jrb@redhat.com> +Date: Mon May 23 04:23:53 2005 +0000 + + Mon May 23 00:22:41 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-document.h: Add a permissions flag to the glib + bindings. + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 24 ++++++++++++++++++++++++ + glib/poppler-document.h | 16 +++++++++------- + 3 files changed, 38 insertions(+), 7 deletions(-) + +commit 1f677e2f60634a7d0c5e0e0d2125ab15c2722979 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat May 21 21:33:06 2005 +0000 + + 2005-05-21 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc (poppler_ps_file_new): Fix + off-by-one + error spotted by Jürg Billeter. + ----------------------------------------------------- + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 0bbf2f08173866cde9b097eeeb1f4218a396588d +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 20 20:48:52 2005 +0000 + + 2005-05-20 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: Account for different row + vs. column + vector conventions between cairo and poppler. + + ChangeLog | 3 +++ + poppler/CairoOutputDev.cc | 18 +++++++++--------- + 2 files changed, 12 insertions(+), 9 deletions(-) + +commit da44ec7e8de58e55e55b1f780bc3f4bc8307874f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 20 18:38:10 2005 +0000 + + 2005-05-20 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: Only get the code to gid map if + we're using freetype 2.1.7 or older (#3340). + + ChangeLog | 5 +++++ + poppler/CairoFontEngine.cc | 13 ++++++++----- + 2 files changed, 13 insertions(+), 5 deletions(-) + +commit 6fe29cf0a7e54b8d294471a0f94eb9e989ad1d7f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 19 05:18:04 2005 +0000 + + Add bugzilla number. + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42de1348622cf86a87bc22941bd48bffa943dac9 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 19 05:16:22 2005 +0000 + + 2005-05-19 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: Only cast to Gfx8BitFont when we + know for sure we have a truetype font. + GfxCIDFont::getCIDToGIDLen() can return 0 in which case + codeToGID + will be NULL, and we end up casting it to a Gfx8BitFont. + + ChangeLog | 7 +++++++ + poppler/CairoFontEngine.cc | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit afc05387c94a76ff0ed69b3f5d9a69ddd1448e83 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 18 17:39:59 2005 +0000 + + 2005-05-18 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Require cairo 0.5.0, bump release to 0.3.2. + + * NEWS: Sum up latest changes. + + * glib/poppler-document.cc (poppler_ps_file_new): Take a page + range here instead of just number of pages. + + ChangeLog | 9 +++++++++ + NEWS | 7 +++++++ + configure.ac | 6 +++--- + glib/poppler-document.cc | 15 ++++++++++----- + glib/poppler-document.h | 1 + + 5 files changed, 30 insertions(+), 8 deletions(-) + +commit 420134a194af9161282ccfe329d17adef8d325f2 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 17 23:38:27 2005 +0000 + + 2005-05-17 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDevX.cc: + * test/gtk-cairo-test.cc: Chase the cairo xlib constructor + again. + + ChangeLog | 5 +++++ + poppler/CairoOutputDevX.cc | 5 +++-- + test/gtk-cairo-test.cc | 5 +++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 6fd62953a910dcfb4abd9de5ea18285b8fa5d202 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 16 23:16:15 2005 +0000 + + Add bug number and attribution to ChangeLog entry. + + ChangeLog | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6d7f624c13e8a9a8251ac97388cd80e418c70250 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 16 21:56:31 2005 +0000 + + 2005-05-16 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Check for glib-mkenums. + + * glib/Makefile.am (poppler-enums.h): Generate glib enums at + compile time. + + * glib/poppler-enums.c: + * glib/poppler-enums.h: Removed. + + ChangeLog | 8 +++ + configure.ac | 3 + + glib/.cvsignore | 1 + + glib/Makefile.am | 67 ++++++++++++------ + glib/poppler-enums.c | 189 + -------------------------------------------------- + glib/poppler-enums.h | 49 ------------- + 6 files changed, 57 insertions(+), 260 deletions(-) + +commit 2801b54a944fc9e1072c5dcb9f1153a0c9f42de5 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 16 20:27:51 2005 +0000 + + 2005-05-16 Kristian Høgsberg <krh@redhat.com> + + * test/gtk-cairo-test.cc: Update this test case also. + + ChangeLog | 2 ++ + test/gtk-cairo-test.cc | 5 +++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 8753ae8ba20fcceaef3ef1dda89129f0456fccf6 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 16 19:06:00 2005 +0000 + + 2005-05-16 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDevX.cc: Track changes to cairo Xlib + surface + constructors. + + * poppler/CairoFontEngine.cc (cairo_font_face_destroy): + Make this + static. + + ChangeLog | 8 ++++++++ + poppler/CairoFontEngine.cc | 2 +- + poppler/CairoOutputDevX.cc | 5 +++-- + 3 files changed, 12 insertions(+), 3 deletions(-) + +commit 2e17106ef4711097104a561d5be49980f8b2f5ab +Author: Jonathan Blandford <jrb@redhat.com> +Date: Fri May 13 03:47:36 2005 +0000 + + whoops! commit the right file. + + glib/poppler.gidl | 212 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + glib/test.gidl | 23 ------ + 2 files changed, 212 insertions(+), 23 deletions(-) + +commit 19b62e1c8ea8ce042ac089defe94f756dcaf194e +Author: Jonathan Blandford <jrb@redhat.com> +Date: Fri May 13 03:25:32 2005 +0000 + + Thu May 12 23:10:45 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler.gidl: add metadata file. + + ChangeLog | 4 ++++ + glib/test.gidl | 23 +++++++++++++++++++++++ + 2 files changed, 27 insertions(+) + +commit bef5a548f3b21e7220079155e9b5054fb0c6c3c7 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 12 21:26:25 2005 +0000 + + 2005-05-12 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: + * poppler/CairoOutputDevX.cc: + * poppler/CairoOutputDevImage.cc: + * test/gtk-cairo-test.cc: Update to latest cairo changes, + patch + from Jens Taprogge (#3281) + + ChangeLog | 8 ++++++++ + poppler/CairoOutputDev.cc | 22 +++++++++++----------- + poppler/CairoOutputDevImage.cc | 11 ++++++----- + poppler/CairoOutputDevX.cc | 7 +++++-- + test/gtk-cairo-test.cc | 8 +++++--- + 5 files changed, 35 insertions(+), 21 deletions(-) + +commit c10ea2dd9bffaf9af023612ef196bab2b204d3e1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 11 20:01:43 2005 +0000 + + 2005-05-11 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler.cc (poppler_get_backend, poppler_get_version): + Add + these functions so it's easy to tell if poppler is using + cairo or + splash and what version. + + * glib/test-poppler-glib.c (main): Print out version and + backend. + + ChangeLog | 8 ++++++++ + glib/poppler-enums.c | 26 ++++++++++++++++++++++++++ + glib/poppler-enums.h | 15 +++++++++++++++ + glib/poppler.cc | 21 +++++++++++++++++++++ + glib/poppler.h | 11 +++++++++++ + glib/test-poppler-glib.c | 9 ++++++++- + 6 files changed, 89 insertions(+), 1 deletion(-) + +commit 7d189e33cfa68e722561e9398ad85a77b538ab14 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 6 16:38:57 2005 +0000 + + 2005-05-06 Kristian Høgsberg <krh@redhat.com> + + * glib/Makefile.am (libpoppler_glib_la_LIBADD): Link + poppler-glib + against poppler. + + * qt/Makefile.am (libpoppler_qt_la_LIBADD): Ditto for qt. + + * poppler-glib.pc (Libs): Drop -lpoppler from link. + + * poppler-qt.pc (Libs): Ditto for qt. + + * configure.ac: Test for both libqt-mt.la and libqt-mt.so + in that + order. + + ChangeLog | 14 ++++++++++++++ + configure.ac | 8 +++++++- + glib/Makefile.am | 1 + + poppler-glib.pc.in | 2 +- + poppler-qt.pc.in | 2 +- + qt/Makefile.am | 1 + + qt/test-poppler-qt.cpp | 1 + + 7 files changed, 26 insertions(+), 3 deletions(-) + +commit c937e63f17a096b94a554103476ecb9ab1b71b90 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 4 20:08:41 2005 +0000 + + 2005-05-04 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc (CairoOutputDev::drawImageMask, + CairoOutputDev::drawImage): Track cairo cvs API changes; use + cairo_mask() and cairo_paint() for drawing image masks + and images. + + ChangeLog | 6 +++ + poppler/CairoOutputDev.cc | 98 + +++++++++++++++++++++++---------------------- + 2 files changed, 57 insertions(+), 47 deletions(-) + +commit c142773ad30b409d8169a53921e731305de46e50 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 4 19:28:07 2005 +0000 + + 2005-05-04 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoOutputDev.cc: Fix matrix convention confusion. + + ChangeLog | 4 ++++ + poppler/CairoOutputDev.cc | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 28760927d724231d0137ca7ecc66c6c2250dff0d +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 4 19:11:11 2005 +0000 + + 2005-05-04 Kristian Høgsberg <krh@redhat.com> + + Patches from Albert Astals Cid: + + * qt/poppler-page.cc (getText): Use QString::fromUtf8() + instead of + implicit latin1 cast constructor. + + * qt/test-poppler-qt.cpp (main): Use a QLabel for showing text + instead of qDebug. + + ChangeLog | 10 ++++++++++ + qt/poppler-page.cc | 5 ++--- + qt/test-poppler-qt.cpp | 6 +++++- + 3 files changed, 17 insertions(+), 4 deletions(-) + +commit fd36522375bcf436639b8731acb3ad22c03c03f4 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Wed May 4 06:32:38 2005 +0000 + + Wed May 4 02:31:05 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-enums.c: (poppler_permissions_get_type): + * glib/poppler-enums.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler.h: + + Register a bunch of boxed types to test introspection, and for + LBs. Also, remove unused 'popper_document_save()' (-: + + ChangeLog | 13 ++++++++ + glib/poppler-document.cc | 48 ++++++++++++++++----------- + glib/poppler-document.h | 18 ++++++++-- + glib/poppler-enums.c | 19 +++++++++++ + glib/poppler-enums.h | 2 ++ + glib/poppler-page.cc | 83 + ++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 36 ++++++++++++++------ + glib/poppler.h | 12 ++++--- + 8 files changed, 193 insertions(+), 38 deletions(-) + +commit 132647f8311c07b1f95ee4fca185e9774aae4913 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon May 2 05:39:11 2005 +0000 + + 2005-05-01 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: + * poppler/CairoFontEngine.h: + * poppler/CairoOutputDev.cc: Back out workaround for cairo + 0.4.0 + font API and port to new cairo head. + + ChangeLog | 7 +++++ + configure.ac | 4 +-- + poppler/CairoFontEngine.cc | 67 + ++++++++++++++++------------------------ + poppler/CairoFontEngine.h | 12 +++---- + poppler/CairoOutputDev.cc | 39 ++++++++++++++--------- + poppler/CairoOutputDevImage.cc | 2 +- + 6 files changed, 66 insertions(+), 65 deletions(-) + +commit 595c18c038f8dcef73fe58612fc8b93f891e65a1 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon May 2 00:44:26 2005 +0000 + + 2005-05-01 Jeff Muizelaar <jeff@infidigm.net> + + * splash/SplashFTFont.cc (SplashFTFont::getGlyphPath): + Use FT_LOAD_NO_BITMAP to make sure we get outlines loaded instead + of bitmaps for use in FT_Outline_Decompose. + + Patch from Albert Astals Cid. + + ChangeLog | 8 ++++++++ + splash/SplashFTFont.cc | 2 +- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 49d89ca0ed3986bec7468f6c0ed295e84ba67239 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun May 1 21:54:55 2005 +0000 + + 2005-05-01 Jeff Muizelaar <jeff@infidigm.net> + + * goo/gmem.c: (gmalloc), (grealloc), (gfree): + * goo/gmem.h: make memory functions use size_t instead of int. + + Patch from Takashi Iwai through Albert Astals Cid. + + ChangeLog | 7 +++++++ + goo/gmem.c | 10 +++++----- + goo/gmem.h | 4 ++-- + 3 files changed, 14 insertions(+), 7 deletions(-) + +commit 14d618bece894e4c6bed0f179a8fda4db5a67c9d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Apr 30 19:53:57 2005 +0000 + + 2005-04-30 Jeff Muizelaar <jeff@infidigm.net> + + * qt/poppler-document.cc (Document::unlock) : + * qt/poppler-qt.h (Document::unlock): + Add const to the password argument. + + Patch from Albert Astals Cid. + + ChangeLog | 8 ++++++++ + qt/poppler-document.cc | 2 +- + qt/poppler-qt.h | 2 +- + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 1e66da32964cc76c6ed3773574f422b4608cb0e1 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Apr 30 17:31:47 2005 +0000 + + 2005-04-30 Jeff Muizelaar <jeff@infidigm.net> + + * fofi/FoFiType1.cc (FoFiType1::parse): + Don't assume Encoding array of Type1 fonts end in "foo def". + http://partners.adobe.com/public/developer/en/font/T1_SPEC.PDF + says + "This sequence of assignments must be followed by an instance + of the + token def or readonly; such a token may not occur within the + sequence + of assignments." so it must end with "readonly" "def" "readonly + def" + (That is what most fonts are using and this is why it was not + crashing) + + Patch from Albert Astals Cid. + + ChangeLog | 13 +++++++++++++ + fofi/FoFiType1.cc | 14 +++++++++++--- + 2 files changed, 24 insertions(+), 3 deletions(-) + +commit 0b532db77ef41937dd5be30d15c96557d81eceb2 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Fri Apr 29 19:37:07 2005 +0000 + + Fri Apr 29 14:54:44 2005 Jonathan Blandford <jrb@redhat.com> + + * goo/GooTimer.h: New class to do simple timing checks. + + * glib/poppler-document.c: Patch from Martin Kretzschmar + to really + set the PDF version correct. Third time's the charm. + + ChangeLog | 7 ++++++ + glib/poppler-document.cc | 4 ++- + goo/GooTimer.cc | 63 + ++++++++++++++++++++++++++++++++++++++++++++++ + goo/GooTimer.h | 40 +++++++++++++++++++++++++++++ + goo/Makefile.am | 2 ++ + 5 files changed, 115 insertions(+), 1 deletion(-) + +commit 38948ea6f9ef76dae9b8a7156fe1ef32a0457380 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Apr 29 03:57:16 2005 +0000 + + 2005-04-29 Kristian Høgsberg <krh@bitplanet.net> + + * configure.ac: Bump release to 0.3.1. + + * NEWS: Write up news for 0.3.1 release. + + ChangeLog | 6 ++++++ + NEWS | 6 ++++++ + configure.ac | 2 +- + 3 files changed, 13 insertions(+), 1 deletion(-) + +commit af65146c92682a3af06e9d3147426445c78309de +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Apr 28 23:03:06 2005 +0000 + + 2005-04-28 Kristian Høgsberg <krh@redhat.com> + + Patch from Martin Kretzschmar: + + * poppler/GlobalParams.cc: use UTF-8 as the default text + encoding. + Fixes Bug 2934. + + ChangeLog | 7 +++++++ + poppler/GlobalParams.cc | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit c2db3e1b297a9dc0accd0d8a1366970d45705c8f +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 27 20:56:18 2005 +0000 + + 2005-04-27 Jeff Muizelaar <jeff@infidigm.net> + + * configure.ac: + * poppler/FlateStream.cc: + * poppler/FlateStream.h: + * poppler/Makefile.am: + * poppler/Stream.cc: + * poppler/Stream.h: Add a reimplementation of FlateStream using + zlib. + + ChangeLog | 10 +++++ + configure.ac | 29 +++++++++++++ + poppler/FlateStream.cc | 107 + ++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/FlateStream.h | 68 ++++++++++++++++++++++++++++++ + poppler/Makefile.am | 17 +++++++- + poppler/Stream.cc | 6 +++ + poppler/Stream.h | 2 + + 7 files changed, 237 insertions(+), 2 deletions(-) + +commit bc0afe524c2b87af191d83fc9e9bcdc8a6ce4042 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Apr 27 18:53:20 2005 +0000 + + 2005-04-27 Kristian Høgsberg <krh@redhat.com> + + * poppler/Catalog.cc (NameTree::lookup): Fix bsearch return + value + NULL check. Found by Albert Astals Cid. + + ChangeLog | 5 +++++ + poppler/Catalog.cc | 8 ++++---- + 2 files changed, 9 insertions(+), 4 deletions(-) + +commit 3c37dc350d54e5a1035aecfba5bfa394f931cf51 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Tue Apr 26 17:17:05 2005 +0000 + + Tue Apr 26 13:13:42 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/test-poppler-glib.c (main): add a quick dump-to-text + test. + + ChangeLog | 4 ++++ + glib/test-poppler-glib.c | 20 ++++++++++++++++++++ + 2 files changed, 24 insertions(+) + +commit 44b800d520f90ffd143255d2c23835ea357c195b +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Apr 25 18:04:32 2005 +0000 + + Actually commit the qt/Makefile.am change advertised in the ChangeLog. + + qt/Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 437bec03dd2ab3cdf6215f9ad443b7f21ce84e18 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Apr 24 19:56:17 2005 +0000 + + 2005-04-24 Kristian Høgsberg <krh@redhat.com> + + * qt/Makefile.am (libpoppler_qt_la_SOURCES): Add + poppler-private.h + to SOURCES. + + ChangeLog | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 9b2b1244ed5f30a99120aaee49c72f7cb6a4f556 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Apr 23 20:16:02 2005 +0000 + + 2005-04-23 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: Use the right fileName for + loading + CID fonts (#3114). + + ChangeLog | 5 +++++ + poppler/CairoFontEngine.cc | 11 +++++++++-- + 2 files changed, 14 insertions(+), 2 deletions(-) + +commit e4516d728a4d1bc85831d5d00b6d6b8d49c79308 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Apr 23 00:09:05 2005 +0000 + + 2005-04-22 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Actually commit version number bump. + + ChangeLog | 4 ++++ + NEWS | 2 +- + configure.ac | 2 +- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit c20448cb26fa1c309d726f272ddf1227f5a0e6ea +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Apr 22 17:29:49 2005 +0000 + + 2005-04-22 Martin Kretzschmar <martink@gnome.org> + + * poppler/CairoFontEngine.cc: declare matrix variable + before the + first goto. Fixes build with gcc 3.3. + + ChangeLog | 5 +++++ + poppler/CairoFontEngine.cc | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 42ecccf9b454893797e3d62f0f1c0a3276689e51 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Apr 22 04:09:23 2005 +0000 + + Fri Apr 22 00:01:40 2005 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc: Hack around semi-broken + cairo-0.4.0 + font API to fix the problem where some glyphs would show up + at the + wrong sizes. We now create an FT_Face for each size and font + combination we encounter, since an FT_Face can't be shared + between + several cairo_font_t. + + ChangeLog | 8 +++++ + poppler/CairoFontEngine.cc | 79 + ++++++++++++++++++++------------------------ + poppler/CairoFontEngine.h | 23 +++++-------- + poppler/CairoOutputDev.cc | 18 +++++----- + 4 files changed, 61 insertions(+), 67 deletions(-) + +commit 7a703616d9497eba4d7d318da9918dae9cbe8f12 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Apr 21 19:50:45 2005 +0000 + + Thu Apr 21 15:43:52 2005 Kristian Høgsberg <krh@redhat.com> + + * poppler/Outline.cc: + * poppler/Outline.h: Implement the documented behaviour for + Outline::getItems() and OutlineItem::getKids() and make + documentation more precise (Patch from Marco). + + ChangeLog | 7 +++++++ + poppler/Outline.cc | 6 ++++++ + poppler/Outline.h | 7 ++++--- + 3 files changed, 17 insertions(+), 3 deletions(-) + +commit 5c89902c5ee2cf13536225c141768b29505815ce +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Apr 21 06:35:33 2005 +0000 + + Thu Apr 21 02:25:20 2005 Kristian Høgsberg <krh@redhat.com> + + * poppler/CairoFontEngine.cc (CairoFont::getFont): Cache + cairo_font_t's for a given CairoFont. With this patch + cairo will + recognize glyphs coming from the same font as such and + the glyph + cache will actually work. + + * glib/poppler-document.cc (poppler_document_new_from_file): + Add + output device (cairo or splash) to PopplerDocument and + initialize + it in the constructor. + + * glib/poppler-page.cc (splash_render_to_pixbuf, + cairo_render_to_pixbuf): Use output device from associated + poppler + document instead of creating a new one. + + * poppler-glib.pc.in (Requires): Add Requires: field. + + * poppler/Page.cc (loadThumb): Remove unecessary and buggy + call to + Stream::addFilters(), reported by Ryan Lortie (#3046). + + ChangeLog | 7 ++++++- + NEWS | 12 +++--------- + poppler/CairoFontEngine.cc | 45 + ++++++++++++++++++++++++++++++++++++++------ + poppler/CairoFontEngine.h | 9 ++++++++- + poppler/CairoOutputDev.cc | 9 +-------- + 5 files changed, 57 insertions(+), 25 deletions(-) + +commit 71c1563bb0462154cb7caa4356d8f8d049073ac4 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Apr 21 05:20:24 2005 +0000 + + Thu Apr 21 00:15:30 2005 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc (poppler_document_new_from_file): + Add + output device (cairo or splash) to PopplerDocument and + initialize + it in the constructor. + + * glib/poppler-page.cc (splash_render_to_pixbuf, + cairo_render_to_pixbuf): Use output device from associated + poppler + document instead of creating a new one. + + * poppler-glib.pc.in (Requires): Add Requires: field. + + * poppler/Page.cc (loadThumb): Remove unecessary and buggy + call to + Stream::addFilters(), reported by Ryan Lortie (#3046). + + ChangeLog | 15 +++++++++++++++ + NEWS | 15 +++++++++++++++ + glib/poppler-document.cc | 10 ++++++++++ + glib/poppler-page.cc | 22 ++-------------------- + glib/poppler-private.h | 13 +++++++++++++ + poppler-glib.pc.in | 1 + + poppler/CairoFontEngine.cc | 2 +- + poppler/Page.cc | 2 -- + 8 files changed, 57 insertions(+), 23 deletions(-) + +commit c6328cbc6cea05890b52a8302f8deba443959c03 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 20 22:48:52 2005 +0000 + + 2005-04-13 Jeff Muizelaar <jrmuizel@nit.ca> + + * qt/poppler-page.cc (Page::getText): + * qt/poppler-qt.h: add a getText method for getting + the text on a page + + * qt/test-poppler-qt.c (PDFDisplay::PDFDisplay): + add the option to display the text on a page + + Patch from Albert Astals Cid. + + ChangeLog | 11 +++++++++++ + qt/poppler-page.cc | 37 +++++++++++++++++++++++++++++++++++++ + qt/poppler-qt.h | 20 ++++++++++++++++++++ + qt/test-poppler-qt.cpp | 40 ++++++++++++++++++++++++++++++---------- + 4 files changed, 98 insertions(+), 10 deletions(-) + +commit 86a32b65100a5baedd18ce0135703289839a317c +Author: Jonathan Blandford <jrb@redhat.com> +Date: Tue Apr 19 21:22:26 2005 +0000 + + Tue Apr 19 17:21:19 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-document.cc (poppler_document_get_property): + Use + %.2g instead. + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 4e81624dcc2d5218f2f8bb4eaa992e724014a853 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Tue Apr 19 21:13:22 2005 +0000 + + Tue Apr 19 17:11:52 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-document.cc (poppler_document_get_property): + Use %g + instead of %f to avoid versioning like PDF-1.50000 + + ChangeLog | 5 +++++ + glib/poppler-document.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 6ef9d30f06be2bd8a9e1470d70f49843a7e432ac +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Apr 19 19:48:49 2005 +0000 + + Tue Apr 19 15:43:35 2005 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-action.cc (_poppler_action_new): Handle + NULL links + gracefully (fix from Jeff). + + ChangeLog | 5 +++++ + glib/poppler-action.cc | 7 ++++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 770b7310ce8b07f95960c2014bf3f6040c060ac4 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Apr 19 04:28:15 2005 +0000 + + Tue Apr 19 00:20:08 2005 Kristian Høgsberg <krh@redhat.com> + + * poppler/Catalog.cc: Fix from Marco to make sure we always + initialize Catalog::pageLabelInfo. + + ChangeLog | 5 +++++ + poppler/Catalog.cc | 3 +-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 49c10d9f2c4e0cef031f96929e38a14d7ce5af19 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Sat Apr 16 18:57:43 2005 +0000 + + Sat Apr 16 14:53:15 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/Makefile.am: Create poppler-enums.[ch] + + * glib/poppler.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-action.h: Try to clean up the headers a bit + + * glib/poppler-document.cc: + * glib/poppler-document.h: Add support for document data. + Implemented as a lot of GObject properties. + + * glib/poppler-enums.c: + * glib/poppler-enums.h: New autogenerated files. + + * glib/test-poppler-glib.c: Test the new document metadata. + Seems + to work nicely, other than the PDF string and View Prefs. + + * poppler/Catalog.cc: + * poppler/Catalog.h: Extend to support PageLayout. + + ChangeLog | 22 ++++++ + glib/Makefile.am | 32 +++++++- + glib/poppler-action.h | 15 ++-- + glib/poppler-document.cc | 196 + +++++++++++++++++++++++++++++++++++++++++----- + glib/poppler-document.h | 43 ++++++++-- + glib/poppler-enums.c | 144 ++++++++++++++++++++++++++++++++++ + glib/poppler-enums.h | 32 ++++++++ + glib/poppler-page.cc | 3 - + glib/poppler-page.h | 1 + + glib/poppler.h | 7 ++ + glib/test-poppler-glib.c | 48 +++++++++++- + poppler/Catalog.cc | 17 ++++ + poppler/Catalog.h | 11 +++ + 13 files changed, 529 insertions(+), 42 deletions(-) + +commit f35c76cd3528f1e1de594e85e734ca23624b3a62 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Apr 15 02:25:10 2005 +0000 + + 2005-04-14 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * glib/poppler.h: Patch from Marco Pesenti Gritti to set page + orientaton. + + ChangeLog | 8 ++++ + glib/poppler-page.cc | 109 + ++++++++++++++++++++++++++++++++++++++++++++---- + glib/poppler-page.h | 45 ++++++++++---------- + glib/poppler-private.h | 1 + + glib/poppler.h | 9 ++++ + 5 files changed, 142 insertions(+), 30 deletions(-) + +commit 538408a8845e167cc2d796ac8b8129d0a2e6a894 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Apr 14 01:34:38 2005 +0000 + + 2005-04-13 Jeff Muizelaar <jrmuizel@nit.ca> + + * poppler/CairoOutputDevImage.cc (getBitmap): remove unused + SplashBitmap. Patch from Albert Astals Cid. + + ChangeLog | 5 +++++ + poppler/CairoOutputDevImage.cc | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 2903530492c24f3c7cb3bf3b993500694aaa27a8 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Apr 12 15:37:39 2005 +0000 + + 2005-04-12 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Add fontconfig to PKG_CHECK_MODULES for + the cairo + backend too, since we shouldn't depend on cairo.pc to pull + that in + for us. + + * poppler/Makefile.am (INCLUDES): Add $(splash_includes) to + INCLUDES to make sure the fontconfig include path is + added when + using the splash backend. + + ChangeLog | 10 ++++++++++ + configure.ac | 4 ++-- + poppler/Makefile.am | 1 + + 3 files changed, 13 insertions(+), 2 deletions(-) + +commit 0f7dd9a0512ff97293ee3f8a762b0049393b3cc1 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Apr 9 18:14:39 2005 +0000 + + 2005-04-09 Jeff Muizelaar <jrmuizel@nit.ca> + + * poppler-qt.h: + * poppler-document.cc (okToPrint, okToChange, okToCopy): + Patch from Albert Astals Cid adding more metadata exports + + ChangeLog | 6 ++++++ + qt/poppler-document.cc | 20 ++++++++++++++++++++ + qt/poppler-qt.h | 4 ++++ + 3 files changed, 30 insertions(+) + +commit dee72b531dab83a29c7675ae06ffe376e4498a4e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Apr 8 21:09:27 2005 +0000 + + 2005-04-08 Kristian Høgsberg <krh@redhat.com> + + * poppler-qt.pc.in (Libs): Add -lpoppler to Libs. + + ChangeLog | 4 ++++ + poppler-qt.pc.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit df59ce3b1d5ca8cd46aaf5f189bc78953e21e1a9 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Fri Apr 8 03:30:33 2005 +0000 + + 2005-04-07 Jeff Muizelaar <jrmuizel@nit.ca> + + * configure.ac: redo the qt tests from Albert Astals Cid + + ChangeLog | 4 +++ + configure.ac | 78 + +++++++++++++++++++++++++++++++++++----------------------- + 2 files changed, 51 insertions(+), 31 deletions(-) + +commit 3f9dde10e4778255c468895942e45d1a2637af3a +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Fri Apr 8 03:11:00 2005 +0000 + + 2005-04-07 Jeff Muizelaar <jrmuizel@nit.ca> + + * qt/poppler-document.cc: + * qt/poppler-page.cc: + * qt/poppler-qt.h: + Patch from Albert Astals Cid adding consts and exporting some more + metadata. + + ChangeLog | 8 ++++++++ + qt/poppler-document.cc | 21 ++++++++++++++++++--- + qt/poppler-page.cc | 6 +++--- + qt/poppler-qt.h | 15 +++++++++------ + 4 files changed, 38 insertions(+), 12 deletions(-) + +commit e79a8b946e0d04b32da0b4ceea1649efd203cb07 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Apr 7 22:01:51 2005 +0000 + + 2005-04-07 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: Print to PS support from Marco + Pesenti + Gritti. + + ChangeLog | 9 +++++++++ + glib/poppler-document.cc | 45 + +++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-document.h | 8 ++++++-- + glib/poppler-page.cc | 19 +++++++++++++++++++ + glib/poppler-page.h | 40 +++++++++++++++++++++------------------- + glib/poppler-private.h | 7 +++++++ + 6 files changed, 107 insertions(+), 21 deletions(-) + +commit 7319b66eb64e735ae8b811306eb76755f088385b +Author: Jonathan Blandford <jrb@redhat.com> +Date: Thu Apr 7 16:26:15 2005 +0000 + + Thu Apr 7 12:25:39 2005 Jonathan Blandford <jrb@redhat.com> + + * configure.ac: check for qt, not glib, when enabling the qt + subdir + + ChangeLog | 5 +++++ + configure.ac | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit e258ed0cb42d524ee39451f680ad4c067e7721da +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 6 20:49:19 2005 +0000 + + 2005-04-06 Jeff Muizelaar <jrmuizel@nit.ca> + + * .cvsignore, glib/.cvsignore, qt/.cvsignore: + Add more things to .cvsignore. + Patch from Martin Kretzschmar. + + .cvsignore | 2 ++ + ChangeLog | 6 ++++++ + glib/.cvsignore | 7 +++++++ + qt/.cvsignore | 7 +++++++ + 4 files changed, 22 insertions(+) + +commit 2a5624a81aa84677a57e098d7d4045f44e3b6f3a +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 6 20:35:03 2005 +0000 + + 2005-04-06 Jeff Muizelaar <jrmuizel@nit.ca> + + * poppler-page.cc (Page::Page, Page::~Page): + Construct and deconstruct the PageData object. + Patch from Albert Astals Cid. + + ChangeLog | 6 ++++++ + qt/poppler-page.cc | 6 ++++++ + qt/poppler-qt.h | 1 + + 3 files changed, 13 insertions(+) + +commit f983e3d317660653f2bfc56f9b06e2cec675beca +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 6 14:39:40 2005 +0000 + + 2005-04-06 Jeff Muizelaar <jrmuizel@nit.ca> + + * Makefile.am, configure.ac: Add configuration for qt wrapper. + + * poppler-qt.pc.in: + * qt/Makefile.am: + * qt/poppler-document.cc: + * qt/poppler-page.cc: + * qt/poppler-private.h: + * qt/poppler-qt.h: + * qt/test-poppler-qt.cpp: + New files. + + ChangeLog | 13 +++ + Makefile.am | 13 ++- + configure.ac | 64 ++++++++++++- + poppler-qt.pc.in | 11 +++ + qt/Makefile.am | 32 +++++++ + qt/poppler-document.cc | 232 + ++++++++++++++++++++++++++++++++++++++++++++++++ + qt/poppler-page.cc | 66 ++++++++++++++ + qt/poppler-private.h | 32 +++++++ + qt/poppler-qt.h | 75 ++++++++++++++++ + qt/test-poppler-qt.cpp | 63 +++++++++++++ + 10 files changed, 597 insertions(+), 4 deletions(-) + +commit d91dd69a7a0dd581c26728d2640e4d36a7ffe75f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Apr 5 17:46:44 2005 +0000 + + 2005-04-05 Kristian Høgsberg <krh@redhat.com> + + * NEWS: Attempt to sum up changes since 0.1.2. + + * configure.ac: Bump release to 0.2.0, add AC_DEFINEs + for cairo + and splash availability. + + * poppler/CairoFontEngine.cc: Disable hinting. + + * glib/poppler-page.cc (poppler_page_render_to_pixbuf): Choose + either splash or cairo rendering, based on configure choice. + (cairo_render_to_pixbuf): New function to render using + the cairo + backend. + (splash_render_to_pixbuf): Split out the splash code to this + function. + + ChangeLog | 16 +++++ + NEWS | 6 +- + configure.ac | 16 +++-- + glib/Makefile.am | 17 ++++- + glib/poppler-page.cc | 152 + ++++++++++++++++++++++++++++++++-------- + poppler/CairoFontEngine.cc | 2 +- + poppler/CairoOutputDevImage.cc | 20 ++---- + poppler/CairoOutputDevImage.h | 3 +- + 8 files changed, 179 insertions(+), 53 deletions(-) + +commit b62b0cec2335d987b31fbb0043cb33db29cc6a13 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Apr 5 02:56:32 2005 +0000 + + 2005-04-04 Kristian Høgsberg <krh@redhat.com> + + * ChangeLog: Add this entry to test commit mailer script. + + ChangeLog | 2 ++ + 1 file changed, 2 insertions(+) + +commit 50b494266ce197fe88468ca2917b9910d77e5f98 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Apr 5 02:49:18 2005 +0000 + + 2005-04-04 Kristian Høgsberg <krh@redhat.com> + + * TODO: Add reminder about using PDF font descriptors with + fontconfig. + + ChangeLog | 3 +++ + TODO | 2 ++ + 2 files changed, 5 insertions(+) + +commit d3d12235bf4de48363571b3d992ea3bfc29e6529 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Apr 4 21:50:56 2005 +0000 + + 2005-04-04 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Add checks for mkstemp() and mkstemps(). + + * glib/poppler-page.cc (poppler_page_find_text): Reverse + y-coordinates so we return PDF style coordinates. + + From Maro Pesenti Gritti <mpgritti@gmail.com>: + + * configure.ac, poppler/Makefile.am: Check for fontconfig when + we're building the splash backend. + + * glib/poppler-page.cc (poppler_page_get_text): New + function to + select text on page. + + ChangeLog | 15 +++++++++++++++ + configure.ac | 5 ++++- + glib/poppler-page.cc | 48 + +++++++++++++++++++++++++++++++++++++++++++++--- + glib/poppler-page.h | 3 +++ + poppler/Makefile.am | 4 ++++ + 5 files changed, 71 insertions(+), 4 deletions(-) + +commit 2cb9d70678e33504246cbfbe0525c33f5e3b7736 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Apr 4 05:56:29 2005 +0000 + + 2005-04-04 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_find_text): Reverse + list of + matches so we get them in the right order. + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 8c2a5ffb73c0f2d84adebcfbd43f8347ae8c8bbc +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 3 18:17:55 2005 +0000 + + 2005-04-03 Martin Kretzschmar <martink@gnome.org> + + * poppler/DCTStream.h: Wrap #include <jpeglib.h> in extern "C" + Fixes build with unpatched libjpeg. + + ChangeLog | 5 +++++ + poppler/DCTStream.h | 2 ++ + 2 files changed, 7 insertions(+) + +commit 1879d82d9088aa36ef5e677f4bae44c84f90caa6 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat Apr 2 22:16:38 2005 +0000 + + 2005-04-02 Jeff Muizelaar <jrmuizel@nit.ca> + + * poppler/Page.h: + * poppler/Page.cc (Page::Page): + Some initial infrastructure for supporting transitions. + + ChangeLog | 6 ++++++ + poppler/Page.cc | 10 ++++++++++ + poppler/Page.h | 4 ++++ + 3 files changed, 20 insertions(+) + +commit fa4efbed51e12811070798a7cfb6b1f9e8d57abc +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Apr 1 00:32:34 2005 +0000 + + 2005-03-31 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_render_to_pixbuf): Clip + output to destination pixbuf and fix RGB order. + + ChangeLog | 5 +++++ + glib/poppler-page.cc | 38 +++++++++++++++++++++++--------------- + 2 files changed, 28 insertions(+), 15 deletions(-) + +commit bb508ded0b8c5806a9db1ec73e57b14268896911 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Mar 31 22:45:05 2005 +0000 + + 2005-03-31 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc (poppler_page_find_text): New + function to + seach a page for occurrences of a given text string. + + * glib/poppler-page.cc: Add g_return_if_fail() checks to + a couple + of functions. + + ChangeLog | 8 +++++ + glib/poppler-page.cc | 82 + ++++++++++++++++++++++++++++++++++++++++------ + glib/poppler-page.h | 18 +++++++--- + glib/test-poppler-glib.c | 19 +++++++++-- + 4 files changed, 109 insertions(+), 18 deletions(-) + +commit 0b4d481e9c79cb18cf41b503970801bbf4b95b3c +Author: Jonathan Blandford <jrb@redhat.com> +Date: Thu Mar 31 05:29:42 2005 +0000 + + Thu Mar 31 00:26:20 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h (poppler_page_get_link_mapping, + poppler_page_free_link_mapping): New functions to get a + mapping of + links to locations on the current document. + :s + + ChangeLog | 7 +++++ + glib/poppler-page.cc | 85 + +++++++++++++++++++++++++++++++++++++++++++++++--- + glib/poppler-page.h | 15 +++++++++ + 3 files changed, 102 insertions(+), 5 deletions(-) + +commit c4e18f5a454794bd5e226f1106a54ccf807c6c3d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Thu Mar 31 02:28:46 2005 +0000 + + 2005-03-30 Jeff Muizelaar <jrmuizel@nit.ca> + + * poppler/DCTStream.h: change x to unsigned int to eliminate + comparision warning + + ChangeLog | 5 +++++ + poppler/DCTStream.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit e6a2a588305b4797af901599eb6854028f2be476 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Mar 30 18:43:44 2005 +0000 + + 2005-03-30 Jeff Muizelaar <jrmuizel@nit.ca> + + * poppler/Catalog.cc: delete pageLabelInfo on deconstruction + + ChangeLog | 4 ++++ + poppler/Catalog.cc | 1 + + 2 files changed, 5 insertions(+) + +commit a52905c0f0bf4d10d2103b80924a4de204d03836 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Wed Mar 30 04:08:26 2005 +0000 + + add this + + glib/poppler-action.cc | 285 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 285 insertions(+) + +commit 9542860a74076020b5727d4b761c08cdab42d69e +Author: Jonathan Blandford <jrb@redhat.com> +Date: Wed Mar 30 04:07:57 2005 +0000 + + add these + + glib/poppler-action.h | 157 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 157 insertions(+) + +commit 07720f98eca8736695f7d0d8e98465d301e6b7cf +Author: Jonathan Blandford <jrb@redhat.com> +Date: Wed Mar 30 04:07:39 2005 +0000 + + Tue Mar 29 23:07:17 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-page.h: Reformat. + + ChangeLog | 4 ++++ + glib/poppler-page.h | 34 +++++++++++++++++----------------- + 2 files changed, 21 insertions(+), 17 deletions(-) + +commit 3437b9e122aa05f4ede24664ee5a9b2d423ef9c4 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Wed Mar 30 04:04:53 2005 +0000 + + Tue Mar 29 22:49:15 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-action.[ch]: New item to encapsulate links. + * glib/poppler-document.[ch] (poppler_index_iter_get_action): + New + function to get the action. Also, fix some warnings. + * glib/poppler-private.h (_poppler_action_new): New function. + * glib/test-poppler-glib.c: Fix warnings. + + ChangeLog | 8 +++++++ + glib/Makefile.am | 2 ++ + glib/poppler-document.cc | 57 + +++++++++++----------------------------------- + glib/poppler-document.h | 7 ++---- + glib/poppler-private.h | 12 ++++++++-- + glib/poppler.h | 1 + + glib/test-poppler-glib.c | 4 +++- + 7 files changed, 39 insertions(+), 52 deletions(-) + +commit cab0ec4d011c34b571050a446c6e3286cc8749c8 +Author: Jonathan Blandford <jrb@redhat.com> +Date: Tue Mar 29 18:49:26 2005 +0000 + + Tue Mar 29 02:36:00 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-document.[ch] (PopplerIndexIter): Add an + iter to + extract the index from the doc. Includes a bad hack, for now. + + Mon Mar 28 22:02:07 2005 Jonathan Blandford <jrb@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h (poppler_page_get_thumbnail_size): New + function. + * poppler-glib.pc.in: add -lpoppler-glib to the libs line. + + ChangeLog | 12 ++++ + glib/poppler-document.cc | 160 + +++++++++++++++++++++++++++++++++++++++++++++- + glib/poppler-document.h | 15 +++++ + glib/poppler-page.cc | 48 +++++++++++++- + glib/poppler-page.h | 3 + + poppler-glib.pc.in | 2 +- + 6 files changed, 236 insertions(+), 4 deletions(-) + +commit 2de98f3871bc4ea3e361ca4fe37f5b6561918c77 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Mar 28 07:49:54 2005 +0000 + + 2005-03-28 Kristian Høgsberg <krh@redhat.com> + + * poppler/Page.cc (loadThumb): Backend agnostic method for + extracting an embedded thumbnail iamge. + + * poppler/Dict.cc (lookupInt): New convenience method. + + * glib/poppler-page.cc (poppler_page_get_thumbnail): New glib + function for getting the embedded thumbnail image for a page. + + ChangeLog | 10 +++++ + glib/poppler-page.cc | 23 ++++++++++ + glib/poppler-page.h | 32 +++++++------- + glib/test-poppler-glib.c | 24 +++++++--- + poppler/Dict.cc | 20 +++++++++ + poppler/Dict.h | 1 + + poppler/Page.cc | 109 + ++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Page.h | 1 + + 8 files changed, 196 insertions(+), 24 deletions(-) + +commit 591055d1fbcd0b9c2bb11f14040568051c5976d1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Mar 26 00:34:21 2005 +0000 + + 2005-03-25 Kristian Høgsberg <krh@redhat.com> + + * glib/Makefile.am (libpoppler_glib_la_SOURCES): Add + + * configure.ac: Check for fontconfig for glib bindings. + + ChangeLog | 4 ++++ + configure.ac | 4 ++-- + glib/Makefile.am | 7 +++++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 1e30abe94a96b91df05716ea079c58782d767951 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Mar 24 22:24:41 2005 +0000 + + 2005-03-24 Kristian Høgsberg <krh@redhat.com> + + * glib/Makefile.am: Use POPPLER_GLIB_CFLAGS and + POPPLER_GLIB_LIBS + instead of GTK_TEST_*. Reported by Adam Jackson + <ajax@nwnk.net>. + + ChangeLog | 5 +++++ + glib/Makefile.am | 7 +++---- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 1d9fcaa34222b2ccd53280148561917dbb8d95d9 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Mar 23 05:53:08 2005 +0000 + + File Edit Options Buffers Tools Help + 2005-03-23 Kristian Høgsberg <krh@redhat.com> + + * poppler/Catalog.cc (indexToLabel, labelToIndex): Add + stricter + checking of incoming labels and indices. + + * glib/test-poppler-glib.c (main): Change test program to + take the + page label from the command line. + + ChangeLog | 6 ++++++ + glib/test-poppler-glib.c | 5 ++++- + poppler/Catalog.cc | 31 +++++++++++++++++++++++++++++-- + 3 files changed, 39 insertions(+), 3 deletions(-) + +commit a9bbb465a0ee6ab320f76d322a3f575327ad1148 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Mar 23 05:38:34 2005 +0000 + + 2005-03-23 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-page.cc: + * glib/poppler-page.h: Add poppler_page_get_index() and rename + popper_page_get_dimension() to popper_page_get_size() + + ChangeLog | 6 ++++++ + glib/poppler-page.cc | 12 +++++++++--- + glib/poppler-page.h | 32 +++++++++++++++++--------------- + glib/test-poppler-glib.c | 5 ++--- + 4 files changed, 34 insertions(+), 21 deletions(-) + +commit 178bff27d09d1e18d1fc00c975fa235b0e9f93d3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Mar 23 04:14:28 2005 +0000 + + 2005-03-22 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: Implement poppler_document_save(). + + * glib/poppler-document.h: Add prototype and format headers + properly. + + ChangeLog | 7 +++++++ + glib/poppler-document.cc | 20 ++++++++++++++++++++ + glib/poppler-document.h | 30 +++++++++++++----------------- + 3 files changed, 40 insertions(+), 17 deletions(-) + +commit e40c6f69c9466df4cc70840b959f72cb0809c777 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Mar 23 01:30:04 2005 +0000 + + 2005-03-22 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Fix --disable-popper typo reported by Albert. + Require exactly cairo 0.4 since CVS cairo has API changes. + + ChangeLog | 5 +++++ + configure.ac | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 2a1e4f6f6dd87dc59b3579175a87215fd7350ee0 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Mar 22 22:46:37 2005 +0000 + + 2005-03-22 Kristian Høgsberg <krh@redhat.com> + + * poppler/Array.cc: + * poppler/Array.h: Add getString() convenience method. + + * poppler/Catalog.cc: + * poppler/Catalog.h: Optimize lookup of named destinations. + + ChangeLog | 8 +++ + poppler/Array.cc | 15 ++++++ + poppler/Array.h | 1 + + poppler/Catalog.cc | 142 + +++++++++++++++++++++++++++++++++------------------- + poppler/Catalog.h | 32 +++++++++++- + 5 files changed, 146 insertions(+), 52 deletions(-) + +commit 4dfe0ce4a1ca09d632943f0f6315e31135957ada +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Mar 22 01:50:05 2005 +0000 + + 2005-03-21 Kristian Høgsberg <krh@redhat.com> + + * NEWS, TODO: Update these. + + ChangeLog | 4 ++++ + NEWS | 1 + + TODO | 29 ++++++++++++++++++++--------- + 3 files changed, 25 insertions(+), 9 deletions(-) + +commit c158de90a5a8c6514d8aa22efa0b891a1801e822 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Mar 21 07:53:19 2005 +0000 + + 2005-03-21 Kristian Høgsberg <krh@redhat.com> + + From Albert Astals Cid <tsdgeos@yahoo.es>: + + * poppler/Catalog.cc, poppler/Catalog.h: Parse PageMode + setting + from the Catalog dict and expose it through getPageMode() + method. + + ChangeLog | 10 ++++++++-- + poppler/Catalog.cc | 16 ++++++++++++++++ + poppler/Catalog.h | 12 ++++++++++++ + 3 files changed, 36 insertions(+), 2 deletions(-) + +commit 9887679ca195714d71cbedde9297e9dcea04eb13 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Mar 21 07:36:11 2005 +0000 + + 2005-03-21 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: + + * glib/poppler-document.h: Expose the documenttitle as + a GObject + property. + + * glib/poppler-page.cc: Expose the page label as a GObject + property. + + * glib/poppler-private.h: Add the page index to PopplerPage. + + * glib/test-poppler-glib.c: Print out page label and document + title. + + * poppler/Catalog.cc: + * poppler/Catalog.h: Add page label accessors. + + * poppler/PageLabelInfo.cc: + * poppler/PageLabelInfo.h: New files. + + * poppler/Makefile.am: Add new files to sources. + + ChangeLog | 23 +++ + glib/poppler-document.cc | 95 ++++++++++++- + glib/poppler-document.h | 3 + + glib/poppler-page.cc | 37 ++++- + glib/poppler-private.h | 3 +- + glib/test-poppler-glib.c | 13 +- + poppler/Catalog.cc | 15 ++ + poppler/Catalog.h | 6 + + poppler/Makefile.am | 4 +- + poppler/PageLabelInfo.cc | 346 + ++++++++++++++++++++++++++++++++++++++++++++++ + poppler/PageLabelInfo.h | 37 +++++ + 11 files changed, 573 insertions(+), 9 deletions(-) + +commit 2cfe917de909254bc3a114a6add68a14b5885fd0 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Mar 20 05:44:06 2005 +0000 + + 2005-03-20 Kristian Høgsberg <krh@redhat.com> + + * glib/poppler-document.cc: + * glib/poppler-page.h: + * glib/poppler.cc: + * poppler/Array.cc: + * poppler/Array.h: + * poppler/Catalog.cc: Fix up filenames in #include statements + and + comments. + + ChangeLog | 10 ++++++++++ + glib/poppler-document.cc | 2 +- + glib/poppler-document.h | 2 +- + glib/poppler-page.cc | 2 +- + glib/poppler-page.h | 2 +- + glib/poppler.cc | 2 +- + glib/poppler.h | 2 +- + 7 files changed, 16 insertions(+), 6 deletions(-) + +commit f9b6017cfaf8f814ae2fc027927477c29f24af71 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun Mar 20 00:35:21 2005 +0000 + + 2005-03-19 Kristian Høgsberg <krh@redhat.com> + + Land the first bits of the glib wrapper. + + * Makefile.am: + * configure.ac: Add new glib subdirectory and configure + options + for glib wrapper. + + * glib/Makefile.am: + * glib/poppler-document.cc: + * glib/poppler-document.h: + * glib/poppler-page.cc: + * glib/poppler-page.h: + * glib/poppler-private.h: + * glib/poppler.cc: + * glib/poppler.h: + * glib/test-poppler-glib.c: + * poppler-glib.pc.in: New files. + + ChangeLog | 19 ++++++ + Makefile.am | 27 ++++---- + NEWS | 4 ++ + configure.ac | 25 ++++++- + glib/Makefile.am | 33 ++++++++++ + glib/poppler-document.cc | 165 + ++++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-document.h | 52 +++++++++++++++ + glib/poppler-page.cc | 158 + ++++++++++++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 50 ++++++++++++++ + glib/poppler-private.h | 20 ++++++ + glib/poppler.cc | 29 ++++++++ + glib/poppler.h | 42 ++++++++++++ + glib/test-poppler-glib.c | 43 ++++++++++++ + poppler-glib.pc.in | 11 ++++ + 14 files changed, 661 insertions(+), 17 deletions(-) + +commit 2a31446b227b5cdc8334e672a71835b6ea14713a +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Mar 16 15:51:36 2005 +0000 + + 2005-03-16 Jeff Muizelaar <jrmuizel@nit.ca> + + From Dan Sheridan <dan.sheridan@postman.org.uk> + + * poppler/XRef.cc (XRef::checkEncrypted): + The key length should be 5 for revision 2 documents. + + ChangeLog | 7 +++++++ + poppler/XRef.cc | 6 ++++++ + 2 files changed, 13 insertions(+) + +commit e632a1d4b2f685993bda407458c34ef8e6b74136 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 11 22:43:29 2005 +0000 + + 2005-03-11 Kristian Høgsberg <krh@redhat.com> + + From Jeff Muizelaar <jrmuizel@nit.ca>: + + * poppler/CairoOutputDev.cc (CairoOutputDev::drawImageMask): + Use + getLine instead of getPixel. + + ChangeLog | 3 +++ + poppler/CairoOutputDev.cc | 18 ++++++++---------- + 2 files changed, 11 insertions(+), 10 deletions(-) + +commit 83e904452f205a2c0cd2723cb12b7fd4640ce342 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 11 21:42:52 2005 +0000 + + 2005-03-11 Kristian Høgsberg <krh@redhat.com> + + From Jeff Muizelaar <jrmuizel@nit.ca>: + + * configure.ac: Add checks for libjpeg. + + * DCTStream.cc, DCTStream.h, Stream.cc, Stream.h, Makefile.am: + Conditionally use libjpeg instead of xpdf jpeg decoder. + + ChangeLog | 9 +++++ + configure.ac | 34 +++++++++++++++- + poppler/DCTStream.cc | 110 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/DCTStream.h | 70 ++++++++++++++++++++++++++++++++ + poppler/Makefile.am | 14 ++++++- + poppler/Stream.cc | 8 ++++ + poppler/Stream.h | 2 + + 7 files changed, 245 insertions(+), 2 deletions(-) + +commit e2af71338fd89760c4ac76999985efc5eb92817f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 11 16:42:20 2005 +0000 + + 2005-03-10 Kristian Høgsberg <krh@redhat.com> + + From Jeff Muizelaar <jrmuizel@nit.ca>: + + * poppler/CairoFontEngine.cc (CairoFontEngine::getFont): + Don't print "Type 3 font!" message. + + * poppler/CairoOutputDev.cc (CairoOutputDev::drawImageMask): + Enable image mask drawing and do it properly, albeit slowly. + + * poppler/CairoOutputDev.h + (CairoOutputDev::interpretType3Chars): Return true so that + Gfx.cc turns type3 characters into calls to drawImageMask + + ChangeLog | 14 ++++++++++++++ + poppler/CairoFontEngine.cc | 1 - + poppler/CairoOutputDev.cc | 25 ++++++++++--------------- + poppler/CairoOutputDev.h | 2 +- + 4 files changed, 25 insertions(+), 17 deletions(-) + +commit 3dc52373346e448077d2539163e873eef6406ed7 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Mar 9 15:47:00 2005 +0000 + + 2005-03-09 Kristian Høgsberg <krh@redhat.com> + + * NEWS: Describe 0.1.2 (and 0.1.1) release. + + * configure.ac: Bump poppler version to 0.1.2 + + ChangeLog | 6 ++++++ + NEWS | 12 ++++++++++++ + configure.ac | 2 +- + 3 files changed, 19 insertions(+), 1 deletion(-) + +commit 5c6a2d34fc25df28ca5326e6910d7cf664f0c3d7 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Mar 9 15:35:31 2005 +0000 + + 2005-03-09 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Bump cairo requirement to 0.4. + + ChangeLog | 4 ++++ + configure.ac | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 5b2d9a61e79cefd819888c8c89231a5fafccd114 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Mar 5 04:57:49 2005 +0000 + + 2005-03-04 Kristian Høgsberg <krh@redhat.com> + + Patch from Jeff Muizelaar <jrmuizel@nit.ca>. Changed to + allocate + glyphs using gmalloc. + + * poppler/CairoOutputDev.cc (CairoOutputDev::drawString): + Implement drawString instead of drawChar. This change should + make clipping to a text path work and has a performance + improvement. Currently the code is a little ugly because we + can't concat matrices to cairo without losing our current + font. + + * poppler/CairoOutputDev.h (CairoOutputDev::useDrawChar): + Tell Gfx.cc that it should use drawString instead of drawChar. + + ChangeLog | 14 ++++++ + TODO | 3 ++ + poppler/CairoOutputDev.cc | 110 + ++++++++++++++++++++++++++++++++++----------- + poppler/CairoOutputDev.h | 7 +-- + 4 files changed, 102 insertions(+), 32 deletions(-) + +commit 60d190ef80a0dcd9cc3a67306e2c65c5dd482f24 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Mar 5 04:37:14 2005 +0000 + + 2005-03-04 Kristian Høgsberg <krh@redhat.com> + + * test/gtk-cairo-test.cc (view_load): + * test/gtk-splash-test.cc (view_load): Fix missing return + statement, and remove unused variables. + + * configure.ac: Add configure option to enable the default KDE + flags as described by Albert Astals Cid <tsdgeos@yahoo.es>. + + * TODO: Update with Jeff's items. + + * .cvsignore: + * */.cvsignore: Add these to silence CVS. + + ChangeLog | 9 +++++++++ + TODO | 15 +++++++++++---- + configure.ac | 21 +++++++++++++++++++++ + test/gtk-cairo-test.cc | 6 ++---- + test/gtk-splash-test.cc | 5 ++--- + 5 files changed, 45 insertions(+), 11 deletions(-) + +commit e6706e505c1675724c8870f7c58079932661db5f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sat Mar 5 02:19:50 2005 +0000 + + 2005-03-04 Kristian Høgsberg <krh@redhat.com> + + * .cvsignore: + * */.cvsignore: Add these to silence CVS. + + .cvsignore | 21 +++++++++++++++++++++ + ChangeLog | 3 +++ + fofi/.cvsignore | 8 ++++++++ + goo/.cvsignore | 8 ++++++++ + poppler/.cvsignore | 10 ++++++++++ + splash/.cvsignore | 8 ++++++++ + test/.cvsignore | 10 ++++++++++ + 7 files changed, 68 insertions(+) + +commit 932edfc3c5c61e3b3e98957b717abbf8055e1c5e +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 4 19:47:13 2005 +0000 + + 2005-03-04 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Implement same check for gtk+-2.0 tests as for + cairo. + + ChangeLog | 5 +++++ + configure.ac | 11 ++++++++--- + 2 files changed, 13 insertions(+), 3 deletions(-) + +commit c632b35ad9345f280d78c268f84ae3fd5a3921b9 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 4 16:33:43 2005 +0000 + + 2005-03-04 Kristian Høgsberg <krh@redhat.com> + + * configure.ac: Only fail hard in check for cairo if the user + specified --enable-cairo-output (from Brad Hards + <bradh@frogmouth.net>). Print summary of configure results + at the + end of configure script. + + * poppler/poppler-config.h: Remove this file (noticed by Brad + Hards <bradh@frogmouth.net>). + + ChangeLog | 5 +++++ + configure.ac | 17 ++++++++++++++--- + 2 files changed, 19 insertions(+), 3 deletions(-) + +commit 80f9c90273eb31ac349c46bf86dedff7daf21db4 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 4 15:32:32 2005 +0000 + + 2005-03-04 Kristian Høgsberg <krh@redhat.com> + + * poppler/poppler-config.h: Remove this file (noticed by Brad + Hards <bradh@frogmouth.net>). + + ChangeLog | 5 ++ + poppler/poppler-config.h | 146 + ---------------------------------------------- + 2 files changed, 5 insertions(+), 146 deletions(-) + +commit 338b83b6f08a7212fdde2bbce94385e9a71a3d23 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Mar 4 02:46:44 2005 +0000 + + 2005-03-03 Kristian Høgsberg <krh@redhat.com> + + Patch from Jeff Muizelaar <jrmuizel@nit.ca>: + + * poppler/CairoOutputDev.cc (CairoOutputDev::drawImage, + CairoOutputDev::drawImageMask): destroy the image surface and + free the image buffer. + + ChangeLog | 10 ++++++++++ + autogen.sh | 2 +- + poppler/CairoOutputDev.cc | 8 +++++--- + 3 files changed, 16 insertions(+), 4 deletions(-) + +commit 062aa51487f539406b54458885b4c9501da3c44d +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Mar 3 20:01:14 2005 +0000 + + 2005-03-03 Kristian Høgsberg <krh@redhat.com> + + * autogen.sh: Add to CVS. + + ChangeLog | 4 ++++ + autogen.sh | 4 ++++ + 2 files changed, 8 insertions(+) + +commit cb02d5d0e770e2a8cbe5a8ac810820a2ce5fec0c +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Mar 3 19:45:58 2005 +0000 + + Initial revision + + AUTHORS | 3 + + COPYING | 340 ++++ + ChangeLog | 33 + + INSTALL | 236 +++ + Makefile.am | 29 + + NEWS | 4 + + README | 37 + + README-XPDF | 376 ++++ + TODO | 21 + + configure.ac | 139 ++ + fofi/FoFiBase.cc | 156 ++ + fofi/FoFiBase.h | 55 + + fofi/FoFiEncodings.cc | 994 ++++++++++ + fofi/FoFiEncodings.h | 34 + + fofi/FoFiTrueType.cc | 1438 ++++++++++++++ + fofi/FoFiTrueType.h | 131 ++ + fofi/FoFiType1.cc | 207 ++ + fofi/FoFiType1.h | 57 + + fofi/FoFiType1C.cc | 2385 ++++++++++++++++++++++ + fofi/FoFiType1C.h | 224 +++ + fofi/Makefile.am | 16 + + goo/GooHash.cc | 356 ++++ + goo/GooHash.h | 74 + + goo/GooList.cc | 92 + + goo/GooList.h | 89 + + goo/GooMutex.h | 49 + + goo/GooString.cc | 236 +++ + goo/GooString.h | 98 + + goo/Makefile.am | 20 + + goo/gfile.cc | 705 +++++++ + goo/gfile.h | 140 ++ + goo/gmem.c | 204 ++ + goo/gmem.h | 53 + + goo/gmempp.cc | 32 + + goo/gtypes.h | 29 + + poppler-cairo.pc.in | 10 + + poppler-splash.pc.in | 10 + + poppler.pc.in | 11 + + poppler/Annot.cc | 137 ++ + poppler/Annot.h | 79 + + poppler/Array.cc | 73 + + poppler/Array.h | 56 + + poppler/BaseFile.h | 82 + + poppler/BuiltinFont.cc | 65 + + poppler/BuiltinFont.h | 55 + + poppler/BuiltinFontTables.cc | 4284 + ++++++++++++++++++++++++++++++++++++++++ + poppler/BuiltinFontTables.h | 23 + + poppler/CMap.cc | 384 ++++ + poppler/CMap.h | 101 + + poppler/CairoFontEngine.cc | 367 ++++ + poppler/CairoFontEngine.h | 61 + + poppler/CairoOutputDev.cc | 569 ++++++ + poppler/CairoOutputDev.h | 146 ++ + poppler/CairoOutputDevImage.cc | 87 + + poppler/CairoOutputDevImage.h | 43 + + poppler/CairoOutputDevX.cc | 211 ++ + poppler/CairoOutputDevX.h | 117 ++ + poppler/Catalog.cc | 364 ++++ + poppler/Catalog.h | 87 + + poppler/CharCodeToUnicode.cc | 533 +++++ + poppler/CharCodeToUnicode.h | 112 ++ + poppler/CharTypes.h | 24 + + poppler/CompactFontTables.h | 464 +++++ + poppler/Decrypt.cc | 399 ++++ + poppler/Decrypt.h | 59 + + poppler/Dict.cc | 95 + + poppler/Dict.h | 75 + + poppler/Error.cc | 38 + + poppler/Error.h | 21 + + poppler/ErrorCodes.h | 36 + + poppler/FontEncodingTables.cc | 1824 +++++++++++++++++ + poppler/FontEncodingTables.h | 20 + + poppler/Function.cc | 1525 ++++++++++++++ + poppler/Function.h | 181 ++ + poppler/Gfx.cc | 3079 +++++++++++++++++++++++++++++ + poppler/Gfx.h | 279 +++ + poppler/GfxFont.cc | 1508 ++++++++++++++ + poppler/GfxFont.h | 313 +++ + poppler/GfxState.cc | 2782 ++++++++++++++++++++++++++ + poppler/GfxState.h | 1053 ++++++++++ + poppler/GlobalParams.cc | 1764 +++++++++++++++++ + poppler/GlobalParams.h | 312 +++ + poppler/JArithmeticDecoder.cc | 300 +++ + poppler/JArithmeticDecoder.h | 89 + + poppler/JBIG2Stream.cc | 3337 +++++++++++++++++++++++++++++++ + poppler/JBIG2Stream.h | 141 ++ + poppler/JPXStream.cc | 2822 ++++++++++++++++++++++++++ + poppler/JPXStream.h | 338 ++++ + poppler/Lexer.cc | 474 +++++ + poppler/Lexer.h | 75 + + poppler/Link.cc | 851 ++++++++ + poppler/Link.h | 407 ++++ + poppler/Makefile.am | 140 ++ + poppler/NameToCharCode.cc | 116 ++ + poppler/NameToCharCode.h | 40 + + poppler/NameToUnicodeTable.h | 1097 ++++++++++ + poppler/Object.cc | 231 +++ + poppler/Object.h | 301 +++ + poppler/Outline.cc | 151 ++ + poppler/Outline.h | 74 + + poppler/OutputDev.cc | 104 + + poppler/OutputDev.h | 162 ++ + poppler/PDFDoc.cc | 322 +++ + poppler/PDFDoc.h | 176 ++ + poppler/PDFDocEncoding.cc | 44 + + poppler/PDFDocEncoding.h | 16 + + poppler/PSOutputDev.cc | 3803 +++++++++++++++++++++++++++++++++++ + poppler/PSOutputDev.h | 312 +++ + poppler/PSTokenizer.cc | 135 ++ + poppler/PSTokenizer.h | 39 + + poppler/Page.cc | 370 ++++ + poppler/Page.h | 176 ++ + poppler/Parser.cc | 231 +++ + poppler/Parser.h | 58 + + poppler/SplashOutputDev.cc | 1348 +++++++++++++ + poppler/SplashOutputDev.h | 194 ++ + poppler/Stream-CCITT.h | 459 +++++ + poppler/Stream.cc | 3979 + +++++++++++++++++++++++++++++++++++++ + poppler/Stream.h | 841 ++++++++ + poppler/TextOutputDev.cc | 3529 +++++++++++++++++++++++++++++++++ + poppler/TextOutputDev.h | 569 ++++++ + poppler/UTF8.h | 56 + + poppler/UnicodeMap.cc | 293 +++ + poppler/UnicodeMap.h | 122 ++ + poppler/UnicodeMapTables.h | 361 ++++ + poppler/UnicodeTypeTable.cc | 299 +++ + poppler/UnicodeTypeTable.h | 18 + + poppler/XRef.cc | 1026 ++++++++++ + poppler/XRef.h | 133 ++ + poppler/poppler-config.h | 146 ++ + poppler/poppler-config.h.in | 145 ++ + splash/Makefile.am | 52 + + splash/Splash.cc | 1732 ++++++++++++++++ + splash/Splash.h | 174 ++ + splash/SplashBitmap.cc | 157 ++ + splash/SplashBitmap.h | 46 + + splash/SplashClip.cc | 270 +++ + splash/SplashClip.h | 86 + + splash/SplashErrorCodes.h | 30 + + splash/SplashFTFont.cc | 289 +++ + splash/SplashFTFont.h | 53 + + splash/SplashFTFontEngine.cc | 141 ++ + splash/SplashFTFontEngine.h | 58 + + splash/SplashFTFontFile.cc | 111 ++ + splash/SplashFTFontFile.h | 68 + + splash/SplashFont.cc | 166 ++ + splash/SplashFont.h | 87 + + splash/SplashFontEngine.cc | 245 +++ + splash/SplashFontEngine.h | 83 + + splash/SplashFontFile.cc | 55 + + splash/SplashFontFile.h | 58 + + splash/SplashFontFileID.cc | 23 + + splash/SplashFontFileID.h | 28 + + splash/SplashGlyphBitmap.h | 24 + + splash/SplashMath.h | 45 + + splash/SplashPath.cc | 177 ++ + splash/SplashPath.h | 105 + + splash/SplashPattern.cc | 64 + + splash/SplashPattern.h | 79 + + splash/SplashScreen.cc | 107 + + splash/SplashScreen.h | 38 + + splash/SplashState.cc | 99 + + splash/SplashState.h | 86 + + splash/SplashT1Font.cc | 251 +++ + splash/SplashT1Font.h | 49 + + splash/SplashT1FontEngine.cc | 124 ++ + splash/SplashT1FontEngine.h | 51 + + splash/SplashT1FontFile.cc | 96 + + splash/SplashT1FontFile.h | 55 + + splash/SplashTypes.h | 80 + + splash/SplashXPath.cc | 417 ++++ + splash/SplashXPath.h | 90 + + splash/SplashXPathScanner.cc | 271 +++ + splash/SplashXPathScanner.h | 72 + + test/Makefile.am | 48 + + test/gtk-cairo-test.cc | 298 +++ + test/gtk-splash-test.cc | 314 +++ + 177 files changed, 70512 insertions(+) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake new file mode 100644 index 0000000..04de970 --- /dev/null +++ b/ConfigureChecks.cmake @@ -0,0 +1,56 @@ +# Copyright 2008 Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +include(CheckIncludeFile) +include(CheckIncludeFiles) +include(CheckSymbolExists) +include(CheckFunctionExists) +include(CheckLibraryExists) +include(CheckTypeSize) +include(CheckCSourceCompiles) + +check_include_files(dlfcn.h HAVE_DLFCN_H) +check_include_files(fcntl.h HAVE_FCNTL_H) +check_include_files(inttypes.h HAVE_INTTYPES_H) +check_include_files(memory.h HAVE_MEMORY_H) +check_include_files(stdint.h HAVE_STDINT_H) +check_include_files(stdlib.h HAVE_STDLIB_H) +check_include_files(strings.h HAVE_STRINGS_H) +check_include_files(string.h HAVE_STRING_H) +check_include_files(sys/mman.h HAVE_SYS_MMAN_H) +check_include_files(sys/stat.h HAVE_SYS_STAT_H) +check_include_files(sys/types.h HAVE_SYS_TYPES_H) +check_include_files(unistd.h HAVE_UNISTD_H) + +check_function_exists(fseek64 HAVE_FSEEK64) +check_function_exists(fseeko HAVE_FSEEKO) +check_function_exists(ftell64 HAVE_FTELL64) +check_function_exists(gmtime_r HAVE_GMTIME_R) +check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) +check_function_exists(localtime_r HAVE_LOCALTIME_R) +check_function_exists(popen HAVE_POPEN) +check_function_exists(mkstemp HAVE_MKSTEMP) +check_function_exists(mkstemps HAVE_MKSTEMPS) + +macro(CHECK_FOR_DIR include var) + check_c_source_compiles( + "#include <${include}> + +int main(int argc, char *argv[]) +{ + DIR* d = 0; + return 0; +} +" ${var}) +endmacro(CHECK_FOR_DIR) +check_for_dir("dirent.h" HAVE_DIRENT_H) +check_for_dir("ndir.h" HAVE_NDIR_H) +check_for_dir("sys/dir.h" HAVE_SYS_DIR_H) +check_for_dir("sys/ndir.h" HAVE_SYS_NDIR_H) + +check_function_exists("nanosleep" HAVE_NANOSLEEP) +if(NOT HAVE_NANOSLEEP) + check_library_exists("rt" "nanosleep" "" LIB_RT_HAS_NANOSLEEP) +endif(NOT HAVE_NANOSLEEP) diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..56b077d --- /dev/null +++ b/INSTALL @@ -0,0 +1,236 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..a9f5db1 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,119 @@ +ACLOCAL_AMFLAGS = -I m4 +DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-testdatadir=$(TESTDATADIR) + +if BUILD_SPLASH_OUTPUT +splash_subdir = splash +splash_pc_file = poppler-splash.pc +endif + +if BUILD_CAIRO_OUTPUT +cairo_pc_file = poppler-cairo.pc +endif + +if BUILD_POPPLER_GLIB +glib_subdir = glib +glib_pc_file = poppler-glib.pc +endif + +if BUILD_POPPLER_QT4 +qt4_subdir = qt4 +qt4_pc_file = poppler-qt4.pc +endif + +if BUILD_POPPLER_CPP +cpp_subdir = cpp +cpp_pc_file = poppler-cpp.pc +endif + +if BUILD_UTILS +utils_subdir = utils +endif + +SUBDIRS = goo fofi $(splash_subdir) poppler $(utils_subdir) $(glib_subdir) test $(qt4_subdir) $(cpp_subdir) + +EXTRA_DIST = \ + README-XPDF \ + poppler.pc.in \ + poppler-uninstalled.pc.in \ + poppler-cairo.pc.in \ + poppler-cairo-uninstalled.pc.in \ + poppler-splash.pc.in \ + poppler-splash-uninstalled.pc.in \ + poppler-qt4.pc.in \ + poppler-qt4-uninstalled.pc.in \ + poppler-cpp.pc.in \ + poppler-cpp-uninstalled.pc.in + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = \ + poppler.pc \ + $(cairo_pc_file) \ + $(splash_pc_file) \ + $(glib_pc_file) \ + $(qt4_pc_file) \ + $(cpp_pc_file) + +# Add CMake buildsystem files here so they get added on make dist +EXTRA_DIST += \ + cpp/tests/CMakeLists.txt \ + cpp/CMakeLists.txt \ + glib/demo/CMakeLists.txt \ + glib/CMakeLists.txt \ + glib/poppler-features.h.cmake \ + qt4/src/CMakeLists.txt \ + qt4/tests/CMakeLists.txt \ + qt4/CMakeLists.txt \ + qt4/demos/CMakeLists.txt \ + test/CMakeLists.txt \ + utils/CMakeLists.txt \ + CMakeLists.txt \ + ConfigureChecks.cmake \ + cmake/modules/COPYING-CMAKE-SCRIPTS \ + cmake/modules/FindCairo.cmake \ + cmake/modules/FindFontconfig.cmake \ + cmake/modules/FindGLIB.cmake \ + cmake/modules/FindGObjectIntrospection.cmake \ + cmake/modules/FindGTK.cmake \ + cmake/modules/FindIconv.cmake \ + cmake/modules/FindLCMS.cmake \ + cmake/modules/FindLCMS2.cmake \ + cmake/modules/FindQt4.cmake \ + cmake/modules/GObjectIntrospectionMacros.cmake \ + cmake/modules/MacroBoolTo01.cmake \ + cmake/modules/MacroEnsureVersion.cmake \ + cmake/modules/MacroOptionalFindPackage.cmake \ + cmake/modules/MacroPushRequiredVars.cmake \ + cmake/modules/PopplerDefaults.cmake \ + cmake/modules/PopplerMacros.cmake \ + cmake/modules/FindLIBOPENJPEG.cmake \ + config.h.cmake \ + poppler-cairo.pc.cmake \ + poppler/poppler-config.h.cmake \ + poppler-cpp.pc.cmake \ + poppler-glib.pc.cmake \ + poppler-qt4.pc.cmake \ + poppler-splash.pc.cmake \ + poppler.pc.cmake + + + +distclean-local: + if test "$(srcdir)" = "."; then :; else \ + rm -f ChangeLog; \ + fi + +ChangeLog: + $(AM_V_GEN) if test -d "$(srcdir)/.git"; then \ + (GIT_DIR=$(top_srcdir)/.git ./missing --run git log --stat) | fmt --split-only > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ + (test -f $@ || echo git log is required to generate this file >> $@)); \ + else \ + test -f $@ || \ + (echo A git checkout and git log is required to generate ChangeLog >&2 && \ + echo A git checkout and git log is required to generate this file >> $@); \ + fi + +.PHONY: ChangeLog + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..4c5e428 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1025 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/poppler-cairo-uninstalled.pc.in \ + $(srcdir)/poppler-cairo.pc.in \ + $(srcdir)/poppler-cpp-uninstalled.pc.in \ + $(srcdir)/poppler-cpp.pc.in \ + $(srcdir)/poppler-glib-uninstalled.pc.in \ + $(srcdir)/poppler-glib.pc.in \ + $(srcdir)/poppler-qt4-uninstalled.pc.in \ + $(srcdir)/poppler-qt4.pc.in \ + $(srcdir)/poppler-splash-uninstalled.pc.in \ + $(srcdir)/poppler-splash.pc.in \ + $(srcdir)/poppler-uninstalled.pc.in $(srcdir)/poppler.pc.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + TODO config.guess config.sub depcomp install-sh ltmain.sh \ + missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = poppler.pc poppler-uninstalled.pc \ + poppler-cairo.pc poppler-cairo-uninstalled.pc \ + poppler-splash.pc poppler-splash-uninstalled.pc \ + poppler-glib.pc poppler-glib-uninstalled.pc poppler-qt4.pc \ + poppler-qt4-uninstalled.pc poppler-cpp.pc \ + poppler-cpp-uninstalled.pc +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgconfigdir)" +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = goo fofi splash poppler utils glib test qt4 cpp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +ACLOCAL_AMFLAGS = -I m4 +DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --with-testdatadir=$(TESTDATADIR) +@BUILD_SPLASH_OUTPUT_TRUE@splash_subdir = splash +@BUILD_SPLASH_OUTPUT_TRUE@splash_pc_file = poppler-splash.pc +@BUILD_CAIRO_OUTPUT_TRUE@cairo_pc_file = poppler-cairo.pc +@BUILD_POPPLER_GLIB_TRUE@glib_subdir = glib +@BUILD_POPPLER_GLIB_TRUE@glib_pc_file = poppler-glib.pc +@BUILD_POPPLER_QT4_TRUE@qt4_subdir = qt4 +@BUILD_POPPLER_QT4_TRUE@qt4_pc_file = poppler-qt4.pc +@BUILD_POPPLER_CPP_TRUE@cpp_subdir = cpp +@BUILD_POPPLER_CPP_TRUE@cpp_pc_file = poppler-cpp.pc +@BUILD_UTILS_TRUE@utils_subdir = utils +SUBDIRS = goo fofi $(splash_subdir) poppler $(utils_subdir) $(glib_subdir) test $(qt4_subdir) $(cpp_subdir) + +# Add CMake buildsystem files here so they get added on make dist +EXTRA_DIST = README-XPDF poppler.pc.in poppler-uninstalled.pc.in \ + poppler-cairo.pc.in poppler-cairo-uninstalled.pc.in \ + poppler-splash.pc.in poppler-splash-uninstalled.pc.in \ + poppler-qt4.pc.in poppler-qt4-uninstalled.pc.in \ + poppler-cpp.pc.in poppler-cpp-uninstalled.pc.in \ + cpp/tests/CMakeLists.txt cpp/CMakeLists.txt \ + glib/demo/CMakeLists.txt glib/CMakeLists.txt \ + glib/poppler-features.h.cmake qt4/src/CMakeLists.txt \ + qt4/tests/CMakeLists.txt qt4/CMakeLists.txt \ + qt4/demos/CMakeLists.txt test/CMakeLists.txt \ + utils/CMakeLists.txt CMakeLists.txt ConfigureChecks.cmake \ + cmake/modules/COPYING-CMAKE-SCRIPTS \ + cmake/modules/FindCairo.cmake \ + cmake/modules/FindFontconfig.cmake \ + cmake/modules/FindGLIB.cmake \ + cmake/modules/FindGObjectIntrospection.cmake \ + cmake/modules/FindGTK.cmake cmake/modules/FindIconv.cmake \ + cmake/modules/FindLCMS.cmake cmake/modules/FindLCMS2.cmake \ + cmake/modules/FindQt4.cmake \ + cmake/modules/GObjectIntrospectionMacros.cmake \ + cmake/modules/MacroBoolTo01.cmake \ + cmake/modules/MacroEnsureVersion.cmake \ + cmake/modules/MacroOptionalFindPackage.cmake \ + cmake/modules/MacroPushRequiredVars.cmake \ + cmake/modules/PopplerDefaults.cmake \ + cmake/modules/PopplerMacros.cmake \ + cmake/modules/FindLIBOPENJPEG.cmake config.h.cmake \ + poppler-cairo.pc.cmake poppler/poppler-config.h.cmake \ + poppler-cpp.pc.cmake poppler-glib.pc.cmake \ + poppler-qt4.pc.cmake poppler-splash.pc.cmake poppler.pc.cmake +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = \ + poppler.pc \ + $(cairo_pc_file) \ + $(splash_pc_file) \ + $(glib_pc_file) \ + $(qt4_pc_file) \ + $(cpp_pc_file) + +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +poppler.pc: $(top_builddir)/config.status $(srcdir)/poppler.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-cairo.pc: $(top_builddir)/config.status $(srcdir)/poppler-cairo.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-cairo-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-cairo-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-splash.pc: $(top_builddir)/config.status $(srcdir)/poppler-splash.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-splash-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-splash-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-glib.pc: $(top_builddir)/config.status $(srcdir)/poppler-glib.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-glib-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-glib-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-qt4.pc: $(top_builddir)/config.status $(srcdir)/poppler-qt4.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-qt4-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-qt4-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-cpp.pc: $(top_builddir)/config.status $(srcdir)/poppler-cpp.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +poppler-cpp-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/poppler-cpp-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-pkgconfigDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-local distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-pkgconfigDATA + + +distclean-local: + if test "$(srcdir)" = "."; then :; else \ + rm -f ChangeLog; \ + fi + +ChangeLog: + $(AM_V_GEN) if test -d "$(srcdir)/.git"; then \ + (GIT_DIR=$(top_srcdir)/.git ./missing --run git log --stat) | fmt --split-only > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ + (test -f $@ || echo git log is required to generate this file >> $@)); \ + else \ + test -f $@ || \ + (echo A git checkout and git log is required to generate ChangeLog >&2 && \ + echo A git checkout and git log is required to generate this file >> $@); \ + fi + +.PHONY: ChangeLog + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..f73dac0 --- /dev/null +++ b/NEWS @@ -0,0 +1,1685 @@ +Release 0.20.4 + core: + * Improvements regarding embeddef file handling. (KDE Bug #306008) + * Fix opening some broken files (Bug #14303) + * Fix memory leaks + * Fix crashes in various broken files + * Refine warning to only complain when really needed + * Remove function declared but not implemented + * Remove execution permissions from a header file + + qt4: + * Improvements regarding embeddef file handling. (KDE Bug #306008) + +Release 0.20.3 + core: + * If NULL, NULL fails as password try EMPTY, EMPTY before failing (Bug #3498) + * SplashOutputDev: Fix bogus memory allocation size in Splash::arbitraryTransformImage (Bug #49523) + * SplashOutputDev: Fix segfault when scaleImage returns NULL (Bug #52488) + * SplashOutputDev: Blend mode enhancements for CMYK + * PSOutputDev: Fix conversion when creating multiple strips (Bug #51982) + * PSOutputDev: Fix Bitmaps in level2sep or level3sep (Bug #52384) + * PSOutputDev: Fix DeviceN images with alternate Lab colorspace in level 3 PostScript (Bug #51822) + * PSOutputDev: Make sure xScale and yScale are always initialized (Bug #52215) + * Unify poppler-config.h includes in core "installed" headers (Bug #52193) + * Replace c++ style includes with c style ones (Bug #52426) + + utils: + * pdfseparate: Return 0 on success + +Release 0.20.2 + core: + * Fix compilation on Windows + * Copy resources content defined in the pages dict on save (Bug #51369) + * PSOutputDev: Correct %%DocumentCustomColors (Bug #51479) + * PSOutputDev: Fix handling of DeviceN images in level 3 PostScript (Bug #51548) + * Fix crash in malformed documents + + qt4: + * Do not hang on malformed /Annots objects (Bug #51361) + +Release 0.20.1 + core: + * Remove unnecesary transparency group handling in splash (Bug #13487) + * Include substitute font name in system font cache (Bug #49826) + * Fix logic on SplashBitmap::writeImgFile + * PSOutputDev: use setoverprintmode only if rip knows it + * Fix crash in malformed documents + + qt4: + * Make TextAnnotation constructor public + * Fix saving of default TextAnnotation to xml + * Keep page rotation into account when normalizing annotation coords + + glib: + * Fix memory leak when document fails to load + * Make sure password is always converted to latin1 + * Fix typo in documentation + + build system: + * Distribute cmake/modules/FindLCMS2.cmake (Bug #49818) + + utils: + * pdftohtml: Determine if font is bold or italic based on FontDescriptor (Bug #49758) + * pdfseparate: Syntax fixes in the man page + +Release 0.20.0 + core: + * Reconstruct xref table if xref needed but missing (Bug #40719) + * Fix getFullyQualifiedName with unicode field names (Bug #49256) + * SplashOutputDev: Fix rendering of knockout groups (Bug #12185) + * SplashOutputDev: Fix cmyk transfer bug (Bug #49341) + * Fix crashes in broken documents + * Bring back the Outputdev::begin/endMarkedContent virtuals + * Build fixes + + qt4: + * Convert propertly unicode encoded field qualified names + + glib: + * glib: Use delete[] to free array allocated with new[] (Bug #48447) + +Release 0.19.4 + core: + * Annotation improvements + * More compatible file writing + * SplashOutputDev: Fix slow rendering of pdf with a lot of image masks in pattern colorspace + * Fix crashes in broken documents + * Fix spurious warning messages + + utils: + * pdftotext: Add missing section heading to man page + * pdftohtml: Fix crash when the destination file does not exist + + build system: + * autoconf: Do not append "-ansi" to CXXFLAG, if "-std=XXX" is already specified. + * autoconf: Do not clear FREETYPE_CFLAGS, FREETYPE_LIBS before PKG_CHECK_MODULES() + * autoconf: Copying graphics library CFLAGS to cpp frontend Makefile.am + +Release 0.19.3 + core: + * Annotation improvements + * CairoOutputDev: Fix regression caused by mesh gradients + * CairoOutputDev: Use correct userfont font bbox (Bug #48399) + * CairoOutputDev: Fix paintTransparencyGroup when both mask and fill opacity are required (Bug #48453) + * CairoOutputDev: Ensure 0 width lines with stroke_adjust are aligned + * CairoOutputDev: Only align stroke coords for horizontal and vertical lines (Bug #48318) + * CairoOutputDev: Fix stroke pattern with transparency group (Bug #48468) + * Fix crash in JBIG2Stream decoding + * Fix memory leak when looking for a substitute font + * Fix page labels to not have a null character at the end + * Fix Splash CMYK merge error + * ttc<->ttf fallback is expected for CJK font list in for Windows (Bug #48046) + + qt4: + * Annotations can now be modified + * Annotations can now be added + * Annotations can now be removed + + utils: + * pdftohtml: Add producer and version to xml output + * pdftohtml: Fix the mask inversion for PNG + +Release 0.19.2 + core: + * Annotation improvements + * CairoOutputDev: update cairo mesh pattern to 1.12 api + * CairoOutputDev: fix some transparency issues (Bug #47739) + * CairoOutputDev: Fix regression in some shadings + * TextOutputDev: Don't add newline to last line extracted by TextSelectionDumper (Bug #45955) + * CJK font improvements + * Improve font matching for non embedded fonts + * Fix regression regarding forceRasterize in PSOutputDev + * Fix typos glyph names in truetype 'post' table standard mac ordering + + build system: + * minor cmake fixes + * misc autoconf fixes + * POPPLER_VERSION is now wrapped in quotes + + utils: + * pdftohtml: extract mask images even if they are not JPEG (Bug #47186) + * pdftohtml: Flip images if they need to (Bug #32340) + +Release 0.19.1 + core: + * Improve CJK suport in PSOutputDev + * CJK substitute implementation on WIndows platforms + * Do not crash on malformed files with 0 bits in the color map of an image + * Fix regression in some PSOutputDev array sizing + * Improvements to Annotation editing + * Fix logic error in Rendition parsing code (Bug #47063) + * Minor API changes to SplashOutputDev (Bug #46622) + * Fix mismatch in some functions declarations + * Update poppler copyright year + + utils: + * pdftops: Fix -passfonts regression. (Bug #46744) + * pdffonts: List the encoding of each font. (Bug #46888) + * pdftohtml: Add possibilty of controlling word breaks percentage. (Bug #47022) + + qt4: + * Support for LinkMovie object (Bug #40561) + * Support for Media Rendition + + glib: + * Add poppler_fonts_iter_get_encoding + * Improvements to the demo + +Release 0.19.0 + core: + * Merge Xpdf 3.03 + * Add support for lcms2 + * SplashOutputDev: Implement Overprint + * PSOutputDev: Implement Overprint + * Expand glyph name ligatures such as "ff", "ffi" etc to normal form (Bug #7002) + * Use an Identity CharCodeToUnicode for Adobe-Identity and Adobe-UCS collections (Bug #35468) + * CairoOutputDev: Avoid setting huge clip area when printing (Bug #44002) + * CairoOutputDev: Fix test for rotation (Bug #14619) + * CairoOutputDev: Don't read inline image streams twice (Bug #45668) + * CairoOutputDev: set mask matrix before drawing an image with a mask (Bug #40828) + * Update glyph names to Unicode values mapping (Bug #13131) + * Only use Hints table when there are no parse errors (Bug #46459) + * Expose POPPLER_VERSION in poppler-config.h + + utils: + * pdftohtml: Output images in -xml mode if no -i option is specified + * pdftohtml: Get rid of static data members; merge duplicated jpeg dumping code + * pdftohtml: Be more consistent generating the outlines + * pdftohtml: Generate outlines in pdftohtml in -xml mode (Bug #56993) + * pdftohtml: Combine UTF16 surrogate pairs (Bug #46521) + * pdfinfo: Report page rotation + * pdfinfo: Decode utf-16 surrogate pairs + * pdftoppm: Allow one of -scale-to-[xy] = -1 to mean the aspect ratio is to be preserved (Bug #43393) + * pdftocairo: Allow one of -scale-to-[xy] = -1 to mean the aspect ratio is to be preserved + * pdffonts: Add -subst option to list the substitute font name and filename + * pdfseparate: Produce PDF/X conformant pdf pages if the original PDF was PDF/X conformant + * pdfimages: Add -list option to list all images (Bug #46066) + * Improve various manpages + + glib: + * Add poppler_fonts_iter_get_substitute_name + * Demo improvements + * Update gtk-doc makefile and m4 file + * Fix typos in documentation + + qt4: + * Add the option of PSConverter creating EPS + * Form support improvements + + build system: + * autotools: Print the cairo version required if not found (Bug #44619) + * autotools: Print the glib version required if not found + * autotools: Use pkgconfig to check for libopenjpeg (Bug #21789) + * autotools: Replace openjpeg compile test with a version test + * Add a configuration option for the test data dir + +Release 0.18.4 + core: + * CairoOutputDev: Restore temporary clip used in CairoOutputDev::fill when painting a mask + * CairoOutputDev: Ensure paintTransparencyGroup uses same ctm as beginTransparencyGroup. Bug #29968 + * CairoOutputDev: Use fabs when comparing the transformed line width. Bug #43441 + * CairoOutputDev: Remove unused variable in CairoFontEngine.cc. Bug #45442 + * SplashOutputDev: Do not use 50Kb of stack in SplashXPath::addCurve. Bug #44905 + * JpegWriter: set image parameters after jpeg_set_defaults(). Bug #45224 + * OpenJPEG decoder: Set OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG if you have it. Bug #43414 + * Lexer: convert integer to real when overflow occurs. Bug #45605 + + glib: + * Various minor introspection and documentation improvements. Bug #44790 + * Fix return values. Bug #45440. Bug #45441 + * gtk-doc improvements. Bug #45549 + * Introspection improvements. Bug #45455 + + utils: + * HtmlOutputDev: Proper unicode support when dumping PDF outline. Bug #45572 + * HtmlOutputDev: Fix leaks. Bug #45805 + * HtmlOutputDev: Close li tags in generated outlines. Bug #45807 + * man pages: fix minor issues with hypens and % + + build system: + * automake: Link to lcms if needed + * automake: Fix build for builddir != srcdir. Bug #45434 + * automake: Improve moc detection when cross compiling + * Fix build with latest mingw-w64 headers. Bug #45407 + + qt4: + * remove non-existing 'qt' include dirs + +Release 0.18.3 + core: + * Do not fail if we are trying to save a file with Encrypt that has not been modified. KDE Bug #288045 + * Include .otf fonts when finding substitute fonts. Bug #44412 + * Fix stack overflow in PDFDoc::markObject(). Bug #44660 + * Include strings.h as we use memcpy. Bug #43558 + + utils: + * pdfunite: Properly initialize globalParams. Bug #44659 + * pdfseparate: Properly initialize globalParams + * Fix iniliazialization of GooString arguments + + build system: + * autoconf: Check for cairo-ft and other cairo backends. Bug #43969 + +Release 0.18.2 + core: + * Fix leak in GooString when resizing to a smaller string + * Fix crash if failing to parse the colorspace. Bug #42793 + * Make GfxColorSpace::parse accept dicts + + qt4: + * Use PDFDoc(wchar_t *, ...) on Windows. Bug #35378 + * Add missing include + * Minor fixes in documentation + + utils: + * pdftocairo: Fix crash when rendering only odd/even pages in a printing format + + build system: + * Fix pkg-config files + +Release 0.18.1 + core: + * PSOutputDev: Output PS that does not confuse libspectre + * PSOutputDev: Fix tiling pattern fill matrix. Bug #41374 + * PSOutputDev: Emit non repeating patterns just once + * PSOutputDev: Fix uncolored tiling patterns. Bug #41462 + * CairoOutputDev: Fix crash when using poppler_page_get_image() + * CairoOutputDev: Fix various setSoftMask bugs. Bug #41005 + + utils: + * pdftocairo: Flush/close files one we are done using them + * pdftocairo: Compile in Windows + + build system: + * CMake: Fix typo in option description + * CMake: Correctly include fontconfig include dir + * Remove poppler-cairo dependency from poppler-glib pkg-config file + + qt4: + * Minor fixes in documentation + +Release 0.18.0 + core: + * Fix small memory leak when dealing with marked content + * Remove DCTStream::getRawStream since Stream::getNextStream does the same + + utils: + * Rename pdfmerge to pdfunite + * Rename pdfextract to pdfseparate + * pdfseparate: Complain if %d is not present and it should + * Add pdfseparate and pdfunite man pages + + build system: + * Minor cleanup in regarding removed qt code + +Release 0.17.4 (0.18 RC) + core: + * SplashOutputDev: Compile when defining USE_FIXEDPOINT + * PNGWriter: Compile with libpng >= 1.5.0 + +Release 0.17.3 (0.18 Beta 3) + core: + * PSOutputDev: Use Patterns for tiling fill when PS level >= 2 + * PSOutputDev: Avoid using /PatternType if only one instance of the pattern is used + * PSOutputDev: Add poppler version as comment in the file + * CairoOutputDev: Set mime data for soft masked images (Bug #40192) + * CairoOutputDev: Assume printer pixel size is 1/600" when stroking 0 width lines (Bug #39067) + * CairoOutputDev: Use cairo_show_text_glyphs() when printing + * CairoOutputDev: Fix stroke patterns (Bug #11719) + * CairoOutputDev: Fix unique id mime data + * CairoOutputDev: fix stroking of very thin lines + * CairoOutputDev: align strokes when Stroke Adjust is true and line width <= 1 (Bug #4536) + * TextOutputDev: Add TextFontInfo::matches() + * Improve PNGWriter + * Rework writing of PDF files + + utils: + * Introduce pdftocairo - utility for creating png/jpeg/ps/eps/pdf/svg using CairoOutputDev + * Introduce pdfextract - utility to extract PDF pages + * Introduce pdfmerge - utility to merge PDF files + * Fix compilation warning + * pdftohtml: Support text rotation (Bug #38586) + * Update SEE ALSO section of man pages + + glib: + * Add poppler_page_get_text_attributes() + * Add text attributes information to text demo + + qt4: + * Add a way to get the fully qualified name of a FormField + * Minor documentation improvements + +Release 0.17.2 (0.18 Beta 2) + core: + * EmbeddedFile improvements + * don't gmalloc(-1) upon ftell failure + * Fix missing content in some pages (Bug #39637) + * Improve selection of CJK fonts (Bug #36474) + * SplashOutputDev: Implement overprint + * SplashOutputDev: Render dots for 0 length dashed lines (Bug #34150) + * SplashOutputDev: Fix bad memory access when not using antialias (Bug #37189) + * PSOutputDev: Make level2sep and level3sep write cmyk instead of rgb + * PSOutputDev: Make level1sep, level2sep and level3sep write gray instead of rgb for gray images + * Fix numerical overflow in libopenjpeg JPXStream (Bug #39361) + * Fix crash on truncated JPEG/DCT stream (Bug #36693) + * Make sure the dict is a page dict (Bugs #35925 #39072) + * Fix calculation of startXRefPos + * Handle missing startxref properly (Bug #38209) + * Parse the "Medium" modifier when asking fontconfig for a font + * Header cleanup + * Include cleanup + * Define cleanup + + glib: + * Add missing permissions flags to PopplerPermissions + * Add missing permission flags to info demo + * Update gtk-doc.make + * Add poppler_document_get_n_attachments() + + utils: + * pdftohtml: Fix encoding of PDF document metadata (Bug #37900) + * pdftohtml: Fix vertical spacing issues (Bug #38019) + * pdftotext: Fix -htmlmeta to correctly output U+2019 in PDF metadata (Bug #37900) + * pdftoppm: Implement overprint + + qt4: + * Rework EmbeddedFile internals + * Fix possible crash in test + +Release 0.17.1 (0.18 Beta 1) + core: + * Rework the way form fields tree is built + * Cleanup unused parameters/variables + + glib: + * Add JavaScript actions + * demo: Show javascript actions in actions view + + qt4: + * tests: Turn some assignments to bool into QVERIFY checks + +Release 0.17.0 (0.18 Alpha) + core: + * Splash: Implement tiling patterns + * Splash: Support slight hinting + * Splash: Radial shading improvements + * Splash: General speed improvements + * Arthur: Add Hinting API + * Cairo: Implement Type 4,5,6,7 shadings using cairo mesh gradients + * Cairo: Use the new cairo unique id to set the surface id when printing + * PS: Add PS level1 non standard binary output option + * PS: Allow setting the rasterization resolution + * Form support improvements + * Annotation support improvements + * General speed improvements + * Add support for handling ViewerPreferences + * Remove abiword output device + + utils: + * pdftoppm: Add -singlefile option (Bug #32025) + * pdftoppm: Add TIFF output format support (Bug #32027) + * pdftops: Add PS level1 non standard binary output option + * pdftops: Allow setting the rasterization resolution + * pdftoabw has been removed + + glib: + * Add poppler_form_field_get_action() (Bug 33174) + * Remove GDK API + * Remove test-poppler-glib + * demo: Add a tooltip with current selected character in text demo + * demo: show the activation action of form fields if there's one + + cpp: + * Add TIFF output possibility + * Add PNM output possibility + + qt4: + * Support slight hinting + * Form support improvements + + qt3: + * The Qt3 frontend has been removed + + tests: + * Merge splash and cairo tests into a single gtk-test tool + +Release 0.16.4 + core: + * Small improvements in Annot parsing + + glib: + * Add g_return macros to make sure index is correct in form field choice methods + * Fix a crash when a choice form field has no items selected in glib-demo + + utils: + * Small fixes to the pdftohtml manpage + * Fix copyright years + + qt4: + * Fix caption of push button fields + +Release 0.16.3 + core: + * Increase precision in PS output device + * Workaround bug when converting pdf to ps with level1 (Bug #31926) + * Fix crash in Splash output device in some broken pdf + * Fix infinite loop in some broken files + * Fix rendering of some substituted fonts (Bug #34522) + * Do not ask Freetype for 0x0 fonts in Splash output device (Bug #34602) + * Don't assume y1 > y3 for points of a highlight annotation (Gnome Bug #643028) + * Handle fontCIDType2OT when creating freetype font in Cairo output device (Gnome Bug #643273) + * Fix crash in some pdf that use ICC color space (Bug #34357) + + glib: + * Don't use an uninitialized local variable in demo + * Add some introspection markers + + qt4: + * Fix crash regression in unicodeToQString (again) + + utils: + * pdftotext: Do not crash when using -bbox + +Release 0.16.2 + core: + * Fix text extraction for some files + + qt4: + * Fix crash regression in unicodeToQString + +Release 0.16.1 + core: + * Fix colorspace issues in the Cairo backend (Bug #32746) + * Remove declaration of function without implementation + * Do not crash in case jpeg_create_decompress fails (Bug #32890) + * Fix variable access mismatch (Bug #33063) + * Fix converting some pdf to ps with -level1sep (Bug #32365) + * Fix line selection, dont check y for Line selections + * Include zlib header in PNGWriter.cc + * Fix leak in Splash backend when doing axial shaded fills + * Fix label to index conversion on multiple prefixes + + glib: + * Use NULL instead of FALSE for functions returning a pointer + * Fix memory leak in poppler_page_get_text_layout() for pages with no text + + qt4: + * Fix unicodeToQString() to correctly decode the Unicode sequence + +Release 0.16.0 + + core: + * Improve the correctness of radial shadings (Bug #32349) + * Adapt the zlib-based FlateStream code to API changes (Bug #32065) + * Make PreScanOutputDev be less agressive when deciding to rasterize (Bug #30107) + * Fix some warnings in newer gcc in Splash backend + * Fix the preliminary bbox/clip calculation in Splash backend + * Use A1 instead of A8 for imagemask in the Cairo backend + * Windows compile fixes + + utils: + * Do not return 99 (or 1) with -h, -v and -printenc (Bug #32149) + * Misc style improvements to pdftohtml code + * pdftohtml: Remove the -resolution flag introduced in 0.15.0 and fix the + existing -zoom flag + + build system: + * Add more warning flags to the default gcc builds + * Enable GObject introspection support in the cmake build system + + qt4: + * Windows compile fixes + +Release 0.15.3 (0.16 RC) + + core: + * Improve rendering of radial shadings + * Open a broken file (Bug #31861) + * Correct parsing of linearization table (Bug #31627) + * Find fonts inside patterns (Bug #31948) + * [win32] Simplify strtok_r implementation + * Use a std::vector<char> instead of a var-length-array of chars + * Fix crashes in broken files + * Use sets instead of arrays for looking for duplicate fonts + + cpp: + * Include correction + + utils: + * pdffonts: Remove duplicated code + +Release 0.15.2 (0.16 Beta 2) + + core: + * Improve shadings and antialias in the Splash backend (Bug #30436) + * Linearization improvements + * Small improvements to the Arthur backend + * Fix calculation of the size of some pages (Bug #30784) + * Fix crashes in broken documents + + qt4: + * Add Page::renderToPainter() method + * Add setDebugErrorFunction() method + + cpp: + * Add the hability to render pages to an image + + utils: + * Add -p flag to pdfimages + + build system: + * Remove -ansi flag for cywin and mingw + +Release 0.15.1 (0.16 Beta 1) + + core: + * Consider render value when colorizing text (Bug #2807) + * Improve rendering of Shading Type 6 and 7 + * Improve dict lookup speed for big dicts + * Fix multiple crashes in malformed PDF files + * Fix memory leak in in malformed PDF files + * Fix memory leak in the Catalog names + * Fix uninitialized uses on DCTScanInfo + * Fix a crash when drawing square/circle annots without a border (Bug #30580) + * Only clip boxes to mediabox if we are at the page level (Bug #30784) + * Do not omit the notdef glyph in the Splash backend + * Fix a crash when redering documents with invalid type 3 fonts in the Cairo backend + * Form improvements + * Add a method to get the PDF file identifier + + glib: + * Add more printing options to the API + * Add a method to get the PDF file identifier + * Add accessor for all PopplerDocument properties + * Form improvements + * Documentation improvements + * Improvements to the demo + + qt4: + * Add a callback to know which page has been printed + * Add a method to get the PDF file identifier + * Optimize GooString to QString conversion + * Some more autotests + * Update Doxyfile (enables .qch file for assistant) + + build system: + * Require Cairo 1.10 + + utils: + * pdftohtml: Add -s option to generate a single HTML page + * pdftotext: Add -bbox option + + cpp: + * Add the possibility of loading a document from raw data + * Add a method to get the PDF file identifier + * Improve Unicode to ustring conversion + * Documentation improvements + * Update Doxyfile + +Release 0.15.0 (0.16 Alpha) + + core: + * Remove exception support + * Improve creation of Annotations + * Fix failure to parse PDF with damaged internal structure. (Bugs #29189 #3870) + * Add a way to access the raw text of a page + * Speed improvements when reading multiple characters from a given Stream + * Speed improvements in the Splash backend + * Speed improvement in gray color space calculations + * Speed improvement in ICC color space calculations + * Speed improvement when reading some fonts + * Make GBool a bool instead of an int + + glib: + * Add GObject introspection support + * Improve creation of Annotations + * Add a way to get the coordinates of each character of a page + * Add a way to get the page label + * Documentation improvements + * Support password protected documents in the demo + * Support for selection in the demo + * Support for adding annotationss in the demo + * Misc improvements in the internals + + qt4: + * Add a way to access the raw text of a page + * Recognize "Print" as named action + * Documentation improvements + + build system: + * Add option for autogen.sh to skip configure + * Nicer autogen.sh output + * Improvements when build the glib frontend with CMake + + utils: + * pdftohtml: Use splash instead of external gs invocation to render the background + * pdftohtml: Let the user specify the resolution of the background. (Bug #29551) + + cpp: + * Add a way to access the raw text of a page + +Release 0.14.3 + + core: + * Tell Windows we are writing/reading binary data from stdout/stdio (Bug #29329) + * Fix crash when parsing some Movie elements (KDE Bug #249586) + +Release 0.14.2 + + core: + * Fix rendering of some documents involving tilingPatternFill in the cairo output device + * Improve rendering of some annotations + * Handle ColorTransform in DCT streams when using libjpeg (Bug #28873) + * Fix crash in the ps output device in some files (KDE Bug #246269) + * Fix crash in some malformed files (Bug #28842) + + build system: + * Improve build on windows + * Add uninstalled .pc file support when using autoconf + + glib: + * Fix a crash when a layer doesn't have a name (Bug #28842) + + utils: + * Fix padding of names in pdftoppm + +Release 0.14.1 + + core: + * Add ObjectStream caching, makes opening some files ten times faster (Bug #26759) + * Fix crash when writing to negative coordinates (Bug #28480) + * Check objects are the type we want them to be when parsing GfxICCBasedColorSpace + * Optimize Splash::compositeBackground + * Optimize color space calculations by using sqrt instead of pow 0.5 + * Fix crash in JBIG2Stream with malformed documents + + build system: + * Make sure we ship two needed cmake files + * Do not distribute glib/poppler-features.h and poppler/poppler-config.h + * Improve compilation with Sun Studio + * Fix linking of the cpp frontend when using autotools + + glib: + * Fix links/annots area for some documents (Bug #28588) + * Fix poppler_page_find_tex() when called more than once (Bug #27927) + + utils: + * Add -cropbox to pdftoppm manual + +Release 0.14.0 + + core: + * Fix crash when parsing pdf with broken JBIG2Stream (Bug #28170) + * Do not follow loops blindly when parsing XRef (Bug #28172) + * Allow quality & progressive mode to be utilised in JpegWriter + * Fix potential assert in Lexer code (KDE bug #240208) + * Fix opening of files whose /P is stored as unsigned integer + * Do not exit() when trying to allocate memory for the XRef fails + + cpp: + * Minor bugfixes + * Documentation improvements + + build system: + * Fix build in mingw32 when using autotools + * Preserve compiler flags when using cmake + +Release 0.13.4 (0.14 RC 1) + + core: + * Include standard float.h instead of unportable values.h + * Fix first color stop offset of linear gradients. Bug #27837 + * Fix compilation if JPEG nor PNG is used + * Use fabs for doubles instead of abs + * Use strtok_r instead strtok + * Adjust bbox for line annots when y1 = y2 + * Some fixes and regressions in the cairo output device + * Better check of overlapping of table cells when selecting text + + cpp: + * Make the pkg-config files really work + * Fix in/out buffer sizes in some functions + +Release 0.13.3 (0.14 Beta 2) + + core: + * Fix roll optimization in the PS function interpreter + * Correctly parse numbers with '+' sign. Gnome bug #614549 + * Add support for cached files + * Add support for reading a cached file from stdin + * Add HTTP support using libcurl, disabled by default + * Add some const correctnes to GooString + * Rework DCTStream error handling. Bug #26280 + * Use current fill_opacity when drawing soft masked images in Cairo backend. Gnome bug #614915 + * Use the topleft of the Rect of text annots to draw + * Fix saving update docs that have a compressed xref table. Bug #27450 + * Parse varius part of the document catalog on demand + * Implement colorizing image masks with pattern colorspace in Cairo backend + * Fix a crash when rendering 0x0 images in Cairo backend + * Check pattern status after setting matrix when rendering images + * Improve text selection/extraction order. Bug #3188 + * Fix pattern size when bbox is not at 0,0 + * Improve colorizing text and masks in pattern colorspace. Bug #27482 + * Silence some Illegal entry in bfrange block in ToUnicode CMap. Bug #27728 + + utils: + * Add the -o[dd] and -e[ven] options to pdftoppm + * Allow read from stdin using the new cached files feature + * Fix crash in pdftohtml when output filename was shorter than 5 characters + + glib: + * Use existing cairo api when rendering to a pixbuf + * Compile with -DGSEAL_ENABLE. Bug #27579 + +Release 0.13.2 (0.14 Beta 1) + + core: + * Improve Movie support + * Fix experimental Arthur backend to compile when if Splash backend is disable + * Fix usage of some streams in the Cairo backend + * Small improvements in the experimental Arthur backend + * Minor annotation improvements + * Rework LinkRendition to follow the spec + * Add support for Set-OCG-State actions + * Correctly initialize the grayscale softmask color in the Splash backend + * Correctly initialize actualText in TextOutputDev when initialization fails + * Various MSVC fixes + + glib: + * Add support for Movie objects + * Add support for Screen annotations + * Add support for rendition actions + * Add support for OCG State actions + * Improvements to the demo + + qt4: + * Always compile the experimental Arthur backend + * Minor speed improvement in QPainter usage + * Add a search overload that takes doubles instead of QRectF + + cpp: + * Fix iconv usage + * use gmtime() when gmtime_r() is not available + * Fix building in autotools in windows + * {from,to}_utf_8() -> {from,to}_utf8() + + build system: + * Multiple CMake build system fixes + * Fix of some DIST targets in autotools + * Make finding of Qt3 in autotools use pkg-config + +Release 0.13.1 (0.14 Alpha 2) + + core: + * New C++ frontend to interface with Poppler using only STL + * Use the right matrix for the mask in drawMaskedImage in Cairo output device. Bug #16906 + * Fix downscaling images when document is rotated in Cairo output device. Bug #26264 + * GooVector rewrite, old version had "unknown" origins/license + * Fix use after free in a error condition + * Improve handling of broken commands. Bug #24575 + * Fix potential use after free in Cairo output device. + * Fix regression in painting. Bug #26243 + * Improve handling of FontConfig. Bug #26544 + * Only assume the OC is not visible if it exists and is set to no. Bug #26532 + * Fix a potential crash in Splash font handling on out of memory conditions + * Implement writeImgFile for splashModeXBGR8 + * Several speed increases (around 40% in some documents) in the Splash output device + * Improve printing on the Cairo output device + * Do not use '\' character in PostScript names + * Omit writing of embedded fonts into temporary files in the Cairo output device. Bug #26694 + * Improve filtering of some images in the Cairo output device. Bugs #25268, #9860 + + utils: + * pdftoppm: Only swap w with h if rotation is 90 or 270 + + build system: + * Add POPPLER_WITH_GDK in cmake build system. Bug #26247 + * Fix typo: "MULTITHREAD" -> "MULTITHREADED in cmake build system + * Wrap #include <jpeglib.h> in extern "C" to fix build. Bug #26351 + * Add the Win32-specific ENABLE_RELOCATABLE option to cmake build system + * Reflect that poppler-glib needs cairo now in cmake build system + * Use pkgconfig to detect libpng on autotools build system + * Detect the need for nanosleep in solaris in cmake build system. Bug #26650 + +Release 0.13.0 (0.14 Alpha) + + core: + * Improvements to Annotation rendering. Bug #23108 + * Do not give an error when opening files without pages. Bug #24720 + * Try to read streams without Length + * Do not crop the transformation matrix at an arbitrary value. Bug #25763 + * Make poppler (optionally) relocatable on Windows + * Use a small object cache in GfxResources to cache GState objects + * Reduce the number of redundant pattern creations in the Cairo output device + * Use colToDbl() to avoid rounding error in the Cairo output device + * Fix problems with mask handling in the Cairo output device. Bug #8474 + * Use a better scale down implementation in the Cairo output device + * Various optimizations to the Splash output device + * Add the possibility to use floats instead of doubles in the Splash output device. Bug #25578 + * Write out fixed-content portion of Type 1 fonts in the PS output device + + build system: + * Improvements to the CMake build system + * Enable AM_SILENT_RULES by default in autotools + * Require glib 2.18 + * Require GTK+ 2.14 + * Make fontconfig optional with mingw compiler + * Remove makefile.vc + + glib: + * Add support for file attachment annotations + * Improvements to the demo + * Use TextOutputDev to get TextPage when we haven't rendered the page + * Remove support for the Splash output device + + utils: + * pdftoppm can now write to jpeg + * pdftoppm embeds the correct resolution in png and jpeg files + + qt4: + * Minor improvements to the tests + +Release 0.12.3 + + core: + * Be more lenient with /Decode key on images. Bug #17439 + * Correctly initialize fileName in LinkGoToR. Bug #25221 + * Improve the reconstruction of the XRef for broken files + * [Cairo backend] Do not crash on malformed files. Bug #24575 + * Accept Fontname if FontName is not present. KDE bug #217013 + * Make PSOutputDev code a bit more resilient + * Fix writing of null objects. Bug #25465 + * [Cairo backend] Fix crash in some documents. GNOME bug #603934 + * Correctly initialize profileCommands in Gfx constructor + + build system: + * Check for openjpeg in the C++ part as it uses bool in the header. Bug #25103 + +Release 0.12.2 + + core: + * Fix a memory leak when converting to PostScript + * Fix crash when reading a font fails. Bug #24525 + * Make the ICC cache per page instead of global. Bug #24686 + * Do not accept negative interval lengths in the page labels tree. Bug #24721 + * Do not crash on files Aspect of Movie objects are reals instead of integers. Bug #24733 + * Do not render patterns when using CairoImageOutputDev + * Allow Transitions dictionary to be a Ref + * Do not crash if jpeg_start_decompress fails. KDE bug #214317 + + glib: + * Fix CVE-2009-3607 + + qt4: + * Use '.' in the annotations XML instead of the decimal separator of the current locale + +Release 0.12.1 + + core: + * Fix compilation on some compilers + * Only initialize the font list once in Windows32/MSVC + * Do not crash on fonts without CharCodeToUnicode. Bug #24036 + * Fix regression due to not setting LC_NUMERIC anymore + * Improve realibility for Streams with broken Length. Bug #6841 + * Write the Info into the trailer dict if there is one. Bug #24091 + * Do not crash when saving files that come from a stream without name. Bug #24090 + * Improve relability of the save function + * Fix the Length value if it was wrong when saving + * Fix includes for those using internal headers + * Rework how hinting is used in the splash backend. It is disabled by default now + * fix constructor of DCTStream when using internal decoder + * Security fixes based xpdf 3.02pl4 + + qt4: + * Add the possibility of setting wheter to use or not font hinting + * Add a way for converters to return more exact errors they had when converting + * Check the document is not locked when converting to PS + + build system: + * Compile on Cygwin + * Use _WIN32 instead of WIN32. Bug #24259 + * Add the possibility to pass LIB_SUFFIX when using CMake + +Release 0.12.0 + + core: + * Fix printf format security warnings + * Improve rendering of radial shadings. Bug #20238 + * Better fallback when there's a font type mismatch. Bug #17252 + * Do not crash on attachments without data stream. Bug #10386 + * Fix infinite loop in JBIG2Decoder. Bug #23025 + + build system: + * Minimizes pkg-config dependencies for Qt frontends + * Add automake 1.11 support + * Use the newest automake found and not the oldest + * Support AM_SILENT_RULES when using automake 1.11 + + utils: + * Add common options to pdftoabw + +Release 0.11.3 (0.12 RC 1) + + core: + * Optimization in the Cairo renderer for some fonts + * Do not apply masks when fill color space mode is csPattern in the Cairo renderer. Bug #22216 + * Check for overflow when parsing integers. Bug #23078 + * Do not save the font file twice for FreeType fonts in the Cairo renderer. Bug #20491 + * Use current fill_opacity when drawing images in the Cairo renderer + * Fix alpha rendering in some files in the Splash renderer. Bug #22143, #22152 + * Implement tiling patterns in the Cairo renderer + * When converting a cm matrix to PS write 4 significant digits for numbers < 1 not 4 decimals. Bug #23332 + * Fix changing of locale, now poppler no longer changes LC_NUMERIC to "C" + * Return PDF version as two integers instead of as a double + + Qt4: + * Addition of the Color Management API + * Small fix to documentation + * Fix backwards text search + + utils: + * Add the -png flag to pdftoppm to output to PNG + +Release 0.11.2 (0.12 Beta 2) + + core: + * Make DecryptStream return sane values for getPos(). Bug #19706 + * Fix bug when printing pdf with multiple page sizes in duplex mode + * Initilize AnnotColot properly when the Array is not correct + * Fix crash on some files with forms. Bug #22485 + * Fix crash in files with invalid embedded files. Bug #22551 + * Improve FileSpec attribute parsing + * Cairo output device improvements. Bugs #10942, #18017, #14160 + * Implement blend modes in cairo backend + * Handle fontType1COT fonts in CairoFontEngine + * Fix generation of PS for some files. Bug #18908 + * Don't use byte_lookup table when color space doesn't support getLine methods. Bug #11027 + * Fix rendering of PDF files with malformed patterns. Bug #22835 + * Add the possibility of disabling font substitution in pdftops. Bug #23030 + * Fix some radio buttons not being detected as such + + glib: + * Improvements to the demo + + Qt4: + * Improvements to the demo + + build system: + * Use gtkbuilder rather than libglade for some tests + + utils: + * Fix bug with noCrop parameter in pdftops + +Release 0.11.1 (0.12 Beta 1) + + core: + * Support colorizing text in pattern colorspace. Bug #19670 and #19994 + * Add the possibility of forcing no hinting of fonts in the Splash backend + * Support multiple page sizes when converting to PS. Bug #19777 + * Also tokens with leading 00 when parsing the char to unicode map. Bug #22025 + * Improvements of rendering speed in documents using PS transformations a lot. Bug #21562 + * More work on Annotations support + * Use Interpolate flag to decide whether applying image interpolation during rendering. Bug #9860 + * Handle Streams in CMap definitions. Bug #22334 + * Fix some bugs in JBIG2Stream handling + * Fix dashed line in page 1 of bug 20011 + * Fix exit(1) when rendering a file + * Fix pdftops crash on file from KDE bug #174899 + * Fix PS generation in some files. Bug #20420 + * Do not create the GfxColorTransform if the lcms could not be created. Bug #20108 + * Check Mask entries are int before using them, if they are real cast to int and try to use them. Bug #21841 + * Use the correct value when creating the V field for form combo boxes + * Give an error when using level1sep in pdftops without having CMYK support. Bug #22026 + * Don't include lcms.h in GfxState.h + * Fix splashColorModeNComps to correctly include all values for each SplashColorMode + * Add splashClearColor that assigns white to the given colorptr + * Kill support for specifying extension in openTmpFile. Bug #21713 + * Fix "Conditional jump or move depends on uninitialised value". Bug #20011 + + glib: + * Add poppler_annot_markup_has_popup() + * Hyphenate UTF-8 and UTF-16BE. Bug #21953 + * Use g_strerror instead of strerror. Bug #22095 + * Fix a crash when a destination points to an invalid page + * Improvements to the demo + + Qt4: + * Add LinkDestination::destinationName() + * Do not try to resolve named destinations for GoTo links pointing to external documents + * Add Page::thumbnail() + * Improvements to the demo + * Improvements to the documentation + + build system: + * Build fix for MSVC + * Better lcms cmake check comming from kdelibs + * Use pkgconfig for autotools lcms check + * Remove unneeded files from repo. Bug #22094 + +Release 0.11.0 (0.12 Alpha) + + core: + * Add initial support for color management + * Remove case-insensitive matching of filenames in PDFDoc constructor + * Fix extraction of some ActualText content + * More work on Annotations support + * Improve font rendering in Cairo output device + * Fix bug in cairo backend with nested masks + * Fix cairo luminosity smask rendering + * Add optionally text support to Cairo output device + * Add the possibility of setting the datadir on runtime + * Return an error code instead of a boolean when saving + * Make the font scanner more versatile + * Small opimization in documents that use PostScriptFunction transforms + * Minor optimization to Stream handling + * Fix some compile warnings + + glib: + * Optional content support + * More work on Annotations support + * Improvements to the demo + * Documentation improvements + * Fix build when compiling with GTK_DISABLE_SINGLE_INCLUDES + + Qt4: + * Support URI actions for Table Of Contents items + * Documentation improvements + * Improvements to the demo + * Add a FontIterator for iterating through the fonts of the document + + utils: + * Allow the use of cropbox in pdftoppm + * Make pdftohtml output png images when the image stream is not a jpeg + * Make pdftotext accept cropping options like pdftoppm + * Support rendering non-square pixels in pdftoppm + + build system: + * Require Cairo 1.8.4 for the Cairo output device + * Require CMake 2.6 when using the CMake build system + * Optionally require libpng for pdftohtml + * Optionally require libcms for color management + +Release 0.10.6 + + core: + * Fix problems that happen when parsing broken JBIG2 files. + CVE-2009-0799, CVE-2009-0800, CVE-2009-1179, CVE-2009-1180 + CVE-2009-1181, CVE-2009-1182, CVE-2009-1183, CVE-2009-1187, CVE-2009-1188 + * Fix parsing of incorrect border arrays. Bug #19761 + * Fix clip test for fonts. Bug #20950 + * Fix getGlyphAdvance to behave correctly on font size changes. Bug #20769 + * Misc build fixes + + build system: + * Fix the Qt4 version we need + +Release 0.10.5 + + core: + * Read the UF entry if present and prefer it over F in Filespec dictionary + * Fix typo that was making CairoOutputDev crash on some files. Bug #17337 + * Make JBIG2Stream more robust to corrupt input data + * Do not blindly follow loops parsing OutlineItem. Bug #18364 + * Set up the error manager before calling jpeg_create_decompress. Bug #20484 + * Check there is an optional content config before using it. Bug #20587 + * Fix rendering of some PDF with OpenType fonts. Bug #20605 + + build system: + * Yet more support for build on windows + * Use AC_CHECK_HEADER to find headers. Bug #20538 + * Check for pkgconfig before using it + * General autotools improvements + +Release 0.10.4 + + core: + * Fix a memory leak when asking for a document-level JS + * Do not crash in some PDF we do not parse correctly. Bug #19702 + * Fix crash on unexepcted form Opt value. Bug #19790 + + utils: + * Fix pdfimages to extract i color components per pixel jpeg images. Bug #19789 + +Release 0.10.3 + + core: + * Fix a crash on documents with malformed outline. Bug #19024 + * Fix leak on AnnotScreen destructor. Bug #19095 + * Fix wrong PS generation when a large image is in Patterns. Bug #18908 + * Remove BaseFile.h it was never used. Bug #19298 + * Improve document saving + * Fix PS generation of PDF with malformed font Length2 definition + * Fix a leak while parsing annotations + * Fix rendering of some checkboxes + + Qt4: + * Fix positioning of Form rects on PDF with cropbox + * Fix positioning of Annotation rects on PDF with cropbox. Bug #18558. + * Small documentation improvements + * Make Document::fonts() work when called more than once. Bug #19405 + + build system: + * CMake: look harder for openjpeg + * CMake: update the poppler core headers installation + * Autotools: do not install Function.cc as it's not a header + + Qt: + * Fix deserialization of links right coordinate + +Release 0.10.2 + + core: + * Fix a crash when selecting text in word mode + * Fix a crash in some malformed documents (second argument of opMarkPoint is not a dictionary) + * Ensure cairo font matrix is invertable. Fixes bugs #18254 and #18429 + * Fix a memory leak (Bug #18924) + + Qt4: + * Fix deserization of links right coordinate + + misc: + * Fix build on Solaris 10 + Sun Studio 12 + * Compile with -pedantic + +Release 0.10.1 + + core: + * Improvements in Optional Content support + * Small fix in Form support + * Fix memory leak in case of error + * Fix potential crash on text search + * Try render documents with invalid indexed color space parameters. Bug #18374 + * Fix crash on text extraction when poppler-data is not installed. Bug #18023 + + Qt: + * Fix two memory leaks + + Qt4: + * Small documentation improvement + * Fix memory leak in the demo code + +Release 0.10.0 + + core: + * Fix crashes on PDF using Stitching or Axial Shading painting + * Fix rendering of PDF with Type1 fonts that have more than + one encoding definition per line + * Do not try to save documents that have Encryption as we + do not support that and the user ended with a broken file + * Fix crash on files with OptionalContentGroup but no Name + + Qt4: + * Fix the area of the links to be correctly reported on rotated documents + + misc: + * Mingw+Msys should work + +Release 0.9.3 (0.10 RC 2) + + core: + * Fix rendering regression on some embedded fonts + * Fix rendering regression of some special fonts + * Fix crash on documents with bogus jpeg data + + Qt4: + * The printing flag defaults to true on PSConverter + * Documentation improvement + + utils: + * Fix regression that made HmtlOutputDev ignore jpeg images + + misc: + * Improve compilation on mingw + +Release 0.9.2 (0.10 RC 1) + + core: + * Fix conversion to PS some files (bug #17645) + * Small Form fixes + * Small JS fixes + * Improve memory usage of the cairo renderer + + utils: + * Fix mismatched free/delete in pdftohtml + * Fix memory leak in pdftohtml + * Fix crash in pdftohtml + + glib: + * Fix a crash in forms demo + + misc: + * Compile with -pedantic + +Release 0.9.1 (0.10 Beta 2) + + Core: + * Fix crash on some AESv2 encrypted files (bugs #13972, #16092, #17523) + * Improve parsing of broken files (bug #17568) + + glib frontend: + * Minor improvements to the demo application + + utils: + * pdftohtml: Generate the outline file in the same place + of the other generated files (bug #17504) + +Release 0.9.0 (0.10 Beta 1) + + Core: + * Initial JavaScript support + * Annotation improvements + * Improvements in the Arthur based renderer + * Improvements in the Cairo based renderer + * Added a JPEG2000 decoder based on OpenJPEG + * Small fixes in ActualText implementation + * Fix jpeg rendering when not using the libjpeg based decoder + * Movie fixes + * Do not get out of memory on documents that specify huge fonts + * Emulate Adobe Reader behaviour on documents with duplicate keys in Dictionaries + * Forms improvements + + Qt4 frontend: + * Annotation improvements + * Forms improvements + * Add the possibility of extracting embedded fonts + * Initial Movie support + * Documentation improvements + * Small improvements in the PS exporter + + glib frontend: + * Annotation improvements + * Attachment fixes + + utils: + * updated man pages + * Added -listenc to pdfinfo and pdftotext + +Release 0.8.7 + + Core: + * Fix regression in Form rendering + * Fix memory leak in the cairo backend + +Release 0.8.6 + + Core: + * Call error() when font loading fails + * Be less strict parsing TTF tables (bug #16940) + * Fix crash due to uninitialized variable + + Qt 4 frontend: + * Make the paper color setting working as it should + * Make sure to use the correct page width/height for form widgets coordinates + +Release 0.8.5 + + Core: + * Fix crash on PDF that define a page thumbnail but it's not a Stream + * Fix crash when Annots object is not of the desired type + * Fix crash when obtaining fonts in PDF where XObjects link themselves in loops + * Fix crash on documents with an IRT object + * Saving should work much better now + * Plug some memory leaks in Annotation handling + + Utils: + * pdftohtml: Don't crash on documents that specify an invalid named dest for a link + * pdftohtml: Make html output to keep all the spaces with   + * pdftohtml: Improve a bit text layout + * pdftohtml: Make xml output valid xml + +Release 0.8.4 + + Core: + * Fix leak in ABWOutputDev.cc + * Fix uninitialized variable that broke file saving in some cases + * Use a single global FT_Library in CairoOutputDev. + Fixes some crashes in CairoOutputDev. + + Qt 4 frontend: + * Fix saving over existing files + + build system: + * Make sure Qt4 moc is used to generate moc files in Qt4 frontend + +Release 0.8.3 + + Core: + * Fix crash when reading some PDF with annotations + * Fix crash on PDF that reference Optional Content elements that don't exist + * Fix leaks on error conditions + * Do not limit CharCodeToUnicodeString to 8 characters + * Support for surrogates outside the BMP plane + + Qt 3 frontend: + * Fix crash when reading PDF with password + * Fix leak when calling scanForFonts() + + Qt 4 frontend: + * Fix the text() method + + Splash renderer: + * Fix compilation with --enable-fixedpoint + +Release 0.8.2 + + core: + * Fix call broken by a fix introduced in 0.8.1 + +Release 0.8.1 + + core: + * Do not call FT_Done_Face on a live cairo_font_face_t as it might cause crashes + * Do not take into account Colorspace resource subdictionary for image XObjects + * Downsample 16 bit per component images to 8 bit per component so they render + + build system: + * Link to pthread when the system needs it + + windows: + * Fix comparing against NULL instead against INVALID_HANDLE_VALUE when calling FindFirstFile + +Release 0.8.0 + + * Fix caching of members in the glib frontend causing issues with rendering + * Change glib public api to have a correct naming + * Some better error handling on corner cases + * Check the document stream is seekable when opening it + * Build fixes with autotools and with cmake + * Fix infinite recursion on some malformed documents when consulting the fonts + * Fix possible crash when asking for Movie contents + +Release 0.7.3 (0.8 RC 2) + + * Fix regression in Splash renderer + * Fix off-by-one write in Splash + * Plug some minor leaks in Optional Content code + * Improve error handling when creating a document in the glib frontend + +Release 0.7.2 (0.8 RC 1) + + Major Changes: + * Improve font matching not forcing default values onto Fontconfig + * Add preliminary annotations support in the glib frontend + * Initial Movie support in the core + * Make GDK dependency optional in glib bindings + + Minor Changes: + * Make the core able to read mime types of embedded files + * Qt4 API for accessing mime types of embedded files + * Handle correctly check state of optional content groups + regarding parents state + * Avoid setting singular CTM matrices on the Cairo backend + * Improved Qt4 API to get character position + * Qt4 api documentation improvements + * Qt4 minor stability fixes + * Proper lib64 Qt detection + * Fix build when compiling without cairo support + +Release 0.7.1 (0.8 Beta 2) + + Major Changes: + * Really distribute CMake files as optional build tool + * Initial Optional Content support in core and in the Qt4 frontend + + Minor Changes: + * Allow grouped checkboxes to be selected individually + * Qt4 demo program improvements + * Keep cairo and cairo_shape consistent + * Safety checks on Splash renderer so that it does not draw outside the allocated bitmap + * Do not try to display bitmaps of invalid size + * Fix building with exceptions + * Improvements for building with MSVC and CMake + +Release 0.7.0 (0.8 Beta 1) + + * Saving support + * Partial annotation support + * Forms improvements + * Add support for ActualText entries + * Display characters outside of unicode BMP with TT font + * CJK rendering fixes + * Implement Adobe Glyph Naming convention for fonts + * CMake as optional build tool + * Better font scaling for non embedded fonts + * Preserve PDF page labels when we output as postscript + +Release 0.6.4 + + Qt4 frontend: + * Fix crash on links that point to a non existant page + * Make Document::renderHints return the correct render hints + * Fix infinite loop when parsing LineAnnotation + + core: + * Fix crash in the Splash renderer when T3 fonts are badly defined + * Draw underlined Links correctly + + utils: + * Fix two use after free bugs in HtmlOutputDev.cc + + build system: + * Fix build on mingw32 + + tests: + * Distribute the glade file of pdf-inspector + +Release 0.6.3 + + core: + * Fix crash in extra debug code + + glib frontend: + * Make sure passwords are passed correctly to poppler core + + Qt frontend: + * Fix crash on documents that specify an empty date + + build system: + * Disable gtk tests if the user disabled glib frontend + +Release 0.6.2 + + poppler core: + * Fix CVE-2007-4352, CVE-2007-5392 and CVE-2007-5393 + * Fix a crash on documents with wrong CCITTFaxStream + * Fix a crash in the Cairo renderer with invalid embedded fonts + * Fix a crash with invalid TrueType fonts + * Check if font is inside the clip area before rendering + it to a temporary bitmap in the Splash renderer. Fixes crashes on + incorrect documents + * Do not use exit(1) on DCTStream errors + * Detect form fields at any depth level + * Do not generate appearance stream for radio buttons that are not active + * mingw fixes + + build system: + * Require fontconfig >= 2.0 + * builddir != srcdir fixes + + Qt4 frontend: + * Improved documentation + + misc: + * Fix FSF address + +Release 0.6.1 + + poppler core: + * Fix printing with different x and y scale + * Fix crash when Form Fields array contains references to non existent objects + * Fix crash in CairoOutputDev::drawMaskedImage() + * Fix embedded file description not working on some cases + + Qt4 frontend: + * Fix printing issue + * Avoid double free + * Fix memory leak when dealing with embedded files + + glib frontend: + * Fix build with --disable-cairo-output + * Do not return unknown field type for signature form fields + + build system: + * Support automake-1.10 + * More compatible sh code in qt.m4 + + utils: + * Fix build on Sun Studio compiler + +Release 0.6 + + - CairoOutputDev fixes + - Allow pdftoppm to read/write from stdin/stdout + - API work on Qt4 frontend + - Fix pdfimages produces inverted image for black & white image + - Fix error on the NFKC text matching routine + - Add support for word and line selections + - Do not enforce %%EOF at the end of file + - Pad zeroes instead of aborting when rendering 1-bit images + and the stream is too short + - Update glib bindings documentation + +Release 0.5.91 (0.6 Release Candidate 2) + + - Various memory leaks fixed + - Compile with --enable-fixedpoint. Bug #11110 + - Header cleanup + - Remove dependency on debugxml. Bug #11187 + - Allow access to document metadata in glib and qt4 frontends + - Several glib API frontend improvements + - Fix crash on accessing embedded files + - Build on Sun Force compiler + - Render '*' instead of the actual content in password form fields + - Fix pdftohtml complex output. Bug #9746 and #11610 + - Windows build fixes + - Improve Japanese font support. Bug #11413 + - Do not exit the program on files that confuse libjpeg + - Update required cairo version to 1.4 + - Fix CVE-2007-3387 + +Release 0.5.9 (0.6 Release Candidate) + + - Merge xpdf 3.02 changes + - Qt4 frontend is not marked anymore as unstable + - Support for Sound objects + - Support for Opening/Closing page actions + - Support for page duration + - Improve PS Tokenizer performance thanks to Scott Turner + - Various speed ups by Krzysztof Kowalczyk + - Beginning of Interactive Form support by Julien Rebetez + - xpdfrc is no longer used for anything + - Add AbiWord output device and pdftoabw program by Jauco Noordzij + - Fix security issue MOAB-06-01-2007 + - Lots of bugs fixed + +Release 0.5.4 + + - Automatically read in CJK encoding files if they're + installed (#2984, #7105, #7093). This works with the new + poppler-data package. + - Speed ups by Krzysztof Kowalczyk (#8112) + - Patch from Dom Lachowicz to let the utils take input on stdin. + - Bugs fixed (#8182, #4649, #7906, #8048, #7113, #4515, #3948, + #7924, #7780, #7646, #6948, #7788, #7661, #7005) + +Release 0.5.3 + + - Add poppler as a private requires of poppler-glib. + - Allow CairoFont creation to fail more gracefully (#4030). + - Back out the rest of krh's type3 font work. + - Revert splashModeRGB8 changes. + - Add missing poppler-annotation-helper.h. + +Release 0.5.2 + + - Much improved Qt bindings (Albert Astals Cid). + - Cairo backend now supports masked images (Jeff Muizelaar, #6174). + - Patches from Kouhei Sutou to make glib bindings more + language binding friendly (#6907, #6897, #6899, #6905). + - Search now works with ligatures (Ed Catmull, #2929). + - The glib bindings now has an entry point to render to a cairo_t. + - GCC 4.1 and MSVC compilation fixes. + - Memory leaks plugged: #6908, #6947, #6765, #6764, #6187 + - Misc bug fixes: #6984, #6896, #6913, #6926, #4481, #5951, + #6551, #6500, #6492, #6454, #6079, #6167. + +Release 0.5.1 + + - Support for embedded files. + - Handle 0-width lines correctly. + - Avoid external file use when opening fonts. + - Only use vector fonts returned from fontconfig (#5758). + - Fix scaled 1x1 pixmaps use for drawing lines (#3387). + - drawSoftMaskedImage support in cairo backend. + - Misc bug fixes: #5922, #5946, #5749, #5952, #4030, #5420. + +Release 0.5.0 + + - Font matching code for non embedded fonts now use fontconfig + instead of hard coded list of fonts. + - Merge in Xpdf 3.01 changes. + - Add command line tools from Xpdf. + - Make install of Xpdf header files ./configure'able. + +Release 0.4.0 + + - Real text selection. + - API breakage in glib wrapper: dropping dest_x and dest_y + arguments from poppler_page_render_to_pixbuf(). + +Release 0.3.3 + + - New glib API to get document font information (Marco). + - More document properties available as glib properties (Emil + Soleyman-Zomalan, #3359) + - Optimize color conversion for images. + - Support for constant opacity. + - Fix problems with pkg-config files. + - Bugs fixes: #3491, #2911, #3362, #3340, #3265, #3239, #3396. + +Release 0.3.2 + + - New API to get poppler version and backend type. + - Various font fixes from Albert Astals Cid. + - Update to cairo 0.5.0 API, including better font support. + - Meta data for the glib binding. + +Release 0.3.1 + + - Add qt/poppler-private.h to SOURCES + - Jeff's path to use zlib instead of builtin decompression. + - Bug fixes: #2934, segfault on invalid links, #3114 + +Release 0.3.0 + + - First cut at qt wrapper, including a getText() method for + getting text from a page. + - More glib functionality: meta data, set page orientation, + print to PS + - Performance fixes for glib cairo + - Bug fixes + +Release 0.2.0 (Tue Apr 5 12:32:10 EDT 2005) + + - Add glib wrapper for poppler, which will use cairo rendering + if available + - Support for page labels + - configure and build fixes. + +Release 0.1.2 (Wed Mar 9 10:45:58 EST 2005) + + - cairo optimizations and fixes from Jeff Muizelaar + - Bump cairo requirement to 0.4 + - Make cairo and gtk checks fail gracefully + +Release 0.1.1 + + - Fix issues with installed header files including config.h + - Fix a couple of typos in pkg-config files + - Install splash and cairo header files when necessary + +Release 0.1 - no date yet + + - First release + - More NEWS here diff --git a/README b/README new file mode 100644 index 0000000..fa22390 --- /dev/null +++ b/README @@ -0,0 +1,37 @@ +This is poppler, a PDF rendering library. + +Poppler is a fork of the xpdf PDF viewer developed by Derek Noonburg +of Glyph and Cog, LLC. The purpose of forking xpdf is twofold. +First, we want to provide PDF rendering functionality as a shared +library, to centralize the maintenance effort. Today a number of +applications incorporate the xpdf code base, and whenever a security +issue is discovered, all these applications exchange patches and put +out new releases. In turn, all distributions must package and release +new version of these xpdf based viewers. It's safe to say that +there's a lot of duplicated effort with the current situation. Even if +poppler in the short term introduces yet another xpdf derived code +base to the world, we hope that over time these applications will +adopt poppler. After all, we only need one application to use poppler +to break even. + +Second, we would like to move libpoppler forward in a number of areas +that don't fit within the goals of xpdf. By design, xpdf depends on +very few libraries and runs a wide range of X based platforms. This +is a strong feature and reasonable design goal. However, with poppler +we would like to replace parts of xpdf that are now available as +standard components of modern Unix desktop environments. One such +example is fontconfig, which solves the problem of matching and +locating fonts on the system, in a standardized and well understood +way. Another example is cairo, which provides high quality 2D +rendering. See the file TODO for a list of planned changes. + +Please note that xpdf, and thus poppler, is licensed under the GPL, +not the LGPL. Consequently, any application using poppler must also +be licensed under the GPL. If you want to incorporate Xpdf based PDF +rendering in a closed source product, please contact Glyph & Cog +(www.glyphandcog.com) for commercial licensing options. + + Kristian Høgsberg, Feb. 27, 2005 + + +See the README-XPDF for the original xpdf-3.03 README. diff --git a/README-XPDF b/README-XPDF new file mode 100644 index 0000000..e97791c --- /dev/null +++ b/README-XPDF @@ -0,0 +1,423 @@ +Xpdf +==== + +version 3.03 +2011-aug-15 + +The Xpdf software and documentation are +copyright 1996-2011 Glyph & Cog, LLC. + +Email: derekn@foolabs.com +WWW: http://www.foolabs.com/xpdf/ + +The PDF data structures, operators, and specification are +copyright 1985-2006 Adobe Systems Inc. + + +What is Xpdf? +------------- + +Xpdf is an open source viewer for Portable Document Format (PDF) +files. (These are also sometimes also called 'Acrobat' files, from +the name of Adobe's PDF software.) The Xpdf project also includes a +PDF text extractor, PDF-to-PostScript converter, and various other +utilities. + +Xpdf runs under the X Window System on UNIX, VMS, and OS/2. The non-X +components (pdftops, pdftotext, etc.) also run on Windows and Mac OSX +systems and should run on pretty much any system with a decent C++ +compiler. Xpdf will run on 32-bit and 64-bit machines. + + +License & Distribution +---------------------- + +Xpdf is licensed under the GNU General Pulbic License (GPL), version 2 +or 3. This means that you can distribute derivatives of Xpdf under +any of the following: + - GPL v2 only + - GPL v3 only + - GPL v2 or v3 + +The Xpdf source package includes the text of both GPL versions: +COPYING for GPL v2, COPYING3 for GPL v3. + +Please note that Xpdf is NOT licensed under "any later version" of the +GPL, as I have no idea what those versions will look like. + +If you are redistributing unmodified copies of Xpdf (or any of the +Xpdf tools) in binary form, you need to include all of the +documentation: README, man pages (or help files), COPYING, and +COPYING3. + +If you want to incorporate the Xpdf source code into another program +(or create a modified version of Xpdf), and you are distributing that +program, you have two options: release your program under the GPL (v2 +and/or v3), or purchase a commercial Xpdf source license. + +If you're interested in commercial licensing, please see the Glyph & +Cog web site: + + http://www.glyphandcog.com/ + + +Compatibility +------------- + +Xpdf is developed and tested on Linux. + +In addition, it has been compiled by others on Solaris, AIX, HP-UX, +Digital Unix, Irix, and numerous other Unix implementations, as well +as VMS and OS/2. It should work on pretty much any system which runs +X11 and has Unix-like libraries. You'll need ANSI C++ and C compilers +to compile it. + +The non-X components of Xpdf (pdftops, pdftotext, pdfinfo, pdffonts, +pdfdetach, pdftoppm, and pdfimages) can also be compiled on Windows +and Mac OSX systems. See the Xpdf web page for details. + +If you compile Xpdf for a system not listed on the web page, please +let me know. If you're willing to make your binary available by ftp +or on the web, I'll be happy to add a link from the Xpdf web page. I +have decided not to host any binaries I didn't compile myself (for +disk space and support reasons). + +If you can't get Xpdf to compile on your system, send me email and +I'll try to help. + +Xpdf has been ported to the Acorn, Amiga, BeOS, and EPOC. See the +Xpdf web page for links. + + +Getting Xpdf +------------ + +The latest version is available from: + + http://www.foolabs.com/xpdf/ + +or: + + ftp://ftp.foolabs.com/pub/xpdf/ + +Source code and several precompiled executables are available. + +Announcements of new versions are posted to comp.text.pdf and emailed +to a list of people. If you'd like to receive email notification of +new versions, just let me know. + + +Running Xpdf +------------ + +To run xpdf, simply type: + + xpdf file.pdf + +To generate a PostScript file, hit the "print" button in xpdf, or run +pdftops: + + pdftops file.pdf + +To generate a plain text file, run pdftotext: + + pdftotext file.pdf + +There are five additional utilities (which are fully described in +their man pages): + + pdfinfo -- dumps a PDF file's Info dictionary (plus some other + useful information) + pdffonts -- lists the fonts used in a PDF file along with various + information for each font + pdfdetach -- lists or extracts embedded files (attachments) from a + PDF file + pdftoppm -- converts a PDF file to a series of PPM/PGM/PBM-format + bitmaps + pdfimages -- extracts the images from a PDF file + +Command line options and many other details are described in the man +pages (xpdf(1), etc.) and the VMS help files (xpdf.hlp, etc.). + +All of these utilities read an optional configuration file: see the +xpdfrc(5) man page. + + +Upgrading from Xpdf 3.02 (and earlier) +-------------------------------------- + +The font configuration system has been changed. Previous versions +used mostly separate commands to configure fonts for display and for +PostScript output. As of 3.03, configuration options that make sense +for both display and PS output have been unified. + +The following xpdfrc commands have been removed: +* displayFontT1, displayFontTT: replaced with fontFile +* displayNamedCIDFontT1, displayNamedCIDFontTT: replaced with fontFile +* displayCIDFontT1, displayCIDFontTT: replaced with fontFileCC +* psFont: replaced with psResidentFont +* psNamedFont16: replaced with psResidentFont16 +* psFont16: replaced with psResidentFontCC + +See the xpdfrc(5) man page for more information on the new commands. + +Pdftops will now embed external 16-bit fonts (configured with the +fontFileCC command) when the PDF file refers to a non-embedded font. +It does not do any subsetting (yet), so the resulting PS files will be +large. + + +Compiling Xpdf +-------------- + +See the separate file, INSTALL. + + +Bugs +---- + +If you find a bug in Xpdf, i.e., if it prints an error message, +crashes, or incorrectly displays a document, and you don't see that +bug listed here, please send me email, with a pointer (URL, ftp site, +etc.) to the PDF file. + + +Acknowledgments +--------------- + +Thanks to: + +* Patrick Voigt for help with the remote server code. +* Patrick Moreau, Martin P.J. Zinser, and David Mathog for the VMS + port. +* David Boldt and Rick Rodgers for sample man pages. +* Brendan Miller for the icon idea. +* Olly Betts for help testing pdftotext. +* Peter Ganten for the OS/2 port. +* Michael Richmond for the Win32 port of pdftops and pdftotext and the + xpdf/cygwin/XFree86 build instructions. +* Frank M. Siegert for improvements in the PostScript code. +* Leo Smiers for the decryption patches. +* Rainer Menzner for creating t1lib, and for helping me adapt it to + xpdf. +* Pine Tree Systems A/S for funding the OPI and EPS support in + pdftops. +* Easy Software Products for funding several improvements to the + PostScript output code. +* Tom Kacvinsky for help with FreeType and for being my interface to + the FreeType team. +* Theppitak Karoonboonyanan for help with Thai support. +* Leonard Rosenthol for help and contributions on a bunch of things. +* Alexandros Diamantidis and Maria Adaloglou for help with Greek + support. +* Lawrence Lai for help with the CJK Unicode maps. + +Various people have contributed modifications made for use by the +pdftex project: + +* Han The Thanh +* Martin Schröder of ArtCom GmbH + + +References +---------- + +Adobe Systems Inc., _PDF Reference, sixth edition: Adobe Portable +Document Format version 1.7_. +http://www.adobe.com/devnet/pdf/pdf_reference.html +[The manual for PDF version 1.7.] + +Adobe Systems Inc., "Errata for the PDF Reference, sixth edition, +version 1.7", October 16, 2006. +http://www.adobe.com/devnet/pdf/pdf_reference.html +[The errata for the PDF 1.7 spec.] + +Adobe Systems Inc., _PostScript Language Reference_, 3rd ed. +Addison-Wesley, 1999, ISBN 0-201-37922-8. +[The official PostScript manual.] + +Adobe Systems, Inc., _The Type 42 Font Format Specification_, +Adobe Developer Support Technical Specification #5012. 1998. +http://partners.adobe.com/asn/developer/pdfs/tn/5012.Type42_Spec.pdf +[Type 42 is the format used to embed TrueType fonts in PostScript +files.] + +Adobe Systems, Inc., _Adobe CMap and CIDFont Files Specification_, +Adobe Developer Support Technical Specification #5014. 1995. +http://www.adobe.com/supportservice/devrelations/PDFS/TN/5014.CIDFont_Spec.pdf +[CMap file format needed for Japanese and Chinese font support.] + +Adobe Systems, Inc., _Adobe-Japan1-4 Character Collection for +CID-Keyed Fonts_, Adobe Developer Support Technical Note #5078. +2000. +http://partners.adobe.com/asn/developer/PDFS/TN/5078.CID_Glyph.pdf +[The Adobe Japanese character set.] + +Adobe Systems, Inc., _Adobe-GB1-4 Character Collection for +CID-Keyed Fonts_, Adobe Developer Support Technical Note #5079. +2000. +http://partners.adobe.com/asn/developer/pdfs/tn/5079.Adobe-GB1-4.pdf +[The Adobe Chinese GB (simplified) character set.] + +Adobe Systems, Inc., _Adobe-CNS1-3 Character Collection for +CID-Keyed Fonts_, Adobe Developer Support Technical Note #5080. +2000. +http://partners.adobe.com/asn/developer/PDFS/TN/5080.CNS_CharColl.pdf +[The Adobe Chinese CNS (traditional) character set.] + +Adobe Systems Inc., _Supporting the DCT Filters in PostScript Level +2_, Adobe Developer Support Technical Note #5116. 1992. +http://www.adobe.com/supportservice/devrelations/PDFS/TN/5116.PS2_DCT.PDF +[Description of the DCTDecode filter parameters.] + +Adobe Systems Inc., _Open Prepress Interface (OPI) Specification - +Version 2.0_, Adobe Developer Support Technical Note #5660. 2000. +http://partners.adobe.com/asn/developer/PDFS/TN/5660.OPI_2.0.pdf + +Adobe Systems Inc., CMap files. +ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ +[The actual CMap files for the 16-bit CJK encodings.] + +Adobe Systems Inc., Unicode glyph lists. +http://partners.adobe.com/asn/developer/type/unicodegn.html +http://partners.adobe.com/asn/developer/type/glyphlist.txt +http://partners.adobe.com/asn/developer/type/corporateuse.txt +http://partners.adobe.com/asn/developer/type/zapfdingbats.txt +[Mappings between character names to Unicode.] + +Adobe Systems Inc., OpenType Specification v. 1.4. +http://partners.adobe.com/public/developer/opentype/index_spec.html +[The OpenType font format spec.] + +Aldus Corp., _OPI: Open Prepress Interface Specification 1.3_. 1993. +http://partners.adobe.com/asn/developer/PDFS/TN/OPI_13.pdf + +Anonymous, RC4 source code. +ftp://ftp.ox.ac.uk/pub/crypto/misc/rc4.tar.gz +ftp://idea.sec.dsi.unimi.it/pub/crypt/code/rc4.tar.gz +[This is the algorithm used to encrypt PDF files.] + +T. Boutell, et al., "PNG (Portable Network Graphics) Specification, +Version 1.0". RFC 2083. +[PDF uses the PNG filter algorithms.] + +CCITT, "Information Technology - Digital Compression and Coding of +Continuous-tone Still Images - Requirements and Guidelines", CCITT +Recommendation T.81. +http://www.w3.org/Graphics/JPEG/ +[The official JPEG spec.] + +A. Chernov, "Registration of a Cyrillic Character Set". RFC 1489. +[Documentation for the KOI8-R Cyrillic encoding.] + +Roman Czyborra, "The ISO 8859 Alphabet Soup". +http://czyborra.com/charsets/iso8859.html +[Documentation on the various ISO 859 encodings.] + +L. Peter Deutsch, "ZLIB Compressed Data Format Specification version +3.3". RFC 1950. +[Information on the general format used in FlateDecode streams.] + +L. Peter Deutsch, "DEFLATE Compressed Data Format Specification +version 1.3". RFC 1951. +[The definition of the compression algorithm used in FlateDecode +streams.] + +Morris Dworkin, "Recommendation for Block Cipher Modes of Operation", +National Institute of Standards, NIST Special Publication 800-38A, +2001. +[The cipher block chaining (CBC) mode used with AES in PDF files.] + +Federal Information Processing Standards Publication 197 (FIPS PUBS +197), "Advanced Encryption Standard (AES)", November 26, 2001. +[AES encryption, used in PDF 1.6.] + +Jim Flowers, "X Logical Font Description Conventions", Version 1.5, X +Consortium Standard, X Version 11, Release 6.1. +ftp://ftp.x.org/pub/R6.1/xc/doc/hardcopy/XLFD/xlfd.PS.Z +[The official specification of X font descriptors, including font +transformation matrices.] + +Foley, van Dam, Feiner, and Hughes, _Computer Graphics: Principles and +Practice_, 2nd ed. Addison-Wesley, 1990, ISBN 0-201-12110-7. +[Colorspace conversion functions, Bezier spline math.] + +Robert L. Hummel, _Programmer's Technical Reference: Data and Fax +Communications_. Ziff-Davis Press, 1993, ISBN 1-56276-077-7. +[CCITT Group 3 and 4 fax decoding.] + +ISO/IEC, _Information technology -- Lossy/lossless coding of bi-level +images_. ISO/IEC 14492, First edition (2001-12-15). +http://webstore.ansi.org/ +[The official JBIG2 standard. The final draft of this spec is +available from http://www.jpeg.org/jbighomepage.html.] + +ISO/IEC, _Information technology -- JPEG 2000 image coding system -- +Part 1: Core coding system_. ISO/IEC 15444-1, First edition +(2000-12-15). +http://webstore.ansi.org/ +[The official JPEG 2000 standard. The final committee draft of this +spec is available from http://www.jpeg.org/JPEG2000.html, but there +were changes made to the bitstream format between that draft and the +published spec.] + +ITU, "Standardization of Group 3 facsimile terminals for document +transmission", ITU-T Recommendation T.4, 1999. +ITU, "Facsimile coding schemes and coding control functions for Group 4 +facsimile apparatus", ITU-T Recommendation T.6, 1993. +http://www.itu.int/ +[The official Group 3 and 4 fax standards - used by the CCITTFaxDecode +stream, as well as the JBIG2Decode stream.] + +B. Kaliski, "PKCS #5: Password-Based Cryptography Specification, +Version 2.0". RFC 2898. +[Defines the padding scheme used with AES encryption in PDF files.] + +Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, "Practical +Fast 1-D DCT Algorithms with 11 Multiplications". IEEE Intl. Conf. on +Acoustics, Speech & Signal Processing, 1989, 988-991. +[The fast IDCT algorithm used in the DCTDecode filter.] + +Microsoft, _TrueType 1.0 Font Files_, rev. 1.66. 1995. +http://www.microsoft.com/typography/tt/tt.htm +[The TrueType font spec (in MS Word format, naturally).] + +V. Ostromoukhov, R.D. Hersch, "Stochastic Clustered-Dot Dithering", +Conf. Color Imaging: Device-Independent Color, Color Hardcopy, and +Graphic Arts IV, 1999, SPIE Vol. 3648, 496-505. +http://diwww.epfl.ch/w3lsp/publications/colour/scd.html +[The stochastic dithering algorithm used in Xpdf.] + +P. Peterlin, "ISO 8859-2 (Latin 2) Resources". +http://sizif.mf.uni-lj.si/linux/cee/iso8859-2.html +[This is a web page with all sorts of useful Latin-2 character set and +font information.] + +Charles Poynton, "Color FAQ". +http://www.inforamp.net/~poynton/ColorFAQ.html +[The mapping from the CIE 1931 (XYZ) color space to RGB.] + +R. Rivest, "The MD5 Message-Digest Algorithm". RFC 1321. +[MD5 is used in PDF document encryption.] + +Thai Industrial Standard, "Standard for Thai Character Codes for +Computers", TIS-620-2533 (1990). +http://www.nectec.or.th/it-standards/std620/std620.htm +[The TIS-620 Thai encoding.] + +Unicode Consortium, "Unicode Home Page". +http://www.unicode.org/ +[Online copy of the Unicode spec.] + +W3C Recommendation, "PNG (Portable Network Graphics) Specification +Version 1.0". +http://www.w3.org/Graphics/PNG/ +[Defines the PNG image predictor.] + +Gregory K. Wallace, "The JPEG Still Picture Compression Standard". +ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz +[Good description of the JPEG standard. Also published in CACM, April +1991, and submitted to IEEE Transactions on Consumer Electronics.] + +F. Yergeau, "UTF-8, a transformation format of ISO 10646". RFC 2279. +[A commonly used Unicode encoding.] diff --git a/TODO b/TODO new file mode 100644 index 0000000..e067c2a --- /dev/null +++ b/TODO @@ -0,0 +1,40 @@ +* general items: + - Investigate better (that is, normal) text selection. + - Use PDF font descriptors to create an FcPattern. + - Add simle performance benchmark that takes a pdf and renders + every page 100 times or so. Start keeping track of + performance. + - make color space conversion stuff more sane (right now we + hack around some of it in the cairo backend) + - move away from getChar to a more read(2) like interface + +* core: + - use libtiff for ccitt decoding? + +* Qt4 frontend: + - expose Rendition media through the MovieObject API + - use Q_GLOBAL_STATIC for GlobalParams? + - use QSettings or another system for loading/saving Document/global settings? + - expose API for lcms/color management system + - make the ArthurOutputDev optional + +* glib frontend: + - Sound/Movie actions support + - API to create annotations + +* new frontends: + - Java/JNI-based frontend for Android + +* cairo backend: + - Implement linear/radial gradients with cairo gradients + - PDF Blend Modes + - Make the cairo backend feature complete and optimize the + heck out of it. + +Jeff Muizelaar's TODO: + Short Term: + - factor out some of the color conversion code from CairoOutputDev and ArthurOutputDev. + - fix patterned text fills. + Long Term: + - use cairo glyph cache for type3 fonts. + - try to use cairo pattern support. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..f575730 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,2211 @@ +# generated automatically by aclocal 1.11.5 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, +# Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# lib-link.m4 serial 21 (gettext-0.18) +dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ([2.54]) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + popdef([NAME]) + popdef([Name]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. The missing-message +dnl defaults to 'no' and may contain additional hints for the user. +dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} +dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, + dnl because these -l options might require -L options that are present in + dnl LIBS. -l options benefit only from the -L options listed before it. + dnl Otherwise, add it to the front of LIBS, because it may be a static + dnl library that depends on another static library that is present in LIBS. + dnl Static libraries benefit only from the static libraries listed after + dnl it. + case " $LIB[]NAME" in + *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; + *) LIBS="$LIB[]NAME $LIBS" ;; + esac + AC_TRY_LINK([$3], [$4], + [ac_cv_lib[]Name=yes], + [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + popdef([NAME]) + popdef([Name]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE([rpath], + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_FROMPACKAGE(name, package) +dnl declares that libname comes from the given package. The configure file +dnl will then not have a --with-libname-prefix option but a +dnl --with-package-prefix option. Several libraries can come from the same +dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar +dnl macro call that searches for libname. +AC_DEFUN([AC_LIB_FROMPACKAGE], +[ + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_frompackage_]NAME, [$2]) + popdef([NAME]) + pushdef([PACK],[$2]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_libsinpackage_]PACKUP, + m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) + popdef([PACKUP]) + popdef([PACK]) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) + dnl Autoconf >= 2.61 supports dots in --with options. + pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH(P_A_C_K[-prefix], +[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib + --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been + dnl computed. So it has to be reset here. + HAVE_LIB[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = '$1'; then + LIB[]NAME[]_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi + popdef([P_A_C_K]) + popdef([PACKLIBS]) + popdef([PACKUP]) + popdef([PACK]) + popdef([NAME]) +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem" \ + && test "X$dir" != "X/usr/$acl_libdirstem2"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) + +# lib-prefix.m4 serial 7 (gettext-0.18) +dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates +dnl - a variable acl_libdirstem, containing the basename of the libdir, either +dnl "lib" or "lib64" or "lib/64", +dnl - a variable acl_libdirstem2, as a secondary possible value for +dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or +dnl "lib/amd64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. + dnl On glibc systems, the current practice is that on a system supporting + dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under + dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine + dnl the compiler's default mode by looking at the compiler's library search + dnl path. If at least one of its elements ends in /lib64 or points to a + dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. + dnl Otherwise we use the default, namely "lib". + dnl On Solaris systems, the current practice is that on a system supporting + dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under + dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or + dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. + AC_REQUIRE([AC_CANONICAL_HOST]) + acl_libdirstem=lib + acl_libdirstem2= + case "$host_os" in + solaris*) + dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment + dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>. + dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." + dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the + dnl symlink is missing, so we set acl_libdirstem2 too. + AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], + [AC_EGREP_CPP([sixtyfour bits], [ +#ifdef _LP64 +sixtyfour bits +#endif + ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) + ]) + if test $gl_cv_solaris_64bit = yes; then + acl_libdirstem=lib/64 + case "$host_cpu" in + sparc*) acl_libdirstem2=lib/sparcv9 ;; + i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; + esac + fi + ;; + *) + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + */../ | */.. ) + # Better ignore directories of this form. They are misleading. + ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + ;; + esac + test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" +]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.5], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.5])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, +# 2010, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2009, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# (`yes' being less verbose, `no' or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few `make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using `$V' instead of `$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar <conftest.tar]) + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/acx_pthread.m4]) +m4_include([m4/define-dir.m4]) +m4_include([m4/gtk-doc.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/introspection.m4]) +m4_include([m4/libjpeg.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/cmake/modules/COPYING-CMAKE-SCRIPTS b/cmake/modules/COPYING-CMAKE-SCRIPTS new file mode 100644 index 0000000..4b41776 --- /dev/null +++ b/cmake/modules/COPYING-CMAKE-SCRIPTS @@ -0,0 +1,22 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cmake/modules/FindCairo.cmake b/cmake/modules/FindCairo.cmake new file mode 100644 index 0000000..d536c05 --- /dev/null +++ b/cmake/modules/FindCairo.cmake @@ -0,0 +1,62 @@ +# - try to find Cairo +# Once done this will define +# +# CAIRO_FOUND - system has Cairo +# CAIRO_CFLAGS - the Cairo CFlags +# CAIRO_INCLUDE_DIRS - the Cairo include directories +# CAIRO_LIBRARIES - Link these to use Cairo +# +# Copyright (C) 2007, 2010, Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if(CAIRO_INCLUDE_DIRS AND CAIRO_LIBRARIES) + + # in cache already + set(CAIRO_FOUND TRUE) + +else(CAIRO_INCLUDE_DIRS AND CAIRO_LIBRARIES) + +if(NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig REQUIRED) + if(Cairo_FIND_VERSION_COUNT GREATER 0) + set(_cairo_version_cmp ">=${Cairo_FIND_VERSION}") + endif(Cairo_FIND_VERSION_COUNT GREATER 0) + pkg_check_modules(_pc_cairo cairo${_cairo_version_cmp}) + if(_pc_cairo_FOUND) + set(CAIRO_FOUND TRUE) + endif(_pc_cairo_FOUND) +else(NOT WIN32) + # assume so, for now + set(CAIRO_FOUND TRUE) +endif(NOT WIN32) + +if(CAIRO_FOUND) + # set it back as false + set(CAIRO_FOUND FALSE) + + find_library(CAIRO_LIBRARY cairo + HINTS ${_pc_cairo_LIBRARY_DIRS} + ) + set(CAIRO_LIBRARIES "${CAIRO_LIBRARY}") + + find_path(CAIRO_INCLUDE_DIR cairo.h + HINTS ${_pc_cairo_INCLUDE_DIRS} + PATH_SUFFIXES cairo + ) + set(CAIRO_INCLUDE_DIRS "${CAIRO_INCLUDE_DIR}") + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Cairo DEFAULT_MSG CAIRO_LIBRARIES CAIRO_INCLUDE_DIRS) +endif(CAIRO_FOUND) + +endif(CAIRO_INCLUDE_DIRS AND CAIRO_LIBRARIES) + +mark_as_advanced( + CAIRO_CFLAGS + CAIRO_INCLUDE_DIRS + CAIRO_LIBRARIES +) diff --git a/cmake/modules/FindFontconfig.cmake b/cmake/modules/FindFontconfig.cmake new file mode 100644 index 0000000..268a61a --- /dev/null +++ b/cmake/modules/FindFontconfig.cmake @@ -0,0 +1,50 @@ +# - Try to find the Fontconfig +# Once done this will define +# +# FONTCONFIG_FOUND - system has Fontconfig +# FONTCONFIG_INCLUDE_DIR - The include directory to use for the fontconfig headers +# FONTCONFIG_LIBRARIES - Link these to use FONTCONFIG +# FONTCONFIG_DEFINITIONS - Compiler switches required for using FONTCONFIG + +# Copyright (c) 2006,2007 Laurent Montel, <montel@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR) + + # in cache already + set(FONTCONFIG_FOUND TRUE) + +else (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR) + + if (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PC_FONTCONFIG fontconfig) + + set(FONTCONFIG_DEFINITIONS ${PC_FONTCONFIG_CFLAGS_OTHER}) + endif (NOT WIN32) + + find_path(FONTCONFIG_INCLUDE_DIR fontconfig/fontconfig.h + PATHS + ${PC_FONTCONFIG_INCLUDEDIR} + ${PC_FONTCONFIG_INCLUDE_DIRS} + /usr/X11/include + ) + + find_library(FONTCONFIG_LIBRARIES NAMES fontconfig + PATHS + ${PC_FONTCONFIG_LIBDIR} + ${PC_FONTCONFIG_LIBRARY_DIRS} + ) + + include(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Fontconfig DEFAULT_MSG FONTCONFIG_LIBRARIES FONTCONFIG_INCLUDE_DIR ) + + mark_as_advanced(FONTCONFIG_LIBRARIES FONTCONFIG_INCLUDE_DIR) + +endif (FONTCONFIG_LIBRARIES AND FONTCONFIG_INCLUDE_DIR) + diff --git a/cmake/modules/FindGLIB.cmake b/cmake/modules/FindGLIB.cmake new file mode 100644 index 0000000..15fb0c7 --- /dev/null +++ b/cmake/modules/FindGLIB.cmake @@ -0,0 +1,22 @@ +# - try to find the GLIB libraries +# Once done this will define +# +# GLIB_FOUND - system has GLib +# GLIB2_CFLAGS - the GLib CFlags +# GLIB2_LIBRARIES - Link these to use GLib +# +# Copyright 2008-2010 Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +include(FindPackageHandleStandardArgs) + +if (NOT WIN32) + find_package(PkgConfig REQUIRED) + + pkg_check_modules(GLIB2 "glib-2.0>=${GLIB_REQUIRED}" "gobject-2.0>=${GLIB_REQUIRED}") + + find_package_handle_standard_args(GLib DEFAULT_MSG GLIB2_LIBRARIES GLIB2_CFLAGS) + +endif(NOT WIN32) diff --git a/cmake/modules/FindGObjectIntrospection.cmake b/cmake/modules/FindGObjectIntrospection.cmake new file mode 100644 index 0000000..2073c3c --- /dev/null +++ b/cmake/modules/FindGObjectIntrospection.cmake @@ -0,0 +1,61 @@ +# - try to find gobject-introspection +# +# Once done this will define +# +# INTROSPECTION_FOUND - system has gobject-introspection +# INTROSPECTION_SCANNER - the gobject-introspection scanner, g-ir-scanner +# INTROSPECTION_COMPILER - the gobject-introspection compiler, g-ir-compiler +# INTROSPECTION_GENERATE - the gobject-introspection generate, g-ir-generate +# INTROSPECTION_GIRDIR +# INTROSPECTION_TYPELIBDIR +# INTROSPECTION_CFLAGS +# INTROSPECTION_LIBS +# +# Copyright (C) 2010, Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +macro(_GIR_GET_PKGCONFIG_VAR _outvar _varname) + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=${_varname} gobject-introspection-1.0 + OUTPUT_VARIABLE _result + RESULT_VARIABLE _null + ) + + if (_null) + else() + string(REGEX REPLACE "[\r\n]" " " _result "${_result}") + string(REGEX REPLACE " +$" "" _result "${_result}") + separate_arguments(_result) + set(${_outvar} ${_result} CACHE INTERNAL "") + endif() +endmacro(_GIR_GET_PKGCONFIG_VAR) + +find_package(PkgConfig) +if(PKG_CONFIG_FOUND) + if(PACKAGE_FIND_VERSION_COUNT GREATER 0) + set(_gir_version_cmp ">=${PACKAGE_FIND_VERSION}") + endif() + pkg_check_modules(_pc_gir gobject-introspection-1.0${_gir_version_cmp}) + if(_pc_gir_FOUND) + set(INTROSPECTION_FOUND TRUE) + _gir_get_pkgconfig_var(INTROSPECTION_SCANNER "g_ir_scanner") + _gir_get_pkgconfig_var(INTROSPECTION_COMPILER "g_ir_compiler") + _gir_get_pkgconfig_var(INTROSPECTION_GENERATE "g_ir_generate") + _gir_get_pkgconfig_var(INTROSPECTION_GIRDIR "girdir") + _gir_get_pkgconfig_var(INTROSPECTION_TYPELIBDIR "typelibdir") + set(INTROSPECTION_CFLAGS "${_pc_gir_CFLAGS}") + set(INTROSPECTION_LIBS "${_pc_gir_LIBS}") + endif() +endif() + +mark_as_advanced( + INTROSPECTION_SCANNER + INTROSPECTION_COMPILER + INTROSPECTION_GENERATE + INTROSPECTION_GIRDIR + INTROSPECTION_TYPELIBDIR + INTROSPECTION_CFLAGS + INTROSPECTION_LIBS +) diff --git a/cmake/modules/FindGTK.cmake b/cmake/modules/FindGTK.cmake new file mode 100644 index 0000000..4d66bd3 --- /dev/null +++ b/cmake/modules/FindGTK.cmake @@ -0,0 +1,22 @@ +# - try to find GTK libraries +# Once done this will define +# +# GTK_FOUND - system has GTK +# GTK2_CFLAGS - the GTK CFlags +# GTK2_LIBRARIES - Link these to use GTK +# +# Copyright 2008-2010 Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +include(FindPackageHandleStandardArgs) + +if (NOT WIN32) + find_package(PkgConfig REQUIRED) + + pkg_check_modules(GTK2 "gtk+-2.0>=2.14" "gdk-pixbuf-2.0" "gthread-2.0" "gio-2.0") + + find_package_handle_standard_args(GTK DEFAULT_MSG GTK2_LIBRARIES GTK2_CFLAGS) + +endif(NOT WIN32) diff --git a/cmake/modules/FindIconv.cmake b/cmake/modules/FindIconv.cmake new file mode 100644 index 0000000..338d17d --- /dev/null +++ b/cmake/modules/FindIconv.cmake @@ -0,0 +1,60 @@ +# - Try to find Iconv +# Once done this will define +# +# ICONV_FOUND - system has Iconv +# ICONV_INCLUDE_DIR - the Iconv include directory +# ICONV_LIBRARIES - Link these to use Iconv +# ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const +# +include(CheckCXXSourceCompiles) + +IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + # Already in cache, be silent + SET(ICONV_FIND_QUIETLY TRUE) +ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + +FIND_PATH(ICONV_INCLUDE_DIR iconv.h) + +FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) + +IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + SET(ICONV_FOUND TRUE) +ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + +set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) +set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) +IF(ICONV_FOUND) + check_cxx_source_compiles(" + #include <iconv.h> + int main(){ + iconv_t conv = 0; + const char* in = 0; + size_t ilen = 0; + char* out = 0; + size_t olen = 0; + iconv(conv, &in, &ilen, &out, &olen); + return 0; + } +" ICONV_SECOND_ARGUMENT_IS_CONST ) + IF(ICONV_SECOND_ARGUMENT_IS_CONST) + SET(ICONV_CONST "const") + ENDIF(ICONV_SECOND_ARGUMENT_IS_CONST) +ENDIF(ICONV_FOUND) +set(CMAKE_REQUIRED_INCLUDES) +set(CMAKE_REQUIRED_LIBRARIES) + +IF(ICONV_FOUND) + IF(NOT ICONV_FIND_QUIETLY) + MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") + ENDIF(NOT ICONV_FIND_QUIETLY) +ELSE(ICONV_FOUND) + IF(Iconv_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Iconv") + ENDIF(Iconv_FIND_REQUIRED) +ENDIF(ICONV_FOUND) + +MARK_AS_ADVANCED( + ICONV_INCLUDE_DIR + ICONV_LIBRARIES + ICONV_SECOND_ARGUMENT_IS_CONST +) diff --git a/cmake/modules/FindLCMS.cmake b/cmake/modules/FindLCMS.cmake new file mode 100644 index 0000000..9d162d2 --- /dev/null +++ b/cmake/modules/FindLCMS.cmake @@ -0,0 +1,84 @@ +# - Find LCMS +# Find the LCMS includes and library +# This module defines +# LCMS_INCLUDE_DIR, where to find lcms.h +# LCMS_LIBRARIES, the libraries needed to use LCMS. +# LCMS_VERSION, The value of LCMS_VERSION defined in lcms.h +# LCMS_FOUND, If false, do not try to use LCMS. + + +# Copyright (c) 2008, Adrian Page, <adrian@pagenet.plus.com> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +# use pkg-config to get the directories and then use these values +# in the FIND_PATH() and FIND_LIBRARY() calls +if(NOT WIN32) + find_package(PkgConfig) + pkg_check_modules(PC_LCMS lcms) + set(LCMS_DEFINITIONS ${PC_LCMS_CFLAGS_OTHER}) +endif(NOT WIN32) + +find_path(LCMS_INCLUDE_DIR lcms.h + PATHS + ${PC_LCMS_INCLUDEDIR} + ${PC_LCMS_INCLUDE_DIRS} + PATH_SUFFIXES lcms liblcms1 +) + +find_library(LCMS_LIBRARIES NAMES lcms liblcms lcms-1 liblcms-1 + PATHS + ${PC_LCMS_LIBDIR} + ${PC_LCMS_LIBRARY_DIRS} + PATH_SUFFIXES lcms +) + +if(LCMS_INCLUDE_DIR AND LCMS_LIBRARIES) + set(LCMS_FOUND TRUE) +else(LCMS_INCLUDE_DIR AND LCMS_LIBRARIES) + set(LCMS_FOUND FALSE) +endif(LCMS_INCLUDE_DIR AND LCMS_LIBRARIES) + +if(LCMS_FOUND) + set(FIND_LCMS_VERSION_SOURCE + "#include <lcms.h>\n int main()\n {\n return LCMS_VERSION;\n }\n") + set(FIND_LCMS_VERSION_SOURCE_FILE ${CMAKE_BINARY_DIR}/CMakeTmp/FindLCMS.cxx) + file(WRITE "${FIND_LCMS_VERSION_SOURCE_FILE}" "${FIND_LCMS_VERSION_SOURCE}") + + set(FIND_LCMS_VERSION_ADD_INCLUDES + "-DINCLUDE_DIRECTORIES:STRING=${LCMS_INCLUDE_DIR}") + + try_run(LCMS_VERSION LCMS_COMPILE_RESULT + ${CMAKE_BINARY_DIR} + ${FIND_LCMS_VERSION_SOURCE_FILE} + CMAKE_FLAGS "${FIND_LCMS_VERSION_ADD_INCLUDES}" + OUTPUT_VARIABLE OUTPUT) + + if(LCMS_COMPILE_RESULT AND NOT LCMS_VERSION STREQUAL FAILED_TO_RUN) + if(NOT LCMS_FIND_QUIETLY) + string(SUBSTRING ${LCMS_VERSION} 0 1 LCMS_MAJOR_VERSION) + string(SUBSTRING ${LCMS_VERSION} 1 2 LCMS_MINOR_VERSION) + message(STATUS "Found lcms version ${LCMS_MAJOR_VERSION}.${LCMS_MINOR_VERSION}, ${LCMS_LIBRARIES}") + endif(NOT LCMS_FIND_QUIETLY) + else(LCMS_COMPILE_RESULT AND NOT LCMS_VERSION STREQUAL FAILED_TO_RUN) + if(NOT LCMS_FIND_QUIETLY) + message(STATUS "Found lcms but failed to find version ${LCMS_LIBRARIES}") + file(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log + "Find lcms version failed with the following output:\n${OUTPUT}\nFindLCMS.cxx:\n${FIND_LCMS_VERSION_SOURCE}\n\n") + endif(NOT LCMS_FIND_QUIETLY) + set(LCMS_VERSION NOTFOUND) + endif(LCMS_COMPILE_RESULT AND NOT LCMS_VERSION STREQUAL FAILED_TO_RUN) +else(LCMS_FOUND) + if(NOT LCMS_FIND_QUIETLY) + if(LCMS_FIND_REQUIRED) + message(FATAL_ERROR "Required package lcms NOT found") + else(LCMS_FIND_REQUIRED) + message(STATUS "lcms NOT found") + endif(LCMS_FIND_REQUIRED) + endif(NOT LCMS_FIND_QUIETLY) +endif(LCMS_FOUND) + +mark_as_advanced(LCMS_INCLUDE_DIR LCMS_LIBRARIES LCMS_VERSION) + diff --git a/cmake/modules/FindLCMS2.cmake b/cmake/modules/FindLCMS2.cmake new file mode 100644 index 0000000..2ec91d0 --- /dev/null +++ b/cmake/modules/FindLCMS2.cmake @@ -0,0 +1,73 @@ +# - Find LCMS2 +# Find the LCMS2 includes and library +# This module defines +# LCMS2_INCLUDE_DIR, where to find lcms.h +# LCMS2_LIBRARIES, the libraries needed to use LCMS2. +# LCMS2_VERSION, The value of LCMS_VERSION defined in lcms.h +# LCMS2_FOUND, If false, do not try to use LCMS2. + + +# Copyright (c) 2008, Adrian Page, <adrian@pagenet.plus.com> +# Copyright (c) 2009, Cyrille Berger, <cberger@cberger.net> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +# use pkg-config to get the directories and then use these values +# in the FIND_PATH() and FIND_LIBRARY() calls +if(NOT WIN32) + find_package(PkgConfig) + pkg_check_modules(PC_LCMS2 lcms2) + set(LCMS2_DEFINITIONS ${PC_LCMS2_CFLAGS_OTHER}) +endif(NOT WIN32) + +find_path(LCMS2_INCLUDE_DIR lcms2.h + PATHS + ${PC_LCMS2_INCLUDEDIR} + ${PC_LCMS2_INCLUDE_DIRS} + PATH_SUFFIXES lcms2 liblcms2 +) + +find_library(LCMS2_LIBRARIES NAMES lcms2 liblcms2 lcms-2 liblcms-2 + PATHS + ${PC_LCMS2_LIBDIR} + ${PC_LCMS2_LIBRARY_DIRS} + PATH_SUFFIXES lcms2 +) + +if(LCMS2_INCLUDE_DIR AND LCMS2_LIBRARIES) + set(LCMS2_FOUND TRUE) +else(LCMS2_INCLUDE_DIR AND LCMS2_LIBRARIES) + set(LCMS2_FOUND FALSE) +endif(LCMS2_INCLUDE_DIR AND LCMS2_LIBRARIES) + +if(LCMS2_FOUND) + file(READ ${LCMS2_INCLUDE_DIR}/lcms2.h LCMS2_VERSION_CONTENT) + string(REGEX MATCH "#define LCMS_VERSION[ ]*[0-9]*\n" LCMS2_VERSION_MATCH ${LCMS2_VERSION_CONTENT}) + if(LCMS2_VERSION_MATCH) + string(REGEX REPLACE "#define LCMS_VERSION[ ]*([0-9]*)\n" "\\1" LCMS2_VERSION ${LCMS2_VERSION_MATCH}) + if(NOT LCMS2_FIND_QUIETLY) + string(SUBSTRING ${LCMS2_VERSION} 0 1 LCMS2_MAJOR_VERSION) + string(SUBSTRING ${LCMS2_VERSION} 1 2 LCMS2_MINOR_VERSION) + message(STATUS "Found lcms version ${LCMS2_MAJOR_VERSION}.${LCMS2_MINOR_VERSION}, ${LCMS2_LIBRARIES}") + endif(NOT LCMS2_FIND_QUIETLY) + else(LCMS2_VERSION_MATCH) + if(NOT LCMS2_FIND_QUIETLY) + message(STATUS "Found lcms2 but failed to find version ${LCMS2_LIBRARIES}") + endif(NOT LCMS2_FIND_QUIETLY) + set(LCMS2_VERSION NOTFOUND) + endif(LCMS2_VERSION_MATCH) +else(LCMS2_FOUND) + if(NOT LCMS2_FIND_QUIETLY) + if(LCMS2_FIND_REQUIRED) + message(FATAL_ERROR "Required package lcms2 NOT found") + else(LCMS2_FIND_REQUIRED) + message(STATUS "lcms2 NOT found") + endif(LCMS2_FIND_REQUIRED) + endif(NOT LCMS2_FIND_QUIETLY) +endif(LCMS2_FOUND) + +mark_as_advanced(LCMS2_INCLUDE_DIR LCMS2_LIBRARIES LCMS2_VERSION) + + diff --git a/cmake/modules/FindLIBOPENJPEG.cmake b/cmake/modules/FindLIBOPENJPEG.cmake new file mode 100644 index 0000000..d9c1369 --- /dev/null +++ b/cmake/modules/FindLIBOPENJPEG.cmake @@ -0,0 +1,53 @@ +# - Try to find the libopenjpeg library +# Once done this will define +# +# LIBOPENJPEG_FOUND - system has libopenjpeg +# LIBOPENJPEG_INCLUDE_DIRS - the libopenjpeg include directories +# LIBOPENJPEG_LIBRARIES - Link these to use libopenjpeg +# LIBOPENJPEG_INCLUDE_DIR is internal and deprecated for use + +# Copyright (c) 2008, Albert Astals Cid, <aacid@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if (LIBOPENJPEG_LIBRARIES AND LIBOPENJPEG_INCLUDE_DIR) + + # in cache already + set(LIBOPENJPEG_FOUND TRUE) + +else (LIBOPENJPEG_LIBRARIES AND LIBOPENJPEG_INCLUDE_DIR) + + #reset vars + set(LIBOPENJPEG_LIBRARIES) + set(LIBOPENJPEG_INCLUDE_DIR) + + find_path (LIBOPENJPEG_INCLUDE_DIR openjpeg.h PATH_SUFFIXES openjpeg) + find_library(LIBOPENJPEG_LIBRARIES openjpeg) + if(LIBOPENJPEG_INCLUDE_DIR AND LIBOPENJPEG_LIBRARIES) + + set(CMAKE_REQUIRED_INCLUDES ${LIBOPENJPEG_INCLUDE_DIR}) + set(CMAKE_REQUIRED_LIBRARIES ${LIBOPENJPEG_LIBRARIES}) + +check_cxx_source_compiles(" +#include <openjpeg.h> +int main() +{ + int foo = OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; + return 0; +} +" WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG) + + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_LIBRARIES) + + set(LIBOPENJPEG_FOUND TRUE) + endif(LIBOPENJPEG_INCLUDE_DIR AND LIBOPENJPEG_LIBRARIES) + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(LibOpenJPEG DEFAULT_MSG LIBOPENJPEG_LIBRARIES LIBOPENJPEG_INCLUDE_DIR) + +endif (LIBOPENJPEG_LIBRARIES AND LIBOPENJPEG_INCLUDE_DIR) + +set(LIBOPENJPEG_INCLUDE_DIRS ${LIBOPENJPEG_INCLUDE_DIR}) diff --git a/cmake/modules/FindQt4.cmake b/cmake/modules/FindQt4.cmake new file mode 100644 index 0000000..9122bb3 --- /dev/null +++ b/cmake/modules/FindQt4.cmake @@ -0,0 +1,1295 @@ +# - Find QT 4 +# This module can be used to find Qt4. +# The most important issue is that the Qt4 qmake is available via the system path. +# This qmake is then used to detect basically everything else. +# This module defines a number of key variables and macros. First is +# QT_USE_FILE which is the path to a CMake file that can be included to compile +# Qt 4 applications and libraries. By default, the QtCore and QtGui +# libraries are loaded. This behavior can be changed by setting one or more +# of the following variables to true: +# QT_DONT_USE_QTCORE +# QT_DONT_USE_QTGUI +# QT_USE_QT3SUPPORT +# QT_USE_QTASSISTANT +# QT_USE_QTDESIGNER +# QT_USE_QTMOTIF +# QT_USE_QTMAIN +# QT_USE_QTNETWORK +# QT_USE_QTNSPLUGIN +# QT_USE_QTOPENGL +# QT_USE_QTSQL +# QT_USE_QTXML +# QT_USE_QTSVG +# QT_USE_QTTEST +# QT_USE_QTUITOOLS +# QT_USE_QTDBUS +# QT_USE_QTSCRIPT +# +# All the libraries required are stored in a variable called QT_LIBRARIES. +# Add this variable to your TARGET_LINK_LIBRARIES. +# +# macro QT4_WRAP_CPP(outfiles inputfile ... OPTIONS ...) +# create moc code from a list of files containing Qt class with +# the Q_OBJECT declaration. Options may be given to moc, such as those found +# when executing "moc -help" +# +# macro QT4_WRAP_UI(outfiles inputfile ... OPTIONS ...) +# create code from a list of Qt designer ui files. +# Options may be given to uic, such as those found +# when executing "uic -help" +# +# macro QT4_ADD_RESOURCES(outfiles inputfile ... OPTIONS ...) +# create code from a list of Qt resource files. +# Options may be given to rcc, such as those found +# when executing "rcc -help" +# +# macro QT4_AUTOMOC(inputfile ... ) +# macro QT4_GENERATE_MOC(inputfile outputfile ) +# +# macro QT4_ADD_DBUS_INTERFACE(outfiles interface basename) +# create a the interface header and implementation files with the +# given basename from the given interface xml file and add it to +# the list of sources. +# To disable generating a namespace header, set the source file property +# NO_NAMESPACE to TRUE on the interface file. +# +# macro QT4_ADD_DBUS_INTERFACES(outfiles inputfile ... ) +# create the interface header and implementation files +# for all listed interface xml files +# the name will be automatically determined from the name of the xml file +# To disable generating namespace headers, set the source file property +# NO_NAMESPACE to TRUE for these inputfiles. +# +# macro QT4_ADD_DBUS_ADAPTOR(outfiles xmlfile parentheader parentclassname [basename] [classname]) +# create a dbus adaptor (header and implementation file) from the xml file +# describing the interface, and add it to the list of sources. The adaptor +# forwards the calls to a parent class, defined in parentheader and named +# parentclassname. The name of the generated files will be +# <basename>adaptor.{cpp,h} where basename defaults to the basename of the xml file. +# If <classname> is provided, then it will be used as the classname of the +# adaptor itself. +# +# macro QT4_GENERATE_DBUS_INTERFACE( header [interfacename] OPTIONS ...) +# generate the xml interface file from the given header. +# If the optional argument interfacename is omitted, the name of the +# interface file is constructed from the basename of the header with +# the suffix .xml appended. +# Options may be given to uic, such as those found when executing "qdbuscpp2xml --help" +# +# QT_FOUND If false, don't try to use Qt. +# QT4_FOUND If false, don't try to use Qt 4. +# +# QT4_QTCORE_FOUND True if QtCore was found. +# QT4_QTGUI_FOUND True if QtGui was found. +# QT4_QT3SUPPORT_FOUND True if Qt3Support was found. +# QT4_QTASSISTANT_FOUND True if QtAssistant was found. +# QT4_QTDBUS_FOUND True if QtDBus was found. +# QT4_QTDESIGNER_FOUND True if QtDesigner was found. +# QT4_QTDESIGNERCOMPONENTS True if QtDesignerComponents was found. +# QT4_QTMOTIF_FOUND True if QtMotif was found. +# QT4_QTNETWORK_FOUND True if QtNetwork was found. +# QT4_QTNSPLUGIN_FOUND True if QtNsPlugin was found. +# QT4_QTOPENGL_FOUND True if QtOpenGL was found. +# QT4_QTSQL_FOUND True if QtSql was found. +# QT4_QTXML_FOUND True if QtXml was found. +# QT4_QTSVG_FOUND True if QtSvg was found. +# QT4_QTSCRIPT_FOUND True if QtScript was found. +# QT4_QTTEST_FOUND True if QtTest was found. +# QT4_QTUITOOLS_FOUND True if QtUiTools was found. +# +# QT4_DEFINITIONS Definitions to use when compiling code that uses Qt. +# +# QT4_INCLUDES List of paths to all include directories of +# Qt4 QT4_INCLUDE_DIR and QT4_QTCORE_INCLUDE_DIR are +# always in this variable even if NOTFOUND, +# all other INCLUDE_DIRS are +# only added if they are found. +# +# QT4_INCLUDE_DIR Path to "include" of Qt4 +# QT4_QT4_INCLUDE_DIR Path to "include/Qt" +# QT4_QT3SUPPORT_INCLUDE_DIR Path to "include/Qt3Support" +# QT4_QTASSISTANT_INCLUDE_DIR Path to "include/QtAssistant" +# QT4_QTCORE_INCLUDE_DIR Path to "include/QtCore" +# QT4_QTDESIGNER_INCLUDE_DIR Path to "include/QtDesigner" +# QT4_QTDESIGNERCOMPONENTS_INCLUDE_DIR Path to "include/QtDesigner" +# QT4_QTDBUS_INCLUDE_DIR Path to "include/QtDBus" +# QT4_QTGUI_INCLUDE_DIR Path to "include/QtGui" +# QT4_QTMOTIF_INCLUDE_DIR Path to "include/QtMotif" +# QT4_QTNETWORK_INCLUDE_DIR Path to "include/QtNetwork" +# QT4_QTNSPLUGIN_INCLUDE_DIR Path to "include/QtNsPlugin" +# QT4_QTOPENGL_INCLUDE_DIR Path to "include/QtOpenGL" +# QT4_QTSQL_INCLUDE_DIR Path to "include/QtSql" +# QT4_QTXML_INCLUDE_DIR Path to "include/QtXml" +# QT4_QTSVG_INCLUDE_DIR Path to "include/QtSvg" +# QT4_QTSCRIPT_INCLUDE_DIR Path to "include/QtScript" +# QT4_QTTEST_INCLUDE_DIR Path to "include/QtTest" +# +# QT4_LIBRARY_DIR Path to "lib" of Qt4 +# +# QT4_PLUGINS_DIR Path to "plugins" for Qt4 +# +# For every library of Qt, a QT4_QTFOO_LIBRARY variable is defined, with the full path to the library. +# +# So there are the following variables: +# The Qt3Support library: QT4_QT3SUPPORT_LIBRARY +# +# The QtAssistant library: QT4_QTASSISTANT_LIBRARY +# +# The QtCore library: QT4_QTCORE_LIBRARY +# +# The QtDBus library: QT4_QTDBUS_LIBRARY +# +# The QtDesigner library: QT4_QTDESIGNER_LIBRARY +# +# The QtDesignerComponents library: QT4_QTDESIGNERCOMPONENTS_LIBRARY +# +# The QtGui library: QT4_QTGUI_LIBRARY +# +# The QtMotif library: QT4_QTMOTIF_LIBRARY +# +# The QtNetwork library: QT4_QTNETWORK_LIBRARY +# +# The QtNsPLugin library: QT4_QTNSPLUGIN_LIBRARY +# +# The QtOpenGL library: QT4_QTOPENGL_LIBRARY +# +# The QtSql library: QT4_QTSQL_LIBRARY +# +# The QtXml library: QT4_QTXML_LIBRARY +# +# The QtSvg library: QT4_QTSVG_LIBRARY +# +# The QtScript library: QT4_QTSCRIPT_LIBRARY +# +# The QtTest library: QT4_QTTEST_LIBRARY +# +# The qtmain library for Windows QT4_QTMAIN_LIBRARY +# +# The QtUiTools library: QT4_QTUITOOLS_LIBRARY +# +# also defined, but NOT for general use are +# QT4_MOC_EXECUTABLE Where to find the moc tool. +# QT4_UIC_EXECUTABLE Where to find the uic tool. +# QT_UIC3_EXECUTABLE Where to find the uic3 tool. +# QT_RCC_EXECUTABLE Where to find the rcc tool +# QT_DBUSCPP2XML_EXECUTABLE Where to find the qdbuscpp2xml tool. +# QT_DBUSXML2CPP_EXECUTABLE Where to find the qdbusxml2cpp tool. +# +# QT_DOC_DIR Path to "doc" of Qt4 +# QT_MKSPECS_DIR Path to "mkspecs" of Qt4 +# +# +# These are around for backwards compatibility +# they will be set +# QT_WRAP_CPP Set true if QT4_MOC_EXECUTABLE is found +# QT_WRAP_UI Set true if QT4_UIC_EXECUTABLE is found +# +# These variables do _NOT_ have any effect anymore (compared to FindQt.cmake) +# QT_MT_REQUIRED Qt4 is now always multithreaded +# +# These variables are set to "" Because Qt structure changed +# (They make no sense in Qt4) +# QT4_QT_LIBRARY Qt-Library is now split + +# Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. +# See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + +if (QT4_QMAKE_FOUND) + # Check already done in this cmake run, nothing more to do + +else (QT4_QMAKE_FOUND) + +# check that QT_NO_DEBUG is defined for release configurations +MACRO(QT_CHECK_FLAG_EXISTS FLAG VAR DOC) + IF(NOT ${VAR} MATCHES "${FLAG}") + SET(${VAR} "${${VAR}} ${FLAG}" + CACHE STRING "Flags used by the compiler during ${DOC} builds." FORCE) + ENDIF(NOT ${VAR} MATCHES "${FLAG}") +ENDMACRO(QT_CHECK_FLAG_EXISTS FLAG VAR) +QT_CHECK_FLAG_EXISTS(-DQT_NO_DEBUG CMAKE_CXX_FLAGS_RELWITHDEBINFO "Release with Debug Info") +QT_CHECK_FLAG_EXISTS(-DQT_NO_DEBUG CMAKE_CXX_FLAGS_RELEASE "release") +QT_CHECK_FLAG_EXISTS(-DQT_NO_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL "release minsize") + +INCLUDE(CheckSymbolExists) +INCLUDE(MacroAddFileDependencies) +INCLUDE(MacroPushRequiredVars) + +SET(QT_USE_FILE ${CMAKE_ROOT}/Modules/UseQt4.cmake) + +SET( QT4_DEFINITIONS "") + +IF (WIN32) + SET(QT4_DEFINITIONS -DQT_DLL) +ENDIF(WIN32) + +SET(QT4_INSTALLED_VERSION_TOO_OLD FALSE) + +# macro for asking qmake to process pro files +MACRO(QT_QUERY_QMAKE outvar invar) + FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake/tmp.pro + "message(CMAKE_MESSAGE<$$${invar}>)") + + # Invoke qmake with the tmp.pro program to get the desired + # information. Use the same variable for both stdout and stderr + # to make sure we get the output on all platforms. + EXECUTE_PROCESS(COMMAND ${QT_QMAKE_EXECUTABLE} + WORKING_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake + OUTPUT_VARIABLE _qmake_query_output + RESULT_VARIABLE _qmake_result + ERROR_VARIABLE _qmake_query_output ) + + FILE(REMOVE_RECURSE + "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake") + + IF(_qmake_result) + MESSAGE(WARNING " querying qmake for ${invar}. qmake reported:\n${_qmake_query_output}") + ELSE(_qmake_result) + STRING(REGEX REPLACE ".*CMAKE_MESSAGE<([^>]*).*" "\\1" ${outvar} "${_qmake_query_output}") + ENDIF(_qmake_result) + +ENDMACRO(QT_QUERY_QMAKE) + +GET_FILENAME_COMPONENT(qt_install_version "[HKEY_CURRENT_USER\\Software\\trolltech\\Versions;DefaultQtVersion]" NAME) +# check for qmake +FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake4 qmake-qt4 PATHS + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin" + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin" + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\${qt_install_version};InstallDir]/bin" + $ENV{QTDIR}/bin +) + +IF (QT_QMAKE_EXECUTABLE) + + SET(QT4_QMAKE_FOUND FALSE) + + EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION) + + # check for qt3 qmake and then try and find qmake4 or qmake-qt4 in the path + IF("${QTVERSION}" MATCHES "Unknown") + SET(QT_QMAKE_EXECUTABLE NOTFOUND CACHE FILEPATH "" FORCE) + FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake4 qmake-qt4 PATHS + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin" + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin" + $ENV{QTDIR}/bin + ) + IF(QT_QMAKE_EXECUTABLE) + EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION) + ENDIF(QT_QMAKE_EXECUTABLE) + ENDIF("${QTVERSION}" MATCHES "Unknown") + + # check that we found the Qt4 qmake, Qt3 qmake output won't match here + STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" qt_version_tmp "${QTVERSION}") + IF (qt_version_tmp) + + # we need at least version 4.0.0 + IF (NOT QT4_MIN_VERSION) + SET(QT4_MIN_VERSION "4.0.0") + ENDIF (NOT QT4_MIN_VERSION) + + #now parse the parts of the user given version string into variables + STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" req_qt_major_vers "${QT4_MIN_VERSION}") + IF (NOT req_qt_major_vers) + MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT4_MIN_VERSION}\", expected e.g. \"4.0.1\"") + ENDIF (NOT req_qt_major_vers) + + # now parse the parts of the user given version string into variables + STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_qt_major_vers "${QT4_MIN_VERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" req_qt_minor_vers "${QT4_MIN_VERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_qt_patch_vers "${QT4_MIN_VERSION}") + + IF (NOT req_qt_major_vers EQUAL 4) + MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT4_MIN_VERSION}\", major version 4 is required, e.g. \"4.0.1\"") + ENDIF (NOT req_qt_major_vers EQUAL 4) + + # and now the version string given by qmake + STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_qt_major_vers "${QTVERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+.*" "\\1" found_qt_minor_vers "${QTVERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_qt_patch_vers "${QTVERSION}") + + # compute an overall version number which can be compared at once + MATH(EXPR req_vers "${req_qt_major_vers}*10000 + ${req_qt_minor_vers}*100 + ${req_qt_patch_vers}") + MATH(EXPR found_vers "${found_qt_major_vers}*10000 + ${found_qt_minor_vers}*100 + ${found_qt_patch_vers}") + + IF (found_vers LESS req_vers) + SET(QT4_QMAKE_FOUND FALSE) + SET(QT4_INSTALLED_VERSION_TOO_OLD TRUE) + ELSE (found_vers LESS req_vers) + SET(QT4_QMAKE_FOUND TRUE) + ENDIF (found_vers LESS req_vers) + ENDIF (qt_version_tmp) + +ENDIF (QT_QMAKE_EXECUTABLE) + +IF (QT4_QMAKE_FOUND) + + if (WIN32) + # get qt install dir + get_filename_component(_DIR ${QT_QMAKE_EXECUTABLE} PATH ) + get_filename_component(QT_INSTALL_DIR ${_DIR} PATH ) + endif (WIN32) + + # ask qmake for the library dir + # Set QT4_LIBRARY_DIR + IF (NOT QT4_LIBRARY_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_LIBS" + OUTPUT_VARIABLE QT4_LIBRARY_DIR_TMP ) + IF(EXISTS "${QT4_LIBRARY_DIR_TMP}") + SET(QT4_LIBRARY_DIR ${QT4_LIBRARY_DIR_TMP} CACHE PATH "Qt library dir") + ELSE(EXISTS "${QT4_LIBRARY_DIR_TMP}") + MESSAGE("Warning: QT_QMAKE_EXECUTABLE reported QT_INSTALL_LIBS as ${QT4_LIBRARY_DIR_TMP}") + MESSAGE("Warning: ${QT4_LIBRARY_DIR_TMP} does NOT exist, Qt must NOT be installed correctly.") + ENDIF(EXISTS "${QT4_LIBRARY_DIR_TMP}") + ENDIF(NOT QT4_LIBRARY_DIR) + + IF (APPLE) + IF (EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework) + SET(QT_USE_FRAMEWORKS ON + CACHE BOOL "Set to ON if Qt build uses frameworks.") + ELSE (EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework) + SET(QT_USE_FRAMEWORKS OFF + CACHE BOOL "Set to ON if Qt build uses frameworks.") + ENDIF (EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework) + + MARK_AS_ADVANCED(QT_USE_FRAMEWORKS) + ENDIF (APPLE) + + # ask qmake for the binary dir + IF (NOT QT_BINARY_DIR) + EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_BINS" + OUTPUT_VARIABLE qt_bins ) + SET(QT_BINARY_DIR ${qt_bins} CACHE INTERNAL "") + ENDIF (NOT QT_BINARY_DIR) + + # ask qmake for the include dir + IF (NOT QT_HEADERS_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_HEADERS" + OUTPUT_VARIABLE qt_headers ) + SET(QT_HEADERS_DIR ${qt_headers} CACHE INTERNAL "") + ENDIF(NOT QT_HEADERS_DIR) + + + # ask qmake for the documentation directory + IF (NOT QT_DOC_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_DOCS" + OUTPUT_VARIABLE qt_doc_dir ) + SET(QT_DOC_DIR ${qt_doc_dir} CACHE PATH "The location of the Qt docs") + ENDIF (NOT QT_DOC_DIR) + + # ask qmake for the mkspecs directory + IF (NOT QT_MKSPECS_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QMAKE_MKSPECS" + OUTPUT_VARIABLE qt_mkspecs_dirs ) + STRING(REPLACE ":" ";" qt_mkspecs_dirs "${qt_mkspecs_dirs}") + FIND_PATH(QT_MKSPECS_DIR qconfig.pri PATHS ${qt_mkspecs_dirs} + DOC "The location of the Qt mkspecs containing qconfig.pri" + NO_DEFAULT_PATH ) + ENDIF (NOT QT_MKSPECS_DIR) + + # ask qmake for the plugins directory + IF (NOT QT4_PLUGINS_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_PLUGINS" + OUTPUT_VARIABLE qt_plugins_dir ) + SET(QT4_PLUGINS_DIR ${qt_plugins_dir} CACHE PATH "The location of the Qt plugins") + ENDIF (NOT QT4_PLUGINS_DIR) + ######################################## + # + # Setting the INCLUDE-Variables + # + ######################################## + + FIND_PATH(QT4_QTCORE_INCLUDE_DIR QtGlobal + ${QT_HEADERS_DIR}/QtCore + ${QT4_LIBRARY_DIR}/QtCore.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_INCLUDE_DIR by removine "/QtCore" in the string ${QT4_QTCORE_INCLUDE_DIR} + IF( QT4_QTCORE_INCLUDE_DIR AND NOT QT4_INCLUDE_DIR) + IF (QT_USE_FRAMEWORKS) + SET(QT4_INCLUDE_DIR ${QT_HEADERS_DIR}) + ELSE (QT_USE_FRAMEWORKS) + STRING( REGEX REPLACE "/QtCore$" "" qt4_include_dir ${QT4_QTCORE_INCLUDE_DIR}) + SET( QT4_INCLUDE_DIR ${qt4_include_dir} CACHE PATH "") + ENDIF (QT_USE_FRAMEWORKS) + ENDIF( QT4_QTCORE_INCLUDE_DIR AND NOT QT4_INCLUDE_DIR) + + IF( NOT QT4_INCLUDE_DIR) + IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + MESSAGE( FATAL_ERROR "Could NOT find QtGlobal header") + ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + ENDIF( NOT QT4_INCLUDE_DIR) + + ############################################# + # + # Find out what window system we're using + # + ############################################# + # Save required includes and required_flags variables + macro_push_required_vars() + # Add QT4_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES + SET(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES};${QT4_INCLUDE_DIR}") + # On Mac OS X when Qt has framework support, also add the framework path + IF( QT_USE_FRAMEWORKS ) + SET(CMAKE_REQUIRED_FLAGS "-F${QT4_LIBRARY_DIR} ") + ENDIF( QT_USE_FRAMEWORKS ) + # Check for Window system symbols (note: only one should end up being set) + CHECK_SYMBOL_EXISTS(Q_WS_X11 "QtCore/qglobal.h" Q_WS_X11) + CHECK_SYMBOL_EXISTS(Q_WS_WIN "QtCore/qglobal.h" Q_WS_WIN) + CHECK_SYMBOL_EXISTS(Q_WS_QWS "QtCore/qglobal.h" Q_WS_QWS) + CHECK_SYMBOL_EXISTS(Q_WS_MAC "QtCore/qglobal.h" Q_WS_MAC) + + IF (QT4_QTCOPY_REQUIRED) + CHECK_SYMBOL_EXISTS(QT_IS_QTCOPY "QtCore/qglobal.h" QT_KDE_QT_COPY) + IF (NOT QT_IS_QTCOPY) + MESSAGE(FATAL_ERROR "qt-copy is required, but hasn't been found") + ENDIF (NOT QT_IS_QTCOPY) + ENDIF (QT4_QTCOPY_REQUIRED) + + # Restore CMAKE_REQUIRED_INCLUDES+CMAKE_REQUIRED_FLAGS variables + macro_pop_required_vars() + # + ############################################# + + IF (QT_USE_FRAMEWORKS) + SET(QT4_DEFINITIONS ${QT4_DEFINITIONS} -F${QT4_LIBRARY_DIR} -L${QT4_LIBRARY_DIR} ) + ENDIF (QT_USE_FRAMEWORKS) + + # Set QT4_QT3SUPPORT_INCLUDE_DIR + FIND_PATH(QT4_QT3SUPPORT_INCLUDE_DIR Qt3Support + PATHS + ${QT4_INCLUDE_DIR}/Qt3Support + ${QT4_LIBRARY_DIR}/Qt3Support.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QT4_INCLUDE_DIR + FIND_PATH(QT4_QT4_INCLUDE_DIR qglobal.h + PATHS + ${QT4_INCLUDE_DIR}/Qt + ${QT4_LIBRARY_DIR}/QtCore.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTGUI_INCLUDE_DIR + FIND_PATH(QT4_QTGUI_INCLUDE_DIR QtGui + PATHS + ${QT4_INCLUDE_DIR}/QtGui + ${QT4_LIBRARY_DIR}/QtGui.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTSVG_INCLUDE_DIR + FIND_PATH(QT4_QTSVG_INCLUDE_DIR QtSvg + PATHS + ${QT4_INCLUDE_DIR}/QtSvg + ${QT4_LIBRARY_DIR}/QtSvg.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTSCRIPT_INCLUDE_DIR + FIND_PATH(QT4_QTSCRIPT_INCLUDE_DIR QtScript + PATHS + ${QT4_INCLUDE_DIR}/QtScript + ${QT4_LIBRARY_DIR}/QtScript.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTTEST_INCLUDE_DIR + FIND_PATH(QT4_QTTEST_INCLUDE_DIR QtTest + PATHS + ${QT4_INCLUDE_DIR}/QtTest + ${QT4_LIBRARY_DIR}/QtTest.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTUITOOLS_INCLUDE_DIR + FIND_PATH(QT4_QTUITOOLS_INCLUDE_DIR QtUiTools + PATHS + ${QT4_INCLUDE_DIR}/QtUiTools + ${QT4_LIBRARY_DIR}/QtUiTools.framework/Headers + NO_DEFAULT_PATH + ) + + + + # Set QT4_QTMOTIF_INCLUDE_DIR + IF(Q_WS_X11) + FIND_PATH(QT4_QTMOTIF_INCLUDE_DIR QtMotif PATHS ${QT4_INCLUDE_DIR}/QtMotif NO_DEFAULT_PATH ) + ENDIF(Q_WS_X11) + + # Set QT4_QTNETWORK_INCLUDE_DIR + FIND_PATH(QT4_QTNETWORK_INCLUDE_DIR QtNetwork + PATHS + ${QT4_INCLUDE_DIR}/QtNetwork + ${QT4_LIBRARY_DIR}/QtNetwork.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTNSPLUGIN_INCLUDE_DIR + FIND_PATH(QT4_QTNSPLUGIN_INCLUDE_DIR QtNsPlugin + PATHS + ${QT4_INCLUDE_DIR}/QtNsPlugin + ${QT4_LIBRARY_DIR}/QtNsPlugin.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTOPENGL_INCLUDE_DIR + FIND_PATH(QT4_QTOPENGL_INCLUDE_DIR QtOpenGL + PATHS + ${QT4_INCLUDE_DIR}/QtOpenGL + ${QT4_LIBRARY_DIR}/QtOpenGL.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTSQL_INCLUDE_DIR + FIND_PATH(QT4_QTSQL_INCLUDE_DIR QtSql + PATHS + ${QT4_INCLUDE_DIR}/QtSql + ${QT4_LIBRARY_DIR}/QtSql.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTXML_INCLUDE_DIR + FIND_PATH(QT4_QTXML_INCLUDE_DIR QtXml + PATHS + ${QT4_INCLUDE_DIR}/QtXml + ${QT4_LIBRARY_DIR}/QtXml.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTASSISTANT_INCLUDE_DIR + FIND_PATH(QT4_QTASSISTANT_INCLUDE_DIR QtAssistant + PATHS + ${QT4_INCLUDE_DIR}/QtAssistant + ${QT_HEADERS_DIR}/QtAssistant + ${QT4_LIBRARY_DIR}/QtAssistant.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTDESIGNER_INCLUDE_DIR + FIND_PATH(QT4_QTDESIGNER_INCLUDE_DIR QDesignerComponents + PATHS + ${QT4_INCLUDE_DIR}/QtDesigner + ${QT_HEADERS_DIR}/QtDesigner + ${QT4_LIBRARY_DIR}/QtDesigner.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT4_QTDESIGNERCOMPONENTS_INCLUDE_DIR + FIND_PATH(QT4_QTDESIGNERCOMPONENTS_INCLUDE_DIR QDesignerComponents + PATHS + ${QT4_INCLUDE_DIR}/QtDesigner + ${QT_HEADERS_DIR}/QtDesigner + NO_DEFAULT_PATH + ) + + + # Set QT4_QTDBUS_INCLUDE_DIR + FIND_PATH(QT4_QTDBUS_INCLUDE_DIR QtDBus + PATHS + ${QT4_INCLUDE_DIR}/QtDBus + ${QT_HEADERS_DIR}/QtDBus + NO_DEFAULT_PATH + ) + + # Make variables changeble to the advanced user + MARK_AS_ADVANCED( QT4_LIBRARY_DIR QT4_INCLUDE_DIR QT4_QT4_INCLUDE_DIR QT_DOC_DIR QT_MKSPECS_DIR QT4_PLUGINS_DIR) + + # Set QT4_INCLUDES + SET( QT4_INCLUDES ${QT4_QT4_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${QT4_INCLUDE_DIR}) + + + ######################################## + # + # Setting the LIBRARY-Variables + # + ######################################## + + IF (QT_USE_FRAMEWORKS) + # If FIND_LIBRARY found libraries in Apple frameworks, we would NOT have + # to jump through these hoops. + IF(EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework) + SET(QT4_QTCORE_FOUND TRUE) + SET(QT4_QTCORE_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtCore" CACHE STRING "The QtCore library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework) + SET(QT4_QTCORE_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtCore.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtGui.framework) + SET(QT4_QTGUI_FOUND TRUE) + SET(QT4_QTGUI_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtGui" CACHE STRING "The QtGui library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtGui.framework) + SET(QT4_QTGUI_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtGui.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/Qt3Support.framework) + SET(QT4_QT3SUPPORT_FOUND TRUE) + SET(QT4_QT3SUPPORT_LIBRARY "-F${QT4_LIBRARY_DIR} -framework Qt3Support" CACHE STRING "The Qt3Support library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/Qt3Support.framework) + SET(QT4_QT3SUPPORT_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/Qt3Support.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtNetwork.framework) + SET(QT4_QTNETWORK_FOUND TRUE) + SET(QT4_QTNETWORK_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtNetwork" CACHE STRING "The QtNetwork library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtNetwork.framework) + SET(QT4_QTNETWORK_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtNetwork.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtOpenGL.framework) + SET(QT4_QTOPENGL_FOUND TRUE) + SET(QT4_QTOPENGL_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtOpenGL" CACHE STRING "The QtOpenGL library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtOpenGL.framework) + SET(QT4_QTOPENGL_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtOpenGL.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtSql.framework) + SET(QT4_QTSQL_FOUND TRUE) + SET(QT4_QTSQL_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtSql" CACHE STRING "The QtSql library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtSql.framework) + SET(QT4_QTSQL_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtSql.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtXml.framework) + SET(QT4_QTXML_FOUND TRUE) + SET(QT4_QTXML_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtXml" CACHE STRING "The QtXml library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtXml.framework) + SET(QT4_QTXML_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtXml.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtSvg.framework) + SET(QT4_QTSVG_FOUND TRUE) + SET(QT4_QTSVG_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtSvg" CACHE STRING "The QtSvg library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtSvg.framework) + SET(QT4_QTSVG_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtSvg.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtDBus.framework) + SET(QT4_QTDBUS_FOUND TRUE) + SET(QT4_QTDBUS_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtDBus" CACHE STRING "The QtDBus library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtDBus.framework) + SET(QT4_QTDBUS_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtDBus.framework) + + IF(EXISTS ${QT4_LIBRARY_DIR}/QtTest.framework) + SET(QT4_QTTEST_FOUND TRUE) + SET(QT4_QTTEST_LIBRARY "-F${QT4_LIBRARY_DIR} -framework QtTest" CACHE STRING "The QtTest library.") + ELSE(EXISTS ${QT4_LIBRARY_DIR}/QtTest.framework) + SET(QT4_QTTEST_FOUND FALSE) + ENDIF(EXISTS ${QT4_LIBRARY_DIR}/QtTest.framework) + + # WTF? why don't we have frameworks? :P + # Set QT4_QTUITOOLS_LIBRARY + FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY NAMES QtUiTools QtUiTools4 PATHS ${QT4_LIBRARY_DIR} ) + # Set QT4_QTSCRIPT_LIBRARY + FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY NAMES QtScript QtScript4 PATHS ${QT4_LIBRARY_DIR} ) + + ELSE (QT_USE_FRAMEWORKS) + + # Set QT4_QTCORE_LIBRARY by searching for a lib with "QtCore." as part of the filename + FIND_LIBRARY(QT4_QTCORE_LIBRARY NAMES QtCore QtCore4 QtCored4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH ) + + # Set QT4_QT3SUPPORT_LIBRARY + FIND_LIBRARY(QT4_QT3SUPPORT_LIBRARY NAMES Qt3Support Qt3Support4 Qt3Supportd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTGUI_LIBRARY + FIND_LIBRARY(QT4_QTGUI_LIBRARY NAMES QtGui QtGui4 QtGuid4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTMOTIF_LIBRARY + IF(Q_WS_X11) + FIND_LIBRARY(QT4_QTMOTIF_LIBRARY NAMES QtMotif PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + ENDIF(Q_WS_X11) + + # Set QT4_QTNETWORK_LIBRARY + FIND_LIBRARY(QT4_QTNETWORK_LIBRARY NAMES QtNetwork QtNetwork4 QtNetworkd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTNSPLUGIN_LIBRARY + FIND_LIBRARY(QT4_QTNSPLUGIN_LIBRARY NAMES QtNsPlugin PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTOPENGL_LIBRARY + FIND_LIBRARY(QT4_QTOPENGL_LIBRARY NAMES QtOpenGL QtOpenGL4 QtOpenGLd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTSQL_LIBRARY + FIND_LIBRARY(QT4_QTSQL_LIBRARY NAMES QtSql QtSql4 QtSqld4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTXML_LIBRARY + FIND_LIBRARY(QT4_QTXML_LIBRARY NAMES QtXml QtXml4 QtXmld4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTSVG_LIBRARY + FIND_LIBRARY(QT4_QTSVG_LIBRARY NAMES QtSvg QtSvg4 QtSvgd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTSCRIPT_LIBRARY + FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY NAMES QtScript QtScript4 QtScriptd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTUITOOLS_LIBRARY + FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY NAMES QtUiTools QtUiTools4 QtUiToolsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTTEST_LIBRARY + FIND_LIBRARY(QT4_QTTEST_LIBRARY NAMES QtTest QtTest4 QtTestd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + FIND_LIBRARY(QT4_QTDBUS_LIBRARY NAMES QtDBus QtDBus4 QtDBusd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + IF(MSVC) + FIND_LIBRARY(QT4_QTCORE_LIBRARY_RELEASE NAMES QtCore4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTCORE_LIBRARY_DEBUG NAMES QtCored4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QT3SUPPORT_LIBRARY_RELEASE NAMES Qt3Support4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QT3SUPPORT_LIBRARY_DEBUG NAMES Qt3Supportd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTGUI_LIBRARY_RELEASE NAMES QtGui4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTGUI_LIBRARY_DEBUG NAMES QtGuid4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTNETWORK_LIBRARY_RELEASE NAMES QtNetwork4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTNETWORK_LIBRARY_DEBUG NAMES QtNetworkd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTOPENGL_LIBRARY_RELEASE NAMES QtOpenGL4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTOPENGL_LIBRARY_DEBUG NAMES QtOpenGLd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTSQL_LIBRARY_RELEASE NAMES QtSql4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTSQL_LIBRARY_DEBUG NAMES QtSqld4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTXML_LIBRARY_RELEASE NAMES QtXml4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTXML_LIBRARY_DEBUG NAMES QtXmld4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTSVG_LIBRARY_RELEASE NAMES QtSvg4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTSVG_LIBRARY_DEBUG NAMES QtSvgd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY_RELEASE NAMES QtScript4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTSCRIPT_LIBRARY_DEBUG NAMES QtScriptd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY_RELEASE NAMES QtUiTools QtUiTools4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTUITOOLS_LIBRARY_DEBUG NAMES QtUiToolsd QtUiToolsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTTEST_LIBRARY_RELEASE NAMES QtTest4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTTEST_LIBRARY_DEBUG NAMES QtTestd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTDBUS_LIBRARY_RELEASE NAMES QtDBus4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTDBUS_LIBRARY_DEBUG NAMES QtDBusd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTASSISTANT_LIBRARY_RELEASE NAMES QtAssistantClient4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTASSISTANT_LIBRARY_DEBUG NAMES QtAssistantClientd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTDESIGNER_LIBRARY_RELEASE NAMES QtDesigner4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTDESIGNER_LIBRARY_DEBUG NAMES QtDesignerd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTDESIGNERCOMPONENTS_LIBRARY_RELEASE NAMES QtDesignerComponents4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTDESIGNERCOMPONENTS_LIBRARY_DEBUG NAMES QtDesignerComponentsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTMAIN_LIBRARY_RELEASE NAMES qtmain PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT4_QTMAIN_LIBRARY_DEBUG NAMES qtmaind PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + ENDIF(MSVC) + ENDIF (QT_USE_FRAMEWORKS) + + IF( NOT QT4_QTCORE_LIBRARY ) + IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + MESSAGE( FATAL_ERROR "Could NOT find QtCore. Check ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log for more details.") + ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + ENDIF( NOT QT4_QTCORE_LIBRARY ) + + # Set QT4_QTASSISTANT_LIBRARY + FIND_LIBRARY(QT4_QTASSISTANT_LIBRARY NAMES QtAssistantClient QtAssistantClient4 QtAssistant QtAssistant4 QtAssistantd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTDESIGNER_LIBRARY + FIND_LIBRARY(QT4_QTDESIGNER_LIBRARY NAMES QtDesigner QtDesigner4 QtDesignerd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTDESIGNERCOMPONENTS_LIBRARY + FIND_LIBRARY(QT4_QTDESIGNERCOMPONENTS_LIBRARY NAMES QtDesignerComponents QtDesignerComponents4 QtDesignerComponentsd4 PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT4_QTMAIN_LIBRARY + IF(WIN32) + FIND_LIBRARY(QT4_QTMAIN_LIBRARY NAMES qtmain qtmaind PATHS ${QT4_LIBRARY_DIR} NO_DEFAULT_PATH) + ENDIF(WIN32) + + ############################################ + # + # Check the existence of the libraries. + # + ############################################ + + MACRO (_QT4_ADJUST_LIB_VARS basename) + IF (QT4_${basename}_LIBRARY OR QT4_${basename}_LIBRARY_DEBUG) + + IF(MSVC) + # Both set + IF (QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG) + SET(QT4_${basename}_LIBRARY optimized ${QT4_${basename}_LIBRARY_RELEASE} debug ${QT4_${basename}_LIBRARY_DEBUG}) + ENDIF (QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG) + + # Only debug was found + IF (NOT QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG) + SET(QT4_${basename}_LIBRARY ${QT4_${basename}_LIBRARY_DEBUG}) + ENDIF (NOT QT4_${basename}_LIBRARY_RELEASE AND QT4_${basename}_LIBRARY_DEBUG) + + # Only release was found + IF (QT4_${basename}_LIBRARY_RELEASE AND NOT QT4_${basename}_LIBRARY_DEBUG) + SET(QT4_${basename}_LIBRARY ${QT4_${basename}_LIBRARY_RELEASE}) + ENDIF (QT4_${basename}_LIBRARY_RELEASE AND NOT QT4_${basename}_LIBRARY_DEBUG) + + # Hmm, is this used anywhere ? Yes, in UseQt4.cmake. We are currently incompatible :-( + SET(QT4_${basename}_LIBRARIES optimized ${QT4_${basename}_LIBRARY} debug ${QT4_${basename}_LIBRARY_DEBUG}) + + ENDIF(MSVC) + + SET(QT4_${basename}_LIBRARY ${QT4_${basename}_LIBRARY} CACHE FILEPATH "The Qt4 ${basename} library") + + IF (QT4_${basename}_LIBRARY) + SET(QT4_${basename}_FOUND 1) + ENDIF (QT4_${basename}_LIBRARY) + + ENDIF (QT4_${basename}_LIBRARY OR QT4_${basename}_LIBRARY_DEBUG) + + IF (QT4_${basename}_INCLUDE_DIR) + #add the include directory to QT4_INCLUDES + SET(QT4_INCLUDES "${QT4_${basename}_INCLUDE_DIR}" ${QT4_INCLUDES}) + ENDIF (QT4_${basename}_INCLUDE_DIR) + + # Make variables changeble to the advanced user + MARK_AS_ADVANCED(QT4_${basename}_LIBRARY QT4_${basename}_INCLUDE_DIR) + ENDMACRO (_QT4_ADJUST_LIB_VARS) + + + # Set QT_xyz_LIBRARY variable and add + # library include path to QT4_INCLUDES + _QT4_ADJUST_LIB_VARS(QTCORE) + _QT4_ADJUST_LIB_VARS(QTGUI) + _QT4_ADJUST_LIB_VARS(QT3SUPPORT) + _QT4_ADJUST_LIB_VARS(QTASSISTANT) + _QT4_ADJUST_LIB_VARS(QTDESIGNER) + _QT4_ADJUST_LIB_VARS(QTDESIGNERCOMPONENTS) + _QT4_ADJUST_LIB_VARS(QTNETWORK) + _QT4_ADJUST_LIB_VARS(QTNSPLUGIN) + _QT4_ADJUST_LIB_VARS(QTOPENGL) + _QT4_ADJUST_LIB_VARS(QTSQL) + _QT4_ADJUST_LIB_VARS(QTXML) + _QT4_ADJUST_LIB_VARS(QTSVG) + _QT4_ADJUST_LIB_VARS(QTSCRIPT) + _QT4_ADJUST_LIB_VARS(QTUITOOLS) + _QT4_ADJUST_LIB_VARS(QTTEST) + _QT4_ADJUST_LIB_VARS(QTDBUS) + + # platform dependent libraries + IF(Q_WS_X11) + _QT4_ADJUST_LIB_VARS(QTMOTIF) + ENDIF(Q_WS_X11) + IF(WIN32) + _QT4_ADJUST_LIB_VARS(QTMAIN) + ENDIF(WIN32) + + + ####################################### + # + # Check the executables of Qt + # ( moc, uic, rcc ) + # + ####################################### + + + # find moc and uic using qmake + QT_QUERY_QMAKE(QT4_MOC_EXECUTABLE_INTERNAL "QMAKE_MOC") + QT_QUERY_QMAKE(QT4_UIC_EXECUTABLE_INTERNAL "QMAKE_UIC") + + FILE(TO_CMAKE_PATH + "${QT4_MOC_EXECUTABLE_INTERNAL}" QT4_MOC_EXECUTABLE_INTERNAL) + FILE(TO_CMAKE_PATH + "${QT4_UIC_EXECUTABLE_INTERNAL}" QT4_UIC_EXECUTABLE_INTERNAL) + + SET(QT4_MOC_EXECUTABLE + ${QT4_MOC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The moc executable") + SET(QT4_UIC_EXECUTABLE + ${QT4_UIC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The uic executable") + + FIND_PROGRAM(QT_UIC3_EXECUTABLE + NAMES uic3 + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + FIND_PROGRAM(QT_RCC_EXECUTABLE + NAMES rcc + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + FIND_PROGRAM(QT_DBUSCPP2XML_EXECUTABLE + NAMES qdbuscpp2xml + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + FIND_PROGRAM(QT_DBUSXML2CPP_EXECUTABLE + NAMES qdbusxml2cpp + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + IF (QT4_MOC_EXECUTABLE) + SET(QT_WRAP_CPP "YES") + ENDIF (QT4_MOC_EXECUTABLE) + + IF (QT4_UIC_EXECUTABLE) + SET(QT_WRAP_UI "YES") + ENDIF (QT4_UIC_EXECUTABLE) + + + + MARK_AS_ADVANCED( QT4_UIC_EXECUTABLE QT_UIC3_EXECUTABLE QT4_MOC_EXECUTABLE QT_RCC_EXECUTABLE QT_DBUSXML2CPP_EXECUTABLE QT_DBUSCPP2XML_EXECUTABLE) + + ###################################### + # + # Macros for building Qt files + # + ###################################### + MACRO (QT4_EXTRACT_OPTIONS _qt4_files _qt4_options) + SET(${_qt4_files}) + SET(${_qt4_options}) + SET(_QT4_DOING_OPTIONS FALSE) + FOREACH(_currentArg ${ARGN}) + IF ("${_currentArg}" STREQUAL "OPTIONS") + SET(_QT4_DOING_OPTIONS TRUE) + ELSE ("${_currentArg}" STREQUAL "OPTIONS") + IF(_QT4_DOING_OPTIONS) + LIST(APPEND ${_qt4_options} "${_currentArg}") + ELSE(_QT4_DOING_OPTIONS) + LIST(APPEND ${_qt4_files} "${_currentArg}") + ENDIF(_QT4_DOING_OPTIONS) + ENDIF ("${_currentArg}" STREQUAL "OPTIONS") + ENDFOREACH(_currentArg) + ENDMACRO (QT4_EXTRACT_OPTIONS) + + MACRO (QT4_GET_MOC_INC_DIRS _moc_INC_DIRS) + SET(${_moc_INC_DIRS}) + GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES) + + FOREACH(_current ${_inc_DIRS}) + SET(${_moc_INC_DIRS} ${${_moc_INC_DIRS}} "-I" ${_current}) + ENDFOREACH(_current ${_inc_DIRS}) + + ENDMACRO(QT4_GET_MOC_INC_DIRS) + + + MACRO (QT4_GENERATE_MOC infile outfile ) + # get include dirs + QT4_GET_MOC_INC_DIRS(moc_includes) + + GET_FILENAME_COMPONENT(abs_infile ${infile} ABSOLUTE) + + IF (MSVC_IDE) + SET (_moc_parameter_file ${outfile}_parameters) + SET (_moc_param "${moc_includes} \n-o${outfile} \n${abs_infile}") + STRING(REGEX REPLACE ";-I;" "\\n-I" _moc_param "${_moc_param}") + FILE (WRITE ${_moc_parameter_file} "${_moc_param}") + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT4_MOC_EXECUTABLE} + ARGS @"${_moc_parameter_file}" + DEPENDS ${abs_infile}) + ELSE (MSVC_IDE) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT4_MOC_EXECUTABLE} + ARGS ${moc_includes} -o ${outfile} ${abs_infile} + DEPENDS ${abs_infile}) + ENDIF (MSVC_IDE) + + SET_SOURCE_FILES_PROPERTIES(${outfile} PROPERTIES SKIP_AUTOMOC TRUE) # dont run automoc on this file + + MACRO_ADD_FILE_DEPENDENCIES(${abs_infile} ${outfile}) + ENDMACRO (QT4_GENERATE_MOC) + + + # QT4_WRAP_CPP(outfiles inputfile ... ) + # TODO perhaps add support for -D, -U and other minor options + + MACRO (QT4_WRAP_CPP outfiles ) + # get include dirs + QT4_GET_MOC_INC_DIRS(moc_includes) + QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN}) + + FOREACH (it ${moc_files}) + GET_FILENAME_COMPONENT(it ${it} ABSOLUTE) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/moc_${outfile}.cxx) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT4_MOC_EXECUTABLE} + ARGS ${moc_includes} ${moc_options} -o ${outfile} ${it} + DEPENDS ${it}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH(it) + + ENDMACRO (QT4_WRAP_CPP) + + + # QT4_WRAP_UI(outfiles inputfile ... ) + + MACRO (QT4_WRAP_UI outfiles ) + QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN}) + + FOREACH (it ${ui_files}) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT4_UIC_EXECUTABLE} + ARGS ${ui_options} -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) + + ENDMACRO (QT4_WRAP_UI) + + + # QT4_ADD_RESOURCES(outfiles inputfile ... ) + # TODO perhaps consider adding support for compression and root options to rcc + + MACRO (QT4_ADD_RESOURCES outfiles ) + QT4_EXTRACT_OPTIONS(rcc_files rcc_options ${ARGN}) + + FOREACH (it ${rcc_files}) + GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + GET_FILENAME_COMPONENT(rc_path ${infile} PATH) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx) + # parse file for dependencies + # all files are absolute paths or relative to the location of the qrc file + FILE(READ "${infile}" _RC_FILE_CONTENTS) + STRING(REGEX MATCHALL "<file[^<]+" _RC_FILES "${_RC_FILE_CONTENTS}") + SET(_RC_DEPENDS) + FOREACH(_RC_FILE ${_RC_FILES}) + STRING(REGEX REPLACE "^<file[^>]*>" "" _RC_FILE "${_RC_FILE}") + STRING(REGEX MATCH "^/|([A-Za-z]:/)" _ABS_PATH_INDICATOR "${_RC_FILE}") + IF(NOT _ABS_PATH_INDICATOR) + SET(_RC_FILE "${rc_path}/${_RC_FILE}") + ENDIF(NOT _ABS_PATH_INDICATOR) + SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}") + ENDFOREACH(_RC_FILE) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_RCC_EXECUTABLE} + ARGS ${rcc_options} -name ${outfilename} -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile} + DEPENDS ${_RC_DEPENDS}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) + + ENDMACRO (QT4_ADD_RESOURCES) + + MACRO(QT4_ADD_DBUS_INTERFACE _sources _interface _basename) + GET_FILENAME_COMPONENT(_infile ${_interface} ABSOLUTE) + SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + SET(_impl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + GET_SOURCE_FILE_PROPERTY(_nonamespace ${_interface} NO_NAMESPACE) + IF ( _nonamespace ) + SET(_params -N -m) + ELSE ( _nonamespace ) + SET(_params -m) + ENDIF ( _nonamespace ) + + GET_SOURCE_FILE_PROPERTY(_include ${_interface} INCLUDE) + IF ( _include ) + SET(_params ${_params} -i ${_include}) + ENDIF ( _include ) + + ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} ${_params} -p ${_basename} ${_infile} + DEPENDS ${_infile}) + + SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE) + + QT4_GENERATE_MOC(${_header} ${_moc}) + + SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc}) + MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc}) + + ENDMACRO(QT4_ADD_DBUS_INTERFACE) + + + MACRO(QT4_ADD_DBUS_INTERFACES _sources) + FOREACH (_current_FILE ${ARGN}) + GET_FILENAME_COMPONENT(_infile ${_current_FILE} ABSOLUTE) + # get the part before the ".xml" suffix + STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2" _basename ${_current_FILE}) + STRING(TOLOWER ${_basename} _basename) + QT4_ADD_DBUS_INTERFACE(${_sources} ${_infile} ${_basename}interface) + ENDFOREACH (_current_FILE) + ENDMACRO(QT4_ADD_DBUS_INTERFACES) + + + MACRO(QT4_GENERATE_DBUS_INTERFACE _header) # _customName OPTIONS -some -options ) + QT4_EXTRACT_OPTIONS(_customName _qt4_dbus_options ${ARGN}) + + GET_FILENAME_COMPONENT(_in_file ${_header} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${_header} NAME_WE) + + IF (_customName) + SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName}) + ELSE (_customName) + SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml) + ENDIF (_customName) + + ADD_CUSTOM_COMMAND(OUTPUT ${_target} + COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${_qt4_dbus_options} ${_in_file} > ${_target} + DEPENDS ${_in_file} + ) + ENDMACRO(QT4_GENERATE_DBUS_INTERFACE) + + + MACRO(QT4_ADD_DBUS_ADAPTOR _sources _xml_file _include _parentClass) # _optionalBasename _optionalClassName) + GET_FILENAME_COMPONENT(_infile ${_xml_file} ABSOLUTE) + + SET(_optionalBasename "${ARGV4}") + IF (_optionalBasename) + SET(_basename ${_optionalBasename} ) + ELSE (_optionalBasename) + STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile}) + STRING(TOLOWER ${_basename} _basename) + ENDIF (_optionalBasename) + + SET(_optionalClassName "${ARGV5}") + SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + SET(_impl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + IF(_optionalClassName) + ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} + ) + ELSE(_optionalClassName) + ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} + ) + ENDIF(_optionalClassName) + + QT4_GENERATE_MOC(${_header} ${_moc}) + SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE) + MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc}) + + SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc}) + ENDMACRO(QT4_ADD_DBUS_ADAPTOR) + + MACRO(QT4_AUTOMOC) + QT4_GET_MOC_INC_DIRS(_moc_INCS) + + SET(_matching_FILES ) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE) + # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. + # here. this is required to make bouic work correctly: + # we need to add generated .cpp files to the sources (to compile them), + # but we cannot let automoc handle them, as the .cpp files don't exist yet when + # cmake is run for the very first time on them -> however the .cpp files might + # exist at a later run. at that time we need to skip them, so that we don't add two + # different rules for the same moc file + GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC) + + IF ( NOT _skip AND EXISTS ${_abs_FILE} ) + + FILE(READ ${_abs_FILE} _contents) + + GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH) + + STRING(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") + IF(_match) + FOREACH (_current_MOC_INC ${_match}) + STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}") + + GET_filename_component(_basename ${_current_MOC} NAME_WE) + # SET(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h) + IF (EXISTS ${_abs_PATH}/${_basename}.h) + SET(_header ${_abs_PATH}/${_basename}.h) + ELSE (EXISTS ${_abs_PATH}/${_basename}.h) + SET(_header ${_abs_FILE}) + ENDIF (EXISTS ${_abs_PATH}/${_basename}.h) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) + ADD_CUSTOM_COMMAND(OUTPUT ${_moc} + COMMAND ${QT4_MOC_EXECUTABLE} + ARGS ${_moc_INCS} ${_header} -o ${_moc} + DEPENDS ${_header} + ) + + MACRO_ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc}) + ENDFOREACH (_current_MOC_INC) + ENDIF(_match) + ENDIF ( NOT _skip AND EXISTS ${_abs_FILE} ) + ENDFOREACH (_current_FILE) + ENDMACRO(QT4_AUTOMOC) + + + + ###################################### + # + # decide if Qt got found + # + ###################################### + + # if the includes,libraries,moc,uic and rcc are found then we have it + IF( QT4_LIBRARY_DIR AND QT4_INCLUDE_DIR AND QT4_MOC_EXECUTABLE AND QT4_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE) + SET( QT4_FOUND "YES" ) + IF( NOT Qt4_FIND_QUIETLY) + MESSAGE(STATUS "Found Qt-Version ${QTVERSION} (using ${QT_QMAKE_EXECUTABLE})") + ENDIF( NOT Qt4_FIND_QUIETLY) + ELSE( QT4_LIBRARY_DIR AND QT4_INCLUDE_DIR AND QT4_MOC_EXECUTABLE AND QT4_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE) + SET( QT4_FOUND "NO") + SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE) + IF( Qt4_FIND_REQUIRED) + IF ( NOT QT4_LIBRARY_DIR ) + MESSAGE(STATUS "Qt libraries NOT found!") + ENDIF(NOT QT4_LIBRARY_DIR ) + IF ( NOT QT4_INCLUDE_DIR ) + MESSAGE(STATUS "Qt includes NOT found!") + ENDIF( NOT QT4_INCLUDE_DIR ) + IF ( NOT QT4_MOC_EXECUTABLE ) + MESSAGE(STATUS "Qt's moc NOT found!") + ENDIF( NOT QT4_MOC_EXECUTABLE ) + IF ( NOT QT4_UIC_EXECUTABLE ) + MESSAGE(STATUS "Qt's uic NOT found!") + ENDIF( NOT QT4_UIC_EXECUTABLE ) + IF ( NOT QT_RCC_EXECUTABLE ) + MESSAGE(STATUS "Qt's rcc NOT found!") + ENDIF( NOT QT_RCC_EXECUTABLE ) + MESSAGE( FATAL_ERROR "Qt libraries, includes, moc, uic or/and rcc NOT found!") + ENDIF( Qt4_FIND_REQUIRED) + ENDIF( QT4_LIBRARY_DIR AND QT4_INCLUDE_DIR AND QT4_MOC_EXECUTABLE AND QT4_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE) + SET(QT_FOUND ${QT4_FOUND}) + + + ####################################### + # + # System dependent settings + # + ####################################### + # for unix add X11 stuff + IF(UNIX) + # on OS X X11 may not be required + IF (Q_WS_X11) + FIND_PACKAGE(X11 REQUIRED) + ENDIF (Q_WS_X11) + FIND_PACKAGE(Threads) + SET(QT4_QTCORE_LIBRARY ${QT4_QTCORE_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) + ENDIF(UNIX) + + + ####################################### + # + # compatibility settings + # + ####################################### + # Backwards compatibility for CMake1.4 and 1.2 + SET (QT_MOC_EXE ${QT4_MOC_EXECUTABLE} ) + SET (QT_UIC_EXE ${QT4_UIC_EXECUTABLE} ) + + SET( QT4_QT_LIBRARY "") + +ELSE(QT4_QMAKE_FOUND) + + SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE) + IF(Qt4_FIND_REQUIRED) + IF(QT4_INSTALLED_VERSION_TOO_OLD) + MESSAGE(FATAL_ERROR "The installed Qt version ${QTVERSION} is too old, at least version ${QT4_MIN_VERSION} is required") + ELSE(QT4_INSTALLED_VERSION_TOO_OLD) + MESSAGE( FATAL_ERROR "Qt qmake not found!") + ENDIF(QT4_INSTALLED_VERSION_TOO_OLD) + ELSE(Qt4_FIND_REQUIRED) + IF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY) + MESSAGE(STATUS "The installed Qt version ${QTVERSION} is too old, at least version ${QT4_MIN_VERSION} is required") + ENDIF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY) + ENDIF(Qt4_FIND_REQUIRED) + +ENDIF (QT4_QMAKE_FOUND) +ENDIF (QT4_QMAKE_FOUND) + diff --git a/cmake/modules/GObjectIntrospectionMacros.cmake b/cmake/modules/GObjectIntrospectionMacros.cmake new file mode 100644 index 0000000..3f90c2a --- /dev/null +++ b/cmake/modules/GObjectIntrospectionMacros.cmake @@ -0,0 +1,96 @@ +# Copyright (C) 2010, Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +macro(_gir_list_prefix _outvar _listvar _prefix) + set(${_outvar}) + foreach(_item IN LISTS ${_listvar}) + list(APPEND ${_outvar} ${_prefix}${_item}) + endforeach() +endmacro(_gir_list_prefix) + +macro(gir_add_introspections introspections_girs) + + set(_gir_girs) + set(_gir_typelibs) + + foreach(gir IN LISTS ${introspections_girs}) + + set(_gir_name "${gir}") + + ## Transform the gir filename to something which can reference through a variable + ## without automake/make complaining, eg Gtk-2.0.gir -> Gtk_2_0_gir + string(REPLACE "-" "_" _gir_name "${_gir_name}") + string(REPLACE "." "_" _gir_name "${_gir_name}") + + # Namespace and Version is either fetched from the gir filename + # or the _NAMESPACE/_VERSION variable combo + set(_gir_namespace "${${_gir_name}_NAMESPACE}") + if (_gir_namespace STREQUAL "") + string(REGEX REPLACE "([^-]+)-.*" "\\1" _gir_namespace "${gir}") + endif () + set(_gir_version "${${_gir_name}_VERSION}") + if (_gir_version STREQUAL "") + string(REGEX REPLACE ".*-([^-]+).gir" "\\1" _gir_version "${gir}") + endif () + + # _PROGRAM is an optional variable which needs it's own --program argument + set(_gir_program "${${_gir_name}_PROGRAM}") + if (NOT _gir_program STREQUAL "") + set(_gir_program "--program=${_gir_program}") + endif () + + # Variables which provides a list of things + _gir_list_prefix(_gir_libraries ${_gir_name}_LIBS "--library=") + _gir_list_prefix(_gir_packages ${_gir_name}_PACKAGES "--pkg=") + _gir_list_prefix(_gir_includes ${_gir_name}_INCLUDES "--include=") + _gir_list_prefix(_gir_export_packages ${_gir_name}_EXPORT_PACKAGES "--pkg-export=") + + # Reuse the LIBTOOL variable from by automake if it's set + set(_gir_libtool "--no-libtool") + + add_custom_command( + COMMAND ${INTROSPECTION_SCANNER} + ${INTROSPECTION_SCANNER_ARGS} + --namespace=${_gir_namespace} + --nsversion=${_gir_version} + ${_gir_libtool} + ${_gir_program} + ${_gir_libraries} + ${_gir_packages} + ${_gir_includes} + ${_gir_export_packages} + ${${_gir_name}_SCANNERFLAGS} + ${${_gir_name}_CFLAGS} + ${${_gir_name}_FILES} + --output ${CMAKE_CURRENT_BINARY_DIR}/${gir} + DEPENDS ${${_gir_name}_FILES} + ${${_gir_name}_LIBS} + OUTPUT ${gir} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + VERBATIM + ) + list(APPEND _gir_girs ${CMAKE_CURRENT_BINARY_DIR}/${gir}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${gir} DESTINATION share/gir-1.0) + + string(REPLACE ".gir" ".typelib" _typelib "${gir}") + add_custom_command( + COMMAND ${INTROSPECTION_COMPILER} + ${INTROSPECTION_COMPILER_ARGS} + --includedir=. + ${CMAKE_CURRENT_BINARY_DIR}/${gir} + -o ${CMAKE_CURRENT_BINARY_DIR}/${_typelib} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${gir} + OUTPUT ${_typelib} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + list(APPEND _gir_typelibs ${CMAKE_CURRENT_BINARY_DIR}/${_typelib}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_typelib} DESTINATION lib${LIB_SUFFIX}/girepository-1.0) + + endforeach() + + add_custom_target(gir-girs ALL DEPENDS ${_gir_girs}) + add_custom_target(gir-typelibs ALL DEPENDS ${_gir_typelibs}) + +endmacro(gir_add_introspections) diff --git a/cmake/modules/MacroBoolTo01.cmake b/cmake/modules/MacroBoolTo01.cmake new file mode 100644 index 0000000..63b9852 --- /dev/null +++ b/cmake/modules/MacroBoolTo01.cmake @@ -0,0 +1,20 @@ +# MACRO_BOOL_TO_01( VAR RESULT0 ... RESULTN ) +# This macro evaluates its first argument +# and sets all the given vaiables either to 0 or 1 +# depending on the value of the first one + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO(MACRO_BOOL_TO_01 FOUND_VAR ) + FOREACH (_current_VAR ${ARGN}) + IF(${FOUND_VAR}) + SET(${_current_VAR} 1) + ELSE(${FOUND_VAR}) + SET(${_current_VAR} 0) + ENDIF(${FOUND_VAR}) + ENDFOREACH(_current_VAR) +ENDMACRO(MACRO_BOOL_TO_01) diff --git a/cmake/modules/MacroEnsureVersion.cmake b/cmake/modules/MacroEnsureVersion.cmake new file mode 100644 index 0000000..6797e5b --- /dev/null +++ b/cmake/modules/MacroEnsureVersion.cmake @@ -0,0 +1,117 @@ +# This file defines the following macros for developers to use in ensuring +# that installed software is of the right version: +# +# MACRO_ENSURE_VERSION - test that a version number is greater than +# or equal to some minimum +# MACRO_ENSURE_VERSION_RANGE - test that a version number is greater than +# or equal to some minimum and less than some +# maximum +# MACRO_ENSURE_VERSION2 - deprecated, do not use in new code +# + +# MACRO_ENSURE_VERSION +# This macro compares version numbers of the form "x.y.z" or "x.y" +# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) +# will set FOO_VERSION_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION +# Leading and trailing text is ok, e.g. +# MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) +# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system + +# Copyright (c) 2006, David Faure, <faure@kde.org> +# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +# MACRO_ENSURE_VERSION_RANGE +# This macro ensures that a version number of the form +# "x.y.z" or "x.y" falls within a range defined by +# min_version <= found_version < max_version. +# If this expression holds, FOO_VERSION_OK will be set TRUE +# +# Example: MACRO_ENSURE_VERSION_RANGE3( "0.1.0" ${FOOCODE_VERSION} "0.7.0" FOO_VERSION_OK ) +# +# This macro will break silently if any of x,y,z are greater than 100. +# +# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +# NORMALIZE_VERSION +# Helper macro to convert version numbers of the form "x.y.z" +# to an integer equal to 10^4 * x + 10^2 * y + z +# +# This macro will break silently if any of x,y,z are greater than 100. +# +# Copyright (c) 2006, David Faure, <faure@kde.org> +# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +# CHECK_RANGE_INCLUSIVE_LOWER +# Helper macro to check whether x <= y < z +# +# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO(NORMALIZE_VERSION _requested_version _normalized_version) + STRING(REGEX MATCH "[^0-9]*[0-9]+\\.[0-9]+\\.[0-9]+.*" _threePartMatch "${_requested_version}") + if (_threePartMatch) + # parse the parts of the version string + STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" _major_vers "${_requested_version}") + STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" _minor_vers "${_requested_version}") + STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" _patch_vers "${_requested_version}") + else (_threePartMatch) + STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" _major_vers "${_requested_version}") + STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" _minor_vers "${_requested_version}") + set(_patch_vers "0") + endif (_threePartMatch) + + # compute an overall version number which can be compared at once + MATH(EXPR ${_normalized_version} "${_major_vers}*10000 + ${_minor_vers}*100 + ${_patch_vers}") +ENDMACRO(NORMALIZE_VERSION) + +MACRO(MACRO_CHECK_RANGE_INCLUSIVE_LOWER _lower_limit _value _upper_limit _ok) + if (${_value} LESS ${_lower_limit}) + set( ${_ok} FALSE ) + elseif (${_value} EQUAL ${_lower_limit}) + set( ${_ok} TRUE ) + elseif (${_value} EQUAL ${_upper_limit}) + set( ${_ok} FALSE ) + elseif (${_value} GREATER ${_upper_limit}) + set( ${_ok} FALSE ) + else (${_value} LESS ${_lower_limit}) + set( ${_ok} TRUE ) + endif (${_value} LESS ${_lower_limit}) +ENDMACRO(MACRO_CHECK_RANGE_INCLUSIVE_LOWER) + +MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) + NORMALIZE_VERSION( ${requested_version} req_vers_num ) + NORMALIZE_VERSION( ${found_version} found_vers_num ) + + if (found_vers_num LESS req_vers_num) + set( ${var_too_old} FALSE ) + else (found_vers_num LESS req_vers_num) + set( ${var_too_old} TRUE ) + endif (found_vers_num LESS req_vers_num) + +ENDMACRO(MACRO_ENSURE_VERSION) + +MACRO(MACRO_ENSURE_VERSION2 requested_version2 found_version2 var_too_old2) + MACRO_ENSURE_VERSION( ${requested_version2} ${found_version2} ${var_too_old2}) +ENDMACRO(MACRO_ENSURE_VERSION2) + +MACRO(MACRO_ENSURE_VERSION_RANGE min_version found_version max_version var_ok) + NORMALIZE_VERSION( ${min_version} req_vers_num ) + NORMALIZE_VERSION( ${found_version} found_vers_num ) + NORMALIZE_VERSION( ${max_version} max_vers_num ) + + MACRO_CHECK_RANGE_INCLUSIVE_LOWER( ${req_vers_num} ${found_vers_num} ${max_vers_num} ${var_ok}) +ENDMACRO(MACRO_ENSURE_VERSION_RANGE) + + diff --git a/cmake/modules/MacroOptionalFindPackage.cmake b/cmake/modules/MacroOptionalFindPackage.cmake new file mode 100644 index 0000000..d4ed48e --- /dev/null +++ b/cmake/modules/MacroOptionalFindPackage.cmake @@ -0,0 +1,48 @@ +# - MACRO_OPTIONAL_FIND_PACKAGE() combines FIND_PACKAGE() with an OPTION() +# MACRO_OPTIONAL_FIND_PACKAGE( <name> [QUIT] ) +# This macro is a combination of OPTION() and FIND_PACKAGE(), it +# works like FIND_PACKAGE(), but additionally it automatically creates +# an option name WITH_<name>, which can be disabled via the cmake GUI. +# or via -DWITH_<name>=OFF +# The standard <name>_FOUND variables can be used in the same way +# as when using the normal FIND_PACKAGE() + +# Copyright (c) 2006-2010 Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +# This is just a helper macro to set a bunch of variables empty. +# We don't know whether the package uses UPPERCASENAME or CamelCaseName, so we try both: +macro(_MOFP_SET_EMPTY_IF_DEFINED _name _var) + if(DEFINED ${_name}_${_var}) + set(${_name}_${_var} "") + endif(DEFINED ${_name}_${_var}) + + string(TOUPPER ${_name} _nameUpper) + if(DEFINED ${_nameUpper}_${_var}) + set(${_nameUpper}_${_var} "") + endif(DEFINED ${_nameUpper}_${_var}) +endmacro(_MOFP_SET_EMPTY_IF_DEFINED _package _var) + + +macro (MACRO_OPTIONAL_FIND_PACKAGE _name ) + option(WITH_${_name} "Search for ${_name} package" ON) + if (WITH_${_name}) + find_package(${_name} ${ARGN}) + else (WITH_${_name}) + string(TOUPPER ${_name} _nameUpper) + set(${_name}_FOUND FALSE) + set(${_nameUpper}_FOUND FALSE) + + _mofp_set_empty_if_defined(${_name} INCLUDE_DIRS) + _mofp_set_empty_if_defined(${_name} INCLUDE_DIR) + _mofp_set_empty_if_defined(${_name} INCLUDES) + _mofp_set_empty_if_defined(${_name} LIBRARY) + _mofp_set_empty_if_defined(${_name} LIBRARIES) + _mofp_set_empty_if_defined(${_name} LIBS) + _mofp_set_empty_if_defined(${_name} FLAGS) + _mofp_set_empty_if_defined(${_name} DEFINITIONS) + endif (WITH_${_name}) +endmacro (MACRO_OPTIONAL_FIND_PACKAGE) + diff --git a/cmake/modules/MacroPushRequiredVars.cmake b/cmake/modules/MacroPushRequiredVars.cmake new file mode 100644 index 0000000..650b566 --- /dev/null +++ b/cmake/modules/MacroPushRequiredVars.cmake @@ -0,0 +1,47 @@ +# this module defines two macros: +# MACRO_PUSH_REQUIRED_VARS() +# and +# MACRO_POP_REQUIRED_VARS() +# use these if you call cmake macros which use +# any of the CMAKE_REQUIRED_XXX variables +# +# Usage: +# MACRO_PUSH_REQUIRED_VARS() +# SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DSOME_MORE_DEF) +# CHECK_FUNCTION_EXISTS(...) +# MACRO_POP_REQUIRED_VARS() + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO(MACRO_PUSH_REQUIRED_VARS) + + IF(NOT DEFINED _PUSH_REQUIRED_VARS_COUNTER) + SET(_PUSH_REQUIRED_VARS_COUNTER 0) + ENDIF(NOT DEFINED _PUSH_REQUIRED_VARS_COUNTER) + + MATH(EXPR _PUSH_REQUIRED_VARS_COUNTER "${_PUSH_REQUIRED_VARS_COUNTER}+1") + + SET(_CMAKE_REQUIRED_INCLUDES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_INCLUDES}) + SET(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_DEFINITIONS}) + SET(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_LIBRARIES}) + SET(_CMAKE_REQUIRED_FLAGS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_FLAGS}) +ENDMACRO(MACRO_PUSH_REQUIRED_VARS) + +MACRO(MACRO_POP_REQUIRED_VARS) + +# don't pop more than we pushed + IF("${_PUSH_REQUIRED_VARS_COUNTER}" GREATER "0") + + SET(CMAKE_REQUIRED_INCLUDES ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + SET(CMAKE_REQUIRED_DEFINITIONS ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + SET(CMAKE_REQUIRED_LIBRARIES ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + SET(CMAKE_REQUIRED_FLAGS ${_CMAKE_REQUIRED_FLAGS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + + MATH(EXPR _PUSH_REQUIRED_VARS_COUNTER "${_PUSH_REQUIRED_VARS_COUNTER}-1") + ENDIF("${_PUSH_REQUIRED_VARS_COUNTER}" GREATER "0") + +ENDMACRO(MACRO_POP_REQUIRED_VARS) + diff --git a/cmake/modules/PopplerDefaults.cmake b/cmake/modules/PopplerDefaults.cmake new file mode 100644 index 0000000..b0374cf --- /dev/null +++ b/cmake/modules/PopplerDefaults.cmake @@ -0,0 +1,17 @@ +# enable the testing facilities +enable_testing() + +# put the include directories of the sources before other include paths +# (eg, system includes) +set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON) + +# colored output +set(CMAKE_COLOR_MAKEFILE ON) + +# CMake policy #0002: we can have multiple targets with the same name (for the unit tests) +cmake_policy(SET CMP0002 OLD) +# CMake policy #0011 (>= 2.6.3): make policy changes (as done here) taking effect for all the tree +if(POLICY CMP0011) + cmake_policy(SET CMP0011 OLD) +endif(POLICY CMP0011) + diff --git a/cmake/modules/PopplerMacros.cmake b/cmake/modules/PopplerMacros.cmake new file mode 100644 index 0000000..04dfc46 --- /dev/null +++ b/cmake/modules/PopplerMacros.cmake @@ -0,0 +1,142 @@ +# Copyright 2008 Pino Toscano, <pino@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +macro(POPPLER_ADD_TEST exe build_flag) + set(build_test ${${build_flag}}) + if(NOT build_test) + set(_add_executable_param ${_add_executable_param} EXCLUDE_FROM_ALL) + endif(NOT build_test) + + add_executable(${exe} ${_add_executable_param} ${ARGN}) + + # if the tests are EXCLUDE_FROM_ALL, add a target "buildtests" to build all tests + if(NOT build_test AND NOT MSVC_IDE) + get_directory_property(_buildtestsAdded BUILDTESTS_ADDED) + if(NOT _buildtestsAdded) + add_custom_target(buildtests) + set_directory_properties(PROPERTIES BUILDTESTS_ADDED TRUE) + endif(NOT _buildtestsAdded) + add_dependencies(buildtests ${exe}) + endif(NOT build_test AND NOT MSVC_IDE) +endmacro(POPPLER_ADD_TEST) + +macro(POPPLER_ADD_UNITTEST exe build_flag) + set(build_test ${${build_flag}}) + if(NOT build_test) + set(_add_executable_param ${_add_executable_param} EXCLUDE_FROM_ALL) + endif(NOT build_test) + + add_executable(${exe} ${_add_executable_param} ${ARGN}) + add_test(${exe} ${EXECUTABLE_OUTPUT_PATH}/${exe}) + + # if the tests are EXCLUDE_FROM_ALL, add a target "buildtests" to build all tests + if(NOT build_test) + get_directory_property(_buildtestsAdded BUILDTESTS_ADDED) + if(NOT _buildtestsAdded) + add_custom_target(buildtests) + set_directory_properties(PROPERTIES BUILDTESTS_ADDED TRUE) + endif(NOT _buildtestsAdded) + add_dependencies(buildtests ${exe}) + endif(NOT build_test) +endmacro(POPPLER_ADD_UNITTEST) + +macro(POPPLER_CREATE_INSTALL_PKGCONFIG generated_file install_location) + if(NOT WIN32) + configure_file(${generated_file}.cmake ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} DESTINATION ${install_location}) + endif(NOT WIN32) +endmacro(POPPLER_CREATE_INSTALL_PKGCONFIG) + +macro(SHOW_END_MESSAGE what value) + string(LENGTH ${what} length_what) + math(EXPR left_char "20 - ${length_what}") + set(blanks) + foreach(_i RANGE 1 ${left_char}) + set(blanks "${blanks} ") + endforeach(_i) + + message(" ${what}:${blanks} ${value}") +endmacro(SHOW_END_MESSAGE) + +macro(SHOW_END_MESSAGE_YESNO what enabled) + if(${enabled}) + set(enabled_string "yes") + else(${enabled}) + set(enabled_string "no") + endif(${enabled}) + + show_end_message("${what}" "${enabled_string}") +endmacro(SHOW_END_MESSAGE_YESNO) + +macro(POPPLER_CHECK_LINK_FLAG flag var) + set(_save_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + include(CheckCXXSourceCompiles) + set(CMAKE_REQUIRED_LIBRARIES "${flag}") + check_cxx_source_compiles("int main() { return 0; }" ${var}) + set(CMAKE_REQUIRED_LIBRARIES "${_save_CMAKE_REQUIRED_LIBRARIES}") +endmacro(POPPLER_CHECK_LINK_FLAG) + + +set(CMAKE_SYSTEM_INCLUDE_PATH ${CMAKE_SYSTEM_INCLUDE_PATH} + "${CMAKE_INSTALL_PREFIX}/include" ) + +set(CMAKE_SYSTEM_PROGRAM_PATH ${CMAKE_SYSTEM_PROGRAM_PATH} + "${CMAKE_INSTALL_PREFIX}/bin" ) + +set(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH} + "${CMAKE_INSTALL_PREFIX}/lib" ) + +# under Windows dlls may be also installed in bin/ +if(WIN32) + set(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH} + "${CMAKE_INSTALL_PREFIX}/bin" ) +endif(WIN32) + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + +if(CMAKE_COMPILER_IS_GNUCXX) + # set the default compile warnings + set(DEFAULT_COMPILE_WARNINGS_NO) + set(DEFAULT_COMPILE_WARNINGS_YES "-Wall -Wcast-align -fno-exceptions -fno-check-new -fno-common") + set(DEFAULT_COMPILE_WARNINGS_KDE "-Wno-long-long -Wundef -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -Wcast-align -Wconversion -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-exceptions -fno-check-new -fno-common") + + set(CMAKE_CXX_FLAGS "-Wnon-virtual-dtor -Woverloaded-virtual ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 -fno-inline") + set(CMAKE_CXX_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") + set(CMAKE_C_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") + set(CMAKE_C_FLAGS_DEBUGFULL "-g3 -fno-inline") + set(CMAKE_C_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") + + if(CMAKE_SYSTEM_NAME MATCHES Linux) + set(DEFAULT_COMPILE_WARNINGS_YES "${DEFAULT_COMPILE_WARNINGS_YES} -ansi") + set(DEFAULT_COMPILE_WARNINGS_KDE "${DEFAULT_COMPILE_WARNINGS_KDE} -ansi") + endif(CMAKE_SYSTEM_NAME MATCHES Linux) + + poppler_check_link_flag("-Wl,--as-needed" GCC_HAS_AS_NEEDED) + if(GCC_HAS_AS_NEEDED) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--as-needed") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") + endif(GCC_HAS_AS_NEEDED) +endif (CMAKE_COMPILER_IS_GNUCXX) + +if(CMAKE_C_COMPILER MATCHES "icc") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") + set(CMAKE_CXX_FLAGS_DEBUG "-O2 -g -0b0 -noalign") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g -Ob0 -noalign") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") + set(CMAKE_C_FLAGS_DEBUG "-O2 -g -Ob0 -noalign") + set(CMAKE_C_FLAGS_DEBUGFULL "-g -Ob0 -noalign") +endif(CMAKE_C_COMPILER MATCHES "icc") + diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..d622a44 --- /dev/null +++ b/config.guess @@ -0,0 +1,1530 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-02-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to <config-patches@gnu.org> and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +and + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.cmake b/config.h.cmake new file mode 100644 index 0000000..3c7b968 --- /dev/null +++ b/config.h.cmake @@ -0,0 +1,222 @@ +/* config.h. Generated from config.h.cmake by cmake. */ + +/* Build against libcurl. */ +#cmakedefine ENABLE_LIBCURL 1 + +/* Use libjpeg instead of builtin jpeg decoder. */ +#cmakedefine ENABLE_LIBJPEG 1 + +/* Use libopenjpeg instead of builtin jpeg2000 decoder. */ +#cmakedefine ENABLE_LIBOPENJPEG 1 + +/* Build against libtiff. */ +#cmakedefine ENABLE_LIBTIFF 1 + +/* Build against libpng. */ +#cmakedefine ENABLE_LIBPNG 1 + +/* Do not hardcode the library location */ +#cmakedefine ENABLE_RELOCATABLE 1 + +/* Use zlib instead of builtin zlib decoder. */ +#cmakedefine ENABLE_ZLIB 1 + +/* Use cairo for rendering. */ +#cmakedefine HAVE_CAIRO 1 + +/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'. + */ +#cmakedefine HAVE_DIRENT_H 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#cmakedefine HAVE_DLFCN_H 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#cmakedefine HAVE_FCNTL_H 1 + +/* Have FreeType2 include files */ +#cmakedefine HAVE_FREETYPE_H 1 + +/* Define to 1 if you have the `fseek64' function. */ +#cmakedefine HAVE_FSEEK64 1 + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#cmakedefine HAVE_FSEEKO 1 + +/* Define to 1 if you have the `ftell64' function. */ +#cmakedefine HAVE_FTELL64 1 + +/* Defines if gettimeofday is available on your system */ +#cmakedefine HAVE_GETTIMEOFDAY 1 + +/* Defines if gmtime_r is available on your system */ +#cmakedefine HAVE_GMTIME_R 1 + +/* Define if you have the iconv() function and it works. */ +#cmakedefine HAVE_ICONV 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#cmakedefine HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `openjpeg' library (-lopenjpeg). */ +#cmakedefine HAVE_LIBOPENJPEG 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#cmakedefine HAVE_LIBZ 1 + +/* Defines if localtime_r is available on your system */ +#cmakedefine HAVE_LOCALTIME_R 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#cmakedefine HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#cmakedefine HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mkstemps' function. */ +#cmakedefine HAVE_MKSTEMPS 1 + +/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ +#cmakedefine HAVE_NDIR_H 1 + +/* Define to 1 if you have the <openjpeg.h> header file. */ +#cmakedefine HAVE_OPENJPEG_H 1 + +/* Define to 1 if you have the `popen' function. */ +#cmakedefine HAVE_POPEN 1 + +/* Define if you have POSIX threads libraries and header files. */ +#cmakedefine HAVE_PTHREAD 1 + +/* Use splash for rendering. */ +#cmakedefine HAVE_SPLASH 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#cmakedefine HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#cmakedefine HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#cmakedefine HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#cmakedefine HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. + */ +#cmakedefine HAVE_SYS_DIR_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#cmakedefine HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. + */ +#cmakedefine HAVE_SYS_NDIR_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#cmakedefine HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#cmakedefine HAVE_UNISTD_H 1 + +/* Define to 1 if you have the <zlib.h> header file. */ +#cmakedefine HAVE_ZLIB_H 1 + +/* Define to 1 if you have a big endian machine */ +#cmakedefine WORDS_BIGENDIAN 1 + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST ${ICONV_CONST} + +/* Enable multithreading support. */ +#cmakedefine MULTITHREADED 1 + +/* Generate OPI comments in PS output. */ +#cmakedefine OPI_SUPPORT 1 + +/* Name of package */ +#define PACKAGE "poppler" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "https://bugs.freedesktop.org/enter_bug.cgi?product=poppler" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "poppler" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "poppler ${POPPLER_VERSION}" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "poppler" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "${POPPLER_VERSION}" + +/* Poppler data dir */ +#define POPPLER_DATADIR "${CMAKE_INSTALL_PREFIX}/share/poppler" + +/* Support for curl based doc builder is compiled in. */ +#cmakedefine POPPLER_HAS_CURL_SUPPORT 1 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Enable word list support. */ +#cmakedefine TEXTOUT_WORD_LIST 1 + +/* Defines if use cms */ +#cmakedefine USE_CMS 1 + +/* Use fixed point arithmetic in the Splash backend */ +#cmakedefine USE_FIXEDPOINT 1 + +/* Use single precision arithmetic in the Splash backend */ +#cmakedefine USE_FLOAT 1 + +/* Defines if use lcms1 */ +#cmakedefine USE_LCMS1 1 + +/* Version number of package */ +#define VERSION "${POPPLER_VERSION}" + +/* Use fontconfig font configuration backend */ +#cmakedefine WITH_FONTCONFIGURATION_FONTCONFIG 1 + +/* Use win32 font configuration backend */ +#cmakedefine WITH_FONTCONFIGURATION_WIN32 1 + +/* OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag */ +#cmakedefine WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG 1 + +/* Define to 1 if the X Window System is missing or not being used. */ +/* #undef X_DISPLAY_MISSING */ + +/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif + +/* MS has defined snprintf as deprecated */ +#ifdef _MSC_VER +#define snprintf _snprintf +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* #undef _LARGEFILE_SOURCE */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..eae4380 --- /dev/null +++ b/config.h.in @@ -0,0 +1,249 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Build against libcurl. */ +#undef ENABLE_LIBCURL + +/* Use libjpeg instead of builtin jpeg decoder. */ +#undef ENABLE_LIBJPEG + +/* Use libopenjpeg instead of builtin jpeg2000 decoder. */ +#undef ENABLE_LIBOPENJPEG + +/* Build against libpng. */ +#undef ENABLE_LIBPNG + +/* Build against libtiff. */ +#undef ENABLE_LIBTIFF + +/* Do not hardcode the library location */ +#undef ENABLE_RELOCATABLE + +/* Use zlib instead of builtin zlib decoder. */ +#undef ENABLE_ZLIB + +/* Use cairo for rendering. */ +#undef HAVE_CAIRO + +/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Have FreeType2 include files */ +#undef HAVE_FREETYPE_H + +/* Define to 1 if you have the `fseek64' function. */ +#undef HAVE_FSEEK64 + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#undef HAVE_FSEEKO + +/* Define to 1 if you have the `ftell64' function. */ +#undef HAVE_FTELL64 + +/* Defines if gettimeofday is available on your system */ +#undef HAVE_GETTIMEOFDAY + +/* Defines if gmtime_r is available on your system */ +#undef HAVE_GMTIME_R + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `tiff' library (-ltiff). */ +#undef HAVE_LIBTIFF + +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + +/* Defines if localtime_r is available on your system */ +#undef HAVE_LOCALTIME_R + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mkstemp' function. */ +#undef HAVE_MKSTEMP + +/* Define to 1 if you have the `mkstemps' function. */ +#undef HAVE_MKSTEMPS + +/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the <openjpeg.h> header file. */ +#undef HAVE_OPENJPEG_H + +/* Define to 1 if you have the `popen' function. */ +#undef HAVE_POPEN + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Use splash for rendering. */ +#undef HAVE_SPLASH + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <tiffio.h> header file. */ +#undef HAVE_TIFFIO_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the <zlib.h> header file. */ +#undef HAVE_ZLIB_H + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Enable multithreading support. */ +#undef MULTITHREADED + +/* Generate OPI comments in PS output. */ +#undef OPI_SUPPORT + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Poppler data dir */ +#undef POPPLER_DATADIR + +/* Support for curl based doc builder is compiled in. */ +#undef POPPLER_HAS_CURL_SUPPORT + +/* Defines the poppler version */ +#undef POPPLER_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Enable word list support. */ +#undef TEXTOUT_WORD_LIST + +/* Defines if use cms */ +#undef USE_CMS + +/* Use fixed point arithmetic in the Splash backend */ +#undef USE_FIXEDPOINT + +/* Use single precision arithmetic in the Splash backend */ +#undef USE_FLOAT + +/* Defines if use lcms1 */ +#undef USE_LCMS1 + +/* Version number of package */ +#undef VERSION + +/* Use fontconfig font configuration backend */ +#undef WITH_FONTCONFIGURATION_FONTCONFIG + +/* Use win32 font configuration backend */ +#undef WITH_FONTCONFIGURATION_WIN32 + +/* OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag. */ +#undef WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + +/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif + + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#undef _LARGEFILE_SOURCE + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..6205f84 --- /dev/null +++ b/config.sub @@ -0,0 +1,1782 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-04-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i386-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..3b4ea2e --- /dev/null +++ b/configure @@ -0,0 +1,26805 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for poppler 0.20.4. +# +# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=poppler>. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: https://bugs.freedesktop.org/enter_bug.cgi?product=poppler +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='poppler' +PACKAGE_TARNAME='poppler' +PACKAGE_VERSION='0.20.4' +PACKAGE_STRING='poppler 0.20.4' +PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=poppler' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +POPPLER_VERSION +POPPLER_MICRO_VERSION +POPPLER_MINOR_VERSION +POPPLER_MAJOR_VERSION +PC_REQUIRES_PRIVATE +PC_REQUIRES +TESTDATADIR +USE_LCMS1_FALSE +USE_LCMS1_TRUE +USE_CMS_FALSE +USE_CMS_TRUE +LCMS_LIBS +LCMS_CFLAGS +BUILD_UTILS_FALSE +BUILD_UTILS_TRUE +BUILD_GTK_TEST_FALSE +BUILD_GTK_TEST_TRUE +GTK_TEST_LIBS +GTK_TEST_CFLAGS +BUILD_POPPLER_CPP_FALSE +BUILD_POPPLER_CPP_TRUE +LTLIBICONV +LIBICONV +BUILD_POPPLER_QT4_FALSE +BUILD_POPPLER_QT4_TRUE +MOCQT4 +POPPLER_QT4_CXXFLAGS +POPPLER_QT4_TEST_LIBS +POPPLER_QT4_TEST_CFLAGS +POPPLER_QT4_LIBS +POPPLER_QT4_CFLAGS +GTK_DOC_USE_REBASE_FALSE +GTK_DOC_USE_REBASE_TRUE +GTK_DOC_USE_LIBTOOL_FALSE +GTK_DOC_USE_LIBTOOL_TRUE +GTK_DOC_BUILD_PDF_FALSE +GTK_DOC_BUILD_PDF_TRUE +GTK_DOC_BUILD_HTML_FALSE +GTK_DOC_BUILD_HTML_TRUE +ENABLE_GTK_DOC_FALSE +ENABLE_GTK_DOC_TRUE +GTKDOC_DEPS_LIBS +GTKDOC_DEPS_CFLAGS +HTML_DIR +GTKDOC_MKPDF +GTKDOC_REBASE +GTKDOC_CHECK +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES +POPPLER_GLIB_DISABLE_DEPRECATED +GLIB_REQ +BUILD_POPPLER_GLIB_FALSE +BUILD_POPPLER_GLIB_TRUE +GLIB_MKENUMS +HAVE_INTROSPECTION_FALSE +HAVE_INTROSPECTION_TRUE +INTROSPECTION_MAKEFILE +INTROSPECTION_LIBS +INTROSPECTION_CFLAGS +INTROSPECTION_TYPELIBDIR +INTROSPECTION_GIRDIR +INTROSPECTION_GENERATE +INTROSPECTION_COMPILER +INTROSPECTION_SCANNER +POPPLER_GLIB_LIBS +POPPLER_GLIB_CFLAGS +GLIB_REQUIRED +CAIRO_REQ +CAIRO_FEATURE +PDFTOCAIRO_LIBS +PDFTOCAIRO_CFLAGS +BUILD_CAIRO_OUTPUT_FALSE +BUILD_CAIRO_OUTPUT_TRUE +CAIRO_LIBS +CAIRO_CFLAGS +CAIRO_VERSION +BUILD_SPLASH_OUTPUT_FALSE +BUILD_SPLASH_OUTPUT_TRUE +BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE +BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE +FONTCONFIG_LIBS +FONTCONFIG_CFLAGS +FREETYPE_CONFIG +FREETYPE_LIBS +FREETYPE_CFLAGS +BUILD_LIBPNG_FALSE +BUILD_LIBPNG_TRUE +LIBPNG_LIBS +LIBPNG_CFLAGS +BUILD_LIBJPEG_FALSE +BUILD_LIBJPEG_TRUE +LIBJPEG_LIBS +LIBJPEG_CFLAGS +BUILD_LIBCURL_FALSE +BUILD_LIBCURL_TRUE +LIBCURL_LIBS +LIBCURL_CFLAGS +BUILD_ZLIB_FALSE +BUILD_ZLIB_TRUE +ZLIB_LIBS +BUILD_LIBTIFF_FALSE +BUILD_LIBTIFF_TRUE +LIBTIFF_CFLAGSS +LIBTIFF_LIBS +LIBTIFF_CFLAGS +BUILD_LIBOPENJPEG_FALSE +BUILD_LIBOPENJPEG_TRUE +LIBOPENJPEG_LIBS +LIBOPENJPEG_CFLAGS +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS +XMKMF +POPPLER_DATADIR +ENABLE_XPDF_HEADERS_FALSE +ENABLE_XPDF_HEADERS_TRUE +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +acx_pthread_config +auto_import_flags +create_shared_lib +win32_libs +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_xpdf_headers +enable_single_precision +enable_fixedpoint +enable_relocatable +with_x +enable_libopenjpeg +enable_libtiff +enable_largefile +enable_zlib +enable_libcurl +enable_libjpeg +enable_libpng +with_font_configuration +enable_splash_output +enable_cairo_output +enable_poppler_glib +enable_introspection +with_html_dir +enable_gtk_doc +enable_gtk_doc_html +enable_gtk_doc_pdf +enable_poppler_qt4 +enable_poppler_cpp +with_libiconv_prefix +enable_gtk_test +enable_utils +enable_compile_warnings +enable_cms +with_testdatadir +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +XMKMF +LIBOPENJPEG_CFLAGS +LIBOPENJPEG_LIBS +LIBTIFF_CFLAGS +LIBTIFF_LIBS +LIBCURL_CFLAGS +LIBCURL_LIBS +LIBJPEG_CFLAGS +LIBPNG_CFLAGS +LIBPNG_LIBS +FREETYPE_CFLAGS +FREETYPE_LIBS +FONTCONFIG_CFLAGS +FONTCONFIG_LIBS +CAIRO_CFLAGS +CAIRO_LIBS +PDFTOCAIRO_CFLAGS +PDFTOCAIRO_LIBS +POPPLER_GLIB_CFLAGS +POPPLER_GLIB_LIBS +GTKDOC_DEPS_CFLAGS +GTKDOC_DEPS_LIBS +POPPLER_QT4_CFLAGS +POPPLER_QT4_LIBS +POPPLER_QT4_TEST_CFLAGS +POPPLER_QT4_TEST_LIBS +GTK_TEST_CFLAGS +GTK_TEST_LIBS +LCMS_CFLAGS +LCMS_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures poppler 0.20.4 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/poppler] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of poppler 0.20.4:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0') + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-xpdf-headers Install unsupported xpdf headers. + --enable-single-precision use single precision arithmetic (instead of double precision) in the Splash backend + --enable-fixedpoint use fixed point (instead of double precision) arithmetic in the Splash backend + --disable-relocatable Hardcode the poppler library location (on Windows). + --disable-libopenjpeg Don't build against libopenjpeg. + --disable-libtiff Don't build against libtiff. + --disable-largefile omit support for large files + --enable-zlib Build with zlib + --enable-libcurl Build with libcurl based HTTP support. + --disable-libjpeg Don't build against libjpeg. + --disable-libpng Do not build against libpng. + --disable-splash-output Don't build the Splash graphics backend. + --disable-cairo-output Don't build the cairo graphics backend. + --disable-poppler-glib Don't compile poppler glib wrapper. + --enable-introspection=[no/auto/yes] + Enable introspection for this build + --enable-gtk-doc use gtk-doc to build documentation [[default=no]] + --enable-gtk-doc-html build documentation in html format [[default=yes]] + --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] + --disable-poppler-qt4 Don't compile poppler Qt4 wrapper. + --disable-poppler-cpp Don't compile poppler cpp wrapper. + --disable-gtk-test Don't compile GTK+ test program. + --disable-utils Don't compile poppler command line utils. + --enable-compile-warnings=[no/yes/kde] + Turn on compiler warnings. + + --disable-cms Don't use color management system. + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-x use the X Window System + --with-font-configuration=fontconfig|win32 + Select font configuration backend + --with-html-dir=PATH path to installed docs + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-testdatadir=/path/to/testdatadir + Specify test data dir + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + XMKMF Path to xmkmf, Makefile generator for X Window System + LIBOPENJPEG_CFLAGS + C compiler flags for LIBOPENJPEG, overriding pkg-config + LIBOPENJPEG_LIBS + linker flags for LIBOPENJPEG, overriding pkg-config + LIBTIFF_CFLAGS + C compiler flags for LIBTIFF + LIBTIFF_LIBS + linker flags to link LIBTIFF (default is -ltiff) + LIBCURL_CFLAGS + C compiler flags for LIBCURL, overriding pkg-config + LIBCURL_LIBS + linker flags for LIBCURL, overriding pkg-config + LIBJPEG_CFLAGS + C compiler flags for LIBJPEG + LIBPNG_CFLAGS + C compiler flags for LIBPNG, overriding pkg-config + LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config + FREETYPE_CFLAGS + C compiler flags for FREETYPE, overriding pkg-config + FREETYPE_LIBS + linker flags for FREETYPE, overriding pkg-config + FONTCONFIG_CFLAGS + C compiler flags for FONTCONFIG, overriding pkg-config + FONTCONFIG_LIBS + linker flags for FONTCONFIG, overriding pkg-config + CAIRO_CFLAGS + C compiler flags for CAIRO, overriding pkg-config + CAIRO_LIBS linker flags for CAIRO, overriding pkg-config + PDFTOCAIRO_CFLAGS + C compiler flags for PDFTOCAIRO, overriding pkg-config + PDFTOCAIRO_LIBS + linker flags for PDFTOCAIRO, overriding pkg-config + POPPLER_GLIB_CFLAGS + C compiler flags for POPPLER_GLIB, overriding pkg-config + POPPLER_GLIB_LIBS + linker flags for POPPLER_GLIB, overriding pkg-config + GTKDOC_DEPS_CFLAGS + C compiler flags for GTKDOC_DEPS, overriding pkg-config + GTKDOC_DEPS_LIBS + linker flags for GTKDOC_DEPS, overriding pkg-config + POPPLER_QT4_CFLAGS + C compiler flags for POPPLER_QT4, overriding pkg-config + POPPLER_QT4_LIBS + linker flags for POPPLER_QT4, overriding pkg-config + POPPLER_QT4_TEST_CFLAGS + C compiler flags for POPPLER_QT4_TEST, overriding pkg-config + POPPLER_QT4_TEST_LIBS + linker flags for POPPLER_QT4_TEST, overriding pkg-config + GTK_TEST_CFLAGS + C compiler flags for GTK_TEST, overriding pkg-config + GTK_TEST_LIBS + linker flags for GTK_TEST, overriding pkg-config + LCMS_CFLAGS C compiler flags for LCMS, overriding pkg-config + LCMS_LIBS linker flags for LCMS, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=poppler>. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +poppler configure 0.20.4 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case <limits.h> declares $2. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------------------------------------------- ## +## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=poppler ## +## ------------------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES +# ----------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_cxx_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_decl + +# ac_fn_cxx_check_func LINENO FUNC VAR +# ------------------------------------ +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_cxx_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case <limits.h> declares $2. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_func + +# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_cxx_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------------------------------------------- ## +## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=poppler ## +## ------------------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by poppler $as_me 0.20.4, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='poppler' + VERSION='0.20.4' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +ac_config_headers="$ac_config_headers config.h" + +ac_config_headers="$ac_config_headers poppler/poppler-config.h" + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if ${ac_cv_search_strerror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_strerror+:} false; then : + break +fi +done +if ${ac_cv_search_strerror+:} false; then : + +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +$as_echo "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdbool.h> +#include <stdlib.h> +#include <wchar.h> +#include <stdio.h> + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + +#if test -z "$CXX" -a "$CC" = "gcc"; then +# CXX="gcc" +#fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test "x$GXX" = "xyes"; then + case "$host_os" in + cygwin* | mingw*) + ;; + *) + case "${CXXFLAGS}" in + *-std=*) + ;; + *) + CXXFLAGS="$CXXFLAGS -ansi" + ;; + esac + ;; + esac +fi + + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + + +cat >>confdefs.h <<_ACEOF +#define POPPLER_VERSION "0.20.4" +_ACEOF + + + +$as_echo "#define OPI_SUPPORT 1" >>confdefs.h + + +$as_echo "#define MULTITHREADED 1" >>confdefs.h + + +$as_echo "#define TEXTOUT_WORD_LIST 1" >>confdefs.h + + +win32_libs="" +create_shared_lib="" +auto_import_flags="" +case "$host_os" in + cygwin*) + create_shared_lib="-no-undefined" + ;; + mingw*) + os_win32=yes + win32_libs="-lgdi32" + create_shared_lib="-no-undefined" + auto_import_flags="-Wl,--enable-auto-import" + ;; +esac + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + acx_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 +$as_echo_n "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_acx_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$acx_pthread_config"; then + ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_acx_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" +fi +fi +acx_pthread_config=$ac_cv_prog_acx_pthread_config +if test -n "$acx_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 +$as_echo "$acx_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 +$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <pthread.h> +int +main () +{ +pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + acx_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <pthread.h> +int +main () +{ +int attr=$attr; return attr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + attr_name=$attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 +$as_echo "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $attr_name +_ACEOF + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 +$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 +$as_echo "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + +$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + : +else + acx_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Check whether --enable-xpdf-headers was given. +if test "${enable_xpdf_headers+set}" = set; then : + enableval=$enable_xpdf_headers; enable_xpdf_headers=$enableval +else + enable_xpdf_headers="no" +fi + + if test x$enable_xpdf_headers = xyes; then + ENABLE_XPDF_HEADERS_TRUE= + ENABLE_XPDF_HEADERS_FALSE='#' +else + ENABLE_XPDF_HEADERS_TRUE='#' + ENABLE_XPDF_HEADERS_FALSE= +fi + + +# Check whether --enable-single-precision was given. +if test "${enable_single_precision+set}" = set; then : + enableval=$enable_single_precision; +$as_echo "#define USE_FLOAT 1" >>confdefs.h + +fi + + +# Check whether --enable-fixedpoint was given. +if test "${enable_fixedpoint+set}" = set; then : + enableval=$enable_fixedpoint; +$as_echo "#define USE_FIXEDPOINT 1" >>confdefs.h + +fi + + +# Check whether --enable-relocatable was given. +if test "${enable_relocatable+set}" = set; then : + enableval=$enable_relocatable; enable_relocatable=$enableval +else + if test x$os_win32 = xyes; then + # default to yes on native Windows. + enable_relocatable="yes" + else + # default to no everywhere else. + enable_relocatable="no" + fi + + +fi + + +if test x$enable_relocatable = xyes; then + if test x$os_win32 = xyes; then + +$as_echo "#define ENABLE_RELOCATABLE 1" >>confdefs.h + + else + as_fn_error $? "Invalid setting for relocatable, only supported on windows" "$LINENO" 5 + + fi +fi + + + prefix_NONE= + exec_prefix_NONE= + test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix + test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix + eval ac_define_dir="\"$"{datarootdir}/poppler"\"" + eval ac_define_dir="\"$ac_define_dir\"" + POPPLER_DATADIR="$ac_define_dir" + + +cat >>confdefs.h <<_ACEOF +#define POPPLER_DATADIR "$ac_define_dir" +_ACEOF + + test "$prefix_NONE" && prefix=NONE + test "$exec_prefix_NONE" && exec_prefix=NONE + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +# Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <X11/Xlib.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <X11/Xlib.h> +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = xyes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = xyes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if ${ac_cv_lib_posix_remove+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = xyes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if ${ac_cv_lib_ipc_shmat+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if eval \${$as_ac_Header+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_ac_Header=yes" +else + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if ${ac_cv_search_opendir+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_opendir+:} false; then : + break +fi +done +if ${ac_cv_search_opendir+:} false; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if ${ac_cv_search_opendir+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_opendir+:} false; then : + break +fi +done +if ${ac_cv_search_opendir+:} false; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +for ac_header in stdint.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_fn_cxx_check_decl "$LINENO" "gettimeofday" "ac_cv_have_decl_gettimeofday" "#include <sys/time.h> +" +if test "x$ac_cv_have_decl_gettimeofday" = xyes; then : + ac_fn_cxx_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : + +$as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi + +fi + +ac_fn_cxx_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" +if test "x$ac_cv_func_localtime_r" = xyes; then : + +$as_echo "#define HAVE_LOCALTIME_R 1" >>confdefs.h + +fi + +ac_fn_cxx_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r" +if test "x$ac_cv_func_gmtime_r" = xyes; then : + +$as_echo "#define HAVE_GMTIME_R 1" >>confdefs.h + +fi + + +ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + +if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + +fi + +ac_fn_cxx_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes; then : + +fi + +if test x$ac_cv_func_nanosleep = xno +then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 +$as_echo_n "checking for nanosleep in -lrt... " >&6; } +if ${ac_cv_lib_rt_nanosleep+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char nanosleep (); +int +main () +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_rt_nanosleep=yes +else + ac_cv_lib_rt_nanosleep=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5 +$as_echo "$ac_cv_lib_rt_nanosleep" >&6; } +if test "x$ac_cv_lib_rt_nanosleep" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lrt" +fi + +fi + +if test x$ac_cv_func_nanosleep = xno && test x$ac_cv_lib_rt_nanosleep = xno +then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lposix4" >&5 +$as_echo_n "checking for nanosleep in -lposix4... " >&6; } +if ${ac_cv_lib_posix4_nanosleep+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix4 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char nanosleep (); +int +main () +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_posix4_nanosleep=yes +else + ac_cv_lib_posix4_nanosleep=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_nanosleep" >&5 +$as_echo "$ac_cv_lib_posix4_nanosleep" >&6; } +if test "x$ac_cv_lib_posix4_nanosleep" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix4" +fi + +fi + + +# Check whether --enable-libopenjpeg was given. +if test "${enable_libopenjpeg+set}" = set; then : + enableval=$enable_libopenjpeg; enable_libopenjpeg=$enableval +else + enable_libopenjpeg="try" +fi + +if test x$enable_libopenjpeg = xyes; then + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBOPENJPEG" >&5 +$as_echo_n "checking for LIBOPENJPEG... " >&6; } + +if test -n "$LIBOPENJPEG_CFLAGS"; then + pkg_cv_LIBOPENJPEG_CFLAGS="$LIBOPENJPEG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOPENJPEG_CFLAGS=`$PKG_CONFIG --cflags "libopenjpeg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBOPENJPEG_LIBS"; then + pkg_cv_LIBOPENJPEG_LIBS="$LIBOPENJPEG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOPENJPEG_LIBS=`$PKG_CONFIG --libs "libopenjpeg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libopenjpeg" 2>&1` + else + LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libopenjpeg" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBOPENJPEG_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5 +$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; } +if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopenjpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opj_cio_open (); +int +main () +{ +return opj_cio_open (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_openjpeg_opj_cio_open=yes +else + ac_cv_lib_openjpeg_opj_cio_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5 +$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; } +if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then : + LIBOPENJPEG_LIBS="-lopenjpeg" +else + as_fn_error $? "\"*** libopenjpeg library not found ***\"" "$LINENO" 5 +fi + + for ac_header in openjpeg.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default" +if test "x$ac_cv_header_openjpeg_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OPENJPEG_H 1 +_ACEOF + +else + as_fn_error $? "\"*** libopenjpeg headers not found ***\"" "$LINENO" 5 +fi + +done + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5 +$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; } +if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopenjpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opj_cio_open (); +int +main () +{ +return opj_cio_open (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_openjpeg_opj_cio_open=yes +else + ac_cv_lib_openjpeg_opj_cio_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5 +$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; } +if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then : + LIBOPENJPEG_LIBS="-lopenjpeg" +else + as_fn_error $? "\"*** libopenjpeg library not found ***\"" "$LINENO" 5 +fi + + for ac_header in openjpeg.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default" +if test "x$ac_cv_header_openjpeg_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OPENJPEG_H 1 +_ACEOF + +else + as_fn_error $? "\"*** libopenjpeg headers not found ***\"" "$LINENO" 5 +fi + +done + +else + LIBOPENJPEG_CFLAGS=$pkg_cv_LIBOPENJPEG_CFLAGS + LIBOPENJPEG_LIBS=$pkg_cv_LIBOPENJPEG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +elif test x$enable_libopenjpeg = xtry; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBOPENJPEG" >&5 +$as_echo_n "checking for LIBOPENJPEG... " >&6; } + +if test -n "$LIBOPENJPEG_CFLAGS"; then + pkg_cv_LIBOPENJPEG_CFLAGS="$LIBOPENJPEG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOPENJPEG_CFLAGS=`$PKG_CONFIG --cflags "libopenjpeg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBOPENJPEG_LIBS"; then + pkg_cv_LIBOPENJPEG_LIBS="$LIBOPENJPEG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjpeg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOPENJPEG_LIBS=`$PKG_CONFIG --libs "libopenjpeg" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libopenjpeg" 2>&1` + else + LIBOPENJPEG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libopenjpeg" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBOPENJPEG_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5 +$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; } +if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopenjpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opj_cio_open (); +int +main () +{ +return opj_cio_open (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_openjpeg_opj_cio_open=yes +else + ac_cv_lib_openjpeg_opj_cio_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5 +$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; } +if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then : + enable_libopenjpeg="yes" + LIBOPENJPEG_LIBS="-lopenjpeg" +else + enable_libopenjpeg="no" +fi + + for ac_header in openjpeg.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default" +if test "x$ac_cv_header_openjpeg_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OPENJPEG_H 1 +_ACEOF + +else + enable_libopenjpeg="no" +fi + +done + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_cio_open in -lopenjpeg" >&5 +$as_echo_n "checking for opj_cio_open in -lopenjpeg... " >&6; } +if ${ac_cv_lib_openjpeg_opj_cio_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopenjpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opj_cio_open (); +int +main () +{ +return opj_cio_open (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_openjpeg_opj_cio_open=yes +else + ac_cv_lib_openjpeg_opj_cio_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_cio_open" >&5 +$as_echo "$ac_cv_lib_openjpeg_opj_cio_open" >&6; } +if test "x$ac_cv_lib_openjpeg_opj_cio_open" = xyes; then : + enable_libopenjpeg="yes" + LIBOPENJPEG_LIBS="-lopenjpeg" +else + enable_libopenjpeg="no" +fi + + for ac_header in openjpeg.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default" +if test "x$ac_cv_header_openjpeg_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OPENJPEG_H 1 +_ACEOF + +else + enable_libopenjpeg="no" +fi + +done + +else + LIBOPENJPEG_CFLAGS=$pkg_cv_LIBOPENJPEG_CFLAGS + LIBOPENJPEG_LIBS=$pkg_cv_LIBOPENJPEG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_libopenjpeg="yes" +fi +fi + +if test x$enable_libopenjpeg = xyes; then + + + $as_echo "#define ENABLE_LIBOPENJPEG 1" >>confdefs.h + + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg >= 1.5\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libopenjpeg >= 1.5") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + +$as_echo "#define WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG 1" >>confdefs.h + +fi +fi + + if test x$enable_libopenjpeg = xyes; then + BUILD_LIBOPENJPEG_TRUE= + BUILD_LIBOPENJPEG_FALSE='#' +else + BUILD_LIBOPENJPEG_TRUE='#' + BUILD_LIBOPENJPEG_FALSE= +fi + + + +# Check whether --enable-libtiff was given. +if test "${enable_libtiff+set}" = set; then : + enableval=$enable_libtiff; enable_libtiff=$enableval +else + enable_libtiff="try" +fi + + + + +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_CXXFLAGS="$CXXFLAGS" +ac_save_LIBS="$LDFLAGS" +CPPFLAGS="$CPPFLAGS $LIBTIFF_CFLAGS" +CXXFLAGS="$CXXFLAGS $LIBTIFF_CFLAGS" +LIBS="$LIBS $LIBTIFF_LIBS" +if test x$enable_libtiff = xyes; then + if test x"$LIBTIFF_LIBS" != ; then + ac_fn_cxx_check_func "$LINENO" "TIFFOpen" "ac_cv_func_TIFFOpen" +if test "x$ac_cv_func_TIFFOpen" = xyes; then : + +else + as_fn_error $? "\"*** libtiff library not found ***\"" "$LINENO" 5 +fi + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 +$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFOpen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFOpen (); +int +main () +{ +return TIFFOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFOpen=yes +else + ac_cv_lib_tiff_TIFFOpen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; } +if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBTIFF 1 +_ACEOF + + LIBS="-ltiff $LIBS" + +else + as_fn_error $? "\"*** libtiff library not found ***\"" "$LINENO" 5 +fi + + fi + for ac_header in tiffio.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" +if test "x$ac_cv_header_tiffio_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TIFFIO_H 1 +_ACEOF + +else + as_fn_error $? "\"*** libtiff headers not found ***\"" "$LINENO" 5 +fi + +done + +elif test x$enable_libtiff = xtry; then + if test x"$LIBTIFF_LIBS" != x; then + ac_fn_cxx_check_func "$LINENO" "TIFFOpen" "ac_cv_func_TIFFOpen" +if test "x$ac_cv_func_TIFFOpen" = xyes; then : + enable_libtiff="yes" +else + enable_libtiff="no" +fi + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 +$as_echo_n "checking for TIFFOpen in -ltiff... " >&6; } +if ${ac_cv_lib_tiff_TIFFOpen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFOpen (); +int +main () +{ +return TIFFOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFOpen=yes +else + ac_cv_lib_tiff_TIFFOpen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; } +if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes; then : + enable_libtiff="yes" +else + enable_libtiff="no" +fi + + fi + for ac_header in tiffio.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" +if test "x$ac_cv_header_tiffio_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TIFFIO_H 1 +_ACEOF + +else + enable_libtiff="no" +fi + +done + +fi +CPPFLAGS="$ac_save_CPPFLAGS" +CXXFLAGS="$ac_save_CXXFLAGS" +LIBS="$ac_save_LIBS" + +if test x$enable_libtiff = xyes; then + if test x"$LIBTIFF_LIBS" = x; then + LIBTIFF_LIBS="-ltiff" + fi + + + $as_echo "#define ENABLE_LIBTIFF 1" >>confdefs.h + +fi + + if test x$enable_libtiff = xyes; then + BUILD_LIBTIFF_TRUE= + BUILD_LIBTIFF_FALSE='#' +else + BUILD_LIBTIFF_TRUE='#' + BUILD_LIBTIFF_FALSE= +fi + + +if test x$enable_libtiff = xyes; then + +$as_echo "#define ENABLE_LIBTIFF 1" >>confdefs.h + +fi + +for ac_func in popen mkstemp mkstemps +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 +$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } +if ${ac_cv_sys_largefile_source+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> /* for off_t */ + #include <stdio.h> +int +main () +{ +int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_largefile_source=no; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGEFILE_SOURCE 1 +#include <sys/types.h> /* for off_t */ + #include <stdio.h> +int +main () +{ +int (*fp) (FILE *, off_t, int) = fseeko; + return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_largefile_source=1; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_cv_sys_largefile_source=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 +$as_echo "$ac_cv_sys_largefile_source" >&6; } +case $ac_cv_sys_largefile_source in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source +_ACEOF +;; +esac +rm -rf conftest* + +# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug +# in glibc 2.1.3, but that breaks too many other things. +# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. +if test $ac_cv_sys_largefile_source != unknown; then + +$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h + +fi + +for ac_func in fseek64 +do : + ac_fn_c_check_func "$LINENO" "fseek64" "ac_cv_func_fseek64" +if test "x$ac_cv_func_fseek64" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FSEEK64 1 +_ACEOF + xpdf_cv_func_fseek64=yes +else + xpdf_cv_func_fseek64=no +fi +done + +for ac_func in ftell64 +do : + ac_fn_c_check_func "$LINENO" "ftell64" "ac_cv_func_ftell64" +if test "x$ac_cv_func_ftell64" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FTELL64 1 +_ACEOF + xpdf_cv_func_ftell64=yes +else + xpdf_cv_func_ftell64=no +fi +done + +if test "$xpdf_cv_func_fseek64" = yes -a "$xpdf_cv_func_ftell64" = yes; then + $as_echo "#define HAVE_FSEEK64 1" >>confdefs.h + +fi + +# Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; +else + enable_zlib="no" +fi + +if test x$enable_zlib = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +$as_echo_n "checking for inflate in -lz... " >&6; } +if ${ac_cv_lib_z_inflate+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inflate (); +int +main () +{ +return inflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_inflate=yes +else + ac_cv_lib_z_inflate=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +$as_echo "$ac_cv_lib_z_inflate" >&6; } +if test "x$ac_cv_lib_z_inflate" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZ 1 +_ACEOF + + LIBS="-lz $LIBS" + +else + as_fn_error $? "\"*** zlib library not found ***\"" "$LINENO" 5 +fi + + for ac_header in zlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ZLIB_H 1 +_ACEOF + +else + as_fn_error $? "\"*** zlib headers not found ***\"" "$LINENO" 5 +fi + +done + +elif test x$enable_zlib = xtry; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +$as_echo_n "checking for inflate in -lz... " >&6; } +if ${ac_cv_lib_z_inflate+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inflate (); +int +main () +{ +return inflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_inflate=yes +else + ac_cv_lib_z_inflate=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +$as_echo "$ac_cv_lib_z_inflate" >&6; } +if test "x$ac_cv_lib_z_inflate" = xyes; then : + enable_zlib="yes" +else + enable_zlib="no" +fi + + for ac_header in zlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ZLIB_H 1 +_ACEOF + +else + enable_zlib="no" +fi + +done + +fi + +if test x$enable_zlib = xyes; then + ZLIB_LIBS="-lz" + + $as_echo "#define ENABLE_ZLIB 1" >>confdefs.h + +fi + + if test x$enable_zlib = xyes; then + BUILD_ZLIB_TRUE= + BUILD_ZLIB_FALSE='#' +else + BUILD_ZLIB_TRUE='#' + BUILD_ZLIB_FALSE= +fi + + + +# Check whether --enable-libcurl was given. +if test "${enable_libcurl+set}" = set; then : + enableval=$enable_libcurl; enable_libcurl=$enableval +else + enable_libcurl="no" +fi + + +if test x$enable_libcurl = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCURL" >&5 +$as_echo_n "checking for LIBCURL... " >&6; } + +if test -n "$LIBCURL_CFLAGS"; then + pkg_cv_LIBCURL_CFLAGS="$LIBCURL_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libcurl") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBCURL_CFLAGS=`$PKG_CONFIG --cflags "libcurl" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBCURL_LIBS"; then + pkg_cv_LIBCURL_LIBS="$LIBCURL_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libcurl") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBCURL_LIBS=`$PKG_CONFIG --libs "libcurl" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBCURL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcurl" 2>&1` + else + LIBCURL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcurl" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBCURL_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libcurl) were not met: + +$LIBCURL_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables LIBCURL_CFLAGS +and LIBCURL_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LIBCURL_CFLAGS +and LIBCURL_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + LIBCURL_CFLAGS=$pkg_cv_LIBCURL_CFLAGS + LIBCURL_LIBS=$pkg_cv_LIBCURL_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + +$as_echo "#define ENABLE_LIBCURL 1" >>confdefs.h + + +$as_echo "#define POPPLER_HAS_CURL_SUPPORT 1" >>confdefs.h + +fi + + if test x$enable_libcurl = xyes; then + BUILD_LIBCURL_TRUE= + BUILD_LIBCURL_FALSE='#' +else + BUILD_LIBCURL_TRUE='#' + BUILD_LIBCURL_FALSE= +fi + + +# Check whether --enable-libjpeg was given. +if test "${enable_libjpeg+set}" = set; then : + enableval=$enable_libjpeg; enable_libjpeg=$enableval +else + enable_libjpeg="try" +fi + + +if test x$enable_libjpeg != xno; then + + ac_save_USER_INCLUDES="$USER_INCLUDES" + ac_save_USER_LDFLAGS="$USER_LDFLAGS" + USER_INCLUDES="$USER_INCLUDES $LIBJPEG_CFLAGS" + USER_LDFLAGS="$USER_LDFLAGS $LIBJPEG_CFLAGS" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libjpeg6b" >&5 +$as_echo_n "checking for libjpeg6b... " >&6; } +if ${ac_cv_lib_jpeg_6b+:} false; then : + $as_echo_n "(cached) " >&6 +else + +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg6b -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif + +int +main () +{ +jpeg_CreateDecompress(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "ac_cv_lib_jpeg_6b=-ljpeg6b" +else + eval "ac_cv_lib_jpeg_6b=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" + +fi + + +if eval "test ! \"`echo $ac_cv_lib_jpeg_6b`\" = no"; then + enable_libjpeg=yes + LIBJPEG_LIBS="$ac_cv_lib_jpeg_6b" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_6b" >&5 +$as_echo "$ac_cv_lib_jpeg_6b" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libjpeg" >&5 +$as_echo_n "checking for libjpeg... " >&6; } +if ${ac_cv_lib_jpeg_normal+:} false; then : + $as_echo_n "(cached) " >&6 +else + +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif + +int +main () +{ +jpeg_CreateDecompress(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "ac_cv_lib_jpeg_normal=-ljpeg" +else + eval "ac_cv_lib_jpeg_normal=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" + +fi + + +if eval "test ! \"`echo $ac_cv_lib_jpeg_normal`\" = no"; then + enable_libjpeg=yes + LIBJPEG_LIBS="$ac_cv_lib_jpeg_normal" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_normal" >&5 +$as_echo "$ac_cv_lib_jpeg_normal" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + LIBJPEG_LIBS= + + +fi + + +fi + + +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_CFLAGS="$CFLAGS" +CPPFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = xyes; then : + jpeg_incdir=yes +else + jpeg_incdir=NO +fi + + +CPPFLAGS="$ac_save_CPPFLAGS" +CFLAGS="$ac_save_CFLAGS" +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +if test -n "$jpeg_incdir" && test -n "$LIBJPEG_LIBS" ; then + +cat >>confdefs.h <<_ACEOF +#define ENABLE_LIBJPEG 1 +_ACEOF + +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG_LIBS" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +" >&5 +$as_echo "$as_me: WARNING: +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +" >&2;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libjpeg not found. disable JPEG support." >&5 +$as_echo "$as_me: WARNING: libjpeg not found. disable JPEG support." >&2;} + fi + jpeg_incdir= + enable_libjpeg=no + LIBJPEG_LIBS= +fi + + + + + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_CFLAGS="$CFLAGS" + CPPFLAGS="$CPPFLAGS $LIBJPEG_CFLAGS" + CFLAGS="$CFLAGS $LIBJPEG_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking libjpeg.h works correctly" >&5 +$as_echo_n "checking libjpeg.h works correctly... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#ifdef _WIN32 +#include <windows.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <jpeglib.h> + +int +main () +{ +{return 0;} + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking libjpeg.h problem can be fixed by XMD_H macro" >&5 +$as_echo_n "checking libjpeg.h problem can be fixed by XMD_H macro... " >&6; } + CPPFLAGS="$CPPFLAGS -DXMD_H" + CFLAGS="$CFLAGS -DXMD_H" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +#ifdef _WIN32 +#include <windows.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <jpeglib.h> + +int +main () +{ +{return 0;} + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok, -DXMD_H is added to LIBJPEG_CFLAGS" >&5 +$as_echo "ok, -DXMD_H is added to LIBJPEG_CFLAGS" >&6; } + LIBJPEG_CFLAGS="$LIBJPEG_CFLAGS -DXMD_H" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disable libjpeg" >&5 +$as_echo "no, disable libjpeg" >&6; } + enable_libjpeg="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$ac_save_CPPFLAGS" + CFLAGS="$ac_save_CFLAGS" + + + USER_INCLUDES="$ac_save_USER_INCLUDES" + USER_LDFLAGS="$ac_save_USER_LDFLAGS" +fi + + if test x$enable_libjpeg = xyes; then + BUILD_LIBJPEG_TRUE= + BUILD_LIBJPEG_FALSE='#' +else + BUILD_LIBJPEG_TRUE='#' + BUILD_LIBJPEG_FALSE= +fi + + + +# Check whether --enable-libpng was given. +if test "${enable_libpng+set}" = set; then : + enableval=$enable_libpng; enable_libpng=$enableval +else + enable_libpng="try" +fi + + +if test x$enable_libpng != xno; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5 +$as_echo_n "checking for LIBPNG... " >&6; } + +if test -n "$LIBPNG_CFLAGS"; then + pkg_cv_LIBPNG_CFLAGS="$LIBPNG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libpng") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBPNG_CFLAGS=`$PKG_CONFIG --cflags "libpng" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBPNG_LIBS"; then + pkg_cv_LIBPNG_LIBS="$LIBPNG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libpng") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBPNG_LIBS=`$PKG_CONFIG --libs "libpng" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng" 2>&1` + else + LIBPNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBPNG_PKG_ERRORS" >&5 + + enable_libpng="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_libpng="no" +else + LIBPNG_CFLAGS=$pkg_cv_LIBPNG_CFLAGS + LIBPNG_LIBS=$pkg_cv_LIBPNG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_libpng="yes" +fi +fi + +if test x$enable_libpng = xyes; then + +$as_echo "#define ENABLE_LIBPNG 1" >>confdefs.h + +fi + + if test x$enable_libpng = xyes; then + BUILD_LIBPNG_TRUE= + BUILD_LIBPNG_FALSE='#' +else + BUILD_LIBPNG_TRUE='#' + BUILD_LIBPNG_FALSE= +fi + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5 +$as_echo_n "checking for FREETYPE... " >&6; } + +if test -n "$FREETYPE_CFLAGS"; then + pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FREETYPE_LIBS"; then + pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` + else + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FREETYPE_PKG_ERRORS" >&5 + + freetype_pkgconfig=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + freetype_pkgconfig=no +else + FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS + FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + freetype_pkgconfig=yes +fi + +if test "x$freetype_pkgconfig" = "xyes"; then + + +$as_echo "#define HAVE_FREETYPE_H 1" >>confdefs.h + + +else + + FREETYPE_LIBS= + FREETYPE_CFLAGS= + + # Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FREETYPE_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no" + ;; +esac +fi +FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG +if test -n "$FREETYPE_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 +$as_echo "$FREETYPE_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$FREETYPE_CONFIG" != "xno" ; then + + FREETYPE_CFLAGS=`$FREETYPE_CONFIG --cflags` + FREETYPE_LIBS=`$FREETYPE_CONFIG --libs` + +$as_echo "#define HAVE_FREETYPE_H 1" >>confdefs.h + + + fi + +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which font configuration to use" >&5 +$as_echo_n "checking which font configuration to use... " >&6; } + +# Check whether --with-font_configuration was given. +if test "${with_font_configuration+set}" = set; then : + withval=$with_font_configuration; +else + if test x$os_win32 = xyes; then + # default to win32 on native Windows. + with_font_configuration=win32 + else + # default to fontconig everywhere else. + with_font_configuration=fontconfig + fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_font_configuration" >&5 +$as_echo "$with_font_configuration" >&6; } + +case $with_font_configuration in + win32) + +$as_echo "#define WITH_FONTCONFIGURATION_WIN32 1" >>confdefs.h + + # Set the minimum required Internet Explorer version to 5.0 + CPPFLAGS="$CPPFLAGS -D_WIN32_IE=0x0500" + ;; + fontconfig) + +$as_echo "#define WITH_FONTCONFIGURATION_FONTCONFIG 1" >>confdefs.h + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5 +$as_echo_n "checking for FONTCONFIG... " >&6; } + +if test -n "$FONTCONFIG_CFLAGS"; then + pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FONTCONFIG_LIBS"; then + pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig >= 2.0.0" 2>&1` + else + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig >= 2.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FONTCONFIG_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (fontconfig >= 2.0.0) were not met: + +$FONTCONFIG_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables FONTCONFIG_CFLAGS +and FONTCONFIG_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables FONTCONFIG_CFLAGS +and FONTCONFIG_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS + FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + ;; + *) + as_fn_error $? "Invalid font configuration setting: $with_font_configuration" "$LINENO" 5 + ;; +esac + + if test x$with_font_configuration = xwin32; then + BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE= + BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE='#' +else + BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE='#' + BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE= +fi + + +# Check whether --enable-splash-output was given. +if test "${enable_splash_output+set}" = set; then : + enableval=$enable_splash_output; +else + enable_splash_output="yes" +fi + + if test x$enable_splash_output = xyes; then + BUILD_SPLASH_OUTPUT_TRUE= + BUILD_SPLASH_OUTPUT_FALSE='#' +else + BUILD_SPLASH_OUTPUT_TRUE='#' + BUILD_SPLASH_OUTPUT_FALSE= +fi + + +if test x$enable_splash_output = xyes; then + $as_echo "#define HAVE_SPLASH 1" >>confdefs.h + +fi + +CAIRO_VERSION="1.10.0" + +# Check whether --enable-cairo-output was given. +if test "${enable_cairo_output+set}" = set; then : + enableval=$enable_cairo_output; enable_cairo_output=$enableval +else + enable_cairo_output="try" +fi + +use_cairo="" +if test x$enable_cairo_output = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 +$as_echo_n "checking for CAIRO... " >&6; } + +if test -n "$CAIRO_CFLAGS"; then + pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$CAIRO_LIBS"; then + pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1` + else + CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$CAIRO_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION) were not met: + +$CAIRO_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables CAIRO_CFLAGS +and CAIRO_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables CAIRO_CFLAGS +and CAIRO_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS + CAIRO_LIBS=$pkg_cv_CAIRO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +elif test x$enable_cairo_output = xtry; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 +$as_echo_n "checking for CAIRO... " >&6; } + +if test -n "$CAIRO_CFLAGS"; then + pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$CAIRO_LIBS"; then + pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= \$CAIRO_VERSION cairo-ft >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1` + else + CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$CAIRO_PKG_ERRORS" >&5 + + enable_cairo_output="no" + use_cairo="no (requires cairo >= $CAIRO_VERSION)" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_cairo_output="no" + use_cairo="no (requires cairo >= $CAIRO_VERSION)" +else + CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS + CAIRO_LIBS=$pkg_cv_CAIRO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_cairo_output="yes" +fi +fi +if test x$use_cairo = x; then + use_cairo=$enable_cairo_output +fi + + + + + if test x$enable_cairo_output = xyes; then + BUILD_CAIRO_OUTPUT_TRUE= + BUILD_CAIRO_OUTPUT_FALSE='#' +else + BUILD_CAIRO_OUTPUT_TRUE='#' + BUILD_CAIRO_OUTPUT_FALSE= +fi + + +if test x$enable_cairo_output = xyes; then + PDFTOCAIRO_DEPS="cairo cairo-ft" + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-pdf\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo-pdf") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-pdf" +fi + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-ps\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo-ps") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-ps" +fi + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-svg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "cairo-svg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-svg" +fi + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDFTOCAIRO" >&5 +$as_echo_n "checking for PDFTOCAIRO... " >&6; } + +if test -n "$PDFTOCAIRO_CFLAGS"; then + pkg_cv_PDFTOCAIRO_CFLAGS="$PDFTOCAIRO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$PDFTOCAIRO_DEPS\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$PDFTOCAIRO_DEPS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PDFTOCAIRO_CFLAGS=`$PKG_CONFIG --cflags "$PDFTOCAIRO_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$PDFTOCAIRO_LIBS"; then + pkg_cv_PDFTOCAIRO_LIBS="$PDFTOCAIRO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$PDFTOCAIRO_DEPS\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$PDFTOCAIRO_DEPS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PDFTOCAIRO_LIBS=`$PKG_CONFIG --libs "$PDFTOCAIRO_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PDFTOCAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$PDFTOCAIRO_DEPS" 2>&1` + else + PDFTOCAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$PDFTOCAIRO_DEPS" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$PDFTOCAIRO_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements ($PDFTOCAIRO_DEPS) were not met: + +$PDFTOCAIRO_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables PDFTOCAIRO_CFLAGS +and PDFTOCAIRO_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables PDFTOCAIRO_CFLAGS +and PDFTOCAIRO_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + PDFTOCAIRO_CFLAGS=$pkg_cv_PDFTOCAIRO_CFLAGS + PDFTOCAIRO_LIBS=$pkg_cv_PDFTOCAIRO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + + + $as_echo "#define HAVE_CAIRO 1" >>confdefs.h + + CAIRO_FEATURE="#define POPPLER_HAS_CAIRO 1" + CAIRO_REQ="cairo" + for ac_header in fcntl.h sys/mman.h sys/stat.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +else + CAIRO_FEATURE="#undef POPPLER_HAS_CAIRO" + CAIRO_REQ="" +fi + + + +use_glib="" +found_introspection=no +if test x$enable_cairo_output = xyes; then + POPPLER_GLIB_DISABLE_DEPRECATED="" + POPPLER_GLIB_DISABLE_SINGLE_INCLUDES="" + + GLIB_REQUIRED=2.18 + + # Check whether --enable-poppler-glib was given. +if test "${enable_poppler_glib+set}" = set; then : + enableval=$enable_poppler_glib; enable_poppler_glib=$enableval +else + enable_poppler_glib="try" +fi + + if test x$enable_poppler_glib = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_GLIB" >&5 +$as_echo_n "checking for POPPLER_GLIB... " >&6; } + +if test -n "$POPPLER_GLIB_CFLAGS"; then + pkg_cv_POPPLER_GLIB_CFLAGS="$POPPLER_GLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_GLIB_LIBS"; then + pkg_cv_POPPLER_GLIB_LIBS="$POPPLER_GLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1` + else + POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_GLIB_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION) were not met: + +$POPPLER_GLIB_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables POPPLER_GLIB_CFLAGS +and POPPLER_GLIB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables POPPLER_GLIB_CFLAGS +and POPPLER_GLIB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + POPPLER_GLIB_CFLAGS=$pkg_cv_POPPLER_GLIB_CFLAGS + POPPLER_GLIB_LIBS=$pkg_cv_POPPLER_GLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + elif test x$enable_poppler_glib = xtry; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_GLIB" >&5 +$as_echo_n "checking for POPPLER_GLIB... " >&6; } + +if test -n "$POPPLER_GLIB_CFLAGS"; then + pkg_cv_POPPLER_GLIB_CFLAGS="$POPPLER_GLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_GLIB_LIBS"; then + pkg_cv_POPPLER_GLIB_LIBS="$POPPLER_GLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED gobject-2.0 >= \$GLIB_REQUIRED cairo >= \$CAIRO_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1` + else + POPPLER_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_GLIB_PKG_ERRORS" >&5 + + enable_poppler_glib="no" + use_glib="no (requires glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_poppler_glib="no" + use_glib="no (requires glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)" +else + POPPLER_GLIB_CFLAGS=$pkg_cv_POPPLER_GLIB_CFLAGS + POPPLER_GLIB_LIBS=$pkg_cv_POPPLER_GLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_poppler_glib="yes" +fi + fi + if test x$enable_poppler_glib = xyes; then + # Check for introspection + + + + # Check whether --enable-introspection was given. +if test "${enable_introspection+set}" = set; then : + enableval=$enable_introspection; +else + enable_introspection=auto +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5 +$as_echo_n "checking for gobject-introspection... " >&6; } + + case $enable_introspection in #( + no) : + found_introspection="no (disabled, use --enable-introspection to enable)" + ;; #( + yes) : + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + : +else + as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5 +fi + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.7\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.7") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + found_introspection=yes +else + as_fn_error $? "You need to have gobject-introspection >= 0.6.7 installed to build poppler" "$LINENO" 5 +fi + ;; #( + auto) : + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.7\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.7") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + found_introspection=yes +else + found_introspection=no +fi + ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5 +$as_echo "$found_introspection" >&6; } + + INTROSPECTION_SCANNER= + INTROSPECTION_COMPILER= + INTROSPECTION_GENERATE= + INTROSPECTION_GIRDIR= + INTROSPECTION_TYPELIBDIR= + if test "x$found_introspection" = "xyes"; then + INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` + INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` + INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` + INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` + INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" + INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` + INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` + INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection + fi + + + + + + + + + + if test "x$found_introspection" = "xyes"; then + HAVE_INTROSPECTION_TRUE= + HAVE_INTROSPECTION_FALSE='#' +else + HAVE_INTROSPECTION_TRUE='#' + HAVE_INTROSPECTION_FALSE= +fi + + + + + # Extract the first word of "glib-mkenums", so it can be a program name with args. +set dummy glib-mkenums; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GLIB_MKENUMS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_MKENUMS in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_MKENUMS="$GLIB_MKENUMS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GLIB_MKENUMS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GLIB_MKENUMS=$ac_cv_path_GLIB_MKENUMS +if test -n "$GLIB_MKENUMS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS" >&5 +$as_echo "$GLIB_MKENUMS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + POPPLER_GLIB_DISABLE_DEPRECATED="$POPPLER_GLIB_DISABLE_DEPRECATED -DG_DISABLE_DEPRECATED" + POPPLER_GLIB_DISABLE_SINGLE_INCLUDES="$POPPLER_GLIB_DISABLE_SINGLE_INCLUDES -DG_DISABLE_SINGLE_INCLUDES" + fi +else + if test x$enable_poppler_glib = xyes; then + as_fn_error $? "\"Cairo output is required to build glib frontend\"" "$LINENO" 5 + fi + use_glib="no (requires cairo output)" + enable_poppler_glib="no" +fi +if test x"$use_glib" = x; then + use_glib="$enable_poppler_glib" +fi + if test x$enable_poppler_glib = xyes; then + BUILD_POPPLER_GLIB_TRUE= + BUILD_POPPLER_GLIB_FALSE='#' +else + BUILD_POPPLER_GLIB_TRUE='#' + BUILD_POPPLER_GLIB_FALSE= +fi + + if test "x$found_introspection" = "xyes"; then + HAVE_INTROSPECTION_TRUE= + HAVE_INTROSPECTION_FALSE='#' +else + HAVE_INTROSPECTION_TRUE='#' + HAVE_INTROSPECTION_FALSE= +fi + + + + + + + + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_CHECK in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK +if test -n "$GTKDOC_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 +$as_echo "$GTKDOC_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + for ac_prog in gtkdoc-rebase +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_REBASE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_REBASE in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE +if test -n "$GTKDOC_REBASE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 +$as_echo "$GTKDOC_REBASE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$GTKDOC_REBASE" && break +done +test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" + + # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. +set dummy gtkdoc-mkpdf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_MKPDF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF +if test -n "$GTKDOC_MKPDF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 +$as_echo "$GTKDOC_MKPDF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Check whether --with-html-dir was given. +if test "${with_html_dir+set}" = set; then : + withval=$with_html_dir; +else + with_html_dir='${datadir}/gtk-doc/html' +fi + + HTML_DIR="$with_html_dir" + + + # Check whether --enable-gtk-doc was given. +if test "${enable_gtk_doc+set}" = set; then : + enableval=$enable_gtk_doc; +else + enable_gtk_doc=no +fi + + + if test x$enable_gtk_doc = xyes; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.14\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.14") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + : +else + as_fn_error $? "You need to have gtk-doc >= 1.14 installed to build $PACKAGE_NAME" "$LINENO" 5 +fi + if test "x$PACKAGE_NAME" != "xglib"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 +$as_echo_n "checking for GTKDOC_DEPS... " >&6; } + +if test -n "$GTKDOC_DEPS_CFLAGS"; then + pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTKDOC_DEPS_LIBS"; then + pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + else + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0) were not met: + +$GTKDOC_DEPS_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS +and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS +and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS + GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 +$as_echo_n "checking whether to build gtk-doc documentation... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 +$as_echo "$enable_gtk_doc" >&6; } + + # Check whether --enable-gtk-doc-html was given. +if test "${enable_gtk_doc_html+set}" = set; then : + enableval=$enable_gtk_doc_html; +else + enable_gtk_doc_html=yes +fi + + # Check whether --enable-gtk-doc-pdf was given. +if test "${enable_gtk_doc_pdf+set}" = set; then : + enableval=$enable_gtk_doc_pdf; +else + enable_gtk_doc_pdf=no +fi + + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + + if test x$enable_gtk_doc = xyes; then + ENABLE_GTK_DOC_TRUE= + ENABLE_GTK_DOC_FALSE='#' +else + ENABLE_GTK_DOC_TRUE='#' + ENABLE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc_html = xyes; then + GTK_DOC_BUILD_HTML_TRUE= + GTK_DOC_BUILD_HTML_FALSE='#' +else + GTK_DOC_BUILD_HTML_TRUE='#' + GTK_DOC_BUILD_HTML_FALSE= +fi + + if test x$enable_gtk_doc_pdf = xyes; then + GTK_DOC_BUILD_PDF_TRUE= + GTK_DOC_BUILD_PDF_FALSE='#' +else + GTK_DOC_BUILD_PDF_TRUE='#' + GTK_DOC_BUILD_PDF_FALSE= +fi + + if test -n "$LIBTOOL"; then + GTK_DOC_USE_LIBTOOL_TRUE= + GTK_DOC_USE_LIBTOOL_FALSE='#' +else + GTK_DOC_USE_LIBTOOL_TRUE='#' + GTK_DOC_USE_LIBTOOL_FALSE= +fi + + if test -n "$GTKDOC_REBASE"; then + GTK_DOC_USE_REBASE_TRUE= + GTK_DOC_USE_REBASE_FALSE='#' +else + GTK_DOC_USE_REBASE_TRUE='#' + GTK_DOC_USE_REBASE_FALSE= +fi + + + + +# Check whether --enable-poppler-qt4 was given. +if test "${enable_poppler_qt4+set}" = set; then : + enableval=$enable_poppler_qt4; enable_poppler_qt4=$enableval +else + enable_poppler_qt4="try" +fi + +if test x$enable_poppler_qt4 = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4" >&5 +$as_echo_n "checking for POPPLER_QT4... " >&6; } + +if test -n "$POPPLER_QT4_CFLAGS"; then + pkg_cv_POPPLER_QT4_CFLAGS="$POPPLER_QT4_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_CFLAGS=`$PKG_CONFIG --cflags "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_QT4_LIBS"; then + pkg_cv_POPPLER_QT4_LIBS="$POPPLER_QT4_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_LIBS=`$PKG_CONFIG --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1` + else + POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_QT4_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0) were not met: + +$POPPLER_QT4_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables POPPLER_QT4_CFLAGS +and POPPLER_QT4_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables POPPLER_QT4_CFLAGS +and POPPLER_QT4_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + POPPLER_QT4_CFLAGS=$pkg_cv_POPPLER_QT4_CFLAGS + POPPLER_QT4_LIBS=$pkg_cv_POPPLER_QT4_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4_TEST" >&5 +$as_echo_n "checking for POPPLER_QT4_TEST... " >&6; } + +if test -n "$POPPLER_QT4_TEST_CFLAGS"; then + pkg_cv_POPPLER_QT4_TEST_CFLAGS="$POPPLER_QT4_TEST_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_TEST_CFLAGS=`$PKG_CONFIG --cflags "QtTest >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_QT4_TEST_LIBS"; then + pkg_cv_POPPLER_QT4_TEST_LIBS="$POPPLER_QT4_TEST_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_TEST_LIBS=`$PKG_CONFIG --libs "QtTest >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1` + else + POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_QT4_TEST_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (QtTest >= 4.4.0) were not met: + +$POPPLER_QT4_TEST_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables POPPLER_QT4_TEST_CFLAGS +and POPPLER_QT4_TEST_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables POPPLER_QT4_TEST_CFLAGS +and POPPLER_QT4_TEST_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + POPPLER_QT4_TEST_CFLAGS=$pkg_cv_POPPLER_QT4_TEST_CFLAGS + POPPLER_QT4_TEST_LIBS=$pkg_cv_POPPLER_QT4_TEST_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +elif test x$enable_poppler_qt4 = xtry; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4" >&5 +$as_echo_n "checking for POPPLER_QT4... " >&6; } + +if test -n "$POPPLER_QT4_CFLAGS"; then + pkg_cv_POPPLER_QT4_CFLAGS="$POPPLER_QT4_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_CFLAGS=`$PKG_CONFIG --cflags "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_QT4_LIBS"; then + pkg_cv_POPPLER_QT4_LIBS="$POPPLER_QT4_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_LIBS=`$PKG_CONFIG --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1` + else + POPPLER_QT4_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_QT4_PKG_ERRORS" >&5 + + enable_poppler_qt4="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_poppler_qt4="no" +else + POPPLER_QT4_CFLAGS=$pkg_cv_POPPLER_QT4_CFLAGS + POPPLER_QT4_LIBS=$pkg_cv_POPPLER_QT4_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_poppler_qt4="yes" +fi + if test x$enable_poppler_qt4 = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER_QT4_TEST" >&5 +$as_echo_n "checking for POPPLER_QT4_TEST... " >&6; } + +if test -n "$POPPLER_QT4_TEST_CFLAGS"; then + pkg_cv_POPPLER_QT4_TEST_CFLAGS="$POPPLER_QT4_TEST_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_TEST_CFLAGS=`$PKG_CONFIG --cflags "QtTest >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_QT4_TEST_LIBS"; then + pkg_cv_POPPLER_QT4_TEST_LIBS="$POPPLER_QT4_TEST_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtTest >= 4.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtTest >= 4.4.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_QT4_TEST_LIBS=`$PKG_CONFIG --libs "QtTest >= 4.4.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1` + else + POPPLER_QT4_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtTest >= 4.4.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_QT4_TEST_PKG_ERRORS" >&5 + + enable_poppler_qt4="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_poppler_qt4="no" +else + POPPLER_QT4_TEST_CFLAGS=$pkg_cv_POPPLER_QT4_TEST_CFLAGS + POPPLER_QT4_TEST_LIBS=$pkg_cv_POPPLER_QT4_TEST_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_poppler_qt4="yes" +fi + fi +fi + + + + + +if test x$enable_poppler_qt4 = xyes; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}moc", so it can be a program name with args. +set dummy ${ac_tool_prefix}moc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MOCQT4+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MOCQT4"; then + ac_cv_prog_MOCQT4="$MOCQT4" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MOCQT4="${ac_tool_prefix}moc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MOCQT4=$ac_cv_prog_MOCQT4 +if test -n "$MOCQT4"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOCQT4" >&5 +$as_echo "$MOCQT4" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MOCQT4"; then + ac_ct_MOCQT4=$MOCQT4 + # Extract the first word of "moc", so it can be a program name with args. +set dummy moc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MOCQT4+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MOCQT4"; then + ac_cv_prog_ac_ct_MOCQT4="$ac_ct_MOCQT4" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MOCQT4="moc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MOCQT4=$ac_cv_prog_ac_ct_MOCQT4 +if test -n "$ac_ct_MOCQT4"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MOCQT4" >&5 +$as_echo "$ac_ct_MOCQT4" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MOCQT4" = x; then + MOCQT4="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MOCQT4=$ac_ct_MOCQT4 + fi +else + MOCQT4="$ac_cv_prog_MOCQT4" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 moc" >&5 +$as_echo_n "checking for Qt4 moc... " >&6; } + mocversion=`$MOCQT4 -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 4"` + if test x"$mocversiongrep" != x"$mocversion"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + # moc was not the qt4 one, try with moc-qt4 + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}moc-qt4", so it can be a program name with args. +set dummy ${ac_tool_prefix}moc-qt4; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MOCQT4+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MOCQT4"; then + ac_cv_prog_MOCQT4="$MOCQT4" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MOCQT4="${ac_tool_prefix}moc-qt4" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MOCQT4=$ac_cv_prog_MOCQT4 +if test -n "$MOCQT4"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOCQT4" >&5 +$as_echo "$MOCQT4" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MOCQT4"; then + ac_ct_MOCQT4=$MOCQT4 + # Extract the first word of "moc-qt4", so it can be a program name with args. +set dummy moc-qt4; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MOCQT4+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MOCQT4"; then + ac_cv_prog_ac_ct_MOCQT4="$ac_ct_MOCQT4" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MOCQT4="moc-qt4" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MOCQT4=$ac_cv_prog_ac_ct_MOCQT4 +if test -n "$ac_ct_MOCQT4"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MOCQT4" >&5 +$as_echo "$ac_ct_MOCQT4" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MOCQT4" = x; then + MOCQT4="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MOCQT4=$ac_ct_MOCQT4 + fi +else + MOCQT4="$ac_cv_prog_MOCQT4" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 moc-qt4" >&5 +$as_echo_n "checking for Qt4 moc-qt4... " >&6; } + mocversion=`$MOCQT4 -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 4"` + if test x"$mocversiongrep" != x"$mocversion"; then + # no valid moc found + enable_poppler_qt4=no; + MOCQT4="not found" + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOCQT4" >&5 +$as_echo "$MOCQT4" >&6; } +fi + + if test "x$enable_poppler_qt4" = "xyes"; then + BUILD_POPPLER_QT4_TRUE= + BUILD_POPPLER_QT4_FALSE='#' +else + BUILD_POPPLER_QT4_TRUE='#' + BUILD_POPPLER_QT4_FALSE= +fi + + + +# Check whether --enable-poppler-cpp was given. +if test "${enable_poppler_cpp+set}" = set; then : + enableval=$enable_poppler_cpp; enable_poppler_cpp=$enableval +else + enable_poppler_cpp="yes" +fi + +if test x$enable_poppler_cpp = xyes; then + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + + + acl_libdirstem=lib + acl_libdirstem2= + case "$host_os" in + solaris*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 +$as_echo_n "checking for 64-bit host... " >&6; } +if ${gl_cv_solaris_64bit+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _LP64 +sixtyfour bits +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "sixtyfour bits" >/dev/null 2>&1; then : + gl_cv_solaris_64bit=yes +else + gl_cv_solaris_64bit=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 +$as_echo "$gl_cv_solaris_64bit" >&6; } + if test $gl_cv_solaris_64bit = yes; then + acl_libdirstem=lib/64 + case "$host_cpu" in + sparc*) acl_libdirstem2=lib/sparcv9 ;; + i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; + esac + fi + ;; + *) + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + */../ | */.. ) + # Better ignore directories of this form. They are misleading. + ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + ;; + esac + test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" + + + + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + if test "$acl_libdirstem2" != "$acl_libdirstem" \ + && ! test -d "$withval/$acl_libdirstem"; then + additional_libdir="$withval/$acl_libdirstem2" + fi + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + LIBICONV_PREFIX= + HAVE_LIBICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no \ + || test "X$found_dir" = "X/usr/$acl_libdirstem" \ + || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$acl_hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + if test "$name" = 'iconv'; then + LIBICONV_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + */$acl_libdirstem2 | */$acl_libdirstem2/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` + if test "$name" = 'iconv'; then + LIBICONV_PREFIX="$basedir" + fi + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ + && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ + || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <iconv.h> +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <iconv.h> +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 +$as_echo_n "checking for working iconv... " >&6; } +if ${am_cv_func_iconv_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + if test "$cross_compiling" = yes; then : + case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <iconv.h> +#include <string.h> +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + am_cv_func_iconv_works=yes +else + am_cv_func_iconv_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS="$am_save_LIBS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 +$as_echo "$am_cv_func_iconv_works" >&6; } + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 +$as_echo_n "checking for iconv declaration... " >&6; } + if ${am_cv_proto_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_cv_proto_iconv_arg1="" +else + am_cv_proto_iconv_arg1="const" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- + }$am_cv_proto_iconv" >&5 +$as_echo "${ac_t:- + }$am_cv_proto_iconv" >&6; } + +cat >>confdefs.h <<_ACEOF +#define ICONV_CONST $am_cv_proto_iconv_arg1 +_ACEOF + + fi + + if test x$am_func_iconv != xyes; then + enable_poppler_cpp=no + fi +fi + + if test "x$enable_poppler_cpp" = "xyes"; then + BUILD_POPPLER_CPP_TRUE= + BUILD_POPPLER_CPP_FALSE='#' +else + BUILD_POPPLER_CPP_TRUE='#' + BUILD_POPPLER_CPP_FALSE= +fi + + + +# Check whether --enable-gtk-test was given. +if test "${enable_gtk_test+set}" = set; then : + enableval=$enable_gtk_test; enable_gtk_test=$enableval +else + enable_gtk_test="try" +fi + +if test x$enable_gtk_test = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_TEST" >&5 +$as_echo_n "checking for GTK_TEST... " >&6; } + +if test -n "$GTK_TEST_CFLAGS"; then + pkg_cv_GTK_TEST_CFLAGS="$GTK_TEST_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_TEST_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTK_TEST_LIBS"; then + pkg_cv_GTK_TEST_LIBS="$GTK_TEST_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_TEST_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1` + else + GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK_TEST_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0) were not met: + +$GTK_TEST_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables GTK_TEST_CFLAGS +and GTK_TEST_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables GTK_TEST_CFLAGS +and GTK_TEST_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + GTK_TEST_CFLAGS=$pkg_cv_GTK_TEST_CFLAGS + GTK_TEST_LIBS=$pkg_cv_GTK_TEST_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +elif test x$enable_gtk_test = xtry; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_TEST" >&5 +$as_echo_n "checking for GTK_TEST... " >&6; } + +if test -n "$GTK_TEST_CFLAGS"; then + pkg_cv_GTK_TEST_CFLAGS="$GTK_TEST_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_TEST_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTK_TEST_LIBS"; then + pkg_cv_GTK_TEST_LIBS="$GTK_TEST_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK_TEST_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1` + else + GTK_TEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK_TEST_PKG_ERRORS" >&5 + + enable_gtk_test="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_gtk_test="no" +else + GTK_TEST_CFLAGS=$pkg_cv_GTK_TEST_CFLAGS + GTK_TEST_LIBS=$pkg_cv_GTK_TEST_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_gtk_test="yes" +fi +fi + if test x$enable_gtk_test = xyes -a x$enable_poppler_glib = xyes; then + BUILD_GTK_TEST_TRUE= + BUILD_GTK_TEST_FALSE='#' +else + BUILD_GTK_TEST_TRUE='#' + BUILD_GTK_TEST_FALSE= +fi + + +# Check whether --enable-utils was given. +if test "${enable_utils+set}" = set; then : + enableval=$enable_utils; enable_utils=$enableval +else + enable_utils="yes" +fi + + if test x$enable_utils = xyes; then + BUILD_UTILS_TRUE= + BUILD_UTILS_FALSE='#' +else + BUILD_UTILS_TRUE='#' + BUILD_UTILS_FALSE= +fi + + +# Check whether --enable-compile-warnings was given. +if test "${enable_compile_warnings+set}" = set; then : + enableval=$enable_compile_warnings; +else + enable_compile_warnings="yes" +fi + + + +# Check whether --enable-cms was given. +if test "${enable_cms+set}" = set; then : + enableval=$enable_cms; enable_cms=$enableval +else + enable_cms="try" +fi + +if test x$enable_cms = xyes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5 +$as_echo_n "checking for LCMS... " >&6; } + +if test -n "$LCMS_CFLAGS"; then + pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LCMS_LIBS"; then + pkg_cv_LCMS_LIBS="$LCMS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms2" 2>&1` + else + LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LCMS_PKG_ERRORS" >&5 + + lcms2=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + lcms2=no +else + LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS + LCMS_LIBS=$pkg_cv_LCMS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + lcms2=yes +fi + if test x$lcms2 = xno; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5 +$as_echo_n "checking for LCMS... " >&6; } + +if test -n "$LCMS_CFLAGS"; then + pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LCMS_LIBS"; then + pkg_cv_LCMS_LIBS="$LCMS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms" 2>&1` + else + LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LCMS_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (lcms) were not met: + +$LCMS_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables LCMS_CFLAGS +and LCMS_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LCMS_CFLAGS +and LCMS_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS + LCMS_LIBS=$pkg_cv_LCMS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + fi +elif test x$enable_cms = xtry; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5 +$as_echo_n "checking for LCMS... " >&6; } + +if test -n "$LCMS_CFLAGS"; then + pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LCMS_LIBS"; then + pkg_cv_LCMS_LIBS="$LCMS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms2" 2>&1` + else + LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LCMS_PKG_ERRORS" >&5 + + lcms2=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + lcms2=no +else + LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS + LCMS_LIBS=$pkg_cv_LCMS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + lcms2=yes +fi + if test x$lcms2 = xyes; then + enable_cms=yes + else + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LCMS" >&5 +$as_echo_n "checking for LCMS... " >&6; } + +if test -n "$LCMS_CFLAGS"; then + pkg_cv_LCMS_CFLAGS="$LCMS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_CFLAGS=`$PKG_CONFIG --cflags "lcms" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LCMS_LIBS"; then + pkg_cv_LCMS_LIBS="$LCMS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lcms\""; } >&5 + ($PKG_CONFIG --exists --print-errors "lcms") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LCMS_LIBS=`$PKG_CONFIG --libs "lcms" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LCMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "lcms" 2>&1` + else + LCMS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "lcms" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LCMS_PKG_ERRORS" >&5 + + enable_cms=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_cms=no +else + LCMS_CFLAGS=$pkg_cv_LCMS_CFLAGS + LCMS_LIBS=$pkg_cv_LCMS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + enable_cms=yes +fi + fi +fi + +if test "x$enable_cms" = "xyes"; then + +$as_echo "#define USE_CMS 1" >>confdefs.h + + if test "x$lcms2" != "xyes"; then + lcms1=yes; + +$as_echo "#define USE_LCMS1 1" >>confdefs.h + + fi +fi + if test x$enable_cms = xyes; then + USE_CMS_TRUE= + USE_CMS_FALSE='#' +else + USE_CMS_TRUE='#' + USE_CMS_FALSE= +fi + + if test x$lcms1 = xyes; then + USE_LCMS1_TRUE= + USE_LCMS1_FALSE='#' +else + USE_LCMS1_TRUE='#' + USE_LCMS1_FALSE= +fi + + + +# Check whether --with-testdatadir was given. +if test "${with_testdatadir+set}" = set; then : + withval=$with_testdatadir; case $withval in + [\\/]* | ?:[\\/]* ) # Absolute name. + TESTDATADIR=$withval ;; + *) # Relative name. + TESTDATADIR=$ac_pwd/$withval ;; + esac + +else + case $srcdir in + [\\/]* | ?:[\\/]* ) # Absolute name. + TESTDATADIR=$srcdir/../test ;; + *) # Relative name. + TESTDATADIR=$ac_pwd/$srcdir/../test ;; + esac + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for test data in $TESTDATADIR" >&5 +$as_echo_n "checking for test data in $TESTDATADIR... " >&6; } +if test -d $TESTDATADIR && test -f $TESTDATADIR/test-poppler.c; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: + No test data found in $TESTDATADIR. + You will not be able to run 'make check' successfully. + + The test data is not included in the source packages + and is also not part of the main git repository. Instead, + you can checkout the test data from its own git + repository with: + + git clone git://git.freedesktop.org/git/poppler/test + + You should checkout the test data as a sibling of your + poppler source folder or specify the location of your + checkout with --with-testdatadir=/path/to/checkoutdir/test. +" >&5 +$as_echo "$as_me: WARNING: + No test data found in $TESTDATADIR. + You will not be able to run 'make check' successfully. + + The test data is not included in the source packages + and is also not part of the main git repository. Instead, + you can checkout the test data from its own git + repository with: + + git clone git://git.freedesktop.org/git/poppler/test + + You should checkout the test data as a sibling of your + poppler source folder or specify the location of your + checkout with --with-testdatadir=/path/to/checkoutdir/test. +" >&2;} +fi + + +if test "x$GCC" != xyes; then + enable_compile_warnings=no +fi +case "$enable_compile_warnings" in + no) ;; + yes) CXXFLAGS="-Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wcast-align -fno-exceptions -fno-check-new -fno-common $CXXFLAGS" ;; + kde) CXXFLAGS="-Wnon-virtual-dtor -Wno-long-long -Wundef \ + -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -Wcast-align \ + -Wconversion -Wall -W -Wpointer-arith \ + -Wwrite-strings -O2 -Wformat-security \ + -Wmissing-format-attribute -fno-exceptions -fno-check-new \ + -fno-common $CXXFLAGS" ;; +esac + +case `$PKG_CONFIG --version` in + 0.?|0.10-7) + PC_REQUIRES_PRIVATE=""; + PC_REQUIRES="poppler = $VERSION";; + *) + PC_REQUIRES_PRIVATE="Requires.private: poppler = $VERSION"; + PC_REQUIRES="";; +esac + + + + +POPPLER_MAJOR_VERSION=0 + +POPPLER_MINOR_VERSION=20 + +POPPLER_MICRO_VERSION=4 + +POPPLER_VERSION=0.20.4 + + +ac_config_files="$ac_config_files Makefile goo/Makefile fofi/Makefile splash/Makefile poppler/Makefile utils/Makefile glib/Makefile glib/poppler-features.h glib/reference/Makefile glib/reference/version.xml glib/demo/Makefile test/Makefile qt4/Makefile qt4/src/Makefile qt4/tests/Makefile qt4/demos/Makefile cpp/Makefile cpp/poppler-version.h cpp/tests/Makefile poppler.pc poppler-uninstalled.pc poppler-cairo.pc poppler-cairo-uninstalled.pc poppler-splash.pc poppler-splash-uninstalled.pc poppler-glib.pc poppler-glib-uninstalled.pc poppler-qt4.pc poppler-qt4-uninstalled.pc poppler-cpp.pc poppler-cpp-uninstalled.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_XPDF_HEADERS_TRUE}" && test -z "${ENABLE_XPDF_HEADERS_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_XPDF_HEADERS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_LIBOPENJPEG_TRUE}" && test -z "${BUILD_LIBOPENJPEG_FALSE}"; then + as_fn_error $? "conditional \"BUILD_LIBOPENJPEG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_LIBTIFF_TRUE}" && test -z "${BUILD_LIBTIFF_FALSE}"; then + as_fn_error $? "conditional \"BUILD_LIBTIFF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_ZLIB_TRUE}" && test -z "${BUILD_ZLIB_FALSE}"; then + as_fn_error $? "conditional \"BUILD_ZLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_LIBCURL_TRUE}" && test -z "${BUILD_LIBCURL_FALSE}"; then + as_fn_error $? "conditional \"BUILD_LIBCURL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_LIBJPEG_TRUE}" && test -z "${BUILD_LIBJPEG_FALSE}"; then + as_fn_error $? "conditional \"BUILD_LIBJPEG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_LIBPNG_TRUE}" && test -z "${BUILD_LIBPNG_FALSE}"; then + as_fn_error $? "conditional \"BUILD_LIBPNG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_WITH_WIN32_FONTCONFIGURATION_TRUE}" && test -z "${BUILD_WITH_WIN32_FONTCONFIGURATION_FALSE}"; then + as_fn_error $? "conditional \"BUILD_WITH_WIN32_FONTCONFIGURATION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_SPLASH_OUTPUT_TRUE}" && test -z "${BUILD_SPLASH_OUTPUT_FALSE}"; then + as_fn_error $? "conditional \"BUILD_SPLASH_OUTPUT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_CAIRO_OUTPUT_TRUE}" && test -z "${BUILD_CAIRO_OUTPUT_FALSE}"; then + as_fn_error $? "conditional \"BUILD_CAIRO_OUTPUT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then + as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_POPPLER_GLIB_TRUE}" && test -z "${BUILD_POPPLER_GLIB_FALSE}"; then + as_fn_error $? "conditional \"BUILD_POPPLER_GLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then + as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_POPPLER_QT4_TRUE}" && test -z "${BUILD_POPPLER_QT4_FALSE}"; then + as_fn_error $? "conditional \"BUILD_POPPLER_QT4\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_POPPLER_CPP_TRUE}" && test -z "${BUILD_POPPLER_CPP_FALSE}"; then + as_fn_error $? "conditional \"BUILD_POPPLER_CPP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_GTK_TEST_TRUE}" && test -z "${BUILD_GTK_TEST_FALSE}"; then + as_fn_error $? "conditional \"BUILD_GTK_TEST\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_UTILS_TRUE}" && test -z "${BUILD_UTILS_FALSE}"; then + as_fn_error $? "conditional \"BUILD_UTILS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_CMS_TRUE}" && test -z "${USE_CMS_FALSE}"; then + as_fn_error $? "conditional \"USE_CMS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LCMS1_TRUE}" && test -z "${USE_LCMS1_FALSE}"; then + as_fn_error $? "conditional \"USE_LCMS1\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by poppler $as_me 0.20.4, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=poppler>." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +poppler config.status 0.20.4 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "poppler/poppler-config.h") CONFIG_HEADERS="$CONFIG_HEADERS poppler/poppler-config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "goo/Makefile") CONFIG_FILES="$CONFIG_FILES goo/Makefile" ;; + "fofi/Makefile") CONFIG_FILES="$CONFIG_FILES fofi/Makefile" ;; + "splash/Makefile") CONFIG_FILES="$CONFIG_FILES splash/Makefile" ;; + "poppler/Makefile") CONFIG_FILES="$CONFIG_FILES poppler/Makefile" ;; + "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; + "glib/Makefile") CONFIG_FILES="$CONFIG_FILES glib/Makefile" ;; + "glib/poppler-features.h") CONFIG_FILES="$CONFIG_FILES glib/poppler-features.h" ;; + "glib/reference/Makefile") CONFIG_FILES="$CONFIG_FILES glib/reference/Makefile" ;; + "glib/reference/version.xml") CONFIG_FILES="$CONFIG_FILES glib/reference/version.xml" ;; + "glib/demo/Makefile") CONFIG_FILES="$CONFIG_FILES glib/demo/Makefile" ;; + "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; + "qt4/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/Makefile" ;; + "qt4/src/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/src/Makefile" ;; + "qt4/tests/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/tests/Makefile" ;; + "qt4/demos/Makefile") CONFIG_FILES="$CONFIG_FILES qt4/demos/Makefile" ;; + "cpp/Makefile") CONFIG_FILES="$CONFIG_FILES cpp/Makefile" ;; + "cpp/poppler-version.h") CONFIG_FILES="$CONFIG_FILES cpp/poppler-version.h" ;; + "cpp/tests/Makefile") CONFIG_FILES="$CONFIG_FILES cpp/tests/Makefile" ;; + "poppler.pc") CONFIG_FILES="$CONFIG_FILES poppler.pc" ;; + "poppler-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-uninstalled.pc" ;; + "poppler-cairo.pc") CONFIG_FILES="$CONFIG_FILES poppler-cairo.pc" ;; + "poppler-cairo-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-cairo-uninstalled.pc" ;; + "poppler-splash.pc") CONFIG_FILES="$CONFIG_FILES poppler-splash.pc" ;; + "poppler-splash-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-splash-uninstalled.pc" ;; + "poppler-glib.pc") CONFIG_FILES="$CONFIG_FILES poppler-glib.pc" ;; + "poppler-glib-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-glib-uninstalled.pc" ;; + "poppler-qt4.pc") CONFIG_FILES="$CONFIG_FILES poppler-qt4.pc" ;; + "poppler-qt4-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-qt4-uninstalled.pc" ;; + "poppler-cpp.pc") CONFIG_FILES="$CONFIG_FILES poppler-cpp.pc" ;; + "poppler-cpp-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES poppler-cpp-uninstalled.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + +echo "" +echo "Building poppler with support for:" +echo " font configuration: $with_font_configuration" +echo " splash output: $enable_splash_output" +echo " cairo output: $use_cairo" +echo " qt4 wrapper: $enable_poppler_qt4" +echo " glib wrapper: $use_glib" +echo " introspection: $found_introspection" +echo " cpp wrapper: $enable_poppler_cpp" +echo " use gtk-doc: $enable_gtk_doc" +echo " use libjpeg: $enable_libjpeg" +echo " use libpng: $enable_libpng" +echo " use libtiff: $enable_libtiff" +echo " use zlib: $enable_zlib" +echo " use libcurl: $enable_libcurl" +echo " use libopenjpeg: $enable_libopenjpeg" +echo " use cms: $enable_cms" +if test x$enable_cms = xyes;then + if test x$lcms1 = xyes;then + echo " with lcms1" + else + echo " with lcms2" + fi +fi +echo " command line utils: $enable_utils" +echo " test data dir: $TESTDATADIR" +echo "" + +if test x$enable_splash_output = xno -a x$enable_cairo_output = xno; then + echo " Warning: There is no rendering backend enabled" +fi + +if test x$enable_single_precision = xyes -a x$enable_fixedpoint = xyes; then + echo " Warning: Single precision and fixed point options should not be enabled at the same time" +fi + +if test x$enable_libjpeg != xyes; then + echo " Warning: Using libjpeg is recommended" +fi + +if test x$enable_zlib != xno; then + echo " Warning: Using zlib is not totally safe" +fi + +if test x$enable_libopenjpeg != xyes; then + echo " Warning: Using libopenjpeg is recommended" +fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..6ada41c --- /dev/null +++ b/configure.ac @@ -0,0 +1,852 @@ +m4_define([poppler_version_major],[0]) +m4_define([poppler_version_minor],[20]) +m4_define([poppler_version_micro],[4]) +m4_define([poppler_version],[poppler_version_major.poppler_version_minor.poppler_version_micro]) + +AC_PREREQ(2.59) +AC_INIT([poppler],[poppler_version],[https://bugs.freedesktop.org/enter_bug.cgi?product=poppler]) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE([foreign]) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) +AM_CONFIG_HEADER(config.h) +AM_CONFIG_HEADER(poppler/poppler-config.h) +AC_C_BIGENDIAN + +dnl ##### Initialize libtool. +AC_LIBTOOL_WIN32_DLL +define([AC_LIBTOOL_LANG_F77_CONFIG], [:]) +AC_PROG_LIBTOOL + +dnl ##### Checks for programs. +AC_PROG_CC +AC_PROG_CXX +AC_ISC_POSIX +AC_PROG_CC_STDC +#if test -z "$CXX" -a "$CC" = "gcc"; then +# CXX="gcc" +#fi +AC_PROG_CXX +if test "x$GXX" = "xyes"; then + case "$host_os" in + cygwin* | mingw*) + ;; + *) + case "${CXXFLAGS}" in + *-std=*) + ;; + *) + CXXFLAGS="$CXXFLAGS -ansi" + ;; + esac + ;; + esac +fi +AC_PROG_INSTALL + +dnl ##### Check for pkgconfig +PKG_PROG_PKG_CONFIG + +dnl ##### Export the version +AC_DEFINE_UNQUOTED([POPPLER_VERSION], ["poppler_version"], [Defines the poppler version]) + +dnl Enable these unconditionally. +AC_DEFINE([OPI_SUPPORT], [1], [Generate OPI comments in PS output.]) +AC_DEFINE([MULTITHREADED], [1], [Enable multithreading support.]) +AC_DEFINE([TEXTOUT_WORD_LIST], [1], [Enable word list support.]) + +dnl Check for OS specific flags +win32_libs="" +create_shared_lib="" +auto_import_flags="" +case "$host_os" in + cygwin*) + create_shared_lib="-no-undefined" + ;; + mingw*) + os_win32=yes + win32_libs="-lgdi32" + create_shared_lib="-no-undefined" + auto_import_flags="-Wl,--enable-auto-import" + ;; +esac + +AC_SUBST(win32_libs) +AC_SUBST(create_shared_lib) +AC_SUBST(auto_import_flags) + +ACX_PTHREAD() + +dnl Install xpdf headers +AC_ARG_ENABLE(xpdf-headers, + AC_HELP_STRING([--enable-xpdf-headers], + [Install unsupported xpdf headers.]), + enable_xpdf_headers=$enableval, + enable_xpdf_headers="no") +AM_CONDITIONAL(ENABLE_XPDF_HEADERS, test x$enable_xpdf_headers = xyes) + +AC_ARG_ENABLE(single-precision, +[ --enable-single-precision use single precision arithmetic (instead of double precision) in the Splash backend], +AC_DEFINE(USE_FLOAT, [1], [Use single precision arithmetic in the Splash backend])) + +AC_ARG_ENABLE(fixedpoint, +[ --enable-fixedpoint use fixed point (instead of double precision) arithmetic in the Splash backend], +AC_DEFINE(USE_FIXEDPOINT, [1], [Use fixed point arithmetic in the Splash backend])) + +dnl Relocation support +AC_ARG_ENABLE(relocatable, + AC_HELP_STRING([--disable-relocatable], + [Hardcode the poppler library location (on Windows).]), + enable_relocatable=$enableval, + [if test x$os_win32 = xyes; then + # default to yes on native Windows. + enable_relocatable="yes" + else + # default to no everywhere else. + enable_relocatable="no" + fi + ] +) + +if test x$enable_relocatable = xyes; then + if test x$os_win32 = xyes; then + AC_DEFINE([ENABLE_RELOCATABLE], + [1],[Do not hardcode the library location]) + else + AC_MSG_ERROR( + [Invalid setting for relocatable, only supported on windows]) + + fi +fi + +AC_DEFINE_DIR(POPPLER_DATADIR, "{datarootdir}/poppler", [Poppler data dir]) + +dnl ##### Checks for header files. +AC_PATH_XTRA +AC_HEADER_DIRENT +AC_CHECK_HEADERS([stdint.h]) + +dnl ##### Switch over to C++. This will make the checks below a little +dnl ##### bit stricter (requiring function prototypes in include files). +dnl ##### (99% of xpdf is written in C++.) +AC_LANG_CPLUSPLUS + +AC_CHECK_DECL(gettimeofday, [AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Defines if gettimeofday is available on your system]))],[],[#include <sys/time.h>]) +AC_CHECK_FUNC(localtime_r, AC_DEFINE(HAVE_LOCALTIME_R, 1, [Defines if localtime_r is available on your system])) +AC_CHECK_FUNC(gmtime_r, AC_DEFINE(HAVE_GMTIME_R, 1, [Defines if gmtime_r is available on your system])) + +dnl ##### Check for extra libraries needed by X. (LynxOS needs this.) +AC_CHECK_FUNC(gethostbyname) +if test $ac_cv_func_gethostbyname = no; then + AC_CHECK_LIB(bsd, gethostbyname, X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd") +fi + +AC_CHECK_FUNC(nanosleep,,) +dnl try in librt if not found in current LIBS +if test x$ac_cv_func_nanosleep = xno +then + AC_CHECK_LIB(rt,nanosleep, X_EXTRA_LIBS="$X_EXTRA_LIBS -lrt") +fi + +dnl try in libposix4, if not found so far +if test x$ac_cv_func_nanosleep = xno && test x$ac_cv_lib_rt_nanosleep = xno +then + AC_CHECK_LIB(posix4,nanosleep, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix4") +fi + + +dnl Test for libopenjpeg. Versions prior to 1.4 do not provide a pkgconfig file. +AC_ARG_ENABLE(libopenjpeg, + AC_HELP_STRING([--disable-libopenjpeg], + [Don't build against libopenjpeg.]), + enable_libopenjpeg=$enableval, + enable_libopenjpeg="try") +if test x$enable_libopenjpeg = xyes; then + PKG_CHECK_MODULES(LIBOPENJPEG, libopenjpeg, + [], + [AC_CHECK_LIB([openjpeg], [opj_cio_open], + LIBOPENJPEG_LIBS="-lopenjpeg", + AC_MSG_ERROR("*** libopenjpeg library not found ***")) + AC_CHECK_HEADERS([openjpeg.h],, + AC_MSG_ERROR("*** libopenjpeg headers not found ***"))]) +elif test x$enable_libopenjpeg = xtry; then + PKG_CHECK_MODULES(LIBOPENJPEG, libopenjpeg, + [enable_libopenjpeg="yes"], + [AC_CHECK_LIB([openjpeg], [opj_cio_open], + [enable_libopenjpeg="yes" + LIBOPENJPEG_LIBS="-lopenjpeg"], + [enable_libopenjpeg="no"]) + AC_CHECK_HEADERS([openjpeg.h],, + [enable_libopenjpeg="no"])]) +fi + +if test x$enable_libopenjpeg = xyes; then + AC_SUBST(LIBOPENJPEG_CFLAGS) + AC_SUBST(LIBOPENJPEG_LIBS) + AC_DEFINE(ENABLE_LIBOPENJPEG) + PKG_CHECK_EXISTS(libopenjpeg >= 1.5, + [AC_DEFINE(WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG, 1, [OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag.])], + []) +fi + +AM_CONDITIONAL(BUILD_LIBOPENJPEG, test x$enable_libopenjpeg = xyes) +AH_TEMPLATE([ENABLE_LIBOPENJPEG], + [Use libopenjpeg instead of builtin jpeg2000 decoder.]) + +dnl ##### Test for libtiff +AC_ARG_ENABLE(libtiff, + AC_HELP_STRING([--disable-libtiff], + [Don't build against libtiff.]), + enable_libtiff=$enableval, + enable_libtiff="try") + +AC_ARG_VAR([LIBTIFF_CFLAGS], [C compiler flags for LIBTIFF]) +AC_ARG_VAR([LIBTIFF_LIBS], [linker flags to link LIBTIFF (default is -ltiff)]) +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_CXXFLAGS="$CXXFLAGS" +ac_save_LIBS="$LDFLAGS" +CPPFLAGS="$CPPFLAGS $LIBTIFF_CFLAGS" +CXXFLAGS="$CXXFLAGS $LIBTIFF_CFLAGS" +LIBS="$LIBS $LIBTIFF_LIBS" +if test x$enable_libtiff = xyes; then + if test x"$LIBTIFF_LIBS" != ; then + AC_CHECK_FUNC([TIFFOpen],, + AC_MSG_ERROR("*** libtiff library not found ***")) + else + AC_CHECK_LIB([tiff], [TIFFOpen],, + AC_MSG_ERROR("*** libtiff library not found ***")) + fi + AC_CHECK_HEADERS([tiffio.h],, + AC_MSG_ERROR("*** libtiff headers not found ***")) +elif test x$enable_libtiff = xtry; then + if test x"$LIBTIFF_LIBS" != x; then + AC_CHECK_FUNC([TIFFOpen], + [enable_libtiff="yes"], + [enable_libtiff="no"]) + else + AC_CHECK_LIB([tiff], [TIFFOpen], + [enable_libtiff="yes"], + [enable_libtiff="no"]) + fi + AC_CHECK_HEADERS([tiffio.h],, + [enable_libtiff="no"]) +fi +CPPFLAGS="$ac_save_CPPFLAGS" +CXXFLAGS="$ac_save_CXXFLAGS" +LIBS="$ac_save_LIBS" + +if test x$enable_libtiff = xyes; then + if test x"$LIBTIFF_LIBS" = x; then + LIBTIFF_LIBS="-ltiff" + fi + AC_SUBST(LIBTIFF_CFLAGSS) + AC_SUBST(LIBTIFF_LIBS) + AC_DEFINE(ENABLE_LIBTIFF) +fi + +AM_CONDITIONAL(BUILD_LIBTIFF, test x$enable_libtiff = xyes) +AH_TEMPLATE([ENABLE_LIBTIFF], [Build against libtiff.]) +if test x$enable_libtiff = xyes; then + AC_DEFINE(ENABLE_LIBTIFF, 1, [Build against libtiff.]) +fi + +dnl ##### Checks for library functions. +AC_CHECK_FUNCS(popen mkstemp mkstemps) + +dnl ##### Back to C for the library tests. +AC_LANG_C + +dnl ##### Check for fseeko/ftello or fseek64/ftell64 +dnl The LARGEFILE and FSEEKO macros have to be called in C, not C++, mode. +AC_SYS_LARGEFILE +AC_FUNC_FSEEKO +AC_CHECK_FUNCS(fseek64, xpdf_cv_func_fseek64=yes, xpdf_cv_func_fseek64=no) +AC_CHECK_FUNCS(ftell64, xpdf_cv_func_ftell64=yes, xpdf_cv_func_ftell64=no) +if test "$xpdf_cv_func_fseek64" = yes -a "$xpdf_cv_func_ftell64" = yes; then + AC_DEFINE(HAVE_FSEEK64) +fi + +dnl Test for zlib +AC_ARG_ENABLE([zlib], + [AS_HELP_STRING([--enable-zlib],[Build with zlib])], + [],[enable_zlib="no"]) +if test x$enable_zlib = xyes; then + AC_CHECK_LIB([z], [inflate],, + AC_MSG_ERROR("*** zlib library not found ***")) + AC_CHECK_HEADERS([zlib.h],, + AC_MSG_ERROR("*** zlib headers not found ***")) +elif test x$enable_zlib = xtry; then + AC_CHECK_LIB([z], [inflate], + [enable_zlib="yes"], + [enable_zlib="no"]) + AC_CHECK_HEADERS([zlib.h],, + [enable_zlib="no"]) +fi + +if test x$enable_zlib = xyes; then + ZLIB_LIBS="-lz" + AC_SUBST(ZLIB_LIBS) + AC_DEFINE(ENABLE_ZLIB) +fi + +AM_CONDITIONAL(BUILD_ZLIB, test x$enable_zlib = xyes) +AH_TEMPLATE([ENABLE_ZLIB], + [Use zlib instead of builtin zlib decoder.]) + +dnl Test for libcurl +AC_ARG_ENABLE(libcurl, + AC_HELP_STRING([--enable-libcurl], + [Build with libcurl based HTTP support.]), + enable_libcurl=$enableval, + enable_libcurl="no") + +if test x$enable_libcurl = xyes; then + PKG_CHECK_MODULES(LIBCURL, libcurl) + AC_DEFINE(ENABLE_LIBCURL, 1, [Build against libcurl.]) + AC_DEFINE(POPPLER_HAS_CURL_SUPPORT, 1, + [Support for curl based doc builder is compiled in.]) +fi + +AM_CONDITIONAL(BUILD_LIBCURL, test x$enable_libcurl = xyes) + +dnl Test for libjpeg +AC_ARG_ENABLE(libjpeg, + AC_HELP_STRING([--disable-libjpeg], + [Don't build against libjpeg.]), + enable_libjpeg=$enableval, + enable_libjpeg="try") +AC_ARG_VAR([LIBJPEG_CFLAGS], [C compiler flags for LIBJPEG]) +if test x$enable_libjpeg != xno; then + + dnl + dnl POPPLER_FIND_JPEG uses "USER_INCLUDES" and "USER_LIBS" + dnl to receive the flags for header and library directories. + dnl + ac_save_USER_INCLUDES="$USER_INCLUDES" + ac_save_USER_LDFLAGS="$USER_LDFLAGS" + USER_INCLUDES="$USER_INCLUDES $LIBJPEG_CFLAGS" + USER_LDFLAGS="$USER_LDFLAGS $LIBJPEG_CFLAGS" + POPPLER_FIND_JPEG + + dnl check INT16, INT32 typedef conflict in jmorecfg.h + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_CFLAGS="$CFLAGS" + CPPFLAGS="$CPPFLAGS $LIBJPEG_CFLAGS" + CFLAGS="$CFLAGS $LIBJPEG_CFLAGS" + AC_MSG_CHECKING([libjpeg.h works correctly]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ +#ifdef _WIN32 +#include <windows.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <jpeglib.h> +],[{return 0;}])],[ + AC_MSG_RESULT([ok]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([libjpeg.h problem can be fixed by XMD_H macro]) + CPPFLAGS="$CPPFLAGS -DXMD_H" + CFLAGS="$CFLAGS -DXMD_H" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ +#ifdef _WIN32 +#include <windows.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <jpeglib.h> +],[{return 0;}])],[ + AC_MSG_RESULT([ok, -DXMD_H is added to LIBJPEG_CFLAGS]) + LIBJPEG_CFLAGS="$LIBJPEG_CFLAGS -DXMD_H" + ],[ + AC_MSG_RESULT([no, disable libjpeg]) + enable_libjpeg="no" + ]) + ]) + CPPFLAGS="$ac_save_CPPFLAGS" + CFLAGS="$ac_save_CFLAGS" + + dnl POPPLER_FIND_JPEG sets LIBJPEG_LIBS + AC_SUBST(LIBJPEG_CFLAGS) + USER_INCLUDES="$ac_save_USER_INCLUDES" + USER_LDFLAGS="$ac_save_USER_LDFLAGS" +fi + +AM_CONDITIONAL(BUILD_LIBJPEG, test x$enable_libjpeg = xyes) +AH_TEMPLATE([ENABLE_LIBJPEG], + [Use libjpeg instead of builtin jpeg decoder.]) + +dnl Test for libpng +AC_ARG_ENABLE(libpng, + AC_HELP_STRING([--disable-libpng], + [Do not build against libpng.]), + enable_libpng=$enableval, + enable_libpng="try") + +if test x$enable_libpng != xno; then + PKG_CHECK_MODULES(LIBPNG, libpng, [enable_libpng="yes"], + [enable_libpng="no"]) +fi + +if test x$enable_libpng = xyes; then + AC_DEFINE(ENABLE_LIBPNG, 1, [Build against libpng.]) +fi + +AM_CONDITIONAL(BUILD_LIBPNG, test x$enable_libpng = xyes) + +dnl Check for freetype headers + +PKG_CHECK_MODULES(FREETYPE, freetype2, + [freetype_pkgconfig=yes], [freetype_pkgconfig=no]) + +if test "x$freetype_pkgconfig" = "xyes"; then + + AC_DEFINE(HAVE_FREETYPE_H, 1, [Have FreeType2 include files]) + +else + + FREETYPE_LIBS= + FREETYPE_CFLAGS= + + AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) + if test "x$FREETYPE_CONFIG" != "xno" ; then + + FREETYPE_CFLAGS=`$FREETYPE_CONFIG --cflags` + FREETYPE_LIBS=`$FREETYPE_CONFIG --libs` + AC_DEFINE(HAVE_FREETYPE_H, 1, [Have FreeType2 include files]) + + fi + +fi + +AC_SUBST(FREETYPE_CFLAGS) +AC_SUBST(FREETYPE_LIBS) + +AC_MSG_CHECKING([which font configuration to use]) +AC_ARG_WITH([font_configuration], + [AS_HELP_STRING([--with-font-configuration=fontconfig|win32], + [Select font configuration backend])], + [], + [if test x$os_win32 = xyes; then + # default to win32 on native Windows. + with_font_configuration=win32 + else + # default to fontconig everywhere else. + with_font_configuration=fontconfig + fi + ] +) +AC_MSG_RESULT([$with_font_configuration]) + +case $with_font_configuration in + win32) + AC_DEFINE([WITH_FONTCONFIGURATION_WIN32], + [1],[Use win32 font configuration backend]) + # Set the minimum required Internet Explorer version to 5.0 + CPPFLAGS="$CPPFLAGS -D_WIN32_IE=0x0500" + ;; + fontconfig) + AC_DEFINE([WITH_FONTCONFIGURATION_FONTCONFIG], + [1],[Use fontconfig font configuration backend]) + PKG_CHECK_MODULES(FONTCONFIG, fontconfig >= 2.0.0) + ;; + *) + AC_MSG_ERROR( + [Invalid font configuration setting: $with_font_configuration]) + ;; +esac + +AM_CONDITIONAL(BUILD_WITH_WIN32_FONTCONFIGURATION, + test x$with_font_configuration = xwin32) + +AC_ARG_ENABLE(splash-output, + AC_HELP_STRING([--disable-splash-output], + [Don't build the Splash graphics backend.]),, + enable_splash_output="yes") +AM_CONDITIONAL(BUILD_SPLASH_OUTPUT, test x$enable_splash_output = xyes) +AH_TEMPLATE([HAVE_SPLASH], [Use splash for rendering.]) +if test x$enable_splash_output = xyes; then + AC_DEFINE(HAVE_SPLASH) +fi + +CAIRO_VERSION="1.10.0" +AC_SUBST(CAIRO_VERSION) +AC_ARG_ENABLE(cairo-output, + AC_HELP_STRING([--disable-cairo-output], + [Don't build the cairo graphics backend.]), + enable_cairo_output=$enableval, + enable_cairo_output="try") +use_cairo="" +if test x$enable_cairo_output = xyes; then + PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION) +elif test x$enable_cairo_output = xtry; then + PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VERSION cairo-ft >= $CAIRO_VERSION, + [enable_cairo_output="yes"], + [enable_cairo_output="no" + use_cairo="no (requires cairo >= $CAIRO_VERSION)"]) +fi +if test x$use_cairo = x; then + use_cairo=$enable_cairo_output +fi + +AC_SUBST(CAIRO_CFLAGS) +AC_SUBST(CAIRO_LIBS) + +AM_CONDITIONAL(BUILD_CAIRO_OUTPUT, test x$enable_cairo_output = xyes) +AH_TEMPLATE([HAVE_CAIRO], [Use cairo for rendering.]) +if test x$enable_cairo_output = xyes; then + PDFTOCAIRO_DEPS="cairo cairo-ft" + dnl Check for optional cairo backends used by pdftocairo + PKG_CHECK_EXISTS(cairo-pdf, [PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-pdf"], []) + PKG_CHECK_EXISTS(cairo-ps, [PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-ps"], []) + PKG_CHECK_EXISTS(cairo-svg, [PDFTOCAIRO_DEPS="$PDFTOCAIRO_DEPS cairo-svg"], []) + + PKG_CHECK_MODULES(PDFTOCAIRO, $PDFTOCAIRO_DEPS) + AC_SUBST(PDFTOCAIRO_CFLAGS) + AC_SUBST(PDFTOCAIRO_LIBS) + + AC_DEFINE(HAVE_CAIRO) + CAIRO_FEATURE="#define POPPLER_HAS_CAIRO 1" + CAIRO_REQ="cairo" + AC_CHECK_HEADERS(fcntl.h sys/mman.h sys/stat.h) +else + CAIRO_FEATURE="#undef POPPLER_HAS_CAIRO" + CAIRO_REQ="" +fi +AC_SUBST(CAIRO_FEATURE) +AC_SUBST(CAIRO_REQ) + +use_glib="" +found_introspection=no +if test x$enable_cairo_output = xyes; then + POPPLER_GLIB_DISABLE_DEPRECATED="" + POPPLER_GLIB_DISABLE_SINGLE_INCLUDES="" + + GLIB_REQUIRED=2.18 + AC_SUBST(GLIB_REQUIRED) + AC_ARG_ENABLE(poppler-glib, + AC_HELP_STRING([--disable-poppler-glib], + [Don't compile poppler glib wrapper.]), + enable_poppler_glib=$enableval, + enable_poppler_glib="try") + if test x$enable_poppler_glib = xyes; then + PKG_CHECK_MODULES(POPPLER_GLIB, glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION) + elif test x$enable_poppler_glib = xtry; then + PKG_CHECK_MODULES(POPPLER_GLIB, glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION, + [enable_poppler_glib="yes"], + [enable_poppler_glib="no" + use_glib="no (requires glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED cairo >= $CAIRO_VERSION)"]) + fi + if test x$enable_poppler_glib = xyes; then + # Check for introspection + GOBJECT_INTROSPECTION_CHECK([0.6.7]) + + AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums]) + POPPLER_GLIB_DISABLE_DEPRECATED="$POPPLER_GLIB_DISABLE_DEPRECATED -DG_DISABLE_DEPRECATED" + POPPLER_GLIB_DISABLE_SINGLE_INCLUDES="$POPPLER_GLIB_DISABLE_SINGLE_INCLUDES -DG_DISABLE_SINGLE_INCLUDES" + fi +else + if test x$enable_poppler_glib = xyes; then + AC_MSG_ERROR("Cairo output is required to build glib frontend") + fi + use_glib="no (requires cairo output)" + enable_poppler_glib="no" +fi +if test x"$use_glib" = x; then + use_glib="$enable_poppler_glib" +fi +AM_CONDITIONAL(BUILD_POPPLER_GLIB, test x$enable_poppler_glib = xyes) +AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") +AC_SUBST(GLIB_REQ) +AC_SUBST(POPPLER_GLIB_DISABLE_DEPRECATED) +AC_SUBST(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES) + +GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) + +dnl +dnl Try Qt4 +dnl + +AC_ARG_ENABLE(poppler-qt4, + AC_HELP_STRING([--disable-poppler-qt4], + [Don't compile poppler Qt4 wrapper.]), + enable_poppler_qt4=$enableval, + enable_poppler_qt4="try") +if test x$enable_poppler_qt4 = xyes; then + PKG_CHECK_MODULES(POPPLER_QT4, + QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0) + PKG_CHECK_MODULES(POPPLER_QT4_TEST, + QtTest >= 4.4.0) +elif test x$enable_poppler_qt4 = xtry; then + PKG_CHECK_MODULES(POPPLER_QT4, + QtCore >= 4.4.0 QtGui >= 4.4.0 QtXml >= 4.4.0, + [enable_poppler_qt4="yes"], + [enable_poppler_qt4="no"]) + if test x$enable_poppler_qt4 = xyes; then + PKG_CHECK_MODULES(POPPLER_QT4_TEST, + QtTest >= 4.4.0, + [enable_poppler_qt4="yes"], + [enable_poppler_qt4="no"]) + fi +fi + +AC_SUBST(POPPLER_QT4_CXXFLAGS) +AC_SUBST(POPPLER_QT4_LIBS) +AC_SUBST(POPPLER_QT4_TEST_LIBS) + +if test x$enable_poppler_qt4 = xyes; then + AC_CHECK_TOOL(MOCQT4, moc) + AC_MSG_CHECKING([for Qt4 moc]) + mocversion=`$MOCQT4 -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 4"` + if test x"$mocversiongrep" != x"$mocversion"; then + AC_MSG_RESULT([no]) + # moc was not the qt4 one, try with moc-qt4 + AC_CHECK_TOOL(MOCQT4, moc-qt4) + AC_MSG_CHECKING([for Qt4 moc-qt4]) + mocversion=`$MOCQT4 -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 4"` + if test x"$mocversiongrep" != x"$mocversion"; then + # no valid moc found + enable_poppler_qt4=no; + MOCQT4="not found" + fi + fi + AC_SUBST(MOCQT4) + AC_MSG_RESULT([$MOCQT4]) +fi + +AM_CONDITIONAL(BUILD_POPPLER_QT4, test "x$enable_poppler_qt4" = "xyes") + +dnl +dnl CPP frontend +dnl + +AC_ARG_ENABLE(poppler-cpp, + AC_HELP_STRING([--disable-poppler-cpp], + [Don't compile poppler cpp wrapper.]), + enable_poppler_cpp=$enableval, + enable_poppler_cpp="yes") +if test x$enable_poppler_cpp = xyes; then + AM_ICONV() + if test x$am_func_iconv != xyes; then + enable_poppler_cpp=no + fi +fi + +AM_CONDITIONAL(BUILD_POPPLER_CPP, test "x$enable_poppler_cpp" = "xyes") + + +AC_ARG_ENABLE(gtk-test, + AC_HELP_STRING([--disable-gtk-test], + [Don't compile GTK+ test program.]), + enable_gtk_test=$enableval, + enable_gtk_test="try") +if test x$enable_gtk_test = xyes; then + PKG_CHECK_MODULES(GTK_TEST, gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0) +elif test x$enable_gtk_test = xtry; then + PKG_CHECK_MODULES(GTK_TEST, gtk+-2.0 >= 2.14 gdk-pixbuf-2.0 gthread-2.0 gio-2.0, + [enable_gtk_test="yes"], + [enable_gtk_test="no"]) +fi +AM_CONDITIONAL(BUILD_GTK_TEST, test x$enable_gtk_test = xyes -a x$enable_poppler_glib = xyes) + +AC_ARG_ENABLE(utils, + AC_HELP_STRING([--disable-utils], + [Don't compile poppler command line utils.]), + enable_utils=$enableval, + enable_utils="yes") +AM_CONDITIONAL(BUILD_UTILS, test x$enable_utils = xyes) + +AC_ARG_ENABLE(compile-warnings, + AC_HELP_STRING([--enable-compile-warnings=@<:@no/yes/kde@:>@] + [Turn on compiler warnings.]),, + [enable_compile_warnings="yes"]) + +dnl +dnl Color Management +dnl + +AC_ARG_ENABLE(cms, + AC_HELP_STRING([--disable-cms], + [Don't use color management system.]), + enable_cms=$enableval, + enable_cms="try") +if test x$enable_cms = xyes; then + PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no]) + if test x$lcms2 = xno; then + PKG_CHECK_MODULES(LCMS, lcms) + fi +elif test x$enable_cms = xtry; then + PKG_CHECK_MODULES(LCMS, lcms2,[lcms2=yes],[lcms2=no]) + if test x$lcms2 = xyes; then + enable_cms=yes + else + PKG_CHECK_MODULES(LCMS, lcms,[enable_cms=yes],[enable_cms=no]) + fi +fi + +if test "x$enable_cms" = "xyes"; then + AC_DEFINE(USE_CMS, 1, [Defines if use cms]) + if test "x$lcms2" != "xyes"; then + lcms1=yes; + AC_DEFINE(USE_LCMS1, 1, [Defines if use lcms1]) + fi +fi +AM_CONDITIONAL(USE_CMS, test x$enable_cms = xyes) +AM_CONDITIONAL(USE_LCMS1, test x$lcms1 = xyes) + +AC_ARG_WITH([testdatadir], + [AS_HELP_STRING([--with-testdatadir=/path/to/testdatadir], + [Specify test data dir])], + [case $withval in + [[\\/]]* | ?:[[\\/]]* ) # Absolute name. + TESTDATADIR=$withval ;; + *) # Relative name. + TESTDATADIR=$ac_pwd/$withval ;; + esac + ], + [case $srcdir in + [[\\/]]* | ?:[[\\/]]* ) # Absolute name. + TESTDATADIR=$srcdir/../test ;; + *) # Relative name. + TESTDATADIR=$ac_pwd/$srcdir/../test ;; + esac + ] +) +AC_MSG_CHECKING([for test data in $TESTDATADIR]) +if test -d $TESTDATADIR && test -f $TESTDATADIR/test-poppler.c; then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) + AC_MSG_WARN([ + No test data found in $TESTDATADIR. + You will not be able to run 'make check' successfully. + + The test data is not included in the source packages + and is also not part of the main git repository. Instead, + you can checkout the test data from its own git + repository with: + + git clone git://git.freedesktop.org/git/poppler/test + + You should checkout the test data as a sibling of your + poppler source folder or specify the location of your + checkout with --with-testdatadir=/path/to/checkoutdir/test. +]) +fi +AC_SUBST(TESTDATADIR) + +if test "x$GCC" != xyes; then + enable_compile_warnings=no +fi +case "$enable_compile_warnings" in + no) ;; + yes) CXXFLAGS="-Wall -Woverloaded-virtual -Wnon-virtual-dtor -Wcast-align -fno-exceptions -fno-check-new -fno-common $CXXFLAGS" ;; + kde) CXXFLAGS="-Wnon-virtual-dtor -Wno-long-long -Wundef \ + -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -Wcast-align \ + -Wconversion -Wall -W -Wpointer-arith \ + -Wwrite-strings -O2 -Wformat-security \ + -Wmissing-format-attribute -fno-exceptions -fno-check-new \ + -fno-common $CXXFLAGS" ;; +esac + +case `$PKG_CONFIG --version` in + 0.?|0.1[0-7]) + PC_REQUIRES_PRIVATE=""; + PC_REQUIRES="poppler = $VERSION";; + *) + PC_REQUIRES_PRIVATE="Requires.private: poppler = $VERSION"; + PC_REQUIRES="";; +esac + +AC_SUBST(PC_REQUIRES) +AC_SUBST(PC_REQUIRES_PRIVATE) + +AC_SUBST([POPPLER_MAJOR_VERSION],[poppler_version_major]) +AC_SUBST([POPPLER_MINOR_VERSION],[poppler_version_minor]) +AC_SUBST([POPPLER_MICRO_VERSION],[poppler_version_micro]) +AC_SUBST([POPPLER_VERSION],[poppler_version]) + +AC_OUTPUT([ +Makefile +goo/Makefile +fofi/Makefile +splash/Makefile +poppler/Makefile +utils/Makefile +glib/Makefile +glib/poppler-features.h +glib/reference/Makefile +glib/reference/version.xml +glib/demo/Makefile +test/Makefile +qt4/Makefile +qt4/src/Makefile +qt4/tests/Makefile +qt4/demos/Makefile +cpp/Makefile +cpp/poppler-version.h +cpp/tests/Makefile +poppler.pc +poppler-uninstalled.pc +poppler-cairo.pc +poppler-cairo-uninstalled.pc +poppler-splash.pc +poppler-splash-uninstalled.pc +poppler-glib.pc +poppler-glib-uninstalled.pc +poppler-qt4.pc +poppler-qt4-uninstalled.pc +poppler-cpp.pc +poppler-cpp-uninstalled.pc]) + + +echo "" +echo "Building poppler with support for:" +echo " font configuration: $with_font_configuration" +echo " splash output: $enable_splash_output" +echo " cairo output: $use_cairo" +echo " qt4 wrapper: $enable_poppler_qt4" +echo " glib wrapper: $use_glib" +echo " introspection: $found_introspection" +echo " cpp wrapper: $enable_poppler_cpp" +echo " use gtk-doc: $enable_gtk_doc" +echo " use libjpeg: $enable_libjpeg" +echo " use libpng: $enable_libpng" +echo " use libtiff: $enable_libtiff" +echo " use zlib: $enable_zlib" +echo " use libcurl: $enable_libcurl" +echo " use libopenjpeg: $enable_libopenjpeg" +echo " use cms: $enable_cms" +if test x$enable_cms = xyes;then + if test x$lcms1 = xyes;then + echo " with lcms1" + else + echo " with lcms2" + fi +fi +echo " command line utils: $enable_utils" +echo " test data dir: $TESTDATADIR" +echo "" + +if test x$enable_splash_output = xno -a x$enable_cairo_output = xno; then + echo " Warning: There is no rendering backend enabled" +fi + +if test x$enable_single_precision = xyes -a x$enable_fixedpoint = xyes; then + echo " Warning: Single precision and fixed point options should not be enabled at the same time" +fi + +if test x$enable_libjpeg != xyes; then + echo " Warning: Using libjpeg is recommended" +fi + +if test x$enable_zlib != xno; then + echo " Warning: Using zlib is not totally safe" +fi + +if test x$enable_libopenjpeg != xyes; then + echo " Warning: Using libopenjpeg is recommended" +fi diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt new file mode 100644 index 0000000..af61606 --- /dev/null +++ b/cpp/CMakeLists.txt @@ -0,0 +1,48 @@ +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) + +configure_file(poppler-version.h.in ${CMAKE_CURRENT_BINARY_DIR}/poppler-version.h @ONLY) + +add_subdirectory(tests) + +set(poppler_cpp_SRCS + PNMWriter.cc + poppler-document.cpp + poppler-embedded-file.cpp + poppler-font.cpp + poppler-global.cpp + poppler-image.cpp + poppler-page.cpp + poppler-page-renderer.cpp + poppler-page-transition.cpp + poppler-private.cpp + poppler-rectangle.cpp + poppler-toc.cpp + poppler-version.cpp +) + +add_library(poppler-cpp SHARED ${poppler_cpp_SRCS}) +set_target_properties(poppler-cpp PROPERTIES VERSION 0.2.0 SOVERSION 0) +target_link_libraries(poppler-cpp poppler ${ICONV_LIBRARIES}) +if(MSVC) +target_link_libraries(poppler-cpp ${poppler_LIBS}) +endif(MSVC) +target_link_libraries(poppler-cpp LINK_INTERFACE_LIBRARIES "") +install(TARGETS poppler-cpp RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) + +install(FILES + poppler-document.h + poppler-embedded-file.h + poppler-font.h + poppler-global.h + poppler-image.h + poppler-page.h + poppler-page-renderer.h + poppler-page-transition.h + poppler-rectangle.h + poppler-toc.h + ${CMAKE_CURRENT_BINARY_DIR}/poppler-version.h + DESTINATION include/poppler/cpp) + diff --git a/cpp/Makefile.am b/cpp/Makefile.am new file mode 100644 index 0000000..f381e58 --- /dev/null +++ b/cpp/Makefile.am @@ -0,0 +1,72 @@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + -I$(top_srcdir)/poppler \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) + +if BUILD_LIBJPEG +libjpeg_includes = $(LIBJPEG_CFLAGS) +endif + +if BUILD_LIBTIFF +libtiff_includes = $(LIBTIFF_CFLAGS) +endif + +if BUILD_LIBOPENJPEG +libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS) +endif + +if BUILD_LIBPNG +libpng_includes = $(LIBPNG_CFLAGS) +endif + +SUBDIRS = . tests + +poppler_includedir = $(includedir)/poppler/cpp +poppler_include_HEADERS = \ + poppler-document.h \ + poppler-embedded-file.h \ + poppler-font.h \ + poppler-global.h \ + poppler-image.h \ + poppler-page.h \ + poppler-page-renderer.h \ + poppler-page-transition.h \ + poppler-rectangle.h \ + poppler-toc.h \ + $(builddir)/poppler-version.h + +lib_LTLIBRARIES = libpoppler-cpp.la +libpoppler_cpp_la_SOURCES = \ + PNMWriter.cc \ + PNMWriter.h \ + poppler-document.cpp \ + poppler-document-private.h \ + poppler-embedded-file.cpp \ + poppler-embedded-file-private.h \ + poppler-font.cpp \ + poppler-global.cpp \ + poppler-image.cpp \ + poppler-image-private.h \ + poppler-page.cpp \ + poppler-page-private.h \ + poppler-page-renderer.cpp \ + poppler-page-transition.cpp \ + poppler-private.cpp \ + poppler-private.h \ + poppler-rectangle.cpp \ + poppler-toc.cpp \ + poppler-toc-private.h \ + poppler-version.cpp + +libpoppler_cpp_la_CXXFLAGS = \ + -Dpoppler_cpp_EXPORTS + +libpoppler_cpp_la_LIBADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(LIBICONV) + +libpoppler_cpp_la_LDFLAGS = -version-info 2:0:2 @create_shared_lib@ @auto_import_flags@ diff --git a/cpp/Makefile.in b/cpp/Makefile.in new file mode 100644 index 0000000..3dc0e24 --- /dev/null +++ b/cpp/Makefile.in @@ -0,0 +1,1051 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = cpp +DIST_COMMON = $(poppler_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/poppler-version.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = poppler-version.h +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(poppler_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libpoppler_cpp_la_DEPENDENCIES = \ + $(top_builddir)/poppler/libpoppler.la $(am__DEPENDENCIES_1) +am_libpoppler_cpp_la_OBJECTS = libpoppler_cpp_la-PNMWriter.lo \ + libpoppler_cpp_la-poppler-document.lo \ + libpoppler_cpp_la-poppler-embedded-file.lo \ + libpoppler_cpp_la-poppler-font.lo \ + libpoppler_cpp_la-poppler-global.lo \ + libpoppler_cpp_la-poppler-image.lo \ + libpoppler_cpp_la-poppler-page.lo \ + libpoppler_cpp_la-poppler-page-renderer.lo \ + libpoppler_cpp_la-poppler-page-transition.lo \ + libpoppler_cpp_la-poppler-private.lo \ + libpoppler_cpp_la-poppler-rectangle.lo \ + libpoppler_cpp_la-poppler-toc.lo \ + libpoppler_cpp_la-poppler-version.lo +libpoppler_cpp_la_OBJECTS = $(am_libpoppler_cpp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libpoppler_cpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) \ + $(libpoppler_cpp_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libpoppler_cpp_la_SOURCES) +DIST_SOURCES = $(libpoppler_cpp_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(poppler_include_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + -I$(top_srcdir)/poppler \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) + +@BUILD_LIBJPEG_TRUE@libjpeg_includes = $(LIBJPEG_CFLAGS) +@BUILD_LIBTIFF_TRUE@libtiff_includes = $(LIBTIFF_CFLAGS) +@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS) +@BUILD_LIBPNG_TRUE@libpng_includes = $(LIBPNG_CFLAGS) +SUBDIRS = . tests +poppler_includedir = $(includedir)/poppler/cpp +poppler_include_HEADERS = \ + poppler-document.h \ + poppler-embedded-file.h \ + poppler-font.h \ + poppler-global.h \ + poppler-image.h \ + poppler-page.h \ + poppler-page-renderer.h \ + poppler-page-transition.h \ + poppler-rectangle.h \ + poppler-toc.h \ + $(builddir)/poppler-version.h + +lib_LTLIBRARIES = libpoppler-cpp.la +libpoppler_cpp_la_SOURCES = \ + PNMWriter.cc \ + PNMWriter.h \ + poppler-document.cpp \ + poppler-document-private.h \ + poppler-embedded-file.cpp \ + poppler-embedded-file-private.h \ + poppler-font.cpp \ + poppler-global.cpp \ + poppler-image.cpp \ + poppler-image-private.h \ + poppler-page.cpp \ + poppler-page-private.h \ + poppler-page-renderer.cpp \ + poppler-page-transition.cpp \ + poppler-private.cpp \ + poppler-private.h \ + poppler-rectangle.cpp \ + poppler-toc.cpp \ + poppler-toc-private.h \ + poppler-version.cpp + +libpoppler_cpp_la_CXXFLAGS = \ + -Dpoppler_cpp_EXPORTS + +libpoppler_cpp_la_LIBADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(LIBICONV) + +libpoppler_cpp_la_LDFLAGS = -version-info 2:0:2 @create_shared_lib@ @auto_import_flags@ +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .cc .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign cpp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign cpp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +poppler-version.h: $(top_builddir)/config.status $(srcdir)/poppler-version.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libpoppler-cpp.la: $(libpoppler_cpp_la_OBJECTS) $(libpoppler_cpp_la_DEPENDENCIES) $(EXTRA_libpoppler_cpp_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libpoppler_cpp_la_LINK) -rpath $(libdir) $(libpoppler_cpp_la_OBJECTS) $(libpoppler_cpp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-PNMWriter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-document.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-global.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-image.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-page.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-private.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-toc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_cpp_la-poppler-version.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libpoppler_cpp_la-PNMWriter.lo: PNMWriter.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-PNMWriter.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-PNMWriter.Tpo -c -o libpoppler_cpp_la-PNMWriter.lo `test -f 'PNMWriter.cc' || echo '$(srcdir)/'`PNMWriter.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-PNMWriter.Tpo $(DEPDIR)/libpoppler_cpp_la-PNMWriter.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PNMWriter.cc' object='libpoppler_cpp_la-PNMWriter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-PNMWriter.lo `test -f 'PNMWriter.cc' || echo '$(srcdir)/'`PNMWriter.cc + +libpoppler_cpp_la-poppler-document.lo: poppler-document.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-document.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-document.Tpo -c -o libpoppler_cpp_la-poppler-document.lo `test -f 'poppler-document.cpp' || echo '$(srcdir)/'`poppler-document.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-document.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-document.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-document.cpp' object='libpoppler_cpp_la-poppler-document.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-document.lo `test -f 'poppler-document.cpp' || echo '$(srcdir)/'`poppler-document.cpp + +libpoppler_cpp_la-poppler-embedded-file.lo: poppler-embedded-file.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-embedded-file.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Tpo -c -o libpoppler_cpp_la-poppler-embedded-file.lo `test -f 'poppler-embedded-file.cpp' || echo '$(srcdir)/'`poppler-embedded-file.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-embedded-file.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-embedded-file.cpp' object='libpoppler_cpp_la-poppler-embedded-file.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-embedded-file.lo `test -f 'poppler-embedded-file.cpp' || echo '$(srcdir)/'`poppler-embedded-file.cpp + +libpoppler_cpp_la-poppler-font.lo: poppler-font.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-font.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-font.Tpo -c -o libpoppler_cpp_la-poppler-font.lo `test -f 'poppler-font.cpp' || echo '$(srcdir)/'`poppler-font.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-font.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-font.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-font.cpp' object='libpoppler_cpp_la-poppler-font.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-font.lo `test -f 'poppler-font.cpp' || echo '$(srcdir)/'`poppler-font.cpp + +libpoppler_cpp_la-poppler-global.lo: poppler-global.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-global.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-global.Tpo -c -o libpoppler_cpp_la-poppler-global.lo `test -f 'poppler-global.cpp' || echo '$(srcdir)/'`poppler-global.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-global.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-global.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-global.cpp' object='libpoppler_cpp_la-poppler-global.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-global.lo `test -f 'poppler-global.cpp' || echo '$(srcdir)/'`poppler-global.cpp + +libpoppler_cpp_la-poppler-image.lo: poppler-image.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-image.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-image.Tpo -c -o libpoppler_cpp_la-poppler-image.lo `test -f 'poppler-image.cpp' || echo '$(srcdir)/'`poppler-image.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-image.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-image.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-image.cpp' object='libpoppler_cpp_la-poppler-image.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-image.lo `test -f 'poppler-image.cpp' || echo '$(srcdir)/'`poppler-image.cpp + +libpoppler_cpp_la-poppler-page.lo: poppler-page.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-page.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-page.Tpo -c -o libpoppler_cpp_la-poppler-page.lo `test -f 'poppler-page.cpp' || echo '$(srcdir)/'`poppler-page.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-page.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-page.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-page.cpp' object='libpoppler_cpp_la-poppler-page.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-page.lo `test -f 'poppler-page.cpp' || echo '$(srcdir)/'`poppler-page.cpp + +libpoppler_cpp_la-poppler-page-renderer.lo: poppler-page-renderer.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-page-renderer.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Tpo -c -o libpoppler_cpp_la-poppler-page-renderer.lo `test -f 'poppler-page-renderer.cpp' || echo '$(srcdir)/'`poppler-page-renderer.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-page-renderer.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-page-renderer.cpp' object='libpoppler_cpp_la-poppler-page-renderer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-page-renderer.lo `test -f 'poppler-page-renderer.cpp' || echo '$(srcdir)/'`poppler-page-renderer.cpp + +libpoppler_cpp_la-poppler-page-transition.lo: poppler-page-transition.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-page-transition.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Tpo -c -o libpoppler_cpp_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cpp' || echo '$(srcdir)/'`poppler-page-transition.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-page-transition.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-page-transition.cpp' object='libpoppler_cpp_la-poppler-page-transition.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cpp' || echo '$(srcdir)/'`poppler-page-transition.cpp + +libpoppler_cpp_la-poppler-private.lo: poppler-private.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-private.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-private.Tpo -c -o libpoppler_cpp_la-poppler-private.lo `test -f 'poppler-private.cpp' || echo '$(srcdir)/'`poppler-private.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-private.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-private.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-private.cpp' object='libpoppler_cpp_la-poppler-private.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-private.lo `test -f 'poppler-private.cpp' || echo '$(srcdir)/'`poppler-private.cpp + +libpoppler_cpp_la-poppler-rectangle.lo: poppler-rectangle.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-rectangle.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Tpo -c -o libpoppler_cpp_la-poppler-rectangle.lo `test -f 'poppler-rectangle.cpp' || echo '$(srcdir)/'`poppler-rectangle.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-rectangle.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-rectangle.cpp' object='libpoppler_cpp_la-poppler-rectangle.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-rectangle.lo `test -f 'poppler-rectangle.cpp' || echo '$(srcdir)/'`poppler-rectangle.cpp + +libpoppler_cpp_la-poppler-toc.lo: poppler-toc.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-toc.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-toc.Tpo -c -o libpoppler_cpp_la-poppler-toc.lo `test -f 'poppler-toc.cpp' || echo '$(srcdir)/'`poppler-toc.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-toc.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-toc.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-toc.cpp' object='libpoppler_cpp_la-poppler-toc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-toc.lo `test -f 'poppler-toc.cpp' || echo '$(srcdir)/'`poppler-toc.cpp + +libpoppler_cpp_la-poppler-version.lo: poppler-version.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_cpp_la-poppler-version.lo -MD -MP -MF $(DEPDIR)/libpoppler_cpp_la-poppler-version.Tpo -c -o libpoppler_cpp_la-poppler-version.lo `test -f 'poppler-version.cpp' || echo '$(srcdir)/'`poppler-version.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_cpp_la-poppler-version.Tpo $(DEPDIR)/libpoppler_cpp_la-poppler-version.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-version.cpp' object='libpoppler_cpp_la-poppler-version.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_cpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_cpp_la-poppler-version.lo `test -f 'poppler-version.cpp' || echo '$(srcdir)/'`poppler-version.cpp + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-poppler_includeHEADERS: $(poppler_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \ + done + +uninstall-poppler_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(poppler_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-poppler_includeHEADERS + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES \ + uninstall-poppler_includeHEADERS + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-poppler_includeHEADERS install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-libLTLIBRARIES uninstall-poppler_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/cpp/PNMWriter.cc b/cpp/PNMWriter.cc new file mode 100644 index 0000000..a2b9a77 --- /dev/null +++ b/cpp/PNMWriter.cc @@ -0,0 +1,119 @@ +//======================================================================== +// +// PNMWriter.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2011 Pino Toscano <pino@kde.org> +// +//======================================================================== + +#include "PNMWriter.h" + +#include <vector> + +using namespace poppler; + +PNMWriter::PNMWriter(OutFormat formatArg) + : format(formatArg) + , file(0) + , imgWidth(0) + , rowSize(0) +{ +} + +PNMWriter::~PNMWriter() +{ +} + +bool PNMWriter::init(FILE *f, int width, int height, int /*hDPI*/, int /*vDPI*/) +{ + file = f; + imgWidth = width; + + switch (format) + { + case PNMWriter::PBM: + fprintf(file, "P4\n%d %d\n", width, height); + rowSize = (width + 7) >> 3; + break; + case PNMWriter::PGM: + fprintf(file, "P5\n%d %d\n255\n", width, height); + rowSize = width; + break; + case PNMWriter::PPM: + fprintf(file, "P6\n%d %d\n255\n", width, height); + rowSize = width * 3; + break; + } + + return true; +} + +bool PNMWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + bool ret = true; + for (int i = 0; ret && (i < rowCount); ++i) { + ret = writeRow(&(rowPointers[i])); + } + + return ret; +} + +bool PNMWriter::writeRow(unsigned char **row) +{ + std::vector<unsigned char> newRow; + unsigned char *rowPtr = *row; + unsigned char *p = *row; + + switch (format) + { + case PNMWriter::PBM: + newRow.resize(rowSize, 0); + rowPtr = &newRow[0]; + for (int i = 0; i < imgWidth; ++i) { + unsigned char pixel = p[0]; + if (p[0] == p[1] && p[1] == p[2]) { + // gray, stored already + } else { + pixel = static_cast<unsigned char>((p[0] * 11 + p[1] * 16 + p[2] * 5) / 32); + } + if (pixel < 0x7F) { + *(rowPtr + (i >> 3)) |= (1 << (i & 7)); + } + p += 3; + } + break; + case PNMWriter::PGM: + newRow.resize(rowSize, 0); + rowPtr = &newRow[0]; + for (int i = 0; i < imgWidth; ++i) { + if (p[0] == p[1] && p[1] == p[2]) { + // gray, store directly + newRow[i] = p[0]; + } else { + // calculate the gray value + newRow[i] = static_cast<unsigned char>((p[0] * 11 + p[1] * 16 + p[2] * 5) / 32); + } + p += 3; + } + break; + case PNMWriter::PPM: + break; + } + + if (int(fwrite(rowPtr, 1, rowSize, file)) < rowSize) { + return false; + } + + return true; +} + +bool PNMWriter::close() +{ + file = 0; + imgWidth = 0; + rowSize = 0; + + return true; +} diff --git a/cpp/PNMWriter.h b/cpp/PNMWriter.h new file mode 100644 index 0000000..8d8da2d --- /dev/null +++ b/cpp/PNMWriter.h @@ -0,0 +1,43 @@ +//======================================================================== +// +// PNMWriter.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2011 Pino Toscano <pino@kde.org> +// +//======================================================================== + +#ifndef PNMWRITER_H +#define PNMWRITER_H + +#include "ImgWriter.h" + +namespace poppler +{ + +class PNMWriter : public ImgWriter +{ + public: + enum OutFormat { PBM, PGM, PPM }; + + PNMWriter(OutFormat formatArg); + ~PNMWriter(); + + bool init(FILE *f, int width, int height, int hDPI, int vDPI); + + bool writePointers(unsigned char **rowPointers, int rowCount); + bool writeRow(unsigned char **row); + + bool close(); + + private: + const OutFormat format; + FILE *file; + int imgWidth; + int rowSize; +}; + +} + +#endif diff --git a/cpp/poppler-document-private.h b/cpp/poppler-document-private.h new file mode 100644 index 0000000..5ca9e14 --- /dev/null +++ b/cpp/poppler-document-private.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2009-2011, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_DOCUMENT_PRIVATE_H +#define POPPLER_DOCUMENT_PRIVATE_H + +#include "poppler-global.h" + +#include "poppler-config.h" +#include "GooString.h" +#include "PDFDoc.h" + +#include <vector> + +namespace poppler +{ + +class document; +class embedded_file; + +class initer +{ +public: + initer(); + ~initer(); + +private: + static unsigned int count; +}; + +class document_private : private initer +{ +public: + document_private(GooString *file_path, const std::string &owner_password, + const std::string &user_password); + document_private(byte_array *file_data, const std::string &owner_password, + const std::string &user_password); + document_private(const char *file_data, int file_data_length, + const std::string &owner_password, + const std::string &user_password); + ~document_private(); + + static document* check_document(document_private *doc, byte_array *file_data); + + PDFDoc *doc; + byte_array doc_data; + const char *raw_doc_data; + int raw_doc_data_length; + bool is_locked; + std::vector<embedded_file *> embedded_files; +}; + +} + +#endif diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp new file mode 100644 index 0000000..1c24b47 --- /dev/null +++ b/cpp/poppler-document.cpp @@ -0,0 +1,664 @@ +/* + * Copyright (C) 2009-2011, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-document.h" +#include "poppler-embedded-file.h" +#include "poppler-page.h" +#include "poppler-toc.h" + +#include "poppler-document-private.h" +#include "poppler-embedded-file-private.h" +#include "poppler-private.h" +#include "poppler-toc-private.h" + +#include "Catalog.h" +#include "ErrorCodes.h" +#include "GlobalParams.h" +#include "Outline.h" + +#include <algorithm> +#include <iterator> +#include <memory> + +using namespace poppler; + +unsigned int poppler::initer::count = 0U; + +initer::initer() +{ + if (!count) { + globalParams = new GlobalParams(); + setErrorCallback(detail::error_function, NULL); + } + count++; +} + +initer::~initer() +{ + if (count > 0) { + --count; + if (!count) { + delete globalParams; + globalParams = 0; + } + } +} + + +document_private::document_private(GooString *file_path, const std::string &owner_password, + const std::string &user_password) + : initer() + , doc(0) + , raw_doc_data(0) + , raw_doc_data_length(0) + , is_locked(false) +{ + GooString goo_owner_password(owner_password.c_str()); + GooString goo_user_password(user_password.c_str()); + doc = new PDFDoc(file_path, &goo_owner_password, &goo_user_password); +} + +document_private::document_private(byte_array *file_data, + const std::string &owner_password, + const std::string &user_password) + : initer() + , doc(0) + , raw_doc_data(0) + , raw_doc_data_length(0) + , is_locked(false) +{ + Object obj; + obj.initNull(); + file_data->swap(doc_data); + MemStream *memstr = new MemStream(&doc_data[0], 0, doc_data.size(), &obj); + GooString goo_owner_password(owner_password.c_str()); + GooString goo_user_password(user_password.c_str()); + doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password); +} + +document_private::document_private(const char *file_data, int file_data_length, + const std::string &owner_password, + const std::string &user_password) + : initer() + , doc(0) + , raw_doc_data(file_data) + , raw_doc_data_length(file_data_length) + , is_locked(false) +{ + Object obj; + obj.initNull(); + MemStream *memstr = new MemStream(const_cast<char *>(raw_doc_data), 0, raw_doc_data_length, &obj); + GooString goo_owner_password(owner_password.c_str()); + GooString goo_user_password(user_password.c_str()); + doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password); +} + +document_private::~document_private() +{ + delete_all(embedded_files); + + delete doc; +} + +document* document_private::check_document(document_private *doc, byte_array *file_data) +{ + if (doc->doc->isOk() || doc->doc->getErrorCode() == errEncrypted) { + if (doc->doc->getErrorCode() == errEncrypted) { + doc->is_locked = true; + } + return new document(*doc); + } else { + // put back the document data where it was before + if (file_data) { + file_data->swap(doc->doc_data); + } + delete doc; + } + return 0; +} + +/** + \class poppler::document poppler-document.h "poppler/cpp/poppler-document.h" + + Represents a PDF %document. + */ + +/** + \enum poppler::document::page_mode_enum + + The various page modes available in a PDF %document. +*/ +/** + \var poppler::document::page_mode_enum poppler::document::use_none + + The %document specifies no particular page mode. +*/ +/** + \var poppler::document::page_mode_enum poppler::document::use_outlines + + The %document specifies its TOC (table of contents) should be open. +*/ +/** + \var poppler::document::page_mode_enum poppler::document::use_thumbs + + The %document specifies that should be open a view of the thumbnails of its + pages. +*/ +/** + \var poppler::document::page_mode_enum poppler::document::fullscreen + + The %document specifies it wants to be open in a fullscreen mode. +*/ +/** + \var poppler::document::page_mode_enum poppler::document::use_oc + + The %document specifies that should be open a view of its Optional Content + (also known as layers). +*/ +/** + \var poppler::document::page_mode_enum poppler::document::use_attach + + The %document specifies that should be open a view of its %document-level + attachments. + */ + + +document::document(document_private &dd) + : d(&dd) +{ +} + +document::~document() +{ + delete d; +} + +/** + \returns whether the current %document is locked + */ +bool document::is_locked() const +{ + return d->is_locked; +} + +/** + Unlocks the current doocument, if locked. + + \returns the new locking status of the document + */ +bool document::unlock(const std::string &owner_password, const std::string &user_password) +{ + if (d->is_locked) { + document_private *newdoc = 0; + if (d->doc_data.size() > 0) { + newdoc = new document_private(&d->doc_data, + owner_password, user_password); + } else if (d->raw_doc_data) { + newdoc = new document_private(d->raw_doc_data, d->raw_doc_data_length, + owner_password, user_password); + } else { + newdoc = new document_private(new GooString(d->doc->getFileName()), + owner_password, user_password); + } + if (!newdoc->doc->isOk()) { + d->doc_data.swap(newdoc->doc_data); + delete newdoc; + } else { + delete d; + d = newdoc; + d->is_locked = false; + } + } + return d->is_locked; +} + +/** + \returns the eventual page mode specified by the current PDF %document + */ +document::page_mode_enum document::page_mode() const +{ + switch (d->doc->getCatalog()->getPageMode()) { + case Catalog::pageModeNone: + return use_none; + case Catalog::pageModeOutlines: + return use_outlines; + case Catalog::pageModeThumbs: + return use_thumbs; + case Catalog::pageModeFullScreen: + return fullscreen; + case Catalog::pageModeOC: + return use_oc; + case Catalog::pageModeAttach: + return use_attach; + default: + return use_none; + } +} + +/** + \returns the eventual page layout specified by the current PDF %document + */ +document::page_layout_enum document::page_layout() const +{ + switch (d->doc->getCatalog()->getPageLayout()) { + case Catalog::pageLayoutNone: + return no_layout; + case Catalog::pageLayoutSinglePage: + return single_page; + case Catalog::pageLayoutOneColumn: + return one_column; + case Catalog::pageLayoutTwoColumnLeft: + return two_column_left; + case Catalog::pageLayoutTwoColumnRight: + return two_column_right; + case Catalog::pageLayoutTwoPageLeft: + return two_page_left; + case Catalog::pageLayoutTwoPageRight: + return two_page_right; + default: + return no_layout; + } +} + +/** + Gets the version of the current PDF %document. + + Example: + \code + poppler::document *doc = ...; + // for example, if the document is PDF 1.6: + int major = 0, minor = 0; + doc->get_pdf_version(&major, &minor); + // major == 1 + // minor == 6 + \endcode + + \param major if not NULL, will be set to the "major" number of the version + \param minor if not NULL, will be set to the "minor" number of the version + */ +void document::get_pdf_version(int *major, int *minor) const +{ + if (major) { + *major = d->doc->getPDFMajorVersion(); + } + if (minor) { + *minor = d->doc->getPDFMinorVersion(); + } +} + +/** + \returns all the information keys available in the %document + \see info_key, info_date + */ +std::vector<std::string> document::info_keys() const +{ + if (d->is_locked) { + return std::vector<std::string>(); + } + + Object info; + if (!d->doc->getDocInfo(&info)->isDict()) { + info.free(); + return std::vector<std::string>(); + } + + Dict *info_dict = info.getDict(); + std::vector<std::string> keys(info_dict->getLength()); + for (int i = 0; i < info_dict->getLength(); ++i) { + keys[i] = std::string(info_dict->getKey(i)); + } + + info.free(); + return keys; +} + +/** + Gets the value of the specified \p key of the document information. + + \returns the value for the \p key, or an empty string if not available + \see info_keys, info_date + */ +ustring document::info_key(const std::string &key) const +{ + if (d->is_locked) { + return ustring(); + } + + Object info; + if (!d->doc->getDocInfo(&info)->isDict()) { + info.free(); + return ustring(); + } + + Dict *info_dict = info.getDict(); + Object obj; + ustring result; + if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) { + result = detail::unicode_GooString_to_ustring(obj.getString()); + } + obj.free(); + info.free(); + return result; +} + +/** + Gets the time_t value value of the specified \p key of the document + information. + + \returns the time_t value for the \p key + \see info_keys, info_date + */ +time_type document::info_date(const std::string &key) const +{ + if (d->is_locked) { + return time_type(-1); + } + + Object info; + if (!d->doc->getDocInfo(&info)->isDict()) { + info.free(); + return time_type(-1); + } + + Dict *info_dict = info.getDict(); + Object obj; + time_type result = time_type(-1); + if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) { + result = detail::convert_date(obj.getString()->getCString()); + } + obj.free(); + info.free(); + return result; +} + +/** + \returns whether the document is encrypted + */ +bool document::is_encrypted() const +{ + return d->doc->isEncrypted(); +} + +/** + \returns whether the document is linearized + */ +bool document::is_linearized() const +{ + return d->doc->isLinearized(); +} + +/** + Check for available "document permission". + + \returns whether the specified permission is allowed + */ +bool document::has_permission(permission_enum which) const +{ + switch (which) { + case perm_print: + return d->doc->okToPrint(); + case perm_change: + return d->doc->okToChange(); + case perm_copy: + return d->doc->okToCopy(); + case perm_add_notes: + return d->doc->okToAddNotes(); + case perm_fill_forms: + return d->doc->okToFillForm(); + case perm_accessibility: + return d->doc->okToAccessibility(); + case perm_assemble: + return d->doc->okToAssemble(); + case perm_print_high_resolution: + return d->doc->okToPrintHighRes(); + } + return true; +} + +/** + Reads the %document metadata string. + + \return the %document metadata string + */ +ustring document::metadata() const +{ + std::auto_ptr<GooString> md(d->doc->getCatalog()->readMetadata()); + if (md.get()) { + return detail::unicode_GooString_to_ustring(md.get()); + } + return ustring(); +} + +/** + Gets the IDs of the current PDF %document, if available. + + \param permanent_id if not NULL, will be set to the permanent ID of the %document + \param update_id if not NULL, will be set to the update ID of the %document + + \returns whether the document has the IDs + + \since 0.16 + */ +bool document::get_pdf_id(std::string *permanent_id, std::string *update_id) const +{ + GooString goo_permanent_id; + GooString goo_update_id; + + if (!d->doc->getID(permanent_id ? &goo_permanent_id : 0, update_id ? &goo_update_id : 0)) { + return false; + } + + if (permanent_id) { + *permanent_id = goo_permanent_id.getCString(); + } + if (update_id) { + *update_id = goo_update_id.getCString(); + } + + return true; +} + +/** + Document page count. + + \returns the number of pages of the document + */ +int document::pages() const +{ + return d->doc->getNumPages(); +} + +/** + Document page by label reading. + + This creates a new page representing the %document %page whose label is the + specified \p label. If there is no page with that \p label, NULL is returned. + + \returns a new page object or NULL + */ +page* document::create_page(const ustring &label) const +{ + std::auto_ptr<GooString> goolabel(detail::ustring_to_unicode_GooString(label)); + int index = 0; + + if (!d->doc->getCatalog()->labelToIndex(goolabel.get(), &index)) { + return 0; + } + return create_page(index); +} + +/** + Document page by index reading. + + This creates a new page representing the \p index -th %page of the %document. + \note the page indexes are in the range [0, pages()[. + + \returns a new page object or NULL + */ +page* document::create_page(int index) const +{ + return index >= 0 && index < d->doc->getNumPages() ? new page(d, index) : 0; +} + +/** + Reads all the font information of the %document. + + \note this can be slow for big documents; prefer the use of a font_iterator + to read incrementally page by page + \see create_font_iterator + */ +std::vector<font_info> document::fonts() const +{ + std::vector<font_info> result; + font_iterator it(0, d); + while (it.has_next()) { + const std::vector<font_info> l = it.next(); + std::copy(l.begin(), l.end(), std::back_inserter(result)); + } + return result; +} + +/** + Creates a new font iterator. + + This creates a new font iterator for reading the font information of the + %document page by page, starting at the specified \p start_page (0 if not + specified). + + \returns a new font iterator + */ +font_iterator* document::create_font_iterator(int start_page) const +{ + return new font_iterator(start_page, d); +} + +/** + Reads the TOC (table of contents) of the %document. + + \returns a new toc object if a TOC is available, NULL otherwise + */ +toc* document::create_toc() const +{ + return toc_private::load_from_outline(d->doc->getOutline()); +} + +/** + Reads whether the current document has %document-level embedded files + (attachments). + + This is a very fast way to know whether there are embedded files (also known + as "attachments") at the %document-level. Note this does not take into account + files embedded in other ways (e.g. to annotations). + + \returns whether the document has embedded files + */ +bool document::has_embedded_files() const +{ + return d->doc->getCatalog()->numEmbeddedFiles() > 0; +} + +/** + Reads all the %document-level embedded files of the %document. + + \returns the %document-level embedded files + */ +std::vector<embedded_file *> document::embedded_files() const +{ + if (d->is_locked) { + return std::vector<embedded_file *>(); + } + + if (d->embedded_files.empty() && d->doc->getCatalog()->numEmbeddedFiles() > 0) { + const int num = d->doc->getCatalog()->numEmbeddedFiles(); + d->embedded_files.resize(num); + for (int i = 0; i < num; ++i) { + FileSpec *fs = d->doc->getCatalog()->embeddedFile(i); + d->embedded_files[i] = embedded_file_private::create(fs); + } + } + return d->embedded_files; +} + +/** + Tries to load a PDF %document from the specified file. + + \param file_name the file to open + \returns a new document if the load succeeded (even if the document is locked), + NULL otherwise + */ +document* document::load_from_file(const std::string &file_name, + const std::string &owner_password, + const std::string &user_password) +{ + document_private *doc = new document_private( + new GooString(file_name.c_str()), + owner_password, user_password); + return document_private::check_document(doc, 0); +} + +/** + Tries to load a PDF %document from the specified data. + + \note if the loading succeeds, the document takes ownership of the + \p file_data (swap()ing it) + + \param file_data the data representing a document to open + \returns a new document if the load succeeded (even if the document is locked), + NULL otherwise + */ +document* document::load_from_data(byte_array *file_data, + const std::string &owner_password, + const std::string &user_password) +{ + if (!file_data || file_data->size() < 10) { + return 0; + } + + document_private *doc = new document_private( + file_data, owner_password, user_password); + return document_private::check_document(doc, file_data); +} + +/** + Tries to load a PDF %document from the specified data buffer. + + \note the buffer must remain valid for the whole lifetime of the returned + document + + \param file_data the data buffer representing a document to open + \param file_data_length the length of the data buffer + + \returns a new document if the load succeeded (even if the document is locked), + NULL otherwise + + \since 0.16 + */ +document* document::load_from_raw_data(const char *file_data, + int file_data_length, + const std::string &owner_password, + const std::string &user_password) +{ + if (!file_data || file_data_length < 10) { + return 0; + } + + document_private *doc = new document_private( + file_data, file_data_length, + owner_password, user_password); + return document_private::check_document(doc, 0); +} diff --git a/cpp/poppler-document.h b/cpp/poppler-document.h new file mode 100644 index 0000000..dfae398 --- /dev/null +++ b/cpp/poppler-document.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_DOCUMENT_H +#define POPPLER_DOCUMENT_H + +#include "poppler-global.h" +#include "poppler-font.h" + +namespace poppler +{ + +class document_private; +class embedded_file; +class page; +class toc; + +class POPPLER_CPP_EXPORT document : public poppler::noncopyable +{ +public: + enum page_mode_enum { + use_none, + use_outlines, + use_thumbs, + fullscreen, + use_oc, + use_attach + }; + + enum page_layout_enum { + no_layout, + single_page, + one_column, + two_column_left, + two_column_right, + two_page_left, + two_page_right + }; + + ~document(); + + bool is_locked() const; + bool unlock(const std::string &owner_password, const std::string &user_password); + + page_mode_enum page_mode() const; + page_layout_enum page_layout() const; + void get_pdf_version(int *major, int *minor) const; + std::vector<std::string> info_keys() const; + ustring info_key(const std::string &key) const; + time_type info_date(const std::string &key) const; + bool is_encrypted() const; + bool is_linearized() const; + bool has_permission(permission_enum which) const; + ustring metadata() const; + bool get_pdf_id(std::string *permanent_id, std::string *update_id) const; + + int pages() const; + page* create_page(const ustring &label) const; + page* create_page(int index) const; + + std::vector<font_info> fonts() const; + font_iterator* create_font_iterator(int start_page = 0) const; + + toc* create_toc() const; + + bool has_embedded_files() const; + std::vector<embedded_file *> embedded_files() const; + + static document* load_from_file(const std::string &file_name, + const std::string &owner_password = std::string(), + const std::string &user_password = std::string()); + static document* load_from_data(byte_array *file_data, + const std::string &owner_password = std::string(), + const std::string &user_password = std::string()); + static document* load_from_raw_data(const char *file_data, + int file_data_length, + const std::string &owner_password = std::string(), + const std::string &user_password = std::string()); + +private: + document(document_private &dd); + + document_private *d; + friend class document_private; +}; + +} + +#endif diff --git a/cpp/poppler-embedded-file-private.h b/cpp/poppler-embedded-file-private.h new file mode 100644 index 0000000..1b9b633 --- /dev/null +++ b/cpp/poppler-embedded-file-private.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2009, 2011, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_EMBEDDED_FILE_PRIVATE_H +#define POPPLER_EMBEDDED_FILE_PRIVATE_H + +class FileSpec; + +namespace poppler +{ + +class embedded_file_private +{ +public: + embedded_file_private(FileSpec *fs); + ~embedded_file_private(); + + static embedded_file* create(FileSpec *fs); + + FileSpec *file_spec; +}; + +} + +#endif diff --git a/cpp/poppler-embedded-file.cpp b/cpp/poppler-embedded-file.cpp new file mode 100644 index 0000000..2c5d077 --- /dev/null +++ b/cpp/poppler-embedded-file.cpp @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2009-2011, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-embedded-file.h" + +#include "poppler-embedded-file-private.h" +#include "poppler-private.h" + +#include "Object.h" +#include "Stream.h" +#include "Catalog.h" +#include "FileSpec.h" + +using namespace poppler; + +embedded_file_private::embedded_file_private(FileSpec *fs) + : file_spec(fs) +{ +} + +embedded_file_private::~embedded_file_private() +{ + delete file_spec; +} + +embedded_file* embedded_file_private::create(FileSpec *fs) +{ + return new embedded_file(*new embedded_file_private(fs)); +} + +/** + \class poppler::embedded_file poppler-embedded-file.h "poppler/cpp/poppler-embedded-file.h" + + Represents a file embedded in a PDF %document. + */ + + +embedded_file::embedded_file(embedded_file_private &dd) + : d(&dd) +{ +} + +/** + Destroys the embedded file. + */ +embedded_file::~embedded_file() +{ + delete d; +} + +/** + \returns whether the embedded file is valid + */ +bool embedded_file::is_valid() const +{ + return d->file_spec->isOk(); +} + +/** + \returns the name of the embedded file + */ +std::string embedded_file::name() const +{ + GooString *goo = d->file_spec->getFileName(); + return goo ? std::string(goo->getCString()) : std::string(); +} + +/** + \returns the description of the embedded file + */ +ustring embedded_file::description() const +{ + GooString *goo = d->file_spec->getDescription(); + return goo ? detail::unicode_GooString_to_ustring(goo) : ustring(); +} + +/** + \note this is not always available in the PDF %document, in that case this + will return \p -1. + + \returns the size of the embedded file, if known + */ +int embedded_file::size() const +{ + return d->file_spec->getEmbeddedFile()->size(); +} + +/** + \returns the time_t representing the modification date of the embedded file, + if available + */ +time_type embedded_file::modification_date() const +{ + GooString *goo = d->file_spec->getEmbeddedFile()->modDate(); + return goo ? detail::convert_date(goo->getCString()) : time_type(-1); +} + +/** + \returns the time_t representing the creation date of the embedded file, + if available + */ +time_type embedded_file::creation_date() const +{ + GooString *goo = d->file_spec->getEmbeddedFile()->createDate(); + return goo ? detail::convert_date(goo->getCString()) : time_type(-1); +} + +/** + \returns the checksum of the embedded file + */ +byte_array embedded_file::checksum() const +{ + GooString *cs = d->file_spec->getEmbeddedFile()->checksum(); + if (!cs) { + return byte_array(); + } + const char *ccs = cs->getCString(); + byte_array data(cs->getLength()); + for (int i = 0; i < cs->getLength(); ++i) { + data[i] = ccs[i]; + } + return data; +} + +/** + \returns the MIME type of the embedded file, if available + */ +std::string embedded_file::mime_type() const +{ + GooString *goo = d->file_spec->getEmbeddedFile()->mimeType(); + return goo ? std::string(goo->getCString()) : std::string(); +} + +/** + Reads all the data of the embedded file. + + \returns the data of the embedded file + */ +byte_array embedded_file::data() const +{ + if (!is_valid()) { + return byte_array(); + } + Stream *stream = d->file_spec->getEmbeddedFile()->stream(); + if (!stream) { + return byte_array(); + } + + stream->reset(); + byte_array ret(1024); + size_t data_len = 0; + int i; + while ((i = stream->getChar()) != EOF) { + if (data_len == ret.size()) { + ret.resize(ret.size() * 2); + } + ret[data_len] = (char)i; + ++data_len; + } + ret.resize(data_len); + return ret; +} diff --git a/cpp/poppler-embedded-file.h b/cpp/poppler-embedded-file.h new file mode 100644 index 0000000..307fdd6 --- /dev/null +++ b/cpp/poppler-embedded-file.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_EMBEDDED_FILE_H +#define POPPLER_EMBEDDED_FILE_H + +#include "poppler-global.h" + +#include <vector> + +namespace poppler +{ + +class embedded_file_private; + +class POPPLER_CPP_EXPORT embedded_file : public poppler::noncopyable +{ +public: + ~embedded_file(); + + bool is_valid() const; + std::string name() const; + ustring description() const; + int size() const; + time_type modification_date() const; + time_type creation_date() const; + byte_array checksum() const; + std::string mime_type() const; + byte_array data() const; + +private: + embedded_file(embedded_file_private &dd); + + embedded_file_private *d; + friend class embedded_file_private; +}; + +} + +#endif diff --git a/cpp/poppler-font.cpp b/cpp/poppler-font.cpp new file mode 100644 index 0000000..ab3b409 --- /dev/null +++ b/cpp/poppler-font.cpp @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-font.h" + +#include "poppler-document-private.h" + +#include "FontInfo.h" + +using namespace poppler; + +class poppler::font_info_private +{ +public: + font_info_private() + : type(font_info::unknown) + , is_embedded(false) + , is_subset(false) + { + } + font_info_private(FontInfo *fi) + : type((font_info::type_enum)fi->getType()) + , is_embedded(fi->getEmbedded()) + , is_subset(fi->getSubset()) + , emb_ref(fi->getEmbRef()) + { + if (fi->getName()) { + font_name = fi->getName()->getCString(); + } + if (fi->getFile()) { + font_file = fi->getFile()->getCString(); + } + } + + std::string font_name; + std::string font_file; + font_info::type_enum type : 5; + bool is_embedded : 1; + bool is_subset : 1; + Ref emb_ref; +}; + + +class poppler::font_iterator_private +{ +public: + font_iterator_private(int start_page, document_private *dd) + : font_info_scanner(dd->doc, start_page) + , total_pages(dd->doc->getNumPages()) + , current_page((std::max)(start_page, 0)) + { + } + ~font_iterator_private() + { + } + + FontInfoScanner font_info_scanner; + int total_pages; + int current_page; +}; + +/** + \class poppler::font_info poppler-font.h "poppler/cpp/poppler-font.h" + + The information about a font used in a PDF %document. + */ + +/** + \enum poppler::font_info::type_enum + + The various types of fonts available in a PDF %document. +*/ + + +/** + Constructs an invalid font information. + */ +font_info::font_info() + : d(new font_info_private()) +{ +} + +font_info::font_info(font_info_private &dd) + : d(&dd) +{ +} + +/** + Copy constructor. + */ +font_info::font_info(const font_info &fi) + : d(new font_info_private(*fi.d)) +{ +} + +/** + Destructor. + */ +font_info::~font_info() +{ + delete d; +} + +/** + \returns the name of the font + */ +std::string font_info::name() const +{ + return d->font_name; +} + +/** + \returns the file name of the font, in case the font is not embedded nor subset + */ +std::string font_info::file() const +{ + return d->font_file; +} + +/** + \returns whether the font is totally embedded in the %document + */ +bool font_info::is_embedded() const +{ + return d->is_embedded; +} + +/** + \returns whether there is a subset of the font embedded in the %document + */ +bool font_info::is_subset() const +{ + return d->is_subset; +} + +/** + \returns the type of the font + */ +font_info::type_enum font_info::type() const +{ + return d->type; +} + +/** + Assignment operator. + */ +font_info& font_info::operator=(const font_info &fi) +{ + if (this != &fi) { + *d = *fi.d; + } + return *this; +} + +/** + \class poppler::font_iterator poppler-font.h "poppler/cpp/poppler-font.h" + + Reads the fonts in the PDF %document page by page. + + font_iterator is the way to collect the list of the fonts used in a PDF + %document, reading them incrementally page by page. + + A typical usage of this might look like: + \code +poppler::font_iterator *it = doc->create_font_iterator(); +while (it->has_next()) { + std::vector<poppler::font_info> fonts = it->next(); + // do domething with the fonts +} +// after we are done with the iterator, it must be deleted +delete it; +\endcode + */ + + +font_iterator::font_iterator(int start_page, document_private *dd) + : d(new font_iterator_private(start_page, dd)) +{ +} + +/** + Destructor. + */ +font_iterator::~font_iterator() +{ + delete d; +} + +/** + Returns the fonts of the current page and advances to the next one. + */ +std::vector<font_info> font_iterator::next() +{ + if (!has_next()) { + return std::vector<font_info>(); + } + + ++d->current_page; + + GooList *items = d->font_info_scanner.scan(1); + if (!items) { + return std::vector<font_info>(); + } + std::vector<font_info> fonts(items->getLength()); + for (int i = 0; i < items->getLength(); ++i) { + fonts[i] = font_info(*new font_info_private((FontInfo *)items->get(i))); + } + deleteGooList(items, FontInfo); + return fonts; +} + +/** + \returns whether the iterator has more pages to advance to +*/ +bool font_iterator::has_next() const +{ + return d->current_page < d->total_pages; +} + +/** + \returns the current page +*/ +int font_iterator::current_page() const +{ + return d->current_page; +} diff --git a/cpp/poppler-font.h b/cpp/poppler-font.h new file mode 100644 index 0000000..854b7a4 --- /dev/null +++ b/cpp/poppler-font.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_FONT_H +#define POPPLER_FONT_H + +#include "poppler-global.h" + +#include <vector> + +namespace poppler +{ + +class document; +class document_private; +class font_info_private; +class font_iterator; +class font_iterator_private; + +class POPPLER_CPP_EXPORT font_info +{ +public: + enum type_enum { + unknown, + type1, + type1c, + type1c_ot, + type3, + truetype, + truetype_ot, + cid_type0, + cid_type0c, + cid_type0c_ot, + cid_truetype, + cid_truetype_ot + }; + + font_info(); + font_info(const font_info &fi); + ~font_info(); + + std::string name() const; + std::string file() const; + bool is_embedded() const; + bool is_subset() const; + type_enum type() const; + + font_info& operator=(const font_info &fi); + +private: + font_info(font_info_private &dd); + + font_info_private *d; + friend class font_iterator; +}; + + +class POPPLER_CPP_EXPORT font_iterator : public poppler::noncopyable +{ +public: + ~font_iterator(); + + std::vector<font_info> next(); + bool has_next() const; + int current_page() const; + +private: + font_iterator(int, document_private *dd); + + font_iterator_private *d; + friend class document; +}; + +} + +#endif diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp new file mode 100644 index 0000000..f99dbb7 --- /dev/null +++ b/cpp/poppler-global.cpp @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * Copyright (C) 2010, Hib Eris <hib@hiberis.nl> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-global.h" + +#include "poppler-private.h" + +#include <cerrno> +#include <cstring> +#include <ios> +#include <iostream> + +#include <iconv.h> + +#include "config.h" + +namespace +{ + +struct MiniIconv +{ + MiniIconv(const char *to_code, const char *from_code) + : i_(iconv_open(to_code, from_code)) + {} + ~MiniIconv() + { if (is_valid()) iconv_close(i_); } + bool is_valid() const + { return i_ != (iconv_t)-1; } + operator iconv_t() const + { return i_; } + iconv_t i_; +}; + +} + +using namespace poppler; + +/** + \namespace poppler + + Single namespace containing all the classes and functions of poppler-cpp. + */ + +/** + \class poppler::noncopyable + + A class that cannot be copied. + */ + +/** + \enum poppler::rotation_enum + + The case sensitivity. +*/ +/** + \var poppler::rotation_enum poppler::rotate_0 + + A rotation of 0 degrees clockwise. +*/ +/** + \var poppler::rotation_enum poppler::rotate_90 + + A rotation of 90 degrees clockwise. +*/ +/** + \var poppler::rotation_enum poppler::rotate_180 + + A rotation of 180 degrees clockwise. +*/ +/** + \var poppler::rotation_enum poppler::rotate_270 + + A rotation of 270 degrees clockwise. +*/ + +/** + \enum poppler::page_box_enum + + A possible box of a page in a PDF %document. +*/ +/** + \var poppler::page_box_enum poppler::media_box + + The "media" box. +*/ +/** + \var poppler::page_box_enum poppler::crop_box + + The "crop" box. +*/ +/** + \var poppler::page_box_enum poppler::bleed_box + + The "bleed" box. +*/ +/** + \var poppler::page_box_enum poppler::trim_box + + The "trim" box. +*/ +/** + \var poppler::page_box_enum poppler::art_box + + The "art" box. +*/ + +/** + \enum poppler::permission_enum + + A possible permission in a PDF %document. +*/ +/** + \var poppler::permission_enum poppler::perm_print + + The permission to allow the print of a %document. +*/ +/** + \var poppler::permission_enum poppler::perm_change + + The permission to change a %document. + + This is a generic "change" permission, so other permissions could affect + some types of changes. +*/ +/** + \var poppler::permission_enum poppler::perm_copy + + The permission to allow the copy or extraction of the text in a %document. +*/ +/** + \var poppler::permission_enum poppler::perm_add_notes + + The permission to allow the addition or editing of annotations, + and the filling of interactive form fields (including signature fields). +*/ +/** + \var poppler::permission_enum poppler::perm_fill_forms + + The permission to allow the the filling of interactive form fields + (including signature fields). + + \note this permission can be set even when the \ref poppler::perm_add_notes "perm_add_notes" + is not: this means that only the filling of forms is allowed. +*/ +/** + \var poppler::permission_enum poppler::perm_accessibility + + The permission to allow the extracting of content (for example, text) for + accessibility usage (e.g. for a screen reader). +*/ +/** + \var poppler::permission_enum poppler::perm_assemble + + The permission to allow to "assemble" a %document. + + This implies operations such as the insertion, the rotation and the deletion + of pages; the creation of bookmarks and thumbnail images. + + \note this permission can be set even when the \ref poppler::perm_change "perm_change" + is not +*/ +/** + \var poppler::permission_enum poppler::perm_print_high_resolution + + The permission to allow the high resolution print of a %document. +*/ + +/** + \enum poppler::case_sensitivity_enum + + The case sensitivity. +*/ + + +noncopyable::noncopyable() +{ +} + +noncopyable::~noncopyable() +{ +} + + +ustring::ustring() +{ +} + +ustring::ustring(size_type len, value_type ch) + : std::basic_string<value_type>(len, ch) +{ +} + +ustring::~ustring() +{ +} + +byte_array ustring::to_utf8() const +{ + if (!size()) { + return byte_array(); + } + + MiniIconv ic("UTF-8", "UTF-16"); + if (!ic.is_valid()) { + return byte_array(); + } + const value_type *me_data = data(); + byte_array str(size()); + char *str_data = &str[0]; + size_t me_len_char = size(); + size_t str_len_left = str.size(); + size_t ir = iconv(ic, (ICONV_CONST char **)&me_data, &me_len_char, &str_data, &str_len_left); + if ((ir == (size_t)-1) && (errno == E2BIG)) { + const size_t delta = str_data - &str[0]; + str_len_left += str.size(); + str.resize(str.size() * 2); + str_data = &str[delta]; + ir = iconv(ic, (ICONV_CONST char **)&me_data, &me_len_char, &str_data, &str_len_left); + if (ir == (size_t)-1) { + return byte_array(); + } + } + if (str_len_left >= 0) { + str.resize(str.size() - str_len_left); + } + return str; +} + +std::string ustring::to_latin1() const +{ + if (!size()) { + return std::string(); + } + + const size_type mylength = size(); + std::string ret(mylength, '\0'); + const value_type *me = data(); + for (size_type i = 0; i < mylength; ++i) { + ret[i] = (char)*me++; + } + return ret; +} + +ustring ustring::from_utf8(const char *str, int len) +{ + if (len <= 0) { + len = std::strlen(str); + if (len <= 0) { + return ustring(); + } + } + + MiniIconv ic("UTF-16", "UTF-8"); + if (!ic.is_valid()) { + return ustring(); + } + + ustring ret(len * 2, 0); + char *ret_data = reinterpret_cast<char *>(&ret[0]); + char *str_data = const_cast<char *>(str); + size_t str_len_char = len; + size_t ret_len_left = ret.size(); + size_t ir = iconv(ic, (ICONV_CONST char **)&str_data, &str_len_char, &ret_data, &ret_len_left); + if ((ir == (size_t)-1) && (errno == E2BIG)) { + const size_t delta = ret_data - reinterpret_cast<char *>(&ret[0]); + ret_len_left += ret.size(); + ret.resize(ret.size() * 2); + ret_data = reinterpret_cast<char *>(&ret[delta]); + ir = iconv(ic, (ICONV_CONST char **)&str_data, &str_len_char, &ret_data, &ret_len_left); + if (ir == (size_t)-1) { + return ustring(); + } + } + if (ret_len_left >= 0) { + ret.resize(ret.size() - ret_len_left); + } + + return ret; +} + +ustring ustring::from_latin1(const std::string &str) +{ + const size_type l = str.size(); + if (!l) { + return ustring(); + } + const char *c = str.data(); + ustring ret(l, 0); + for (size_type i = 0; i < l; ++i) { + ret[i] = *c++; + } + return ret; +} + + +/** + Converts a string representing a PDF date to a value compatible with time_t. + */ +time_type poppler::convert_date(const std::string &date) +{ + return detail::convert_date(date.c_str()); +} + +std::ostream& poppler::operator<<(std::ostream& stream, const byte_array &array) +{ + stream << "["; + const std::ios_base::fmtflags f = stream.flags(); + std::hex(stream); + const char *data = &array[0]; + const byte_array::size_type out_len = std::min<byte_array::size_type>(array.size(), 50); + for (byte_array::size_type i = 0; i < out_len; ++i) + { + if (i != 0) { + stream << " "; + } + stream << ((data[i] & 0xf0) >> 4) << (data[i] & 0xf); + } + stream.flags(f); + if (out_len < array.size()) { + stream << " ..."; + } + stream << "]"; + return stream; +} diff --git a/cpp/poppler-global.h b/cpp/poppler-global.h new file mode 100644 index 0000000..5650182 --- /dev/null +++ b/cpp/poppler-global.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * Copyright (C) 2010, Patrick Spendrin <ps_ml@gmx.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_GLOBAL_H +#define POPPLER_GLOBAL_H + +#if defined(_WIN32) +# define LIB_EXPORT __declspec(dllexport) +# define LIB_IMPORT __declspec(dllimport) +#else +# define LIB_EXPORT +# define LIB_IMPORT +#endif + +#if defined(poppler_cpp_EXPORTS) +# define POPPLER_CPP_EXPORT LIB_EXPORT +#else +# define POPPLER_CPP_EXPORT LIB_IMPORT +#endif + +#include <iosfwd> +#include <string> +#include <vector> + +namespace poppler +{ + +/// \cond DOXYGEN_SKIP_THIS +namespace detail +{ + +class POPPLER_CPP_EXPORT noncopyable +{ +protected: + noncopyable(); + ~noncopyable(); +private: + noncopyable(const noncopyable &); + const noncopyable& operator=(const noncopyable &); +}; + +} + +typedef detail::noncopyable noncopyable; +/// \endcond + +enum rotation_enum { rotate_0, rotate_90, rotate_180, rotate_270 }; + +enum page_box_enum { media_box, crop_box, bleed_box, trim_box, art_box }; + +enum permission_enum { perm_print, perm_change, perm_copy, perm_add_notes, + perm_fill_forms, perm_accessibility, perm_assemble, + perm_print_high_resolution }; + +enum case_sensitivity_enum { case_sensitive, case_insensitive }; + +typedef std::vector<char> byte_array; + +typedef unsigned int /* time_t */ time_type; + +// to disable warning only for this occurrence +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4251) /* class 'A' needs to have dll interface for to be used by clients of class 'B'. */ +#endif +class POPPLER_CPP_EXPORT ustring : public std::basic_string<unsigned short> +{ +public: + ustring(); + ustring(size_type len, value_type ch); + ~ustring(); + + byte_array to_utf8() const; + std::string to_latin1() const; + + static ustring from_utf8(const char *str, int len = -1); + static ustring from_latin1(const std::string &str); + +private: + // forbid implicit std::string conversions + ustring(const std::string &); + operator std::string() const; + ustring& operator=(const std::string &); +}; +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +POPPLER_CPP_EXPORT time_type convert_date(const std::string &date); + +POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const byte_array &array); + +} + +#endif diff --git a/cpp/poppler-image-private.h b/cpp/poppler-image-private.h new file mode 100644 index 0000000..33b5874 --- /dev/null +++ b/cpp/poppler-image-private.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_IMAGE_PRIVATE_H +#define POPPLER_IMAGE_PRIVATE_H + +#include "poppler-image.h" + +namespace poppler +{ + +class image_private +{ +public: + image_private(int iwidth, int iheight, image::format_enum iformat); + ~image_private(); + + static image_private *create_data(int width, int height, image::format_enum format); + static image_private *create_data(char *data, int width, int height, image::format_enum format); + + int ref; + char *data; + int width; + int height; + int bytes_per_row; + int bytes_num; + image::format_enum format : 3; + bool own_data : 1; +}; + +} + +#endif diff --git a/cpp/poppler-image.cpp b/cpp/poppler-image.cpp new file mode 100644 index 0000000..8e9ac63 --- /dev/null +++ b/cpp/poppler-image.cpp @@ -0,0 +1,475 @@ +/* + * Copyright (C) 2010-2011, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-image.h" + +#include "poppler-image-private.h" + +#include <config.h> +#include "ImgWriter.h" +#if defined(ENABLE_LIBPNG) +#include "PNGWriter.h" +#endif +#if defined(ENABLE_LIBJPEG) +#include "JpegWriter.h" +#endif +#if defined(ENABLE_LIBTIFF) +#include "TiffWriter.h" +#endif +#include "PNMWriter.h" + +#include <cstdlib> +#include <cstring> +#include <algorithm> +#include <memory> +#include <vector> + +using poppler::PNMWriter; + +namespace { + +struct FileCloser { + inline FileCloser(FILE *ff) + : f(ff) {} + inline ~FileCloser() + { (void)close(); } + inline bool close() + { if (f) { const int c = fclose(f); f = 0; return c == 0; } return true; } + + FILE *f; +}; + +int calc_bytes_per_row(int width, poppler::image::format_enum format) +{ + switch (format) { + case poppler::image::format_invalid: + return 0; + case poppler::image::format_mono: + return (width + 7) >> 3; + case poppler::image::format_rgb24: + return width * 3; + case poppler::image::format_argb32: + return width * 4; + } + return 0; +} + +PNMWriter::OutFormat pnm_format(poppler::image::format_enum format) +{ + switch (format) { + case poppler::image::format_invalid: // unused, anyway + case poppler::image::format_mono: + return PNMWriter::PBM; + case poppler::image::format_rgb24: + case poppler::image::format_argb32: + return PNMWriter::PPM; + } + return PNMWriter::PPM; +} + +} + +using namespace poppler; + +image_private::image_private(int iwidth, int iheight, image::format_enum iformat) + : ref(1) + , data(0) + , width(iwidth) + , height(iheight) + , bytes_per_row(0) + , bytes_num(0) + , format(iformat) + , own_data(true) +{ +} + +image_private::~image_private() +{ + if (own_data) { + std::free(data); + } +} + +image_private *image_private::create_data(int width, int height, image::format_enum format) +{ + if (width <= 0 || height <= 0) { + return 0; + } + + int bpr = calc_bytes_per_row(width, format); + if (bpr <= 0) { + return 0; + } + + std::auto_ptr<image_private> d(new image_private(width, height, format)); + d->bytes_num = bpr * height; + d->data = reinterpret_cast<char *>(std::malloc(d->bytes_num)); + if (!d->data) { + return 0; + } + d->own_data = true; + d->bytes_per_row = bpr; + + return d.release(); +} + +image_private *image_private::create_data(char *data, int width, int height, image::format_enum format) +{ + if (width <= 0 || height <= 0 || !data) { + return 0; + } + + int bpr = calc_bytes_per_row(width, format); + if (bpr <= 0) { + return 0; + } + + std::auto_ptr<image_private> d(new image_private(width, height, format)); + d->bytes_num = bpr * height; + d->data = data; + d->own_data = false; + d->bytes_per_row = bpr; + + return d.release(); +} + +/** + \class poppler::image poppler-image.h "poppler/cpp/poppler-image.h" + + A simple representation of image, with direct access to the data. + + This class uses implicit sharing for the internal data, so it can be used as + value class. This also means any non-const operation will make sure that the + data used by current instance is not shared with other instances (ie + \em detaching), copying the shared data. + + \since 0.16 + */ + +/** + \enum poppler::image::format_enum + + The possible formats for an image. +*/ + + +/** + Construct an invalid image. + */ +image::image() + : d(0) +{ +} + +/** + Construct a new image. + + It allocates the storage needed for the image data; if the allocation fails, + the image is an invalid one. + + \param iwidth the width for the image + \param iheight the height for the image + \param iformat the format for the bits of the image + */ +image::image(int iwidth, int iheight, image::format_enum iformat) + : d(image_private::create_data(iwidth, iheight, iformat)) +{ +} + +/** + Construct a new image. + + It uses the provide data buffer for the image, so you \b must ensure it + remains valid for the whole lifetime of the image. + + \param idata the buffer to use for the image + \param iwidth the width for the image + \param iheight the height for the image + \param iformat the format for the bits of the image + */ +image::image(char *idata, int iwidth, int iheight, image::format_enum iformat) + : d(image_private::create_data(idata, iwidth, iheight, iformat)) +{ +} + +/** + Copy constructor. + */ +image::image(const image &pt) + : d(pt.d) +{ + if (d) { + ++d->ref; + } +} + +/** + Destructor. + */ +image::~image() +{ + if (d && !--d->ref) { + delete d; + } +} + +/** + Image validity check. + + \returns whether the image is valid. + */ +bool image::is_valid() const +{ + return d && d->format != format_invalid; +} + +/** + \returns the format of the image + */ +image::format_enum image::format() const +{ + return d ? d->format : format_invalid; +} + +/** + \returns whether the width of the image + */ +int image::width() const +{ + return d ? d->width : 0; +} + +/** + \returns whether the height of the image + */ +int image::height() const +{ + return d ? d->height : 0; +} + +/** + \returns the number of bytes in each row of the image + */ +int image::bytes_per_row() const +{ + return d ? d->bytes_per_row : 0; +} + +/** + Access to the image bits. + + This function will detach and copy the shared data. + + \returns the pointer to the first pixel + */ +char *image::data() +{ + if (!d) { + return 0; + } + + detach(); + return d->data; +} + +/** + Access to the image bits. + + This function provides const access to the data. + + \returns the pointer to the first pixel + */ +const char *image::const_data() const +{ + return d ? d->data : 0; +} + +/** + Copy of a slice of the image. + + \param r the sub-area of this image to copy; if empty, the whole image is + copied + + \returns a new image representing the specified part of the current image + */ +image image::copy(const rect &r) const +{ + if (r.is_empty()) { + image img(*this); + img.detach(); + return img; + } + + // ### FIXME + return *this; +} + +/** + Saves the current image to file. + + Using this function it is possible to save the image to the specified + \p file_name, in the specified \p out_format and with a resolution of the + specified \p dpi. + + Image formats commonly supported are: + \li PNG: \c png + \li JPEG: \c jpeg, \c jpg + \li TIFF: \c tiff + \li PNM: \c pnm (with Poppler >= 0.18) + + If an image format is not supported (check the result of + supported_image_formats()), the saving fails. + + \returns whether the saving succeeded + */ +bool image::save(const std::string &file_name, const std::string &out_format, int dpi) const +{ + if (!is_valid() || file_name.empty() || out_format.empty()) { + return false; + } + + std::string fmt = out_format; + std::transform(fmt.begin(), fmt.end(), fmt.begin(), tolower); + + std::auto_ptr<ImgWriter> w; + const int actual_dpi = dpi == -1 ? 75 : dpi; + if (false) { + } +#if defined(ENABLE_LIBPNG) + else if (fmt == "png") { + w.reset(new PNGWriter()); + } +#endif +#if defined(ENABLE_LIBJPEG) + else if (fmt == "jpeg" || fmt == "jpg") { + w.reset(new JpegWriter()); + } +#endif +#if defined(ENABLE_LIBTIFF) + else if (fmt == "tiff") { + w.reset(new TiffWriter()); + } +#endif + else if (fmt == "pnm") { + w.reset(new PNMWriter(pnm_format(d->format))); + } + if (!w.get()) { + return false; + } + FILE *f = fopen(file_name.c_str(), "w"); + if (!f) { + return false; + } + const FileCloser fc(f); + if (!w->init(f, d->width, d->height, actual_dpi, actual_dpi)) { + return false; + } + switch (d->format) { + case format_invalid: + return false; + case format_mono: + return false; + case format_rgb24: { + char *hptr = d->data; + for (int y = 0; y < d->height; ++y) { + if (!w->writeRow(reinterpret_cast<unsigned char **>(&hptr))) { + return false; + } + hptr += d->bytes_per_row; + } + break; + } + case format_argb32: { + std::vector<unsigned char> row(3 * d->width); + char *hptr = d->data; + for (int y = 0; y < d->height; ++y) { + unsigned char *rowptr = &row[0]; + for (int x = 0; x < d->width; ++x, rowptr += 3) { + const unsigned int pixel = *reinterpret_cast<unsigned int *>(hptr + x * 4); + rowptr[0] = (pixel >> 16) & 0xff; + rowptr[1] = (pixel >> 8) & 0xff; + rowptr[2] = pixel & 0xff; + } + rowptr = &row[0]; + if (!w->writeRow(&rowptr)) { + return false; + } + hptr += d->bytes_per_row; + } + break; + } + } + + if (!w->close()) { + return false; + } + + return true; +} + +/** + \returns a list of the supported image formats + */ +std::vector<std::string> image::supported_image_formats() +{ + std::vector<std::string> formats; +#if defined(ENABLE_LIBPNG) + formats.push_back("png"); +#endif +#if defined(ENABLE_LIBJPEG) + formats.push_back("jpeg"); + formats.push_back("jpg"); +#endif +#if defined(ENABLE_LIBTIFF) + formats.push_back("tiff"); +#endif + formats.push_back("pnm"); + return formats; +} + +/** + Assignment operator. + */ +image& image::operator=(const image &pt) +{ + if (pt.d) { + ++pt.d->ref; + } + image_private *old_d = d; + d = pt.d; + if (old_d && !--old_d->ref) { + delete old_d; + } + return *this; +} + +void image::detach() +{ + if (d->ref == 1) { + return; + } + + image_private *old_d = d; + d = image_private::create_data(old_d->width, old_d->height, old_d->format); + if (d) { + std::memcpy(d->data, old_d->data, old_d->bytes_num); + --old_d->ref; + } else { + d = old_d; + } +} diff --git a/cpp/poppler-image.h b/cpp/poppler-image.h new file mode 100644 index 0000000..4f2e301 --- /dev/null +++ b/cpp/poppler-image.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_IMAGE_H +#define POPPLER_IMAGE_H + +#include "poppler-global.h" +#include "poppler-rectangle.h" + +namespace poppler +{ + +class image_private; + +class POPPLER_CPP_EXPORT image +{ +public: + enum format_enum { + format_invalid, + format_mono, + format_rgb24, + format_argb32 + }; + + image(); + image(int iwidth, int iheight, format_enum iformat); + image(char *idata, int iwidth, int iheight, format_enum iformat); + image(const image &img); + ~image(); + + bool is_valid() const; + format_enum format() const; + int width() const; + int height() const; + char *data(); + const char *const_data() const; + int bytes_per_row() const; + + image copy(const rect &r = rect()) const; + + bool save(const std::string &file_name, const std::string &out_format, int dpi = -1) const; + + static std::vector<std::string> supported_image_formats(); + + image& operator=(const image &img); + +private: + void detach(); + + image_private *d; + friend class image_private; +}; + +} + +#endif diff --git a/cpp/poppler-page-private.h b/cpp/poppler-page-private.h new file mode 100644 index 0000000..b208cb8 --- /dev/null +++ b/cpp/poppler-page-private.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_PAGE_PRIVATE_H +#define POPPLER_PAGE_PRIVATE_H + +#include "poppler-page.h" + +class Page; + +namespace poppler +{ + +class document_private; +class page_transition; + +class page_private +{ +public: + page_private(document_private *doc, int index); + ~page_private(); + + document_private *doc; + Page *page; + int index; + page_transition *transition; + + static inline page_private* get(const poppler::page *p) + { return const_cast<poppler::page *>(p)->d; } +}; + +} + +#endif diff --git a/cpp/poppler-page-renderer.cpp b/cpp/poppler-page-renderer.cpp new file mode 100644 index 0000000..1317192 --- /dev/null +++ b/cpp/poppler-page-renderer.cpp @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-page-renderer.h" + +#include "poppler-document-private.h" +#include "poppler-page-private.h" + +#include <config.h> + +#include "PDFDoc.h" +#if defined(HAVE_SPLASH) +#include "SplashOutputDev.h" +#include "splash/SplashBitmap.h" +#endif + +using namespace poppler; + +class poppler::page_renderer_private +{ +public: + page_renderer_private() + : paper_color(0xffffffff) + , hints(0) + { + } + + argb paper_color; + unsigned int hints; +}; + + +/** + \class poppler::page_renderer poppler-page-renderer.h "poppler/cpp/poppler-renderer.h" + + Simple way to render a page of a PDF %document. + + \since 0.16 + */ + +/** + \enum poppler::page_renderer::render_hint + + A flag of an option taken into account when rendering +*/ + + +/** + Constructs a new %page renderer. + */ +page_renderer::page_renderer() + : d(new page_renderer_private()) +{ +} + +/** + Destructor. + */ +page_renderer::~page_renderer() +{ + delete d; +} + +/** + The color used for the "paper" of the pages. + + The default color is opaque solid white (0xffffffff). + + \returns the paper color + */ +argb page_renderer::paper_color() const +{ + return d->paper_color; +} + +/** + Set a new color for the "paper". + + \param c the new color + */ +void page_renderer::set_paper_color(argb c) +{ + d->paper_color = c; +} + +/** + The hints used when rendering. + + By default no hint is set. + + \returns the render hints set + */ +unsigned int page_renderer::render_hints() const +{ + return d->hints; +} + +/** + Enable or disable a single render %hint. + + \param hint the hint to modify + \param on whether enable it or not + */ +void page_renderer::set_render_hint(page_renderer::render_hint hint, bool on) +{ + if (on) { + d->hints |= hint; + } else { + d->hints &= ~(int)hint; + } +} + +/** + Set new render %hints at once. + + \param hints the new set of render hints + */ +void page_renderer::set_render_hints(unsigned int hints) +{ + d->hints = hints; +} + +/** + Render the specified page. + + This functions renders the specified page on an image following the specified + parameters, returning it. + + \param p the page to render + \param xres the X resolution, in dot per inch (DPI) + \param yres the Y resolution, in dot per inch (DPI) + \param x the X top-right coordinate, in pixels + \param y the Y top-right coordinate, in pixels + \param w the width in pixels of the area to render + \param h the height in pixels of the area to render + \param rotate the rotation to apply when rendering the page + + \returns the rendered image, or a null one in case of errors + + \see can_render + */ +image page_renderer::render_page(const page *p, + double xres, double yres, + int x, int y, int w, int h, + rotation_enum rotate) const +{ + if (!p) { + return image(); + } + +#if defined(HAVE_SPLASH) + page_private *pp = page_private::get(p); + PDFDoc *pdfdoc = pp->doc->doc; + + SplashColor bgColor; + bgColor[0] = d->paper_color & 0xff; + bgColor[1] = (d->paper_color >> 8) & 0xff; + bgColor[2] = (d->paper_color >> 16) & 0xff; + const GBool text_AA = d->hints & text_antialiasing ? gTrue : gFalse; + SplashOutputDev splashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, text_AA); + splashOutputDev.setVectorAntialias(d->hints & antialiasing ? gTrue : gFalse); + splashOutputDev.setFreeTypeHinting(d->hints & text_hinting ? gTrue : gFalse, gFalse); + splashOutputDev.startDoc(pdfdoc); + pdfdoc->displayPageSlice(&splashOutputDev, pp->index + 1, + xres, yres, int(rotate) * 90, + gFalse, gTrue, gFalse, + x, y, w, h); + + SplashBitmap *bitmap = splashOutputDev.getBitmap(); + const int bw = bitmap->getWidth(); + const int bh = bitmap->getHeight(); + + SplashColorPtr data_ptr = bitmap->getDataPtr(); + + const image img(reinterpret_cast<char *>(data_ptr), bw, bh, image::format_argb32); + return img.copy(); +#else + return image(); +#endif +} + +/** + Rendering capability test. + + page_renderer can render only if a render backend ('Splash') is compiled in + Poppler. + + \returns whether page_renderer can render + */ +bool page_renderer::can_render() +{ +#if defined(HAVE_SPLASH) + return true; +#else + return false; +#endif +} diff --git a/cpp/poppler-page-renderer.h b/cpp/poppler-page-renderer.h new file mode 100644 index 0000000..1383865 --- /dev/null +++ b/cpp/poppler-page-renderer.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_PAGE_RENDERER_H +#define POPPLER_PAGE_RENDERER_H + +#include "poppler-global.h" +#include "poppler-image.h" + +namespace poppler +{ + +typedef unsigned int argb; + +class page; +class page_renderer_private; + +class POPPLER_CPP_EXPORT page_renderer : public poppler::noncopyable +{ +public: + enum render_hint { + antialiasing = 0x00000001, + text_antialiasing = 0x00000002, + text_hinting = 0x00000004 + }; + + page_renderer(); + ~page_renderer(); + + argb paper_color() const; + void set_paper_color(argb c); + + unsigned int render_hints() const; + void set_render_hint(render_hint hint, bool on = true); + void set_render_hints(unsigned int hints); + + image render_page(const page *p, + double xres = 72.0, double yres = 72.0, + int x = -1, int y = -1, int w = -1, int h = -1, + rotation_enum rotate = rotate_0) const; + + static bool can_render(); + +private: + page_renderer_private *d; + friend class page_renderer_private; +}; + +} + +#endif diff --git a/cpp/poppler-page-transition.cpp b/cpp/poppler-page-transition.cpp new file mode 100644 index 0000000..7c83723 --- /dev/null +++ b/cpp/poppler-page-transition.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * Copyright (C) 2011, Albert Astals Cid <aacid@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-page-transition.h" + +#include "PageTransition.h" + +using namespace poppler; + +class poppler::page_transition_private +{ +public: + page_transition_private(Object *trans) + : pt(trans) + { + } + + PageTransition pt; +}; + +/** + \class poppler::page_transition poppler-page-transition.h "poppler/cpp/poppler-page-transition.h" + + A transition between two pages in a PDF %document. + + Usually shown in a presentation mode of a PDF viewer. + */ + +/** + \enum poppler::page_transition::type_enum + + The possibe types of a %page transition. +*/ + +/** + \enum poppler::page_transition::alignment_enum + + The alignment of a %page transition. +*/ + +/** + \enum poppler::page_transition::direction_enum + + The direction of an animation in a %page transition. +*/ + + +page_transition::page_transition(Object *params) + : d(new page_transition_private(params)) +{ +} + +/** + Copy constructor. + */ +page_transition::page_transition(const page_transition &pt) + : d(new page_transition_private(*pt.d)) +{ +} + +/** + Destructor. + */ +page_transition::~page_transition() +{ + delete d; +} + +page_transition::type_enum page_transition::type() const +{ + return (page_transition::type_enum)d->pt.getType(); +} + +int page_transition::duration() const +{ + return d->pt.getDuration(); +} + +page_transition::alignment_enum page_transition::alignment() const +{ + return (page_transition::alignment_enum)d->pt.getAlignment(); +} + +page_transition::direction_enum page_transition::direction() const +{ + return (page_transition::direction_enum)d->pt.getDirection(); +} + +int page_transition::angle() const +{ + return d->pt.getAngle(); +} + +double page_transition::scale() const +{ + return d->pt.getScale(); +} + +bool page_transition::is_rectangular() const +{ + return d->pt.isRectangular(); +} + +page_transition& page_transition::operator=(const page_transition &pt) +{ + if (&pt != this) { + page_transition_private *new_d = new page_transition_private(*pt.d); + delete d; + d = new_d; + } + return *this; +} diff --git a/cpp/poppler-page-transition.h b/cpp/poppler-page-transition.h new file mode 100644 index 0000000..4ecb179 --- /dev/null +++ b/cpp/poppler-page-transition.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_PAGE_TRANSITION_H +#define POPPLER_PAGE_TRANSITION_H + +#include "poppler-global.h" + +class Object; + +namespace poppler +{ + +class page; +class page_transition_private; + +class POPPLER_CPP_EXPORT page_transition +{ +public: + enum type_enum { + replace = 0, + split, + blinds, + box, + wipe, + dissolve, + glitter, + fly, + push, + cover, + uncover, + fade + }; + + enum alignment_enum { + horizontal = 0, + vertical + }; + + enum direction_enum { + inward = 0, + outward + }; + + page_transition(const page_transition &pt); + ~page_transition(); + + type_enum type() const; + int duration() const; + alignment_enum alignment() const; + direction_enum direction() const; + int angle() const; + double scale() const; + bool is_rectangular() const; + + page_transition& operator=(const page_transition &pt); + +private: + page_transition(Object *params); + + page_transition_private *d; + friend class page; +}; + +} + +#endif diff --git a/cpp/poppler-page.cpp b/cpp/poppler-page.cpp new file mode 100644 index 0000000..d72a477 --- /dev/null +++ b/cpp/poppler-page.cpp @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-page.h" +#include "poppler-page-transition.h" + +#include "poppler-document-private.h" +#include "poppler-page-private.h" +#include "poppler-private.h" + +#include "TextOutputDev.h" + +#include <memory> + +using namespace poppler; + +page_private::page_private(document_private *_doc, int _index) + : doc(_doc) + , page(doc->doc->getCatalog()->getPage(_index + 1)) + , index(_index) + , transition(0) +{ +} + +page_private::~page_private() +{ + delete transition; +} + +/** + \class poppler::page poppler-page.h "poppler/cpp/poppler-page.h" + + A page in a PDF %document. + */ + +/** + \enum poppler::page::orientation_enum + + The possible orientation of a page. +*/ + +/** + \enum poppler::page::search_direction_enum + + The direction/action to follow when performing a text search. +*/ + +/** + \enum poppler::page::text_layout_enum + + A layout of the text of a page. +*/ + + +page::page(document_private *doc, int index) + : d(new page_private(doc, index)) +{ +} + +/** + Destructor. + */ +page::~page() +{ + delete d; +} + +/** + \returns the orientation of the page + */ +page::orientation_enum page::orientation() const +{ + const int rotation = d->page->getRotate(); + switch (rotation) { + case 90: + return landscape; + break; + case 180: + return upside_down; + break; + case 270: + return seascape; + break; + default: + return portrait; + } +} + +/** + The eventual duration the page can be hinted to be shown in a presentation. + + If this value is positive (usually different than -1) then a PDF viewer, when + showing the page in a presentation, should show the page for at most for this + number of seconds, and then switch to the next page (if any). Note this is + purely a presentation attribute, it has no influence on the behaviour. + + \returns the duration time (in seconds) of the page + */ +double page::duration() const +{ + return d->page->getDuration(); +} + +/** + Returns the size of one rect of the page. + + \returns the size of the specified page rect + */ +rectf page::page_rect(page_box_enum box) const +{ + PDFRectangle *r = 0; + switch (box) { + case media_box: + r = d->page->getMediaBox(); + break; + case crop_box: + r = d->page->getCropBox(); + break; + case bleed_box: + r = d->page->getBleedBox(); + break; + case trim_box: + r = d->page->getTrimBox(); + break; + case art_box: + r = d->page->getArtBox(); + break; + } + if (r) { + return detail::pdfrectangle_to_rectf(*r); + } + return rectf(); +} + +/** + \returns the label of the page, if any + */ +ustring page::label() const +{ + GooString goo; + if (!d->doc->doc->getCatalog()->indexToLabel(d->index, &goo)) { + return ustring(); + } + + return detail::unicode_GooString_to_ustring(&goo); +} + +/** + The transition from this page to the next one. + + If it is set, then a PDF viewer in a presentation should perform the + specified transition effect when switching from this page to the next one. + + \returns the transition effect for the switch to the next page, if any + */ +page_transition* page::transition() const +{ + if (!d->transition) { + Object o; + if (d->page->getTrans(&o)->isDict()) { + d->transition = new page_transition(&o); + } + o.free(); + } + return d->transition; +} + +/** + Search the page for some text. + + \param text the text to search + \param[in,out] r the area where to start search, which will be set to the area + of the match (if any) + \param direction in which direction search for text + \param case_sensitivity whether search in a case sensitive way + \param rotation the rotation assumed for the page + */ +bool page::search(const ustring &text, rectf &r, search_direction_enum direction, + case_sensitivity_enum case_sensitivity, rotation_enum rotation) const +{ + const size_t len = text.length(); + std::vector<Unicode> u(len); + for (size_t i = 0; i < len; ++i) { + u[i] = text[i]; + } + + const GBool sCase = case_sensitivity == case_sensitive ? gTrue : gFalse; + const int rotation_value = (int)rotation * 90; + + bool found = false; + double rect_left = r.left(); + double rect_top = r.top(); + double rect_right = r.right(); + double rect_bottom = r.bottom(); + + TextOutputDev td(NULL, gTrue, 0, gFalse, gFalse); + d->doc->doc->displayPage(&td, d->index + 1, 72, 72, rotation_value, false, true, false); + TextPage *text_page = td.takeText(); + + switch (direction) { + case search_from_top: + found = text_page->findText(&u[0], len, + gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, + &rect_left, &rect_top, &rect_right, &rect_bottom); + break; + case search_next_result: + found = text_page->findText(&u[0], len, + gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, + &rect_left, &rect_top, &rect_right, &rect_bottom); + break; + case search_previous_result: + found = text_page->findText(&u[0], len, + gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, + &rect_left, &rect_top, &rect_right, &rect_bottom); + break; + } + + text_page->decRefCnt(); + r.set_left(rect_left); + r.set_top(rect_top); + r.set_right(rect_right); + r.set_bottom(rect_bottom); + + return found; +} + +/** + Returns the text in the page, in its physical layout. + + \param r if not empty, it will be extracted the text in it; otherwise, the + text of the whole page + + \returns the text of the page in the specified rect or in the whole page + */ +ustring page::text(const rectf &r) const +{ + return text(r, physical_layout); +} + +/** + Returns the text in the page. + + \param rect if not empty, it will be extracted the text in it; otherwise, the + text of the whole page + \param layout_mode the layout of the text + + \returns the text of the page in the specified rect or in the whole page + + \since 0.16 + */ +ustring page::text(const rectf &r, text_layout_enum layout_mode) const +{ + std::auto_ptr<GooString> s; + const GBool use_raw_order = (layout_mode == raw_order_layout); + TextOutputDev td(0, gFalse, 0, use_raw_order, gFalse); + d->doc->doc->displayPage(&td, d->index + 1, 72, 72, 0, false, true, false); + if (r.is_empty()) { + const PDFRectangle *rect = d->page->getCropBox(); + s.reset(td.getText(rect->x1, rect->y1, rect->x2, rect->y2)); + } else { + s.reset(td.getText(r.left(), r.top(), r.right(), r.bottom())); + } + return ustring::from_utf8(s->getCString()); +} diff --git a/cpp/poppler-page.h b/cpp/poppler-page.h new file mode 100644 index 0000000..7b4298a --- /dev/null +++ b/cpp/poppler-page.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_PAGE_H +#define POPPLER_PAGE_H + +#include "poppler-global.h" +#include "poppler-rectangle.h" + +namespace poppler +{ + +class document; +class document_private; +class page_private; +class page_transition; + +class POPPLER_CPP_EXPORT page : public poppler::noncopyable +{ +public: + enum orientation_enum { + landscape, + portrait, + seascape, + upside_down + }; + enum search_direction_enum { + search_from_top, + search_next_result, + search_previous_result + }; + enum text_layout_enum { + physical_layout, + raw_order_layout + }; + + ~page(); + + orientation_enum orientation() const; + double duration() const; + rectf page_rect(page_box_enum box = crop_box) const; + ustring label() const; + + page_transition* transition() const; + + bool search(const ustring &text, rectf &r, search_direction_enum direction, + case_sensitivity_enum case_sensitivity, rotation_enum rotation = rotate_0) const; + ustring text(const rectf &rect = rectf()) const; + ustring text(const rectf &rect, text_layout_enum layout_mode) const; + +private: + page(document_private *doc, int index); + + page_private *d; + friend class page_private; + friend class document; +}; + +} + +#endif diff --git a/cpp/poppler-private.cpp b/cpp/poppler-private.cpp new file mode 100644 index 0000000..2783bed --- /dev/null +++ b/cpp/poppler-private.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-private.h" + +#include "DateInfo.h" +#include "GooString.h" +#include "Page.h" + +#include <ctime> +#include <iostream> +#include <sstream> + +using namespace poppler; + +void detail::error_function(void * /*data*/, ErrorCategory /*category*/, int pos, char *msg) +{ + std::ostringstream oss; + if (pos >= 0) { + oss << "poppler/error (" << pos << "): "; + } else { + oss << "poppler/error: "; + } + oss << msg; + std::cerr << oss.str(); +} + +rectf detail::pdfrectangle_to_rectf(const PDFRectangle &pdfrect) +{ + return rectf(pdfrect.x1, pdfrect.y1, pdfrect.x2 - pdfrect.x1, pdfrect.y2 - pdfrect.y1); +} + +ustring detail::unicode_GooString_to_ustring(GooString *str) +{ + const char *data = str->getCString(); + const int len = str->getLength(); + + int i = 0; + bool is_unicode = false; + if ((data[0] & 0xff) == 0xfe && (len > 1 && (data[1] & 0xff) == 0xff)) { + is_unicode = true; + i = 2; + } + ustring::size_type ret_len = len - i; + if (is_unicode) { + ret_len >>= 1; + } + ustring ret(ret_len, 0); + size_t ret_index = 0; + ustring::value_type u; + if (is_unicode) { + while (i < len) { + u = ((data[i] & 0xff) << 8) | (data[i + 1] & 0xff); + i += 2; + ret[ret_index++] = u; + } + } else { + while (i < len) { + u = data[i] & 0xff; + ++i; + ret[ret_index++] = u; + } + } + + return ret; +} + +ustring detail::unicode_to_ustring(const Unicode *u, int length) +{ + ustring str(length * 2, 0); + ustring::iterator it = str.begin(); + const Unicode *uu = u; + for (int i = 0; i < length; ++i) { + *it++ = ustring::value_type(*uu++ & 0xffff); + } + return str; +} + +GooString* detail::ustring_to_unicode_GooString(const ustring &str) +{ + const size_t len = str.size() * 2 + 2; + const ustring::value_type *me = str.data(); + byte_array ba(len); + ba[0] = 0xfe; + ba[1] = 0xff; + for (size_t i = 0; i < str.size(); ++i, ++me) { + ba[i * 2 + 2] = ((*me >> 8) & 0xff); + ba[i * 2 + 3] = (*me & 0xff); + } + GooString *goo = new GooString(&ba[0]); + return goo; +} + +time_type detail::convert_date(const char *date) +{ + int year, mon, day, hour, min, sec, tzHours, tzMins; + char tz; + + if (!parseDateString(date, &year, &mon, &day, &hour, &min, &sec, + &tz, &tzHours, &tzMins)) { + return time_type(-1); + } + + struct tm time; + time.tm_sec = sec; + time.tm_min = min; + time.tm_hour = hour; + time.tm_mday = day; + time.tm_mon = mon - 1; + time.tm_year = year - 1900; + time.tm_wday = -1; + time.tm_yday = -1; + time.tm_isdst = -1; + return mktime(&time); +} diff --git a/cpp/poppler-private.h b/cpp/poppler-private.h new file mode 100644 index 0000000..a4b455c --- /dev/null +++ b/cpp/poppler-private.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_PRIVATE_H +#define POPPLER_PRIVATE_H + +#include "poppler-global.h" +#include "poppler-rectangle.h" + +#include "Error.h" +#include "CharTypes.h" + +#include <stdarg.h> + +class GooString; +class PDFRectangle; + +#define PSTR(str) const_cast<char *>(str) + +namespace poppler +{ + +namespace detail +{ + +void error_function(void *data, ErrorCategory category, int pos, char *msg); + +rectf pdfrectangle_to_rectf(const PDFRectangle &pdfrect); + +ustring unicode_GooString_to_ustring(GooString *str); +ustring unicode_to_ustring(const Unicode *u, int length); +GooString* ustring_to_unicode_GooString(const ustring &str); + +time_type convert_date(const char *date); + +} + +template <typename ConstIterator> +void delete_all(ConstIterator it, ConstIterator end) +{ + while (it != end) { + delete *it++; + } +} + +template <typename Collection> +void delete_all(const Collection &c) +{ + delete_all(c.begin(), c.end()); +} + +} + +#endif diff --git a/cpp/poppler-rectangle.cpp b/cpp/poppler-rectangle.cpp new file mode 100644 index 0000000..83e5cc9 --- /dev/null +++ b/cpp/poppler-rectangle.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-rectangle.h" + +#include <iostream> + +using namespace poppler; + +/** + \class poppler::rectangle poppler-rectangle.h "poppler/cpp/poppler-rectangle.h" + + A rectangle. + */ + +/** + \typedef poppler::rect + + A rectangle with int dimensions and coordinates. + */ + +/** + \typedef poppler::rectf + + A rectangle with float (double) dimensions and coordinates. + */ + + +std::ostream& poppler::operator<<(std::ostream& stream, const rect &r) +{ + stream << "[" << r.x() << "," << r.y() << " " << r.width() << "+" << r.height() << "]"; + return stream; +} + +std::ostream& poppler::operator<<(std::ostream& stream, const rectf &r) +{ + stream << "[" << r.x() << "," << r.y() << " " << r.width() << "+" << r.height() << "]"; + return stream; +} diff --git a/cpp/poppler-rectangle.h b/cpp/poppler-rectangle.h new file mode 100644 index 0000000..365d07c --- /dev/null +++ b/cpp/poppler-rectangle.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_RECTANGLE_H +#define POPPLER_RECTANGLE_H + +#include "poppler-global.h" + +namespace poppler +{ + +template <typename T> class rectangle +{ +public: + rectangle() + : x1(), y1(), x2(), y2() + {} + rectangle(T _x, T _y, T w, T h) + : x1(_x), y1(_y), x2(x1 + w), y2(y1 + h) + {} + ~rectangle() + {} + + bool is_empty() const + { return (x1 == x2) && (y1 == y2); } + + T x() const + { return x1; } + + T y() const + { return y1; } + + T width() const + { return x2 - x1; } + + T height() const + { return y2 - y1; } + + T left() const + { return x1; } + T top() const + { return y1; } + T right() const + { return x2; } + T bottom() const + { return y2; } + + void set_left(T value) + { x1 = value; } + void set_top(T value) + { y1 = value; } + void set_right(T value) + { x2 = value; } + void set_bottom(T value) + { y2 = value; } + +private: + T x1, y1, x2, y2; +}; + +typedef rectangle<int> rect; +typedef rectangle<double> rectf; + +POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const rect &r); +POPPLER_CPP_EXPORT std::ostream& operator<<(std::ostream& stream, const rectf &r); + +} + +#endif diff --git a/cpp/poppler-toc-private.h b/cpp/poppler-toc-private.h new file mode 100644 index 0000000..e8841ff --- /dev/null +++ b/cpp/poppler-toc-private.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_TOC_PRIVATE_H +#define POPPLER_TOC_PRIVATE_H + +#include "poppler-global.h" +#include "poppler-toc.h" + +#include <vector> + +class GooList; +class Outline; +class OutlineItem; + +namespace poppler +{ + +class toc_private +{ +public: + toc_private(); + ~toc_private(); + + static toc* load_from_outline(Outline *outline); + + toc_item root; +}; + + +class toc_item_private +{ +public: + toc_item_private(); + ~toc_item_private(); + + void load(OutlineItem *item); + void load_children(GooList *items); + + std::vector<toc_item*> children; + ustring title; + bool is_open; +}; + +} + +#endif diff --git a/cpp/poppler-toc.cpp b/cpp/poppler-toc.cpp new file mode 100644 index 0000000..a3149c6 --- /dev/null +++ b/cpp/poppler-toc.cpp @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-toc.h" + +#include "poppler-toc-private.h" +#include "poppler-private.h" + +#include "GooList.h" +#include "Outline.h" + +using namespace poppler; + +toc_private::toc_private() +{ +} + +toc_private::~toc_private() +{ +} + +toc* toc_private::load_from_outline(Outline *outline) +{ + if (!outline) { + return 0; + } + + GooList *items = outline->getItems(); + if (!items || items->getLength() < 1) { + return 0; + } + + toc *newtoc = new toc(); + newtoc->d->root.d->is_open = true; + newtoc->d->root.d->load_children(items); + + return newtoc; +} + +toc_item_private::toc_item_private() + : is_open(false) +{ +} + +toc_item_private::~toc_item_private() +{ + delete_all(children); +} + +void toc_item_private::load(OutlineItem *item) +{ + const Unicode *title_unicode = item->getTitle(); + const int title_length = item->getTitleLength(); + title = detail::unicode_to_ustring(title_unicode, title_length); + is_open = item->isOpen(); +} + +void toc_item_private::load_children(GooList *items) +{ + const int num_items = items->getLength(); + children.resize(num_items); + for (int i = 0; i < num_items; ++i) { + OutlineItem *item = (OutlineItem *)items->get(i); + + toc_item *new_item = new toc_item(); + new_item->d->load(item); + children[i] = new_item; + + item->open(); + GooList *item_children = item->getKids(); + if (item_children) { + new_item->d->load_children(item_children); + } + } +} + +/** + \class poppler::toc poppler-toc.h "poppler/cpp/poppler-toc.h" + + Represents the TOC (Table of Contents) of a PDF %document. + + The TOC of a PDF %document is represented as a tree of items. + */ + + +toc::toc() + : d(new toc_private()) +{ +} + +/** + Destroys the TOC. + */ +toc::~toc() +{ + delete d; +} + +/** + Returns the "invisible item" representing the root of the TOC. + + This item is special, it has no title nor actions, it is open and its children + are the effective root items of the TOC. This is provided as a convenience + when iterating throught the TOC. + + \returns the root "item" + */ +toc_item* toc::root() const +{ + return &d->root; +} + +/** + \class poppler::toc_item poppler-toc.h "poppler/cpp/poppler-toc.h" + + Represents an item of the TOC (Table of Contents) of a PDF %document. + */ + +/** + \typedef std::vector<toc_item *>::const_iterator poppler::toc_item::iterator + + An iterator for the children of a TOC item. + */ + + +toc_item::toc_item() + : d(new toc_item_private()) +{ +} + +/** + Destroys the TOC item. + */ +toc_item::~toc_item() +{ + delete d; +} + +/** + \returns the title of the TOC item + */ +ustring toc_item::title() const +{ + return d->title; +} + +/** + Returns whether the TOC item should be represented as open when showing the + TOC. + + This is not a functional behaviour, but a visualisation hint of the item. + Regardless of this state, the item can be expanded and collapsed freely when + represented in a TOC view of a PDF viewer. + + \returns whether the TOC item should be open + */ +bool toc_item::is_open() const +{ + return d->is_open; +} + +/** + \returns the children of the TOC item + */ +std::vector<toc_item *> toc_item::children() const +{ + return d->children; +} + +/** + \returns an iterator to the being of the list of children of the TOC item + */ +toc_item::iterator toc_item::children_begin() const +{ + return d->children.begin(); +} + +/** + \returns an iterator to the end of the list of children of the TOC item + */ +toc_item::iterator toc_item::children_end() const +{ + return d->children.end(); +} diff --git a/cpp/poppler-toc.h b/cpp/poppler-toc.h new file mode 100644 index 0000000..8b09736 --- /dev/null +++ b/cpp/poppler-toc.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_TOC_H +#define POPPLER_TOC_H + +#include "poppler-global.h" + +#include <vector> + +namespace poppler +{ + +class toc_private; +class toc_item; +class toc_item_private; + +class POPPLER_CPP_EXPORT toc : public poppler::noncopyable +{ +public: + ~toc(); + + toc_item* root() const; + +private: + toc(); + + toc_private *d; + + friend class toc_private; +}; + + +class POPPLER_CPP_EXPORT toc_item : public poppler::noncopyable +{ +public: + typedef std::vector<toc_item *>::const_iterator iterator; + + ~toc_item(); + + ustring title() const; + bool is_open() const; + + std::vector<toc_item *> children() const; + iterator children_begin() const; + iterator children_end() const; + +private: + toc_item(); + + toc_item_private *d; + friend class toc; + friend class toc_private; + friend class toc_item_private; +}; + +} + +#endif diff --git a/cpp/poppler-version.cpp b/cpp/poppler-version.cpp new file mode 100644 index 0000000..dcc100f --- /dev/null +++ b/cpp/poppler-version.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-version.h" + +using namespace poppler; + +/** + \returns the version string of the current poppler-cpp library + */ +std::string poppler::version_string() +{ + return std::string(POPPLER_VERSION); +} + +/** + \returns the "major" number of the version of the current poppler-cpp library + */ +unsigned int poppler::version_major() +{ + return POPPLER_VERSION_MAJOR; +} + +/** + \returns the "minor" number of the version of the current poppler-cpp library + */ +unsigned int poppler::version_minor() +{ + return POPPLER_VERSION_MINOR; +} + +/** + \returns the "micro" number of the version of the current poppler-cpp library + */ +unsigned int poppler::version_micro() +{ + return POPPLER_VERSION_MICRO; +} diff --git a/cpp/poppler-version.h b/cpp/poppler-version.h new file mode 100644 index 0000000..8872075 --- /dev/null +++ b/cpp/poppler-version.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_VERSION_H +#define POPPLER_VERSION_H + +#include "poppler-global.h" + +#define POPPLER_VERSION "0.20.4" +#define POPPLER_VERSION_MAJOR 0 +#define POPPLER_VERSION_MINOR 20 +#define POPPLER_VERSION_MICRO 4 + +namespace poppler +{ + +POPPLER_CPP_EXPORT std::string version_string(); +POPPLER_CPP_EXPORT unsigned int version_major(); +POPPLER_CPP_EXPORT unsigned int version_minor(); +POPPLER_CPP_EXPORT unsigned int version_micro(); + +} + +#endif diff --git a/cpp/poppler-version.h.in b/cpp/poppler-version.h.in new file mode 100644 index 0000000..cf6bce6 --- /dev/null +++ b/cpp/poppler-version.h.in @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2009, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_VERSION_H +#define POPPLER_VERSION_H + +#include "poppler-global.h" + +#define POPPLER_VERSION "@POPPLER_VERSION@" +#define POPPLER_VERSION_MAJOR @POPPLER_MAJOR_VERSION@ +#define POPPLER_VERSION_MINOR @POPPLER_MINOR_VERSION@ +#define POPPLER_VERSION_MICRO @POPPLER_MICRO_VERSION@ + +namespace poppler +{ + +POPPLER_CPP_EXPORT std::string version_string(); +POPPLER_CPP_EXPORT unsigned int version_major(); +POPPLER_CPP_EXPORT unsigned int version_minor(); +POPPLER_CPP_EXPORT unsigned int version_micro(); + +} + +#endif diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt new file mode 100644 index 0000000..6ea24a5 --- /dev/null +++ b/cpp/tests/CMakeLists.txt @@ -0,0 +1,25 @@ +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/.. + ${CMAKE_CURRENT_BINARY_DIR}/.. + ${CMAKE_SOURCE_DIR}/utils +) + +macro(CPP_ADD_SIMPLETEST exe) + string(REPLACE "-" "" test_name ${exe}) + set(${test_name}_SOURCES + ${ARGN} + ) + poppler_add_test(${exe} BUILD_CPP_TESTS ${${test_name}_SOURCES}) + target_link_libraries(${exe} poppler-cpp) + if(MSVC) + target_link_libraries(${exe} poppler ${poppler_LIBS}) + endif(MSVC) +endmacro(CPP_ADD_SIMPLETEST) + + +cpp_add_simpletest(poppler-dump poppler-dump.cpp ${CMAKE_SOURCE_DIR}/utils/parseargs.cc) +target_link_libraries(poppler-dump poppler) + +cpp_add_simpletest(poppler-render poppler-render.cpp ${CMAKE_SOURCE_DIR}/utils/parseargs.cc) +target_link_libraries(poppler-render poppler) diff --git a/cpp/tests/Makefile.am b/cpp/tests/Makefile.am new file mode 100644 index 0000000..aab55f2 --- /dev/null +++ b/cpp/tests/Makefile.am @@ -0,0 +1,27 @@ +AM_LDFLAGS = @auto_import_flags@ + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/utils \ + -I$(top_srcdir)/cpp + +LDADDS = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/cpp/libpoppler-cpp.la + + +noinst_PROGRAMS = \ + poppler-dump \ + poppler-render + +poppler_dump_SOURCES = \ + $(top_srcdir)/utils/parseargs.cc \ + poppler-dump.cpp +poppler_dump_LDADD = $(LDADDS) + + +poppler_render_SOURCES = \ + $(top_srcdir)/utils/parseargs.cc \ + poppler-render.cpp +poppler_render_LDADD = $(LDADDS) + diff --git a/cpp/tests/Makefile.in b/cpp/tests/Makefile.in new file mode 100644 index 0000000..9268a3e --- /dev/null +++ b/cpp/tests/Makefile.in @@ -0,0 +1,666 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = poppler-dump$(EXEEXT) poppler-render$(EXEEXT) +subdir = cpp/tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_poppler_dump_OBJECTS = parseargs.$(OBJEXT) poppler-dump.$(OBJEXT) +poppler_dump_OBJECTS = $(am_poppler_dump_OBJECTS) +poppler_dump_DEPENDENCIES = $(LDADDS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am_poppler_render_OBJECTS = parseargs.$(OBJEXT) \ + poppler-render.$(OBJEXT) +poppler_render_OBJECTS = $(am_poppler_render_OBJECTS) +poppler_render_DEPENDENCIES = $(LDADDS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(poppler_dump_SOURCES) $(poppler_render_SOURCES) +DIST_SOURCES = $(poppler_dump_SOURCES) $(poppler_render_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +AM_LDFLAGS = @auto_import_flags@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/utils \ + -I$(top_srcdir)/cpp + +LDADDS = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/cpp/libpoppler-cpp.la + +poppler_dump_SOURCES = \ + $(top_srcdir)/utils/parseargs.cc \ + poppler-dump.cpp + +poppler_dump_LDADD = $(LDADDS) +poppler_render_SOURCES = \ + $(top_srcdir)/utils/parseargs.cc \ + poppler-render.cpp + +poppler_render_LDADD = $(LDADDS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign cpp/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign cpp/tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +poppler-dump$(EXEEXT): $(poppler_dump_OBJECTS) $(poppler_dump_DEPENDENCIES) $(EXTRA_poppler_dump_DEPENDENCIES) + @rm -f poppler-dump$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_dump_OBJECTS) $(poppler_dump_LDADD) $(LIBS) +poppler-render$(EXEEXT): $(poppler_render_OBJECTS) $(poppler_render_DEPENDENCIES) $(EXTRA_poppler_render_DEPENDENCIES) + @rm -f poppler-render$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_render_OBJECTS) $(poppler_render_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseargs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-render.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +parseargs.o: $(top_srcdir)/utils/parseargs.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parseargs.o -MD -MP -MF $(DEPDIR)/parseargs.Tpo -c -o parseargs.o `test -f '$(top_srcdir)/utils/parseargs.cc' || echo '$(srcdir)/'`$(top_srcdir)/utils/parseargs.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parseargs.Tpo $(DEPDIR)/parseargs.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/utils/parseargs.cc' object='parseargs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parseargs.o `test -f '$(top_srcdir)/utils/parseargs.cc' || echo '$(srcdir)/'`$(top_srcdir)/utils/parseargs.cc + +parseargs.obj: $(top_srcdir)/utils/parseargs.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parseargs.obj -MD -MP -MF $(DEPDIR)/parseargs.Tpo -c -o parseargs.obj `if test -f '$(top_srcdir)/utils/parseargs.cc'; then $(CYGPATH_W) '$(top_srcdir)/utils/parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/utils/parseargs.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parseargs.Tpo $(DEPDIR)/parseargs.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/utils/parseargs.cc' object='parseargs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parseargs.obj `if test -f '$(top_srcdir)/utils/parseargs.cc'; then $(CYGPATH_W) '$(top_srcdir)/utils/parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/utils/parseargs.cc'; fi` + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/cpp/tests/poppler-dump.cpp b/cpp/tests/poppler-dump.cpp new file mode 100644 index 0000000..d335ff0 --- /dev/null +++ b/cpp/tests/poppler-dump.cpp @@ -0,0 +1,396 @@ +/* + * Copyright (C) 2009-2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <poppler-document.h> +#include <poppler-embedded-file.h> +#include <poppler-font.h> +#include <poppler-page.h> +#include <poppler-toc.h> + +#include <cstdlib> +#include <cstring> +#include <ctime> +#include <iomanip> +#include <ios> +#include <iostream> +#include <memory> +#include <sstream> + +#include "parseargs.h" + +#include "config.h" + +static const int out_width = 30; + +bool show_all = false; +bool show_info = false; +bool show_perm = false; +bool show_metadata = false; +bool show_toc = false; +bool show_fonts = false; +bool show_embedded_files = false; +bool show_pages = false; +bool show_help = false; +char show_text[32]; +poppler::page::text_layout_enum show_text_layout = poppler::page::physical_layout; + +static const ArgDesc the_args[] = { + { "--show-all", argFlag, &show_all, 0, + "show all the available information" }, + { "--show-info", argFlag, &show_info, 0, + "show general document information" }, + { "--show-perm", argFlag, &show_perm, 0, + "show document permissions" }, + { "--show-metadata", argFlag, &show_metadata, 0, + "show document metadata" }, + { "--show-toc", argFlag, &show_toc, 0, + "show the TOC" }, + { "--show-fonts", argFlag, &show_fonts, 0, + "show the document fonts" }, + { "--show-embedded-files", argFlag, &show_embedded_files, 0, + "show the document-level embedded files" }, + { "--show-pages", argFlag, &show_pages, 0, + "show pages information" }, + { "--show-text", argString, &show_text, sizeof(show_text), + "show text (physical|raw) extracted from all pages" }, + { "-h", argFlag, &show_help, 0, + "print usage information" }, + { "--help", argFlag, &show_help, 0, + "print usage information" }, + { NULL, argFlag, 0, 0, NULL } +}; + +static void error(const std::string &msg) +{ + std::cerr << "Error: " << msg << std::endl; + std::cerr << "Exiting..." << std::endl; + exit(1); +} + +std::ostream& operator<<(std::ostream& stream, const poppler::ustring &str) +{ + const poppler::byte_array ba = str.to_utf8(); + for (unsigned int i = 0; i < ba.size(); ++i) { + stream << (char)(ba[i]); + } + return stream; +} + +static std::string out_date(std::time_t date) +{ + if (date != std::time_t(-1)) { +#ifdef HAVE_GMTIME_R + struct tm time; + gmtime_r(&date, &time); + struct tm *t = &time; +#else + struct tm *t = gmtime(&date); +#endif + char buf[32]; + strftime(buf, sizeof(buf) - 1, "%d/%m/%Y %H:%M:%S", t); + return std::string(buf); + } + return std::string("n/a"); +} + +static std::string out_size(int size) +{ + if (size >= 0) { + std::ostringstream ss; + ss << size; + return ss.str(); + } + return std::string("n/a"); +} + +static char charToHex(int x) +{ + return x < 10 ? x + '0' : x - 10 + 'a'; +} + +static std::string out_hex_string(const poppler::byte_array &str) +{ + std::string ret(str.size() * 2, '\0'); + const char *str_p = &str[0]; + for (unsigned int i = 0; i < str.size(); ++i, ++str_p) { + ret[i * 2] = charToHex((*str_p & 0xf0) >> 4); + ret[i * 2 + 1] = charToHex(*str_p & 0xf); + } + return ret; +} + +static std::string out_page_orientation(poppler::page::orientation_enum o) +{ + switch (o) { + case poppler::page::landscape: + return "landscape (90)"; + case poppler::page::portrait: + return "portrait (0)"; + case poppler::page::seascape: + return "seascape (270)"; + case poppler::page::upside_down: + return "upside_downs (180)"; + }; + return "<unknown orientation>"; +} + +static std::string out_font_info_type(poppler::font_info::type_enum t) +{ +#define OUT_FONT_TYPE(thetype) case poppler::font_info::thetype: return #thetype + switch (t) { + OUT_FONT_TYPE(unknown); + OUT_FONT_TYPE(type1); + OUT_FONT_TYPE(type1c); + OUT_FONT_TYPE(type1c_ot); + OUT_FONT_TYPE(type3); + OUT_FONT_TYPE(truetype); + OUT_FONT_TYPE(truetype_ot); + OUT_FONT_TYPE(cid_type0); + OUT_FONT_TYPE(cid_type0c); + OUT_FONT_TYPE(cid_type0c_ot); + OUT_FONT_TYPE(cid_truetype); + OUT_FONT_TYPE(cid_truetype_ot); + } + return "<unknown font type>"; +#undef OUT_FONT_TYPE +} + +static void print_info(poppler::document *doc) +{ + std::cout << "Document information:" << std::endl; + int major = 0, minor = 0; + doc->get_pdf_version(&major, &minor); + std::cout << std::setw(out_width) << "PDF version" << ": " << major << "." << minor << std::endl; + std::string permanent_id, update_id; + if (doc->get_pdf_id(&permanent_id, &update_id)) { + std::cout << std::setw(out_width) << "PDF IDs" << ": P: " << permanent_id << " - U: " << update_id << std::endl; + } else { + std::cout << std::setw(out_width) << "PDF IDs" << ": <none>" << std::endl; + } + const std::vector<std::string> keys = doc->info_keys(); + std::vector<std::string>::const_iterator key_it = keys.begin(), key_end = keys.end(); + for (; key_it != key_end; ++key_it) { + std::cout << std::setw(out_width) << *key_it << ": " << doc->info_key(*key_it) << std::endl; + } + std::cout << std::setw(out_width) << "Date (creation)" << ": " << out_date(doc->info_date("CreationDate")) << std::endl; + std::cout << std::setw(out_width) << "Date (modification)" << ": " << out_date(doc->info_date("ModDate")) << std::endl; + std::cout << std::setw(out_width) << "Number of pages" << ": " << doc->pages() << std::endl; + std::cout << std::setw(out_width) << "Linearized" << ": " << doc->is_linearized() << std::endl; + std::cout << std::setw(out_width) << "Encrypted" << ": " << doc->is_encrypted() << std::endl; + std::cout << std::endl; +} + +static void print_perm(poppler::document *doc) +{ + std::cout << "Document permissions:" << std::endl; +#define OUT_PERM(theperm) \ + std::cout << std::setw(out_width) << #theperm << ": " \ + << doc->has_permission(poppler::perm_##theperm) << std::endl + OUT_PERM(print); + OUT_PERM(change); + OUT_PERM(copy); + OUT_PERM(add_notes); + OUT_PERM(fill_forms); + OUT_PERM(accessibility); + OUT_PERM(assemble); + OUT_PERM(print_high_resolution); + std::cout << std::endl; +#undef OUT_PERM +} + +static void print_metadata(poppler::document *doc) +{ + std::cout << std::setw(out_width) << "Metadata" << ":" << std::endl + << doc->metadata() << std::endl; + std::cout << std::endl; +} + +static void print_toc_item(poppler::toc_item *item, int indent) +{ + std::cout << std::setw(indent * 2) << " " + << "+ " << item->title() << " (" << item->is_open() << ")" + << std::endl; + poppler::toc_item::iterator it = item->children_begin(), it_end = item->children_end(); + for (; it != it_end; ++it) { + print_toc_item(*it, indent + 1); + } +} + +static void print_toc(poppler::toc *doctoc) +{ + std::cout << "Document TOC:" << std::endl; + if (doctoc) { + print_toc_item(doctoc->root(), 0); + } else { + std::cout << "<no TOC>" << std::endl; + } + std::cout << std::endl; +} + +static void print_fonts(poppler::document *doc) +{ + std::cout << "Document fonts:" << std::endl; + std::vector<poppler::font_info> fl = doc->fonts(); + if (!fl.empty()) { + std::vector<poppler::font_info>::const_iterator it = fl.begin(), it_end = fl.end(); + const std::ios_base::fmtflags f = std::cout.flags(); + std::left(std::cout); + for (; it != it_end; ++it) { + std::cout + << " " << std::setw(out_width + 10) << it->name() + << " " << std::setw(15) << out_font_info_type(it->type()) + << " " << std::setw(5) << it->is_embedded() + << " " << std::setw(5) << it->is_subset() + << " " << it->file() + << std::endl; + } + std::cout.flags(f); + } else { + std::cout << "<no fonts>" << std::endl; + } + std::cout << std::endl; +} + +static void print_embedded_files(poppler::document *doc) +{ + std::cout << "Document embedded files:" << std::endl; + std::vector<poppler::embedded_file *> ef = doc->embedded_files(); + if (!ef.empty()) { + std::vector<poppler::embedded_file *>::const_iterator it = ef.begin(), it_end = ef.end(); + const std::ios_base::fmtflags f = std::cout.flags(); + std::left(std::cout); + for (; it != it_end; ++it) { + poppler::embedded_file *f = *it; + std::cout + << " " << std::setw(out_width + 10) << f->name() + << " " << std::setw(10) << out_size(f->size()) + << " " << std::setw(20) << out_date(f->creation_date()) + << " " << std::setw(20) << out_date(f->modification_date()) + << std::endl + << " "; + if (f->description().empty()) { + std::cout << "<no description>"; + } else { + std::cout << f->description(); + } + std::cout + << std::endl + << " " << std::setw(35) << (f->checksum().empty() ? std::string("<no checksum>") : out_hex_string(f->checksum())) + << " " << (f->mime_type().empty() ? std::string("<no mime type>") : f->mime_type()) + << std::endl; + } + std::cout.flags(f); + } else { + std::cout << "<no embedded files>" << std::endl; + } + std::cout << std::endl; +} + +static void print_page(poppler::page *p) +{ + std::cout << std::setw(out_width) << "Rect" << ": " << p->page_rect() << std::endl; + std::cout << std::setw(out_width) << "Label" << ": " << p->label() << std::endl; + std::cout << std::setw(out_width) << "Duration" << ": " << p->duration() << std::endl; + std::cout << std::setw(out_width) << "Orientation" << ": " << out_page_orientation(p->orientation()) << std::endl; + std::cout << std::endl; +} + +static void print_page_text(poppler::page *p) +{ + std::cout << p->text(p->page_rect(), show_text_layout) << std::endl; + std::cout << std::endl; +} + +int main(int argc, char *argv[]) +{ + if (!parseArgs(the_args, &argc, argv) + || argc < 2 || show_help) { + printUsage(argv[0], "DOCUMENT", the_args); + exit(1); + } + + if (show_text[0]) { + if (!memcmp(show_text, "physical", 9)) { + show_text_layout = poppler::page::physical_layout; + } else if (!memcmp(show_text, "raw", 4)) { + show_text_layout = poppler::page::raw_order_layout; + } else { + error(std::string("unrecognized text mode: '") + show_text + "'"); + } + } + + std::string file_name(argv[1]); + + std::auto_ptr<poppler::document> doc(poppler::document::load_from_file(file_name)); + if (!doc.get()) { + error("loading error"); + } + if (doc->is_locked()) { + error("encrypted document"); + } + + std::cout.setf(std::ios_base::boolalpha); + + if (show_all) { + show_info = true; + show_perm = true; + show_metadata = true; + show_toc = true; + show_fonts = true; + show_embedded_files = true; + show_pages = true; + } + + if (show_info) { + print_info(doc.get()); + } + if (show_perm) { + print_perm(doc.get()); + } + if (show_metadata) { + print_metadata(doc.get()); + } + if (show_toc) { + std::auto_ptr<poppler::toc> doctoc(doc->create_toc()); + print_toc(doctoc.get()); + } + if (show_fonts) { + print_fonts(doc.get()); + } + if (show_embedded_files) { + print_embedded_files(doc.get()); + } + if (show_pages) { + const int pages = doc->pages(); + for (int i = 0; i < pages; ++i) { + std::cout << "Page " << (i + 1) << "/" << pages << ":" << std::endl; + std::auto_ptr<poppler::page> p(doc->create_page(i)); + print_page(p.get()); + } + } + if (show_text[0]) { + const int pages = doc->pages(); + for (int i = 0; i < pages; ++i) { + std::cout << "Page " << (i + 1) << "/" << pages << ":" << std::endl; + std::auto_ptr<poppler::page> p(doc->create_page(i)); + print_page_text(p.get()); + } + } + + return 0; +} diff --git a/cpp/tests/poppler-render.cpp b/cpp/tests/poppler-render.cpp new file mode 100644 index 0000000..b440dd4 --- /dev/null +++ b/cpp/tests/poppler-render.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2010, Pino Toscano <pino@kde.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <poppler-document.h> +#include <poppler-image.h> +#include <poppler-page.h> +#include <poppler-page-renderer.h> + +#include <cstdlib> +#include <iostream> +#include <memory> + +#include "parseargs.h" + +bool show_help = false; +bool show_formats = false; +char out_filename[4096]; +int doc_page = 0; + +static const ArgDesc the_args[] = { + { "-f", argFlag, &show_formats, 0, + "show supported output image formats" }, + { "--page", argInt, &doc_page, 0, + "select page to render" }, + { "-o", argString, &out_filename, sizeof(out_filename), + "output filename for the resulting PNG image" }, + { "-h", argFlag, &show_help, 0, + "print usage information" }, + { "--help", argFlag, &show_help, 0, + "print usage information" }, + { NULL, argFlag, 0, 0, NULL } +}; + +static void error(const std::string &msg) +{ + std::cerr << "Error: " << msg << std::endl; + std::cerr << "Exiting..." << std::endl; + exit(1); +} + +int main(int argc, char *argv[]) +{ + if (!parseArgs(the_args, &argc, argv) + || (argc < 2 && !show_formats) || show_help) { + printUsage(argv[0], "DOCUMENT", the_args); + exit(1); + } + + if (show_formats) { + const std::vector<std::string> formats = poppler::image::supported_image_formats(); + std::cout << "Supported image formats:" << std::endl; + for (size_t i = 0; i < formats.size(); ++i) { + std::cout << " " << formats[i] << std::endl; + } + exit(0); + } + + if (!out_filename[0]) { + error("missing output filename (-o)"); + } + + if (!poppler::page_renderer::can_render()) { + error("renderer compiled without Splash support"); + } + + const std::string file_name(argv[1]); + + std::auto_ptr<poppler::document> doc(poppler::document::load_from_file(file_name)); + if (!doc.get()) { + error("loading error"); + } + if (doc->is_locked()) { + error("encrypted document"); + } + + if (doc_page < 0 || doc_page >= doc->pages()) { + error("specified page number out of page count"); + } + std::auto_ptr<poppler::page> p(doc->create_page(doc_page)); + if (!p.get()) { + error("NULL page"); + } + + poppler::page_renderer pr; + pr.set_render_hint(poppler::page_renderer::antialiasing, true); + pr.set_render_hint(poppler::page_renderer::text_antialiasing, true); + + poppler::image img = pr.render_page(p.get()); + if (!img.is_valid()) { + error("rendering failed"); + } + + if (!img.save(out_filename, "png")) { + error("saving to file failed"); + } + + return 0; +} diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..7544a0a --- /dev/null +++ b/debian/changelog @@ -0,0 +1,983 @@ +poppler (0.20.4-8) unstable; urgency=low + + * Smack manifest updated + * Git: external/poppler + * Tag: poppler_0.20.4-8 + + -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 21 Feb 2013 18:04:07 +0900 + +poppler (0.20.4-7) unstable; urgency=low + + * SMACK rules updated + * Git: external/poppler + * Tag: poppler_0.20.4-7 + + -- Danny Jeongseok Seo <s.seo@samsung.com> Thu, 14 Feb 2013 21:59:37 +0900 + +poppler (0.20.4-6) unstable; urgency=low + + * Smack rule updated + * Git: external/poppler + * Tag: poppler_0.20.4-6 + + -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 01 Feb 2013 18:13:11 +0900 + +poppler (0.20.4-5slp2) unstable; urgency=low + + * Enabled poppler-cpp library + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.4-5slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Mon, 10 Dec 2012 20:17:47 +0900 + +poppler (0.20.4-4slp2) unstable; urgency=low + + * Changed libjpeg-devel to libjpeg-turbo-devel + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.4-4slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Wed, 31 Oct 2012 11:32:48 +0900 + +poppler (0.20.4-3slp2) unstable; urgency=low + + * Added license file + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.4-3slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 11 Oct 2012 18:30:48 +0900 + +poppler (0.20.4-2slp2) unstable; urgency=low + + * Added default manifest file + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.4-2slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 21 Sep 2012 13:25:34 +0900 + +poppler (0.20.4-1slp2) unstable; urgency=low + + * Fixed pdftops crash in case of "EndSetup comment is missing". + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.4-1slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Wed, 19 Sep 2012 20:32:24 +0900 + +poppler (0.20.0-6slp2) unstable; urgency=low + + * Fixed build error that there are duplicate files + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.0-6slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Fri, 17 Aug 2012 18:15:40 +0900 + +poppler (0.20.0-5slp2) unstable; urgency=low + + * Added SR Note + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.0-5slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Tue, 14 Aug 2012 10:56:57 +0900 + +poppler (0.20.0-4slp2) unstable; urgency=low + + * Added to remove RPM_BUILD_ROOT before makeinstall + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.0-4slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 02 Aug 2012 08:53:36 +0900 + +poppler (0.20.0-3slp2) unstable; urgency=low + + * Fixed build error caused in finding libpoppler library + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.0-3slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Thu, 02 Aug 2012 08:20:15 +0900 + +poppler (0.20.0-2slp2) unstable; urgency=low + + * Fixed "usr/lib/rpm/check-buildroot" build-error in exynos taget + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.0-2slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Wed, 18 Jul 2012 22:55:22 +0900 + +poppler (0.20.0-1slp2) unstable; urgency=low + + * Update to version 0.20.0 from 0.18.4 + * Git: slp/pkgs/p/poppler + * Tag: poppler_0.20.0-1slp2 + + -- GangHeok Kim <gangheok.kim@samsung.com> Wed, 18 Jul 2012 21:32:42 +0900 + +poppler (0.18.4-1ubuntu2) precise; urgency=low + + * debian/control: Add back libfontconfig1-dev dependency to libpoppler-dev + for the time being, to avoid introducing FTBFS at this point. This will be + dropped again later on when all reverse dependencies have their build deps + fixed. Thanks Pino Toscano for pointing this out! + + -- Martin Pitt <martin.pitt@ubuntu.com> Mon, 27 Feb 2012 08:56:28 +0100 + +poppler (0.18.4-1ubuntu1) precise; urgency=low + + * Merge with Debian experimental to get in sync with current Debian + packaging. Remaining Ubuntu changes: + - debian/control: Lower poppler-data to Suggests:. Too big for CD images, + handled by language-selector. + - debian/control: Drop libopenjpeg-dev build depends, it's in universe. + - 10_fix-a4-page-shift-on-brother-ps-printers.patch, + git_test_rotation.patch: See patch headers. + - Use LCMS 2 instead of deprecated 1: (LP #885324) + o Add poppler-lcm2.patch + o debian/control: Build-depend on liblcms2-dev instead. + + -- Martin Pitt <martin.pitt@ubuntu.com> Tue, 21 Feb 2012 15:04:08 +0100 + +poppler (0.18.4-1) experimental; urgency=low + + * New upstream release. + * Update copyright. + + -- Pino Toscano <pino@debian.org> Sat, 18 Feb 2012 20:22:17 +0100 + +poppler (0.18.3-1) experimental; urgency=low + + * New upstream release: (Closes: #644447) + - fixes rendering of Porirua City overview map. (Closes: #443547) + - shows the names of unknown fonts. (Closes: #524323) + * Rename packages according to the new SONAMEs: + - libpoppler13 -> libpoppler19 + - libpoppler-glib6 -> libpoppler-glib8 + * Bump shlibs for libpoppler-glib8 and libpoppler-qt4-3. + * debian/patches: + - ltmain-as-needed.diff: refresh + * Update copyright. + * Update configure arguments: + - Remove: --disable-poppler-qt, --disable-abiword-output + * Drop test-poppler-glib from libpoppler-glib-dev, as it does not exist + anymore. + * Update build dependencies, dependencies and suggests: + - Switch liblcms-dev to liblcms1-dev, to make it explicit lcms 1 is used. + - Add libtiff-dev (for TIFF support). + - Remove the gnome-pkg-tools B-D, unused. + - libpoppler-dev: remove libfontconfig1-dev. + - libpoppler-private-dev: suggest packages containing headers included in + barely used private poppler core headers: libfreetype6-dev, + libopenjpeg-dev, libpng-dev, libtiff-dev. (Closes: #646688) + - libpoppler-glib-dev: remove libgtk2.0-dev. + * Enable the GObject introspection support (Closes: #617604): + - Add libgirepository1.0-dev and gobject-introspection build dependencies. + - Add a new package gir1.2-poppler-0.18, and make libpoppler-glib-dev + depend on it. + - Enable the introspection in configure arguments. + * Improve description of poppler-utils, also including the new tools + (pdfseparate, pdftocairo, pdfunite). + * Convert convert to the `dh' sequencer: + - Drop cdbs build dependency. + - Bump debhelper build dependency to 7.0.50. + - Make use of the gir dh addon. + - Enable parallel build support. + * Remove ${shlibs:Depends} from poppler-dbg. + * Install the upstream ChangeLog only in the libpopplerN package. + * Convert to multi-arch: + - Bump debhelper build dependency to 8.9.0. + - Bump compat to 9. + - Add dpkg build dependency to 1.16.1. + - libpoppler19, libpoppler-glib8, libpoppler-qt4-3, libpoppler-cpp0: + mark "Multi-Arch: same", and add Pre-Depends. + - poppler-utils: mark "Multi-Arch: foreign". + - Fix (using wildcard) library paths in .install files, taking care of + installing the gir .typelib file in a non-multi-arch path. + * Use DEB_LDFLAGS_MAINT_APPEND in rules to properly append custom LDFLAGS. + (Closes: #651968) + * Make the build verbose (V=1). + + -- Pino Toscano <pino@debian.org> Sun, 12 Feb 2012 22:49:35 +0100 + +poppler (0.16.7-3) unstable; urgency=low + + [ Michael Gilbert ] + * Bump standards to 3.9.2. + * Remove automatically generated glib reference files in clean rule (this + prevents automatic generation of a debian patch on a second build run. + + [ Pino Toscano ] + * Switch to my @debian.org address, I'm a DD now. + * Add a libpoppler-private-dev package: it will contain the private + poppler core headers, but at the moment it is empty to allow sources + to migrate their (build-)dependencies from libpoppler-dev to it. + * control: add Vcs-Browser and Vcs-Git headers. + * control: fix some of the conflict/replaces relations in poppler-utils: + - xpdf-utils: properly set the version for it, and turn into a + breaks/replaces (see also #586620) + - pdftohtml: remove the version, since any newer version would always + conflict with the one in poppler-utils + + -- Pino Toscano <pino@debian.org> Fri, 10 Feb 2012 23:59:28 +0100 + +poppler (0.16.7-2) unstable; urgency=low + + * Upload to unstable. + + -- Pino Toscano <pino@kde.org> Fri, 01 Jul 2011 22:29:43 +0200 + +poppler (0.16.7-1) experimental; urgency=low + + * New upstream release. + * Make sure to really disable the gobject introspection for configure. + * Few touches to descriptions: + - Fix typo in libpoppler-cpp0. + - Correctly capitalize "Xpdf". + * Update copyright. + * Enable as-needed linking: + - Import the ltmain-as-needed.diff (refreshed) patch to allow to pass + -Wl,--as-needed at the beginning of autotools linking lines + - set LDFLAGS to "-Wl,--as-needed" + * Drop abiword support, buggy and dropped in Poppler 0.18: + (Closes: #521456, #618634) + - rules: add --disable-abiword-output + - control: remove the libxml2-dev build-dependency and the pdftoabw + references in the poppler-utils description + - drop patch 03_CVE-2009-3938.patch, no more needed now + - drop pdftoabw.1 manpage + - libpoppler-dev.install: stop installing ABWOutputDev.h + + -- Pino Toscano <pino@kde.org> Fri, 01 Jul 2011 00:47:07 +0200 + +poppler (0.16.3-1) experimental; urgency=low + + [ Pino Toscano ] + * New upstream release: (Closes: #567817, #585434, #592534, #601179, #611874) + - fixes thread-unsafe usage of strtok(). (Closes: #533426) + - pdftohtml correctly rotates images. (Closes: #506785) + - pdftoppm tests correctly for rotation. (Closes: #614831) + - fixes text highlighting. (Closes: #463963) + - fixes image rescaling with cairo. (Closes: #533138) + - fixes/hides some "Illegal entry in bfrange block in ToUnicode CMap" + errors. (Closes: #578050) + - fixes a pdftotext crash. (Closes: #611124) + * Update patches: + - 01_revert_abi_change.patch: remove, obsolete + - 02_autohinting_abi_compatibility.patch: remove, obsolete + - 03_CVE-2009-3938.patch: add two DEP3 headers (with bug number) + - 04_security.patch: remove, applied upstream + * Drop Qt 3 frontend, unused in Debian (and will no more be provided with + Poppler 0.18). (Closes: #604370, #558951) + * Rename packages according to the new SONAMEs: + - libpoppler5 -> libpoppler13 + - libpoppler-glib4 -> libpoppler-glib6 + * Update shlib depends for libpoppler-qt4-3. + * Add packages for the new CPP frontend (libpoppler-cpp0). + * Update build-dependencies and dependencies: + - Bump libglib2.0-dev, libcairo2-dev, gtk-doc-tools, and libqt4-dev + to the versions required upstream. + - Remove obsolete B-D: libqt3-mt-dev, libglade2-dev. + - libpoppler-glib-dev: add libgtk2.0-dev (Closes: #540582), remove + libpango1.0-dev. + * Update configure arguments: + - Add: --enable-xpdf-headers + - Remove: --enable-a4-paper + * Update copyright, adding a small clarifying text that the Poppler license + is GPL v2 only. (Closes: #611259) + * Bump debhelper compatibility to 7: + - Update .install files accordingly. + * libpoppler-dev.install: Avoid installing all the poppler private headers + (even those that will not work), but rely on what poppler installs + and manually copy the few "useful". + * rules: include /usr/share/cdbs/1/rules/utils.mk for list-missing. + * Add myself to the Uploaders. + * Add Homepage field in control. + * Improve descriptions of most of the packages. + + [ Michael Gilbert ] + * Recommend poppler-data (closes: #584503). + * Fix a typo (closes: #582527). + * Update to source format 3.0 (quilt). + - Drop explicit quilt dependency. + * Bump standards version to 3.8.4 (no changes required). + * Add copyright dates to copyright file as stated in README-XPDF. + * Add manpage for pdftoabw (closes: #505147). + + -- Josselin Mouette <joss@debian.org> Thu, 03 Mar 2011 22:14:46 +0100 + +poppler (0.12.4-1.2) unstable; urgency=medium + + * Non-maintainer upload by the Security Team + * Fix CVE-2010-3702, CVE-2010-3703, CVE-2010-3704 and several crashers + (Closes:#599165) + + -- Moritz Mühlenhoff <jmm@debian.org> Sat, 23 Oct 2010 15:59:04 +0200 + +poppler (0.12.4-1.1) unstable; urgency=high + + * Non-maintainer upload. + * Do not conflict with newer versions of xpdf-utils (closes: #586620). + + -- Michael Gilbert <michael.s.gilbert@gmail.com> Fri, 06 Aug 2010 18:51:54 -0400 + +poppler (0.12.4-1) unstable; urgency=low + + * New upstream release. + * Bump Qt requirements. + + -- Josselin Mouette <joss@debian.org> Fri, 16 Apr 2010 19:22:34 +0200 + +poppler (0.12.2-2.1) unstable; urgency=high + + * Non-maintainer upload by the Security Team. + * Fixed CVE-2009-3938 (Closes: #534680) + + -- Giuseppe Iuculano <iuculano@debian.org> Tue, 22 Dec 2009 16:11:27 +0100 + +poppler (0.12.2-2) unstable; urgency=low + + * Switch to quilt to manage patches. + * 01_revert_abi_change.patch: revert upstream commit that introduced + an ABI change in a stable release. Closes: #558463. + * 02_autohinting_abi_compatibility.patch: revert part of another + upstream commit for a similar reason. + + -- Josselin Mouette <joss@debian.org> Mon, 30 Nov 2009 16:51:53 +0100 + +poppler (0.12.2-1) unstable; urgency=low + + * New upstream release. + + -- Josselin Mouette <joss@debian.org> Sat, 28 Nov 2009 13:24:28 +0100 + +poppler (0.12.0-2.1) unstable; urgency=low + + * Non-maintainer upload. + * Include fofi/*.h in /usr/include/poppler/fofi. Closes: #553445. + + -- Matt Kraai <kraai@debian.org> Tue, 10 Nov 2009 19:51:32 -0800 + +poppler (0.12.0-2) unstable; urgency=low + + * copyright: add complete list of copyright holders. + * Upload to unstable. Hold on to your pants. + + -- Josselin Mouette <joss@debian.org> Sat, 17 Oct 2009 10:48:03 +0200 + +poppler (0.12.0-1) experimental; urgency=low + + * New upstream release. Closes: #530731. + * Rename libpoppler4 to libpoppler5. + * Bump shlibs versions. + + -- Josselin Mouette <joss@debian.org> Thu, 24 Sep 2009 16:39:17 +0200 + +poppler (0.10.6-1) unstable; urgency=critical + + * Fix section for the debug package. + * New upstream release. + + Fix problems that happen when parsing broken JBIG2 files. + CVE-2009-0799, CVE-2009-0800, CVE-2009-1179, CVE-2009-1180, + CVE-2009-1181, CVE-2009-1182, CVE-2009-1183, CVE-2009-1187, + CVE-2009-1188. + * Bump libqt4 requirement. + * 10_jpxstream_int_crash.patch: removed, upstream has merged a + different fix quite a while ago. + * Standards version is 3.8.1. + + -- Josselin Mouette <joss@debian.org> Wed, 01 Apr 2009 18:30:04 +0200 + +poppler (0.10.5-1) unstable; urgency=low + + [ Pino Toscano ] + * New upstream release, no API nor ABI changes. + + Fixes crash when rendering documents with optional content. + (Closes: #519494) + * Remove lintian override for poppler-dbg, which is no more needed with + lintian >= 2.2.1. + + -- Josselin Mouette <joss@debian.org> Wed, 01 Apr 2009 15:19:53 +0200 + +poppler (0.10.4-3) unstable; urgency=low + + * Revert previous upload, now openjpeg was built successfully on + alpha. + * Build-depend on libglib2.0-doc to ensure proper xrefs. + + -- Josselin Mouette <joss@debian.org> Tue, 10 Mar 2009 12:03:06 +0100 + +poppler (0.10.4-2) unstable; urgency=low + + * Don’t require openjpeg on alpha, since it doesn’t build there. + + -- Josselin Mouette <joss@debian.org> Sun, 08 Mar 2009 03:33:50 +0100 + +poppler (0.10.4-1) unstable; urgency=low + + [ Pino Toscano ] + * New upstream stable release, with ABI and API changes wrt poppler 0.8. + - Rename libpoppler3 to libpoppler4, libpoppler-glib3 to libpoppler-glib4; + libpoppler-qt2 and libpoppler-qt4-3 are not renamed; update control, + DEB_DH_MAKESHLIBS_ARGS_* in rules, and rename install files. + - Add shlib version for libpoppler-qt4-3. + - Drop patches 60_manpages-cfg-flag.patch, 61_manpages-hyphens.patch, and + 62_pdftops-mandatory-arg.patch, merged upstream. + * Build-dep on libopenjpeg-dev for better JPEG2000 reading. + + [ Josselin Mouette ] + * Build-depend explicitly on libjpeg-dev, libfreetype6-dev and + libxml2-dev. + * Bump requirement on libqt4-dev. + + -- Josselin Mouette <joss@debian.org> Fri, 06 Mar 2009 12:54:09 +0100 + +poppler (0.8.7-1) unstable; urgency=low + + * Bump up Standards-Version to 3.8.0. + * New patch, 61_manpages-hyphens, fixes escaping of hyphens in man pages; + FreeDesktop #17225. + * New patch, 62_pdftops-mandatory-arg, fixes synopsis of pdftops in man page + to clarify that a PDF file is required in all cases; FreeDesktop #17226; + closes: #491816. + * Build-dep on cdbs (>= 0.4.52) and add a lintian override with rationale + for the following lintian warning: + W: poppler-dbg: dbg-package-missing-depends poppler + * Add xrefs and CVE for #489756 in 0.8.5-1 as I didn't merge the 0.8.4-1.1 + NMU. + * New upstream release; no API change, bug fixes. + + -- Loic Minier <lool@dooz.org> Wed, 20 Aug 2008 17:36:12 +0200 + +poppler (0.8.6-1) unstable; urgency=low + + * Fix /usr/share/gtk-doc/html/poppler symlink to point at + /usr/share/doc/libpoppler-glib-dev/html/poppler instead of + /usr/share/doc/libpoppler-glib-dev/html; LP: #226677. + * New upstream stable release; bug fixes, no API change. + * New patch, 60_manpages-cfg-flag, drop unimplemented -cfg flag from man + pages; FreeDesktop #17222; closes: #461961. + * Rename patch 001_jpxstream_int_crash to 10_jpxstream_int_crash as we don't + have that many patches; also add upstream bug id (FreeDesktop #5667) and + refresh to apply cleanly. + * Build-dep on pkg-config >= 0.18 to make sure -lpoppler is only in + poppler-qt's Libs.private (it already is though); closes: #360595. + + -- Loic Minier <lool@dooz.org> Fri, 01 Aug 2008 15:04:05 +0200 + +poppler (0.8.5-1) unstable; urgency=low + + * New upstream release; no API changes, misc fixes. + - Initializes pageWidgets in Page.cc, otherwise it can be a rubbish + pointer as Annots is not a valid object; upstream commit + fd0bf8b05cb155e2f29df31fa01964b12e710b89; CVE-2008-2950; + closes: #489756. + + -- Loic Minier <lool@dooz.org> Wed, 30 Jul 2008 14:52:42 +0200 + +poppler (0.8.4-1) unstable; urgency=low + + * New upstream release; no API change. + - Fixes crash when reloading PDFs; GNOME #536482; closes: 484160. + + -- Loic Minier <lool@dooz.org> Mon, 30 Jun 2008 10:44:16 +0200 + +poppler (0.8.3-1) unstable; urgency=low + + * New upstream release. Closes: #487214. + + Fix crasher with some PDF files. Closes: #484224. + + -- Josselin Mouette <joss@debian.org> Wed, 25 Jun 2008 16:40:39 +0200 + +poppler (0.8.2-2) unstable; urgency=low + + * Upload to unstable. + * Set myself as Maintainer instead of Uploader, taking over from Ondřej Surý + but I wish we move to an official team; closes: #481323. + + -- Loic Minier <lool@dooz.org> Thu, 15 May 2008 12:33:18 +0200 + +poppler (0.8.2-1) experimental; urgency=low + + * New upstream releases. + - Drop patch 006_pthreads_ldflags, upstream now calls ACX_PTHREAD() in + configure.ac which does the right thing. + - Drop patch 102_embedded-font-fixes, merged upstream. + + -- Loic Minier <lool@dooz.org> Sun, 11 May 2008 01:02:22 +0200 + +poppler (0.8.0-1) experimental; urgency=low + + * Bump libcairo2-dev build-dep and dep to >= 1.4; thanks + Marc 'HE' Brockschmidt. + * New upstream stable release, with ABI and API changes; closes: #476323. + - Rename libpoppler2 to libpoppler3, libpoppler-glib2 to libpoppler-glib3, + and libpoppler-qt4-2 to libpoppler-qt4-3; NB: libpoppler-qt2 not + renamed; update control, DEB_DH_MAKESHLIBS_ARGS_* in rules, rename + install files. + - Drop shlib version except for libpoppler-qt2. + - Update patch 006_pthreads_ldflags for the version-info changes in + poppler/Makefile.am. + - Force usage of qt4's moc via a PATH setting; export PATH. + * Let libpoppler-glib-dev depend on libglib2.0-dev >= 2.6 for consistency + with build-deps. + * New patch, 102_embedded-font-fixes; protects the methods of the Object + class to be more robust and prevent things like CVE-2008-1693; see also + FreeDesktop/Poppler #11392; taken from the Ubuntu package; + closes: #476842. + * Add a poppler-dbg package; closes: #408403. + - Bump up cdbs build-dep to >= 0.4.51 for -dbg handling fixes. + - Add poppler-dbg to control. + + -- Loic Minier <lool@dooz.org> Mon, 17 Mar 2008 21:00:13 +0100 + +poppler (0.6.4-1) unstable; urgency=medium + + * Add ${shlibs:Depends} to libpoppler-glib-dev, libpoppler-dev, + libpoppler-qt-dev, libpoppler-qt4-dev. + * Add ${misc:Depends}. + * Cleanups. + * New upstream releases; no API change; bug fixes; closes: #459342. + * Fix copyright information to use version 2 of the GPL (instead of version 2 + or later); thanks Timo Jyrinki for the patch; closes: #453865. + * Urgency medium for RC bug fix. + * List pdftohtml in poppler-utils' description; closes: #464439. + * Drop libpoppler-qt-dev dependency from libpoppler-qt4-dev; thanks + Pino Toscano; closes: #459922. + * Bump up Standards-Version to 3.7.3. + + -- Loic Minier <lool@dooz.org> Fri, 18 Jan 2008 13:35:06 +0100 + +poppler (0.6.2-1) unstable; urgency=low + + * New upstream version. (Closes: #447992) + * Dependency on xpdfrc was removed on 2007-02-25 (Closes: #347789, #440936) + * Changes since 0.6.1: + - Fix CVE-2007-4352, CVE-2007-5392 and CVE-2007-5393 (Closes: #450628) + - Fix a crash on documents with wrong CCITTFaxStream + - Fix a crash in the Cairo renderer with invalid embedded fonts + - Fix a crash with invalid TrueType fonts + - Check if font is inside the clip area before rendering + it to a temporary bitmap in the Splash renderer. Fixes crashes on + incorrect documents + - Do not use exit(1) on DCTStream errors + - Detect form fields at any depth level + - Do not generate appearance stream for radio buttons that are not active + + -- Ondřej Surý <ondrej@debian.org> Wed, 14 Nov 2007 11:20:07 +0100 + +poppler (0.6.1-2) unstable; urgency=low + + * Upload to unstable. + + -- Ondřej Surý <ondrej@debian.org> Tue, 06 Nov 2007 09:07:10 +0100 + +poppler (0.6.1-1) experimental; urgency=low + + * New upstream version. + * Changes since 0.6.0: + - poppler core: + + Fix printing with different x and y scale + + Fix crash when Form Fields array contains references to non + existent objects + + Fix crash in CairoOutputDev::drawMaskedImage() + + Fix embedded file description not working on some cases + - Qt4 frontend: + + Fix printing issue + + Avoid double free + + Fix memory leak when dealing with embedded files + - glib frontend: + + Fix build with --disable-cairo-output + + Do not return unknown field type for signature form fields + - build system: + + Support automake-1.10 + + More compatible sh code in qt.m4 + - utils: + + Fix build on Sun Studio compiler + + -- Ondřej Surý <ondrej@debian.org> Thu, 25 Oct 2007 11:33:04 +0200 + +poppler (0.6-1) experimental; urgency=low + + * New upstream release. (Closes: #429700) + - merged changes from Ubuntu, courtesy of Sebastien Bacher <seb128@canonical.com> + - Fix security issue MOAB-06-01-2007 + - Fix security issue CVE-2007-3387 + - Fix security issue CVE-2007-5049 (Closes: #443903) + * debian/watch: + - update (Closes: #441012) + * debian/control, debian/libpoppler2.install, debian/libpoppler-glib2.install, + debian/libpoppler-qt2.install, debian/libpoppler-qt4-2.install, + debian/rules: + - updated for soname change + * debian/libpoppler-glib-dev.install: + - install new test-poppler-glib + * debian/patches/002_CVE-2006-0301.patch: + - dropped, deprecated by the upstream changes + * debian/patches/003_glib-2.0-configure.patch: + * debian/patches/004_CVE-2007-0104.patch: + * debian/patches/005_fix_inverted_text_from_bug_8944.patch: + - dropped, fixed with the new version + * debian/patches/006_pthreads_ldflags.patch: + - updated + + -- Ondřej Surý <ondrej@debian.org> Thu, 27 Sep 2007 09:03:33 +0200 + +poppler (0.5.4-6) unstable; urgency=low + + * Conflict with old library names from experimental. (Closes: #426023) + + -- Ondřej Surý <ondrej@debian.org> Wed, 30 May 2007 08:42:32 +0200 + +poppler (0.5.4-5) unstable; urgency=low + + * Add missing poppler/poppler-link-qt3.h header to libpoppler-qt-dev; thanks + Sune Vuorela; closes: #425486. + * Let libpoppler-qt4-dev depend on libpoppler-qt-dev since some of its + headers require poppler-page-transition.h which is clearly from the Qt + bindings; thanks Sune Vuorela; closes: #425540. + * Wrap build-deps and deps. + * Drop useless debian/*.dirs. + * Misc cleanups. + * Build-dep on autotools-dev and drop bogus lintian overrides. + + -- Loic Minier <lool@dooz.org> Thu, 24 May 2007 23:09:23 +0200 + +poppler (0.5.4-4) unstable; urgency=low + + * The "Augean Stables" release. + * 0.5.x branch fixes all kind of displaying errors + Closes: #372169, #235360, #331380, #332426, #336616 + Closes: #402647, #369164, #413953, #343654 + * Add versioned conflict to pdftohtml (Closes: #393169) + * We dropped .la files some time ago, libjpeg62-dev dependency not + needed now (Closes: #413112) + * Crash fixed in 0.5.4 (Closes: #418638) + * [control.in]: dropped some time ago (Closes: #407818) + * NMU 0.5.4-5.1 merged as 004_CVE-2007-0104.patch (Closes: #407810) + * 0.5.x uploaded to unstable (Closes: #352522) + * qt4 libraries are now part of build (Closes: #414643) + * No longer depends on poppler-data (Closes: #389753) + * [debian/patches/006_pthreads_ldflags.patch]: + + Add -lpthread to poppler/Makefile.am (Closes: #399275) + + -- Ondřej Surý <ondrej@debian.org> Wed, 16 May 2007 10:45:39 +0200 + +poppler (0.5.4-3) unstable; urgency=low + + * Upload to unstable. + * Enable Cairo output again. + * Enable gtk-doc build. + * Add lintian override for outdated-autotools-helper-files (we use CDBS). + * Change shared library packages names according to Library Packaging Guide. + * Change ${Source-Version} to ${binary:Version} to allow binNMU + * Drop (= ${Source-Version}) dependency in glib, qt3, qt4 libraries; we are + adding that from debian/rules + * Merge changes from Ubuntu: + + Enable Qt4 library build (but change name to libpoppler-qt4-1). + + [debian/patches/004_CVE-2007-0104.patch]: + - Limit recursion depth of the parsing tree to 100 to avoid infinite loop + with crafted documents. + - Patch taken from koffice security update (which has a copy of xpdf + sources). + + [debian/patches/005_fix_inverted_text_from_bug_8944.patch]: + - fixes "text is inverted in some PDFs" + + -- Ondřej Surý <ondrej@debian.org> Wed, 16 May 2007 08:26:47 +0200 + +poppler (0.5.4-2) experimental; urgency=low + + * [debian/control]: poppler-data is non-free, do not depend on it (Closes: #389753) + + -- Ondřej Surý <ondrej@debian.org> Mon, 2 Oct 2006 14:41:58 +0200 + +poppler (0.5.4-1) experimental; urgency=low + + * New upstrem release. + * [debian/control.in]: remove file and add all pkg-freedesktop people + to Uploaders: field + * [debian/control]: Add dependency on poppler-data package. + * [debian/patches/03_glib-2.0-configure.patch]: fix broken configure.ac + + -- Ondřej Surý <ondrej@debian.org> Fri, 22 Sep 2006 16:49:17 +0200 + +poppler (0.5.3-1) experimental; urgency=low + + * New upstream release. + * debian/lib{poppler,poppler-glib,poppler-qt}-dev.install: + Stop shipping /usr/lib/*.la in libpoppler*-dev. + + -- Ondřej Surý <ondrej@debian.org> Wed, 31 May 2006 17:19:34 +0200 + +poppler (0.5.2-1) experimental; urgency=low + + * New upstream release. + * Remove patches adopted upstream: + debian/patches/000_incorrect_define_fix.patch + debian/patches/000_splash_build_fix.patch + + -- Ondřej Surý <ondrej@debian.org> Tue, 23 May 2006 20:21:30 +0200 + +poppler (0.5.1-1) experimental; urgency=low + + * Merge back changes from Ubuntu. + * Upload to experimental (Closes: 352522) + + -- Ondřej Surý <ondrej@debian.org> Tue, 18 Apr 2006 15:08:26 +0200 + +poppler (0.5.1-0ubuntu6) dapper; urgency=low + + * Install poppler-page-transition into libpoppler-qt-dev (not + libpoppler-dev), since it comes from the Qt bindings. Closes: LP#32179 + + -- Martin Pitt <martin.pitt@ubuntu.com> Mon, 10 Apr 2006 12:20:46 +0200 + +poppler (0.5.1-0ubuntu5) dapper; urgency=low + + * debian/patches/000_incorrect_define_fix.patch: + - patch from the CVS, fix an incorrect boxes rendering (Ubuntu: #33239) + + -- Sebastien Bacher <seb128@canonical.com> Thu, 23 Mar 2006 12:33:17 +0100 + +poppler (0.5.1-0ubuntu4) dapper; urgency=low + + * debian/control.in: libpoppler-dev needs to depend on libfontconfig1-dev, + because we directly include <fontconfig/fontconfig.h> in GlobalParams.h + + -- Adam Conrad <adconrad@ubuntu.com> Thu, 16 Mar 2006 11:23:00 +1100 + +poppler (0.5.1-0ubuntu3) dapper; urgency=low + + * debian/control.in: Have poppler-utils Replace: xpdf-reader, since both + contain pdftoppm.1.gz. + + -- Martin Pitt <martin.pitt@ubuntu.com> Mon, 13 Mar 2006 09:10:12 +0100 + +poppler (0.5.1-0ubuntu2) dapper; urgency=low + + * debian/control.in: + - fix the libpoppler1 package description + + -- Sebastien Bacher <seb128@canonical.com> Thu, 9 Mar 2006 09:43:15 +0000 + +poppler (0.5.1-0ubuntu1) dapper; urgency=low + + * New upstream version: + - Support for embedded files. + - Handle 0-width lines correctly. + - Avoid external file use when opening fonts. + - Only use vector fonts returned from fontconfig (#5758). + - Fix scaled 1x1 pixmaps use for drawing lines (#3387). + - drawSoftMaskedImage support in cairo backend. + - Misc bug fixes: #5922, #5946, #5749, #5952, #4030, #5420. + * debian/control.in, debian/libpoppler0c2.dirs, + debian/libpoppler0c2-glib.dirs, debian/libpoppler0c2-glib.install, + debian/libpoppler0c2.install, debian/libpoppler0c2-qt.dirs, + debian/libpoppler0c2-qt.install, debian/rules: + - updated for the soname change + * debian/patches/000_splash_build_fix.patch: + - fix build when using splash + * debian/patches/001_fixes_for_fonts_selection.patch: + - fix with the new version + + -- Sebastien Bacher <seb128@canonical.com> Mon, 6 Mar 2006 18:42:44 +0000 + +poppler (0.5.0-0ubuntu5) dapper; urgency=low + + * debian/control.in, debian/rules: + - build without libcairo + + -- Sebastien Bacher <seb128@canonical.com> Sun, 26 Feb 2006 20:05:10 +0100 + +poppler (0.5.0-0ubuntu4) dapper; urgency=low + + * debian/patches/001_fixes_for_fonts_selection.patch: + - change from the CVS, fix some renderings issues and fonts selection + + -- Sebastien Bacher <seb128@canonical.com> Tue, 7 Feb 2006 13:38:04 +0100 + +poppler (0.5.0-0ubuntu3) dapper; urgency=low + + * SECURITY UPDATE: Buffer overflow. + * Add debian/patches/002_CVE-2006-0301.patch: + - splash/Splash.cc, Splash::drawPixel(), Splash::drawSpan(), + Splash::xorSpan(): Check coordinates for integer overflow. + * CVE-2006-0301 + + -- Martin Pitt <martin.pitt@ubuntu.com> Fri, 3 Feb 2006 18:13:30 +0000 + +poppler (0.5.0-0ubuntu2) dapper; urgency=low + + * debian/rules: Bump shlibs version to 0.5.0. + + -- Martin Pitt <martin.pitt@ubuntu.com> Fri, 20 Jan 2006 16:56:40 +0100 + +poppler (0.5.0-0ubuntu1) dapper; urgency=low + + * New upstream release 0.5.0, required for new evince 0.5. + * Merge with Debian. + * Remove patches adopted upstream: + - debian/patches/000_add-poppler-utils.patch + - debian/patches/002-selection-crash-bug.patch + * debian/libpoppler-dev.install: + - Install poppler-page-transition.h. + - Do not install poppler-config.h, it doesn't exist any more. + - Upstream doesn't install legacy xpdf includes any more, fix path to + install them into libpoppler-dev. + * Add debian/patches/001_jpxstream_int_crash.patch: + - poppler/JPXStream.h: Fix declaration of cbW to be signed. + JPXStream.cc, readCodeBlockData() negates the value, which results in an + invalid value on 64 bit platforms if using unsigned types. + - Thanks to Vladimir Nadvornik for pointing at this. + + -- Martin Pitt <martin.pitt@ubuntu.com> Thu, 19 Jan 2006 23:49:52 +0100 + +poppler (0.4.4-1) unstable; urgency=high + + * New upstream security release + - fixes CVE-2005-3624, CVE-2005-3625, CVE-2005-3627 + * Remove debian/patches/003-CVE-2005-3624_5_7.patch: + - Merged upstream + * Remove debian/patches/004-fix-CVE-2005-3192.patch: + - Merged upstream + * Remove debian/patches/001-relibtoolize.patch + - Upstream uses recent libtool + + -- Ondřej Surý <ondrej@debian.org> Thu, 12 Jan 2006 20:40:27 +0100 + +poppler (0.4.3-3) unstable; urgency=low + + * Fix missing libcairo2-dev dependency (Closes: #346277) + + -- Ondřej Surý <ondrej@debian.org> Fri, 6 Jan 2006 21:37:10 +0100 + +poppler (0.4.3-2) unstable; urgency=high + + [ Martin Pitt ] + * SECURITY UPDATE: Multiple integer/buffer overflows. + * Add debian/patches/003-CVE-2005-3624_5_7.patch: + - poppler/Stream.cc, CCITTFaxStream::CCITTFaxStream(): + + Check columns for negative or large values. + + CVE-2005-3624 + - poppler/Stream.cc, numComps checks introduced in CVE-2005-3191 patch: + + Reset numComps to 0 since it's a global variable that is used later. + + CVE-2005-3627 + - poppler/Stream.cc, DCTStream::readHuffmanTables(): + + Fix out of bounds array access in Huffman tables. + + CVE-2005-3627 + - poppler/Stream.cc, DCTStream::readMarker(): + + Check for EOF in while loop to prevent endless loops. + + CVE-2005-3625 + - poppler/JBIG2Stream.cc, JBIG2Bitmap::JBIG2Bitmap(), + JBIG2Bitmap::expand(), JBIG2Stream::readHalftoneRegionSeg(): + + Check user supplied width and height against invalid values. + + Allocate one extra byte to prevent out of bounds access in combine(). + * Add debian/patches/004-fix-CVE-2005-3192.patch: + - Fix nVals int overflow check in StreamPredictor::StreamPredictor(). + - Forwarded upstream to https://bugs.freedesktop.org/show_bug.cgi?id=5514. + + [ Ondřej Surý ] + * Merge changes from Ubuntu (Closes: #346076). + * Enable Cairo output again. + + -- Ondřej Surý <ondrej@debian.org> Thu, 5 Jan 2006 14:54:44 +0100 + +poppler (0.4.3-1) unstable; urgency=high + + * New upstream release. + * New maintainer (Closes: #344738) + * CVE-2005-3191 and CAN-2005-2097 fixes merged upstream. + * Fixed some rendering bugs and disabled Cairo output + (Closes: #314556, #322964, #328211) + * Acknowledge NMU (Closes: #342288) + * Add 001-selection-crash-bug.patch (Closes: #330544) + * Add poppler-utils (merge patch from Ubuntu) + + -- Ondřej Surý <ondrej@sury.org> Fri, 30 Dec 2005 11:34:07 +0100 + +poppler (0.4.2-1.1) unstable; urgency=high + + * SECURITY UPDATE: Multiple integer/buffer overflows. + + * NMU to fix RC security bug (closes: #342288) + * Add debian/patches/04_CVE-2005-3191_2_3.patch taken from Ubuntu, + thanks to Martin Pitt: + * poppler/Stream.cc, DCTStream::readBaselineSOF(), + DCTStream::readProgressiveSOF(), DCTStream::readScanInfo(): + - Check numComps for invalid values. + - http://www.idefense.com/application/poi/display?id=342&type=vulnerabilities + - CVE-2005-3191 + * poppler/Stream.cc, StreamPredictor::StreamPredictor(): + - Check rowBytes for invalid values. + - http://www.idefense.com/application/poi/display?id=344&type=vulnerabilities + - CVE-2005-3192 + * poppler/JPXStream.cc, JPXStream::readCodestream(): + - Check img.nXTiles * img.nYTiles for integer overflow. + - http://www.idefense.com/application/poi/display?id=345&type=vulnerabilities + - CVE-2005-3193 + + -- Frank Küster <frank@debian.org> Fri, 23 Dec 2005 16:36:30 +0100 + +poppler (0.4.2-1) unstable; urgency=low + + * GNOME Team upload. + * New upstream version. + * debian/control.in: + - updated the Build-Depends on libqt (Closes: #326130). + * debian/rules: + - updated the shlibs. + + -- Sebastien Bacher <seb128@debian.org> Wed, 7 Sep 2005 12:41:48 +0200 + +poppler (0.4.0-1) unstable; urgency=low + + * GNOME Team Upload. + * Rebuild for the CPP transition. + * New upstream version (Closes: #311133): + - fix some crashers (Closes: #315590, #312261, #309410). + - fix some rendering defaults (Closes: #314441, #315383, #309697, #308785). + * debian/control.in, debian/rules: + - build with the current cairo version (Closes: #321368, #318293). + - update for the renamed the packages. + * debian/patches/01_CAN-2005-2097.patch: + - Patch from Ubuntu, thanks Martin Pitt. + - Check sanity of the TrueType "loca" table. Specially crafted broken + tables caused disk space exhaustion due to very large generated glyph + descriptions when attempting to fix the table. + - Upstream patch scheduled for xpdf 3.01. + - CAN-2005-2097 + * debian/watch: + - fixed, patch by Jerome Warnier <jwarnier@beeznest.net> (Closes: #310996). + + -- Sebastien Bacher <seb128@debian.org> Wed, 17 Aug 2005 21:54:07 +0200 + +poppler (0.3.1-1) unstable; urgency=low + + * New upstream release + * Upstream fixed the Qt build bug, so now I can enable Qt + build. (Closes:#307340) It leads two new binary packages + libpoppler0-qt and libpoppler-qt-dev. + * Excluded DEB_CONFIGURE_SYSCONFDIR setting, which is obsolete by the + upstream removal of xpdfrc config. + + -- Changwoo Ryu <cwryu@debian.org> Wed, 4 May 2005 00:19:35 +0900 + +poppler (0.3.0-2) unstable; urgency=high + + * Added shlib version info for libpoppler0-glib. + * Corrected dependencies of libpoppler0-glib and libpoppler-glib-dev. + (Closes: #306897) + * Build-Depends on libgtk2.0-dev for -glib packages. (Closes: #306885) + * Corrected descriptions of -glib packages. + + -- Changwoo Ryu <cwryu@debian.org> Thu, 28 Apr 2005 02:41:25 +0900 + +poppler (0.3.0-1) unstable; urgency=low + + * New upstream release (Closes: #306573) + * Added new binary packages libpoppler0-glib and libpoppler-glib-dev, + which are GLib-based interfaces. Qt interface build is termporarily + disabled, because of an upstream FTBFS. + + -- Changwoo Ryu <cwryu@debian.org> Thu, 28 Apr 2005 02:07:23 +0900 + +poppler (0.1.2-1) unstable; urgency=low + + * Initial Release (Closes: #299518) + + -- Changwoo Ryu <cwryu@debian.org> Tue, 15 Mar 2005 02:08:00 +0900 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +8 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..7908367 --- /dev/null +++ b/debian/control @@ -0,0 +1,213 @@ +Source: poppler +Section: devel +Priority: optional +Maintainer: GangHeok Kim <gangheok.kim@samsung.com>, TaekSu Shin <taeksu.shin@samsung.com> +Uploaders: GangHeok Kim <gangheok.kim@samsung.com> +Build-Depends: debhelper (>= 8), + autotools-dev, + libfontconfig1-dev, + libjpeg-dev, + libpng-dev, + liblcms2-dev, + libfreetype6-dev, + pkg-config (>= 0.18), + libcairo2-dev (>= 1.10.0), + libtiff-dev, + libglib2.0-dev (>= 2.18), + libcurl-dev +# debhelper (>= 8.9.0), +# gtk-doc-tools (>= 1.14), +# libgirepository1.0-dev (>= 1.31.0-2~), +# gobject-introspection (>= 1.31.0-2~), +# libglib2.0-doc +# libqt4-dev (>= 4.4.0), +# libgtk2.0-dev (>= 2.12), +# libgtk2.0-dev (>= 2.12), +# dpkg (>= 1.16.1), +Standards-Version: 3.9.2 +Homepage: http://poppler.freedesktop.org/ +Vcs-Git: git://git.debian.org/pkg-freedesktop/poppler.git +Vcs-Browser: http://git.debian.org/?p=pkg-freedesktop/poppler.git + +Package: libpoppler25 +Architecture: any +Section: libs +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Depends: ${shlibs:Depends}, + ${misc:Depends} +Suggests: poppler-data +Description: PDF rendering library + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains the shared core library. + +Package: libpoppler-dev +Architecture: any +Section: libdevel +Depends: libpoppler25 (= ${binary:Version}), + ${shlibs:Depends}, + ${misc:Depends}, + libfontconfig1-dev +Description: PDF rendering library -- development files + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains the headers and development libraries needed to + build applications using Poppler. + +Package: libpoppler-private-dev +Architecture: any +Section: libdevel +Depends: libpoppler-dev (= ${binary:Version}), + ${misc:Depends} +Suggests: libfreetype6-dev, + libopenjpeg-dev, + libpng-dev, + libtiff-dev +Description: PDF rendering library -- private development files + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains the private and unstable headers needed to build + applications using the private Poppler core library. + (At the moment this package is empty, allowing the migration of sources + to this package instead of libpoppler-dev.) + +Package: libpoppler-glib8 +Architecture: any +Section: libs +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: PDF rendering library (GLib-based shared library) + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package provides the GLib-based shared library for applications + using the GLib interface to Poppler. + +Package: libpoppler-glib-dev +Architecture: any +Section: libdevel +Depends: libpoppler-glib8 (= ${binary:Version}), + libpoppler-dev (= ${binary:Version}), + libglib2.0-dev (>= 2.18), + libcairo2-dev (>= 1.10.0), + ${shlibs:Depends}, + ${misc:Depends} +# gir1.2-poppler-0.18 (= ${binary:Version}), +Description: PDF rendering library -- development files (GLib interface) + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains the headers and development libraries needed to + build applications using the GLib-based Poppler interface. + +#Package: gir1.2-poppler-0.18 +#Architecture: any +#Section: introspection +#Depends: ${shlibs:Depends}, +# ${misc:Depends}, +# ${gir:Depends} +#Description: GObject introspection data for poppler-glib +# Poppler is a PDF rendering library based on Xpdf PDF viewer. +# . +# This package contains introspection data for poppler-glib. +# . +# It can be used by packages using the GIRepository format to generate +# dynamic bindings. + +#Package: libpoppler-qt4-3 +#Architecture: any +#Section: libs +#Multi-Arch: same +#Pre-Depends: ${misc:Pre-Depends} +#Depends: ${shlibs:Depends}, +# ${misc:Depends} +#Description: PDF rendering library (Qt 4 based shared library) +# Poppler is a PDF rendering library based on Xpdf PDF viewer. +# . +# This package provides the Qt 4 based shared library for applications +# using the Qt 4 interface to Poppler. + +#Package: libpoppler-qt4-dev +#Architecture: any +#Section: libdevel +#Depends: libpoppler-qt4-3 (= ${binary:Version}), +# libpoppler-dev (= ${binary:Version}), +# libqt4-dev (>= 4.4.0), +# ${shlibs:Depends}, +# ${misc:Depends} +#Description: PDF rendering library -- development files (Qt 4 interface) +# Poppler is a PDF rendering library based on Xpdf PDF viewer. +# . +# This package contains the headers and development libraries needed to +# build applications using the Qt 4-based Poppler interface. + +#Package: libpoppler-cpp0 +#Architecture: any +#Section: libs +#Multi-Arch: same +#Pre-Depends: ${misc:Pre-Depends} +#Depends: ${shlibs:Depends}, +# ${misc:Depends} +#Description: PDF rendering library (CPP shared library) +# Poppler is a PDF rendering library based on Xpdf PDF viewer. +# . +# This package provides the CPP shared library for applications +# using a simple C++ interface (using STL, and no other dependency) to Poppler. + +#Package: libpoppler-cpp-dev +#Architecture: any +#Section: libdevel +#Depends: libpoppler-cpp0 (= ${binary:Version}), +# libpoppler-dev (= ${binary:Version}), +# ${shlibs:Depends}, +# ${misc:Depends} +#Description: PDF rendering library -- development files (CPP interface) +# Poppler is a PDF rendering library based on Xpdf PDF viewer. +# . +# This package contains the headers and development libraries needed to +# build applications using the C++ Poppler interface. + +Package: poppler-utils +Architecture: any +Section: utils +Multi-Arch: foreign +Depends: ${shlibs:Depends}, + ${misc:Depends} +Recommends: ghostscript +Breaks: xpdf-utils (<< 3.02-2~) +Conflicts: pdftohtml +Replaces: xpdf-utils (<< 3.02-2~), + pdftohtml, + xpdf-reader +Provides: xpdf-utils, + pdftohtml +Description: PDF utilities (based on Poppler) + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains command line utilities (based on Poppler) for getting + information of PDF documents, convert them to other formats, or manipulate + them: + * pdffonts -- font analyzer + * pdfimages -- image extractor + * pdfinfo -- document information + * pdfseparate -- page extraction tool + * pdftocairo -- PDF to PNG/JPEG/PDF/PS/EPS/SVG converter using Cairo + * pdftohtml -- PDF to HTML converter + * pdftoppm -- PDF to PPM/PNG/JPEG image converter + * pdftops -- PDF to PostScript (PS) converter + * pdftotext -- text extraction + * pdfunite -- document merging tool + +Package: poppler-dbg +Architecture: any +Section: debug +Priority: extra +Depends: ${misc:Depends}, + libpoppler25 (= ${binary:Version}) +Description: PDF rendering library -- debugging symbols + Poppler is a PDF rendering library based on Xpdf PDF viewer. + . + This package contains the debugging symbols for all the Poppler libraries + and the utilities. + diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..266e251 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,177 @@ +This package was debianized by Changwoo Ryu <cwryu@debian.org>. + +It was downloaded from http://poppler.freedesktop.org + +Upstream Authors: + + Derek Noonburg <derekn@foolabs.com> + Kristian Høgsberg <krh@bitplanet.net> + Albert Astals Cid <aacid@kde.org> + +Copyright: + + Copyright © 2008 Adam Batkin + Copyright © Adobe Systems Inc. + Copyright © 2007-2012 Adrian Johnson + Copyright © 2008 Adrian Page + Copyright © 2004-2012 Albert Astals Cid + Copyright © 2006-2010 Alexander Neundorf + Copyright © 2012 Alexander Saprykin + Copyright © 2011 Andrea Canciani + Copyright © 2011 Andreas Hartmetz + Copyright © 2012 Arseny Solokha + Copyright © 2009, 2011 Axel Strübing + Copyright © 2008 Boris Toloknov + Copyright © 2005-2008 Brad Hards + Copyright © 2010 Brian Cameron + Copyright © 2010 Brian Ewins + Copyright © 2006-2011 Carlos Garcia Campos + Copyright © 2008 Carl Worth + Copyright © 2010 Christian Feuersänger + Copyright © 2009 Christian Persch + Copyright © 2008-2009 Chris Wilson + Copyright © 1998-2003 Daniel Veillard + Copyright © 2011 Daiki Ueno + Copyright © 2005 Dan Sheridan + Copyright © 2011 Daniel Glöckner + Copyright © 2009 Darren Kenny + Copyright © 2009-2010 David Benjamin + Copyright © 2006 David Faure + Copyright © 1997, Derek B. Noonburg + Copyright © 2006-2007 Dominic Lachowicz + Copyright © 2008 Ed Avis + Copyright © 2006-2007 Ed Catmur + Copyright © 2011 Edward Jiang + Copyright © 2004 Enrico Ros + Copyright © 2009 Eric Toombs + Copyright © 1989, 1991, 1994-2009 Free Software Foundation, Inc. + Copyright © 1996-2007 Glyph & Cog, LLC. + Copyright © 2009 Glenn Ganz + Copyright © 1999-2000 Gueorgui Ovtcharov + Copyright © 2010 Guillermo Amaral + Copyright © 2010 Harry Roberts + Copyright © 2008 Haruyuki Kawabe + Copyright © 2008, 2010-2012 Hib Eris + Copyright © 2008 Hugo Mercier + Copyright © 2012 Igor Slepchin + Copyright © 2007 Ilmari Heikkinen + Copyright © 2008-2010 Ilya Gorenbein + Copyright © 2007-2008 Iñigo Martínez + Copyright © Insight Consortium + Copyright © 2010 Jakob Voss + Copyright © 2009-2010 Jakub Wilk + Copyright © 2009 Jan Jockusch + Copyright © 2010 Jan Kümmel + Copyright © 2006-2007 Jauco Noordzij + Copyright © 2005-2008 Jeff Muizelaar + Copyright © Jerry Epplin + Copyright © 2011 Jim Meyering + Copyright © 2005 Jonathan Blandford + Copyright © 2007-2009 Jonathan Kew + Copyright © 2010 Jonathan Liu + Copyright © 2011 José Aliste + Copyright © 2011 Joshua Richardson + Copyright © 2006-2008 Julien Rebetez + Copyright © 2010 Jürg Billeter + Copyright © 2009 KDAB via Guillermo Amaral + Copyright © 2010 Kenneth Berland + Copyright © 2008 Kees Cook + Copyright © 2011 Kenji Uno + Copyright © 2002 Kitware, Inc. + Copyright © 2008 Kjartan Maraas + Copyright © 2007-2009 Koji Otani + Copyright © 2006-2007 Kouhei Sutou + Copyright © 2009 Kovid Goyal + Copyright © 2005-2007 Kristian Høgsberg + Copyright © 2006-2007 Krzysztof Kowalczyk + Copyright © 2006-2007 Laurent Montel + Copyright © 2005 Marco Pesenti Gritti + Copyright © 2008 Mark Kaplan + Copyright © 2010 Mark Riedesel + Copyright © 2005 Martin Kretzschmar + Copyright © 2009 Matthias Drochner + Copyright © 2010 Matthias Fauconneau + Copyright © 2009 Matthias Franz + Copyright © 2009 Michael K. Johnson + Copyright © 2008 Michael Vrable + Copyright © 2009 M Joonas Pihlaja + Copyright © 2010 Mike Slegeir + Copyright © 2009 Mozilla Corporation + Copyright © 2005 Net Integration Technologies, Inc. + Copyright © 2009 Nick Jones + Copyright © 2005-2006 Nickolay V. Shmyrev + Copyright © 2010 Nils Höglund + Copyright © 2010 OSSD CDAC Mumbai by Leena Chourey and Onkar Potdar + Copyright © 2010 Patrick Spendrin + Copyright © 2006 Paul Walmsley + Copyright © 2010 Paweł Wiejacha + Copyright © 2009 Peter Kerzum + Copyright © 2009 Petr Gajdos + Copyright © 2010 Philip Lorenz + Copyright © 2006-2011 Pino Toscano + Copyright © Rainer Dorsch + Copyright © 2006 Rainer Keller + Copyright © 2006 Raj Kumar + Copyright © 2009 Reece Dunn + Copyright © 2004-2006 Red Hat, Inc. + Copyright © 2008 Richard Airlie + Copyright © 2009 Ross Moore + Copyright © 2009 Ryszard Trojnacki + Copyright © 2011 Sam Liao + Copyright © 2009 Sanjoy Mahajan + Copyright © 2004 Scott James Remnant + Copyright © 2006 Scott Turner + Copyright © 2009 Shawn Rutledge + Copyright © 2009 Shen Liang + Copyright © 2011 Simon Kellner + Copyright © 2010 Srinivas Adicherla + Copyright © 2005-2006 Stefan Kebekus + Copyright © 2006 Stefan Schweizer + Copyright © 2009 Stefan Thomas + Copyright © 2011 Stephen Reichling + Copyright © 2006 Steven G. Johnson + Copyright © 2011 Steven Murdoc + Copyright © 2010 Suzuki Toshiya + Copyright © 2005-2006 Takashi Iwai + Copyright © The GLib Team + Copyright © 2005-2010 The Poppler Developers + Copyright © 2009-2012 Thomas Freitag + Copyright © 2011 Thomas Klausner + Copyright © 2006 Thorkild Stray + Copyright © 2009 Till Kamppeter + Copyright © 2008 Timothy Lee + Copyright © 2005 Tobias Koening + Copyright © 2011 Tom Gleason + Copyright © 2008 Tomas Are Haavet + Copyright © 2010-2011 Tomas Hoger + Copyright © 2008 Vasile Gaburici + Copyright © 2012 Yi Yang + Copyright © 2008-2009 Warren Toomey + Copyright © 2006 Wilfried Huss + Copyright © 2009-2011 William Bader + Copyright © 2007 Will Stephenson + Copyright © 1994 X Consortium + +License: + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 dated June, 1991. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + + Poppler is based on a Xpdf fork (updated at Xpdf 3.02), so the license + of the poppler core library (libpoppler.so.X) is GPL v2 only. + All the Poppler contributions are licensed as GPL v2+. + + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL-2'. diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..7f1c78d --- /dev/null +++ b/debian/docs @@ -0,0 +1,5 @@ +AUTHORS +NEWS +README +README-XPDF +TODO diff --git a/debian/gir1.2-poppler-0.18.install b/debian/gir1.2-poppler-0.18.install new file mode 100644 index 0000000..b40ffba --- /dev/null +++ b/debian/gir1.2-poppler-0.18.install @@ -0,0 +1 @@ +usr/lib/*/girepository-1.0/Poppler-0.18.typelib usr/lib/girepository-1.0/ diff --git a/debian/libpoppler-cpp-dev.install b/debian/libpoppler-cpp-dev.install new file mode 100644 index 0000000..871c184 --- /dev/null +++ b/debian/libpoppler-cpp-dev.install @@ -0,0 +1,4 @@ +usr/include/poppler/cpp +usr/lib/*/libpoppler-cpp.a +usr/lib/*/libpoppler-cpp.so +usr/lib/*/pkgconfig/poppler-cpp.pc diff --git a/debian/libpoppler-cpp0.install b/debian/libpoppler-cpp0.install new file mode 100644 index 0000000..6f925b7 --- /dev/null +++ b/debian/libpoppler-cpp0.install @@ -0,0 +1 @@ +usr/lib/*/libpoppler-cpp.so.0* diff --git a/debian/libpoppler-dev.install b/debian/libpoppler-dev.install new file mode 100644 index 0000000..f977101 --- /dev/null +++ b/debian/libpoppler-dev.install @@ -0,0 +1,16 @@ +usr/include/poppler/*.h +usr/include/poppler/fofi/ +usr/include/poppler/goo/ +usr/include/poppler/splash/ +usr/lib/libpoppler.a +usr/lib/libpoppler.so +usr/lib/pkgconfig/poppler.pc +usr/lib/pkgconfig/poppler-splash.pc +#usr/lib/pkgconfig/poppler-cairo.pc +# private headers not installed +poppler/ArthurOutputDev.h usr/include/poppler/ +poppler/CairoFontEngine.h usr/include/poppler/ +poppler/CairoOutputDev.h usr/include/poppler/ +poppler/DCTStream.h usr/include/poppler/ +poppler/JPEG2000Stream.h usr/include/poppler/ +poppler/PageLabelInfo.h usr/include/poppler/ diff --git a/debian/libpoppler-glib-dev.install b/debian/libpoppler-glib-dev.install new file mode 100644 index 0000000..68ddf42 --- /dev/null +++ b/debian/libpoppler-glib-dev.install @@ -0,0 +1,6 @@ +#usr/share/gtk-doc/html/poppler/ usr/share/doc/libpoppler-glib-dev/html/ +usr/include/poppler/glib/ +#usr/lib/libpoppler-glib.a +usr/lib/libpoppler-glib.so +usr/lib/pkgconfig/poppler-glib.pc +#usr/share/gir-1.0/Poppler-0.18.gir diff --git a/debian/libpoppler-glib-dev.links b/debian/libpoppler-glib-dev.links new file mode 100644 index 0000000..f6c7cc8 --- /dev/null +++ b/debian/libpoppler-glib-dev.links @@ -0,0 +1 @@ +usr/share/doc/libpoppler-glib-dev/html/poppler usr/share/gtk-doc/html/poppler diff --git a/debian/libpoppler-glib8.install b/debian/libpoppler-glib8.install new file mode 100644 index 0000000..52e711d --- /dev/null +++ b/debian/libpoppler-glib8.install @@ -0,0 +1 @@ +usr/lib/libpoppler-glib.so.8* diff --git a/debian/libpoppler-private-dev.lintian-overrides b/debian/libpoppler-private-dev.lintian-overrides new file mode 100644 index 0000000..f59b517 --- /dev/null +++ b/debian/libpoppler-private-dev.lintian-overrides @@ -0,0 +1,3 @@ +# temporarly empty package to ease migrations from libpoppler-dev to it +libpoppler-private-dev: empty-binary-package +libpoppler-private-dev: package-contains-no-arch-dependent-files diff --git a/debian/libpoppler-qt4-3.install b/debian/libpoppler-qt4-3.install new file mode 100644 index 0000000..33e1c27 --- /dev/null +++ b/debian/libpoppler-qt4-3.install @@ -0,0 +1 @@ +usr/lib/*/libpoppler-qt4.so.3* diff --git a/debian/libpoppler-qt4-dev.install b/debian/libpoppler-qt4-dev.install new file mode 100644 index 0000000..b985be1 --- /dev/null +++ b/debian/libpoppler-qt4-dev.install @@ -0,0 +1,4 @@ +usr/include/poppler/qt4 +usr/lib/*/libpoppler-qt4.a +usr/lib/*/libpoppler-qt4.so +usr/lib/*/pkgconfig/poppler-qt4.pc diff --git a/debian/libpoppler25.install b/debian/libpoppler25.install new file mode 100644 index 0000000..60174a3 --- /dev/null +++ b/debian/libpoppler25.install @@ -0,0 +1 @@ +usr/lib/libpoppler.so.25* diff --git a/debian/poppler-utils.install b/debian/poppler-utils.install new file mode 100644 index 0000000..00c002e --- /dev/null +++ b/debian/poppler-utils.install @@ -0,0 +1,2 @@ +usr/bin/ +#usr/share/man/man1/ diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..2178d96 --- /dev/null +++ b/debian/rules @@ -0,0 +1,46 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/autotools.mk +include /usr/share/cdbs/1/rules/utils.mk + +# use qt4's moc as the default moc is qt3's when both are installed +PATH := /usr/share/qt4/bin:$(PATH) +export PATH + +# avoid overlinking and reduce library dependencies +export LDFLAGS := -Wl,--as-needed + +PREFIX ?= /usr +DATAROOTDIR ?= /usr/share +SYSCONFDIR ?= /opt/etc +LOCALSTATEDIR=/opt/var +CPPFLAGS += -I/usr/include/cairo -I/usr/include/freetype2/ + +# a trick to fix xpdfrc location without modifying autotools stuff +DEB_CONFIGURE_SYSCONFDIR := /etc/xpdf + +# disable gtk stuff to minimize Build-Depends +DEB_CONFIGURE_EXTRA_FLAGS += \ + --prefix=$(PREFIX) --localstatedir=$(LOCALSTATEDIR) --sysconfdir=$(SYSCONFDIR) --datarootdir=$(DATAROOTDIR) \ + --enable-shared \ + --enable-libjpeg --disable-libopenjpeg --enable-libtiff \ + --enable-largefile \ + --enable-zlib --enable-libcurl \ + --enable-libpng \ + --enable-cairo-output \ + --enable-splash-output \ + --enable-poppler-glib \ + --enable-introspection=auto \ + --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf \ + --disable-poppler-qt4 --disable-poppler-cpp \ + --disable-gtk-test \ + --enable-utils \ + --enable-xpdf-headers \ + --enable-compile-warnings=yes \ + --enable-cms --without-x --with-font-configuration=fontconfig + +DEB_DH_MAKESHLIBS_ARGS_libpoppler19 += -V"libpoppler19" +DEB_DH_MAKESHLIBS_ARGS_libpoppler-glib8 += -V"libpoppler-glib8 (>= 0.18)" +DEB_DH_MAKESHLIBS_ARGS_libpoppler-qt4-3 += -V"libpoppler-qt4-3 (>= 0.18)" +DEB_DH_MAKESHLIBS_ARGS_libpoppler-cpp0 += -V"libpoppler-cpp0 (>= 0.16)" diff --git a/debian/rules.org b/debian/rules.org new file mode 100755 index 0000000..c663f33 --- /dev/null +++ b/debian/rules.org @@ -0,0 +1,63 @@ +#!/usr/bin/make -f + +# use qt4's moc as the default moc is qt3's when both are installed +PATH := /usr/share/qt4/bin:$(PATH) +export PATH + +# avoid overlinking and reduce library dependencies +#export DEB_LDFLAGS_MAINT_APPEND := -Wl,--as-needed +export LDFLAGS := -Wl,--as-needed + +# make the build verbose +export V=1 + +PREFIX ?= /usr +DATAROOTDIR ?= /usr/share +SYSCONFDIR ?= /opt/etc +LOCALSTATEDIR=/opt/var + +# disable gtk stuff to minimize Build-Depends +#CONFIGURE_ARGS := + +%: + dh $@ + +override_dh_auto_clean: + dh_auto_clean + rm -f glib/reference/html/* + +override_dh_auto_configure: + dh_auto_configure -- \ + --prefix=$(PREFIX) --localstatedir=$(LOCALSTATEDIR) --sysconfdir=$(SYSCONFDIR) --datarootdir=$(DATAROOTDIR) \ + --enable-shared \ + --enable-libjpeg --disable-openjpeg --disable-libtiff \ + --enable-zlib --disable-libcurl \ + --enable-libpng \ + --disable-cairo-output \ + --disable-poppler-glib \ + --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf \ + --disable-poppler-qt4 --disable-poppler-qt --disable-poppler-cpp \ + --disable-gtk-test \ + --enable-xpdf-headers --disable-gdk \ + --enable-compile-warnings=yes \ + --disable-gtk-test --enable-cms --without-x --with-font-configuration=fontconfig \ + --enable-splash-output + +override_dh_install: + dh_install --list-missing + +override_dh_installchangelogs: + dh_installchangelogs -plibpoppler19 + dh_installchangelogs --remaining-packages -XChangeLog + +override_dh_strip: + dh_strip --dbg-package=poppler-dbg + +override_dh_makeshlibs: + dh_makeshlibs -plibpoppler19 -V"libpoppler19" + dh_makeshlibs -plibpoppler-cpp0 -V"libpoppler-cpp0 (>= 0.16)" + dh_makeshlibs -plibpoppler-glib8 -V"libpoppler-glib8 (>= 0.18)" + dh_makeshlibs -plibpoppler-qt4-3 -V"libpoppler-qt4-3 (>= 0.18)" + dh_makeshlibs --remaining-packages + +.PHONY: override_dh_auto_test diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..c9364a1 --- /dev/null +++ b/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://poppler.freedesktop.org/ poppler-([0-9.]*)\.tar\.gz debian uupdate diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..bd0ac08 --- /dev/null +++ b/depcomp @@ -0,0 +1,688 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2011-12-04.11; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, +# 2011 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test "$stat" = 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/ \1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/ / + G + p +}' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/fofi/FoFiBase.cc b/fofi/FoFiBase.cc new file mode 100644 index 0000000..86bafd8 --- /dev/null +++ b/fofi/FoFiBase.cc @@ -0,0 +1,201 @@ +//======================================================================== +// +// FoFiBase.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Ed Avis <eda@waniasset.com> +// Copyright (C) 2011 Jim Meyering <jim@meyering.net> +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include <config.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdio.h> +#include <limits.h> +#include "goo/gmem.h" +#include "poppler/Error.h" +#include "FoFiBase.h" + +//------------------------------------------------------------------------ +// FoFiBase +//------------------------------------------------------------------------ + +FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) { + fileData = file = (Guchar *)fileA; + len = lenA; + freeFileData = freeFileDataA; +} + +FoFiBase::~FoFiBase() { + if (freeFileData) { + gfree(fileData); + } +} + +char *FoFiBase::readFile(char *fileName, int *fileLen) { + FILE *f; + char *buf; + int n; + + if (!(f = fopen(fileName, "rb"))) { + error(errIO, -1, "Cannot open '{0:s}'", fileName); + return NULL; + } + if (fseek(f, 0, SEEK_END) != 0) { + error(errIO, -1, "Cannot seek to end of '{0:s}'", fileName); + fclose(f); + return NULL; + } + n = (int)ftell(f); + if (n < 0) { + error(errIO, -1, "Cannot determine length of '{0:s}'", fileName); + fclose(f); + return NULL; + } + if (fseek(f, 0, SEEK_SET) != 0) { + error(errIO, -1, "Cannot seek to start of '{0:s}'", fileName); + fclose(f); + return NULL; + } + buf = (char *)gmalloc(n); + if ((int)fread(buf, 1, n, f) != n) { + gfree(buf); + fclose(f); + return NULL; + } + fclose(f); + *fileLen = n; + return buf; +} + +int FoFiBase::getS8(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos >= len) { + *ok = gFalse; + return 0; + } + x = file[pos]; + if (x & 0x80) { + x |= ~0xff; + } + return x; +} + +int FoFiBase::getU8(int pos, GBool *ok) { + if (pos < 0 || pos >= len) { + *ok = gFalse; + return 0; + } + return file[pos]; +} + +int FoFiBase::getS16BE(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos+1 >= len || pos > INT_MAX - 1) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + if (x & 0x8000) { + x |= ~0xffff; + } + return x; +} + +int FoFiBase::getU16BE(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos+1 >= len || pos > INT_MAX - 1) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + return x; +} + +int FoFiBase::getS32BE(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos+3 >= len || pos > INT_MAX - 3) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + x = (x << 8) + file[pos+2]; + x = (x << 8) + file[pos+3]; + if (x & 0x80000000) { + x |= ~0xffffffff; + } + return x; +} + +Guint FoFiBase::getU32BE(int pos, GBool *ok) { + Guint x; + + if (pos < 0 || pos+3 >= len || pos > INT_MAX - 3) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + x = (x << 8) + file[pos+2]; + x = (x << 8) + file[pos+3]; + return x; +} + +Guint FoFiBase::getU32LE(int pos, GBool *ok) { + Guint x; + + if (pos < 0 || pos+3 >= len || pos > INT_MAX - 3) { + *ok = gFalse; + return 0; + } + x = file[pos+3]; + x = (x << 8) + file[pos+2]; + x = (x << 8) + file[pos+1]; + x = (x << 8) + file[pos]; + return x; +} + +Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) { + Guint x; + int i; + + if (pos < 0 || pos + size > len || pos > INT_MAX - size) { + *ok = gFalse; + return 0; + } + x = 0; + for (i = 0; i < size; ++i) { + x = (x << 8) + file[pos + i]; + } + return x; +} + +GBool FoFiBase::checkRegion(int pos, int size) { + return pos >= 0 && + pos + size >= pos && + pos + size <= len; +} diff --git a/fofi/FoFiBase.h b/fofi/FoFiBase.h new file mode 100644 index 0000000..d613acd --- /dev/null +++ b/fofi/FoFiBase.h @@ -0,0 +1,56 @@ +//======================================================================== +// +// FoFiBase.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFIBASE_H +#define FOFIBASE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +//------------------------------------------------------------------------ + +typedef void (*FoFiOutputFunc)(void *stream, const char *data, int len); + +//------------------------------------------------------------------------ +// FoFiBase +//------------------------------------------------------------------------ + +class FoFiBase { +public: + + virtual ~FoFiBase(); + +protected: + + FoFiBase(char *fileA, int lenA, GBool freeFileDataA); + static char *readFile(char *fileName, int *fileLen); + + // S = signed / U = unsigned + // 8/16/32/Var = word length, in bytes + // BE = big endian + int getS8(int pos, GBool *ok); + int getU8(int pos, GBool *ok); + int getS16BE(int pos, GBool *ok); + int getU16BE(int pos, GBool *ok); + int getS32BE(int pos, GBool *ok); + Guint getU32BE(int pos, GBool *ok); + Guint getU32LE(int pos, GBool *ok); + Guint getUVarBE(int pos, int size, GBool *ok); + + GBool checkRegion(int pos, int size); + + Guchar *fileData; + Guchar *file; + int len; + GBool freeFileData; +}; + +#endif diff --git a/fofi/FoFiEncodings.cc b/fofi/FoFiEncodings.cc new file mode 100644 index 0000000..5cea6fa --- /dev/null +++ b/fofi/FoFiEncodings.cc @@ -0,0 +1,994 @@ +//======================================================================== +// +// FoFiEncodings.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include <config.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdlib.h> +#include "FoFiEncodings.h" + +//------------------------------------------------------------------------ +// Type 1 and 1C font data +//------------------------------------------------------------------------ + +const char *fofiType1StandardEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL +}; + +const char *fofiType1ExpertEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall" +}; + +//------------------------------------------------------------------------ +// Type 1C font data +//------------------------------------------------------------------------ + +const char *fofiType1CStdStrings[391] = { + ".notdef", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "endash", + "dagger", + "daggerdbl", + "periodcentered", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "questiondown", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "AE", + "ordfeminine", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "ae", + "dotlessi", + "lslash", + "oslash", + "oe", + "germandbls", + "onesuperior", + "logicalnot", + "mu", + "trademark", + "Eth", + "onehalf", + "plusminus", + "Thorn", + "onequarter", + "divide", + "brokenbar", + "degree", + "thorn", + "threequarters", + "twosuperior", + "registered", + "minus", + "eth", + "multiply", + "threesuperior", + "copyright", + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "ccedilla", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "otilde", + "scaron", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron", + "exclamsmall", + "Hungarumlautsmall", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "isuperior", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "rsuperior", + "ssuperior", + "tsuperior", + "ff", + "ffi", + "ffl", + "parenleftinferior", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "Dotaccentsmall", + "Macronsmall", + "figuredash", + "hypheninferior", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "zerosuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold" +}; + +Gushort fofiType1CISOAdobeCharset[229] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228 +}; + +Gushort fofiType1CExpertCharset[166] = { + 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 +}; + +Gushort fofiType1CExpertSubsetCharset[87] = { + 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, + 15, 99, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, 300, 301, + 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, + 323, 324, 325, 326, 150, 164, 169, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 +}; diff --git a/fofi/FoFiEncodings.h b/fofi/FoFiEncodings.h new file mode 100644 index 0000000..ab80ad3 --- /dev/null +++ b/fofi/FoFiEncodings.h @@ -0,0 +1,34 @@ +//======================================================================== +// +// FoFiEncodings.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFIENCODINGS_H +#define FOFIENCODINGS_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +//------------------------------------------------------------------------ +// Type 1 and 1C font data +//------------------------------------------------------------------------ + +extern const char *fofiType1StandardEncoding[256]; +extern const char *fofiType1ExpertEncoding[256]; + +//------------------------------------------------------------------------ +// Type 1C font data +//------------------------------------------------------------------------ + +extern const char *fofiType1CStdStrings[391]; +extern Gushort fofiType1CISOAdobeCharset[229]; +extern Gushort fofiType1CExpertCharset[166]; +extern Gushort fofiType1CExpertSubsetCharset[87]; + +#endif diff --git a/fofi/FoFiIdentifier.cc b/fofi/FoFiIdentifier.cc new file mode 100644 index 0000000..d8ee7e0 --- /dev/null +++ b/fofi/FoFiIdentifier.cc @@ -0,0 +1,630 @@ +//======================================================================== +// +// FoFiIdentifier.cc +// +// Copyright 2009 Glyph & Cog, LLC +// +//======================================================================== + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdio.h> +#include <string.h> +#include <limits.h> +#include "goo/gtypes.h" +#include "FoFiIdentifier.h" + +//------------------------------------------------------------------------ + +class Reader { +public: + + virtual ~Reader() {} + + // Read one byte. Returns -1 if past EOF. + virtual int getByte(int pos) = 0; + + // Read a big-endian unsigned 16-bit integer. Fills in *val and + // returns true if successful. + virtual GBool getU16BE(int pos, int *val) = 0; + + // Read a big-endian unsigned 32-bit integer. Fills in *val and + // returns true if successful. + virtual GBool getU32BE(int pos, Guint *val) = 0; + + // Read a little-endian unsigned 32-bit integer. Fills in *val and + // returns true if successful. + virtual GBool getU32LE(int pos, Guint *val) = 0; + + // Read a big-endian unsigned <size>-byte integer, where 1 <= size + // <= 4. Fills in *val and returns true if successful. + virtual GBool getUVarBE(int pos, int size, Guint *val) = 0; + + // Compare against a string. Returns true if equal. + virtual GBool cmp(int pos, const char *s) = 0; + +}; + +//------------------------------------------------------------------------ + +class MemReader: public Reader { +public: + + static MemReader *make(char *bufA, int lenA); + virtual ~MemReader(); + virtual int getByte(int pos); + virtual GBool getU16BE(int pos, int *val); + virtual GBool getU32BE(int pos, Guint *val); + virtual GBool getU32LE(int pos, Guint *val); + virtual GBool getUVarBE(int pos, int size, Guint *val); + virtual GBool cmp(int pos, const char *s); + +private: + + MemReader(char *bufA, int lenA); + + char *buf; + int len; +}; + +MemReader *MemReader::make(char *bufA, int lenA) { + return new MemReader(bufA, lenA); +} + +MemReader::MemReader(char *bufA, int lenA) { + buf = bufA; + len = lenA; +} + +MemReader::~MemReader() { +} + +int MemReader::getByte(int pos) { + if (pos < 0 || pos >= len) { + return -1; + } + return buf[pos] & 0xff; +} + +GBool MemReader::getU16BE(int pos, int *val) { + if (pos < 0 || pos > len - 2) { + return gFalse; + } + *val = ((buf[pos] & 0xff) << 8) + + (buf[pos+1] & 0xff); + return gTrue; +} + +GBool MemReader::getU32BE(int pos, Guint *val) { + if (pos < 0 || pos > len - 4) { + return gFalse; + } + *val = ((buf[pos] & 0xff) << 24) + + ((buf[pos+1] & 0xff) << 16) + + ((buf[pos+2] & 0xff) << 8) + + (buf[pos+3] & 0xff); + return gTrue; +} + +GBool MemReader::getU32LE(int pos, Guint *val) { + if (pos < 0 || pos > len - 4) { + return gFalse; + } + *val = (buf[pos] & 0xff) + + ((buf[pos+1] & 0xff) << 8) + + ((buf[pos+2] & 0xff) << 16) + + ((buf[pos+3] & 0xff) << 24); + return gTrue; +} + +GBool MemReader::getUVarBE(int pos, int size, Guint *val) { + int i; + + if (size < 1 || size > 4 || pos < 0 || pos > len - size) { + return gFalse; + } + *val = 0; + for (i = 0; i < size; ++i) { + *val = (*val << 8) + (buf[pos + i] & 0xff); + } + return gTrue; +} + +GBool MemReader::cmp(int pos, const char *s) { + int n; + + n = (int)strlen(s); + if (pos < 0 || len < n || pos > len - n) { + return gFalse; + } + return !memcmp(buf + pos, s, n); +} + +//------------------------------------------------------------------------ + +class FileReader: public Reader { +public: + + static FileReader *make(char *fileName); + virtual ~FileReader(); + virtual int getByte(int pos); + virtual GBool getU16BE(int pos, int *val); + virtual GBool getU32BE(int pos, Guint *val); + virtual GBool getU32LE(int pos, Guint *val); + virtual GBool getUVarBE(int pos, int size, Guint *val); + virtual GBool cmp(int pos, const char *s); + +private: + + FileReader(FILE *fA); + GBool fillBuf(int pos, int len); + + FILE *f; + char buf[1024]; + int bufPos, bufLen; +}; + +FileReader *FileReader::make(char *fileName) { + FILE *fA; + + if (!(fA = fopen(fileName, "rb"))) { + return NULL; + } + return new FileReader(fA); +} + +FileReader::FileReader(FILE *fA) { + f = fA; + bufPos = 0; + bufLen = 0; +} + +FileReader::~FileReader() { + fclose(f); +} + +int FileReader::getByte(int pos) { + if (!fillBuf(pos, 1)) { + return -1; + } + return buf[pos - bufPos] & 0xff; +} + +GBool FileReader::getU16BE(int pos, int *val) { + if (!fillBuf(pos, 2)) { + return gFalse; + } + *val = ((buf[pos - bufPos] & 0xff) << 8) + + (buf[pos - bufPos + 1] & 0xff); + return gTrue; +} + +GBool FileReader::getU32BE(int pos, Guint *val) { + if (!fillBuf(pos, 4)) { + return gFalse; + } + *val = ((buf[pos - bufPos] & 0xff) << 24) + + ((buf[pos - bufPos + 1] & 0xff) << 16) + + ((buf[pos - bufPos + 2] & 0xff) << 8) + + (buf[pos - bufPos + 3] & 0xff); + return gTrue; +} + +GBool FileReader::getU32LE(int pos, Guint *val) { + if (!fillBuf(pos, 4)) { + return gFalse; + } + *val = (buf[pos - bufPos] & 0xff) + + ((buf[pos - bufPos + 1] & 0xff) << 8) + + ((buf[pos - bufPos + 2] & 0xff) << 16) + + ((buf[pos - bufPos + 3] & 0xff) << 24); + return gTrue; +} + +GBool FileReader::getUVarBE(int pos, int size, Guint *val) { + int i; + + if (size < 1 || size > 4 || !fillBuf(pos, size)) { + return gFalse; + } + *val = 0; + for (i = 0; i < size; ++i) { + *val = (*val << 8) + (buf[pos - bufPos + i] & 0xff); + } + return gTrue; +} + +GBool FileReader::cmp(int pos, const char *s) { + int n; + + n = (int)strlen(s); + if (!fillBuf(pos, n)) { + return gFalse; + } + return !memcmp(buf - bufPos + pos, s, n); +} + +GBool FileReader::fillBuf(int pos, int len) { + if (pos < 0 || len < 0 || len > (int)sizeof(buf) || + pos > INT_MAX - (int)sizeof(buf)) { + return gFalse; + } + if (pos >= bufPos && pos + len <= bufPos + bufLen) { + return gTrue; + } + if (fseek(f, pos, SEEK_SET)) { + return gFalse; + } + bufPos = pos; + bufLen = (int)fread(buf, 1, sizeof(buf), f); + if (bufLen < len) { + return gFalse; + } + return gTrue; +} + +//------------------------------------------------------------------------ + +class StreamReader: public Reader { +public: + + static StreamReader *make(int (*getCharA)(void *data), void *dataA); + virtual ~StreamReader(); + virtual int getByte(int pos); + virtual GBool getU16BE(int pos, int *val); + virtual GBool getU32BE(int pos, Guint *val); + virtual GBool getU32LE(int pos, Guint *val); + virtual GBool getUVarBE(int pos, int size, Guint *val); + virtual GBool cmp(int pos, const char *s); + +private: + + StreamReader(int (*getCharA)(void *data), void *dataA); + GBool fillBuf(int pos, int len); + + int (*getChar)(void *data); + void *data; + int streamPos; + char buf[1024]; + int bufPos, bufLen; +}; + +StreamReader *StreamReader::make(int (*getCharA)(void *data), void *dataA) { + return new StreamReader(getCharA, dataA); +} + +StreamReader::StreamReader(int (*getCharA)(void *data), void *dataA) { + getChar = getCharA; + data = dataA; + streamPos = 0; + bufPos = 0; + bufLen = 0; +} + +StreamReader::~StreamReader() { +} + +int StreamReader::getByte(int pos) { + if (!fillBuf(pos, 1)) { + return -1; + } + return buf[pos - bufPos] & 0xff; +} + +GBool StreamReader::getU16BE(int pos, int *val) { + if (!fillBuf(pos, 2)) { + return gFalse; + } + *val = ((buf[pos - bufPos] & 0xff) << 8) + + (buf[pos - bufPos + 1] & 0xff); + return gTrue; +} + +GBool StreamReader::getU32BE(int pos, Guint *val) { + if (!fillBuf(pos, 4)) { + return gFalse; + } + *val = ((buf[pos - bufPos] & 0xff) << 24) + + ((buf[pos - bufPos + 1] & 0xff) << 16) + + ((buf[pos - bufPos + 2] & 0xff) << 8) + + (buf[pos - bufPos + 3] & 0xff); + return gTrue; +} + +GBool StreamReader::getU32LE(int pos, Guint *val) { + if (!fillBuf(pos, 4)) { + return gFalse; + } + *val = (buf[pos - bufPos] & 0xff) + + ((buf[pos - bufPos + 1] & 0xff) << 8) + + ((buf[pos - bufPos + 2] & 0xff) << 16) + + ((buf[pos - bufPos + 3] & 0xff) << 24); + return gTrue; +} + +GBool StreamReader::getUVarBE(int pos, int size, Guint *val) { + int i; + + if (size < 1 || size > 4 || !fillBuf(pos, size)) { + return gFalse; + } + *val = 0; + for (i = 0; i < size; ++i) { + *val = (*val << 8) + (buf[pos - bufPos + i] & 0xff); + } + return gTrue; +} + +GBool StreamReader::cmp(int pos, const char *s) { + int n; + + n = (int)strlen(s); + if (!fillBuf(pos, n)) { + return gFalse; + } + return !memcmp(buf - bufPos + pos, s, n); +} + +GBool StreamReader::fillBuf(int pos, int len) { + int c; + + if (pos < 0 || len < 0 || len > (int)sizeof(buf) || + pos > INT_MAX - (int)sizeof(buf)) { + return gFalse; + } + if (pos < bufPos) { + return gFalse; + } + + // if requested region will not fit in the current buffer... + if (pos + len > bufPos + (int)sizeof(buf)) { + + // if the start of the requested data is already in the buffer, move + // it to the start of the buffer + if (pos < bufPos + bufLen) { + bufLen -= pos - bufPos; + memmove(buf, buf + (pos - bufPos), bufLen); + bufPos = pos; + + // otherwise discard data from the + // stream until we get to the requested position + } else { + bufPos += bufLen; + bufLen = 0; + while (bufPos < pos) { + if ((c = (*getChar)(data)) < 0) { + return gFalse; + } + ++bufPos; + } + } + } + + // read the rest of the requested data + while (bufPos + bufLen < pos + len) { + if ((c = (*getChar)(data)) < 0) { + return gFalse; + } + buf[bufLen++] = (char)c; + } + + return gTrue; +} + +//------------------------------------------------------------------------ + +static FoFiIdentifierType identify(Reader *reader); +static FoFiIdentifierType identifyOpenType(Reader *reader); +static FoFiIdentifierType identifyCFF(Reader *reader, int start); + +FoFiIdentifierType FoFiIdentifier::identifyMem(char *file, int len) { + MemReader *reader; + FoFiIdentifierType type; + + if (!(reader = MemReader::make(file, len))) { + return fofiIdError; + } + type = identify(reader); + delete reader; + return type; +} + +FoFiIdentifierType FoFiIdentifier::identifyFile(char *fileName) { + FileReader *reader; + FoFiIdentifierType type; + + if (!(reader = FileReader::make(fileName))) { + return fofiIdError; + } + type = identify(reader); + delete reader; + return type; +} + +FoFiIdentifierType FoFiIdentifier::identifyStream(int (*getChar)(void *data), + void *data) { + StreamReader *reader; + FoFiIdentifierType type; + + if (!(reader = StreamReader::make(getChar, data))) { + return fofiIdError; + } + type = identify(reader); + delete reader; + return type; +} + +static FoFiIdentifierType identify(Reader *reader) { + Guint n; + + //----- PFA + if (reader->cmp(0, "%!PS-AdobeFont-1") || + reader->cmp(0, "%!FontType1")) { + return fofiIdType1PFA; + } + + //----- PFB + if (reader->getByte(0) == 0x80 && + reader->getByte(1) == 0x01 && + reader->getU32LE(2, &n)) { + if ((n >= 16 && reader->cmp(6, "%!PS-AdobeFont-1")) || + (n >= 11 && reader->cmp(6, "%!FontType1"))) { + return fofiIdType1PFB; + } + } + + //----- TrueType + if ((reader->getByte(0) == 0x00 && + reader->getByte(1) == 0x01 && + reader->getByte(2) == 0x00 && + reader->getByte(3) == 0x00) || + (reader->getByte(0) == 0x74 && // 'true' + reader->getByte(1) == 0x72 && + reader->getByte(2) == 0x75 && + reader->getByte(3) == 0x65)) { + return fofiIdTrueType; + } + if (reader->getByte(0) == 0x74 && // 'ttcf' + reader->getByte(1) == 0x74 && + reader->getByte(2) == 0x63 && + reader->getByte(3) == 0x66) { + return fofiIdTrueTypeCollection; + } + + //----- OpenType + if (reader->getByte(0) == 0x4f && // 'OTTO + reader->getByte(1) == 0x54 && + reader->getByte(2) == 0x54 && + reader->getByte(3) == 0x4f) { + return identifyOpenType(reader); + } + + //----- CFF + if (reader->getByte(0) == 0x01 && + reader->getByte(1) == 0x00) { + return identifyCFF(reader, 0); + } + // some tools embed CFF fonts with an extra whitespace char at the + // beginning + if (reader->getByte(1) == 0x01 && + reader->getByte(2) == 0x00) { + return identifyCFF(reader, 1); + } + + return fofiIdUnknown; +} + +static FoFiIdentifierType identifyOpenType(Reader *reader) { + FoFiIdentifierType type; + Guint offset; + int nTables, i; + + if (!reader->getU16BE(4, &nTables)) { + return fofiIdUnknown; + } + for (i = 0; i < nTables; ++i) { + if (reader->cmp(12 + i*16, "CFF ")) { + if (reader->getU32BE(12 + i*16 + 8, &offset) && + offset < (Guint)INT_MAX) { + type = identifyCFF(reader, (int)offset); + if (type == fofiIdCFF8Bit) { + type = fofiIdOpenTypeCFF8Bit; + } else if (type == fofiIdCFFCID) { + type = fofiIdOpenTypeCFFCID; + } + return type; + } + return fofiIdUnknown; + } + } + return fofiIdUnknown; +} + +static FoFiIdentifierType identifyCFF(Reader *reader, int start) { + Guint offset0, offset1; + int hdrSize, offSize0, offSize1, pos, endPos, b0, n, i; + + //----- read the header + if (reader->getByte(start) != 0x01 || + reader->getByte(start + 1) != 0x00) { + return fofiIdUnknown; + } + if ((hdrSize = reader->getByte(start + 2)) < 0) { + return fofiIdUnknown; + } + if ((offSize0 = reader->getByte(start + 3)) < 1 || offSize0 > 4) { + return fofiIdUnknown; + } + pos = start + hdrSize; + if (pos < 0) { + return fofiIdUnknown; + } + + //----- skip the name index + if (!reader->getU16BE(pos, &n)) { + return fofiIdUnknown; + } + if (n == 0) { + pos += 2; + } else { + if ((offSize1 = reader->getByte(pos + 2)) < 1 || offSize1 > 4) { + return fofiIdUnknown; + } + if (!reader->getUVarBE(pos + 3 + n * offSize1, offSize1, &offset1) || + offset1 > (Guint)INT_MAX) { + return fofiIdUnknown; + } + pos += 3 + (n + 1) * offSize1 + (int)offset1 - 1; + } + if (pos < 0) { + return fofiIdUnknown; + } + + //----- parse the top dict index + if (!reader->getU16BE(pos, &n) || n < 1) { + return fofiIdUnknown; + } + if ((offSize1 = reader->getByte(pos + 2)) < 1 || offSize1 > 4) { + return fofiIdUnknown; + } + if (!reader->getUVarBE(pos + 3, offSize1, &offset0) || + offset0 > (Guint)INT_MAX || + !reader->getUVarBE(pos + 3 + offSize1, offSize1, &offset1) || + offset1 > (Guint)INT_MAX || + offset0 > offset1) { + return fofiIdUnknown; + } + pos = pos + 3 + (n + 1) * offSize1 + (int)offset0 - 1; + endPos = pos + 3 + (n + 1) * offSize1 + (int)offset1 - 1; + if (pos < 0 || endPos < 0 || pos > endPos) { + return fofiIdUnknown; + } + + //----- parse the top dict, look for ROS as first entry + // for a CID font, the top dict starts with: + // <int> <int> <int> ROS + for (i = 0; i < 3; ++i) { + b0 = reader->getByte(pos++); + if (b0 == 0x1c) { + pos += 2; + } else if (b0 == 0x1d) { + pos += 4; + } else if (b0 >= 0xf7 && b0 <= 0xfe) { + pos += 1; + } else if (b0 < 0x20 || b0 > 0xf6) { + return fofiIdCFF8Bit; + } + if (pos >= endPos || pos < 0) { + return fofiIdCFF8Bit; + } + } + if (pos + 1 < endPos && + reader->getByte(pos) == 12 && + reader->getByte(pos + 1) == 30) { + return fofiIdCFFCID; + } else { + return fofiIdCFF8Bit; + } +} diff --git a/fofi/FoFiIdentifier.h b/fofi/FoFiIdentifier.h new file mode 100644 index 0000000..af1323b --- /dev/null +++ b/fofi/FoFiIdentifier.h @@ -0,0 +1,42 @@ +//======================================================================== +// +// FoFiIdentifier.h +// +// Copyright 2009 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFIIDENTIFIER_H +#define FOFIIDENTIFIER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +//------------------------------------------------------------------------ +// FoFiIdentifier +//------------------------------------------------------------------------ + +enum FoFiIdentifierType { + fofiIdType1PFA, // Type 1 font in PFA format + fofiIdType1PFB, // Type 1 font in PFB format + fofiIdCFF8Bit, // 8-bit CFF font + fofiIdCFFCID, // CID CFF font + fofiIdTrueType, // TrueType font + fofiIdTrueTypeCollection, // TrueType collection + fofiIdOpenTypeCFF8Bit, // OpenType wrapper with 8-bit CFF font + fofiIdOpenTypeCFFCID, // OpenType wrapper with CID CFF font + fofiIdUnknown, // unknown type + fofiIdError // error in reading the file +}; + +class FoFiIdentifier { +public: + + static FoFiIdentifierType identifyMem(char *file, int len); + static FoFiIdentifierType identifyFile(char *fileName); + static FoFiIdentifierType identifyStream(int (*getChar)(void *data), + void *data); +}; + +#endif diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc new file mode 100644 index 0000000..c777d02 --- /dev/null +++ b/fofi/FoFiTrueType.cc @@ -0,0 +1,2525 @@ +//======================================================================== +// +// FoFiTrueType.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de> +// Copyright (C) 2007 Koji Otani <sho@bbr.jp> +// Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2008, 2009, 2012 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com> +// Copyright (C) 2012 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp> +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include <config.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdlib.h> +#include <string.h> +#include <algorithm> +#include "goo/gtypes.h" +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooHash.h" +#include "FoFiType1C.h" +#include "FoFiTrueType.h" +#include "poppler/Error.h" + +// +// Terminology +// ----------- +// +// character code = number used as an element of a text string +// +// character name = glyph name = name for a particular glyph within a +// font +// +// glyph index = GID = position (within some internal table in the font) +// where the instructions to draw a particular glyph are +// stored +// +// Type 1 fonts +// ------------ +// +// Type 1 fonts contain: +// +// Encoding: array of glyph names, maps char codes to glyph names +// +// Encoding[charCode] = charName +// +// CharStrings: dictionary of instructions, keyed by character names, +// maps character name to glyph data +// +// CharStrings[charName] = glyphData +// +// TrueType fonts +// -------------- +// +// TrueType fonts contain: +// +// 'cmap' table: mapping from character code to glyph index; there may +// be multiple cmaps in a TrueType font +// +// cmap[charCode] = gid +// +// 'post' table: mapping from glyph index to glyph name +// +// post[gid] = glyphName +// +// Type 42 fonts +// ------------- +// +// Type 42 fonts contain: +// +// Encoding: array of glyph names, maps char codes to glyph names +// +// Encoding[charCode] = charName +// +// CharStrings: dictionary of glyph indexes, keyed by character names, +// maps character name to glyph index +// +// CharStrings[charName] = gid +// + +//------------------------------------------------------------------------ + +#define ttcfTag 0x74746366 + +//------------------------------------------------------------------------ + +struct TrueTypeTable { + Guint tag; + Guint checksum; + int offset; + int origOffset; + int len; +}; + +struct TrueTypeCmap { + int platform; + int encoding; + int offset; + int len; + int fmt; +}; + +struct TrueTypeLoca { + int idx; + int origOffset; + int newOffset; + int len; +}; + +#define cmapTag 0x636d6170 +#define glyfTag 0x676c7966 +#define headTag 0x68656164 +#define hheaTag 0x68686561 +#define hmtxTag 0x686d7478 +#define locaTag 0x6c6f6361 +#define nameTag 0x6e616d65 +#define os2Tag 0x4f532f32 +#define postTag 0x706f7374 +#define vrt2Tag 0x76727432 +#define vertTag 0x76657274 + +struct cmpTrueTypeLocaOffsetFunctor { + bool operator()(const TrueTypeLoca &loca1, const TrueTypeLoca &loca2) { + if (loca1.origOffset == loca2.origOffset) { + return loca1.idx < loca2.idx; + } + return loca1.origOffset < loca2.origOffset; + } +}; + +struct cmpTrueTypeLocaIdxFunctor { + bool operator()(const TrueTypeLoca &loca1, const TrueTypeLoca &loca2) { + return loca1.idx < loca2.idx; + } +}; + +struct cmpTrueTypeTableTagFunctor { + bool operator()(const TrueTypeTable &tab1, const TrueTypeTable &tab2) { + return tab1.tag < tab2.tag; + } +}; + +//------------------------------------------------------------------------ + +struct T42Table { + const char *tag; // 4-byte tag + GBool required; // required by the TrueType spec? +}; + +// TrueType tables to be embedded in Type 42 fonts. +// NB: the table names must be in alphabetical order here. +#define nT42Tables 11 +static T42Table t42Tables[nT42Tables] = { + { "cvt ", gTrue }, + { "fpgm", gTrue }, + { "glyf", gTrue }, + { "head", gTrue }, + { "hhea", gTrue }, + { "hmtx", gTrue }, + { "loca", gTrue }, + { "maxp", gTrue }, + { "prep", gTrue }, + { "vhea", gFalse }, + { "vmtx", gFalse } +}; +#define t42HeadTable 3 +#define t42LocaTable 6 +#define t42GlyfTable 2 +#define t42VheaTable 9 +#define t42VmtxTable 10 + +//------------------------------------------------------------------------ + +// Glyph names in some arbitrary standard order that Apple uses for +// their TrueType fonts. +static const char *macGlyphNames[258] = { + ".notdef", "null", "CR", "space", + "exclam", "quotedbl", "numbersign", "dollar", + "percent", "ampersand", "quotesingle", "parenleft", + "parenright", "asterisk", "plus", "comma", + "hyphen", "period", "slash", "zero", + "one", "two", "three", "four", + "five", "six", "seven", "eight", + "nine", "colon", "semicolon", "less", + "equal", "greater", "question", "at", + "A", "B", "C", "D", + "E", "F", "G", "H", + "I", "J", "K", "L", + "M", "N", "O", "P", + "Q", "R", "S", "T", + "U", "V", "W", "X", + "Y", "Z", "bracketleft", "backslash", + "bracketright", "asciicircum", "underscore", "grave", + "a", "b", "c", "d", + "e", "f", "g", "h", + "i", "j", "k", "l", + "m", "n", "o", "p", + "q", "r", "s", "t", + "u", "v", "w", "x", + "y", "z", "braceleft", "bar", + "braceright", "asciitilde", "Adieresis", "Aring", + "Ccedilla", "Eacute", "Ntilde", "Odieresis", + "Udieresis", "aacute", "agrave", "acircumflex", + "adieresis", "atilde", "aring", "ccedilla", + "eacute", "egrave", "ecircumflex", "edieresis", + "iacute", "igrave", "icircumflex", "idieresis", + "ntilde", "oacute", "ograve", "ocircumflex", + "odieresis", "otilde", "uacute", "ugrave", + "ucircumflex", "udieresis", "dagger", "degree", + "cent", "sterling", "section", "bullet", + "paragraph", "germandbls", "registered", "copyright", + "trademark", "acute", "dieresis", "notequal", + "AE", "Oslash", "infinity", "plusminus", + "lessequal", "greaterequal", "yen", "mu", + "partialdiff", "summation", "product", "pi", + "integral", "ordfeminine", "ordmasculine", "Omega", + "ae", "oslash", "questiondown", "exclamdown", + "logicalnot", "radical", "florin", "approxequal", + "increment", "guillemotleft", "guillemotright", "ellipsis", + "nbspace", "Agrave", "Atilde", "Otilde", + "OE", "oe", "endash", "emdash", + "quotedblleft", "quotedblright", "quoteleft", "quoteright", + "divide", "lozenge", "ydieresis", "Ydieresis", + "fraction", "currency", "guilsinglleft", "guilsinglright", + "fi", "fl", "daggerdbl", "periodcentered", + "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + "Ecircumflex", "Aacute", "Edieresis", "Egrave", + "Iacute", "Icircumflex", "Idieresis", "Igrave", + "Oacute", "Ocircumflex", "applelogo", "Ograve", + "Uacute", "Ucircumflex", "Ugrave", "dotlessi", + "circumflex", "tilde", "overscore", "breve", + "dotaccent", "ring", "cedilla", "hungarumlaut", + "ogonek", "caron", "Lslash", "lslash", + "Scaron", "scaron", "Zcaron", "zcaron", + "brokenbar", "Eth", "eth", "Yacute", + "yacute", "Thorn", "thorn", "minus", + "multiply", "onesuperior", "twosuperior", "threesuperior", + "onehalf", "onequarter", "threequarters", "franc", + "Gbreve", "gbreve", "Idot", "Scedilla", + "scedilla", "Cacute", "cacute", "Ccaron", + "ccaron", "dmacron" +}; + +//------------------------------------------------------------------------ +// FoFiTrueType +//------------------------------------------------------------------------ + +FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA, int faceIndexA) { + FoFiTrueType *ff; + + ff = new FoFiTrueType(fileA, lenA, gFalse, faceIndexA); + if (!ff->parsedOk) { + delete ff; + return NULL; + } + return ff; +} + +FoFiTrueType *FoFiTrueType::load(char *fileName, int faceIndexA) { + FoFiTrueType *ff; + char *fileA; + int lenA; + + if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { + return NULL; + } + ff = new FoFiTrueType(fileA, lenA, gTrue, faceIndexA); + if (!ff->parsedOk) { + delete ff; + return NULL; + } + return ff; +} + +FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA): + FoFiBase(fileA, lenA, freeFileDataA) +{ + tables = NULL; + nTables = 0; + cmaps = NULL; + nCmaps = 0; + nameToGID = NULL; + parsedOk = gFalse; + faceIndex = faceIndexA; + gsubFeatureTable = 0; + gsubLookupList = 0; + + parse(); +} + +FoFiTrueType::~FoFiTrueType() { + gfree(tables); + gfree(cmaps); + if (nameToGID) { + delete nameToGID; + } +} + +int FoFiTrueType::getNumCmaps() { + return nCmaps; +} + +int FoFiTrueType::getCmapPlatform(int i) { + return cmaps[i].platform; +} + +int FoFiTrueType::getCmapEncoding(int i) { + return cmaps[i].encoding; +} + +int FoFiTrueType::findCmap(int platform, int encoding) { + int i; + + for (i = 0; i < nCmaps; ++i) { + if (cmaps[i].platform == platform && cmaps[i].encoding == encoding) { + return i; + } + } + return -1; +} + +int FoFiTrueType::mapCodeToGID(int i, Guint c) { + int gid; + Guint segCnt, segEnd, segStart, segDelta, segOffset; + Guint cmapFirst, cmapLen; + int pos, a, b, m; + GBool ok; + + if (i < 0 || i >= nCmaps) { + return 0; + } + ok = gTrue; + pos = cmaps[i].offset; + switch (cmaps[i].fmt) { + case 0: + if (c + 6 >= (Guint)cmaps[i].len) { + return 0; + } + gid = getU8(cmaps[i].offset + 6 + c, &ok); + break; + case 4: + segCnt = getU16BE(pos + 6, &ok) / 2; + a = -1; + b = segCnt - 1; + segEnd = getU16BE(pos + 14 + 2*b, &ok); + if (c > segEnd) { + // malformed font -- the TrueType spec requires the last segEnd + // to be 0xffff + return 0; + } + // invariant: seg[a].end < code <= seg[b].end + while (b - a > 1 && ok) { + m = (a + b) / 2; + segEnd = getU16BE(pos + 14 + 2*m, &ok); + if (segEnd < c) { + a = m; + } else { + b = m; + } + } + segStart = getU16BE(pos + 16 + 2*segCnt + 2*b, &ok); + segDelta = getU16BE(pos + 16 + 4*segCnt + 2*b, &ok); + segOffset = getU16BE(pos + 16 + 6*segCnt + 2*b, &ok); + if (c < segStart) { + return 0; + } + if (segOffset == 0) { + gid = (c + segDelta) & 0xffff; + } else { + gid = getU16BE(pos + 16 + 6*segCnt + 2*b + + segOffset + 2 * (c - segStart), &ok); + if (gid != 0) { + gid = (gid + segDelta) & 0xffff; + } + } + break; + case 6: + cmapFirst = getU16BE(pos + 6, &ok); + cmapLen = getU16BE(pos + 8, &ok); + if (c < cmapFirst || c >= cmapFirst + cmapLen) { + return 0; + } + gid = getU16BE(pos + 10 + 2 * (c - cmapFirst), &ok); + break; + case 12: + segCnt = getU32BE(pos + 12, &ok); + a = -1; + b = segCnt - 1; + segEnd = getU32BE(pos + 16 + 12*b+4, &ok); + if (c > segEnd) { + return 0; + } + // invariant: seg[a].end < code <= seg[b].end + while (b - a > 1 && ok) { + m = (a + b) / 2; + segEnd = getU32BE(pos + 16 + 12*m+4, &ok); + if (segEnd < c) { + a = m; + } else { + b = m; + } + } + segStart = getU32BE(pos + 16 + 12*b, &ok); + segDelta = getU32BE(pos + 16 + 12*b+8, &ok); + if (c < segStart) { + return 0; + } + gid = segDelta + (c-segStart); + break; + default: + return 0; + } + if (!ok) { + return 0; + } + return gid; +} + +int FoFiTrueType::mapNameToGID(char *name) { + if (!nameToGID) { + return 0; + } + return nameToGID->lookupInt(name); +} + +GBool FoFiTrueType::getCFFBlock(char **start, int *length) { + int i; + + if (!openTypeCFF) { + return gFalse; + } + i = seekTable("CFF "); + if (!checkRegion(tables[i].offset, tables[i].len)) { + return gFalse; + } + *start = (char *)file + tables[i].offset; + *length = tables[i].len; + return gTrue; +} + +int *FoFiTrueType::getCIDToGIDMap(int *nCIDs) { + char *start; + int length; + FoFiType1C *ff; + int *map; + + *nCIDs = 0; + if (!getCFFBlock(&start, &length)) { + return NULL; + } + if (!(ff = FoFiType1C::make(start, length))) { + return NULL; + } + map = ff->getCIDToGIDMap(nCIDs); + delete ff; + return map; +} + +int FoFiTrueType::getEmbeddingRights() { + int i, fsType; + GBool ok; + + if ((i = seekTable("OS/2")) < 0) { + return 4; + } + ok = gTrue; + fsType = getU16BE(tables[i].offset + 8, &ok); + if (!ok) { + return 4; + } + if (fsType & 0x0008) { + return 2; + } + if (fsType & 0x0004) { + return 1; + } + if (fsType & 0x0002) { + return 0; + } + return 3; +} + +void FoFiTrueType::getFontMatrix(double *mat) { + char *start; + int length; + FoFiType1C *ff; + + if (!getCFFBlock(&start, &length)) { + return; + } + if (!(ff = FoFiType1C::make(start, length))) { + return; + } + ff->getFontMatrix(mat); + delete ff; +} + +void FoFiTrueType::convertToType42(char *psName, char **encoding, + int *codeToGID, + FoFiOutputFunc outputFunc, + void *outputStream) { + GooString *buf; + int maxUsedGlyph; + GBool ok; + + if (openTypeCFF) { + return; + } + + // write the header + ok = gTrue; + buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n", + (double)getS32BE(0, &ok) / 65536.0); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + + // begin the font dictionary + (*outputFunc)(outputStream, "10 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/FontType 42 def\n", 17); + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); + + // write the guts of the dictionary + cvtEncoding(encoding, outputFunc, outputStream); + cvtCharStrings(encoding, codeToGID, outputFunc, outputStream); + cvtSfnts(outputFunc, outputStream, NULL, gFalse, &maxUsedGlyph); + + // end the dictionary and define the font + (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); +} + +void FoFiTrueType::convertToType1(char *psName, const char **newEncoding, + GBool ascii, FoFiOutputFunc outputFunc, + void *outputStream) { + char *start; + int length; + FoFiType1C *ff; + + if (!getCFFBlock(&start, &length)) { + return; + } + if (!(ff = FoFiType1C::make(start, length))) { + return; + } + ff->convertToType1(psName, newEncoding, ascii, outputFunc, outputStream); + delete ff; +} + +void FoFiTrueType::convertToCIDType2(char *psName, + int *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, + void *outputStream) { + GooString *buf; + int cid, maxUsedGlyph; + GBool ok; + int i, j, k; + + if (openTypeCFF) { + return; + } + + // write the header + ok = gTrue; + buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n", + (double)getS32BE(0, &ok) / 65536.0); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + + // begin the font dictionary + (*outputFunc)(outputStream, "20 dict begin\n", 14); + (*outputFunc)(outputStream, "/CIDFontName /", 14); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/CIDFontType 2 def\n", 19); + (*outputFunc)(outputStream, "/FontType 42 def\n", 17); + (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); + (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); + (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); + (*outputFunc)(outputStream, " /Supplement 0 def\n", 20); + (*outputFunc)(outputStream, " end def\n", 10); + (*outputFunc)(outputStream, "/GDBytes 2 def\n", 15); + if (cidMap) { + buf = GooString::format("/CIDCount {0:d} def\n", nCIDs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (nCIDs > 32767) { + (*outputFunc)(outputStream, "/CIDMap [", 9); + for (i = 0; i < nCIDs; i += 32768 - 16) { + (*outputFunc)(outputStream, "<\n", 2); + for (j = 0; j < 32768 - 16 && i+j < nCIDs; j += 16) { + (*outputFunc)(outputStream, " ", 2); + for (k = 0; k < 16 && i+j+k < nCIDs; ++k) { + cid = cidMap[i+j+k]; + buf = GooString::format("{0:02x}{1:02x}", + (cid >> 8) & 0xff, cid & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "\n", 1); + } + (*outputFunc)(outputStream, " >", 3); + } + (*outputFunc)(outputStream, "\n", 1); + (*outputFunc)(outputStream, "] def\n", 6); + } else { + (*outputFunc)(outputStream, "/CIDMap <\n", 10); + for (i = 0; i < nCIDs; i += 16) { + (*outputFunc)(outputStream, " ", 2); + for (j = 0; j < 16 && i+j < nCIDs; ++j) { + cid = cidMap[i+j]; + buf = GooString::format("{0:02x}{1:02x}", + (cid >> 8) & 0xff, cid & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "\n", 1); + } + (*outputFunc)(outputStream, "> def\n", 6); + } + } else { + // direct mapping - just fill the string(s) with s[i]=i + buf = GooString::format("/CIDCount {0:d} def\n", nGlyphs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (nGlyphs > 32767) { + (*outputFunc)(outputStream, "/CIDMap [\n", 10); + for (i = 0; i < nGlyphs; i += 32767) { + j = nGlyphs - i < 32767 ? nGlyphs - i : 32767; + buf = GooString::format(" {0:d} string 0 1 {1:d} {{\n", 2 * j, j - 1); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format(" 2 copy dup 2 mul exch {0:d} add -8 bitshift put\n", + i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format(" 1 index exch dup 2 mul 1 add exch {0:d} add" + " 255 and put\n", i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, " } for\n", 8); + } + (*outputFunc)(outputStream, "] def\n", 6); + } else { + buf = GooString::format("/CIDMap {0:d} string\n", 2 * nGlyphs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format(" 0 1 {0:d} {{\n", nGlyphs - 1); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, + " 2 copy dup 2 mul exch -8 bitshift put\n", 42); + (*outputFunc)(outputStream, + " 1 index exch dup 2 mul 1 add exch 255 and put\n", 50); + (*outputFunc)(outputStream, " } for\n", 8); + (*outputFunc)(outputStream, "def\n", 4); + } + } + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); + (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26); + (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30); + (*outputFunc)(outputStream, " /.notdef 0 def\n", 17); + (*outputFunc)(outputStream, " end readonly def\n", 19); + + // write the guts of the dictionary + cvtSfnts(outputFunc, outputStream, NULL, needVerticalMetrics, &maxUsedGlyph); + + // end the dictionary and define the font + (*outputFunc)(outputStream, + "CIDFontName currentdict end /CIDFont defineresource pop\n", + 56); +} + +void FoFiTrueType::convertToCIDType0(char *psName, int *cidMap, int nCIDs, + FoFiOutputFunc outputFunc, + void *outputStream) { + char *start; + int length; + FoFiType1C *ff; + + if (!getCFFBlock(&start, &length)) { + return; + } + if (!(ff = FoFiType1C::make(start, length))) { + return; + } + ff->convertToCIDType0(psName, cidMap, nCIDs, outputFunc, outputStream); + delete ff; +} + +void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, + void *outputStream) { + GooString *buf; + GooString *sfntsName; + int maxUsedGlyph, n, i, j; + + if (openTypeCFF) { + return; + } + + // write the Type 42 sfnts array + sfntsName = (new GooString(psName))->append("_sfnts"); + cvtSfnts(outputFunc, outputStream, sfntsName, needVerticalMetrics, + &maxUsedGlyph); + delete sfntsName; + + // write the descendant Type 42 fonts + // (The following is a kludge: nGlyphs is the glyph count from the + // maxp table; maxUsedGlyph is the max glyph number that has a + // non-zero-length description, from the loca table. The problem is + // that some TrueType font subsets fail to change the glyph count, + // i.e., nGlyphs is much larger than maxUsedGlyph+1, which results + // in an unnecessarily huge Type 0 font. But some other PDF files + // have fonts with only zero or one used glyph, and a content stream + // that refers to one of the unused glyphs -- this results in PS + // errors if we simply use maxUsedGlyph+1 for the Type 0 font. So + // we compromise by always defining at least 256 glyphs.) + if (cidMap) { + n = nCIDs; + } else if (nGlyphs > maxUsedGlyph + 256) { + if (maxUsedGlyph <= 255) { + n = 256; + } else { + n = maxUsedGlyph + 1; + } + } else { + n = nGlyphs; + } + for (i = 0; i < n; i += 256) { + (*outputFunc)(outputStream, "10 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GooString::format("_{0:02x} def\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 42 def\n", 17); + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); + (*outputFunc)(outputStream, "/sfnts ", 7); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, "_sfnts def\n", 11); + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + for (j = 0; j < 256 && i+j < n; ++j) { + buf = GooString::format("dup {0:d} /c{1:02x} put\n", j, j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "readonly def\n", 13); + (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32); + (*outputFunc)(outputStream, "/.notdef 0 def\n", 15); + for (j = 0; j < 256 && i+j < n; ++j) { + buf = GooString::format("/c{0:02x} {1:d} def\n", + j, cidMap ? cidMap[i+j] : i+j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "end readonly def\n", 17); + (*outputFunc)(outputStream, + "FontName currentdict end definefont pop\n", 40); + } + + // write the Type 0 parent font + (*outputFunc)(outputStream, "16 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/FontType 0 def\n", 16); + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); + (*outputFunc)(outputStream, "/Encoding [\n", 12); + for (i = 0; i < n; i += 256) { + buf = GooString::format("{0:d}\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "/FDepVector [\n", 14); + for (i = 0; i < n; i += 256) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GooString::format("_{0:02x} findfont\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); +} + +void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs, + FoFiOutputFunc outputFunc, + void *outputStream) { + char *start; + int length; + FoFiType1C *ff; + + if (!getCFFBlock(&start, &length)) { + return; + } + if (!(ff = FoFiType1C::make(start, length))) { + return; + } + ff->convertToType0(psName, cidMap, nCIDs, outputFunc, outputStream); + delete ff; +} + +void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc, + void *outputStream, char *name, + int *codeToGID) { + // this substitute cmap table maps char code ffff to glyph 0, + // with tables for MacRoman and MS Unicode + static char cmapTab[44] = { + 0, 0, // table version number + 0, 2, // number of encoding tables + 0, 1, // platform ID + 0, 0, // encoding ID + 0, 0, 0, 20, // offset of subtable + 0, 3, // platform ID + 0, 1, // encoding ID + 0, 0, 0, 20, // offset of subtable + 0, 4, // subtable format + 0, 24, // subtable length + 0, 0, // subtable version + 0, 2, // segment count * 2 + 0, 2, // 2 * 2 ^ floor(log2(segCount)) + 0, 0, // floor(log2(segCount)) + 0, 0, // 2*segCount - 2*2^floor(log2(segCount)) + (char)0xff, (char)0xff, // endCount[0] + 0, 0, // reserved + (char)0xff, (char)0xff, // startCount[0] + 0, 1, // idDelta[0] + 0, 0 // idRangeOffset[0] + }; + static char nameTab[8] = { + 0, 0, // format + 0, 0, // number of name records + 0, 6, // offset to start of string storage + 0, 0 // pad to multiple of four bytes + }; + static char postTab[32] = { + 0, 1, 0, 0, // format + 0, 0, 0, 0, // italic angle + 0, 0, // underline position + 0, 0, // underline thickness + 0, 0, 0, 0, // fixed pitch + 0, 0, 0, 0, // min Type 42 memory + 0, 0, 0, 0, // max Type 42 memory + 0, 0, 0, 0, // min Type 1 memory + 0, 0, 0, 0 // max Type 1 memory + }; + static char os2Tab[86] = { + 0, 1, // version + 0, 1, // xAvgCharWidth + 0x01, (char)0x90, // usWeightClass + 0, 5, // usWidthClass + 0, 0, // fsType + 0, 0, // ySubscriptXSize + 0, 0, // ySubscriptYSize + 0, 0, // ySubscriptXOffset + 0, 0, // ySubscriptYOffset + 0, 0, // ySuperscriptXSize + 0, 0, // ySuperscriptYSize + 0, 0, // ySuperscriptXOffset + 0, 0, // ySuperscriptYOffset + 0, 0, // yStrikeoutSize + 0, 0, // yStrikeoutPosition + 0, 0, // sFamilyClass + 0, 0, 0, 0, 0, // panose + 0, 0, 0, 0, 0, + 0, 0, 0, 0, // ulUnicodeRange1 + 0, 0, 0, 0, // ulUnicodeRange2 + 0, 0, 0, 0, // ulUnicodeRange3 + 0, 0, 0, 0, // ulUnicodeRange4 + 0, 0, 0, 0, // achVendID + 0, 0, // fsSelection + 0, 0, // usFirstCharIndex + 0, 0, // usLastCharIndex + 0, 0, // sTypoAscender + 0, 0, // sTypoDescender + 0, 0, // sTypoLineGap + 0x20, 0x00, // usWinAscent + 0x20, 0x00, // usWinDescent + 0, 0, 0, 1, // ulCodePageRange1 + 0, 0, 0, 0 // ulCodePageRange2 + }; + GBool missingCmap, missingName, missingPost, missingOS2; + GBool unsortedLoca, emptyCmap, badCmapLen, abbrevHMTX; + int nZeroLengthTables, nBogusTables; + int nHMetrics, advWidth, lsb; + TrueTypeLoca *locaTable; + TrueTypeTable *newTables; + char *newNameTab, *newCmapTab, *newHHEATab, *newHMTXTab; + int nNewTables, cmapIdx, cmapLen, glyfLen, newNameLen, newCmapLen, next; + int newHHEALen, newHMTXLen; + Guint locaChecksum, glyfChecksum, fileChecksum; + char *tableDir; + char locaBuf[4], checksumBuf[4]; + GBool ok; + Guint t; + int pos, i, j, k, n; + + if (openTypeCFF) { + return; + } + + if (tables == NULL) { + return; + } + + // check for missing tables + // (Note: if the OS/2 table is missing, the Microsoft PCL5 driver + // will embed a PCL TrueType font with the pitch field set to zero, + // which apparently causes divide-by-zero errors. As far as I can + // tell, the only important field in the OS/2 table is + // xAvgCharWidth.) + missingCmap = (cmapIdx = seekTable("cmap")) < 0; + missingName = seekTable("name") < 0; + missingPost = seekTable("post") < 0; + missingOS2 = seekTable("OS/2") < 0; + + // read the loca table, check to see if it's sorted + locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca)); + unsortedLoca = gFalse; + i = seekTable("loca"); + pos = tables[i].offset; + ok = gTrue; + for (i = 0; i <= nGlyphs; ++i) { + if (locaFmt) { + locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok); + } else { + locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok); + } + if (i > 0 && locaTable[i].origOffset < locaTable[i-1].origOffset) { + unsortedLoca = gTrue; + } + // glyph descriptions must be at least 12 bytes long (nContours, + // xMin, yMin, xMax, yMax, instructionLength - two bytes each); + // invalid glyph descriptions (even if they're never used) make + // Windows choke, so we work around that problem here (ideally, + // this would parse the glyph descriptions in the glyf table and + // remove any that were invalid, but this quick test is a decent + // start) + if (i > 0 && + locaTable[i].origOffset - locaTable[i-1].origOffset > 0 && + locaTable[i].origOffset - locaTable[i-1].origOffset < 12) { + locaTable[i-1].origOffset = locaTable[i].origOffset; + unsortedLoca = gTrue; + } + locaTable[i].idx = i; + } + + // check for zero-length tables and bogus tags + nZeroLengthTables = nBogusTables = 0; + for (i = 0; i < nTables; ++i) { + if (tables[i].len == 0) { + ++nZeroLengthTables; + if (tables[i].tag == cmapTag) { + missingCmap = gTrue; + } else if (tables[i].tag == nameTag) { + missingName = gTrue; + } else if (tables[i].tag == postTag) { + missingPost = gTrue; + } else if (tables[i].tag == os2Tag) { + missingOS2 = gTrue; + } + } else if (!(tables[i].tag & 0xe0000000) || + !(tables[i].tag & 0x00e00000) || + !(tables[i].tag & 0x0000e000) || + !(tables[i].tag & 0x000000e0)) { + // tags where any of the bytes are < 0x20 are probably bogus + // (the TrueType spec uses ASCII sequences for tags) -- this + // catches problems where the number of tables given in the + // header is too large, and so gibberish data is read at the end + // of the table directory + ++nBogusTables; + } + } + + // check for an empty cmap table or an incorrect cmap table length + emptyCmap = badCmapLen = gFalse; + cmapLen = 0; // make gcc happy + if (!missingCmap) { + if (nCmaps == 0) { + emptyCmap = gTrue; + } else { + cmapLen = cmaps[0].offset + cmaps[0].len; + for (i = 1; i < nCmaps; ++i) { + if (cmaps[i].offset + cmaps[i].len > cmapLen) { + cmapLen = cmaps[i].offset + cmaps[i].len; + } + } + cmapLen -= tables[cmapIdx].offset; + if (cmapLen > tables[cmapIdx].len) { + badCmapLen = gTrue; + } + } + } + + // check for an abbreviated hmtx table (this is completely legal, + // but confuses the Microsoft PCL5 printer driver, which generates + // embedded fonts with the pitch field set to zero) + i = seekTable("hhea"); + nHMetrics = getU16BE(tables[i].offset + 34, &ok); + abbrevHMTX = nHMetrics < nGlyphs; + + // if nothing is broken, just write the TTF file as is + if (!missingCmap && !missingName && !missingPost && !missingOS2 && + !unsortedLoca && !emptyCmap && !badCmapLen && !abbrevHMTX && + nZeroLengthTables == 0 && nBogusTables == 0 && + !name && !codeToGID) { + (*outputFunc)(outputStream, (char *)file, len); + goto done1; + } + + // sort the 'loca' table: some (non-compliant) fonts have + // out-of-order loca tables; in order to correctly handle the case + // where (compliant) fonts have empty entries in the middle of the + // table, cmpTrueTypeLocaOffset uses offset as its primary sort key, + // and idx as its secondary key (ensuring that adjacent entries with + // the same pos value remain in the same order) + glyfLen = 0; // make gcc happy + if (unsortedLoca) { + std::sort(locaTable, locaTable + nGlyphs + 1, + cmpTrueTypeLocaOffsetFunctor()); + for (i = 0; i < nGlyphs; ++i) { + locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset; + } + locaTable[nGlyphs].len = 0; + std::sort(locaTable, locaTable + nGlyphs + 1, cmpTrueTypeLocaIdxFunctor()); + // if the last entry in the loca is not the max offset (size of + // the glyf table), something is wrong -- work around the problem + // by forcing the last sorted entry to have a zero length + locaTable[nGlyphs].len = 0; + pos = 0; + for (i = 0; i <= nGlyphs; ++i) { + locaTable[i].newOffset = pos; + pos += locaTable[i].len; + if (pos & 3) { + pos += 4 - (pos & 3); + } + } + glyfLen = pos; + } + + // compute checksums for the loca and glyf tables + locaChecksum = glyfChecksum = 0; + if (unsortedLoca) { + if (locaFmt) { + for (j = 0; j <= nGlyphs; ++j) { + locaChecksum += locaTable[j].newOffset; + } + } else { + for (j = 0; j <= nGlyphs; j += 2) { + locaChecksum += locaTable[j].newOffset << 16; + if (j + 1 <= nGlyphs) { + locaChecksum += locaTable[j+1].newOffset; + } + } + } + pos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + n = locaTable[j].len; + if (n > 0) { + k = locaTable[j].origOffset; + if (checkRegion(pos + k, n)) { + glyfChecksum += computeTableChecksum(file + pos + k, n); + } + } + } + } + + // construct the new name table + if (name) { + n = strlen(name); + newNameLen = (6 + 4*12 + 2 * (3*n + 7) + 3) & ~3; + newNameTab = (char *)gmalloc(newNameLen); + memset(newNameTab, 0, newNameLen); + newNameTab[0] = 0; // format selector + newNameTab[1] = 0; + newNameTab[2] = 0; // number of name records + newNameTab[3] = 4; + newNameTab[4] = 0; // offset to start of string storage + newNameTab[5] = 6 + 4*12; + next = 0; + for (i = 0; i < 4; ++i) { + newNameTab[6 + i*12 + 0] = 0; // platform ID = Microsoft + newNameTab[6 + i*12 + 1] = 3; + newNameTab[6 + i*12 + 2] = 0; // encoding ID = Unicode + newNameTab[6 + i*12 + 3] = 1; + newNameTab[6 + i*12 + 4] = 0x04; // language ID = American English + newNameTab[6 + i*12 + 5] = 0x09; + newNameTab[6 + i*12 + 6] = 0; // name ID + newNameTab[6 + i*12 + 7] = i + 1; + newNameTab[6 + i*12 + 8] = i+1 == 2 ? 0 : ((2*n) >> 8); // string length + newNameTab[6 + i*12 + 9] = i+1 == 2 ? 14 : ((2*n) & 0xff); + newNameTab[6 + i*12 + 10] = next >> 8; // string offset + newNameTab[6 + i*12 + 11] = next & 0xff; + if (i+1 == 2) { + memcpy(newNameTab + 6 + 4*12 + next, "\0R\0e\0g\0u\0l\0a\0r", 14); + next += 14; + } else { + for (j = 0; j < n; ++j) { + newNameTab[6 + 4*12 + next + 2*j] = 0; + newNameTab[6 + 4*12 + next + 2*j + 1] = name[j]; + } + next += 2*n; + } + } + } else { + newNameLen = 0; + newNameTab = NULL; + } + + // construct the new cmap table + if (codeToGID) { + newCmapLen = 44 + 256 * 2; + newCmapTab = (char *)gmalloc(newCmapLen); + newCmapTab[0] = 0; // table version number = 0 + newCmapTab[1] = 0; + newCmapTab[2] = 0; // number of encoding tables = 1 + newCmapTab[3] = 1; + newCmapTab[4] = 0; // platform ID = Microsoft + newCmapTab[5] = 3; + newCmapTab[6] = 0; // encoding ID = Unicode + newCmapTab[7] = 1; + newCmapTab[8] = 0; // offset of subtable + newCmapTab[9] = 0; + newCmapTab[10] = 0; + newCmapTab[11] = 12; + newCmapTab[12] = 0; // subtable format = 4 + newCmapTab[13] = 4; + newCmapTab[14] = 0x02; // subtable length + newCmapTab[15] = 0x20; + newCmapTab[16] = 0; // subtable version = 0 + newCmapTab[17] = 0; + newCmapTab[18] = 0; // segment count * 2 + newCmapTab[19] = 4; + newCmapTab[20] = 0; // 2 * 2 ^ floor(log2(segCount)) + newCmapTab[21] = 4; + newCmapTab[22] = 0; // floor(log2(segCount)) + newCmapTab[23] = 1; + newCmapTab[24] = 0; // 2*segCount - 2*2^floor(log2(segCount)) + newCmapTab[25] = 0; + newCmapTab[26] = 0x00; // endCount[0] + newCmapTab[27] = (char)0xff; + newCmapTab[28] = (char)0xff; // endCount[1] + newCmapTab[29] = (char)0xff; + newCmapTab[30] = 0; // reserved + newCmapTab[31] = 0; + newCmapTab[32] = 0x00; // startCount[0] + newCmapTab[33] = 0x00; + newCmapTab[34] = (char)0xff; // startCount[1] + newCmapTab[35] = (char)0xff; + newCmapTab[36] = 0; // idDelta[0] + newCmapTab[37] = 0; + newCmapTab[38] = 0; // idDelta[1] + newCmapTab[39] = 1; + newCmapTab[40] = 0; // idRangeOffset[0] + newCmapTab[41] = 4; + newCmapTab[42] = 0; // idRangeOffset[1] + newCmapTab[43] = 0; + for (i = 0; i < 256; ++i) { + if (codeToGID[i] < 0) { + //~ this may not be correct - we want this character to never be + //~ displayed, but mapping it to the notdef glyph may result in + //~ little boxes being displayed + newCmapTab[44 + 2*i] = 0; + newCmapTab[44 + 2*i + 1] = 0; + } else { + newCmapTab[44 + 2*i] = codeToGID[i] >> 8; + newCmapTab[44 + 2*i + 1] = codeToGID[i] & 0xff; + } + } + } else { + newCmapLen = 0; + newCmapTab = NULL; + } + + // generate the new hmtx table and the updated hhea table + if (abbrevHMTX) { + i = seekTable("hhea"); + pos = tables[i].offset; + newHHEALen = 36; + newHHEATab = (char *)gmalloc(newHHEALen); + for (i = 0; i < newHHEALen; ++i) { + newHHEATab[i] = getU8(pos++, &ok); + } + newHHEATab[34] = nGlyphs >> 8; + newHHEATab[35] = nGlyphs & 0xff; + i = seekTable("hmtx"); + pos = tables[i].offset; + newHMTXLen = 4 * nGlyphs; + newHMTXTab = (char *)gmalloc(newHMTXLen); + advWidth = 0; + for (i = 0; i < nHMetrics; ++i) { + advWidth = getU16BE(pos, &ok); + lsb = getU16BE(pos + 2, &ok); + pos += 4; + newHMTXTab[4*i ] = advWidth >> 8; + newHMTXTab[4*i + 1] = advWidth & 0xff; + newHMTXTab[4*i + 2] = lsb >> 8; + newHMTXTab[4*i + 3] = lsb & 0xff; + } + for (; i < nGlyphs; ++i) { + lsb = getU16BE(pos, &ok); + pos += 2; + newHMTXTab[4*i ] = advWidth >> 8; + newHMTXTab[4*i + 1] = advWidth & 0xff; + newHMTXTab[4*i + 2] = lsb >> 8; + newHMTXTab[4*i + 3] = lsb & 0xff; + } + } else { + newHHEATab = newHMTXTab = NULL; + newHHEALen = newHMTXLen = 0; // make gcc happy + } + + // construct the new table directory: + // - keep all original tables with non-zero length + // - fix the cmap table's length, if necessary + // - add missing tables + // - sort the table by tag + // - compute new table positions, including 4-byte alignment + // - (re)compute table checksums + nNewTables = nTables - nZeroLengthTables - nBogusTables + + (missingCmap ? 1 : 0) + (missingName ? 1 : 0) + + (missingPost ? 1 : 0) + (missingOS2 ? 1 : 0); + newTables = (TrueTypeTable *)gmallocn(nNewTables, sizeof(TrueTypeTable)); + j = 0; + for (i = 0; i < nTables; ++i) { + if (tables[i].len > 0 && + (tables[i].tag & 0xe0000000) && + (tables[i].tag & 0x00e00000) && + (tables[i].tag & 0x0000e000) && + (tables[i].tag & 0x000000e0)) { + newTables[j] = tables[i]; + newTables[j].origOffset = tables[i].offset; + if (checkRegion(tables[i].offset, tables[i].len)) { + newTables[j].checksum = + computeTableChecksum(file + tables[i].offset, tables[i].len); + if (tables[i].tag == headTag) { + // don't include the file checksum + newTables[j].checksum -= getU32BE(tables[i].offset + 8, &ok); + } + } + if (newTables[j].tag == cmapTag && codeToGID) { + newTables[j].len = newCmapLen; + newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab, + newCmapLen); + } else if (newTables[j].tag == cmapTag && emptyCmap) { + newTables[j].checksum = computeTableChecksum((Guchar *)cmapTab, + sizeof(cmapTab)); + newTables[j].len = sizeof(cmapTab); + } else if (newTables[j].tag == cmapTag && badCmapLen) { + newTables[j].len = cmapLen; + } else if (newTables[j].tag == locaTag && unsortedLoca) { + newTables[j].len = (nGlyphs + 1) * (locaFmt ? 4 : 2); + newTables[j].checksum = locaChecksum; + } else if (newTables[j].tag == glyfTag && unsortedLoca) { + newTables[j].len = glyfLen; + newTables[j].checksum = glyfChecksum; + } else if (newTables[j].tag == nameTag && name) { + newTables[j].len = newNameLen; + newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab, + newNameLen); + } else if (newTables[j].tag == hheaTag && abbrevHMTX) { + newTables[j].len = newHHEALen; + newTables[j].checksum = computeTableChecksum((Guchar *)newHHEATab, + newHHEALen); + } else if (newTables[j].tag == hmtxTag && abbrevHMTX) { + newTables[j].len = newHMTXLen; + newTables[j].checksum = computeTableChecksum((Guchar *)newHMTXTab, + newHMTXLen); + } + ++j; + } + } + if (missingCmap) { + newTables[j].tag = cmapTag; + if (codeToGID) { + newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab, + newCmapLen); + newTables[j].len = newCmapLen; + } else { + newTables[j].checksum = computeTableChecksum((Guchar *)cmapTab, + sizeof(cmapTab)); + newTables[j].len = sizeof(cmapTab); + } + ++j; + } + if (missingName) { + newTables[j].tag = nameTag; + if (name) { + newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab, + newNameLen); + newTables[j].len = newNameLen; + } else { + newTables[j].checksum = computeTableChecksum((Guchar *)nameTab, + sizeof(nameTab)); + newTables[j].len = sizeof(nameTab); + } + ++j; + } + if (missingPost) { + newTables[j].tag = postTag; + newTables[j].checksum = computeTableChecksum((Guchar *)postTab, + sizeof(postTab)); + newTables[j].len = sizeof(postTab); + ++j; + } + if (missingOS2) { + newTables[j].tag = os2Tag; + newTables[j].checksum = computeTableChecksum((Guchar *)os2Tab, + sizeof(os2Tab)); + newTables[j].len = sizeof(os2Tab); + ++j; + } + std::sort(newTables, newTables + nNewTables, cmpTrueTypeTableTagFunctor()); + pos = 12 + nNewTables * 16; + for (i = 0; i < nNewTables; ++i) { + newTables[i].offset = pos; + pos += newTables[i].len; + if (pos & 3) { + pos += 4 - (pos & 3); + } + } + + // write the table directory + tableDir = (char *)gmalloc(12 + nNewTables * 16); + tableDir[0] = 0x00; // sfnt version + tableDir[1] = 0x01; + tableDir[2] = 0x00; + tableDir[3] = 0x00; + tableDir[4] = (char)((nNewTables >> 8) & 0xff); // numTables + tableDir[5] = (char)(nNewTables & 0xff); + for (i = -1, t = (Guint)nNewTables; t; ++i, t >>= 1) ; + t = 1 << (4 + i); + tableDir[6] = (char)((t >> 8) & 0xff); // searchRange + tableDir[7] = (char)(t & 0xff); + tableDir[8] = (char)((i >> 8) & 0xff); // entrySelector + tableDir[9] = (char)(i & 0xff); + t = nNewTables * 16 - t; + tableDir[10] = (char)((t >> 8) & 0xff); // rangeShift + tableDir[11] = (char)(t & 0xff); + pos = 12; + for (i = 0; i < nNewTables; ++i) { + tableDir[pos ] = (char)(newTables[i].tag >> 24); + tableDir[pos+ 1] = (char)(newTables[i].tag >> 16); + tableDir[pos+ 2] = (char)(newTables[i].tag >> 8); + tableDir[pos+ 3] = (char) newTables[i].tag; + tableDir[pos+ 4] = (char)(newTables[i].checksum >> 24); + tableDir[pos+ 5] = (char)(newTables[i].checksum >> 16); + tableDir[pos+ 6] = (char)(newTables[i].checksum >> 8); + tableDir[pos+ 7] = (char) newTables[i].checksum; + tableDir[pos+ 8] = (char)(newTables[i].offset >> 24); + tableDir[pos+ 9] = (char)(newTables[i].offset >> 16); + tableDir[pos+10] = (char)(newTables[i].offset >> 8); + tableDir[pos+11] = (char) newTables[i].offset; + tableDir[pos+12] = (char)(newTables[i].len >> 24); + tableDir[pos+13] = (char)(newTables[i].len >> 16); + tableDir[pos+14] = (char)(newTables[i].len >> 8); + tableDir[pos+15] = (char) newTables[i].len; + pos += 16; + } + (*outputFunc)(outputStream, tableDir, 12 + nNewTables * 16); + + // compute the file checksum + fileChecksum = computeTableChecksum((Guchar *)tableDir, + 12 + nNewTables * 16); + for (i = 0; i < nNewTables; ++i) { + fileChecksum += newTables[i].checksum; + } + fileChecksum = 0xb1b0afba - fileChecksum; + + // write the tables + for (i = 0; i < nNewTables; ++i) { + if (newTables[i].tag == headTag) { + if (checkRegion(newTables[i].origOffset, newTables[i].len)) { + (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, 8); + checksumBuf[0] = fileChecksum >> 24; + checksumBuf[1] = fileChecksum >> 16; + checksumBuf[2] = fileChecksum >> 8; + checksumBuf[3] = fileChecksum; + (*outputFunc)(outputStream, checksumBuf, 4); + (*outputFunc)(outputStream, + (char *)file + newTables[i].origOffset + 12, + newTables[i].len - 12); + } else { + for (j = 0; j < newTables[i].len; ++j) { + (*outputFunc)(outputStream, "\0", 1); + } + } + } else if (newTables[i].tag == cmapTag && codeToGID) { + (*outputFunc)(outputStream, newCmapTab, newTables[i].len); + } else if (newTables[i].tag == cmapTag && missingCmap) { + (*outputFunc)(outputStream, cmapTab, newTables[i].len); + } else if (newTables[i].tag == nameTag && name) { + (*outputFunc)(outputStream, newNameTab, newTables[i].len); + } else if (newTables[i].tag == nameTag && missingName) { + (*outputFunc)(outputStream, nameTab, newTables[i].len); + } else if (newTables[i].tag == postTag && missingPost) { + (*outputFunc)(outputStream, postTab, newTables[i].len); + } else if (newTables[i].tag == os2Tag && missingOS2) { + (*outputFunc)(outputStream, os2Tab, newTables[i].len); + } else if (newTables[i].tag == hheaTag && abbrevHMTX) { + (*outputFunc)(outputStream, newHHEATab, newTables[i].len); + } else if (newTables[i].tag == hmtxTag && abbrevHMTX) { + (*outputFunc)(outputStream, newHMTXTab, newTables[i].len); + } else if (newTables[i].tag == locaTag && unsortedLoca) { + for (j = 0; j <= nGlyphs; ++j) { + if (locaFmt) { + locaBuf[0] = (char)(locaTable[j].newOffset >> 24); + locaBuf[1] = (char)(locaTable[j].newOffset >> 16); + locaBuf[2] = (char)(locaTable[j].newOffset >> 8); + locaBuf[3] = (char) locaTable[j].newOffset; + (*outputFunc)(outputStream, locaBuf, 4); + } else { + locaBuf[0] = (char)(locaTable[j].newOffset >> 9); + locaBuf[1] = (char)(locaTable[j].newOffset >> 1); + (*outputFunc)(outputStream, locaBuf, 2); + } + } + } else if (newTables[i].tag == glyfTag && unsortedLoca) { + pos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + n = locaTable[j].len; + if (n > 0) { + k = locaTable[j].origOffset; + if (checkRegion(pos + k, n)) { + (*outputFunc)(outputStream, (char *)file + pos + k, n); + } else { + for (k = 0; k < n; ++k) { + (*outputFunc)(outputStream, "\0", 1); + } + } + if ((k = locaTable[j].len & 3)) { + (*outputFunc)(outputStream, "\0\0\0\0", 4 - k); + } + } + } + } else { + if (checkRegion(newTables[i].origOffset, newTables[i].len)) { + (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, + newTables[i].len); + } else { + for (j = 0; j < newTables[i].len; ++j) { + (*outputFunc)(outputStream, "\0", 1); + } + } + } + if (newTables[i].len & 3) { + (*outputFunc)(outputStream, "\0\0\0", 4 - (newTables[i].len & 3)); + } + } + + gfree(newHMTXTab); + gfree(newHHEATab); + gfree(newCmapTab); + gfree(newNameTab); + gfree(tableDir); + gfree(newTables); + done1: + gfree(locaTable); +} + +void FoFiTrueType::cvtEncoding(char **encoding, + FoFiOutputFunc outputFunc, + void *outputStream) { + const char *name; + GooString *buf; + int i; + + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + if (encoding) { + for (i = 0; i < 256; ++i) { + if (!(name = encoding[i])) { + name = ".notdef"; + } + buf = GooString::format("dup {0:d} /", i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, name, strlen(name)); + (*outputFunc)(outputStream, " put\n", 5); + } + } else { + for (i = 0; i < 256; ++i) { + buf = GooString::format("dup {0:d} /c{1:02x} put\n", i, i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + (*outputFunc)(outputStream, "readonly def\n", 13); +} + +void FoFiTrueType::cvtCharStrings(char **encoding, + int *codeToGID, + FoFiOutputFunc outputFunc, + void *outputStream) { + char *name; + GooString *buf; + char buf2[16]; + int i, k; + + // always define '.notdef' + (*outputFunc)(outputStream, "/CharStrings 256 dict dup begin\n", 32); + (*outputFunc)(outputStream, "/.notdef 0 def\n", 15); + + // if there's no 'cmap' table, punt + if (nCmaps == 0) { + goto err; + } + + // map char name to glyph index: + // 1. use encoding to map name to char code + // 2. use codeToGID to map char code to glyph index + // N.B. We do this in reverse order because font subsets can have + // weird encodings that use the same character name twice, and + // the first definition is probably the one we want. + k = 0; // make gcc happy + for (i = 255; i >= 0; --i) { + if (encoding) { + name = encoding[i]; + } else { + sprintf(buf2, "c%02x", i); + name = buf2; + } + if (name && strcmp(name, ".notdef")) { + k = codeToGID[i]; + // note: Distiller (maybe Adobe's PS interpreter in general) + // doesn't like TrueType fonts that have CharStrings entries + // which point to nonexistent glyphs, hence the (k < nGlyphs) + // test + if (k > 0 && k < nGlyphs) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, name, strlen(name)); + buf = GooString::format(" {0:d} def\n", k); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + } + + err: + (*outputFunc)(outputStream, "end readonly def\n", 17); +} + +void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc, + void *outputStream, GooString *name, + GBool needVerticalMetrics, + int *maxUsedGlyph) { + Guchar headData[54]; + TrueTypeLoca *locaTable; + Guchar *locaData; + TrueTypeTable newTables[nT42Tables]; + Guchar tableDir[12 + nT42Tables*16]; + GBool ok; + Guint checksum; + int nNewTables; + int glyfTableLen, length, pos, glyfPos, i, j, k; + Guchar vheaTab[36] = { + 0, 1, 0, 0, // table version number + 0, 0, // ascent + 0, 0, // descent + 0, 0, // reserved + 0, 0, // max advance height + 0, 0, // min top side bearing + 0, 0, // min bottom side bearing + 0, 0, // y max extent + 0, 0, // caret slope rise + 0, 1, // caret slope run + 0, 0, // caret offset + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // metric data format + 0, 1 // number of advance heights in vmtx table + }; + Guchar *vmtxTab; + GBool needVhea, needVmtx; + int advance; + + // construct the 'head' table, zero out the font checksum + i = seekTable("head"); + if (i < 0 || i >= nTables) { + return; + } + pos = tables[i].offset; + if (!checkRegion(pos, 54)) { + return; + } + memcpy(headData, file + pos, 54); + headData[8] = headData[9] = headData[10] = headData[11] = (Guchar)0; + + // check for a bogus loca format field in the 'head' table + // (I've encountered fonts with loca format set to 0x0100 instead of 0x0001) + if (locaFmt != 0 && locaFmt != 1) { + headData[50] = 0; + headData[51] = 1; + } + + // read the original 'loca' table, pad entries out to 4 bytes, and + // sort it into proper order -- some (non-compliant) fonts have + // out-of-order loca tables; in order to correctly handle the case + // where (compliant) fonts have empty entries in the middle of the + // table, cmpTrueTypeLocaOffset uses offset as its primary sort key, + // and idx as its secondary key (ensuring that adjacent entries with + // the same pos value remain in the same order) + locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca)); + i = seekTable("loca"); + pos = tables[i].offset; + i = seekTable("glyf"); + glyfTableLen = tables[i].len; + ok = gTrue; + for (i = 0; i <= nGlyphs; ++i) { + locaTable[i].idx = i; + if (locaFmt) { + locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok); + } else { + locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok); + } + if (locaTable[i].origOffset > glyfTableLen) { + locaTable[i].origOffset = glyfTableLen; + } + } + std::sort(locaTable, locaTable + nGlyphs + 1, + cmpTrueTypeLocaOffsetFunctor()); + for (i = 0; i < nGlyphs; ++i) { + locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset; + } + locaTable[nGlyphs].len = 0; + std::sort(locaTable, locaTable + nGlyphs + 1, cmpTrueTypeLocaIdxFunctor()); + pos = 0; + *maxUsedGlyph = -1; + for (i = 0; i <= nGlyphs; ++i) { + locaTable[i].newOffset = pos; + pos += locaTable[i].len; + if (pos & 3) { + pos += 4 - (pos & 3); + } + if (locaTable[i].len > 0) { + *maxUsedGlyph = i; + } + } + + // construct the new 'loca' table + locaData = (Guchar *)gmallocn(nGlyphs + 1, (locaFmt ? 4 : 2)); + for (i = 0; i <= nGlyphs; ++i) { + pos = locaTable[i].newOffset; + if (locaFmt) { + locaData[4*i ] = (Guchar)(pos >> 24); + locaData[4*i+1] = (Guchar)(pos >> 16); + locaData[4*i+2] = (Guchar)(pos >> 8); + locaData[4*i+3] = (Guchar) pos; + } else { + locaData[2*i ] = (Guchar)(pos >> 9); + locaData[2*i+1] = (Guchar)(pos >> 1); + } + } + + // count the number of tables + nNewTables = 0; + for (i = 0; i < nT42Tables; ++i) { + if (t42Tables[i].required || + seekTable(t42Tables[i].tag) >= 0) { + ++nNewTables; + } + } + vmtxTab = NULL; // make gcc happy + advance = 0; // make gcc happy + if (needVerticalMetrics) { + needVhea = seekTable("vhea") < 0; + needVmtx = seekTable("vmtx") < 0; + if (needVhea || needVmtx) { + i = seekTable("head"); + advance = getU16BE(tables[i].offset + 18, &ok); // units per em + if (needVhea) { + ++nNewTables; + } + if (needVmtx) { + ++nNewTables; + } + } + } + + // construct the new table headers, including table checksums + // (pad each table out to a multiple of 4 bytes) + pos = 12 + nNewTables*16; + k = 0; + for (i = 0; i < nT42Tables; ++i) { + length = -1; + checksum = 0; // make gcc happy + if (i == t42HeadTable) { + length = 54; + checksum = computeTableChecksum(headData, 54); + } else if (i == t42LocaTable) { + length = (nGlyphs + 1) * (locaFmt ? 4 : 2); + checksum = computeTableChecksum(locaData, length); + } else if (i == t42GlyfTable) { + length = 0; + checksum = 0; + glyfPos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + length += locaTable[j].len; + if (length & 3) { + length += 4 - (length & 3); + } + if (checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) { + checksum += + computeTableChecksum(file + glyfPos + locaTable[j].origOffset, + locaTable[j].len); + } + } + } else { + if ((j = seekTable(t42Tables[i].tag)) >= 0) { + length = tables[j].len; + if (checkRegion(tables[j].offset, length)) { + checksum = computeTableChecksum(file + tables[j].offset, length); + } + } else if (needVerticalMetrics && i == t42VheaTable) { + vheaTab[10] = advance / 256; // max advance height + vheaTab[11] = advance % 256; + length = sizeof(vheaTab); + checksum = computeTableChecksum(vheaTab, length); + } else if (needVerticalMetrics && i == t42VmtxTable) { + length = 4 + (nGlyphs - 1) * 2; + vmtxTab = (Guchar *)gmalloc(length); + vmtxTab[0] = advance / 256; + vmtxTab[1] = advance % 256; + for (j = 2; j < length; j += 2) { + vmtxTab[j] = 0; + vmtxTab[j+1] = 0; + } + checksum = computeTableChecksum(vmtxTab, length); + } else if (t42Tables[i].required) { + //~ error(-1, "Embedded TrueType font is missing a required table ('%s')", + //~ t42Tables[i].tag); + length = 0; + checksum = 0; + } + } + if (length >= 0) { + newTables[k].tag = ((t42Tables[i].tag[0] & 0xff) << 24) | + ((t42Tables[i].tag[1] & 0xff) << 16) | + ((t42Tables[i].tag[2] & 0xff) << 8) | + (t42Tables[i].tag[3] & 0xff); + newTables[k].checksum = checksum; + newTables[k].offset = pos; + newTables[k].len = length; + pos += length; + if (pos & 3) { + pos += 4 - (length & 3); + } + ++k; + } + } + + // construct the table directory + tableDir[0] = 0x00; // sfnt version + tableDir[1] = 0x01; + tableDir[2] = 0x00; + tableDir[3] = 0x00; + tableDir[4] = 0; // numTables + tableDir[5] = nNewTables; + tableDir[6] = 0; // searchRange + tableDir[7] = (Guchar)128; + tableDir[8] = 0; // entrySelector + tableDir[9] = 3; + tableDir[10] = 0; // rangeShift + tableDir[11] = (Guchar)(16 * nNewTables - 128); + pos = 12; + for (i = 0; i < nNewTables; ++i) { + tableDir[pos ] = (Guchar)(newTables[i].tag >> 24); + tableDir[pos+ 1] = (Guchar)(newTables[i].tag >> 16); + tableDir[pos+ 2] = (Guchar)(newTables[i].tag >> 8); + tableDir[pos+ 3] = (Guchar) newTables[i].tag; + tableDir[pos+ 4] = (Guchar)(newTables[i].checksum >> 24); + tableDir[pos+ 5] = (Guchar)(newTables[i].checksum >> 16); + tableDir[pos+ 6] = (Guchar)(newTables[i].checksum >> 8); + tableDir[pos+ 7] = (Guchar) newTables[i].checksum; + tableDir[pos+ 8] = (Guchar)(newTables[i].offset >> 24); + tableDir[pos+ 9] = (Guchar)(newTables[i].offset >> 16); + tableDir[pos+10] = (Guchar)(newTables[i].offset >> 8); + tableDir[pos+11] = (Guchar) newTables[i].offset; + tableDir[pos+12] = (Guchar)(newTables[i].len >> 24); + tableDir[pos+13] = (Guchar)(newTables[i].len >> 16); + tableDir[pos+14] = (Guchar)(newTables[i].len >> 8); + tableDir[pos+15] = (Guchar) newTables[i].len; + pos += 16; + } + + // compute the font checksum and store it in the head table + checksum = computeTableChecksum(tableDir, 12 + nNewTables*16); + for (i = 0; i < nNewTables; ++i) { + checksum += newTables[i].checksum; + } + checksum = 0xb1b0afba - checksum; // because the TrueType spec says so + headData[ 8] = (Guchar)(checksum >> 24); + headData[ 9] = (Guchar)(checksum >> 16); + headData[10] = (Guchar)(checksum >> 8); + headData[11] = (Guchar) checksum; + + // start the sfnts array + if (name) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, name->getCString(), name->getLength()); + (*outputFunc)(outputStream, " [\n", 3); + } else { + (*outputFunc)(outputStream, "/sfnts [\n", 9); + } + + // write the table directory + dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream); + + // write the tables + for (i = 0; i < nNewTables; ++i) { + if (i == t42HeadTable) { + dumpString(headData, 54, outputFunc, outputStream); + } else if (i == t42LocaTable) { + length = (nGlyphs + 1) * (locaFmt ? 4 : 2); + dumpString(locaData, length, outputFunc, outputStream); + } else if (i == t42GlyfTable) { + glyfPos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + if (locaTable[j].len > 0 && + checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) { + dumpString(file + glyfPos + locaTable[j].origOffset, + locaTable[j].len, outputFunc, outputStream); + } + } + } else { + // length == 0 means the table is missing and the error was + // already reported during the construction of the table + // headers + if ((length = newTables[i].len) > 0) { + if ((j = seekTable(t42Tables[i].tag)) >= 0 && + checkRegion(tables[j].offset, tables[j].len)) { + dumpString(file + tables[j].offset, tables[j].len, + outputFunc, outputStream); + } else if (needVerticalMetrics && i == t42VheaTable) { + dumpString(vheaTab, length, outputFunc, outputStream); + } else if (needVerticalMetrics && i == t42VmtxTable) { + dumpString(vmtxTab, length, outputFunc, outputStream); + } + } + } + } + + // end the sfnts array + (*outputFunc)(outputStream, "] def\n", 6); + + gfree(locaData); + gfree(locaTable); + if (vmtxTab) { + gfree(vmtxTab); + } +} + +void FoFiTrueType::dumpString(Guchar *s, int length, + FoFiOutputFunc outputFunc, + void *outputStream) { + GooString *buf; + int pad, i, j; + + (*outputFunc)(outputStream, "<", 1); + for (i = 0; i < length; i += 32) { + for (j = 0; j < 32 && i+j < length; ++j) { + buf = GooString::format("{0:02x}", s[i+j] & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (i % (65536 - 32) == 65536 - 64) { + (*outputFunc)(outputStream, ">\n<", 3); + } else if (i+32 < length) { + (*outputFunc)(outputStream, "\n", 1); + } + } + if (length & 3) { + pad = 4 - (length & 3); + for (i = 0; i < pad; ++i) { + (*outputFunc)(outputStream, "00", 2); + } + } + // add an extra zero byte because the Adobe Type 42 spec says so + (*outputFunc)(outputStream, "00>\n", 4); +} + +Guint FoFiTrueType::computeTableChecksum(Guchar *data, int length) { + Guint checksum, word; + int i; + + checksum = 0; + for (i = 0; i+3 < length; i += 4) { + word = ((data[i ] & 0xff) << 24) + + ((data[i+1] & 0xff) << 16) + + ((data[i+2] & 0xff) << 8) + + (data[i+3] & 0xff); + checksum += word; + } + if (length & 3) { + word = 0; + i = length & ~3; + switch (length & 3) { + case 3: + word |= (data[i+2] & 0xff) << 8; + case 2: + word |= (data[i+1] & 0xff) << 16; + case 1: + word |= (data[i ] & 0xff) << 24; + break; + } + checksum += word; + } + return checksum; +} + +void FoFiTrueType::parse() { + Guint topTag; + int pos, ver, i, j; + + parsedOk = gTrue; + + // look for a collection (TTC) + topTag = getU32BE(0, &parsedOk); + if (!parsedOk) { + return; + } + if (topTag == ttcfTag) { + /* TTC font */ + int dircount; + + dircount = getU32BE(8, &parsedOk); + if (!parsedOk) + return; + if (! dircount) { + parsedOk = gFalse; + return; + } + + if (faceIndex >= dircount) + faceIndex = 0; + pos = getU32BE(12 + faceIndex * 4, &parsedOk); + if (! parsedOk) + return; + } else { + pos = 0; + } + + // check the sfnt version + ver = getU32BE(pos, &parsedOk); + if (!parsedOk) { + return; + } + openTypeCFF = ver == 0x4f54544f; // 'OTTO' + + // read the table directory + nTables = getU16BE(pos + 4, &parsedOk); + if (!parsedOk) { + return; + } + tables = (TrueTypeTable *)gmallocn(nTables, sizeof(TrueTypeTable)); + pos += 12; + j = 0; + for (i = 0; i < nTables; ++i) { + tables[j].tag = getU32BE(pos, &parsedOk); + tables[j].checksum = getU32BE(pos + 4, &parsedOk); + tables[j].offset = (int)getU32BE(pos + 8, &parsedOk); + tables[j].len = (int)getU32BE(pos + 12, &parsedOk); + if (tables[j].offset + tables[j].len >= tables[j].offset && + tables[j].offset + tables[j].len <= len) { + // ignore any bogus entries in the table directory + ++j; + } + pos += 16; + } + if (nTables != j) { + nTables = j; + tables = (TrueTypeTable *)greallocn_checkoverflow(tables, nTables, sizeof(TrueTypeTable)); + } + if (!parsedOk || tables == NULL) { + return; + } + + // check for tables that are required by both the TrueType spec and + // the Type 42 spec + if (seekTable("head") < 0 || + seekTable("hhea") < 0 || + seekTable("maxp") < 0 || + seekTable("hmtx") < 0 || + (!openTypeCFF && seekTable("loca") < 0) || + (!openTypeCFF && seekTable("glyf") < 0) || + (openTypeCFF && seekTable("CFF ") < 0)) { + parsedOk = gFalse; + return; + } + + // read the cmaps + if ((i = seekTable("cmap")) >= 0) { + pos = tables[i].offset + 2; + nCmaps = getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + return; + } + cmaps = (TrueTypeCmap *)gmallocn(nCmaps, sizeof(TrueTypeCmap)); + for (j = 0; j < nCmaps; ++j) { + cmaps[j].platform = getU16BE(pos, &parsedOk); + cmaps[j].encoding = getU16BE(pos + 2, &parsedOk); + cmaps[j].offset = tables[i].offset + getU32BE(pos + 4, &parsedOk); + pos += 8; + cmaps[j].fmt = getU16BE(cmaps[j].offset, &parsedOk); + cmaps[j].len = getU16BE(cmaps[j].offset + 2, &parsedOk); + } + if (!parsedOk) { + return; + } + } else { + nCmaps = 0; + } + + // get the number of glyphs from the maxp table + i = seekTable("maxp"); + nGlyphs = getU16BE(tables[i].offset + 4, &parsedOk); + if (!parsedOk) { + return; + } + + // get the bbox and loca table format from the head table + i = seekTable("head"); + bbox[0] = getS16BE(tables[i].offset + 36, &parsedOk); + bbox[1] = getS16BE(tables[i].offset + 38, &parsedOk); + bbox[2] = getS16BE(tables[i].offset + 40, &parsedOk); + bbox[3] = getS16BE(tables[i].offset + 42, &parsedOk); + locaFmt = getS16BE(tables[i].offset + 50, &parsedOk); + if (!parsedOk) { + return; + } + + // make sure the loca table is sane (correct length and entries are + // in bounds) + if (!openTypeCFF) { + i = seekTable("loca"); + if (tables[i].len < 0) { + parsedOk = gFalse; + return; + } + if (tables[i].len < (nGlyphs + 1) * (locaFmt ? 4 : 2)) { + nGlyphs = tables[i].len / (locaFmt ? 4 : 2) - 1; + } + for (j = 0; j <= nGlyphs; ++j) { + if (locaFmt) { + pos = (int)getU32BE(tables[i].offset + j*4, &parsedOk); + } else { + pos = getU16BE(tables[i].offset + j*2, &parsedOk); + } + if (pos < 0 || pos > len) { + parsedOk = gFalse; + } + } + if (!parsedOk) { + return; + } + } + + // read the post table + readPostTable(); +} + +void FoFiTrueType::readPostTable() { + GooString *name; + int tablePos, postFmt, stringIdx, stringPos; + GBool ok; + int i, j, n, m; + + ok = gTrue; + if ((i = seekTable("post")) < 0) { + return; + } + tablePos = tables[i].offset; + postFmt = getU32BE(tablePos, &ok); + if (!ok) { + goto err; + } + if (postFmt == 0x00010000) { + nameToGID = new GooHash(gTrue); + for (i = 0; i < 258; ++i) { + nameToGID->add(new GooString(macGlyphNames[i]), i); + } + } else if (postFmt == 0x00020000) { + nameToGID = new GooHash(gTrue); + n = getU16BE(tablePos + 32, &ok); + if (!ok) { + goto err; + } + if (n > nGlyphs) { + n = nGlyphs; + } + stringIdx = 0; + stringPos = tablePos + 34 + 2*n; + for (i = 0; i < n; ++i) { + j = getU16BE(tablePos + 34 + 2*i, &ok); + if (j < 258) { + nameToGID->removeInt(macGlyphNames[j]); + nameToGID->add(new GooString(macGlyphNames[j]), i); + } else { + j -= 258; + if (j != stringIdx) { + for (stringIdx = 0, stringPos = tablePos + 34 + 2*n; + stringIdx < j; + ++stringIdx, stringPos += 1 + getU8(stringPos, &ok)) ; + if (!ok) { + goto err; + } + } + m = getU8(stringPos, &ok); + if (!ok || !checkRegion(stringPos + 1, m)) { + goto err; + } + name = new GooString((char *)&file[stringPos + 1], m); + nameToGID->removeInt(name); + nameToGID->add(name, i); + ++stringIdx; + stringPos += 1 + m; + } + } + } else if (postFmt == 0x00028000) { + nameToGID = new GooHash(gTrue); + for (i = 0; i < nGlyphs; ++i) { + j = getU8(tablePos + 32 + i, &ok); + if (!ok) { + goto err; + } + if (j < 258) { + nameToGID->removeInt(macGlyphNames[j]); + nameToGID->add(new GooString(macGlyphNames[j]), i); + } + } + } + + return; + + err: + if (nameToGID) { + delete nameToGID; + nameToGID = NULL; + } +} + +int FoFiTrueType::seekTable(const char *tag) { + Guint tagI; + int i; + + tagI = ((tag[0] & 0xff) << 24) | + ((tag[1] & 0xff) << 16) | + ((tag[2] & 0xff) << 8) | + (tag[3] & 0xff); + for (i = 0; i < nTables; ++i) { + if (tables[i].tag == tagI) { + return i; + } + } + return -1; +} + +Guint FoFiTrueType::charToTag(const char *tagName) +{ + int n = strlen(tagName); + Guint tag = 0; + int i; + + if (n > 4) n = 4; + for (i = 0;i < n;i++) { + tag <<= 8; + tag |= tagName[i] & 0xff; + } + for (;i < 4;i++) { + tag <<= 8; + tag |= ' '; + } + return tag; +} + +/* + setup GSUB table data + Only supporting vertical text substitution. +*/ +int FoFiTrueType::setupGSUB(const char *scriptName) +{ + return setupGSUB(scriptName, NULL); +} + +/* + setup GSUB table data + Only supporting vertical text substitution. +*/ +int FoFiTrueType::setupGSUB(const char *scriptName, + const char *languageName) +{ + Guint gsubTable; + unsigned int i; + Guint scriptList, featureList; + Guint scriptCount; + Guint tag; + Guint scriptTable = 0; + Guint langSys; + Guint featureCount; + Guint featureIndex; + Guint ftable = 0; + Guint llist; + Guint scriptTag; + int x; + Guint pos; + + if (scriptName == 0) { + gsubFeatureTable = 0; + return 0; + } + scriptTag = charToTag(scriptName); + /* read GSUB Header */ + if ((x = seekTable("GSUB")) < 0) { + return 0; /* GSUB table not found */ + } + gsubTable = tables[x].offset; + pos = gsubTable+4; + scriptList = getU16BE(pos,&parsedOk); + pos += 2; + featureList = getU16BE(pos,&parsedOk); + pos += 2; + llist = getU16BE(pos,&parsedOk); + + gsubLookupList = llist+gsubTable; /* change to offset from top of file */ + /* read script list table */ + pos = gsubTable+scriptList; + scriptCount = getU16BE(pos,&parsedOk); + pos += 2; + /* find script */ + for (i = 0;i < scriptCount;i++) { + tag = getU32BE(pos,&parsedOk); + pos += 4; + scriptTable = getU16BE(pos,&parsedOk); + pos += 2; + if (tag == scriptTag) { + /* found */ + break; + } + } + if (i >= scriptCount) { + /* not found */ + return 0; + } + + /* read script table */ + /* use default language system */ + pos = gsubTable+scriptList+scriptTable; + langSys = 0; + if (languageName) { + Guint langTag = charToTag(languageName); + Guint langCount = getU16BE(pos+2,&parsedOk); + for (i = 0;i < langCount && langSys == 0;i++) { + tag = getU32BE(pos+4+i*(4+2),&parsedOk); + if (tag == langTag) { + langSys = getU16BE(pos+4+i*(4+2)+4,&parsedOk); + } + } + } + if (langSys == 0) { + /* default language system */ + langSys = getU16BE(pos,&parsedOk); + } + + /* read LangSys table */ + if (langSys == 0) { + /* no default LangSys */ + return 0; + } + + pos = gsubTable+scriptList+scriptTable+langSys+2; + featureIndex = getU16BE(pos,&parsedOk); /* ReqFeatureIndex */ + pos += 2; + + if (featureIndex != 0xffff) { + Guint tpos; + /* read feature record */ + tpos = gsubTable+featureList; + featureCount = getU16BE(tpos,&parsedOk); + tpos = gsubTable+featureList+2+featureIndex*(4+2); + tag = getU32BE(tpos,&parsedOk); + tpos += 4; + if (tag == vrt2Tag) { + /* vrt2 is preferred, overwrite vert */ + ftable = getU16BE(tpos,&parsedOk); + /* convert to offset from file top */ + gsubFeatureTable = ftable+gsubTable+featureList; + return 0; + } else if (tag == vertTag) { + ftable = getU16BE(tpos,&parsedOk); + } + } + featureCount = getU16BE(pos,&parsedOk); + pos += 2; + /* find 'vrt2' or 'vert' feature */ + for (i = 0;i < featureCount;i++) { + Guint oldPos; + + featureIndex = getU16BE(pos,&parsedOk); + pos += 2; + oldPos = pos; /* save position */ + /* read feature record */ + pos = gsubTable+featureList+2+featureIndex*(4+2); + tag = getU32BE(pos,&parsedOk); + pos += 4; + if (tag == vrt2Tag) { + /* vrt2 is preferred, overwrite vert */ + ftable = getU16BE(pos,&parsedOk); + break; + } else if (ftable == 0 && tag == vertTag) { + ftable = getU16BE(pos,&parsedOk); + } + pos = oldPos; /* restore old position */ + } + if (ftable == 0) { + /* vert nor vrt2 are not found */ + return 0; + } + /* convert to offset from file top */ + gsubFeatureTable = ftable+gsubTable+featureList; + return 0; +} + +Guint FoFiTrueType::doMapToVertGID(Guint orgGID) +{ + Guint lookupCount; + Guint lookupListIndex; + Guint i; + Guint gid = 0; + Guint pos; + + pos = gsubFeatureTable+2; + lookupCount = getU16BE(pos,&parsedOk); + pos += 2; + for (i = 0;i < lookupCount;i++) { + lookupListIndex = getU16BE(pos,&parsedOk); + pos += 2; + if ((gid = scanLookupList(lookupListIndex,orgGID)) != 0) { + break; + } + } + return gid; +} + +Guint FoFiTrueType::mapToVertGID(Guint orgGID) +{ + Guint mapped; + + if (gsubFeatureTable == 0) return orgGID; + if ((mapped = doMapToVertGID(orgGID)) != 0) { + return mapped; + } + return orgGID; +} + +Guint FoFiTrueType::scanLookupList(Guint listIndex, Guint orgGID) +{ + Guint lookupTable; + Guint subTableCount; + Guint subTable; + Guint i; + Guint gid = 0; + Guint pos; + + if (gsubLookupList == 0) return 0; /* no lookup list */ + pos = gsubLookupList+2+listIndex*2; + lookupTable = getU16BE(pos,&parsedOk); + /* read lookup table */ + pos = gsubLookupList+lookupTable+4; + subTableCount = getU16BE(pos,&parsedOk); + pos += 2;; + for (i = 0;i < subTableCount;i++) { + subTable = getU16BE(pos,&parsedOk); + pos += 2; + if ((gid = scanLookupSubTable(gsubLookupList+lookupTable+subTable,orgGID)) + != 0) break; + } + return gid; +} + +Guint FoFiTrueType::scanLookupSubTable(Guint subTable, Guint orgGID) +{ + Guint format; + Guint coverage; + int delta; + int glyphCount; + Guint substitute; + Guint gid = 0; + int coverageIndex; + int pos; + + pos = subTable; + format = getU16BE(pos,&parsedOk); + pos += 2; + coverage = getU16BE(pos,&parsedOk); + pos += 2; + if ((coverageIndex = + checkGIDInCoverage(subTable+coverage,orgGID)) >= 0) { + switch (format) { + case 1: + /* format 1 */ + delta = getS16BE(pos,&parsedOk); + pos += 2; + gid = orgGID+delta; + break; + case 2: + /* format 2 */ + glyphCount = getS16BE(pos,&parsedOk); + pos += 2; + if (glyphCount > coverageIndex) { + pos += coverageIndex*2; + substitute = getU16BE(pos,&parsedOk); + gid = substitute; + } + break; + default: + /* unknown format */ + break; + } + } + return gid; +} + +int FoFiTrueType::checkGIDInCoverage(Guint coverage, Guint orgGID) +{ + int index = -1; + Guint format; + Guint count; + Guint i; + Guint pos; + + pos = coverage; + format = getU16BE(pos,&parsedOk); + pos += 2; + switch (format) { + case 1: + count = getU16BE(pos,&parsedOk); + pos += 2; + // In some poor CJK fonts, key GIDs are not sorted, + // thus we cannot finish checking even when the range + // including orgGID seems to have already passed. + for (i = 0;i < count;i++) { + Guint gid; + + gid = getU16BE(pos,&parsedOk); + pos += 2; + if (gid == orgGID) { + /* found */ + index = i; + break; + } + } + break; + case 2: + count = getU16BE(pos,&parsedOk); + pos += 2; + for (i = 0;i < count;i++) { + Guint startGID, endGID; + Guint startIndex; + + startGID = getU16BE(pos,&parsedOk); + pos += 2; + endGID = getU16BE(pos,&parsedOk); + pos += 2; + startIndex = getU16BE(pos,&parsedOk); + pos += 2; + // In some poor CJK fonts, key GIDs are not sorted, + // thus we cannot finish checking even when the range + // including orgGID seems to have already passed. + if (startGID <= orgGID && orgGID <= endGID) { + /* found */ + index = startIndex+orgGID-startGID; + break; + } + } + break; + default: + break; + } + return index; +} + diff --git a/fofi/FoFiTrueType.h b/fofi/FoFiTrueType.h new file mode 100644 index 0000000..fb05ae9 --- /dev/null +++ b/fofi/FoFiTrueType.h @@ -0,0 +1,218 @@ +//======================================================================== +// +// FoFiTrueType.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de> +// Copyright (C) 2007 Koji Otani <sho@bbr.jp> +// Copyright (C) 2011 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp> +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef FOFITRUETYPE_H +#define FOFITRUETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "stddef.h" +#include "goo/gtypes.h" +#include "FoFiBase.h" + +class GooString; +class GooHash; +struct TrueTypeTable; +struct TrueTypeCmap; + +//------------------------------------------------------------------------ +// FoFiTrueType +//------------------------------------------------------------------------ + +class FoFiTrueType: public FoFiBase { +public: + + // Create a FoFiTrueType object from a memory buffer. + static FoFiTrueType *make(char *fileA, int lenA, int faceIndexA=0); + + // Create a FoFiTrueType object from a file on disk. + static FoFiTrueType *load(char *fileName, int faceIndexA=0); + + virtual ~FoFiTrueType(); + + // Returns true if this an OpenType font containing CFF data, false + // if it's a TrueType font (or OpenType font with TrueType data). + GBool isOpenTypeCFF() { return openTypeCFF; } + + // Return the number of cmaps defined by this font. + int getNumCmaps(); + + // Return the platform ID of the <i>th cmap. + int getCmapPlatform(int i); + + // Return the encoding ID of the <i>th cmap. + int getCmapEncoding(int i); + + // Return the index of the cmap for <platform>, <encoding>. Returns + // -1 if there is no corresponding cmap. + int findCmap(int platform, int encoding); + + // Return the GID corresponding to <c> according to the <i>th cmap. + int mapCodeToGID(int i, Guint c); + + // map gid to vertical glyph gid if exist. + // if not exist return original gid + Guint mapToVertGID(Guint orgGID); + + // Returns the GID corresponding to <name> according to the post + // table. Returns 0 if there is no mapping for <name> or if the + // font does not have a post table. + int mapNameToGID(char *name); + + // Return the mapping from CIDs to GIDs, and return the number of + // CIDs in *<nCIDs>. This is only useful for CID fonts. (Only + // useful for OpenType CFF fonts.) + int *getCIDToGIDMap(int *nCIDs); + + // Returns the least restrictive embedding licensing right (as + // defined by the TrueType spec): + // * 4: OS/2 table is missing or invalid + // * 3: installable embedding + // * 2: editable embedding + // * 1: preview & print embedding + // * 0: restricted license embedding + int getEmbeddingRights(); + + // Return the font matrix as an array of six numbers. (Only useful + // for OpenType CFF fonts.) + void getFontMatrix(double *mat); + + // Convert to a Type 42 font, suitable for embedding in a PostScript + // file. <psName> will be used as the PostScript font name (so we + // don't need to depend on the 'name' table in the font). The + // <encoding> array specifies the mapping from char codes to names. + // If <encoding> is NULL, the encoding is unknown or undefined. The + // <codeToGID> array specifies the mapping from char codes to GIDs. + // (Not useful for OpenType CFF fonts.) + void convertToType42(char *psName, char **encoding, + int *codeToGID, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 1 font, suitable for embedding in a PostScript + // file. This is only useful with 8-bit fonts. If <newEncoding> is + // not NULL, it will be used in place of the encoding in the Type 1C + // font. If <ascii> is true the eexec section will be hex-encoded, + // otherwise it will be left as binary data. If <psName> is + // non-NULL, it will be used as the PostScript font name. (Only + // useful for OpenType CFF fonts.) + void convertToType1(char *psName, const char **newEncoding, GBool ascii, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 2 CIDFont, suitable for embedding in a + // PostScript file. <psName> will be used as the PostScript font + // name (so we don't need to depend on the 'name' table in the + // font). The <cidMap> array maps CIDs to GIDs; it has <nCIDs> + // entries. (Not useful for OpenType CFF fonts.) + void convertToCIDType2(char *psName, int *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 CIDFont, suitable for embedding in a + // PostScript file. <psName> will be used as the PostScript font + // name. (Only useful for OpenType CFF fonts.) + void convertToCIDType0(char *psName, int *cidMap, int nCIDs, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. <psName> will be used as the + // PostScript font name (so we don't need to depend on the 'name' + // table in the font). The <cidMap> array maps CIDs to GIDs; it has + // <nCIDs> entries. (Not useful for OpenType CFF fonts.) + void convertToType0(char *psName, int *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. <psName> will be used as the + // PostScript font name. (Only useful for OpenType CFF fonts.) + void convertToType0(char *psName, int *cidMap, int nCIDs, + FoFiOutputFunc outputFunc, void *outputStream); + + // Write a clean TTF file, filling in missing tables and correcting + // various other errors. If <name> is non-NULL, the font is renamed + // to <name>. If <codeToGID> is non-NULL, the font is re-encoded, + // using a Windows Unicode cmap. If <name> is NULL and the font is + // complete and correct, it will be written unmodified. (Not useful + // for OpenType CFF fonts.) + void writeTTF(FoFiOutputFunc outputFunc, void *outputStream, + char *name = NULL, int *codeToGID = NULL); + + // Returns a pointer to the CFF font embedded in this OpenType font. + // If successful, sets *<start> and *<length>, and returns true. + // Otherwise returns false. (Only useful for OpenType CFF fonts). + GBool getCFFBlock(char **start, int *length); + + // setup vert/vrt2 GSUB for default lang + int setupGSUB(const char *scriptName); + + // setup vert/vrt2 GSUB for specified lang + int setupGSUB(const char *scriptName, const char* languageName); + +private: + + FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA); + void cvtEncoding(char **encoding, + FoFiOutputFunc outputFunc, + void *outputStream); + void cvtCharStrings(char **encoding, + int *codeToGID, + FoFiOutputFunc outputFunc, + void *outputStream); + void cvtSfnts(FoFiOutputFunc outputFunc, + void *outputStream, GooString *name, + GBool needVerticalMetrics, + int *maxUsedGlyph); + void dumpString(Guchar *s, int length, + FoFiOutputFunc outputFunc, + void *outputStream); + Guint computeTableChecksum(Guchar *data, int length); + void parse(); + void readPostTable(); + int seekTable(const char *tag); + Guint charToTag(const char *tagName); + Guint doMapToVertGID(Guint orgGID); + Guint scanLookupList(Guint listIndex, Guint orgGID); + Guint scanLookupSubTable(Guint subTable, Guint orgGID); + int checkGIDInCoverage(Guint coverage, Guint orgGID); + + TrueTypeTable *tables; + int nTables; + TrueTypeCmap *cmaps; + int nCmaps; + int nGlyphs; + int locaFmt; + int bbox[4]; + GooHash *nameToGID; + GBool openTypeCFF; + + GBool parsedOk; + int faceIndex; + Guint gsubFeatureTable; + Guint gsubLookupList; +}; + +#endif diff --git a/fofi/FoFiType1.cc b/fofi/FoFiType1.cc new file mode 100644 index 0000000..8fa10a0 --- /dev/null +++ b/fofi/FoFiType1.cc @@ -0,0 +1,358 @@ +//======================================================================== +// +// FoFiType1.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2008, 2010 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com> +// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net> +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include <config.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdlib.h> +#include <string.h> +#include "goo/gmem.h" +#include "goo/GooLikely.h" +#include "FoFiEncodings.h" +#include "FoFiType1.h" +#include "poppler/Error.h" + +//------------------------------------------------------------------------ +// FoFiType1 +//------------------------------------------------------------------------ + +FoFiType1 *FoFiType1::make(char *fileA, int lenA) { + return new FoFiType1(fileA, lenA, gFalse); +} + +FoFiType1 *FoFiType1::load(char *fileName) { + char *fileA; + int lenA; + + if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { + return NULL; + } + return new FoFiType1(fileA, lenA, gTrue); +} + +FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA): + FoFiBase(fileA, lenA, freeFileDataA) +{ + name = NULL; + encoding = NULL; + fontMatrix[0] = 0.001; + fontMatrix[1] = 0; + fontMatrix[2] = 0; + fontMatrix[3] = 0.001; + fontMatrix[4] = 0; + fontMatrix[5] = 0; + parsed = gFalse; + undoPFB(); +} + +FoFiType1::~FoFiType1() { + int i; + + if (name) { + gfree(name); + } + if (encoding && encoding != fofiType1StandardEncoding) { + for (i = 0; i < 256; ++i) { + gfree(encoding[i]); + } + gfree(encoding); + } +} + +char *FoFiType1::getName() { + if (!parsed) { + parse(); + } + return name; +} + +char **FoFiType1::getEncoding() { + if (!parsed) { + parse(); + } + return encoding; +} + +void FoFiType1::getFontMatrix(double *mat) { + int i; + + if (!parsed) { + parse(); + } + for (i = 0; i < 6; ++i) { + mat[i] = fontMatrix[i]; + } +} + +void FoFiType1::writeEncoded(const char **newEncoding, + FoFiOutputFunc outputFunc, void *outputStream) { + char buf[512]; + char *line, *line2, *p; + int i; + + // copy everything up to the encoding + for (line = (char *)file; + line && strncmp(line, "/Encoding", 9); + line = getNextLine(line)) ; + if (!line) { + // no encoding - just copy the whole font file + (*outputFunc)(outputStream, (char *)file, len); + return; + } + (*outputFunc)(outputStream, (char *)file, line - (char *)file); + + // write the new encoding + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + (*outputFunc)(outputStream, + "0 1 255 {1 index exch /.notdef put} for\n", 40); + for (i = 0; i < 256; ++i) { + if (newEncoding[i]) { + sprintf(buf, "dup %d /%s put\n", i, newEncoding[i]); + (*outputFunc)(outputStream, buf, strlen(buf)); + } + } + (*outputFunc)(outputStream, "readonly def\n", 13); + + // find the end of the encoding data + //~ this ought to parse PostScript tokens + if (!strncmp(line, "/Encoding StandardEncoding def", 30)) { + line = getNextLine(line); + } else { + // skip "/Encoding" + one whitespace char, + // then look for 'def' preceded by PostScript whitespace + p = line + 10; + line = NULL; + for (; p < (char *)file + len; ++p) { + if ((*p == ' ' || *p == '\t' || *p == '\x0a' || + *p == '\x0d' || *p == '\x0c' || *p == '\0') && + p + 4 <= (char *)file + len && + !strncmp(p + 1, "def", 3)) { + line = p + 4; + break; + } + } + } + + // some fonts have two /Encoding entries in their dictionary, so we + // check for a second one here + if (line) { + for (line2 = line, i = 0; + i < 20 && line2 && strncmp(line2, "/Encoding", 9); + line2 = getNextLine(line2), ++i) ; + if (i < 20 && line2) { + (*outputFunc)(outputStream, line, line2 - line); + if (!strncmp(line2, "/Encoding StandardEncoding def", 30)) { + line = getNextLine(line2); + } else { + // skip "/Encoding" + one whitespace char, + // then look for 'def' preceded by PostScript whitespace + p = line2 + 10; + line = NULL; + for (; p < (char *)file + len; ++p) { + if ((*p == ' ' || *p == '\t' || *p == '\x0a' || + *p == '\x0d' || *p == '\x0c' || *p == '\0') && + p + 4 <= (char *)file + len && + !strncmp(p + 1, "def", 3)) { + line = p + 4; + break; + } + } + } + } + + // copy everything after the encoding + if (line) { + (*outputFunc)(outputStream, line, ((char *)file + len) - line); + } + } +} + +char *FoFiType1::getNextLine(char *line) { + while (line < (char *)file + len && *line != '\x0a' && *line != '\x0d') { + ++line; + } + if (line < (char *)file + len && *line == '\x0d') { + ++line; + } + if (line < (char *)file + len && *line == '\x0a') { + ++line; + } + if (line >= (char *)file + len) { + return NULL; + } + return line; +} + +void FoFiType1::parse() { + char *line, *line1, *p, *p2; + char buf[256]; + char c; + int n, code, base, i, j; + char *tokptr; + GBool gotMatrix; + + gotMatrix = gFalse; + for (i = 1, line = (char *)file; + i <= 100 && line && (!name || !encoding); + ++i) { + + // get font name + if (!name && !strncmp(line, "/FontName", 9)) { + strncpy(buf, line, 255); + buf[255] = '\0'; + if ((p = strchr(buf+9, '/')) && + (p = strtok_r(p+1, " \t\n\r", &tokptr))) { + name = copyString(p); + } + line = getNextLine(line); + + // get encoding + } else if (!encoding && + !strncmp(line, "/Encoding StandardEncoding def", 30)) { + encoding = (char **)fofiType1StandardEncoding; + } else if (!encoding && + !strncmp(line, "/Encoding 256 array", 19)) { + encoding = (char **)gmallocn(256, sizeof(char *)); + for (j = 0; j < 256; ++j) { + encoding[j] = NULL; + } + for (j = 0, line = getNextLine(line); + j < 300 && line && (line1 = getNextLine(line)); + ++j, line = line1) { + if ((n = (int)(line1 - line)) > 255) { + error(errSyntaxWarning, -1, "FoFiType1::parse a line has more than 255 characters, we don't support this"); + n = 255; + } + strncpy(buf, line, n); + buf[n] = '\0'; + for (p = buf; *p == ' ' || *p == '\t'; ++p) ; + if (!strncmp(p, "dup", 3)) { + while (1) { + p += 3; + for (; *p == ' ' || *p == '\t'; ++p) ; + code = 0; + if (*p == '8' && p[1] == '#') { + base = 8; + p += 2; + } else if (*p >= '0' && *p <= '9') { + base = 10; + } else { + break; + } + for (; *p >= '0' && *p < '0' + base; ++p) { + code = code * base + (*p - '0'); + } + for (; *p == ' ' || *p == '\t'; ++p) ; + if (*p != '/') { + break; + } + ++p; + for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ; + if (code >= 0 && code < 256) { + c = *p2; + *p2 = '\0'; + encoding[code] = copyString(p); + *p2 = c; + } + for (p = p2; *p == ' ' || *p == '\t'; ++p) ; + if (strncmp(p, "put", 3)) { + break; + } + for (p += 3; *p == ' ' || *p == '\t'; ++p) ; + if (strncmp(p, "dup", 3)) { + break; + } + } + } else { + if (strtok_r(buf, " \t", &tokptr) && + (p = strtok_r(NULL, " \t\n\r", &tokptr)) && !strcmp(p, "def")) { + break; + } + } + } + //~ check for getinterval/putinterval junk + + } else if (!gotMatrix && !strncmp(line, "/FontMatrix", 11)) { + strncpy(buf, line + 11, 255); + buf[255] = '\0'; + if ((p = strchr(buf, '['))) { + ++p; + if ((p2 = strchr(p, ']'))) { + *p2 = '\0'; + for (j = 0; j < 6; ++j) { + if ((p = strtok(j == 0 ? p : (char *)NULL, " \t\n\r"))) { + fontMatrix[j] = atof(p); + } else { + break; + } + } + } + } + gotMatrix = gTrue; + + } else { + line = getNextLine(line); + } + } + + parsed = gTrue; +} + +// Undo the PFB encoding, i.e., remove the PFB headers. +void FoFiType1::undoPFB() { + GBool ok; + Guchar *file2; + int pos1, pos2, type; + Guint segLen; + + ok = gTrue; + if (getU8(0, &ok) != 0x80 || !ok) { + return; + } + file2 = (Guchar *)gmalloc(len); + pos1 = pos2 = 0; + while (getU8(pos1, &ok) == 0x80 && ok) { + type = getU8(pos1 + 1, &ok); + if (type < 1 || type > 2 || !ok) { + break; + } + segLen = getU32LE(pos1 + 2, &ok); + pos1 += 6; + if (!ok || !checkRegion(pos1, segLen)) { + break; + } + memcpy(file2 + pos2, file + pos1, segLen); + pos1 += segLen; + pos2 += segLen; + } + if (freeFileData) { + gfree(fileData); + } + file = fileData = file2; + freeFileData = gTrue; + len = pos2; +} diff --git a/fofi/FoFiType1.h b/fofi/FoFiType1.h new file mode 100644 index 0000000..f4e29b4 --- /dev/null +++ b/fofi/FoFiType1.h @@ -0,0 +1,62 @@ +//======================================================================== +// +// FoFiType1.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFITYPE1_H +#define FOFITYPE1_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "FoFiBase.h" + +//------------------------------------------------------------------------ +// FoFiType1 +//------------------------------------------------------------------------ + +class FoFiType1: public FoFiBase { +public: + + // Create a FoFiType1 object from a memory buffer. + static FoFiType1 *make(char *fileA, int lenA); + + // Create a FoFiType1 object from a file on disk. + static FoFiType1 *load(char *fileName); + + virtual ~FoFiType1(); + + // Return the font name. + char *getName(); + + // Return the encoding, as an array of 256 names (any of which may + // be NULL). + char **getEncoding(); + + // Return the font matrix as an array of six numbers. + void getFontMatrix(double *mat); + + // Write a version of the Type 1 font file with a new encoding. + void writeEncoded(const char **newEncoding, + FoFiOutputFunc outputFunc, void *outputStream); + +private: + + FoFiType1(char *fileA, int lenA, GBool freeFileDataA); + + char *getNextLine(char *line); + void parse(); + void undoPFB(); + + char *name; + char **encoding; + double fontMatrix[6]; + GBool parsed; +}; + +#endif diff --git a/fofi/FoFiType1C.cc b/fofi/FoFiType1C.cc new file mode 100644 index 0000000..c4595a3 --- /dev/null +++ b/fofi/FoFiType1C.cc @@ -0,0 +1,2745 @@ +//======================================================================== +// +// FoFiType1C.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include <config.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include "goo/gmem.h" +#include "goo/gstrtod.h" +#include "goo/GooString.h" +#include "FoFiEncodings.h" +#include "FoFiType1C.h" + +//------------------------------------------------------------------------ + +static char hexChars[17] = "0123456789ABCDEF"; + +//------------------------------------------------------------------------ +// FoFiType1C +//------------------------------------------------------------------------ + +FoFiType1C *FoFiType1C::make(char *fileA, int lenA) { + FoFiType1C *ff; + + ff = new FoFiType1C(fileA, lenA, gFalse); + if (!ff->parse()) { + delete ff; + return NULL; + } + return ff; +} + +FoFiType1C *FoFiType1C::load(char *fileName) { + FoFiType1C *ff; + char *fileA; + int lenA; + + if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { + return NULL; + } + ff = new FoFiType1C(fileA, lenA, gTrue); + if (!ff->parse()) { + delete ff; + return NULL; + } + return ff; +} + +FoFiType1C::FoFiType1C(char *fileA, int lenA, GBool freeFileDataA): + FoFiBase(fileA, lenA, freeFileDataA) +{ + name = NULL; + encoding = NULL; + privateDicts = NULL; + fdSelect = NULL; + charset = NULL; + charsetLength = 0; +} + +FoFiType1C::~FoFiType1C() { + int i; + + if (name) { + delete name; + } + if (encoding && + encoding != fofiType1StandardEncoding && + encoding != fofiType1ExpertEncoding) { + for (i = 0; i < 256; ++i) { + gfree(encoding[i]); + } + gfree(encoding); + } + if (privateDicts) { + gfree(privateDicts); + } + if (fdSelect) { + gfree(fdSelect); + } + if (charset && + charset != fofiType1CISOAdobeCharset && + charset != fofiType1CExpertCharset && + charset != fofiType1CExpertSubsetCharset) { + gfree(charset); + } +} + +char *FoFiType1C::getName() { + return name ? name->getCString() : (char *)NULL; +} + +char **FoFiType1C::getEncoding() { + return encoding; +} + +GooString *FoFiType1C::getGlyphName(int gid) { + char buf[256]; + GBool ok; + + ok = gTrue; + if (gid < 0 || gid >= charsetLength) + return NULL; + getString(charset[gid], buf, &ok); + if (!ok) { + return NULL; + } + return new GooString(buf); +} + +int *FoFiType1C::getCIDToGIDMap(int *nCIDs) { + int *map; + int n, i; + + // a CID font's top dict has ROS as the first operator + if (topDict.firstOp != 0x0c1e) { + *nCIDs = 0; + return NULL; + } + + // in a CID font, the charset data is the GID-to-CID mapping, so all + // we have to do is reverse it + n = 0; + for (i = 0; i < nGlyphs && i < charsetLength; ++i) { + if (charset[i] > n) { + n = charset[i]; + } + } + ++n; + map = (int *)gmallocn(n, sizeof(int)); + memset(map, 0, n * sizeof(int)); + for (i = 0; i < nGlyphs; ++i) { + map[charset[i]] = i; + } + *nCIDs = n; + return map; +} + +void FoFiType1C::getFontMatrix(double *mat) { + int i; + + if (topDict.firstOp == 0x0c1e && privateDicts[0].hasFontMatrix) { + if (topDict.hasFontMatrix) { + mat[0] = topDict.fontMatrix[0] * privateDicts[0].fontMatrix[0] + + topDict.fontMatrix[1] * privateDicts[0].fontMatrix[2]; + mat[1] = topDict.fontMatrix[0] * privateDicts[0].fontMatrix[1] + + topDict.fontMatrix[1] * privateDicts[0].fontMatrix[3]; + mat[2] = topDict.fontMatrix[2] * privateDicts[0].fontMatrix[0] + + topDict.fontMatrix[3] * privateDicts[0].fontMatrix[2]; + mat[3] = topDict.fontMatrix[2] * privateDicts[0].fontMatrix[1] + + topDict.fontMatrix[3] * privateDicts[0].fontMatrix[3]; + mat[4] = topDict.fontMatrix[4] * privateDicts[0].fontMatrix[0] + + topDict.fontMatrix[5] * privateDicts[0].fontMatrix[2]; + mat[5] = topDict.fontMatrix[4] * privateDicts[0].fontMatrix[1] + + topDict.fontMatrix[5] * privateDicts[0].fontMatrix[3]; + } else { + for (i = 0; i < 6; ++i) { + mat[i] = privateDicts[0].fontMatrix[i]; + } + } + } else { + for (i = 0; i < 6; ++i) { + mat[i] = topDict.fontMatrix[i]; + } + } +} + +void FoFiType1C::convertToType1(char *psName, const char **newEncoding, GBool ascii, + FoFiOutputFunc outputFunc, + void *outputStream) { + int psNameLen; + Type1CEexecBuf eb; + Type1CIndex subrIdx; + Type1CIndexVal val; + GooString *buf; + char buf2[256]; + const char **enc; + GBool ok; + int i; + + if (psName) { + psNameLen = strlen(psName); + } else { + psName = name->getCString(); + psNameLen = name->getLength(); + } + + // write header and font dictionary, up to encoding + ok = gTrue; + (*outputFunc)(outputStream, "%!FontType1-1.0: ", 17); + (*outputFunc)(outputStream, psName, psNameLen); + if (topDict.versionSID != 0) { + getString(topDict.versionSID, buf2, &ok); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + } + (*outputFunc)(outputStream, "\n", 1); + // the dictionary needs room for 12 entries: the following 9, plus + // Private and CharStrings (in the eexec section) and FID (which is + // added by definefont) + (*outputFunc)(outputStream, "12 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontInfo 10 dict dup begin\n", 28); + if (topDict.versionSID != 0) { + (*outputFunc)(outputStream, "/version ", 9); + writePSString(buf2, outputFunc, outputStream); + (*outputFunc)(outputStream, " readonly def\n", 14); + } + if (topDict.noticeSID != 0) { + getString(topDict.noticeSID, buf2, &ok); + (*outputFunc)(outputStream, "/Notice ", 8); + writePSString(buf2, outputFunc, outputStream); + (*outputFunc)(outputStream, " readonly def\n", 14); + } + if (topDict.copyrightSID != 0) { + getString(topDict.copyrightSID, buf2, &ok); + (*outputFunc)(outputStream, "/Copyright ", 11); + writePSString(buf2, outputFunc, outputStream); + (*outputFunc)(outputStream, " readonly def\n", 14); + } + if (topDict.fullNameSID != 0) { + getString(topDict.fullNameSID, buf2, &ok); + (*outputFunc)(outputStream, "/FullName ", 10); + writePSString(buf2, outputFunc, outputStream); + (*outputFunc)(outputStream, " readonly def\n", 14); + } + if (topDict.familyNameSID != 0) { + getString(topDict.familyNameSID, buf2, &ok); + (*outputFunc)(outputStream, "/FamilyName ", 12); + writePSString(buf2, outputFunc, outputStream); + (*outputFunc)(outputStream, " readonly def\n", 14); + } + if (topDict.weightSID != 0) { + getString(topDict.weightSID, buf2, &ok); + (*outputFunc)(outputStream, "/Weight ", 8); + writePSString(buf2, outputFunc, outputStream); + (*outputFunc)(outputStream, " readonly def\n", 14); + } + if (topDict.isFixedPitch) { + (*outputFunc)(outputStream, "/isFixedPitch true def\n", 23); + } else { + (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24); + } + buf = GooString::format("/ItalicAngle {0:.4g} def\n", topDict.italicAngle); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format("/UnderlinePosition {0:.4g} def\n", + topDict.underlinePosition); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format("/UnderlineThickness {0:.4g} def\n", + topDict.underlineThickness); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "end readonly def\n", 17); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, psNameLen); + (*outputFunc)(outputStream, " def\n", 5); + buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 1 def\n", 16); + buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] readonly def\n", + topDict.fontMatrix[0], topDict.fontMatrix[1], + topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] readonly def\n", + topDict.fontBBox[0], topDict.fontBBox[1], + topDict.fontBBox[2], topDict.fontBBox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (topDict.uniqueID != 0) { + buf = GooString::format("/UniqueID {0:d} def\n", topDict.uniqueID); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + + // write the encoding + (*outputFunc)(outputStream, "/Encoding ", 10); + if (!newEncoding && encoding == fofiType1StandardEncoding) { + (*outputFunc)(outputStream, "StandardEncoding def\n", 21); + } else { + (*outputFunc)(outputStream, "256 array\n", 10); + (*outputFunc)(outputStream, + "0 1 255 {1 index exch /.notdef put} for\n", 40); + enc = newEncoding ? newEncoding : (const char **)encoding; + for (i = 0; i < 256; ++i) { + if (enc[i]) { + buf = GooString::format("dup {0:d} /{1:s} put\n", i, enc[i]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + (*outputFunc)(outputStream, "readonly def\n", 13); + } + (*outputFunc)(outputStream, "currentdict end\n", 16); + + // start the binary section + (*outputFunc)(outputStream, "currentfile eexec\n", 18); + eb.outputFunc = outputFunc; + eb.outputStream = outputStream; + eb.ascii = ascii; + eb.r1 = 55665; + eb.line = 0; + + // write the private dictionary + eexecWrite(&eb, "\x83\xca\x73\xd5"); + eexecWrite(&eb, "dup /Private 32 dict dup begin\n"); + eexecWrite(&eb, "/RD {string currentfile exch readstring pop}" + " executeonly def\n"); + eexecWrite(&eb, "/ND {noaccess def} executeonly def\n"); + eexecWrite(&eb, "/NP {noaccess put} executeonly def\n"); + eexecWrite(&eb, "/MinFeature {16 16} def\n"); + eexecWrite(&eb, "/password 5839 def\n"); + if (privateDicts[0].nBlueValues) { + eexecWrite(&eb, "/BlueValues ["); + for (i = 0; i < privateDicts[0].nBlueValues; ++i) { + buf = GooString::format("{0:s}{1:d}", + i > 0 ? " " : "", privateDicts[0].blueValues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nOtherBlues) { + eexecWrite(&eb, "/OtherBlues ["); + for (i = 0; i < privateDicts[0].nOtherBlues; ++i) { + buf = GooString::format("{0:s}{1:d}", + i > 0 ? " " : "", privateDicts[0].otherBlues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nFamilyBlues) { + eexecWrite(&eb, "/FamilyBlues ["); + for (i = 0; i < privateDicts[0].nFamilyBlues; ++i) { + buf = GooString::format("{0:s}{1:d}", + i > 0 ? " " : "", privateDicts[0].familyBlues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nFamilyOtherBlues) { + eexecWrite(&eb, "/FamilyOtherBlues ["); + for (i = 0; i < privateDicts[0].nFamilyOtherBlues; ++i) { + buf = GooString::format("{0:s}{1:d}", i > 0 ? " " : "", + privateDicts[0].familyOtherBlues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].blueScale != 0.039625) { + buf = GooString::format("/BlueScale {0:.4g} def\n", + privateDicts[0].blueScale); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].blueShift != 7) { + buf = GooString::format("/BlueShift {0:d} def\n", privateDicts[0].blueShift); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].blueFuzz != 1) { + buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[0].blueFuzz); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].hasStdHW) { + buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[0].stdHW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].hasStdVW) { + buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[0].stdVW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].nStemSnapH) { + eexecWrite(&eb, "/StemSnapH ["); + for (i = 0; i < privateDicts[0].nStemSnapH; ++i) { + buf = GooString::format("{0:s}{1:.4g}", + i > 0 ? " " : "", privateDicts[0].stemSnapH[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nStemSnapV) { + eexecWrite(&eb, "/StemSnapV ["); + for (i = 0; i < privateDicts[0].nStemSnapV; ++i) { + buf = GooString::format("{0:s}{1:.4g}", + i > 0 ? " " : "", privateDicts[0].stemSnapV[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].hasForceBold) { + buf = GooString::format("/ForceBold {0:s} def\n", + privateDicts[0].forceBold ? "true" : "false"); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].forceBoldThreshold != 0) { + buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n", + privateDicts[0].forceBoldThreshold); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].languageGroup != 0) { + buf = GooString::format("/LanguageGroup {0:d} def\n", + privateDicts[0].languageGroup); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].expansionFactor != 0.06) { + buf = GooString::format("/ExpansionFactor {0:.4g} def\n", + privateDicts[0].expansionFactor); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + + // set up subroutines + ok = gTrue; + getIndex(privateDicts[0].subrsOffset, &subrIdx, &ok); + if (!ok) { + subrIdx.pos = -1; + } + + // write the CharStrings + buf = GooString::format("2 index /CharStrings {0:d} dict dup begin\n", + nGlyphs); + eexecWrite(&eb, buf->getCString()); + delete buf; + for (i = 0; i < nGlyphs; ++i) { + ok = gTrue; + getIndexVal(&charStringsIdx, i, &val, &ok); + if (ok && i < charsetLength) { + getString(charset[i], buf2, &ok); + if (ok) { + eexecCvtGlyph(&eb, buf2, val.pos, val.len, &subrIdx, &privateDicts[0]); + } + } + } + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "readonly put\n"); + eexecWrite(&eb, "noaccess put\n"); + eexecWrite(&eb, "dup /FontName get exch definefont pop\n"); + eexecWrite(&eb, "mark currentfile closefile\n"); + + // trailer + if (ascii && eb.line > 0) { + (*outputFunc)(outputStream, "\n", 1); + } + for (i = 0; i < 8; ++i) { + (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); + } + (*outputFunc)(outputStream, "cleartomark\n", 12); +} + +void FoFiType1C::convertToCIDType0(char *psName, int *codeMap, int nCodes, + FoFiOutputFunc outputFunc, + void *outputStream) { + int *cidMap; + GooString *charStrings; + int *charStringOffsets; + Type1CIndex subrIdx; + Type1CIndexVal val; + int nCIDs, gdBytes; + GooString *buf; + char buf2[256]; + GBool ok; + int gid, offset, n, i, j, k; + + // compute the CID count and build the CID-to-GID mapping + if (codeMap) { + nCIDs = nCodes; + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCodes; ++i) { + if (codeMap[i] >= 0 && codeMap[i] < nGlyphs) { + cidMap[i] = codeMap[i]; + } else { + cidMap[i] = -1; + } + } + } else if (topDict.firstOp == 0x0c1e) { + nCIDs = 0; + for (i = 0; i < nGlyphs && i < charsetLength; ++i) { + if (charset[i] >= nCIDs) { + nCIDs = charset[i] + 1; + } + } + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + cidMap[i] = -1; + } + for (i = 0; i < nGlyphs && i < charsetLength; ++i) { + cidMap[charset[i]] = i; + } + } else { + nCIDs = nGlyphs; + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + cidMap[i] = i; + } + } + + // build the charstrings + charStrings = new GooString(); + charStringOffsets = (int *)gmallocn(nCIDs + 1, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + charStringOffsets[i] = charStrings->getLength(); + if ((gid = cidMap[i]) >= 0) { + ok = gTrue; + getIndexVal(&charStringsIdx, gid, &val, &ok); + if (ok) { + getIndex(privateDicts[fdSelect ? fdSelect[gid] : 0].subrsOffset, + &subrIdx, &ok); + if (!ok) { + subrIdx.pos = -1; + } + cvtGlyph(val.pos, val.len, charStrings, + &subrIdx, &privateDicts[fdSelect ? fdSelect[gid] : 0], gTrue); + } + } + } + charStringOffsets[nCIDs] = charStrings->getLength(); + + // compute gdBytes = number of bytes needed for charstring offsets + // (offset size needs to account for the charstring offset table, + // with a worst case of five bytes per entry, plus the charstrings + // themselves) + i = (nCIDs + 1) * 5 + charStrings->getLength(); + if (i < 0x100) { + gdBytes = 1; + } else if (i < 0x10000) { + gdBytes = 2; + } else if (i < 0x1000000) { + gdBytes = 3; + } else { + gdBytes = 4; + } + + // begin the font dictionary + (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37); + (*outputFunc)(outputStream, "20 dict begin\n", 14); + (*outputFunc)(outputStream, "/CIDFontName /", 14); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19); + (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); + if (topDict.registrySID > 0 && topDict.orderingSID > 0) { + ok = gTrue; + getString(topDict.registrySID, buf2, &ok); + if (ok) { + (*outputFunc)(outputStream, " /Registry (", 13); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") def\n", 6); + } + ok = gTrue; + getString(topDict.orderingSID, buf2, &ok); + if (ok) { + (*outputFunc)(outputStream, " /Ordering (", 13); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") def\n", 6); + } + } else { + (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); + (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); + } + buf = GooString::format(" /Supplement {0:d} def\n", topDict.supplement); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "end def\n", 8); + if (topDict.hasFontMatrix) { + buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + topDict.fontMatrix[0], topDict.fontMatrix[1], + topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else if (privateDicts[0].hasFontMatrix) { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } else { + (*outputFunc)(outputStream, + "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); + } + buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", + topDict.fontBBox[0], topDict.fontBBox[1], + topDict.fontBBox[2], topDict.fontBBox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27); + (*outputFunc)(outputStream, " /FSType 8 def\n", 16); + (*outputFunc)(outputStream, "end def\n", 8); + + // CIDFont-specific entries + buf = GooString::format("/CIDCount {0:d} def\n", nCIDs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15); + buf = GooString::format("/GDBytes {0:d} def\n", gdBytes); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20); + if (topDict.paintType != 0) { + buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + + // FDArray entry + buf = GooString::format("/FDArray {0:d} array\n", nFDs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + for (i = 0; i < nFDs; ++i) { + buf = GooString::format("dup {0:d} 10 dict begin\n", i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 1 def\n", 16); + if (privateDicts[i].hasFontMatrix) { + buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + privateDicts[i].fontMatrix[0], + privateDicts[i].fontMatrix[1], + privateDicts[i].fontMatrix[2], + privateDicts[i].fontMatrix[3], + privateDicts[i].fontMatrix[4], + privateDicts[i].fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23); + if (privateDicts[i].nBlueValues) { + (*outputFunc)(outputStream, "/BlueValues [", 13); + for (j = 0; j < privateDicts[i].nBlueValues; ++j) { + buf = GooString::format("{0:s}{1:d}", + j > 0 ? " " : "", privateDicts[i].blueValues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nOtherBlues) { + (*outputFunc)(outputStream, "/OtherBlues [", 13); + for (j = 0; j < privateDicts[i].nOtherBlues; ++j) { + buf = GooString::format("{0:s}{1:d}", + j > 0 ? " " : "", privateDicts[i].otherBlues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nFamilyBlues) { + (*outputFunc)(outputStream, "/FamilyBlues [", 14); + for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) { + buf = GooString::format("{0:s}{1:d}", + j > 0 ? " " : "", + privateDicts[i].familyBlues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nFamilyOtherBlues) { + (*outputFunc)(outputStream, "/FamilyOtherBlues [", 19); + for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) { + buf = GooString::format("{0:s}{1:d}", j > 0 ? " " : "", + privateDicts[i].familyOtherBlues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].blueScale != 0.039625) { + buf = GooString::format("/BlueScale {0:.4g} def\n", + privateDicts[i].blueScale); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].blueShift != 7) { + buf = GooString::format("/BlueShift {0:d} def\n", + privateDicts[i].blueShift); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].blueFuzz != 1) { + buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[i].blueFuzz); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].hasStdHW) { + buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[i].stdHW); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].hasStdVW) { + buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[i].stdVW); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].nStemSnapH) { + (*outputFunc)(outputStream, "/StemSnapH [", 12); + for (j = 0; j < privateDicts[i].nStemSnapH; ++j) { + buf = GooString::format("{0:s}{1:.4g}", + j > 0 ? " " : "", privateDicts[i].stemSnapH[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nStemSnapV) { + (*outputFunc)(outputStream, "/StemSnapV [", 12); + for (j = 0; j < privateDicts[i].nStemSnapV; ++j) { + buf = GooString::format("{0:s}{1:.4g}", + j > 0 ? " " : "", privateDicts[i].stemSnapV[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].hasForceBold) { + buf = GooString::format("/ForceBold {0:s} def\n", + privateDicts[i].forceBold ? "true" : "false"); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].forceBoldThreshold != 0) { + buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n", + privateDicts[i].forceBoldThreshold); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].languageGroup != 0) { + buf = GooString::format("/LanguageGroup {0:d} def\n", + privateDicts[i].languageGroup); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].expansionFactor != 0.06) { + buf = GooString::format("/ExpansionFactor {0:.4g} def\n", + privateDicts[i].expansionFactor); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "currentdict end def\n", 20); + (*outputFunc)(outputStream, "currentdict end put\n", 20); + } + (*outputFunc)(outputStream, "def\n", 4); + + // start the binary section + offset = (nCIDs + 1) * (1 + gdBytes); + buf = GooString::format("(Hex) {0:d} StartData\n", + offset + charStrings->getLength()); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + + // write the charstring offset (CIDMap) table + for (i = 0; i <= nCIDs; i += 6) { + for (j = 0; j < 6 && i+j <= nCIDs; ++j) { + if (i+j < nCIDs && cidMap[i+j] >= 0 && fdSelect) { + buf2[0] = (char)fdSelect[cidMap[i+j]]; + } else { + buf2[0] = (char)0; + } + n = offset + charStringOffsets[i+j]; + for (k = gdBytes; k >= 1; --k) { + buf2[k] = (char)(n & 0xff); + n >>= 8; + } + for (k = 0; k <= gdBytes; ++k) { + buf = GooString::format("{0:02x}", buf2[k] & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + (*outputFunc)(outputStream, "\n", 1); + } + + // write the charstring data + n = charStrings->getLength(); + for (i = 0; i < n; i += 32) { + for (j = 0; j < 32 && i+j < n; ++j) { + buf = GooString::format("{0:02x}", charStrings->getChar(i+j) & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (i + 32 >= n) { + (*outputFunc)(outputStream, ">", 1); + } + (*outputFunc)(outputStream, "\n", 1); + } + + gfree(charStringOffsets); + delete charStrings; + gfree(cidMap); +} + +void FoFiType1C::convertToType0(char *psName, int *codeMap, int nCodes, + FoFiOutputFunc outputFunc, + void *outputStream) { + int *cidMap; + Type1CIndex subrIdx; + Type1CIndexVal val; + int nCIDs; + GooString *buf; + Type1CEexecBuf eb; + GBool ok; + int fd, i, j, k; + + // compute the CID count and build the CID-to-GID mapping + if (codeMap) { + nCIDs = nCodes; + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCodes; ++i) { + if (codeMap[i] >= 0 && codeMap[i] < nGlyphs) { + cidMap[i] = codeMap[i]; + } else { + cidMap[i] = -1; + } + } + } else if (topDict.firstOp == 0x0c1e) { + nCIDs = 0; + for (i = 0; i < nGlyphs && i < charsetLength; ++i) { + if (charset[i] >= nCIDs) { + nCIDs = charset[i] + 1; + } + } + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + cidMap[i] = -1; + } + for (i = 0; i < nGlyphs && i < charsetLength; ++i) { + cidMap[charset[i]] = i; + } + } else { + nCIDs = nGlyphs; + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + cidMap[i] = i; + } + } + + // write the descendant Type 1 fonts + for (i = 0; i < nCIDs; i += 256) { + + //~ this assumes that all CIDs in this block have the same FD -- + //~ to handle multiple FDs correctly, need to somehow divide the + //~ font up by FD; as a kludge we ignore CID 0, which is .notdef + fd = 0; + // if fdSelect is NULL, we have an 8-bit font, so just leave fd=0 + if (fdSelect) { + for (j = i==0 ? 1 : 0; j < 256 && i+j < nCIDs; ++j) { + if (cidMap[i+j] >= 0) { + fd = fdSelect[cidMap[i+j]]; + break; + } + } + } + + // font dictionary (unencrypted section) + (*outputFunc)(outputStream, "16 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GooString::format("_{0:02x} def\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 1 def\n", 16); + if (privateDicts[fd].hasFontMatrix) { + buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + privateDicts[fd].fontMatrix[0], + privateDicts[fd].fontMatrix[1], + privateDicts[fd].fontMatrix[2], + privateDicts[fd].fontMatrix[3], + privateDicts[fd].fontMatrix[4], + privateDicts[fd].fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else if (topDict.hasFontMatrix) { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } else { + (*outputFunc)(outputStream, + "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); + } + buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", + topDict.fontBBox[0], topDict.fontBBox[1], + topDict.fontBBox[2], topDict.fontBBox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (topDict.paintType != 0) { + buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + for (j = 0; j < 256 && i+j < nCIDs; ++j) { + buf = GooString::format("dup {0:d} /c{1:02x} put\n", j, j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (j < 256) { + buf = GooString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n", + j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "readonly def\n", 13); + (*outputFunc)(outputStream, "currentdict end\n", 16); + + // start the binary section + (*outputFunc)(outputStream, "currentfile eexec\n", 18); + eb.outputFunc = outputFunc; + eb.outputStream = outputStream; + eb.ascii = gTrue; + eb.r1 = 55665; + eb.line = 0; + + // start the private dictionary + eexecWrite(&eb, "\x83\xca\x73\xd5"); + eexecWrite(&eb, "dup /Private 32 dict dup begin\n"); + eexecWrite(&eb, "/RD {string currentfile exch readstring pop}" + " executeonly def\n"); + eexecWrite(&eb, "/ND {noaccess def} executeonly def\n"); + eexecWrite(&eb, "/NP {noaccess put} executeonly def\n"); + eexecWrite(&eb, "/MinFeature {16 16} def\n"); + eexecWrite(&eb, "/password 5839 def\n"); + if (privateDicts[fd].nBlueValues) { + eexecWrite(&eb, "/BlueValues ["); + for (k = 0; k < privateDicts[fd].nBlueValues; ++k) { + buf = GooString::format("{0:s}{1:d}", + k > 0 ? " " : "", + privateDicts[fd].blueValues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nOtherBlues) { + eexecWrite(&eb, "/OtherBlues ["); + for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) { + buf = GooString::format("{0:s}{1:d}", + k > 0 ? " " : "", + privateDicts[fd].otherBlues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nFamilyBlues) { + eexecWrite(&eb, "/FamilyBlues ["); + for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) { + buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "", + privateDicts[fd].familyBlues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nFamilyOtherBlues) { + eexecWrite(&eb, "/FamilyOtherBlues ["); + for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) { + buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "", + privateDicts[fd].familyOtherBlues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].blueScale != 0.039625) { + buf = GooString::format("/BlueScale {0:.4g} def\n", + privateDicts[fd].blueScale); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].blueShift != 7) { + buf = GooString::format("/BlueShift {0:d} def\n", + privateDicts[fd].blueShift); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].blueFuzz != 1) { + buf = GooString::format("/BlueFuzz {0:d} def\n", + privateDicts[fd].blueFuzz); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].hasStdHW) { + buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].hasStdVW) { + buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].nStemSnapH) { + eexecWrite(&eb, "/StemSnapH ["); + for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) { + buf = GooString::format("{0:s}{1:.4g}", + k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nStemSnapV) { + eexecWrite(&eb, "/StemSnapV ["); + for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) { + buf = GooString::format("{0:s}{1:.4g}", + k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].hasForceBold) { + buf = GooString::format("/ForceBold {0:s} def\n", + privateDicts[fd].forceBold ? "true" : "false"); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].forceBoldThreshold != 0) { + buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n", + privateDicts[fd].forceBoldThreshold); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].languageGroup != 0) { + buf = GooString::format("/LanguageGroup {0:d} def\n", + privateDicts[fd].languageGroup); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].expansionFactor != 0.06) { + buf = GooString::format("/ExpansionFactor {0:.4g} def\n", + privateDicts[fd].expansionFactor); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + + // set up the subroutines + ok = gTrue; + getIndex(privateDicts[fd].subrsOffset, &subrIdx, &ok); + if (!ok) { + subrIdx.pos = -1; + } + + // start the CharStrings + eexecWrite(&eb, "2 index /CharStrings 256 dict dup begin\n"); + + // write the .notdef CharString + ok = gTrue; + getIndexVal(&charStringsIdx, 0, &val, &ok); + if (ok) { + eexecCvtGlyph(&eb, ".notdef", val.pos, val.len, + &subrIdx, &privateDicts[fd]); + } + + // write the CharStrings + for (j = 0; j < 256 && i+j < nCIDs; ++j) { + if (cidMap[i+j] >= 0) { + ok = gTrue; + getIndexVal(&charStringsIdx, cidMap[i+j], &val, &ok); + if (ok) { + buf = GooString::format("c{0:02x}", j); + eexecCvtGlyph(&eb, buf->getCString(), val.pos, val.len, + &subrIdx, &privateDicts[fd]); + delete buf; + } + } + } + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "readonly put\n"); + eexecWrite(&eb, "noaccess put\n"); + eexecWrite(&eb, "dup /FontName get exch definefont pop\n"); + eexecWrite(&eb, "mark currentfile closefile\n"); + + // trailer + if (eb.line > 0) { + (*outputFunc)(outputStream, "\n", 1); + } + for (j = 0; j < 8; ++j) { + (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); + } + (*outputFunc)(outputStream, "cleartomark\n", 12); + } + + // write the Type 0 parent font + (*outputFunc)(outputStream, "16 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/FontType 0 def\n", 16); + if (topDict.hasFontMatrix) { + buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + topDict.fontMatrix[0], topDict.fontMatrix[1], + topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); + (*outputFunc)(outputStream, "/Encoding [\n", 12); + for (i = 0; i < nCIDs; i += 256) { + buf = GooString::format("{0:d}\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "/FDepVector [\n", 14); + for (i = 0; i < nCIDs; i += 256) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GooString::format("_{0:02x} findfont\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); + + gfree(cidMap); +} + +void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, const char *glyphName, + int offset, int nBytes, + Type1CIndex *subrIdx, + Type1CPrivateDict *pDict) { + GooString *buf; + GooString *charBuf; + + // generate the charstring + charBuf = new GooString(); + cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, gTrue); + + buf = GooString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength()); + eexecWrite(eb, buf->getCString()); + delete buf; + eexecWriteCharstring(eb, (Guchar *)charBuf->getCString(), + charBuf->getLength()); + eexecWrite(eb, " ND\n"); + + delete charBuf; +} + +void FoFiType1C::cvtGlyph(int offset, int nBytes, GooString *charBuf, + Type1CIndex *subrIdx, Type1CPrivateDict *pDict, + GBool top) { + Type1CIndexVal val; + GBool ok, dFP; + double d, dx, dy; + Gushort r2; + Guchar byte; + int pos, subrBias, start, i, k; + + start = charBuf->getLength(); + if (top) { + charBuf->append((char)73); + charBuf->append((char)58); + charBuf->append((char)147); + charBuf->append((char)134); + nOps = 0; + nHints = 0; + firstOp = gTrue; + openPath = gFalse; + } + + pos = offset; + while (pos < offset + nBytes) { + ok = gTrue; + pos = getOp(pos, gTrue, &ok); + if (!ok) { + break; + } + if (!ops[nOps - 1].isNum) { + --nOps; // drop the operator + switch (ops[nOps].op) { + case 0x0001: // hstem + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps); + } + d = 0; + dFP = gFalse; + for (k = 0; k < nOps; k += 2) { + // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints + if (ops[k+1].num < 0) { + d += ops[k].num + ops[k+1].num; + dFP |= ops[k].isFP | ops[k+1].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf); + } else { + d += ops[k].num; + dFP |= ops[k].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + d += ops[k+1].num; + dFP |= ops[k+1].isFP; + } + charBuf->append((char)1); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0003: // vstem + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps); + } + d = 0; + dFP = gFalse; + for (k = 0; k < nOps; k += 2) { + // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints + if (ops[k+1].num < 0) { + d += ops[k].num + ops[k+1].num; + dFP |= ops[k].isFP | ops[k+1].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf); + } else { + d += ops[k].num; + dFP |= ops[k].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + d += ops[k+1].num; + dFP |= ops[k+1].isFP; + } + charBuf->append((char)3); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0004: // vmoveto + if (firstOp) { + cvtGlyphWidth(nOps == 2, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps != 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + charBuf->append((char)4); + nOps = 0; + break; + case 0x0005: // rlineto + if (nOps < 2 || nOps % 2 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps); + } + for (k = 0; k < nOps; k += 2) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + charBuf->append((char)5); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0006: // hlineto + if (nOps < 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps); + } + for (k = 0; k < nOps; ++k) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + charBuf->append((char)((k & 1) ? 7 : 6)); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0007: // vlineto + if (nOps < 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps); + } + for (k = 0; k < nOps; ++k) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + charBuf->append((char)((k & 1) ? 6 : 7)); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0008: // rrcurveto + if (nOps < 6 || nOps % 6 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps); + } + for (k = 0; k < nOps; k += 6) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x000a: // callsubr + if (nOps >= 1) { + subrBias = (subrIdx->len < 1240) + ? 107 : (subrIdx->len < 33900) ? 1131 : 32768; + k = subrBias + (int)ops[nOps - 1].num; + --nOps; + ok = gTrue; + getIndexVal(subrIdx, k, &val, &ok); + if (ok) { + cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse); + } + } else { + //~ error(-1, "Too few args to Type 2 callsubr"); + } + // don't clear the stack + break; + case 0x000b: // return + // don't clear the stack + break; + case 0x000e: // endchar / seac + if (firstOp) { + cvtGlyphWidth(nOps == 1 || nOps == 5, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps == 4) { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + charBuf->append((char)12)->append((char)6); + } else if (nOps == 0) { + charBuf->append((char)14); + } else { + //~ error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps); + } + nOps = 0; + break; + case 0x000f: // (obsolete) + // this op is ignored, but we need the glyph width + if (firstOp) { + cvtGlyphWidth(nOps > 0, charBuf, pDict); + firstOp = gFalse; + } + nOps = 0; + break; + case 0x0010: // blend + //~ error(-1, "Unimplemented Type 2 charstring op: %d", file[i]); + nOps = 0; + break; + case 0x0012: // hstemhm + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0013: // hintmask + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps > 0) { + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm", + //~ nOps); + } + nHints += nOps / 2; + } + pos += (nHints + 7) >> 3; + nOps = 0; + break; + case 0x0014: // cntrmask + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps > 0) { + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm", + //~ nOps); + } + nHints += nOps / 2; + } + pos += (nHints + 7) >> 3; + nOps = 0; + break; + case 0x0015: // rmoveto + if (firstOp) { + cvtGlyphWidth(nOps == 3, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps != 2) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + charBuf->append((char)21); + nOps = 0; + break; + case 0x0016: // hmoveto + if (firstOp) { + cvtGlyphWidth(nOps == 2, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps != 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + charBuf->append((char)22); + nOps = 0; + break; + case 0x0017: // vstemhm + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0018: // rcurveline + if (nOps < 8 || (nOps - 2) % 6 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps); + } + for (k = 0; k < nOps - 2; k += 6) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); + charBuf->append((char)8); + } + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k].isFP, charBuf); + charBuf->append((char)5); + nOps = 0; + openPath = gTrue; + break; + case 0x0019: // rlinecurve + if (nOps < 8 || (nOps - 6) % 2 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps); + } + for (k = 0; k < nOps - 6; k += 2) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k].isFP, charBuf); + charBuf->append((char)5); + } + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x001a: // vvcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps); + } + if (nOps % 2 == 1) { + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + charBuf->append((char)8); + k = 5; + } else { + k = 0; + } + for (; k < nOps; k += 4) { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x001b: // hhcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps); + } + if (nOps % 2 == 1) { + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + k = 5; + } else { + k = 0; + } + for (; k < nOps; k += 4) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x001d: // callgsubr + if (nOps >= 1) { + k = gsubrBias + (int)ops[nOps - 1].num; + --nOps; + ok = gTrue; + getIndexVal(&gsubrIdx, k, &val, &ok); + if (ok) { + cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse); + } + } else { + //~ error(-1, "Too few args to Type 2 callgsubr"); + } + // don't clear the stack + break; + case 0x001e: // vhcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps); + } + for (k = 0; k < nOps && k != nOps-5; k += 4) { + if (k % 8 == 0) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)30); + } else { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)31); + } + } + if (k == nOps-5) { + if (k % 8 == 0) { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + } else { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + } + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x001f: // hvcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps); + } + for (k = 0; k < nOps && k != nOps-5; k += 4) { + if (k % 8 == 0) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)31); + } else { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)30); + } + } + if (k == nOps-5) { + if (k % 8 == 0) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + } else { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + } + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0c00: // dotsection (should be Type 1 only?) + // ignored + nOps = 0; + break; + case 0x0c03: // and + case 0x0c04: // or + case 0x0c05: // not + case 0x0c08: // store + case 0x0c09: // abs + case 0x0c0a: // add + case 0x0c0b: // sub + case 0x0c0c: // div + case 0x0c0d: // load + case 0x0c0e: // neg + case 0x0c0f: // eq + case 0x0c12: // drop + case 0x0c14: // put + case 0x0c15: // get + case 0x0c16: // ifelse + case 0x0c17: // random + case 0x0c18: // mul + case 0x0c1a: // sqrt + case 0x0c1b: // dup + case 0x0c1c: // exch + case 0x0c1d: // index + case 0x0c1e: // roll + //~ error(-1, "Unimplemented Type 2 charstring op: 12.%d", file[i+1]); + nOps = 0; + break; + case 0x0c22: // hflex + if (nOps != 7) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hflex", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + cvtNum(-ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x0c23: // flex + if (nOps != 13) { + //~ error(-1, "Wrong number of args (%d) to Type 2 flex", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + charBuf->append((char)8); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(ops[7].num, ops[7].isFP, charBuf); + cvtNum(ops[8].num, ops[8].isFP, charBuf); + cvtNum(ops[9].num, ops[9].isFP, charBuf); + cvtNum(ops[10].num, ops[10].isFP, charBuf); + cvtNum(ops[11].num, ops[11].isFP, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x0c24: // hflex1 + if (nOps != 9) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hflex1", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(ops[7].num, ops[7].isFP, charBuf); + cvtNum(ops[8].num, ops[8].isFP, charBuf); + cvtNum(-(ops[1].num + ops[3].num + ops[7].num), + ops[1].isFP | ops[3].isFP | ops[7].isFP, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x0c25: // flex1 + if (nOps != 11) { + //~ error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + charBuf->append((char)8); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(ops[7].num, ops[7].isFP, charBuf); + cvtNum(ops[8].num, ops[8].isFP, charBuf); + cvtNum(ops[9].num, ops[9].isFP, charBuf); + dx = ops[0].num + ops[2].num + ops[4].num + ops[6].num + ops[8].num; + dy = ops[1].num + ops[3].num + ops[5].num + ops[7].num + ops[9].num; + if (fabs(dx) > fabs(dy)) { + cvtNum(ops[10].num, ops[10].isFP, charBuf); + cvtNum(-dy, ops[1].isFP | ops[3].isFP | ops[5].isFP | + ops[7].isFP | ops[9].isFP, charBuf); + } else { + cvtNum(-dx, ops[0].isFP | ops[2].isFP | ops[4].isFP | + ops[6].isFP | ops[8].isFP, charBuf); + cvtNum(ops[10].num, ops[10].isFP, charBuf); + } + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + default: + //~ error(-1, "Illegal Type 2 charstring op: %04x", + //~ ops[nOps].op); + nOps = 0; + break; + } + } + } + + // charstring encryption + if (top) { + r2 = 4330; + for (i = start; i < charBuf->getLength(); ++i) { + byte = charBuf->getChar(i) ^ (r2 >> 8); + charBuf->setChar(i, byte); + r2 = (byte + r2) * 52845 + 22719; + } + } +} + +void FoFiType1C::cvtGlyphWidth(GBool useOp, GooString *charBuf, + Type1CPrivateDict *pDict) { + double w; + GBool wFP; + int i; + + if (useOp) { + w = pDict->nominalWidthX + ops[0].num; + wFP = pDict->nominalWidthXFP | ops[0].isFP; + for (i = 1; i < nOps; ++i) { + ops[i-1] = ops[i]; + } + --nOps; + } else { + w = pDict->defaultWidthX; + wFP = pDict->defaultWidthXFP; + } + cvtNum(0, gFalse, charBuf); + cvtNum(w, wFP, charBuf); + charBuf->append((char)13); +} + +void FoFiType1C::cvtNum(double x, GBool isFP, GooString *charBuf) { + Guchar buf[12]; + int y, n; + + n = 0; + if (isFP) { + if (x >= -32768 && x < 32768) { + y = (int)(x * 256.0); + buf[0] = 255; + buf[1] = (Guchar)(y >> 24); + buf[2] = (Guchar)(y >> 16); + buf[3] = (Guchar)(y >> 8); + buf[4] = (Guchar)y; + buf[5] = 255; + buf[6] = 0; + buf[7] = 0; + buf[8] = 1; + buf[9] = 0; + buf[10] = 12; + buf[11] = 12; + n = 12; + } else { + //~ error(-1, "Type 2 fixed point constant out of range"); + } + } else { + y = (int)x; + if (y >= -107 && y <= 107) { + buf[0] = (Guchar)(y + 139); + n = 1; + } else if (y > 107 && y <= 1131) { + y -= 108; + buf[0] = (Guchar)((y >> 8) + 247); + buf[1] = (Guchar)(y & 0xff); + n = 2; + } else if (y < -107 && y >= -1131) { + y = -y - 108; + buf[0] = (Guchar)((y >> 8) + 251); + buf[1] = (Guchar)(y & 0xff); + n = 2; + } else { + buf[0] = 255; + buf[1] = (Guchar)(y >> 24); + buf[2] = (Guchar)(y >> 16); + buf[3] = (Guchar)(y >> 8); + buf[4] = (Guchar)y; + n = 5; + } + } + charBuf->append((char *)buf, n); +} + +void FoFiType1C::eexecWrite(Type1CEexecBuf *eb, const char *s) { + Guchar *p; + Guchar x; + + for (p = (Guchar *)s; *p; ++p) { + x = *p ^ (eb->r1 >> 8); + eb->r1 = (x + eb->r1) * 52845 + 22719; + if (eb->ascii) { + (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1); + (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1); + eb->line += 2; + if (eb->line == 64) { + (*eb->outputFunc)(eb->outputStream, "\n", 1); + eb->line = 0; + } + } else { + (*eb->outputFunc)(eb->outputStream, (char *)&x, 1); + } + } +} + +void FoFiType1C::eexecWriteCharstring(Type1CEexecBuf *eb, + Guchar *s, int n) { + Guchar x; + int i; + + // eexec encryption + for (i = 0; i < n; ++i) { + x = s[i] ^ (eb->r1 >> 8); + eb->r1 = (x + eb->r1) * 52845 + 22719; + if (eb->ascii) { + (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1); + (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1); + eb->line += 2; + if (eb->line == 64) { + (*eb->outputFunc)(eb->outputStream, "\n", 1); + eb->line = 0; + } + } else { + (*eb->outputFunc)(eb->outputStream, (char *)&x, 1); + } + } +} + +void FoFiType1C::writePSString(char *s, FoFiOutputFunc outputFunc, + void *outputStream) { + char buf[80]; + char *p; + int i, c; + + i = 0; + buf[i++] = '('; + for (p = s; *p; ++p) { + c = *p & 0xff; + if (c == '(' || c == ')' || c == '\\') { + buf[i++] = '\\'; + buf[i++] = c; + } else if (c < 0x20 || c >= 0x80) { + buf[i++] = '\\'; + buf[i++] = '0' + ((c >> 6) & 7); + buf[i++] = '0' + ((c >> 3) & 7); + buf[i++] = '0' + (c & 7); + } else { + buf[i++] = c; + } + if (i >= 64) { + buf[i++] = '\\'; + buf[i++] = '\n'; + (*outputFunc)(outputStream, buf, i); + i = 0; + } + } + buf[i++] = ')'; + (*outputFunc)(outputStream, buf, i); +} + +GBool FoFiType1C::parse() { + Type1CIndex fdIdx; + Type1CIndexVal val; + int i; + + parsedOk = gTrue; + + // some tools embed Type 1C fonts with an extra whitespace char at + // the beginning + if (len > 0 && file[0] != '\x01') { + ++file; + --len; + } + + // find the indexes + getIndex(getU8(2, &parsedOk), &nameIdx, &parsedOk); + getIndex(nameIdx.endPos, &topDictIdx, &parsedOk); + getIndex(topDictIdx.endPos, &stringIdx, &parsedOk); + getIndex(stringIdx.endPos, &gsubrIdx, &parsedOk); + if (!parsedOk) { + return gFalse; + } + gsubrBias = (gsubrIdx.len < 1240) ? 107 + : (gsubrIdx.len < 33900) ? 1131 : 32768; + + // read the first font name + getIndexVal(&nameIdx, 0, &val, &parsedOk); + if (!parsedOk) { + return gFalse; + } + name = new GooString((char *)&file[val.pos], val.len); + + // read the top dict for the first font + readTopDict(); + + // for CID fonts: read the FDArray dicts and private dicts + if (topDict.firstOp == 0x0c1e) { + if (topDict.fdArrayOffset == 0) { + nFDs = 1; + privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict)); + readPrivateDict(0, 0, &privateDicts[0]); + } else { + getIndex(topDict.fdArrayOffset, &fdIdx, &parsedOk); + if (!parsedOk) { + return gFalse; + } + nFDs = fdIdx.len; + privateDicts = (Type1CPrivateDict *) + gmallocn(nFDs, sizeof(Type1CPrivateDict)); + for (i = 0; i < nFDs; ++i) { + getIndexVal(&fdIdx, i, &val, &parsedOk); + if (!parsedOk) { + return gFalse; + } + readFD(val.pos, val.len, &privateDicts[i]); + } + } + + // for 8-bit fonts: read the private dict + } else { + nFDs = 1; + privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict)); + readPrivateDict(topDict.privateOffset, topDict.privateSize, + &privateDicts[0]); + } + + // check for parse errors in the private dict(s) + if (!parsedOk) { + return gFalse; + } + + // get the charstrings index + if (topDict.charStringsOffset <= 0) { + parsedOk = gFalse; + return gFalse; + } + getIndex(topDict.charStringsOffset, &charStringsIdx, &parsedOk); + if (!parsedOk) { + return gFalse; + } + nGlyphs = charStringsIdx.len; + + // for CID fonts: read the FDSelect table + if (topDict.firstOp == 0x0c1e) { + readFDSelect(); + if (!parsedOk) { + return gFalse; + } + } + + // read the charset + if (!readCharset()) { + parsedOk = gFalse; + return gFalse; + } + + // for 8-bit fonts: build the encoding + if (topDict.firstOp != 0x0c14 && topDict.firstOp != 0x0c1e) { + buildEncoding(); + if (!parsedOk) { + return gFalse; + } + } + + return parsedOk; +} + +void FoFiType1C::readTopDict() { + Type1CIndexVal topDictPtr; + int pos; + + topDict.firstOp = -1; + topDict.versionSID = 0; + topDict.noticeSID = 0; + topDict.copyrightSID = 0; + topDict.fullNameSID = 0; + topDict.familyNameSID = 0; + topDict.weightSID = 0; + topDict.isFixedPitch = 0; + topDict.italicAngle = 0; + topDict.underlinePosition = -100; + topDict.underlineThickness = 50; + topDict.paintType = 0; + topDict.charstringType = 2; + topDict.fontMatrix[0] = 0.001; + topDict.fontMatrix[1] = 0; + topDict.fontMatrix[2] = 0; + topDict.fontMatrix[3] = 0.001; + topDict.fontMatrix[4] = 0; + topDict.fontMatrix[5] = 0; + topDict.hasFontMatrix = gFalse; + topDict.uniqueID = 0; + topDict.fontBBox[0] = 0; + topDict.fontBBox[1] = 0; + topDict.fontBBox[2] = 0; + topDict.fontBBox[3] = 0; + topDict.strokeWidth = 0; + topDict.charsetOffset = 0; + topDict.encodingOffset = 0; + topDict.charStringsOffset = 0; + topDict.privateSize = 0; + topDict.privateOffset = 0; + topDict.registrySID = 0; + topDict.orderingSID = 0; + topDict.supplement = 0; + topDict.fdArrayOffset = 0; + topDict.fdSelectOffset = 0; + + getIndexVal(&topDictIdx, 0, &topDictPtr, &parsedOk); + pos = topDictPtr.pos; + nOps = 0; + while (pos < topDictPtr.pos + topDictPtr.len) { + pos = getOp(pos, gFalse, &parsedOk); + if (!parsedOk) { + break; + } + if (!ops[nOps - 1].isNum) { + --nOps; // drop the operator + if (topDict.firstOp < 0) { + topDict.firstOp = ops[nOps].op; + } + switch (ops[nOps].op) { + case 0x0000: topDict.versionSID = (int)ops[0].num; break; + case 0x0001: topDict.noticeSID = (int)ops[0].num; break; + case 0x0c00: topDict.copyrightSID = (int)ops[0].num; break; + case 0x0002: topDict.fullNameSID = (int)ops[0].num; break; + case 0x0003: topDict.familyNameSID = (int)ops[0].num; break; + case 0x0004: topDict.weightSID = (int)ops[0].num; break; + case 0x0c01: topDict.isFixedPitch = (int)ops[0].num; break; + case 0x0c02: topDict.italicAngle = ops[0].num; break; + case 0x0c03: topDict.underlinePosition = ops[0].num; break; + case 0x0c04: topDict.underlineThickness = ops[0].num; break; + case 0x0c05: topDict.paintType = (int)ops[0].num; break; + case 0x0c06: topDict.charstringType = (int)ops[0].num; break; + case 0x0c07: topDict.fontMatrix[0] = ops[0].num; + topDict.fontMatrix[1] = ops[1].num; + topDict.fontMatrix[2] = ops[2].num; + topDict.fontMatrix[3] = ops[3].num; + topDict.fontMatrix[4] = ops[4].num; + topDict.fontMatrix[5] = ops[5].num; + topDict.hasFontMatrix = gTrue; break; + case 0x000d: topDict.uniqueID = (int)ops[0].num; break; + case 0x0005: topDict.fontBBox[0] = ops[0].num; + topDict.fontBBox[1] = ops[1].num; + topDict.fontBBox[2] = ops[2].num; + topDict.fontBBox[3] = ops[3].num; break; + case 0x0c08: topDict.strokeWidth = ops[0].num; break; + case 0x000f: topDict.charsetOffset = (int)ops[0].num; break; + case 0x0010: topDict.encodingOffset = (int)ops[0].num; break; + case 0x0011: topDict.charStringsOffset = (int)ops[0].num; break; + case 0x0012: topDict.privateSize = (int)ops[0].num; + topDict.privateOffset = (int)ops[1].num; break; + case 0x0c1e: topDict.registrySID = (int)ops[0].num; + topDict.orderingSID = (int)ops[1].num; + topDict.supplement = (int)ops[2].num; break; + case 0x0c24: topDict.fdArrayOffset = (int)ops[0].num; break; + case 0x0c25: topDict.fdSelectOffset = (int)ops[0].num; break; + } + nOps = 0; + } + } +} + +// Read a CID font dict (FD) - this pulls out the private dict +// pointer, and reads the private dict. It also pulls the FontMatrix +// (if any) out of the FD. +void FoFiType1C::readFD(int offset, int length, Type1CPrivateDict *pDict) { + int pos, pSize, pOffset; + double fontMatrix[6] = {0}; + GBool hasFontMatrix; + + hasFontMatrix = gFalse; + fontMatrix[0] = fontMatrix[1] = fontMatrix[2] = 0; // make gcc happy + fontMatrix[3] = fontMatrix[4] = fontMatrix[5] = 0; + pSize = pOffset = 0; + pos = offset; + nOps = 0; + while (pos < offset + length) { + pos = getOp(pos, gFalse, &parsedOk); + if (!parsedOk) { + return; + } + if (!ops[nOps - 1].isNum) { + if (ops[nOps - 1].op == 0x0012) { + if (nOps < 3) { + parsedOk = gFalse; + return; + } + pSize = (int)ops[0].num; + pOffset = (int)ops[1].num; + break; + } else if (ops[nOps - 1].op == 0x0c07) { + fontMatrix[0] = ops[0].num; + fontMatrix[1] = ops[1].num; + fontMatrix[2] = ops[2].num; + fontMatrix[3] = ops[3].num; + fontMatrix[4] = ops[4].num; + fontMatrix[5] = ops[5].num; + hasFontMatrix = gTrue; + } + nOps = 0; + } + } + readPrivateDict(pOffset, pSize, pDict); + if (hasFontMatrix) { + pDict->fontMatrix[0] = fontMatrix[0]; + pDict->fontMatrix[1] = fontMatrix[1]; + pDict->fontMatrix[2] = fontMatrix[2]; + pDict->fontMatrix[3] = fontMatrix[3]; + pDict->fontMatrix[4] = fontMatrix[4]; + pDict->fontMatrix[5] = fontMatrix[5]; + pDict->hasFontMatrix = gTrue; + } +} + +void FoFiType1C::readPrivateDict(int offset, int length, + Type1CPrivateDict *pDict) { + int pos; + + pDict->hasFontMatrix = gFalse; + pDict->nBlueValues = 0; + pDict->nOtherBlues = 0; + pDict->nFamilyBlues = 0; + pDict->nFamilyOtherBlues = 0; + pDict->blueScale = 0.039625; + pDict->blueShift = 7; + pDict->blueFuzz = 1; + pDict->hasStdHW = gFalse; + pDict->hasStdVW = gFalse; + pDict->nStemSnapH = 0; + pDict->nStemSnapV = 0; + pDict->hasForceBold = gFalse; + pDict->forceBoldThreshold = 0; + pDict->languageGroup = 0; + pDict->expansionFactor = 0.06; + pDict->initialRandomSeed = 0; + pDict->subrsOffset = 0; + pDict->defaultWidthX = 0; + pDict->defaultWidthXFP = gFalse; + pDict->nominalWidthX = 0; + pDict->nominalWidthXFP = gFalse; + + // no dictionary + if (offset == 0 || length == 0) { + return; + } + + pos = offset; + nOps = 0; + while (pos < offset + length) { + pos = getOp(pos, gFalse, &parsedOk); + if (!parsedOk) { + break; + } + if (!ops[nOps - 1].isNum) { + --nOps; // drop the operator + switch (ops[nOps].op) { + case 0x0006: + pDict->nBlueValues = getDeltaIntArray(pDict->blueValues, + type1CMaxBlueValues); + break; + case 0x0007: + pDict->nOtherBlues = getDeltaIntArray(pDict->otherBlues, + type1CMaxOtherBlues); + break; + case 0x0008: + pDict->nFamilyBlues = getDeltaIntArray(pDict->familyBlues, + type1CMaxBlueValues); + break; + case 0x0009: + pDict->nFamilyOtherBlues = getDeltaIntArray(pDict->familyOtherBlues, + type1CMaxOtherBlues); + break; + case 0x0c09: + pDict->blueScale = ops[0].num; + break; + case 0x0c0a: + pDict->blueShift = (int)ops[0].num; + break; + case 0x0c0b: + pDict->blueFuzz = (int)ops[0].num; + break; + case 0x000a: + pDict->stdHW = ops[0].num; + pDict->hasStdHW = gTrue; + break; + case 0x000b: + pDict->stdVW = ops[0].num; + pDict->hasStdVW = gTrue; + break; + case 0x0c0c: + pDict->nStemSnapH = getDeltaFPArray(pDict->stemSnapH, + type1CMaxStemSnap); + break; + case 0x0c0d: + pDict->nStemSnapV = getDeltaFPArray(pDict->stemSnapV, + type1CMaxStemSnap); + break; + case 0x0c0e: + pDict->forceBold = ops[0].num != 0; + pDict->hasForceBold = gTrue; + break; + case 0x0c0f: + pDict->forceBoldThreshold = ops[0].num; + break; + case 0x0c11: + pDict->languageGroup = (int)ops[0].num; + break; + case 0x0c12: + pDict->expansionFactor = ops[0].num; + break; + case 0x0c13: + pDict->initialRandomSeed = (int)ops[0].num; + break; + case 0x0013: + pDict->subrsOffset = offset + (int)ops[0].num; + break; + case 0x0014: + pDict->defaultWidthX = ops[0].num; + pDict->defaultWidthXFP = ops[0].isFP; + break; + case 0x0015: + pDict->nominalWidthX = ops[0].num; + pDict->nominalWidthXFP = ops[0].isFP; + break; + } + nOps = 0; + } + } +} + +void FoFiType1C::readFDSelect() { + int fdSelectFmt, pos, nRanges, gid0, gid1, fd, i, j; + + fdSelect = (Guchar *)gmalloc(nGlyphs); + if (topDict.fdSelectOffset == 0) { + for (i = 0; i < nGlyphs; ++i) { + fdSelect[i] = 0; + } + } else { + pos = topDict.fdSelectOffset; + fdSelectFmt = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if (fdSelectFmt == 0) { + if (!checkRegion(pos, nGlyphs)) { + parsedOk = gFalse; + return; + } + memcpy(fdSelect, file + pos, nGlyphs); + } else if (fdSelectFmt == 3) { + nRanges = getU16BE(pos, &parsedOk); + pos += 2; + gid0 = getU16BE(pos, &parsedOk); + pos += 2; + for (i = 1; i <= nRanges; ++i) { + fd = getU8(pos++, &parsedOk); + gid1 = getU16BE(pos, &parsedOk); + if (!parsedOk) { + return; + } + pos += 2; + if (gid0 > gid1 || gid1 > nGlyphs) { + //~ error(-1, "Bad FDSelect table in CID font"); + parsedOk = gFalse; + return; + } + for (j = gid0; j < gid1; ++j) { + fdSelect[j] = fd; + } + gid0 = gid1; + } + } else { + //~ error(-1, "Unknown FDSelect table format in CID font"); + for (i = 0; i < nGlyphs; ++i) { + fdSelect[i] = 0; + } + } + } +} + +void FoFiType1C::buildEncoding() { + char buf[256]; + int nCodes, nRanges, encFormat; + int pos, c, sid, nLeft, nSups, i, j; + + if (topDict.encodingOffset == 0) { + encoding = (char **)fofiType1StandardEncoding; + + } else if (topDict.encodingOffset == 1) { + encoding = (char **)fofiType1ExpertEncoding; + + } else { + encoding = (char **)gmallocn(256, sizeof(char *)); + for (i = 0; i < 256; ++i) { + encoding[i] = NULL; + } + pos = topDict.encodingOffset; + encFormat = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if ((encFormat & 0x7f) == 0) { + nCodes = 1 + getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if (nCodes > nGlyphs) { + nCodes = nGlyphs; + } + for (i = 1; i < nCodes && i < charsetLength; ++i) { + c = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if (encoding[c]) { + gfree(encoding[c]); + } + encoding[c] = copyString(getString(charset[i], buf, &parsedOk)); + } + } else if ((encFormat & 0x7f) == 1) { + nRanges = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + nCodes = 1; + for (i = 0; i < nRanges; ++i) { + c = getU8(pos++, &parsedOk); + nLeft = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + for (j = 0; j <= nLeft && nCodes < nGlyphs && nCodes < charsetLength; ++j) { + if (c < 256) { + if (encoding[c]) { + gfree(encoding[c]); + } + encoding[c] = copyString(getString(charset[nCodes], buf, + &parsedOk)); + } + ++nCodes; + ++c; + } + } + } + if (encFormat & 0x80) { + nSups = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + for (i = 0; i < nSups; ++i) { + c = getU8(pos++, &parsedOk);; + if (!parsedOk) { + return;; + } + sid = getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + return; + } + if (encoding[c]) { + gfree(encoding[c]); + } + encoding[c] = copyString(getString(sid, buf, &parsedOk)); + } + } + } +} + +GBool FoFiType1C::readCharset() { + int charsetFormat, c, pos; + int nLeft, i, j; + + if (topDict.charsetOffset == 0) { + charset = fofiType1CISOAdobeCharset; + charsetLength = sizeof(fofiType1CISOAdobeCharset) / sizeof(Gushort); + } else if (topDict.charsetOffset == 1) { + charset = fofiType1CExpertCharset; + charsetLength = sizeof(fofiType1CExpertCharset) / sizeof(Gushort); + } else if (topDict.charsetOffset == 2) { + charset = fofiType1CExpertSubsetCharset; + charsetLength = sizeof(fofiType1CExpertSubsetCharset) / sizeof(Gushort); + } else { + charset = (Gushort *)gmallocn(nGlyphs, sizeof(Gushort)); + charsetLength = nGlyphs; + for (i = 0; i < nGlyphs; ++i) { + charset[i] = 0; + } + pos = topDict.charsetOffset; + charsetFormat = getU8(pos++, &parsedOk); + if (charsetFormat == 0) { + for (i = 1; i < nGlyphs; ++i) { + charset[i] = (Gushort)getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + break; + } + } + } else if (charsetFormat == 1) { + i = 1; + while (i < nGlyphs) { + c = getU16BE(pos, &parsedOk); + pos += 2; + nLeft = getU8(pos++, &parsedOk); + if (!parsedOk) { + break; + } + for (j = 0; j <= nLeft && i < nGlyphs; ++j) { + charset[i++] = (Gushort)c++; + } + } + } else if (charsetFormat == 2) { + i = 1; + while (i < nGlyphs) { + c = getU16BE(pos, &parsedOk); + pos += 2; + nLeft = getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + break; + } + for (j = 0; j <= nLeft && i < nGlyphs; ++j) { + charset[i++] = (Gushort)c++; + } + } + } + if (!parsedOk) { + gfree(charset); + charset = NULL; + charsetLength = 0; + return gFalse; + } + } + return gTrue; +} + +int FoFiType1C::getOp(int pos, GBool charstring, GBool *ok) { + static char nybChars[16] = "0123456789.ee -"; + Type1COp op; + char buf[65]; + int b0, b1, nyb0, nyb1, x, i; + + b0 = getU8(pos++, ok); + op.isNum = gTrue; + op.isFP = gFalse; + + if (b0 == 28) { + x = getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + if (x & 0x8000) { + x |= ~0xffff; + } + op.num = x; + + } else if (!charstring && b0 == 29) { + x = getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + if (x & 0x80000000) { + x |= ~0xffffffff; + } + op.num = x; + + } else if (!charstring && b0 == 30) { + i = 0; + do { + b1 = getU8(pos++, ok); + nyb0 = b1 >> 4; + nyb1 = b1 & 0x0f; + if (nyb0 == 0xf) { + break; + } + buf[i++] = nybChars[nyb0]; + if (i == 64) { + break; + } + if (nyb0 == 0xc) { + buf[i++] = '-'; + } + if (i == 64) { + break; + } + if (nyb1 == 0xf) { + break; + } + buf[i++] = nybChars[nyb1]; + if (i == 64) { + break; + } + if (nyb1 == 0xc) { + buf[i++] = '-'; + } + } while (i < 64); + buf[i] = '\0'; + op.num = gatof(buf); + op.isFP = gTrue; + + } else if (b0 >= 32 && b0 <= 246) { + op.num = b0 - 139; + + } else if (b0 >= 247 && b0 <= 250) { + op.num = ((b0 - 247) << 8) + getU8(pos++, ok) + 108; + + } else if (b0 >= 251 && b0 <= 254) { + op.num = -((b0 - 251) << 8) - getU8(pos++, ok) - 108; + + } else if (charstring && b0 == 255) { + x = getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + if (x & 0x80000000) { + x |= ~0xffffffff; + } + op.num = (double)x / 65536.0; + op.isFP = gTrue; + + } else if (b0 == 12) { + op.isNum = gFalse; + op.op = 0x0c00 + getU8(pos++, ok); + + } else { + op.isNum = gFalse; + op.op = b0; + } + + if (nOps < 49) { + ops[nOps++] = op; + } + + return pos; +} + +// Convert the delta-encoded ops array to an array of ints. +int FoFiType1C::getDeltaIntArray(int *arr, int maxLen) { + int x; + int n, i; + + if ((n = nOps) > maxLen) { + n = maxLen; + } + x = 0; + for (i = 0; i < n; ++i) { + x += (int)ops[i].num; + arr[i] = x; + } + return n; +} + +// Convert the delta-encoded ops array to an array of doubles. +int FoFiType1C::getDeltaFPArray(double *arr, int maxLen) { + double x; + int n, i; + + if ((n = nOps) > maxLen) { + n = maxLen; + } + x = 0; + for (i = 0; i < n; ++i) { + x += ops[i].num; + arr[i] = x; + } + return n; +} + +void FoFiType1C::getIndex(int pos, Type1CIndex *idx, GBool *ok) { + idx->pos = pos; + idx->len = getU16BE(pos, ok); + if (idx->len == 0) { + // empty indexes are legal and contain just the length field + idx->offSize = 0; + idx->startPos = idx->endPos = pos + 2; + } else { + idx->offSize = getU8(pos + 2, ok); + if (idx->offSize < 1 || idx->offSize > 4) { + *ok = gFalse; + } + idx->startPos = pos + 3 + (idx->len + 1) * idx->offSize - 1; + if (idx->startPos < 0 || idx->startPos >= len) { + *ok = gFalse; + } + idx->endPos = idx->startPos + getUVarBE(pos + 3 + idx->len * idx->offSize, + idx->offSize, ok); + if (idx->endPos < idx->startPos || idx->endPos > len) { + *ok = gFalse; + } + } +} + +void FoFiType1C::getIndexVal(Type1CIndex *idx, int i, + Type1CIndexVal *val, GBool *ok) { + int pos0, pos1; + + if (i < 0 || i >= idx->len) { + *ok = gFalse; + return; + } + pos0 = idx->startPos + getUVarBE(idx->pos + 3 + i * idx->offSize, + idx->offSize, ok); + pos1 = idx->startPos + getUVarBE(idx->pos + 3 + (i + 1) * idx->offSize, + idx->offSize, ok); + if (pos0 < idx->startPos || pos0 > idx->endPos || + pos1 <= idx->startPos || pos1 > idx->endPos || + pos1 < pos0) { + *ok = gFalse; + } + val->pos = pos0; + val->len = pos1 - pos0; +} + +char *FoFiType1C::getString(int sid, char *buf, GBool *ok) { + Type1CIndexVal val; + int n; + + if (sid < 0) { + buf[0] = '\0'; + } else if (sid < 391) { + strcpy(buf, fofiType1CStdStrings[sid]); + } else { + sid -= 391; + getIndexVal(&stringIdx, sid, &val, ok); + if (*ok) { + if ((n = val.len) > 255) { + n = 255; + } + strncpy(buf, (char *)&file[val.pos], n); + buf[n] = '\0'; + } else { + buf[0] = '\0'; + } + } + return buf; +} diff --git a/fofi/FoFiType1C.h b/fofi/FoFiType1C.h new file mode 100644 index 0000000..698dccd --- /dev/null +++ b/fofi/FoFiType1C.h @@ -0,0 +1,266 @@ +//======================================================================== +// +// FoFiType1C.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de> +// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef FOFITYPE1C_H +#define FOFITYPE1C_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "FoFiBase.h" + +class GooString; + +//------------------------------------------------------------------------ + +struct Type1CIndex { + int pos; // absolute position in file + int len; // length (number of entries) + int offSize; // offset size + int startPos; // position of start of index data - 1 + int endPos; // position one byte past end of the index +}; + +struct Type1CIndexVal { + int pos; // absolute position in file + int len; // length, in bytes +}; + +struct Type1CTopDict { + int firstOp; + + int versionSID; + int noticeSID; + int copyrightSID; + int fullNameSID; + int familyNameSID; + int weightSID; + int isFixedPitch; + double italicAngle; + double underlinePosition; + double underlineThickness; + int paintType; + int charstringType; + double fontMatrix[6]; + GBool hasFontMatrix; // CID fonts are allowed to put their + // FontMatrix in the FD instead of the + // top dict + int uniqueID; + double fontBBox[4]; + double strokeWidth; + int charsetOffset; + int encodingOffset; + int charStringsOffset; + int privateSize; + int privateOffset; + + // CIDFont entries + int registrySID; + int orderingSID; + int supplement; + int fdArrayOffset; + int fdSelectOffset; +}; + +#define type1CMaxBlueValues 14 +#define type1CMaxOtherBlues 10 +#define type1CMaxStemSnap 12 + +struct Type1CPrivateDict { + double fontMatrix[6]; + GBool hasFontMatrix; + int blueValues[type1CMaxBlueValues]; + int nBlueValues; + int otherBlues[type1CMaxOtherBlues]; + int nOtherBlues; + int familyBlues[type1CMaxBlueValues]; + int nFamilyBlues; + int familyOtherBlues[type1CMaxOtherBlues]; + int nFamilyOtherBlues; + double blueScale; + int blueShift; + int blueFuzz; + double stdHW; + GBool hasStdHW; + double stdVW; + GBool hasStdVW; + double stemSnapH[type1CMaxStemSnap]; + int nStemSnapH; + double stemSnapV[type1CMaxStemSnap]; + int nStemSnapV; + GBool forceBold; + GBool hasForceBold; + double forceBoldThreshold; + int languageGroup; + double expansionFactor; + int initialRandomSeed; + int subrsOffset; + double defaultWidthX; + GBool defaultWidthXFP; + double nominalWidthX; + GBool nominalWidthXFP; +}; + +struct Type1COp { + GBool isNum; // true -> number, false -> operator + GBool isFP; // true -> floating point number, false -> int + union { + double num; // if num is true + int op; // if num is false + }; +}; + +struct Type1CEexecBuf { + FoFiOutputFunc outputFunc; + void *outputStream; + GBool ascii; // ASCII encoding? + Gushort r1; // eexec encryption key + int line; // number of eexec chars left on current line +}; + +//------------------------------------------------------------------------ +// FoFiType1C +//------------------------------------------------------------------------ + +class FoFiType1C: public FoFiBase { +public: + + // Create a FoFiType1C object from a memory buffer. + static FoFiType1C *make(char *fileA, int lenA); + + // Create a FoFiType1C object from a file on disk. + static FoFiType1C *load(char *fileName); + + virtual ~FoFiType1C(); + + // Return the font name. + char *getName(); + + // Return the encoding, as an array of 256 names (any of which may + // be NULL). This is only useful with 8-bit fonts. + char **getEncoding(); + + // Get the glyph names. + int getNumGlyphs() { return nGlyphs; } + GooString *getGlyphName(int gid); + + // Return the mapping from CIDs to GIDs, and return the number of + // CIDs in *<nCIDs>. This is only useful for CID fonts. + int *getCIDToGIDMap(int *nCIDs); + + // Return the font matrix as an array of six numbers. + void getFontMatrix(double *mat); + + // Convert to a Type 1 font, suitable for embedding in a PostScript + // file. This is only useful with 8-bit fonts. If <newEncoding> is + // not NULL, it will be used in place of the encoding in the Type 1C + // font. If <ascii> is true the eexec section will be hex-encoded, + // otherwise it will be left as binary data. If <psName> is non-NULL, + // it will be used as the PostScript font name. + void convertToType1(char *psName, const char **newEncoding, GBool ascii, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 CIDFont, suitable for embedding in a + // PostScript file. <psName> will be used as the PostScript font + // name. There are three cases for the CID-to-GID mapping: + // (1) if <codeMap> is non-NULL, then it is the CID-to-GID mapping + // (2) if <codeMap> is NULL and this is a CID CFF font, then the + // font's internal CID-to-GID mapping is used + // (3) is <codeMap> is NULL and this is an 8-bit CFF font, then + // the identity CID-to-GID mapping is used + void convertToCIDType0(char *psName, int *codeMap, int nCodes, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. <psName> will be used as the + // PostScript font name. There are three cases for the CID-to-GID + // mapping: + // (1) if <codeMap> is non-NULL, then it is the CID-to-GID mapping + // (2) if <codeMap> is NULL and this is a CID CFF font, then the + // font's internal CID-to-GID mapping is used + // (3) is <codeMap> is NULL and this is an 8-bit CFF font, then + // the identity CID-to-GID mapping is used + void convertToType0(char *psName, int *codeMap, int nCodes, + FoFiOutputFunc outputFunc, void *outputStream); + +private: + + FoFiType1C(char *fileA, int lenA, GBool freeFileDataA); + void eexecCvtGlyph(Type1CEexecBuf *eb, const char *glyphName, + int offset, int nBytes, + Type1CIndex *subrIdx, + Type1CPrivateDict *pDict); + void cvtGlyph(int offset, int nBytes, GooString *charBuf, + Type1CIndex *subrIdx, Type1CPrivateDict *pDict, + GBool top); + void cvtGlyphWidth(GBool useOp, GooString *charBuf, + Type1CPrivateDict *pDict); + void cvtNum(double x, GBool isFP, GooString *charBuf); + void eexecWrite(Type1CEexecBuf *eb, const char *s); + void eexecWriteCharstring(Type1CEexecBuf *eb, Guchar *s, int n); + void writePSString(char *s, FoFiOutputFunc outputFunc, void *outputStream); + GBool parse(); + void readTopDict(); + void readFD(int offset, int length, Type1CPrivateDict *pDict); + void readPrivateDict(int offset, int length, Type1CPrivateDict *pDict); + void readFDSelect(); + void buildEncoding(); + GBool readCharset(); + int getOp(int pos, GBool charstring, GBool *ok); + int getDeltaIntArray(int *arr, int maxLen); + int getDeltaFPArray(double *arr, int maxLen); + void getIndex(int pos, Type1CIndex *idx, GBool *ok); + void getIndexVal(Type1CIndex *idx, int i, Type1CIndexVal *val, GBool *ok); + char *getString(int sid, char *buf, GBool *ok); + + GooString *name; + char **encoding; + + Type1CIndex nameIdx; + Type1CIndex topDictIdx; + Type1CIndex stringIdx; + Type1CIndex gsubrIdx; + Type1CIndex charStringsIdx; + + Type1CTopDict topDict; + Type1CPrivateDict *privateDicts; + + int nGlyphs; + int nFDs; + Guchar *fdSelect; + Gushort *charset; + Gushort charsetLength; + int gsubrBias; + + GBool parsedOk; + + Type1COp ops[49]; // operands and operator + int nOps; // number of operands + int nHints; // number of hints for the current glyph + GBool firstOp; // true if we haven't hit the first op yet + GBool openPath; // true if there is an unclosed path +}; + +#endif diff --git a/fofi/Makefile.am b/fofi/Makefile.am new file mode 100644 index 0000000..c4654dd --- /dev/null +++ b/fofi/Makefile.am @@ -0,0 +1,28 @@ +INCLUDES = \ + -I$(top_srcdir) + +noinst_LTLIBRARIES = libfofi.la + +if ENABLE_XPDF_HEADERS +poppler_fofi_includedir = $(includedir)/poppler/fofi +poppler_fofi_include_HEADERS = \ + FoFiBase.h \ + FoFiEncodings.h \ + FoFiTrueType.h \ + FoFiType1.h \ + FoFiIdentifier.h \ + FoFiType1C.h +endif + +libfofi_la_SOURCES = \ + FoFiBase.cc \ + FoFiBase.h \ + FoFiEncodings.cc \ + FoFiEncodings.h \ + FoFiTrueType.cc \ + FoFiTrueType.h \ + FoFiType1.cc \ + FoFiType1.h \ + FoFiType1C.cc \ + FoFiIdentifier.cc \ + FoFiType1C.h diff --git a/fofi/Makefile.in b/fofi/Makefile.in new file mode 100644 index 0000000..21bf6ef --- /dev/null +++ b/fofi/Makefile.in @@ -0,0 +1,707 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = fofi +DIST_COMMON = $(am__poppler_fofi_include_HEADERS_DIST) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libfofi_la_LIBADD = +am_libfofi_la_OBJECTS = FoFiBase.lo FoFiEncodings.lo FoFiTrueType.lo \ + FoFiType1.lo FoFiType1C.lo FoFiIdentifier.lo +libfofi_la_OBJECTS = $(am_libfofi_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libfofi_la_SOURCES) +DIST_SOURCES = $(libfofi_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__poppler_fofi_include_HEADERS_DIST = FoFiBase.h FoFiEncodings.h \ + FoFiTrueType.h FoFiType1.h FoFiIdentifier.h FoFiType1C.h +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(poppler_fofi_includedir)" +HEADERS = $(poppler_fofi_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +INCLUDES = \ + -I$(top_srcdir) + +noinst_LTLIBRARIES = libfofi.la +@ENABLE_XPDF_HEADERS_TRUE@poppler_fofi_includedir = $(includedir)/poppler/fofi +@ENABLE_XPDF_HEADERS_TRUE@poppler_fofi_include_HEADERS = \ +@ENABLE_XPDF_HEADERS_TRUE@ FoFiBase.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FoFiEncodings.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FoFiTrueType.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FoFiType1.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FoFiIdentifier.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FoFiType1C.h + +libfofi_la_SOURCES = \ + FoFiBase.cc \ + FoFiBase.h \ + FoFiEncodings.cc \ + FoFiEncodings.h \ + FoFiTrueType.cc \ + FoFiTrueType.h \ + FoFiType1.cc \ + FoFiType1.h \ + FoFiType1C.cc \ + FoFiIdentifier.cc \ + FoFiType1C.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fofi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign fofi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libfofi.la: $(libfofi_la_OBJECTS) $(libfofi_la_DEPENDENCIES) $(EXTRA_libfofi_la_DEPENDENCIES) + $(AM_V_CXXLD)$(CXXLINK) $(libfofi_la_OBJECTS) $(libfofi_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiBase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiEncodings.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiIdentifier.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiTrueType.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiType1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FoFiType1C.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-poppler_fofi_includeHEADERS: $(poppler_fofi_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_fofi_include_HEADERS)'; test -n "$(poppler_fofi_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_fofi_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_fofi_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_fofi_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_fofi_includedir)" || exit $$?; \ + done + +uninstall-poppler_fofi_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_fofi_include_HEADERS)'; test -n "$(poppler_fofi_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_fofi_includedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(poppler_fofi_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-poppler_fofi_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-poppler_fofi_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-poppler_fofi_includeHEADERS \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-poppler_fofi_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/glib/CMakeLists.txt b/glib/CMakeLists.txt new file mode 100644 index 0000000..92e23bd --- /dev/null +++ b/glib/CMakeLists.txt @@ -0,0 +1,129 @@ +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${GLIB2_INCLUDE_DIRS} + ${CAIRO_INCLUDE_DIRS} +) +add_definitions( + -DG_LOG_DOMAIN=\"Poppler\" + ${GLIB2_CFLAGS_OTHER} + ${CAIRO_CFLAGS} + ${POPPLER_GLIB_DISABLE_DEPRECATED} + ${POPPLER_GLIB_DISABLE_SINGLE_INCLUDES} +) + +configure_file(poppler-features.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/poppler-features.h @ONLY) + +if (GTK_FOUND AND BUILD_GTK_TESTS) + add_subdirectory(demo) +endif (GTK_FOUND AND BUILD_GTK_TESTS) + +set(poppler_glib_public_headers + poppler-action.h + poppler-date.h + poppler-document.h + poppler-page.h + poppler-attachment.h + poppler-form-field.h + poppler-annot.h + poppler-layer.h + poppler-movie.h + poppler-media.h + poppler.h +) + +find_program(GLIB2_MKENUMS glib-mkenums) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h + COMMAND ${GLIB2_MKENUMS} + ARGS + --template poppler-enums.h.template + ${poppler_glib_public_headers} > ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${poppler_glib_public_headers} + ${CMAKE_CURRENT_SOURCE_DIR}/poppler-enums.h.template +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c + COMMAND ${GLIB2_MKENUMS} + ARGS + --template poppler-enums.c.template + ${poppler_glib_public_headers} > ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${poppler_glib_public_headers} ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h + ${CMAKE_CURRENT_SOURCE_DIR}/poppler-enums.c.template +) + + +set(poppler_glib_SRCS + poppler-action.cc + poppler-date.cc + poppler-document.cc + poppler-page.cc + poppler-attachment.cc + poppler-form-field.cc + poppler-annot.cc + poppler-layer.cc + poppler-movie.cc + poppler-media.cc + poppler.cc +) +set(poppler_glib_generated_SRCS + ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c + ${CMAKE_SOURCE_DIR}/poppler/CairoFontEngine.cc + ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc + ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.cc +) +add_library(poppler-glib SHARED ${poppler_glib_SRCS} ${poppler_glib_generated_SRCS}) +set_target_properties(poppler-glib PROPERTIES VERSION 8.4.0 SOVERSION 8) +target_link_libraries(poppler-glib poppler ${GLIB2_LIBRARIES} ${CAIRO_LIBRARIES} ${FREETYPE_LIBRARIES}) +install(TARGETS poppler-glib RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) + +install(FILES + ${poppler_glib_public_headers} + ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h + ${CMAKE_CURRENT_BINARY_DIR}/poppler-features.h + DESTINATION include/poppler/glib) + +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + "${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c" +) + + +macro(_list_prefix _outvar _listvar _prefix) + set(${_outvar}) + foreach(_item IN LISTS ${_listvar}) + list(APPEND ${_outvar} ${_prefix}${_item}) + endforeach() +endmacro(_list_prefix) + +# GObject Introspection +if (HAVE_INTROSPECTION) + include(GObjectIntrospectionMacros) + set(INTROSPECTION_GIRS) + set(INTROSPECTION_SCANNER_ARGS "--add-include-path=${CMAKE_CURRENT_SOURCE_DIR}") + set(INTROSPECTION_COMPILER_ARGS "--includedir=${CMAKE_CURRENT_SOURCE_DIR}") + + set(introspection_files ${poppler_glib_SRCS} ${poppler_glib_public_headers}) + set(Poppler_0_18_gir "poppler-glib") + set(Poppler_0_18_gir_INCLUDES GObject-2.0 cairo-1.0) + get_directory_property(_tmp_includes INCLUDE_DIRECTORIES) + _list_prefix(_includes _tmp_includes "-I") + set(Poppler_0_18_gir_CFLAGS ${_includes}) + set(Poppler_0_18_gir_LIBS poppler-glib) + _list_prefix(_abs_introspection_files introspection_files "${CMAKE_CURRENT_SOURCE_DIR}/") + list(APPEND _abs_introspection_files + ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.c + ${CMAKE_CURRENT_BINARY_DIR}/poppler-enums.h + ${CMAKE_CURRENT_BINARY_DIR}/poppler-features.h + ) + set(Poppler_0_18_gir_FILES ${_abs_introspection_files}) + set(Poppler_0_18_gir_SCANNERFLAGS --c-include poppler.h) + set(Poppler_0_18_gir_EXPORT_PACKAGES poppler-glib) + + list(APPEND INTROSPECTION_GIRS Poppler-0.18.gir) + + gir_add_introspections(INTROSPECTION_GIRS) +endif () diff --git a/glib/Makefile.am b/glib/Makefile.am new file mode 100644 index 0000000..83c724f --- /dev/null +++ b/glib/Makefile.am @@ -0,0 +1,112 @@ +AM_LDFLAGS = @auto_import_flags@ + +SUBDIRS = . reference demo +INCLUDES = \ + -DG_LOG_DOMAIN=\"Poppler\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + $(POPPLER_GLIB_CFLAGS) \ + $(FREETYPE_CFLAGS) \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_GLIB_DISABLE_DEPRECATED) \ + $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES) + +stamp_files = stamp-poppler-enums.h + +poppler-enums.h: stamp-poppler-enums.h + @true + +stamp-poppler-enums.h: poppler-enums.h.template $(poppler_glib_public_headers) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbh \ + && (cmp -s xgen-etbh poppler-enums.h || cp xgen-etbh poppler-enums.h ) \ + && rm -f xgen-etbh \ + && echo timestamp > $(@F) + +poppler-enums.c: poppler-enums.c.template $(poppler_glib_public_headers) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbc \ + && (cmp -s xgen-etbc poppler-enums.c || cp xgen-etbc poppler-enums.c ) \ + && rm -f xgen-etbc + +EXTRA_DIST = \ + poppler-enums.h.template \ + poppler-enums.c.template + +poppler_glib_public_headers = \ + poppler-action.h \ + poppler-date.h \ + poppler-document.h \ + poppler-page.h \ + poppler-attachment.h \ + poppler-form-field.h \ + poppler-annot.h \ + poppler-layer.h \ + poppler-media.h \ + poppler-movie.h \ + poppler.h + +poppler_glib_includedir = $(includedir)/poppler/glib + +poppler_glib_include_HEADERS = \ + $(poppler_glib_public_headers) \ + poppler-enums.h +nodist_poppler_glib_include_HEADERS = poppler-features.h + +lib_LTLIBRARIES = libpoppler-glib.la +libpoppler_glib_la_SOURCES = \ + $(BUILT_SOURCES) \ + poppler-action.cc \ + poppler-date.cc \ + poppler-document.cc \ + poppler-page.cc \ + poppler-attachment.cc \ + poppler-form-field.cc \ + poppler-annot.cc \ + poppler-layer.cc \ + poppler-media.cc \ + poppler-movie.cc \ + poppler.cc \ + poppler-private.h + +libpoppler_glib_la_LIBADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(POPPLER_GLIB_LIBS) \ + $(FREETYPE_LIBS) \ + $(FONTCONFIG_LIBS) + +libpoppler_glib_la_LDFLAGS = -version-info 12:0:4 @create_shared_lib@ @auto_import_flags@ + +BUILT_SOURCES = \ + poppler-enums.c \ + poppler-enums.h + +CLEANFILES = $(BUILT_SOURCES) $(stamp_files) +DISTCLEANFILES = $(BUILT_SOURCES) $(stamp_files) +MAINTAINERCLEANFILES = $(BUILT_SOURCES) $(stamp_files) + +# GObject Introspection +if HAVE_INTROSPECTION +-include $(INTROSPECTION_MAKEFILE) +INTROSPECTION_GIRS = +INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) +INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) + +introspection_files = $(filter-out poppler-private.h, $(libpoppler_glib_la_SOURCES)) $(poppler_glib_include_HEADERS) $(nodist_poppler_glib_include_HEADERS) +Poppler-0.18.gir: libpoppler-glib.la +Poppler_0_18_gir_INCLUDES = GObject-2.0 cairo-1.0 +Poppler_0_18_gir_CFLAGS = $(INCLUDES) -I$(top_builddir) +Poppler_0_18_gir_LIBS = libpoppler-glib.la +Poppler_0_18_gir_FILES = $(introspection_files) +Poppler_0_18_gir_SCANNERFLAGS = --c-include poppler.h +Poppler_0_18_gir_EXPORT_PACKAGES = poppler-glib + +INTROSPECTION_GIRS += Poppler-0.18.gir + +girdir = $(datadir)/gir-1.0 +dist_gir_DATA = $(INTROSPECTION_GIRS) + +typelibsdir = $(libdir)/girepository-1.0 +typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) + +CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA) +endif #HAVE_INTROSPECTION diff --git a/glib/Makefile.in b/glib/Makefile.in new file mode 100644 index 0000000..8fa399c --- /dev/null +++ b/glib/Makefile.in @@ -0,0 +1,1080 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_INTROSPECTION_TRUE@am__append_1 = $(dist_gir_DATA) $(typelibs_DATA) +subdir = glib +DIST_COMMON = $(am__dist_gir_DATA_DIST) \ + $(poppler_glib_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/poppler-features.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = poppler-features.h +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \ + "$(DESTDIR)$(typelibsdir)" \ + "$(DESTDIR)$(poppler_glib_includedir)" \ + "$(DESTDIR)$(poppler_glib_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libpoppler_glib_la_DEPENDENCIES = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__objects_1 = poppler-enums.lo +am_libpoppler_glib_la_OBJECTS = $(am__objects_1) poppler-action.lo \ + poppler-date.lo poppler-document.lo poppler-page.lo \ + poppler-attachment.lo poppler-form-field.lo poppler-annot.lo \ + poppler-layer.lo poppler-media.lo poppler-movie.lo poppler.lo +libpoppler_glib_la_OBJECTS = $(am_libpoppler_glib_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libpoppler_glib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(libpoppler_glib_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libpoppler_glib_la_SOURCES) +DIST_SOURCES = $(libpoppler_glib_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__dist_gir_DATA_DIST = Poppler-0.18.gir +DATA = $(dist_gir_DATA) $(typelibs_DATA) +HEADERS = $(nodist_poppler_glib_include_HEADERS) \ + $(poppler_glib_include_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +AM_LDFLAGS = @auto_import_flags@ +SUBDIRS = . reference demo +INCLUDES = \ + -DG_LOG_DOMAIN=\"Poppler\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + $(POPPLER_GLIB_CFLAGS) \ + $(FREETYPE_CFLAGS) \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_GLIB_DISABLE_DEPRECATED) \ + $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES) + +stamp_files = stamp-poppler-enums.h +EXTRA_DIST = \ + poppler-enums.h.template \ + poppler-enums.c.template + +poppler_glib_public_headers = \ + poppler-action.h \ + poppler-date.h \ + poppler-document.h \ + poppler-page.h \ + poppler-attachment.h \ + poppler-form-field.h \ + poppler-annot.h \ + poppler-layer.h \ + poppler-media.h \ + poppler-movie.h \ + poppler.h + +poppler_glib_includedir = $(includedir)/poppler/glib +poppler_glib_include_HEADERS = \ + $(poppler_glib_public_headers) \ + poppler-enums.h + +nodist_poppler_glib_include_HEADERS = poppler-features.h +lib_LTLIBRARIES = libpoppler-glib.la +libpoppler_glib_la_SOURCES = \ + $(BUILT_SOURCES) \ + poppler-action.cc \ + poppler-date.cc \ + poppler-document.cc \ + poppler-page.cc \ + poppler-attachment.cc \ + poppler-form-field.cc \ + poppler-annot.cc \ + poppler-layer.cc \ + poppler-media.cc \ + poppler-movie.cc \ + poppler.cc \ + poppler-private.h + +libpoppler_glib_la_LIBADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(POPPLER_GLIB_LIBS) \ + $(FREETYPE_LIBS) \ + $(FONTCONFIG_LIBS) + +libpoppler_glib_la_LDFLAGS = -version-info 12:0:4 @create_shared_lib@ @auto_import_flags@ +BUILT_SOURCES = \ + poppler-enums.c \ + poppler-enums.h + +CLEANFILES = $(BUILT_SOURCES) $(stamp_files) $(am__append_1) +DISTCLEANFILES = $(BUILT_SOURCES) $(stamp_files) +MAINTAINERCLEANFILES = $(BUILT_SOURCES) $(stamp_files) +@HAVE_INTROSPECTION_TRUE@INTROSPECTION_GIRS = Poppler-0.18.gir +@HAVE_INTROSPECTION_TRUE@INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) +@HAVE_INTROSPECTION_TRUE@INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) +@HAVE_INTROSPECTION_TRUE@introspection_files = $(filter-out poppler-private.h, $(libpoppler_glib_la_SOURCES)) $(poppler_glib_include_HEADERS) $(nodist_poppler_glib_include_HEADERS) +@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_INCLUDES = GObject-2.0 cairo-1.0 +@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_CFLAGS = $(INCLUDES) -I$(top_builddir) +@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_LIBS = libpoppler-glib.la +@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_FILES = $(introspection_files) +@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_SCANNERFLAGS = --c-include poppler.h +@HAVE_INTROSPECTION_TRUE@Poppler_0_18_gir_EXPORT_PACKAGES = poppler-glib +@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0 +@HAVE_INTROSPECTION_TRUE@dist_gir_DATA = $(INTROSPECTION_GIRS) +@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0 +@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign glib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +poppler-features.h: $(top_builddir)/config.status $(srcdir)/poppler-features.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libpoppler-glib.la: $(libpoppler_glib_la_OBJECTS) $(libpoppler_glib_la_DEPENDENCIES) $(EXTRA_libpoppler_glib_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libpoppler_glib_la_LINK) -rpath $(libdir) $(libpoppler_glib_la_OBJECTS) $(libpoppler_glib_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-action.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-annot.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-attachment.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-date.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-document.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-enums.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-form-field.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-layer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-media.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-movie.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-page.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-dist_girDATA: $(dist_gir_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \ + done + +uninstall-dist_girDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir) +install-typelibsDATA: $(typelibs_DATA) + @$(NORMAL_INSTALL) + @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(typelibsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(typelibsdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \ + done + +uninstall-typelibsDATA: + @$(NORMAL_UNINSTALL) + @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(typelibsdir)'; $(am__uninstall_files_from_dir) +install-nodist_poppler_glib_includeHEADERS: $(nodist_poppler_glib_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_glib_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_glib_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_glib_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_glib_includedir)" || exit $$?; \ + done + +uninstall-nodist_poppler_glib_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_glib_includedir)'; $(am__uninstall_files_from_dir) +install-poppler_glib_includeHEADERS: $(poppler_glib_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_glib_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_glib_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_glib_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_glib_includedir)" || exit $$?; \ + done + +uninstall-poppler_glib_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_glib_include_HEADERS)'; test -n "$(poppler_glib_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_glib_includedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(poppler_glib_includedir)" "$(DESTDIR)$(poppler_glib_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_girDATA \ + install-nodist_poppler_glib_includeHEADERS \ + install-poppler_glib_includeHEADERS install-typelibsDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_girDATA uninstall-libLTLIBRARIES \ + uninstall-nodist_poppler_glib_includeHEADERS \ + uninstall-poppler_glib_includeHEADERS uninstall-typelibsDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dist_girDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man \ + install-nodist_poppler_glib_includeHEADERS install-pdf \ + install-pdf-am install-poppler_glib_includeHEADERS install-ps \ + install-ps-am install-strip install-typelibsDATA installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-dist_girDATA uninstall-libLTLIBRARIES \ + uninstall-nodist_poppler_glib_includeHEADERS \ + uninstall-poppler_glib_includeHEADERS uninstall-typelibsDATA + + +poppler-enums.h: stamp-poppler-enums.h + @true + +stamp-poppler-enums.h: poppler-enums.h.template $(poppler_glib_public_headers) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbh \ + && (cmp -s xgen-etbh poppler-enums.h || cp xgen-etbh poppler-enums.h ) \ + && rm -f xgen-etbh \ + && echo timestamp > $(@F) + +poppler-enums.c: poppler-enums.c.template $(poppler_glib_public_headers) + $(AM_V_GEN) $(GLIB_MKENUMS) --template $< $(filter-out $<,$^) > xgen-etbc \ + && (cmp -s xgen-etbc poppler-enums.c || cp xgen-etbc poppler-enums.c ) \ + && rm -f xgen-etbc + +# GObject Introspection +@HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE) +@HAVE_INTROSPECTION_TRUE@Poppler-0.18.gir: libpoppler-glib.la + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/glib/Poppler-0.18.gir b/glib/Poppler-0.18.gir new file mode 100644 index 0000000..ca61465 --- /dev/null +++ b/glib/Poppler-0.18.gir @@ -0,0 +1,3998 @@ +<?xml version="1.0"?> +<!-- This file was automatically generated from C sources - DO NOT EDIT! +To affect the contents of this file, edit the original C definitions, +and/or use gtk-doc annotations. --> +<repository version="1.2" + xmlns="http://www.gtk.org/introspection/core/1.0" + xmlns:c="http://www.gtk.org/introspection/c/1.0" + xmlns:glib="http://www.gtk.org/introspection/glib/1.0"> + <include name="GLib" version="2.0"/> + <include name="GObject" version="2.0"/> + <include name="cairo" version="1.0"/> + <package name="poppler-glib"/> + <c:include name="poppler.h"/> + <namespace name="Poppler" + version="0.18" + shared-library="libpoppler-glib.so.8" + c:identifier-prefixes="Poppler" + c:symbol-prefixes="poppler"> + <constant name="ANNOT_TEXT_ICON_CIRCLE" + value="Circle" + c:type="POPPLER_ANNOT_TEXT_ICON_CIRCLE"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_COMMENT" + value="Comment" + c:type="POPPLER_ANNOT_TEXT_ICON_COMMENT"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_CROSS" + value="Cross" + c:type="POPPLER_ANNOT_TEXT_ICON_CROSS"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_HELP" + value="Help" + c:type="POPPLER_ANNOT_TEXT_ICON_HELP"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_INSERT" + value="Insert" + c:type="POPPLER_ANNOT_TEXT_ICON_INSERT"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_KEY" + value="Key" + c:type="POPPLER_ANNOT_TEXT_ICON_KEY"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_NEW_PARAGRAPH" + value="NewParagraph" + c:type="POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_NOTE" + value="Note" + c:type="POPPLER_ANNOT_TEXT_ICON_NOTE"> + <type name="utf8" c:type="gchar*"/> + </constant> + <constant name="ANNOT_TEXT_ICON_PARAGRAPH" + value="Paragraph" + c:type="POPPLER_ANNOT_TEXT_ICON_PARAGRAPH"> + <type name="utf8" c:type="gchar*"/> + </constant> + <union name="Action" + c:type="PopplerAction" + glib:type-name="PopplerAction" + glib:get-type="poppler_action_get_type" + c:symbol-prefix="action"> + <doc xml:whitespace="preserve">A data structure for holding actions</doc> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="any" writable="1"> + <type name="ActionAny" c:type="PopplerActionAny"/> + </field> + <field name="goto_dest" writable="1"> + <type name="ActionGotoDest" c:type="PopplerActionGotoDest"/> + </field> + <field name="goto_remote" writable="1"> + <type name="ActionGotoRemote" c:type="PopplerActionGotoRemote"/> + </field> + <field name="launch" writable="1"> + <type name="ActionLaunch" c:type="PopplerActionLaunch"/> + </field> + <field name="uri" writable="1"> + <type name="ActionUri" c:type="PopplerActionUri"/> + </field> + <field name="named" writable="1"> + <type name="ActionNamed" c:type="PopplerActionNamed"/> + </field> + <field name="movie" writable="1"> + <type name="ActionMovie" c:type="PopplerActionMovie"/> + </field> + <field name="rendition" writable="1"> + <type name="ActionRendition" c:type="PopplerActionRendition"/> + </field> + <field name="ocg_state" writable="1"> + <type name="ActionOCGState" c:type="PopplerActionOCGState"/> + </field> + <field name="javascript" writable="1"> + <type name="ActionJavascript" c:type="PopplerActionJavascript"/> + </field> + <method name="copy" c:identifier="poppler_action_copy"> + <doc xml:whitespace="preserve">Copies @action, creating an identical #PopplerAction.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new action identical to @action</doc> + <type name="Action" c:type="PopplerAction*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_action_free"> + <doc xml:whitespace="preserve">Frees @action</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </union> + <record name="ActionAny" c:type="PopplerActionAny"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + </record> + <record name="ActionGotoDest" c:type="PopplerActionGotoDest"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="dest" writable="1"> + <type name="Dest" c:type="PopplerDest*"/> + </field> + </record> + <record name="ActionGotoRemote" c:type="PopplerActionGotoRemote"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="file_name" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="dest" writable="1"> + <type name="Dest" c:type="PopplerDest*"/> + </field> + </record> + <record name="ActionJavascript" c:type="PopplerActionJavascript"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="script" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + </record> + <record name="ActionLaunch" c:type="PopplerActionLaunch"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="file_name" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="params" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + </record> + <record name="ActionLayer" c:type="PopplerActionLayer"> + <doc xml:whitespace="preserve">Action to perform over a list of layers</doc> + <field name="action" writable="1"> + <type name="ActionLayerAction" c:type="PopplerActionLayerAction"/> + </field> + <field name="layers" writable="1"> + <type name="GLib.List" c:type="GList*"> + <type name="gpointer" c:type="gpointer"/> + </type> + </field> + </record> + <enumeration name="ActionLayerAction" + version="0.14" + glib:type-name="PopplerActionLayerAction" + glib:get-type="poppler_action_layer_action_get_type" + c:type="PopplerActionLayerAction"> + <doc xml:whitespace="preserve">Layer actions</doc> + <member name="on" + value="0" + c:identifier="POPPLER_ACTION_LAYER_ON" + glib:nick="on"/> + <member name="off" + value="1" + c:identifier="POPPLER_ACTION_LAYER_OFF" + glib:nick="off"/> + <member name="toggle" + value="2" + c:identifier="POPPLER_ACTION_LAYER_TOGGLE" + glib:nick="toggle"/> + </enumeration> + <record name="ActionMovie" c:type="PopplerActionMovie"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="operation" writable="1"> + <type name="ActionMovieOperation" + c:type="PopplerActionMovieOperation"/> + </field> + <field name="movie" writable="1"> + <type name="Movie" c:type="PopplerMovie*"/> + </field> + </record> + <enumeration name="ActionMovieOperation" + version="0.14" + glib:type-name="PopplerActionMovieOperation" + glib:get-type="poppler_action_movie_operation_get_type" + c:type="PopplerActionMovieOperation"> + <doc xml:whitespace="preserve">Movie operations</doc> + <member name="play" + value="0" + c:identifier="POPPLER_ACTION_MOVIE_PLAY" + glib:nick="play"/> + <member name="pause" + value="1" + c:identifier="POPPLER_ACTION_MOVIE_PAUSE" + glib:nick="pause"/> + <member name="resume" + value="2" + c:identifier="POPPLER_ACTION_MOVIE_RESUME" + glib:nick="resume"/> + <member name="stop" + value="3" + c:identifier="POPPLER_ACTION_MOVIE_STOP" + glib:nick="stop"/> + </enumeration> + <record name="ActionNamed" c:type="PopplerActionNamed"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="named_dest" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + </record> + <record name="ActionOCGState" c:type="PopplerActionOCGState"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="state_list" writable="1"> + <type name="GLib.List" c:type="GList*"> + <type name="gpointer" c:type="gpointer"/> + </type> + </field> + </record> + <record name="ActionRendition" c:type="PopplerActionRendition"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="op" writable="1"> + <type name="gint" c:type="gint"/> + </field> + <field name="media" writable="1"> + <type name="Media" c:type="PopplerMedia*"/> + </field> + </record> + <enumeration name="ActionType" + glib:type-name="PopplerActionType" + glib:get-type="poppler_action_type_get_type" + c:type="PopplerActionType"> + <doc xml:whitespace="preserve">Action types</doc> + <member name="unknown" + value="0" + c:identifier="POPPLER_ACTION_UNKNOWN" + glib:nick="unknown"/> + <member name="none" + value="1" + c:identifier="POPPLER_ACTION_NONE" + glib:nick="none"/> + <member name="goto_dest" + value="2" + c:identifier="POPPLER_ACTION_GOTO_DEST" + glib:nick="goto-dest"/> + <member name="goto_remote" + value="3" + c:identifier="POPPLER_ACTION_GOTO_REMOTE" + glib:nick="goto-remote"/> + <member name="launch" + value="4" + c:identifier="POPPLER_ACTION_LAUNCH" + glib:nick="launch"/> + <member name="uri" + value="5" + c:identifier="POPPLER_ACTION_URI" + glib:nick="uri"/> + <member name="named" + value="6" + c:identifier="POPPLER_ACTION_NAMED" + glib:nick="named"/> + <member name="movie" + value="7" + c:identifier="POPPLER_ACTION_MOVIE" + glib:nick="movie"/> + <member name="rendition" + value="8" + c:identifier="POPPLER_ACTION_RENDITION" + glib:nick="rendition"/> + <member name="ocg_state" + value="9" + c:identifier="POPPLER_ACTION_OCG_STATE" + glib:nick="ocg-state"/> + <member name="javascript" + value="10" + c:identifier="POPPLER_ACTION_JAVASCRIPT" + glib:nick="javascript"/> + </enumeration> + <record name="ActionUri" c:type="PopplerActionUri"> + <field name="type" writable="1"> + <type name="ActionType" c:type="PopplerActionType"/> + </field> + <field name="title" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="uri" writable="1"> + <type name="utf8" c:type="char*"/> + </field> + </record> + <class name="Annot" + c:symbol-prefix="annot" + c:type="PopplerAnnot" + parent="GObject.Object" + glib:type-name="PopplerAnnot" + glib:get-type="poppler_annot_get_type"> + <method name="get_annot_type" + c:identifier="poppler_annot_get_annot_type"> + <doc xml:whitespace="preserve">Gets the type of @poppler_annot</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerAnnotType of @poppler_annot.</doc> + <type name="AnnotType" c:type="PopplerAnnotType"/> + </return-value> + </method> + <method name="get_color" c:identifier="poppler_annot_get_color"> + <doc xml:whitespace="preserve">Retrieves the color of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated #PopplerColor with the color values of @poppler_annot, or %NULL. It must be freed with g_free() when done.</doc> + <type name="Color" c:type="PopplerColor*"/> + </return-value> + </method> + <method name="get_contents" c:identifier="poppler_annot_get_contents"> + <doc xml:whitespace="preserve">Retrieves the contents of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string with the contents of @poppler_annot. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_flags" c:identifier="poppler_annot_get_flags"> + <doc xml:whitespace="preserve">Retrieves the flag field specifying various characteristics of the +@poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the flag field of @poppler_annot.</doc> + <type name="AnnotFlag" c:type="PopplerAnnotFlag"/> + </return-value> + </method> + <method name="get_modified" c:identifier="poppler_annot_get_modified"> + <doc xml:whitespace="preserve">Retrieves the last modification data of @poppler_annot. The returned +string will be either a PDF format date or a text string. +See also #poppler_date_parse()</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string with the last modification data of @poppler_annot. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_name" c:identifier="poppler_annot_get_name"> + <doc xml:whitespace="preserve">Retrieves the name of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string with the name of @poppler_annot. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_page_index" + c:identifier="poppler_annot_get_page_index" + version="0.14"> + <doc xml:whitespace="preserve">Returns the page index to which @poppler_annot is associated, or -1 if unknown</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">page index or -1</doc> + <type name="gint" c:type="gint"/> + </return-value> + </method> + <method name="set_color" + c:identifier="poppler_annot_set_color" + version="0.16"> + <doc xml:whitespace="preserve">Sets the color of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="poppler_color" + transfer-ownership="none" + allow-none="1"> + <doc xml:whitespace="preserve">a #PopplerColor, or %NULL</doc> + <type name="Color" c:type="PopplerColor*"/> + </parameter> + </parameters> + </method> + <method name="set_contents" + c:identifier="poppler_annot_set_contents" + version="0.12"> + <doc xml:whitespace="preserve">Sets the contents of @poppler_annot to the given value, +replacing the current contents.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="contents" transfer-ownership="none"> + <doc xml:whitespace="preserve">a text string containing the new contents</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + </parameters> + </method> + </class> + <record name="AnnotCalloutLine" + c:type="PopplerAnnotCalloutLine" + glib:type-name="PopplerAnnotCalloutLine" + glib:get-type="poppler_annot_callout_line_get_type" + c:symbol-prefix="annot_callout_line"> + <field name="multiline" writable="1"> + <type name="gboolean" c:type="gboolean"/> + </field> + <field name="x1" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="y1" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="x2" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="y2" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="x3" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="y3" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <constructor name="new" c:identifier="poppler_annot_callout_line_new"> + <doc xml:whitespace="preserve">Creates a new empty #PopplerAnnotCalloutLine.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated #PopplerAnnotCalloutLine, %NULL in other case. It must be freed when done.</doc> + <type name="AnnotCalloutLine" c:type="PopplerAnnotCalloutLine*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_annot_callout_line_copy"> + <doc xml:whitespace="preserve">It does copy @callout to a new #PopplerAnnotCalloutLine.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated #PopplerAnnotCalloutLine as exact copy of @callout, %NULL in other case. It must be freed when done.</doc> + <type name="AnnotCalloutLine" c:type="PopplerAnnotCalloutLine*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_annot_callout_line_free"> + <doc xml:whitespace="preserve">Frees the memory used by #PopplerAnnotCalloutLine.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <enumeration name="AnnotExternalDataType" + glib:type-name="PopplerAnnotExternalDataType" + glib:get-type="poppler_annot_external_data_type_get_type" + c:type="PopplerAnnotExternalDataType"> + <member name="3d" + value="0" + c:identifier="POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D" + glib:nick="3d"/> + <member name="unknown" + value="1" + c:identifier="POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN" + glib:nick="unknown"/> + </enumeration> + <class name="AnnotFileAttachment" + c:symbol-prefix="annot_file_attachment" + c:type="PopplerAnnotFileAttachment" + parent="AnnotMarkup" + glib:type-name="PopplerAnnotFileAttachment" + glib:get-type="poppler_annot_file_attachment_get_type"> + <method name="get_attachment" + c:identifier="poppler_annot_file_attachment_get_attachment" + version="0.14"> + <doc xml:whitespace="preserve">Creates a #PopplerAttachment for the file of the file attachment annotation @annot. +The #PopplerAttachment must be unrefed with g_object_unref by the caller.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">@PopplerAttachment</doc> + <type name="Attachment" c:type="PopplerAttachment*"/> + </return-value> + </method> + <method name="get_name" + c:identifier="poppler_annot_file_attachment_get_name" + version="0.14"> + <doc xml:whitespace="preserve">Retrieves the name of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string with the name of @poppler_annot. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + </class> + <bitfield name="AnnotFlag" + glib:type-name="PopplerAnnotFlag" + glib:get-type="poppler_annot_flag_get_type" + c:type="PopplerAnnotFlag"> + <member name="unknown" + value="0" + c:identifier="POPPLER_ANNOT_FLAG_UNKNOWN" + glib:nick="unknown"/> + <member name="invisible" + value="1" + c:identifier="POPPLER_ANNOT_FLAG_INVISIBLE" + glib:nick="invisible"/> + <member name="hidden" + value="2" + c:identifier="POPPLER_ANNOT_FLAG_HIDDEN" + glib:nick="hidden"/> + <member name="print" + value="4" + c:identifier="POPPLER_ANNOT_FLAG_PRINT" + glib:nick="print"/> + <member name="no_zoom" + value="8" + c:identifier="POPPLER_ANNOT_FLAG_NO_ZOOM" + glib:nick="no-zoom"/> + <member name="no_rotate" + value="16" + c:identifier="POPPLER_ANNOT_FLAG_NO_ROTATE" + glib:nick="no-rotate"/> + <member name="no_view" + value="32" + c:identifier="POPPLER_ANNOT_FLAG_NO_VIEW" + glib:nick="no-view"/> + <member name="read_only" + value="64" + c:identifier="POPPLER_ANNOT_FLAG_READ_ONLY" + glib:nick="read-only"/> + <member name="locked" + value="128" + c:identifier="POPPLER_ANNOT_FLAG_LOCKED" + glib:nick="locked"/> + <member name="toggle_no_view" + value="256" + c:identifier="POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW" + glib:nick="toggle-no-view"/> + <member name="locked_contents" + value="512" + c:identifier="POPPLER_ANNOT_FLAG_LOCKED_CONTENTS" + glib:nick="locked-contents"/> + </bitfield> + <class name="AnnotFreeText" + c:symbol-prefix="annot_free_text" + c:type="PopplerAnnotFreeText" + parent="AnnotMarkup" + glib:type-name="PopplerAnnotFreeText" + glib:get-type="poppler_annot_free_text_get_type"> + <method name="get_callout_line" + c:identifier="poppler_annot_free_text_get_callout_line"> + <doc xml:whitespace="preserve">Retrieves a #PopplerAnnotCalloutLine of four or six numbers specifying a callout +line attached to the @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated #PopplerAnnotCalloutLine if the annot has a callout line, %NULL in other case. It must be freed with g_free() when done.</doc> + <type name="AnnotCalloutLine" c:type="PopplerAnnotCalloutLine*"/> + </return-value> + </method> + <method name="get_quadding" + c:identifier="poppler_annot_free_text_get_quadding"> + <doc xml:whitespace="preserve">Retrieves the justification of the text of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerAnnotFreeTextQuadding of @poppler_annot.</doc> + <type name="AnnotFreeTextQuadding" + c:type="PopplerAnnotFreeTextQuadding"/> + </return-value> + </method> + </class> + <enumeration name="AnnotFreeTextQuadding" + glib:type-name="PopplerAnnotFreeTextQuadding" + glib:get-type="poppler_annot_free_text_quadding_get_type" + c:type="PopplerAnnotFreeTextQuadding"> + <member name="left_justified" + value="0" + c:identifier="POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED" + glib:nick="left-justified"/> + <member name="centered" + value="1" + c:identifier="POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED" + glib:nick="centered"/> + <member name="right_justified" + value="2" + c:identifier="POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED" + glib:nick="right-justified"/> + </enumeration> + <record name="AnnotMapping" + c:type="PopplerAnnotMapping" + glib:type-name="PopplerAnnotMapping" + glib:get-type="poppler_annot_mapping_get_type" + c:symbol-prefix="annot_mapping"> + <doc xml:whitespace="preserve">A #PopplerAnnotMapping structure represents the location +of @annot on the page</doc> + <field name="area" writable="1"> + <type name="Rectangle" c:type="PopplerRectangle"/> + </field> + <field name="annot" writable="1"> + <type name="Annot" c:type="PopplerAnnot*"/> + </field> + <constructor name="new" c:identifier="poppler_annot_mapping_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerAnnotMapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerAnnotMapping, use poppler_annot_mapping_free() to free it</doc> + <type name="AnnotMapping" c:type="PopplerAnnotMapping*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_annot_mapping_copy"> + <doc xml:whitespace="preserve">Creates a copy of @mapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc> + <type name="AnnotMapping" c:type="PopplerAnnotMapping*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_annot_mapping_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerAnnotMapping</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <class name="AnnotMarkup" + c:symbol-prefix="annot_markup" + c:type="PopplerAnnotMarkup" + parent="Annot" + glib:type-name="PopplerAnnotMarkup" + glib:get-type="poppler_annot_markup_get_type"> + <method name="get_date" c:identifier="poppler_annot_markup_get_date"> + <doc xml:whitespace="preserve">Returns the date and time when the annotation was created</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a #GDate representing the date and time when the annotation was created, or %NULL</doc> + <type name="GLib.Date" c:type="GDate*"/> + </return-value> + </method> + <method name="get_external_data" + c:identifier="poppler_annot_markup_get_external_data"> + <doc xml:whitespace="preserve">Gets the external data type of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerAnnotExternalDataType of @poppler_annot.</doc> + <type name="AnnotExternalDataType" + c:type="PopplerAnnotExternalDataType"/> + </return-value> + </method> + <method name="get_label" c:identifier="poppler_annot_markup_get_label"> + <doc xml:whitespace="preserve">Retrieves the label text of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">the label text of @poppler_annot.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_opacity" + c:identifier="poppler_annot_markup_get_opacity"> + <doc xml:whitespace="preserve">Retrieves the opacity value of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the opacity value of @poppler_annot, between 0 (transparent) and 1 (opaque)</doc> + <type name="gdouble" c:type="gdouble"/> + </return-value> + </method> + <method name="get_popup_is_open" + c:identifier="poppler_annot_markup_get_popup_is_open"> + <doc xml:whitespace="preserve">Retrieves the state of the popup window related to @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the state of @poppler_annot. %TRUE if it's open, %FALSE in other case.</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="get_popup_rectangle" + c:identifier="poppler_annot_markup_get_popup_rectangle" + version="0.12"> + <doc xml:whitespace="preserve">Retrieves the rectangle of the popup window related to @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if #PopplerRectangle was correctly filled, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="poppler_rect" + direction="out" + caller-allocates="1" + transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerRectangle to store the popup rectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </method> + <method name="get_reply_to" + c:identifier="poppler_annot_markup_get_reply_to"> + <doc xml:whitespace="preserve">Gets the reply type of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerAnnotMarkupReplyType of @poppler_annot.</doc> + <type name="AnnotMarkupReplyType" + c:type="PopplerAnnotMarkupReplyType"/> + </return-value> + </method> + <method name="get_subject" + c:identifier="poppler_annot_markup_get_subject"> + <doc xml:whitespace="preserve">Retrives the subject text of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">the subject text of @poppler_annot.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="has_popup" + c:identifier="poppler_annot_markup_has_popup" + version="0.12"> + <doc xml:whitespace="preserve">Return %TRUE if the markup annotation has a popup window associated</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if @poppler_annot has popup, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="set_label" + c:identifier="poppler_annot_markup_set_label" + version="0.16"> + <doc xml:whitespace="preserve">Sets the label text of @poppler_annot, replacing the current one</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="label" transfer-ownership="none" allow-none="1"> + <doc xml:whitespace="preserve">a text string containing the new label, or %NULL</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + </parameters> + </method> + <method name="set_opacity" + c:identifier="poppler_annot_markup_set_opacity" + version="0.16"> + <doc xml:whitespace="preserve">Sets the opacity of @poppler_annot. This value applies to +all visible elements of @poppler_annot in its closed state, +but not to the pop-up window that appears when it's openened</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="opacity" transfer-ownership="none"> + <doc xml:whitespace="preserve">a constant opacity value, between 0 (transparent) and 1 (opaque)</doc> + <type name="gdouble" c:type="gdouble"/> + </parameter> + </parameters> + </method> + <method name="set_popup" + c:identifier="poppler_annot_markup_set_popup" + version="0.16"> + <doc xml:whitespace="preserve">Associates a new popup window for editing contents of @poppler_annot. +Popup window shall be displayed by viewers at @popup_rect on the page.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="popup_rect" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerRectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </method> + <method name="set_popup_is_open" + c:identifier="poppler_annot_markup_set_popup_is_open" + version="0.16"> + <doc xml:whitespace="preserve">Sets the state of the popup window related to @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="is_open" transfer-ownership="none"> + <doc xml:whitespace="preserve">whether popup window should initially be displayed open</doc> + <type name="gboolean" c:type="gboolean"/> + </parameter> + </parameters> + </method> + </class> + <enumeration name="AnnotMarkupReplyType" + glib:type-name="PopplerAnnotMarkupReplyType" + glib:get-type="poppler_annot_markup_reply_type_get_type" + c:type="PopplerAnnotMarkupReplyType"> + <member name="r" + value="0" + c:identifier="POPPLER_ANNOT_MARKUP_REPLY_TYPE_R" + glib:nick="r"/> + <member name="group" + value="1" + c:identifier="POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP" + glib:nick="group"/> + </enumeration> + <class name="AnnotMovie" + c:symbol-prefix="annot_movie" + c:type="PopplerAnnotMovie" + parent="Annot" + glib:type-name="PopplerAnnotMovie" + glib:get-type="poppler_annot_movie_get_type"> + <method name="get_movie" + c:identifier="poppler_annot_movie_get_movie" + version="0.14"> + <doc xml:whitespace="preserve">Retrieves the movie object (PopplerMovie) stored in the @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the movie object stored in the @poppler_annot. The returned object is owned by #PopplerAnnotMovie and should not be freed</doc> + <type name="Movie" c:type="PopplerMovie*"/> + </return-value> + </method> + <method name="get_title" + c:identifier="poppler_annot_movie_get_title" + version="0.14"> + <doc xml:whitespace="preserve">Retrieves the movie title of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">the title text of @poppler_annot.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + </class> + <class name="AnnotScreen" + c:symbol-prefix="annot_screen" + c:type="PopplerAnnotScreen" + parent="Annot" + glib:type-name="PopplerAnnotScreen" + glib:get-type="poppler_annot_screen_get_type"> + <method name="get_action" + c:identifier="poppler_annot_screen_get_action" + version="0.14"> + <doc xml:whitespace="preserve">Retrieves the action (#PopplerAction) that shall be performed when @poppler_annot is activated</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the action to perform. The returned object is owned by @poppler_annot and should not be freed</doc> + <type name="Action" c:type="PopplerAction*"/> + </return-value> + </method> + </class> + <class name="AnnotText" + c:symbol-prefix="annot_text" + c:type="PopplerAnnotText" + parent="AnnotMarkup" + glib:type-name="PopplerAnnotText" + glib:get-type="poppler_annot_text_get_type"> + <constructor name="new" + c:identifier="poppler_annot_text_new" + version="0.16"> + <doc xml:whitespace="preserve">Creates a new Text annotation that will be +located on @rect when added to a page. See +poppler_page_add_annot()</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A newly created #PopplerAnnotText annotation</doc> + <type name="Annot" c:type="PopplerAnnot*"/> + </return-value> + <parameters> + <parameter name="doc" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerDocument</doc> + <type name="Document" c:type="PopplerDocument*"/> + </parameter> + <parameter name="rect" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerRectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </constructor> + <method name="get_icon" c:identifier="poppler_annot_text_get_icon"> + <doc xml:whitespace="preserve">Gets name of the icon of @poppler_annot.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the icon name</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_is_open" c:identifier="poppler_annot_text_get_is_open"> + <doc xml:whitespace="preserve">Retrieves the state of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the state of @poppler_annot. %TRUE if it's open, %FALSE in other case.</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="get_state" c:identifier="poppler_annot_text_get_state"> + <doc xml:whitespace="preserve">Retrieves the state of @poppler_annot.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerAnnotTextState of @poppler_annot.</doc> + <type name="AnnotTextState" c:type="PopplerAnnotTextState"/> + </return-value> + </method> + <method name="set_icon" + c:identifier="poppler_annot_text_set_icon" + version="0.16"> + <doc xml:whitespace="preserve">Sets the icon of @poppler_annot. The following predefined +icons are currently supported: +<variablelist> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_NOTE</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_COMMENT</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_KEY</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_HELP</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_INSERT</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_CROSS</term> + </varlistentry> + <varlistentry> + <term>#POPPLER_ANNOT_TEXT_ICON_CIRCLE</term> + </varlistentry> +</variablelist></doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="icon" transfer-ownership="none"> + <doc xml:whitespace="preserve">the name of an icon</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + </parameters> + </method> + <method name="set_is_open" + c:identifier="poppler_annot_text_set_is_open" + version="0.16"> + <doc xml:whitespace="preserve">Sets whether @poppler_annot should initially be displayed open</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="is_open" transfer-ownership="none"> + <doc xml:whitespace="preserve">whether annotation should initially be displayed open</doc> + <type name="gboolean" c:type="gboolean"/> + </parameter> + </parameters> + </method> + </class> + <enumeration name="AnnotTextState" + glib:type-name="PopplerAnnotTextState" + glib:get-type="poppler_annot_text_state_get_type" + c:type="PopplerAnnotTextState"> + <member name="marked" + value="0" + c:identifier="POPPLER_ANNOT_TEXT_STATE_MARKED" + glib:nick="marked"/> + <member name="unmarked" + value="1" + c:identifier="POPPLER_ANNOT_TEXT_STATE_UNMARKED" + glib:nick="unmarked"/> + <member name="accepted" + value="2" + c:identifier="POPPLER_ANNOT_TEXT_STATE_ACCEPTED" + glib:nick="accepted"/> + <member name="rejected" + value="3" + c:identifier="POPPLER_ANNOT_TEXT_STATE_REJECTED" + glib:nick="rejected"/> + <member name="cancelled" + value="4" + c:identifier="POPPLER_ANNOT_TEXT_STATE_CANCELLED" + glib:nick="cancelled"/> + <member name="completed" + value="5" + c:identifier="POPPLER_ANNOT_TEXT_STATE_COMPLETED" + glib:nick="completed"/> + <member name="none" + value="6" + c:identifier="POPPLER_ANNOT_TEXT_STATE_NONE" + glib:nick="none"/> + <member name="unknown" + value="7" + c:identifier="POPPLER_ANNOT_TEXT_STATE_UNKNOWN" + glib:nick="unknown"/> + </enumeration> + <enumeration name="AnnotType" + glib:type-name="PopplerAnnotType" + glib:get-type="poppler_annot_type_get_type" + c:type="PopplerAnnotType"> + <member name="unknown" + value="0" + c:identifier="POPPLER_ANNOT_UNKNOWN" + glib:nick="unknown"/> + <member name="text" + value="1" + c:identifier="POPPLER_ANNOT_TEXT" + glib:nick="text"/> + <member name="link" + value="2" + c:identifier="POPPLER_ANNOT_LINK" + glib:nick="link"/> + <member name="free_text" + value="3" + c:identifier="POPPLER_ANNOT_FREE_TEXT" + glib:nick="free-text"/> + <member name="line" + value="4" + c:identifier="POPPLER_ANNOT_LINE" + glib:nick="line"/> + <member name="square" + value="5" + c:identifier="POPPLER_ANNOT_SQUARE" + glib:nick="square"/> + <member name="circle" + value="6" + c:identifier="POPPLER_ANNOT_CIRCLE" + glib:nick="circle"/> + <member name="polygon" + value="7" + c:identifier="POPPLER_ANNOT_POLYGON" + glib:nick="polygon"/> + <member name="poly_line" + value="8" + c:identifier="POPPLER_ANNOT_POLY_LINE" + glib:nick="poly-line"/> + <member name="highlight" + value="9" + c:identifier="POPPLER_ANNOT_HIGHLIGHT" + glib:nick="highlight"/> + <member name="underline" + value="10" + c:identifier="POPPLER_ANNOT_UNDERLINE" + glib:nick="underline"/> + <member name="squiggly" + value="11" + c:identifier="POPPLER_ANNOT_SQUIGGLY" + glib:nick="squiggly"/> + <member name="strike_out" + value="12" + c:identifier="POPPLER_ANNOT_STRIKE_OUT" + glib:nick="strike-out"/> + <member name="stamp" + value="13" + c:identifier="POPPLER_ANNOT_STAMP" + glib:nick="stamp"/> + <member name="caret" + value="14" + c:identifier="POPPLER_ANNOT_CARET" + glib:nick="caret"/> + <member name="ink" + value="15" + c:identifier="POPPLER_ANNOT_INK" + glib:nick="ink"/> + <member name="popup" + value="16" + c:identifier="POPPLER_ANNOT_POPUP" + glib:nick="popup"/> + <member name="file_attachment" + value="17" + c:identifier="POPPLER_ANNOT_FILE_ATTACHMENT" + glib:nick="file-attachment"/> + <member name="sound" + value="18" + c:identifier="POPPLER_ANNOT_SOUND" + glib:nick="sound"/> + <member name="movie" + value="19" + c:identifier="POPPLER_ANNOT_MOVIE" + glib:nick="movie"/> + <member name="widget" + value="20" + c:identifier="POPPLER_ANNOT_WIDGET" + glib:nick="widget"/> + <member name="screen" + value="21" + c:identifier="POPPLER_ANNOT_SCREEN" + glib:nick="screen"/> + <member name="printer_mark" + value="22" + c:identifier="POPPLER_ANNOT_PRINTER_MARK" + glib:nick="printer-mark"/> + <member name="trap_net" + value="23" + c:identifier="POPPLER_ANNOT_TRAP_NET" + glib:nick="trap-net"/> + <member name="watermark" + value="24" + c:identifier="POPPLER_ANNOT_WATERMARK" + glib:nick="watermark"/> + <member name="3d" + value="25" + c:identifier="POPPLER_ANNOT_3D" + glib:nick="3d"/> + </enumeration> + <class name="Attachment" + c:symbol-prefix="attachment" + c:type="PopplerAttachment" + parent="GObject.Object" + glib:type-name="PopplerAttachment" + glib:get-type="poppler_attachment_get_type"> + <method name="save" c:identifier="poppler_attachment_save" throws="1"> + <doc xml:whitespace="preserve">Saves @attachment to a file indicated by @filename. If @error is set, %FALSE +will be returned. Possible errors include those in the #G_FILE_ERROR domain +and whatever the save function generates.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the file successfully saved</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="filename" transfer-ownership="none"> + <doc xml:whitespace="preserve">name of file to save</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </method> + <method name="save_to_callback" + c:identifier="poppler_attachment_save_to_callback" + throws="1"> + <doc xml:whitespace="preserve">Saves @attachment by feeding the produced data to @save_func. Can be used +when you want to store the attachment to something other than a file, such as +an in-memory buffer or a socket. If @error is set, %FALSE will be +returned. Possible errors include those in the #G_FILE_ERROR domain and +whatever the save function generates.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the save successfully completed</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="save_func" + transfer-ownership="none" + scope="call" + closure="1"> + <doc xml:whitespace="preserve">a function that is called to save each block of data that the save routine generates.</doc> + <type name="AttachmentSaveFunc" + c:type="PopplerAttachmentSaveFunc"/> + </parameter> + <parameter name="user_data" transfer-ownership="none"> + <doc xml:whitespace="preserve">user data to pass to the save function.</doc> + <type name="gpointer" c:type="gpointer"/> + </parameter> + </parameters> + </method> + <field name="parent"> + <type name="GObject.Object" c:type="GObject"/> + </field> + <field name="name"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="description"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="size"> + <type name="gsize" c:type="gsize"/> + </field> + <field name="mtime"> + <type name="GLib.Time" c:type="GTime"/> + </field> + <field name="ctime"> + <type name="GLib.Time" c:type="GTime"/> + </field> + <field name="checksum"> + <type name="GLib.String" c:type="GString*"/> + </field> + </class> + <callback name="AttachmentSaveFunc" + c:type="PopplerAttachmentSaveFunc" + throws="1"> + <doc xml:whitespace="preserve">Specifies the type of the function passed to +poppler_attachment_save_to_callback(). It is called once for each block of +bytes that is "written" by poppler_attachment_save_to_callback(). If +successful it should return %TRUE. If an error occurs it should set +@error and return %FALSE, in which case poppler_attachment_save_to_callback() +will fail with the same error.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if successful, %FALSE (with @error set) if failed.</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="buf" transfer-ownership="none"> + <doc xml:whitespace="preserve">buffer containing bytes to be written.</doc> + <array length="1" zero-terminated="0" c:type="gchar*"> + <type name="guint8"/> + </array> + </parameter> + <parameter name="count" transfer-ownership="none"> + <doc xml:whitespace="preserve">number of bytes in @buf.</doc> + <type name="gsize" c:type="gsize"/> + </parameter> + <parameter name="data" transfer-ownership="none" closure="2"> + <doc xml:whitespace="preserve">user data passed to poppler_attachment_save_to_callback()</doc> + <type name="gpointer" c:type="gpointer"/> + </parameter> + </parameters> + </callback> + <enumeration name="Backend" + glib:type-name="PopplerBackend" + glib:get-type="poppler_backend_get_type" + c:type="PopplerBackend"> + <member name="unknown" + value="0" + c:identifier="POPPLER_BACKEND_UNKNOWN" + glib:nick="unknown"/> + <member name="splash" + value="1" + c:identifier="POPPLER_BACKEND_SPLASH" + glib:nick="splash"/> + <member name="cairo" + value="2" + c:identifier="POPPLER_BACKEND_CAIRO" + glib:nick="cairo"/> + </enumeration> + <record name="Color" + c:type="PopplerColor" + glib:type-name="PopplerColor" + glib:get-type="poppler_color_get_type" + c:symbol-prefix="color"> + <doc xml:whitespace="preserve">A #PopplerColor describes a RGB color. Color components +are values between 0 and 65535</doc> + <field name="red" writable="1"> + <type name="guint16" c:type="guint16"/> + </field> + <field name="green" writable="1"> + <type name="guint16" c:type="guint16"/> + </field> + <field name="blue" writable="1"> + <type name="guint16" c:type="guint16"/> + </field> + <constructor name="new" c:identifier="poppler_color_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerColor</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerColor, use poppler_color_free() to free it</doc> + <type name="Color" c:type="PopplerColor*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_color_copy"> + <doc xml:whitespace="preserve">Creates a copy of @color</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @color</doc> + <type name="Color" c:type="PopplerColor*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_color_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerColor</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <record name="Dest" + c:type="PopplerDest" + glib:type-name="PopplerDest" + glib:get-type="poppler_dest_get_type" + c:symbol-prefix="dest"> + <doc xml:whitespace="preserve">Data structure for holding a destination</doc> + <field name="type" writable="1"> + <type name="DestType" c:type="PopplerDestType"/> + </field> + <field name="page_num" writable="1"> + <type name="gint" c:type="int"/> + </field> + <field name="left" writable="1"> + <type name="gdouble" c:type="double"/> + </field> + <field name="bottom" writable="1"> + <type name="gdouble" c:type="double"/> + </field> + <field name="right" writable="1"> + <type name="gdouble" c:type="double"/> + </field> + <field name="top" writable="1"> + <type name="gdouble" c:type="double"/> + </field> + <field name="zoom" writable="1"> + <type name="gdouble" c:type="double"/> + </field> + <field name="named_dest" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="change_left" writable="1" bits="1"> + <type name="guint" c:type="guint"/> + </field> + <field name="change_top" writable="1" bits="1"> + <type name="guint" c:type="guint"/> + </field> + <field name="change_zoom" writable="1" bits="1"> + <type name="guint" c:type="guint"/> + </field> + <method name="copy" c:identifier="poppler_dest_copy"> + <doc xml:whitespace="preserve">Copies @dest, creating an identical #PopplerDest.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new destination identical to @dest</doc> + <type name="Dest" c:type="PopplerDest*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_dest_free"> + <doc xml:whitespace="preserve">Frees @dest</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <enumeration name="DestType" + glib:type-name="PopplerDestType" + glib:get-type="poppler_dest_type_get_type" + c:type="PopplerDestType"> + <doc xml:whitespace="preserve">Destination types</doc> + <member name="unknown" + value="0" + c:identifier="POPPLER_DEST_UNKNOWN" + glib:nick="unknown"/> + <member name="xyz" + value="1" + c:identifier="POPPLER_DEST_XYZ" + glib:nick="xyz"/> + <member name="fit" + value="2" + c:identifier="POPPLER_DEST_FIT" + glib:nick="fit"/> + <member name="fith" + value="3" + c:identifier="POPPLER_DEST_FITH" + glib:nick="fith"/> + <member name="fitv" + value="4" + c:identifier="POPPLER_DEST_FITV" + glib:nick="fitv"/> + <member name="fitr" + value="5" + c:identifier="POPPLER_DEST_FITR" + glib:nick="fitr"/> + <member name="fitb" + value="6" + c:identifier="POPPLER_DEST_FITB" + glib:nick="fitb"/> + <member name="fitbh" + value="7" + c:identifier="POPPLER_DEST_FITBH" + glib:nick="fitbh"/> + <member name="fitbv" + value="8" + c:identifier="POPPLER_DEST_FITBV" + glib:nick="fitbv"/> + <member name="named" + value="9" + c:identifier="POPPLER_DEST_NAMED" + glib:nick="named"/> + </enumeration> + <class name="Document" + c:symbol-prefix="document" + c:type="PopplerDocument" + parent="GObject.Object" + glib:type-name="PopplerDocument" + glib:get-type="poppler_document_get_type"> + <constructor name="new_from_data" + c:identifier="poppler_document_new_from_data" + throws="1"> + <doc xml:whitespace="preserve">Creates a new #PopplerDocument. If %NULL is returned, then @error will be +set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR +domains.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A newly created #PopplerDocument, or %NULL</doc> + <type name="Document" c:type="PopplerDocument*"/> + </return-value> + <parameters> + <parameter name="data" transfer-ownership="none"> + <doc xml:whitespace="preserve">the pdf data contained in a char array</doc> + <type name="utf8" c:type="char*"/> + </parameter> + <parameter name="length" transfer-ownership="none"> + <doc xml:whitespace="preserve">the length of #data</doc> + <type name="gint" c:type="int"/> + </parameter> + <parameter name="password" transfer-ownership="none" allow-none="1"> + <doc xml:whitespace="preserve">password to unlock the file with, or %NULL</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </constructor> + <constructor name="new_from_file" + c:identifier="poppler_document_new_from_file" + throws="1"> + <doc xml:whitespace="preserve">Creates a new #PopplerDocument. If %NULL is returned, then @error will be +set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR +domains.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A newly created #PopplerDocument, or %NULL</doc> + <type name="Document" c:type="PopplerDocument*"/> + </return-value> + <parameters> + <parameter name="uri" transfer-ownership="none"> + <doc xml:whitespace="preserve">uri of the file to load</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + <parameter name="password" transfer-ownership="none" allow-none="1"> + <doc xml:whitespace="preserve">password to unlock the file with, or %NULL</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </constructor> + <method name="find_dest" c:identifier="poppler_document_find_dest"> + <doc xml:whitespace="preserve">Finds named destination @link_name in @document</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">The #PopplerDest destination or %NULL if @link_name is not a destination. Returned value must be freed with #poppler_dest_free</doc> + <type name="Dest" c:type="PopplerDest*"/> + </return-value> + <parameters> + <parameter name="link_name" transfer-ownership="none"> + <doc xml:whitespace="preserve">a named destination</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + </parameters> + </method> + <method name="get_attachments" + c:identifier="poppler_document_get_attachments"> + <doc xml:whitespace="preserve">Returns a #GList containing #PopplerAttachment<!-- -->s. These attachments +are unowned, and must be unreffed, and the list must be freed with +g_list_free().</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a list of available attachments.</doc> + <type name="GLib.List" c:type="GList*"> + <type name="Attachment"/> + </type> + </return-value> + </method> + <method name="get_author" + c:identifier="poppler_document_get_author" + version="0.16"> + <doc xml:whitespace="preserve">Returns the author of the document</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the author of @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_creation_date" + c:identifier="poppler_document_get_creation_date" + version="0.16"> + <doc xml:whitespace="preserve">Returns the date the document was created as seconds since the Epoch</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the date the document was created, or -1</doc> + <type name="glong" c:type="time_t"/> + </return-value> + </method> + <method name="get_creator" + c:identifier="poppler_document_get_creator" + version="0.16"> + <doc xml:whitespace="preserve">Returns the creator of the document. If the document was converted +from another format, the creator is the name of the product +that created the original document from which it was converted.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the creator of @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_form_field" + c:identifier="poppler_document_get_form_field"> + <doc xml:whitespace="preserve">Returns the #PopplerFormField for the given @id. It must be freed with +g_object_unref()</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerFormField or %NULL if not found</doc> + <type name="FormField" c:type="PopplerFormField*"/> + </return-value> + <parameters> + <parameter name="id" transfer-ownership="none"> + <doc xml:whitespace="preserve">an id of a #PopplerFormField</doc> + <type name="gint" c:type="gint"/> + </parameter> + </parameters> + </method> + <method name="get_id" + c:identifier="poppler_document_get_id" + version="0.16"> + <doc xml:whitespace="preserve">Returns the PDF file identifier represented as two byte string arrays of size 32. +@permanent_id is the permanent identifier that is built based on the file +contents at the time it was originally created, so that this identifer +never changes. @update_id is the update identifier that is built based on +the file contents at the time it was last updated. + +Note that returned strings are not null-terminated, they have a fixed +size of 32 bytes.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if the @document contains an id, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="permanent_id" + direction="out" + caller-allocates="0" + transfer-ownership="full" + allow-none="1"> + <doc xml:whitespace="preserve">location to store an allocated string, use g_free() to free the returned string</doc> + <type name="utf8" c:type="gchar**"/> + </parameter> + <parameter name="update_id" + direction="out" + caller-allocates="0" + transfer-ownership="full" + allow-none="1"> + <doc xml:whitespace="preserve">location to store an allocated string, use g_free() to free the returned string</doc> + <type name="utf8" c:type="gchar**"/> + </parameter> + </parameters> + </method> + <method name="get_keywords" + c:identifier="poppler_document_get_keywords" + version="0.16"> + <doc xml:whitespace="preserve">Returns the keywords associated to the document</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing keywords associated to @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_metadata" + c:identifier="poppler_document_get_metadata" + version="0.16"> + <doc xml:whitespace="preserve">Returns the XML metadata string of the document</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the XML metadata, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_modification_date" + c:identifier="poppler_document_get_modification_date" + version="0.16"> + <doc xml:whitespace="preserve">Returns the date the document was most recently modified as seconds since the Epoch</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the date the document was most recently modified, or -1</doc> + <type name="glong" c:type="time_t"/> + </return-value> + </method> + <method name="get_n_attachments" + c:identifier="poppler_document_get_n_attachments" + version="0.18"> + <doc xml:whitespace="preserve">Returns the number of attachments in a loaded document. +See also poppler_document_get_attachments()</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">Number of attachments</doc> + <type name="guint" c:type="guint"/> + </return-value> + </method> + <method name="get_n_pages" c:identifier="poppler_document_get_n_pages"> + <doc xml:whitespace="preserve">Returns the number of pages in a loaded document.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">Number of pages</doc> + <type name="gint" c:type="int"/> + </return-value> + </method> + <method name="get_page" c:identifier="poppler_document_get_page"> + <doc xml:whitespace="preserve">Returns the #PopplerPage indexed at @index. This object is owned by the +caller.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">The #PopplerPage at @index</doc> + <type name="Page" c:type="PopplerPage*"/> + </return-value> + <parameters> + <parameter name="index" transfer-ownership="none"> + <doc xml:whitespace="preserve">a page index</doc> + <type name="gint" c:type="int"/> + </parameter> + </parameters> + </method> + <method name="get_page_by_label" + c:identifier="poppler_document_get_page_by_label"> + <doc xml:whitespace="preserve">Returns the #PopplerPage reference by @label. This object is owned by the +caller. @label is a human-readable string representation of the page number, +and can be document specific. Typically, it is a value such as "iii" or "3". + +By default, "1" refers to the first page.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">The #PopplerPage referenced by @label</doc> + <type name="Page" c:type="PopplerPage*"/> + </return-value> + <parameters> + <parameter name="label" transfer-ownership="none"> + <doc xml:whitespace="preserve">a page label</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </method> + <method name="get_page_layout" + c:identifier="poppler_document_get_page_layout" + version="0.16"> + <doc xml:whitespace="preserve">Returns the page layout that should be used when the document is opened</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerPageLayout that should be used when the document is opened</doc> + <type name="PageLayout" c:type="PopplerPageLayout"/> + </return-value> + </method> + <method name="get_page_mode" + c:identifier="poppler_document_get_page_mode" + version="0.16"> + <doc xml:whitespace="preserve">Returns a #PopplerPageMode representing how the document should +be initially displayed when opened.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerPageMode that should be used when document is opened</doc> + <type name="PageMode" c:type="PopplerPageMode"/> + </return-value> + </method> + <method name="get_pdf_version" + c:identifier="poppler_document_get_pdf_version" + version="0.16"> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the major and minor PDF version numbers</doc> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="major_version" + direction="out" + caller-allocates="0" + transfer-ownership="full" + allow-none="1"> + <doc xml:whitespace="preserve">return location for the PDF major version number</doc> + <type name="guint" c:type="guint*"/> + </parameter> + <parameter name="minor_version" + direction="out" + caller-allocates="0" + transfer-ownership="full" + allow-none="1"> + <doc xml:whitespace="preserve">return location for the PDF minor version number</doc> + <type name="guint" c:type="guint*"/> + </parameter> + </parameters> + </method> + <method name="get_pdf_version_string" + c:identifier="poppler_document_get_pdf_version_string" + version="0.16"> + <doc xml:whitespace="preserve">Returns the PDF version of @document as a string (e.g. PDF-1.6)</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the PDF version of @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_permissions" + c:identifier="poppler_document_get_permissions" + version="0.16"> + <doc xml:whitespace="preserve">Returns the flags specifying which operations are permitted when the document is opened.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">a set of falgs from #PopplerPermissions enumeration</doc> + <type name="Permissions" c:type="PopplerPermissions"/> + </return-value> + </method> + <method name="get_producer" + c:identifier="poppler_document_get_producer" + version="0.16"> + <doc xml:whitespace="preserve">Returns the producer of the document. If the document was converted +from another format, the producer is the name of the product +that converted it to PDF</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the producer of @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_subject" + c:identifier="poppler_document_get_subject" + version="0.16"> + <doc xml:whitespace="preserve">Returns the subject of the document</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the subject of @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_title" + c:identifier="poppler_document_get_title" + version="0.16"> + <doc xml:whitespace="preserve">Returns the document's title</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the title of @document, or %NULL</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="has_attachments" + c:identifier="poppler_document_has_attachments"> + <doc xml:whitespace="preserve">Returns %TRUE of @document has any attachments.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if @document has attachments.</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="is_linearized" + c:identifier="poppler_document_is_linearized" + version="0.16"> + <doc xml:whitespace="preserve">Returns whether @document is linearized or not. Linearization of PDF +enables efficient incremental access of the PDF file in a network environment.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if @document is linearized, %FALSE otherwhise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="save" c:identifier="poppler_document_save" throws="1"> + <doc xml:whitespace="preserve">Saves @document. Any change made in the document such as +form fields filled, annotations added or modified +will be saved. +If @error is set, %FALSE will be returned. Possible errors +include those in the #G_FILE_ERROR domain.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the document was successfully saved</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="uri" transfer-ownership="none"> + <doc xml:whitespace="preserve">uri of file to save</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </method> + <method name="save_a_copy" + c:identifier="poppler_document_save_a_copy" + throws="1"> + <doc xml:whitespace="preserve">Saves a copy of the original @document. +Any change made in the document such as +form fields filled by the user will not be saved. +If @error is set, %FALSE will be returned. Possible errors +include those in the #G_FILE_ERROR domain.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the document was successfully saved</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="uri" transfer-ownership="none"> + <doc xml:whitespace="preserve">uri of file to save</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </method> + <property name="author" transfer-ownership="none"> + <doc xml:whitespace="preserve">The author of the document</doc> + <type name="utf8"/> + </property> + <property name="creation-date" transfer-ownership="none"> + <doc xml:whitespace="preserve">The date the document was created as seconds since the Epoch, or -1</doc> + <type name="gint"/> + </property> + <property name="creator" transfer-ownership="none"> + <doc xml:whitespace="preserve">The creator of the document. See also poppler_document_get_creator()</doc> + <type name="utf8"/> + </property> + <property name="format" transfer-ownership="none"> + <doc xml:whitespace="preserve">The PDF version as string. See also poppler_document_get_pdf_version_string()</doc> + <type name="utf8"/> + </property> + <property name="format-major" transfer-ownership="none"> + <doc xml:whitespace="preserve">The PDF major version number. See also poppler_document_get_pdf_version()</doc> + <type name="guint"/> + </property> + <property name="format-minor" transfer-ownership="none"> + <doc xml:whitespace="preserve">The PDF minor version number. See also poppler_document_get_pdf_version()</doc> + <type name="guint"/> + </property> + <property name="keywords" transfer-ownership="none"> + <doc xml:whitespace="preserve">The keywords associated to the document</doc> + <type name="utf8"/> + </property> + <property name="linearized" transfer-ownership="none"> + <doc xml:whitespace="preserve">Whether document is linearized. See also poppler_document_is_linearized()</doc> + <type name="gboolean"/> + </property> + <property name="metadata" transfer-ownership="none"> + <doc xml:whitespace="preserve">Document metadata in XML format, or %NULL</doc> + <type name="utf8"/> + </property> + <property name="mod-date" transfer-ownership="none"> + <doc xml:whitespace="preserve">The date the document was most recently modified as seconds since the Epoch, or -1</doc> + <type name="gint"/> + </property> + <property name="page-layout" transfer-ownership="none"> + <doc xml:whitespace="preserve">The page layout that should be used when the document is opened</doc> + <type name="PageLayout"/> + </property> + <property name="page-mode" transfer-ownership="none"> + <doc xml:whitespace="preserve">The mode that should be used when the document is opened</doc> + <type name="PageMode"/> + </property> + <property name="permissions" transfer-ownership="none"> + <doc xml:whitespace="preserve">Flags specifying which operations are permitted when the document is opened</doc> + <type name="Permissions"/> + </property> + <property name="producer" transfer-ownership="none"> + <doc xml:whitespace="preserve">The producer of the document. See also poppler_document_get_producer()</doc> + <type name="utf8"/> + </property> + <property name="subject" transfer-ownership="none"> + <doc xml:whitespace="preserve">The subject of the document</doc> + <type name="utf8"/> + </property> + <property name="title" transfer-ownership="none"> + <doc xml:whitespace="preserve">The document's title or %NULL</doc> + <type name="utf8"/> + </property> + <property name="viewer-preferences" transfer-ownership="none"> + <type name="ViewerPreferences"/> + </property> + </class> + <enumeration name="Error" + glib:type-name="PopplerError" + glib:get-type="poppler_error_get_type" + c:type="PopplerError" + glib:error-domain="poppler-quark"> + <doc xml:whitespace="preserve">Error codes returned by #PopplerDocument</doc> + <member name="invalid" + value="0" + c:identifier="POPPLER_ERROR_INVALID" + glib:nick="invalid"/> + <member name="encrypted" + value="1" + c:identifier="POPPLER_ERROR_ENCRYPTED" + glib:nick="encrypted"/> + <member name="open_file" + value="2" + c:identifier="POPPLER_ERROR_OPEN_FILE" + glib:nick="open-file"/> + <member name="bad_catalog" + value="3" + c:identifier="POPPLER_ERROR_BAD_CATALOG" + glib:nick="bad-catalog"/> + <member name="damaged" + value="4" + c:identifier="POPPLER_ERROR_DAMAGED" + glib:nick="damaged"/> + <function name="quark" c:identifier="poppler_error_quark"> + <return-value transfer-ownership="none"> + <type name="GLib.Quark" c:type="GQuark"/> + </return-value> + </function> + </enumeration> + <class name="FontInfo" + c:symbol-prefix="font_info" + c:type="PopplerFontInfo" + parent="GObject.Object" + glib:type-name="PopplerFontInfo" + glib:get-type="poppler_font_info_get_type"> + <constructor name="new" c:identifier="poppler_font_info_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerFontInfo object</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerFontInfo instance</doc> + <type name="FontInfo" c:type="PopplerFontInfo*"/> + </return-value> + <parameters> + <parameter name="document" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerDocument</doc> + <type name="Document" c:type="PopplerDocument*"/> + </parameter> + </parameters> + </constructor> + <method name="free" c:identifier="poppler_font_info_free"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="scan" c:identifier="poppler_font_info_scan"> + <doc xml:whitespace="preserve">Scans the document associated with @font_info for fonts. At most +@n_pages will be scanned starting from the current iterator. @iter will +point to the first font scanned. + +Here is a simple example of code to scan fonts in a document + +<informalexample><programlisting> +font_info = poppler_font_info_new (document); +while (poppler_font_info_scan (font_info, 20, &fonts_iter)) { + if (!fonts_iter) + continue; /<!-- -->* No fonts found in these 20 pages *<!-- -->/ + do { + /<!-- -->* Do something with font iter *<!-- -->/ + g_print ("Font Name: %s\n", poppler_fonts_iter_get_name (fonts_iter)); + } while (poppler_fonts_iter_next (fonts_iter)); + poppler_fonts_iter_free (fonts_iter); +} +</programlisting></informalexample></doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if there are more fonts left to scan</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="n_pages" transfer-ownership="none"> + <doc xml:whitespace="preserve">number of pages to scan</doc> + <type name="gint" c:type="int"/> + </parameter> + <parameter name="iter" + direction="out" + caller-allocates="0" + transfer-ownership="full"> + <doc xml:whitespace="preserve">return location for a #PopplerFontsIter</doc> + <type name="FontsIter" c:type="PopplerFontsIter**"/> + </parameter> + </parameters> + </method> + </class> + <enumeration name="FontType" + glib:type-name="PopplerFontType" + glib:get-type="poppler_font_type_get_type" + c:type="PopplerFontType"> + <doc xml:whitespace="preserve">Font types</doc> + <member name="unknown" + value="0" + c:identifier="POPPLER_FONT_TYPE_UNKNOWN" + glib:nick="unknown"/> + <member name="type1" + value="1" + c:identifier="POPPLER_FONT_TYPE_TYPE1" + glib:nick="type1"/> + <member name="type1c" + value="2" + c:identifier="POPPLER_FONT_TYPE_TYPE1C" + glib:nick="type1c"/> + <member name="type1cot" + value="3" + c:identifier="POPPLER_FONT_TYPE_TYPE1COT" + glib:nick="type1cot"/> + <member name="type3" + value="4" + c:identifier="POPPLER_FONT_TYPE_TYPE3" + glib:nick="type3"/> + <member name="truetype" + value="5" + c:identifier="POPPLER_FONT_TYPE_TRUETYPE" + glib:nick="truetype"/> + <member name="truetypeot" + value="6" + c:identifier="POPPLER_FONT_TYPE_TRUETYPEOT" + glib:nick="truetypeot"/> + <member name="cid_type0" + value="7" + c:identifier="POPPLER_FONT_TYPE_CID_TYPE0" + glib:nick="cid-type0"/> + <member name="cid_type0c" + value="8" + c:identifier="POPPLER_FONT_TYPE_CID_TYPE0C" + glib:nick="cid-type0c"/> + <member name="cid_type0cot" + value="9" + c:identifier="POPPLER_FONT_TYPE_CID_TYPE0COT" + glib:nick="cid-type0cot"/> + <member name="cid_type2" + value="10" + c:identifier="POPPLER_FONT_TYPE_CID_TYPE2" + glib:nick="cid-type2"/> + <member name="cid_type2ot" + value="11" + c:identifier="POPPLER_FONT_TYPE_CID_TYPE2OT" + glib:nick="cid-type2ot"/> + </enumeration> + <record name="FontsIter" + c:type="PopplerFontsIter" + glib:type-name="PopplerFontsIter" + glib:get-type="poppler_fonts_iter_get_type" + c:symbol-prefix="fonts_iter"> + <method name="copy" c:identifier="poppler_fonts_iter_copy"> + <doc xml:whitespace="preserve">Creates a copy of @iter</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @iter</doc> + <type name="FontsIter" c:type="PopplerFontsIter*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_fonts_iter_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerFontsIter</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="get_encoding" + c:identifier="poppler_fonts_iter_get_encoding" + version="0.20"> + <doc xml:whitespace="preserve">Returns the encoding of the font associated with @iter</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the font encoding</doc> + <type name="utf8" c:type="const char*"/> + </return-value> + </method> + <method name="get_file_name" + c:identifier="poppler_fonts_iter_get_file_name"> + <doc xml:whitespace="preserve">The filename of the font associated with @iter or %NULL if +the font is embedded</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the filename of the font or %NULL if font is embedded</doc> + <type name="utf8" c:type="const char*"/> + </return-value> + </method> + <method name="get_font_type" + c:identifier="poppler_fonts_iter_get_font_type"> + <doc xml:whitespace="preserve">Returns the type of the font associated with @iter</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the font type</doc> + <type name="FontType" c:type="PopplerFontType"/> + </return-value> + </method> + <method name="get_full_name" + c:identifier="poppler_fonts_iter_get_full_name"> + <doc xml:whitespace="preserve">Returns the full name of the font associated with @iter</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the font full name</doc> + <type name="utf8" c:type="const char*"/> + </return-value> + </method> + <method name="get_name" c:identifier="poppler_fonts_iter_get_name"> + <doc xml:whitespace="preserve">Returns the name of the font associated with @iter</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the font name</doc> + <type name="utf8" c:type="const char*"/> + </return-value> + </method> + <method name="get_substitute_name" + c:identifier="poppler_fonts_iter_get_substitute_name" + version="0.20"> + <doc xml:whitespace="preserve">The name of the substitute font of the font associated with @iter or %NULL if +the font is embedded</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the name of the substitute font or %NULL if font is embedded</doc> + <type name="utf8" c:type="const char*"/> + </return-value> + </method> + <method name="is_embedded" c:identifier="poppler_fonts_iter_is_embedded"> + <doc xml:whitespace="preserve">Returns whether the font associated with @iter is embedded in the document</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if font is emebdded, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="is_subset" c:identifier="poppler_fonts_iter_is_subset"> + <doc xml:whitespace="preserve">Returns whether the font associated with @iter is a subset of another font</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if font is a subset, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="next" c:identifier="poppler_fonts_iter_next"> + <doc xml:whitespace="preserve">Sets @iter to point to the next font</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if @iter was set to the next font</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + </record> + <enumeration name="FormButtonType" + glib:type-name="PopplerFormButtonType" + glib:get-type="poppler_form_button_type_get_type" + c:type="PopplerFormButtonType"> + <member name="push" + value="0" + c:identifier="POPPLER_FORM_BUTTON_PUSH" + glib:nick="push"/> + <member name="check" + value="1" + c:identifier="POPPLER_FORM_BUTTON_CHECK" + glib:nick="check"/> + <member name="radio" + value="2" + c:identifier="POPPLER_FORM_BUTTON_RADIO" + glib:nick="radio"/> + </enumeration> + <enumeration name="FormChoiceType" + glib:type-name="PopplerFormChoiceType" + glib:get-type="poppler_form_choice_type_get_type" + c:type="PopplerFormChoiceType"> + <member name="combo" + value="0" + c:identifier="POPPLER_FORM_CHOICE_COMBO" + glib:nick="combo"/> + <member name="list" + value="1" + c:identifier="POPPLER_FORM_CHOICE_LIST" + glib:nick="list"/> + </enumeration> + <class name="FormField" + c:symbol-prefix="form_field" + c:type="PopplerFormField" + parent="GObject.Object" + glib:type-name="PopplerFormField" + glib:get-type="poppler_form_field_get_type"> + <method name="button_get_button_type" + c:identifier="poppler_form_field_button_get_button_type"> + <doc xml:whitespace="preserve">Gets the button type of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerFormButtonType of @field</doc> + <type name="FormButtonType" c:type="PopplerFormButtonType"/> + </return-value> + </method> + <method name="button_get_state" + c:identifier="poppler_form_field_button_get_state"> + <doc xml:whitespace="preserve">Queries a #PopplerFormField and returns its current state. Returns %TRUE if +@field is pressed in and %FALSE if it is raised.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">current state of @field</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="button_set_state" + c:identifier="poppler_form_field_button_set_state"> + <doc xml:whitespace="preserve">Sets the status of @field. Set to %TRUE if you want the #PopplerFormField +to be 'pressed in', and %FALSE to raise it.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="state" transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE or %FALSE</doc> + <type name="gboolean" c:type="gboolean"/> + </parameter> + </parameters> + </method> + <method name="choice_can_select_multiple" + c:identifier="poppler_form_field_choice_can_select_multiple"> + <doc xml:whitespace="preserve">Checks whether @field allows multiple choices to be selected</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if @field allows multiple choices to be selected</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="choice_commit_on_change" + c:identifier="poppler_form_field_choice_commit_on_change"> + <return-value transfer-ownership="none"> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="choice_do_spell_check" + c:identifier="poppler_form_field_choice_do_spell_check"> + <doc xml:whitespace="preserve">Checks whether spell checking should be done for the contents of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if spell checking should be done for @field</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="choice_get_choice_type" + c:identifier="poppler_form_field_choice_get_choice_type"> + <doc xml:whitespace="preserve">Gets the choice type of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerFormChoiceType of @field</doc> + <type name="FormChoiceType" c:type="PopplerFormChoiceType"/> + </return-value> + </method> + <method name="choice_get_item" + c:identifier="poppler_form_field_choice_get_item"> + <doc xml:whitespace="preserve">Returns the contents of the item on @field at the given index</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + <parameters> + <parameter name="index" transfer-ownership="none"> + <doc xml:whitespace="preserve">the index of the item</doc> + <type name="gint" c:type="gint"/> + </parameter> + </parameters> + </method> + <method name="choice_get_n_items" + c:identifier="poppler_form_field_choice_get_n_items"> + <doc xml:whitespace="preserve">Returns the number of items on @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the number of items on @field</doc> + <type name="gint" c:type="gint"/> + </return-value> + </method> + <method name="choice_get_text" + c:identifier="poppler_form_field_choice_get_text"> + <doc xml:whitespace="preserve">Retrieves the contents of @field.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="choice_is_editable" + c:identifier="poppler_form_field_choice_is_editable"> + <doc xml:whitespace="preserve">Checks whether @field is editable</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if @field is editable</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="choice_is_item_selected" + c:identifier="poppler_form_field_choice_is_item_selected"> + <doc xml:whitespace="preserve">Checks whether the item at the given index on @field is currently selected</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if item at @index is currently selected</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="index" transfer-ownership="none"> + <doc xml:whitespace="preserve">the index of the item</doc> + <type name="gint" c:type="gint"/> + </parameter> + </parameters> + </method> + <method name="choice_select_item" + c:identifier="poppler_form_field_choice_select_item"> + <doc xml:whitespace="preserve">Selects the item at the given index on @field</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="index" transfer-ownership="none"> + <doc xml:whitespace="preserve">the index of the item</doc> + <type name="gint" c:type="gint"/> + </parameter> + </parameters> + </method> + <method name="choice_set_text" + c:identifier="poppler_form_field_choice_set_text"> + <doc xml:whitespace="preserve">Sets the text in @field to the given value, replacing the current contents</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="text" transfer-ownership="none"> + <doc xml:whitespace="preserve">the new text</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + </parameters> + </method> + <method name="choice_toggle_item" + c:identifier="poppler_form_field_choice_toggle_item"> + <doc xml:whitespace="preserve">Changes the state of the item at the given index</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="index" transfer-ownership="none"> + <doc xml:whitespace="preserve">the index of the item</doc> + <type name="gint" c:type="gint"/> + </parameter> + </parameters> + </method> + <method name="choice_unselect_all" + c:identifier="poppler_form_field_choice_unselect_all"> + <doc xml:whitespace="preserve">Unselects all the items on @field</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="get_action" + c:identifier="poppler_form_field_get_action" + version="0.18"> + <doc xml:whitespace="preserve">Retrieves the action (#PopplerAction) that shall be +performed when @field is activated, or %NULL</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the action to perform. The returned object is owned by @field and should not be freed</doc> + <type name="Action" c:type="PopplerAction*"/> + </return-value> + </method> + <method name="get_field_type" + c:identifier="poppler_form_field_get_field_type"> + <doc xml:whitespace="preserve">Gets the type of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerFormFieldType of @field</doc> + <type name="FormFieldType" c:type="PopplerFormFieldType"/> + </return-value> + </method> + <method name="get_font_size" + c:identifier="poppler_form_field_get_font_size"> + <doc xml:whitespace="preserve">Gets the font size of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the font size of @field</doc> + <type name="gdouble" c:type="gdouble"/> + </return-value> + </method> + <method name="get_id" c:identifier="poppler_form_field_get_id"> + <doc xml:whitespace="preserve">Gets the id of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the id of @field</doc> + <type name="gint" c:type="gint"/> + </return-value> + </method> + <method name="get_mapping_name" + c:identifier="poppler_form_field_get_mapping_name" + version="0.16"> + <doc xml:whitespace="preserve">Gets the mapping name of @field that is used when +exporting interactive form field data from the document</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_name" + c:identifier="poppler_form_field_get_name" + version="0.16"> + <doc xml:whitespace="preserve">Gets the fully qualified name of @field. It's constructed by concatenating +the partial field names of the field and all of its ancestors.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_partial_name" + c:identifier="poppler_form_field_get_partial_name" + version="0.16"> + <doc xml:whitespace="preserve">Gets the partial name of @field.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="is_read_only" + c:identifier="poppler_form_field_is_read_only"> + <doc xml:whitespace="preserve">Checks whether @field is read only</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if @field is read only</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="text_do_scroll" + c:identifier="poppler_form_field_text_do_scroll"> + <return-value transfer-ownership="none"> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="text_do_spell_check" + c:identifier="poppler_form_field_text_do_spell_check"> + <doc xml:whitespace="preserve">Checks whether spell checking should be done for the contents of @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if spell checking should be done for @field</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="text_get_max_len" + c:identifier="poppler_form_field_text_get_max_len"> + <doc xml:whitespace="preserve">Retrieves the maximum allowed length of the text in @field</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the maximum allowed number of characters in @field, or -1 if there is no maximum.</doc> + <type name="gint" c:type="gint"/> + </return-value> + </method> + <method name="text_get_text" + c:identifier="poppler_form_field_text_get_text"> + <doc xml:whitespace="preserve">Retrieves the contents of @field.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string. It must be freed with g_free() when done.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="text_get_text_type" + c:identifier="poppler_form_field_text_get_text_type"> + <doc xml:whitespace="preserve">Gets the text type of @field.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#PopplerFormTextType of @field</doc> + <type name="FormTextType" c:type="PopplerFormTextType"/> + </return-value> + </method> + <method name="text_is_password" + c:identifier="poppler_form_field_text_is_password"> + <doc xml:whitespace="preserve">Checks whether content of @field is a password and it must be hidden</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if the content of @field is a password</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="text_is_rich_text" + c:identifier="poppler_form_field_text_is_rich_text"> + <doc xml:whitespace="preserve">Checks whether the contents of @field are rich text</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if the contents of @field are rich text</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="text_set_text" + c:identifier="poppler_form_field_text_set_text"> + <doc xml:whitespace="preserve">Sets the text in @field to the given value, replacing the current contents.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="text" transfer-ownership="none"> + <doc xml:whitespace="preserve">the new text</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + </parameters> + </method> + </class> + <record name="FormFieldMapping" + c:type="PopplerFormFieldMapping" + glib:type-name="PopplerFormFieldMapping" + glib:get-type="poppler_form_field_mapping_get_type" + c:symbol-prefix="form_field_mapping"> + <doc xml:whitespace="preserve">A #PopplerFormFieldMapping structure represents the location +of @field on the page</doc> + <field name="area" writable="1"> + <type name="Rectangle" c:type="PopplerRectangle"/> + </field> + <field name="field" writable="1"> + <type name="FormField" c:type="PopplerFormField*"/> + </field> + <constructor name="new" c:identifier="poppler_form_field_mapping_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerFormFieldMapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerFormFieldMapping, use poppler_form_field_mapping_free() to free it</doc> + <type name="FormFieldMapping" c:type="PopplerFormFieldMapping*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_form_field_mapping_copy"> + <doc xml:whitespace="preserve">Creates a copy of @mapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc> + <type name="FormFieldMapping" c:type="PopplerFormFieldMapping*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_form_field_mapping_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerFormFieldMapping</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <enumeration name="FormFieldType" + glib:type-name="PopplerFormFieldType" + glib:get-type="poppler_form_field_type_get_type" + c:type="PopplerFormFieldType"> + <member name="unknown" + value="0" + c:identifier="POPPLER_FORM_FIELD_UNKNOWN" + glib:nick="unknown"/> + <member name="button" + value="1" + c:identifier="POPPLER_FORM_FIELD_BUTTON" + glib:nick="button"/> + <member name="text" + value="2" + c:identifier="POPPLER_FORM_FIELD_TEXT" + glib:nick="text"/> + <member name="choice" + value="3" + c:identifier="POPPLER_FORM_FIELD_CHOICE" + glib:nick="choice"/> + <member name="signature" + value="4" + c:identifier="POPPLER_FORM_FIELD_SIGNATURE" + glib:nick="signature"/> + </enumeration> + <enumeration name="FormTextType" + glib:type-name="PopplerFormTextType" + glib:get-type="poppler_form_text_type_get_type" + c:type="PopplerFormTextType"> + <member name="normal" + value="0" + c:identifier="POPPLER_FORM_TEXT_NORMAL" + glib:nick="normal"/> + <member name="multiline" + value="1" + c:identifier="POPPLER_FORM_TEXT_MULTILINE" + glib:nick="multiline"/> + <member name="file_select" + value="2" + c:identifier="POPPLER_FORM_TEXT_FILE_SELECT" + glib:nick="file-select"/> + </enumeration> + <constant name="HAS_CAIRO" value="1" c:type="POPPLER_HAS_CAIRO"> + <type name="gint" c:type="gint"/> + </constant> + <record name="ImageMapping" + c:type="PopplerImageMapping" + glib:type-name="PopplerImageMapping" + glib:get-type="poppler_image_mapping_get_type" + c:symbol-prefix="image_mapping"> + <doc xml:whitespace="preserve">A #PopplerImageMapping structure represents the location +of an image on the page</doc> + <field name="area" writable="1"> + <type name="Rectangle" c:type="PopplerRectangle"/> + </field> + <field name="image_id" writable="1"> + <type name="gint" c:type="gint"/> + </field> + <constructor name="new" c:identifier="poppler_image_mapping_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerImageMapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerImageMapping, use poppler_image_mapping_free() to free it</doc> + <type name="ImageMapping" c:type="PopplerImageMapping*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_image_mapping_copy"> + <doc xml:whitespace="preserve">Creates a copy of @mapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc> + <type name="ImageMapping" c:type="PopplerImageMapping*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_image_mapping_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerImageMapping</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <record name="IndexIter" + c:type="PopplerIndexIter" + glib:type-name="PopplerIndexIter" + glib:get-type="poppler_index_iter_get_type" + c:symbol-prefix="index_iter"> + <constructor name="new" c:identifier="poppler_index_iter_new"> + <doc xml:whitespace="preserve">Returns the root #PopplerIndexIter for @document, or %NULL. This must be +freed with poppler_index_iter_free(). + +Certain documents have an index associated with them. This index can be used +to help the user navigate the document, and is similar to a table of +contents. Each node in the index will contain a #PopplerAction that can be +displayed to the user &mdash; typically a #POPPLER_ACTION_GOTO_DEST or a +#POPPLER_ACTION_URI<!-- -->. + +Here is a simple example of some code that walks the full index: + +<informalexample><programlisting> +static void +walk_index (PopplerIndexIter *iter) +{ + do + { + /<!-- -->* Get the the action and do something with it *<!-- -->/ + PopplerIndexIter *child = poppler_index_iter_get_child (iter); + if (child) + walk_index (child); + poppler_index_iter_free (child); + } + while (poppler_index_iter_next (iter)); +} +... +{ + iter = poppler_index_iter_new (document); + walk_index (iter); + poppler_index_iter_free (iter); +} +</programlisting></informalexample></doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerIndexIter</doc> + <type name="IndexIter" c:type="PopplerIndexIter*"/> + </return-value> + <parameters> + <parameter name="document" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerDocument</doc> + <type name="Document" c:type="PopplerDocument*"/> + </parameter> + </parameters> + </constructor> + <method name="copy" c:identifier="poppler_index_iter_copy"> + <doc xml:whitespace="preserve">Creates a new #PopplerIndexIter as a copy of @iter. This must be freed with +poppler_index_iter_free().</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerIndexIter</doc> + <type name="IndexIter" c:type="PopplerIndexIter*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_index_iter_free"> + <doc xml:whitespace="preserve">Frees @iter.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="get_action" c:identifier="poppler_index_iter_get_action"> + <doc xml:whitespace="preserve">Returns the #PopplerAction associated with @iter. It must be freed with +poppler_action_free().</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerAction</doc> + <type name="Action" c:type="PopplerAction*"/> + </return-value> + </method> + <method name="get_child" c:identifier="poppler_index_iter_get_child"> + <doc xml:whitespace="preserve">Returns a newly created child of @parent, or %NULL if the iter has no child. +See poppler_index_iter_new() for more information on this function.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerIndexIter</doc> + <type name="IndexIter" c:type="PopplerIndexIter*"/> + </return-value> + </method> + <method name="is_open" c:identifier="poppler_index_iter_is_open"> + <doc xml:whitespace="preserve">Returns whether this node should be expanded by default to the user. The +document can provide a hint as to how the document's index should be expanded +initially.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the document wants @iter to be expanded</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="next" c:identifier="poppler_index_iter_next"> + <doc xml:whitespace="preserve">Sets @iter to point to the next action at the current level, if valid. See +poppler_index_iter_new() for more information.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if @iter was set to the next action</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + </record> + <class name="Layer" + c:symbol-prefix="layer" + c:type="PopplerLayer" + parent="GObject.Object" + glib:type-name="PopplerLayer" + glib:get-type="poppler_layer_get_type"> + <method name="get_radio_button_group_id" + c:identifier="poppler_layer_get_radio_button_group_id" + version="0.12"> + <doc xml:whitespace="preserve">Returns the numeric ID the radio button group associated with @layer.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the ID of the radio button group associated with @layer, or 0 if the layer is not associated to any radio button group</doc> + <type name="gint" c:type="gint"/> + </return-value> + </method> + <method name="get_title" + c:identifier="poppler_layer_get_title" + version="0.12"> + <doc xml:whitespace="preserve">Returns the name of the layer suitable for +presentation as a title in a viewer's GUI</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">a string containing the title of the layer</doc> + <type name="utf8" c:type="const gchar*"/> + </return-value> + </method> + <method name="hide" c:identifier="poppler_layer_hide" version="0.12"> + <doc xml:whitespace="preserve">Hides @layer. If @layer is the parent of other nested layers, +such layers will be also hidden and will be blocked until @layer +is shown again</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="is_parent" + c:identifier="poppler_layer_is_parent" + version="0.12"> + <doc xml:whitespace="preserve">Returns whether @layer is parent of other nested layers.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if @layer is a parent layer</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="is_visible" + c:identifier="poppler_layer_is_visible" + version="0.12"> + <doc xml:whitespace="preserve">Returns whether @layer is visible</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if @layer is visible</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="show" c:identifier="poppler_layer_show" version="0.12"> + <doc xml:whitespace="preserve">Shows @layer</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </class> + <record name="LayersIter" + c:type="PopplerLayersIter" + glib:type-name="PopplerLayersIter" + glib:get-type="poppler_layers_iter_get_type" + c:symbol-prefix="layers_iter"> + <constructor name="new" + c:identifier="poppler_layers_iter_new" + version="0.12"> + <return-value transfer-ownership="full"> + <type name="LayersIter" c:type="PopplerLayersIter*"/> + </return-value> + <parameters> + <parameter name="document" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerDocument</doc> + <type name="Document" c:type="PopplerDocument*"/> + </parameter> + </parameters> + </constructor> + <method name="copy" c:identifier="poppler_layers_iter_copy"> + <doc xml:whitespace="preserve">Creates a new #PopplerLayersIter as a copy of @iter. This must be freed with +poppler_layers_iter_free().</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerLayersIter Since 0.12</doc> + <type name="LayersIter" c:type="PopplerLayersIter*"/> + </return-value> + </method> + <method name="free" + c:identifier="poppler_layers_iter_free" + version="0.12"> + <doc xml:whitespace="preserve">Frees @iter.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="get_child" + c:identifier="poppler_layers_iter_get_child" + version="0.12"> + <doc xml:whitespace="preserve">Returns a newly created child of @parent, or %NULL if the iter has no child. +See poppler_layers_iter_new() for more information on this function.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerLayersIter, or %NULL</doc> + <type name="LayersIter" c:type="PopplerLayersIter*"/> + </return-value> + </method> + <method name="get_layer" + c:identifier="poppler_layers_iter_get_layer" + version="0.12"> + <doc xml:whitespace="preserve">Returns the #PopplerLayer associated with @iter.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerLayer, or %NULL if there isn't any layer associated with @iter</doc> + <type name="Layer" c:type="PopplerLayer*"/> + </return-value> + </method> + <method name="get_title" + c:identifier="poppler_layers_iter_get_title" + version="0.12"> + <doc xml:whitespace="preserve">Returns the title associated with @iter. It must be freed with +g_free().</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new string containing the @iter's title or %NULL if @iter doesn't have a title. The returned string should be freed with g_free() when no longer needed.</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="next" + c:identifier="poppler_layers_iter_next" + version="0.12"> + <doc xml:whitespace="preserve">Sets @iter to point to the next action at the current level, if valid. See +poppler_layers_iter_new() for more information.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if @iter was set to the next action</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + </record> + <record name="LinkMapping" + c:type="PopplerLinkMapping" + glib:type-name="PopplerLinkMapping" + glib:get-type="poppler_link_mapping_get_type" + c:symbol-prefix="link_mapping"> + <doc xml:whitespace="preserve">A #PopplerLinkMapping structure represents the location +of @action on the page</doc> + <field name="area" writable="1"> + <type name="Rectangle" c:type="PopplerRectangle"/> + </field> + <field name="action" writable="1"> + <type name="Action" c:type="PopplerAction*"/> + </field> + <constructor name="new" c:identifier="poppler_link_mapping_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerLinkMapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerLinkMapping, use poppler_link_mapping_free() to free it</doc> + <type name="LinkMapping" c:type="PopplerLinkMapping*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_link_mapping_copy"> + <doc xml:whitespace="preserve">Creates a copy of @mapping</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @mapping</doc> + <type name="LinkMapping" c:type="PopplerLinkMapping*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_link_mapping_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerLinkMapping</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <constant name="MAJOR_VERSION" value="0" c:type="POPPLER_MAJOR_VERSION"> + <type name="gint" c:type="gint"/> + </constant> + <constant name="MICRO_VERSION" value="4" c:type="POPPLER_MICRO_VERSION"> + <type name="gint" c:type="gint"/> + </constant> + <constant name="MINOR_VERSION" value="20" c:type="POPPLER_MINOR_VERSION"> + <type name="gint" c:type="gint"/> + </constant> + <class name="Media" + c:symbol-prefix="media" + c:type="PopplerMedia" + parent="GObject.Object" + glib:type-name="PopplerMedia" + glib:get-type="poppler_media_get_type"> + <method name="get_filename" + c:identifier="poppler_media_get_filename" + version="0.14"> + <doc xml:whitespace="preserve">Returns the media clip filename, in case of non-embedded media. filename might be +a local relative or absolute path or a URI</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">a filename, return value is owned by #PopplerMedia and should not be freed</doc> + <type name="utf8" c:type="const gchar*"/> + </return-value> + </method> + <method name="get_mime_type" + c:identifier="poppler_media_get_mime_type" + version="0.14"> + <doc xml:whitespace="preserve">Returns the media clip mime-type</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the mime-type, return value is owned by #PopplerMedia and should not be freed</doc> + <type name="utf8" c:type="const gchar*"/> + </return-value> + </method> + <method name="is_embedded" + c:identifier="poppler_media_is_embedded" + version="0.14"> + <doc xml:whitespace="preserve">Whether the media clip is embedded in the PDF. If the result is %TRUE, the embedded stream +can be saved with poppler_media_save() or poppler_media_save_to_callback() function. +If the result is %FALSE, the media clip filename can be retrieved with +poppler_media_get_filename() function.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if media clip is embedded, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="save" + c:identifier="poppler_media_save" + version="0.14" + throws="1"> + <doc xml:whitespace="preserve">Saves embedded stream of @poppler_media to a file indicated by @filename. +If @error is set, %FALSE will be returned. +Possible errors include those in the #G_FILE_ERROR domain +and whatever the save function generates.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the file successfully saved</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="filename" transfer-ownership="none"> + <doc xml:whitespace="preserve">name of file to save</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </method> + <method name="save_to_callback" + c:identifier="poppler_media_save_to_callback" + version="0.14" + throws="1"> + <doc xml:whitespace="preserve">Saves embedded stream of @poppler_media by feeding the produced data to @save_func. Can be used +when you want to store the media clip stream to something other than a file, such as +an in-memory buffer or a socket. If @error is set, %FALSE will be +returned. Possible errors include those in the #G_FILE_ERROR domain and +whatever the save function generates.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if the save successfully completed</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="save_func" + transfer-ownership="none" + scope="call" + closure="1"> + <doc xml:whitespace="preserve">a function that is called to save each block of data that the save routine generates.</doc> + <type name="MediaSaveFunc" c:type="PopplerMediaSaveFunc"/> + </parameter> + <parameter name="user_data" transfer-ownership="none"> + <doc xml:whitespace="preserve">user data to pass to the save function.</doc> + <type name="gpointer" c:type="gpointer"/> + </parameter> + </parameters> + </method> + </class> + <callback name="MediaSaveFunc" + c:type="PopplerMediaSaveFunc" + version="0.14" + throws="1"> + <doc xml:whitespace="preserve">Specifies the type of the function passed to +poppler_media_save_to_callback(). It is called once for each block of +bytes that is "written" by poppler_media_save_to_callback(). If +successful it should return %TRUE. If an error occurs it should set +@error and return %FALSE, in which case poppler_media_save_to_callback() +will fail with the same error.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if successful, %FALSE (with @error set) if failed.</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="buf" transfer-ownership="none"> + <doc xml:whitespace="preserve">buffer containing bytes to be written.</doc> + <array length="1" zero-terminated="0" c:type="gchar*"> + <type name="guint8"/> + </array> + </parameter> + <parameter name="count" transfer-ownership="none"> + <doc xml:whitespace="preserve">number of bytes in @buf.</doc> + <type name="gsize" c:type="gsize"/> + </parameter> + <parameter name="data" transfer-ownership="none" closure="2"> + <doc xml:whitespace="preserve">user data passed to poppler_media_save_to_callback()</doc> + <type name="gpointer" c:type="gpointer"/> + </parameter> + </parameters> + </callback> + <class name="Movie" + c:symbol-prefix="movie" + c:type="PopplerMovie" + parent="GObject.Object" + glib:type-name="PopplerMovie" + glib:get-type="poppler_movie_get_type"> + <method name="get_filename" + c:identifier="poppler_movie_get_filename" + version="0.14"> + <doc xml:whitespace="preserve">Returns the local filename identifying a self-describing movie file</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">a local filename, return value is owned by #PopplerMovie and should not be freed</doc> + <type name="utf8" c:type="const gchar*"/> + </return-value> + </method> + <method name="need_poster" + c:identifier="poppler_movie_need_poster" + version="0.14"> + <doc xml:whitespace="preserve">Returns whether a poster image representing the Movie +shall be displayed. The poster image must be retrieved +from the movie file.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if move needs a poster image, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + <method name="show_controls" + c:identifier="poppler_movie_show_controls" + version="0.14"> + <doc xml:whitespace="preserve">Returns whether to display a movie controller bar while playing the movie</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if controller bar should be displayed, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + </method> + </class> + <enumeration name="Orientation" + glib:type-name="PopplerOrientation" + glib:get-type="poppler_orientation_get_type" + c:type="PopplerOrientation"> + <member name="portrait" + value="0" + c:identifier="POPPLER_ORIENTATION_PORTRAIT" + glib:nick="portrait"/> + <member name="landscape" + value="1" + c:identifier="POPPLER_ORIENTATION_LANDSCAPE" + glib:nick="landscape"/> + <member name="upsidedown" + value="2" + c:identifier="POPPLER_ORIENTATION_UPSIDEDOWN" + glib:nick="upsidedown"/> + <member name="seascape" + value="3" + c:identifier="POPPLER_ORIENTATION_SEASCAPE" + glib:nick="seascape"/> + </enumeration> + <class name="PSFile" + c:symbol-prefix="ps_file" + c:type="PopplerPSFile" + parent="GObject.Object" + glib:type-name="PopplerPSFile" + glib:get-type="poppler_ps_file_get_type"> + <constructor name="new" c:identifier="poppler_ps_file_new"> + <doc xml:whitespace="preserve">Create a new postscript file to render to</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a PopplerPSFile</doc> + <type name="PSFile" c:type="PopplerPSFile*"/> + </return-value> + <parameters> + <parameter name="document" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerDocument</doc> + <type name="Document" c:type="PopplerDocument*"/> + </parameter> + <parameter name="filename" transfer-ownership="none"> + <doc xml:whitespace="preserve">the path of the output filename</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + <parameter name="first_page" transfer-ownership="none"> + <doc xml:whitespace="preserve">the first page to print</doc> + <type name="gint" c:type="int"/> + </parameter> + <parameter name="n_pages" transfer-ownership="none"> + <doc xml:whitespace="preserve">the number of pages to print</doc> + <type name="gint" c:type="int"/> + </parameter> + </parameters> + </constructor> + <method name="free" c:identifier="poppler_ps_file_free"> + <doc xml:whitespace="preserve">Frees @ps_file</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + <method name="set_duplex" c:identifier="poppler_ps_file_set_duplex"> + <doc xml:whitespace="preserve">Enable or disable Duplex printing.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="duplex" transfer-ownership="none"> + <doc xml:whitespace="preserve">whether to force duplex printing (on printers which support this)</doc> + <type name="gboolean" c:type="gboolean"/> + </parameter> + </parameters> + </method> + <method name="set_paper_size" + c:identifier="poppler_ps_file_set_paper_size"> + <doc xml:whitespace="preserve">Set the output paper size. These values will end up in the +DocumentMedia, the BoundingBox DSC comments and other places in the +generated PostScript.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="width" transfer-ownership="none"> + <doc xml:whitespace="preserve">the paper width in 1/72 inch</doc> + <type name="gdouble" c:type="double"/> + </parameter> + <parameter name="height" transfer-ownership="none"> + <doc xml:whitespace="preserve">the paper height in 1/72 inch</doc> + <type name="gdouble" c:type="double"/> + </parameter> + </parameters> + </method> + </class> + <class name="Page" + c:symbol-prefix="page" + c:type="PopplerPage" + parent="GObject.Object" + glib:type-name="PopplerPage" + glib:get-type="poppler_page_get_type"> + <function name="free_annot_mapping" + c:identifier="poppler_page_free_annot_mapping"> + <doc xml:whitespace="preserve">Frees a list of #PopplerAnnotMapping<!-- -->s allocated by +poppler_page_get_annot_mapping(). It also unreferences the #PopplerAnnot<!-- -->s +that each mapping contains, so if you want to keep them around, you need to +reference them with g_object_ref().</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="list" transfer-ownership="none"> + <doc xml:whitespace="preserve">A list of #PopplerAnnotMapping<!-- -->s</doc> + <type name="GLib.List" c:type="GList*"> + <type name="AnnotMapping"/> + </type> + </parameter> + </parameters> + </function> + <function name="free_form_field_mapping" + c:identifier="poppler_page_free_form_field_mapping"> + <doc xml:whitespace="preserve">Frees a list of #PopplerFormFieldMapping<!-- -->s allocated by +poppler_page_get_form_field_mapping().</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="list" transfer-ownership="none"> + <doc xml:whitespace="preserve">A list of #PopplerFormFieldMapping<!-- -->s</doc> + <type name="GLib.List" c:type="GList*"> + <type name="FormFieldMapping"/> + </type> + </parameter> + </parameters> + </function> + <function name="free_image_mapping" + c:identifier="poppler_page_free_image_mapping"> + <doc xml:whitespace="preserve">Frees a list of #PopplerImageMapping<!-- -->s allocated by +poppler_page_get_image_mapping().</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="list" transfer-ownership="none"> + <doc xml:whitespace="preserve">A list of #PopplerImageMapping<!-- -->s</doc> + <type name="GLib.List" c:type="GList*"> + <type name="ImageMapping"/> + </type> + </parameter> + </parameters> + </function> + <function name="free_link_mapping" + c:identifier="poppler_page_free_link_mapping"> + <doc xml:whitespace="preserve">Frees a list of #PopplerLinkMapping<!-- -->s allocated by +poppler_page_get_link_mapping(). It also frees the #PopplerAction<!-- -->s +that each mapping contains, so if you want to keep them around, you need to +copy them with poppler_action_copy().</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="list" transfer-ownership="none"> + <doc xml:whitespace="preserve">A list of #PopplerLinkMapping<!-- -->s</doc> + <type name="GLib.List" c:type="GList*"> + <type name="LinkMapping"/> + </type> + </parameter> + </parameters> + </function> + <function name="free_text_attributes" + c:identifier="poppler_page_free_text_attributes" + version="0.18"> + <doc xml:whitespace="preserve">Frees a list of #PopplerTextAttributes<!-- -->s allocated by +poppler_page_get_text_attributes().</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="list" transfer-ownership="none"> + <doc xml:whitespace="preserve">A list of #PopplerTextAttributes<!-- -->s</doc> + <type name="GLib.List" c:type="GList*"> + <type name="TextAttributes"/> + </type> + </parameter> + </parameters> + </function> + <function name="selection_region_free" + c:identifier="poppler_page_selection_region_free" + deprecated="0.16"> + <doc xml:whitespace="preserve">Frees @region</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="region" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #GList of #PopplerRectangle</doc> + <type name="GLib.List" c:type="GList*"> + <type name="Rectangle"/> + </type> + </parameter> + </parameters> + </function> + <method name="add_annot" + c:identifier="poppler_page_add_annot" + version="0.16"> + <doc xml:whitespace="preserve">Adds annotation @annot to @page.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="annot" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerAnnot to add</doc> + <type name="Annot" c:type="PopplerAnnot*"/> + </parameter> + </parameters> + </method> + <method name="find_text" c:identifier="poppler_page_find_text"> + <doc xml:whitespace="preserve">A #GList of rectangles for each occurance of the text on the page. +The coordinates are in PDF points.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a #GList of #PopplerRectangle,</doc> + <type name="GLib.List" c:type="GList*"> + <type name="Rectangle"/> + </type> + </return-value> + <parameters> + <parameter name="text" transfer-ownership="none"> + <doc xml:whitespace="preserve">the text to search for (UTF-8 encoded)</doc> + <type name="utf8" c:type="const char*"/> + </parameter> + </parameters> + </method> + <method name="get_annot_mapping" + c:identifier="poppler_page_get_annot_mapping"> + <doc xml:whitespace="preserve">Returns a list of #PopplerAnnotMapping items that map from a location on +@page to a #PopplerAnnot. This list must be freed with +poppler_page_free_annot_mapping() when done.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A #GList of #PopplerAnnotMapping</doc> + <type name="GLib.List" c:type="GList*"> + <type name="AnnotMapping"/> + </type> + </return-value> + </method> + <method name="get_crop_box" c:identifier="poppler_page_get_crop_box"> + <doc xml:whitespace="preserve">Retrurns the crop box of @page</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="rect" + direction="out" + caller-allocates="1" + transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerRectangle to fill</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </method> + <method name="get_duration" c:identifier="poppler_page_get_duration"> + <doc xml:whitespace="preserve">Returns the duration of @page</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">duration in seconds of @page or -1.</doc> + <type name="gdouble" c:type="double"/> + </return-value> + </method> + <method name="get_form_field_mapping" + c:identifier="poppler_page_get_form_field_mapping"> + <doc xml:whitespace="preserve">Returns a list of #PopplerFormFieldMapping items that map from a +location on @page to a form field. This list must be freed +with poppler_page_free_form_field_mapping() when done.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A #GList of #PopplerFormFieldMapping</doc> + <type name="GLib.List" c:type="GList*"> + <type name="FormFieldMapping"/> + </type> + </return-value> + </method> + <method name="get_image" c:identifier="poppler_page_get_image"> + <doc xml:whitespace="preserve">Returns a cairo surface for the image of the @page</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A cairo surface for the image</doc> + <type name="cairo.Surface" c:type="cairo_surface_t*"/> + </return-value> + <parameters> + <parameter name="image_id" transfer-ownership="none"> + <doc xml:whitespace="preserve">The image identifier</doc> + <type name="gint" c:type="gint"/> + </parameter> + </parameters> + </method> + <method name="get_image_mapping" + c:identifier="poppler_page_get_image_mapping"> + <doc xml:whitespace="preserve">Returns a list of #PopplerImageMapping items that map from a +location on @page to an image of the page. This list must be freed +with poppler_page_free_image_mapping() when done.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A #GList of #PopplerImageMapping</doc> + <type name="GLib.List" c:type="GList*"> + <type name="ImageMapping"/> + </type> + </return-value> + </method> + <method name="get_index" c:identifier="poppler_page_get_index"> + <doc xml:whitespace="preserve">Returns the index of @page</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">index value of @page</doc> + <type name="gint" c:type="int"/> + </return-value> + </method> + <method name="get_label" + c:identifier="poppler_page_get_label" + version="0.16"> + <doc xml:whitespace="preserve">Returns the label of @page. Note that page labels +and page indices might not coincide.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated string containing the label of @page, or %NULL if @page doesn't have a label</doc> + <type name="utf8" c:type="gchar*"/> + </return-value> + </method> + <method name="get_link_mapping" + c:identifier="poppler_page_get_link_mapping"> + <doc xml:whitespace="preserve">Returns a list of #PopplerLinkMapping items that map from a +location on @page to a #PopplerAction. This list must be freed +with poppler_page_free_link_mapping() when done.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A #GList of #PopplerLinkMapping</doc> + <type name="GLib.List" c:type="GList*"> + <type name="LinkMapping"/> + </type> + </return-value> + </method> + <method name="get_selected_region" + c:identifier="poppler_page_get_selected_region" + version="0.16"> + <doc xml:whitespace="preserve">Returns a region containing the area that would be rendered by +poppler_page_render_selection(). +The returned region must be freed with cairo_region_destroy()</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a cairo_region_t</doc> + <type name="cairo.Region" c:type="cairo_region_t*"/> + </return-value> + <parameters> + <parameter name="scale" transfer-ownership="none"> + <doc xml:whitespace="preserve">scale specified as pixels per point</doc> + <type name="gdouble" c:type="gdouble"/> + </parameter> + <parameter name="style" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc> + <type name="SelectionStyle" c:type="PopplerSelectionStyle"/> + </parameter> + <parameter name="selection" transfer-ownership="none"> + <doc xml:whitespace="preserve">start and end point of selection as a rectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </method> + <method name="get_selected_text" + c:identifier="poppler_page_get_selected_text" + version="0.16"> + <doc xml:whitespace="preserve">Retrieves the contents of the specified @selection as text.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a pointer to the contents of the @selection as a string</doc> + <type name="utf8" c:type="char*"/> + </return-value> + <parameters> + <parameter name="style" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc> + <type name="SelectionStyle" c:type="PopplerSelectionStyle"/> + </parameter> + <parameter name="selection" transfer-ownership="none"> + <doc xml:whitespace="preserve">the #PopplerRectangle including the text</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </method> + <method name="get_selection_region" + c:identifier="poppler_page_get_selection_region" + deprecated="Use poppler_page_get_selected_region() instead." + deprecated-version="0.16"> + <doc xml:whitespace="preserve">Returns a region containing the area that would be rendered by +poppler_page_render_selection() as a #GList of +#PopplerRectangle. The returned list must be freed with +poppler_page_selection_region_free().</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a #GList of #PopplerRectangle</doc> + <type name="GLib.List" c:type="GList*"> + <type name="Rectangle"/> + </type> + </return-value> + <parameters> + <parameter name="scale" transfer-ownership="none"> + <doc xml:whitespace="preserve">scale specified as pixels per point</doc> + <type name="gdouble" c:type="gdouble"/> + </parameter> + <parameter name="style" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc> + <type name="SelectionStyle" c:type="PopplerSelectionStyle"/> + </parameter> + <parameter name="selection" transfer-ownership="none"> + <doc xml:whitespace="preserve">start and end point of selection as a rectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + </parameters> + </method> + <method name="get_size" c:identifier="poppler_page_get_size"> + <doc xml:whitespace="preserve">Gets the size of @page at the current scale and rotation.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="width" + direction="out" + caller-allocates="0" + transfer-ownership="full" + allow-none="1"> + <doc xml:whitespace="preserve">return location for the width of @page</doc> + <type name="gdouble" c:type="double*"/> + </parameter> + <parameter name="height" + direction="out" + caller-allocates="0" + transfer-ownership="full" + allow-none="1"> + <doc xml:whitespace="preserve">return location for the height of @page</doc> + <type name="gdouble" c:type="double*"/> + </parameter> + </parameters> + </method> + <method name="get_text" + c:identifier="poppler_page_get_text" + version="0.16"> + <doc xml:whitespace="preserve">Retrieves the text of @page.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a pointer to the text of the @page as a string</doc> + <type name="utf8" c:type="char*"/> + </return-value> + </method> + <method name="get_text_attributes" + c:identifier="poppler_page_get_text_attributes" + version="0.18"> + <doc xml:whitespace="preserve">Obtains the attributes of the text as a GList of #PopplerTextAttributes. +This list must be freed with poppler_page_free_text_attributes() when done. + +Each list element is a #PopplerTextAttributes struct where start_index and +end_index indicates the range of text (as returned by poppler_page_get_text()) +to which text attributes apply.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">A #GList of #PopplerTextAttributes</doc> + <type name="GLib.List" c:type="GList*"> + <type name="TextAttributes"/> + </type> + </return-value> + </method> + <method name="get_text_layout" + c:identifier="poppler_page_get_text_layout" + version="0.16"> + <doc xml:whitespace="preserve">Obtains the layout of the text as a list of #PopplerRectangle +This array must be freed with g_free () when done. + +The position in the array represents an offset in the text returned by +poppler_page_get_text()</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE if the page contains text, %FALSE otherwise</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="rectangles" + direction="out" + caller-allocates="0" + transfer-ownership="container"> + <doc xml:whitespace="preserve">return location for an array of #PopplerRectangle</doc> + <array length="1" zero-terminated="0" c:type="PopplerRectangle**"> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </array> + </parameter> + <parameter name="n_rectangles" + direction="out" + caller-allocates="0" + transfer-ownership="full"> + <doc xml:whitespace="preserve">length of returned array</doc> + <type name="guint" c:type="guint*"/> + </parameter> + </parameters> + </method> + <method name="get_thumbnail" c:identifier="poppler_page_get_thumbnail"> + <doc xml:whitespace="preserve">Get the embedded thumbnail for the specified page. If the document +doesn't have an embedded thumbnail for the page, this function +returns %NULL.</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">the tumbnail as a cairo_surface_t or %NULL if the document doesn't have a thumbnail for this page.</doc> + <type name="cairo.Surface" c:type="cairo_surface_t*"/> + </return-value> + </method> + <method name="get_thumbnail_size" + c:identifier="poppler_page_get_thumbnail_size"> + <doc xml:whitespace="preserve">Returns %TRUE if @page has a thumbnail associated with it. It also +fills in @width and @height with the width and height of the +thumbnail. The values of width and height are not changed if no +appropriate thumbnail exists.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">%TRUE, if @page has a thumbnail associated with it.</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="width" + direction="out" + caller-allocates="0" + transfer-ownership="full"> + <doc xml:whitespace="preserve">return location for width</doc> + <type name="gint" c:type="int*"/> + </parameter> + <parameter name="height" + direction="out" + caller-allocates="0" + transfer-ownership="full"> + <doc xml:whitespace="preserve">return location for height</doc> + <type name="gint" c:type="int*"/> + </parameter> + </parameters> + </method> + <method name="get_transition" c:identifier="poppler_page_get_transition"> + <doc xml:whitespace="preserve">Returns the transition effect of @page</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a #PopplerPageTransition or %NULL.</doc> + <type name="PageTransition" c:type="PopplerPageTransition*"/> + </return-value> + </method> + <method name="render" c:identifier="poppler_page_render"> + <doc xml:whitespace="preserve">Render the page to the given cairo context. This function +is for rendering a page that will be displayed. If you want +to render a page that will be printed use +poppler_page_render_for_printing() instead</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="cairo" transfer-ownership="none"> + <doc xml:whitespace="preserve">cairo context to render to</doc> + <type name="cairo.Context" c:type="cairo_t*"/> + </parameter> + </parameters> + </method> + <method name="render_for_printing" + c:identifier="poppler_page_render_for_printing"> + <doc xml:whitespace="preserve">Render the page to the given cairo context for printing.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="cairo" transfer-ownership="none"> + <doc xml:whitespace="preserve">cairo context to render to</doc> + <type name="cairo.Context" c:type="cairo_t*"/> + </parameter> + </parameters> + </method> + <method name="render_for_printing_with_options" + c:identifier="poppler_page_render_for_printing_with_options" + version="0.16"> + <doc xml:whitespace="preserve">Render the page to the given cairo context for printing +with the specified options</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="cairo" transfer-ownership="none"> + <doc xml:whitespace="preserve">cairo context to render to</doc> + <type name="cairo.Context" c:type="cairo_t*"/> + </parameter> + <parameter name="options" transfer-ownership="none"> + <doc xml:whitespace="preserve">print options</doc> + <type name="PrintFlags" c:type="PopplerPrintFlags"/> + </parameter> + </parameters> + </method> + <method name="render_selection" + c:identifier="poppler_page_render_selection"> + <doc xml:whitespace="preserve">Render the selection specified by @selection for @page to +the given cairo context. The selection will be rendered, using +@glyph_color for the glyphs and @background_color for the selection +background. + +If non-NULL, @old_selection specifies the selection that is already +rendered to @cairo, in which case this function will (some day) +only render the changed part of the selection.</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="cairo" transfer-ownership="none"> + <doc xml:whitespace="preserve">cairo context to render to</doc> + <type name="cairo.Context" c:type="cairo_t*"/> + </parameter> + <parameter name="selection" transfer-ownership="none"> + <doc xml:whitespace="preserve">start and end point of selection as a rectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + <parameter name="old_selection" transfer-ownership="none"> + <doc xml:whitespace="preserve">previous selection</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </parameter> + <parameter name="style" transfer-ownership="none"> + <doc xml:whitespace="preserve">a #PopplerSelectionStyle</doc> + <type name="SelectionStyle" c:type="PopplerSelectionStyle"/> + </parameter> + <parameter name="glyph_color" transfer-ownership="none"> + <doc xml:whitespace="preserve">color to use for drawing glyphs</doc> + <type name="Color" c:type="PopplerColor*"/> + </parameter> + <parameter name="background_color" transfer-ownership="none"> + <doc xml:whitespace="preserve">color to use for the selection background</doc> + <type name="Color" c:type="PopplerColor*"/> + </parameter> + </parameters> + </method> + <method name="render_to_ps" c:identifier="poppler_page_render_to_ps"> + <doc xml:whitespace="preserve">Render the page on a postscript file</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="ps_file" transfer-ownership="none"> + <doc xml:whitespace="preserve">the PopplerPSFile to render to</doc> + <type name="PSFile" c:type="PopplerPSFile*"/> + </parameter> + </parameters> + </method> + <property name="label" transfer-ownership="none"> + <doc xml:whitespace="preserve">The label of the page or %NULL. See also poppler_page_get_label()</doc> + <type name="utf8"/> + </property> + </class> + <enumeration name="PageLayout" + glib:type-name="PopplerPageLayout" + glib:get-type="poppler_page_layout_get_type" + c:type="PopplerPageLayout"> + <doc xml:whitespace="preserve">Page layout types</doc> + <member name="unset" + value="0" + c:identifier="POPPLER_PAGE_LAYOUT_UNSET" + glib:nick="unset"/> + <member name="single_page" + value="1" + c:identifier="POPPLER_PAGE_LAYOUT_SINGLE_PAGE" + glib:nick="single-page"/> + <member name="one_column" + value="2" + c:identifier="POPPLER_PAGE_LAYOUT_ONE_COLUMN" + glib:nick="one-column"/> + <member name="two_column_left" + value="3" + c:identifier="POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT" + glib:nick="two-column-left"/> + <member name="two_column_right" + value="4" + c:identifier="POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT" + glib:nick="two-column-right"/> + <member name="two_page_left" + value="5" + c:identifier="POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT" + glib:nick="two-page-left"/> + <member name="two_page_right" + value="6" + c:identifier="POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT" + glib:nick="two-page-right"/> + </enumeration> + <enumeration name="PageMode" + glib:type-name="PopplerPageMode" + glib:get-type="poppler_page_mode_get_type" + c:type="PopplerPageMode"> + <doc xml:whitespace="preserve">Page modes</doc> + <member name="unset" + value="0" + c:identifier="POPPLER_PAGE_MODE_UNSET" + glib:nick="unset"/> + <member name="none" + value="1" + c:identifier="POPPLER_PAGE_MODE_NONE" + glib:nick="none"/> + <member name="use_outlines" + value="2" + c:identifier="POPPLER_PAGE_MODE_USE_OUTLINES" + glib:nick="use-outlines"/> + <member name="use_thumbs" + value="3" + c:identifier="POPPLER_PAGE_MODE_USE_THUMBS" + glib:nick="use-thumbs"/> + <member name="full_screen" + value="4" + c:identifier="POPPLER_PAGE_MODE_FULL_SCREEN" + glib:nick="full-screen"/> + <member name="use_oc" + value="5" + c:identifier="POPPLER_PAGE_MODE_USE_OC" + glib:nick="use-oc"/> + <member name="use_attachments" + value="6" + c:identifier="POPPLER_PAGE_MODE_USE_ATTACHMENTS" + glib:nick="use-attachments"/> + </enumeration> + <record name="PageTransition" + c:type="PopplerPageTransition" + glib:type-name="PopplerPageTransition" + glib:get-type="poppler_page_transition_get_type" + c:symbol-prefix="page_transition"> + <doc xml:whitespace="preserve">A #PopplerPageTransition structures describes a visual transition +to use when moving between pages during a presentation</doc> + <field name="type" writable="1"> + <type name="PageTransitionType" c:type="PopplerPageTransitionType"/> + </field> + <field name="alignment" writable="1"> + <type name="PageTransitionAlignment" + c:type="PopplerPageTransitionAlignment"/> + </field> + <field name="direction" writable="1"> + <type name="PageTransitionDirection" + c:type="PopplerPageTransitionDirection"/> + </field> + <field name="duration" writable="1"> + <type name="gint" c:type="gint"/> + </field> + <field name="angle" writable="1"> + <type name="gint" c:type="gint"/> + </field> + <field name="scale" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="rectangular" writable="1"> + <type name="gboolean" c:type="gboolean"/> + </field> + <constructor name="new" c:identifier="poppler_page_transition_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerPageTransition</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerPageTransition, use poppler_page_transition_free() to free it</doc> + <type name="PageTransition" c:type="PopplerPageTransition*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_page_transition_copy"> + <doc xml:whitespace="preserve">Creates a copy of @transition</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @transition</doc> + <type name="PageTransition" c:type="PopplerPageTransition*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_page_transition_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerPageTransition</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <enumeration name="PageTransitionAlignment" + glib:type-name="PopplerPageTransitionAlignment" + glib:get-type="poppler_page_transition_alignment_get_type" + c:type="PopplerPageTransitionAlignment"> + <doc xml:whitespace="preserve">Page transition alignment types for #POPPLER_PAGE_TRANSITION_SPLIT +and #POPPLER_PAGE_TRANSITION_BLINDS transition types</doc> + <member name="horizontal" + value="0" + c:identifier="POPPLER_PAGE_TRANSITION_HORIZONTAL" + glib:nick="horizontal"/> + <member name="vertical" + value="1" + c:identifier="POPPLER_PAGE_TRANSITION_VERTICAL" + glib:nick="vertical"/> + </enumeration> + <enumeration name="PageTransitionDirection" + glib:type-name="PopplerPageTransitionDirection" + glib:get-type="poppler_page_transition_direction_get_type" + c:type="PopplerPageTransitionDirection"> + <doc xml:whitespace="preserve">Page transition direction types for #POPPLER_PAGE_TRANSITION_SPLIT, +#POPPLER_PAGE_TRANSITION_BOX and #POPPLER_PAGE_TRANSITION_FLY transition types</doc> + <member name="inward" + value="0" + c:identifier="POPPLER_PAGE_TRANSITION_INWARD" + glib:nick="inward"/> + <member name="outward" + value="1" + c:identifier="POPPLER_PAGE_TRANSITION_OUTWARD" + glib:nick="outward"/> + </enumeration> + <enumeration name="PageTransitionType" + glib:type-name="PopplerPageTransitionType" + glib:get-type="poppler_page_transition_type_get_type" + c:type="PopplerPageTransitionType"> + <doc xml:whitespace="preserve">Page transition types</doc> + <member name="replace" + value="0" + c:identifier="POPPLER_PAGE_TRANSITION_REPLACE" + glib:nick="replace"/> + <member name="split" + value="1" + c:identifier="POPPLER_PAGE_TRANSITION_SPLIT" + glib:nick="split"/> + <member name="blinds" + value="2" + c:identifier="POPPLER_PAGE_TRANSITION_BLINDS" + glib:nick="blinds"/> + <member name="box" + value="3" + c:identifier="POPPLER_PAGE_TRANSITION_BOX" + glib:nick="box"/> + <member name="wipe" + value="4" + c:identifier="POPPLER_PAGE_TRANSITION_WIPE" + glib:nick="wipe"/> + <member name="dissolve" + value="5" + c:identifier="POPPLER_PAGE_TRANSITION_DISSOLVE" + glib:nick="dissolve"/> + <member name="glitter" + value="6" + c:identifier="POPPLER_PAGE_TRANSITION_GLITTER" + glib:nick="glitter"/> + <member name="fly" + value="7" + c:identifier="POPPLER_PAGE_TRANSITION_FLY" + glib:nick="fly"/> + <member name="push" + value="8" + c:identifier="POPPLER_PAGE_TRANSITION_PUSH" + glib:nick="push"/> + <member name="cover" + value="9" + c:identifier="POPPLER_PAGE_TRANSITION_COVER" + glib:nick="cover"/> + <member name="uncover" + value="10" + c:identifier="POPPLER_PAGE_TRANSITION_UNCOVER" + glib:nick="uncover"/> + <member name="fade" + value="11" + c:identifier="POPPLER_PAGE_TRANSITION_FADE" + glib:nick="fade"/> + </enumeration> + <bitfield name="Permissions" + glib:type-name="PopplerPermissions" + glib:get-type="poppler_permissions_get_type" + c:type="PopplerPermissions"> + <doc xml:whitespace="preserve">Permissions</doc> + <member name="ok_to_print" + value="1" + c:identifier="POPPLER_PERMISSIONS_OK_TO_PRINT" + glib:nick="ok-to-print"/> + <member name="ok_to_modify" + value="2" + c:identifier="POPPLER_PERMISSIONS_OK_TO_MODIFY" + glib:nick="ok-to-modify"/> + <member name="ok_to_copy" + value="4" + c:identifier="POPPLER_PERMISSIONS_OK_TO_COPY" + glib:nick="ok-to-copy"/> + <member name="ok_to_add_notes" + value="8" + c:identifier="POPPLER_PERMISSIONS_OK_TO_ADD_NOTES" + glib:nick="ok-to-add-notes"/> + <member name="ok_to_fill_form" + value="16" + c:identifier="POPPLER_PERMISSIONS_OK_TO_FILL_FORM" + glib:nick="ok-to-fill-form"/> + <member name="ok_to_extract_contents" + value="32" + c:identifier="POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS" + glib:nick="ok-to-extract-contents"/> + <member name="ok_to_assemble" + value="64" + c:identifier="POPPLER_PERMISSIONS_OK_TO_ASSEMBLE" + glib:nick="ok-to-assemble"/> + <member name="ok_to_print_high_resolution" + value="128" + c:identifier="POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION" + glib:nick="ok-to-print-high-resolution"/> + <member name="full" + value="255" + c:identifier="POPPLER_PERMISSIONS_FULL" + glib:nick="full"/> + </bitfield> + <bitfield name="PrintFlags" + version="0.16" + glib:type-name="PopplerPrintFlags" + glib:get-type="poppler_print_flags_get_type" + c:type="PopplerPrintFlags"> + <doc xml:whitespace="preserve">Printing flags</doc> + <member name="document" + value="0" + c:identifier="POPPLER_PRINT_DOCUMENT" + glib:nick="document"/> + <member name="markup_annots" + value="1" + c:identifier="POPPLER_PRINT_MARKUP_ANNOTS" + glib:nick="markup-annots"/> + <member name="stamp_annots_only" + value="2" + c:identifier="POPPLER_PRINT_STAMP_ANNOTS_ONLY" + glib:nick="stamp-annots-only"/> + <member name="all" + value="1" + c:identifier="POPPLER_PRINT_ALL" + glib:nick="all"/> + </bitfield> + <record name="Rectangle" + c:type="PopplerRectangle" + glib:type-name="PopplerRectangle" + glib:get-type="poppler_rectangle_get_type" + c:symbol-prefix="rectangle"> + <doc xml:whitespace="preserve">A #PopplerRectangle is used to describe +locations on a page and bounding boxes</doc> + <field name="x1" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="y1" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="x2" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="y2" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <constructor name="new" c:identifier="poppler_rectangle_new"> + <doc xml:whitespace="preserve">Creates a new #PopplerRectangle</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerRectangle, use poppler_rectangle_free() to free it</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </return-value> + </constructor> + <method name="copy" c:identifier="poppler_rectangle_copy"> + <doc xml:whitespace="preserve">Creates a copy of @rectangle</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @rectangle</doc> + <type name="Rectangle" c:type="PopplerRectangle*"/> + </return-value> + </method> + <method name="free" c:identifier="poppler_rectangle_free"> + <doc xml:whitespace="preserve">Frees the given #PopplerRectangle</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <enumeration name="SelectionStyle" + glib:type-name="PopplerSelectionStyle" + glib:get-type="poppler_selection_style_get_type" + c:type="PopplerSelectionStyle"> + <doc xml:whitespace="preserve">Selection styles</doc> + <member name="glyph" + value="0" + c:identifier="POPPLER_SELECTION_GLYPH" + glib:nick="glyph"/> + <member name="word" + value="1" + c:identifier="POPPLER_SELECTION_WORD" + glib:nick="word"/> + <member name="line" + value="2" + c:identifier="POPPLER_SELECTION_LINE" + glib:nick="line"/> + </enumeration> + <record name="TextAttributes" + c:type="PopplerTextAttributes" + version="0.18" + glib:type-name="PopplerTextAttributes" + glib:get-type="poppler_text_attributes_get_type" + c:symbol-prefix="text_attributes"> + <doc xml:whitespace="preserve">A #PopplerTextAttributes is used to describe text attributes of a range of text</doc> + <field name="font_name" writable="1"> + <type name="utf8" c:type="gchar*"/> + </field> + <field name="font_size" writable="1"> + <type name="gdouble" c:type="gdouble"/> + </field> + <field name="is_underlined" writable="1"> + <type name="gboolean" c:type="gboolean"/> + </field> + <field name="color" writable="1"> + <type name="Color" c:type="PopplerColor"/> + </field> + <field name="start_index" writable="1"> + <type name="gint" c:type="gint"/> + </field> + <field name="end_index" writable="1"> + <type name="gint" c:type="gint"/> + </field> + <constructor name="new" + c:identifier="poppler_text_attributes_new" + version="0.18"> + <doc xml:whitespace="preserve">Creates a new #PopplerTextAttributes</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new #PopplerTextAttributes, use poppler_text_attributes_free() to free it</doc> + <type name="TextAttributes" c:type="PopplerTextAttributes*"/> + </return-value> + </constructor> + <method name="copy" + c:identifier="poppler_text_attributes_copy" + version="0.18"> + <doc xml:whitespace="preserve">Creates a copy of @text_attrs</doc> + <return-value transfer-ownership="full"> + <doc xml:whitespace="preserve">a new allocated copy of @text_attrs</doc> + <type name="TextAttributes" c:type="PopplerTextAttributes*"/> + </return-value> + </method> + <method name="free" + c:identifier="poppler_text_attributes_free" + version="0.18"> + <doc xml:whitespace="preserve">Frees the given #PopplerTextAttributes</doc> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + </method> + </record> + <bitfield name="ViewerPreferences" + glib:type-name="PopplerViewerPreferences" + glib:get-type="poppler_viewer_preferences_get_type" + c:type="PopplerViewerPreferences"> + <doc xml:whitespace="preserve">Viewer preferences</doc> + <member name="unset" + value="0" + c:identifier="POPPLER_VIEWER_PREFERENCES_UNSET" + glib:nick="unset"/> + <member name="hide_toolbar" + value="1" + c:identifier="POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR" + glib:nick="hide-toolbar"/> + <member name="hide_menubar" + value="2" + c:identifier="POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR" + glib:nick="hide-menubar"/> + <member name="hide_windowui" + value="4" + c:identifier="POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI" + glib:nick="hide-windowui"/> + <member name="fit_window" + value="8" + c:identifier="POPPLER_VIEWER_PREFERENCES_FIT_WINDOW" + glib:nick="fit-window"/> + <member name="center_window" + value="16" + c:identifier="POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW" + glib:nick="center-window"/> + <member name="display_doc_title" + value="32" + c:identifier="POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE" + glib:nick="display-doc-title"/> + <member name="direction_rtl" + value="64" + c:identifier="POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL" + glib:nick="direction-rtl"/> + </bitfield> + <record name="_AttachmentClass" c:type="_PopplerAttachmentClass"> + <field name="parent_class" writable="1"> + <type name="GObject.ObjectClass" c:type="GObjectClass"/> + </field> + </record> + <function name="date_parse" + c:identifier="poppler_date_parse" + version="0.12"> + <doc xml:whitespace="preserve">Parses a PDF format date string and converts it to a #time_t. Returns #FALSE +if the parsing fails or the input string is not a valid PDF format date string</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">#TRUE, if @timet was set</doc> + <type name="gboolean" c:type="gboolean"/> + </return-value> + <parameters> + <parameter name="date" transfer-ownership="none"> + <doc xml:whitespace="preserve">string to parse</doc> + <type name="utf8" c:type="const gchar*"/> + </parameter> + <parameter name="timet" transfer-ownership="none"> + <doc xml:whitespace="preserve">an uninitialized #time_t</doc> + <type name="glong" c:type="time_t*"/> + </parameter> + </parameters> + </function> + <function name="error_quark" + c:identifier="poppler_error_quark" + moved-to="Error.quark"> + <return-value transfer-ownership="none"> + <type name="GLib.Quark" c:type="GQuark"/> + </return-value> + </function> + <function name="get_backend" c:identifier="poppler_get_backend"> + <doc xml:whitespace="preserve">Returns the backend compiled into the poppler library.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">The backend used by poppler</doc> + <type name="Backend" c:type="PopplerBackend"/> + </return-value> + </function> + <function name="get_version" c:identifier="poppler_get_version"> + <doc xml:whitespace="preserve">Returns the version of poppler in use. This result is not to be freed.</doc> + <return-value transfer-ownership="none"> + <doc xml:whitespace="preserve">the version of poppler.</doc> + <type name="utf8" c:type="const char*"/> + </return-value> + </function> + </namespace> +</repository> diff --git a/glib/demo/CMakeLists.txt b/glib/demo/CMakeLists.txt new file mode 100644 index 0000000..286fbd7 --- /dev/null +++ b/glib/demo/CMakeLists.txt @@ -0,0 +1,28 @@ +include_directories( + ${GTK2_INCLUDE_DIRS} +) + +add_definitions(${GTK2_CFLAGS_OTHER}) + +set(poppler_glib_demo_SRCS + main.c + find.c + fonts.c + forms.c + info.cc + images.c + links.c + outline.c + page.c + print.c + render.c + text.c + transitions.c + utils.c + annots.c + attachments.c + layers.c + selections.c +) +poppler_add_test(poppler-glib-demo BUILD_GTK_TESTS ${poppler_glib_demo_SRCS}) +target_link_libraries(poppler-glib-demo poppler-glib ${GTK2_LIBRARIES}) diff --git a/glib/demo/Makefile.am b/glib/demo/Makefile.am new file mode 100644 index 0000000..28fc22d --- /dev/null +++ b/glib/demo/Makefile.am @@ -0,0 +1,55 @@ +INCLUDES = \ + -I$(top_srcdir)/glib \ + -I$(top_builddir)/glib \ + $(GTK_TEST_CFLAGS) \ + $(POPPLER_GLIB_DISABLE_DEPRECATED) \ + -DGTK_DISABLE_DEPRECATED \ + $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES) + +AM_LDFLAGS = @auto_import_flags@ + +if BUILD_GTK_TEST +bin_PROGRAMS = poppler-glib-demo +endif + +poppler_glib_demo_SOURCES = \ + main.c \ + annots.h \ + annots.c \ + attachments.c \ + attachments.h \ + find.h \ + find.c \ + fonts.h \ + fonts.c \ + forms.h \ + forms.c \ + images.h \ + images.c \ + info.h \ + info.cc \ + layers.h \ + layers.c \ + links.h \ + links.c \ + outline.h \ + outline.c \ + page.h \ + page.c \ + print.h \ + print.c \ + render.h \ + render.c \ + selections.h \ + selections.c \ + text.h \ + text.c \ + transitions.h \ + transitions.c \ + utils.h \ + utils.c + +LDADD = \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(top_builddir)/poppler/libpoppler.la \ + $(GTK_TEST_LIBS) diff --git a/glib/demo/Makefile.in b/glib/demo/Makefile.in new file mode 100644 index 0000000..36077c2 --- /dev/null +++ b/glib/demo/Makefile.in @@ -0,0 +1,758 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BUILD_GTK_TEST_TRUE@bin_PROGRAMS = poppler-glib-demo$(EXEEXT) +subdir = glib/demo +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_poppler_glib_demo_OBJECTS = main.$(OBJEXT) annots.$(OBJEXT) \ + attachments.$(OBJEXT) find.$(OBJEXT) fonts.$(OBJEXT) \ + forms.$(OBJEXT) images.$(OBJEXT) info.$(OBJEXT) \ + layers.$(OBJEXT) links.$(OBJEXT) outline.$(OBJEXT) \ + page.$(OBJEXT) print.$(OBJEXT) render.$(OBJEXT) \ + selections.$(OBJEXT) text.$(OBJEXT) transitions.$(OBJEXT) \ + utils.$(OBJEXT) +poppler_glib_demo_OBJECTS = $(am_poppler_glib_demo_OBJECTS) +poppler_glib_demo_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +poppler_glib_demo_DEPENDENCIES = \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(top_builddir)/poppler/libpoppler.la $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(poppler_glib_demo_SOURCES) +DIST_SOURCES = $(poppler_glib_demo_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +INCLUDES = \ + -I$(top_srcdir)/glib \ + -I$(top_builddir)/glib \ + $(GTK_TEST_CFLAGS) \ + $(POPPLER_GLIB_DISABLE_DEPRECATED) \ + -DGTK_DISABLE_DEPRECATED \ + $(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES) + +AM_LDFLAGS = @auto_import_flags@ +poppler_glib_demo_SOURCES = \ + main.c \ + annots.h \ + annots.c \ + attachments.c \ + attachments.h \ + find.h \ + find.c \ + fonts.h \ + fonts.c \ + forms.h \ + forms.c \ + images.h \ + images.c \ + info.h \ + info.cc \ + layers.h \ + layers.c \ + links.h \ + links.c \ + outline.h \ + outline.c \ + page.h \ + page.c \ + print.h \ + print.c \ + render.h \ + render.c \ + selections.h \ + selections.c \ + text.h \ + text.c \ + transitions.h \ + transitions.c \ + utils.h \ + utils.c + +LDADD = \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(top_builddir)/poppler/libpoppler.la \ + $(GTK_TEST_LIBS) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/demo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign glib/demo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +poppler-glib-demo$(EXEEXT): $(poppler_glib_demo_OBJECTS) $(poppler_glib_demo_DEPENDENCIES) $(EXTRA_poppler_glib_demo_DEPENDENCIES) + @rm -f poppler-glib-demo$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_glib_demo_OBJECTS) $(poppler_glib_demo_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/annots.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attachments.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/find.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fonts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forms.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/images.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/links.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outline.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/page.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selections.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transitions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/glib/demo/annots.c b/glib/demo/annots.c new file mode 100644 index 0000000..7075028 --- /dev/null +++ b/glib/demo/annots.c @@ -0,0 +1,919 @@ +/* + * Copyright (C) 2008 Inigo Martinez <inigomartinez@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <string.h> + +#include "annots.h" +#include "utils.h" + +enum { + ANNOTS_X1_COLUMN, + ANNOTS_Y1_COLUMN, + ANNOTS_X2_COLUMN, + ANNOTS_Y2_COLUMN, + ANNOTS_TYPE_COLUMN, + ANNOTS_COLOR_COLUMN, + ANNOTS_FLAG_INVISIBLE_COLUMN, + ANNOTS_FLAG_HIDDEN_COLUMN, + ANNOTS_FLAG_PRINT_COLUMN, + ANNOTS_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + PopplerPage *page; + + GtkListStore *model; + GtkWidget *annot_view; + GtkWidget *timer_label; + + gint num_page; +} PgdAnnotsDemo; + +static void +pgd_annots_free (PgdAnnotsDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->page) { + g_object_unref (demo->page); + demo->page = NULL; + } + + if (demo->model) { + g_object_unref (demo->model); + demo->model = NULL; + } + + g_free (demo); +} + +static GtkWidget * +pgd_annot_view_new (void) +{ + GtkWidget *frame, *label; + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Annot Properties</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + return frame; +} + +const gchar * +get_annot_type (PopplerAnnot *poppler_annot) +{ + switch (poppler_annot_get_annot_type (poppler_annot)) + { + case POPPLER_ANNOT_TEXT: + return "Text"; + case POPPLER_ANNOT_LINK: + return "Link"; + case POPPLER_ANNOT_FREE_TEXT: + return "Free Text"; + case POPPLER_ANNOT_LINE: + return "Line"; + case POPPLER_ANNOT_SQUARE: + return "Square"; + case POPPLER_ANNOT_CIRCLE: + return "Circle"; + case POPPLER_ANNOT_POLYGON: + return "Polygon"; + case POPPLER_ANNOT_POLY_LINE: + return "Poly Line"; + case POPPLER_ANNOT_HIGHLIGHT: + return "Highlight"; + case POPPLER_ANNOT_UNDERLINE: + return "Underline"; + case POPPLER_ANNOT_SQUIGGLY: + return "Squiggly"; + case POPPLER_ANNOT_STRIKE_OUT: + return "Strike Out"; + case POPPLER_ANNOT_STAMP: + return "Stamp"; + case POPPLER_ANNOT_CARET: + return "Caret"; + case POPPLER_ANNOT_INK: + return "Ink"; + case POPPLER_ANNOT_POPUP: + return "Popup"; + case POPPLER_ANNOT_FILE_ATTACHMENT: + return "File Attachment"; + case POPPLER_ANNOT_SOUND: + return "Sound"; + case POPPLER_ANNOT_MOVIE: + return "Movie"; + case POPPLER_ANNOT_WIDGET: + return "Widget"; + case POPPLER_ANNOT_SCREEN: + return "Screen"; + case POPPLER_ANNOT_PRINTER_MARK: + return "Printer Mark"; + case POPPLER_ANNOT_TRAP_NET: + return "Trap Net"; + case POPPLER_ANNOT_WATERMARK: + return "Watermark"; + case POPPLER_ANNOT_3D: + return "3D"; + default: + break; + } + + return "Unknown"; +} + +GdkPixbuf * +get_annot_color (PopplerAnnot *poppler_annot) +{ + PopplerColor *poppler_color; + + if ((poppler_color = poppler_annot_get_color (poppler_annot))) { + GdkPixbuf *pixbuf = pgd_pixbuf_new_for_color (poppler_color); + g_free (poppler_color); + + return pixbuf; + } + + return NULL; +} + +gchar * +get_markup_date (PopplerAnnotMarkup *poppler_annot) +{ + GDate *date; + struct tm t; + time_t timet; + + date = poppler_annot_markup_get_date (poppler_annot); + if (!date) + return NULL; + + g_date_to_struct_tm (date, &t); + g_date_free (date); + + timet = mktime (&t); + return timet == (time_t) - 1 ? NULL : pgd_format_date (timet); +} + +const gchar * +get_markup_reply_to (PopplerAnnotMarkup *poppler_annot) +{ + switch (poppler_annot_markup_get_reply_to (poppler_annot)) + { + case POPPLER_ANNOT_MARKUP_REPLY_TYPE_R: + return "Type R"; + case POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP: + return "Type Group"; + default: + break; + } + + return "Unknown"; +} + +const gchar * +get_markup_external_data (PopplerAnnotMarkup *poppler_annot) +{ + switch (poppler_annot_markup_get_external_data (poppler_annot)) + { + case POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D: + return "Markup 3D"; + default: + break; + } + + return "Unknown"; +} + +const gchar * +get_text_state (PopplerAnnotText *poppler_annot) +{ + switch (poppler_annot_text_get_state (poppler_annot)) + { + case POPPLER_ANNOT_TEXT_STATE_MARKED: + return "Marked"; + case POPPLER_ANNOT_TEXT_STATE_UNMARKED: + return "Unmarked"; + case POPPLER_ANNOT_TEXT_STATE_ACCEPTED: + return "Accepted"; + case POPPLER_ANNOT_TEXT_STATE_REJECTED: + return "Rejected"; + case POPPLER_ANNOT_TEXT_STATE_CANCELLED: + return "Cancelled"; + case POPPLER_ANNOT_TEXT_STATE_COMPLETED: + return "Completed"; + case POPPLER_ANNOT_TEXT_STATE_NONE: + return "None"; + case POPPLER_ANNOT_TEXT_STATE_UNKNOWN: + return "Unknown"; + default: + break; + } + + return "Unknown"; +} + +const gchar * +get_free_text_quadding (PopplerAnnotFreeText *poppler_annot) +{ + switch (poppler_annot_free_text_get_quadding (poppler_annot)) + { + case POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED: + return "Left Justified"; + case POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED: + return "Centered"; + case POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED: + return "Right Justified"; + default: + break; + } + + return "Unknown"; +} + +gchar * +get_free_text_callout_line (PopplerAnnotFreeText *poppler_annot) +{ + PopplerAnnotCalloutLine *callout; + gdouble x1, y1, x2, y2; + gchar *text; + + if ((callout = poppler_annot_free_text_get_callout_line (poppler_annot))) { + text = g_strdup_printf ("%f,%f,%f,%f", callout->x1, + callout->y1, + callout->x2, + callout->y2); + if (callout->multiline) + text = g_strdup_printf ("%s,%f,%f", text, + callout->x3, + callout->y3); + + return text; + } + + return NULL; +} + +static void +pgd_annot_view_set_annot_markup (GtkWidget *table, + PopplerAnnotMarkup *markup, + gint *row) +{ + gchar *text; + PopplerRectangle rect; + + text = poppler_annot_markup_get_label (markup); + pgd_table_add_property (GTK_TABLE (table), "<b>Label:</b>", text, row); + g_free (text); + + if (poppler_annot_markup_has_popup (markup)) { + pgd_table_add_property (GTK_TABLE (table), "<b>Popup is open:</b>", + poppler_annot_markup_get_popup_is_open (markup) ? "Yes" : "No", row); + + poppler_annot_markup_get_popup_rectangle (markup, &rect); + text = g_strdup_printf ("X1: %.2f, Y1: %.2f, X2: %.2f, Y2: %.2f", + rect.x1, rect.y1, rect.x2, rect.y2); + pgd_table_add_property (GTK_TABLE (table), "<b>Popup Rectangle:</b>", text, row); + g_free (text); + } + + text = g_strdup_printf ("%f", poppler_annot_markup_get_opacity (markup)); + pgd_table_add_property (GTK_TABLE (table), "<b>Opacity:</b>", text, row); + g_free (text); + + text = get_markup_date (markup); + pgd_table_add_property (GTK_TABLE (table), "<b>Date:</b>", text, row); + g_free (text); + + text = poppler_annot_markup_get_subject (markup); + pgd_table_add_property (GTK_TABLE (table), "<b>Subject:</b>", text, row); + g_free (text); + + pgd_table_add_property (GTK_TABLE (table), "<b>Reply To:</b>", get_markup_reply_to (markup), row); + + pgd_table_add_property (GTK_TABLE (table), "<b>External Data:</b>", get_markup_external_data (markup), row); +} + +static void +pgd_annot_view_set_annot_text (GtkWidget *table, + PopplerAnnotText *annot, + gint *row) +{ + gchar *text; + + pgd_table_add_property (GTK_TABLE (table), "<b>Is open:</b>", + poppler_annot_text_get_is_open (annot) ? "Yes" : "No", row); + + text = poppler_annot_text_get_icon (annot); + pgd_table_add_property (GTK_TABLE (table), "<b>Icon:</b>", text, row); + g_free (text); + + pgd_table_add_property (GTK_TABLE (table), "<b>State:</b>", get_text_state (annot), row); +} + +static void +pgd_annot_view_set_annot_free_text (GtkWidget *table, + PopplerAnnotFreeText *annot, + gint *row) +{ + gchar *text; + + pgd_table_add_property (GTK_TABLE (table), "<b>Quadding:</b>", get_free_text_quadding (annot), row); + + text = get_free_text_callout_line (annot); + pgd_table_add_property (GTK_TABLE (table), "<b>Callout:</b>", text, row); + g_free (text); +} + +static void +pgd_annots_file_attachment_save_dialog_response (GtkFileChooser *file_chooser, + gint response, + PopplerAttachment *attachment) +{ + gchar *filename; + GError *error = NULL; + + if (response != GTK_RESPONSE_ACCEPT) { + g_object_unref (attachment); + gtk_widget_destroy (GTK_WIDGET (file_chooser)); + return; + } + + filename = gtk_file_chooser_get_filename (file_chooser); + if (!poppler_attachment_save (attachment, filename, &error)) { + g_warning ("%s", error->message); + g_error_free (error); + } + g_free (filename); + g_object_unref (attachment); + gtk_widget_destroy (GTK_WIDGET (file_chooser)); +} + +static void +pgd_annot_save_file_attachment_button_clicked (GtkButton *button, + PopplerAnnotFileAttachment *annot) +{ + GtkWidget *file_chooser; + PopplerAttachment *attachment; + + attachment = poppler_annot_file_attachment_get_attachment (annot); + if (!attachment) + return; + + file_chooser = gtk_file_chooser_dialog_new ("Save attachment", + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (file_chooser), attachment->name); + g_signal_connect (G_OBJECT (file_chooser), "response", + G_CALLBACK (pgd_annots_file_attachment_save_dialog_response), + (gpointer) attachment); + gtk_widget_show (file_chooser); +} + +static void +pgd_annot_view_set_annot_file_attachment (GtkWidget *table, + PopplerAnnotFileAttachment *annot, + gint *row) +{ + GtkWidget *button; + gchar *text; + + text = poppler_annot_file_attachment_get_name (annot); + pgd_table_add_property (GTK_TABLE (table), "<b>Attachment Name:</b>", text, row); + g_free (text); + + button = gtk_button_new_with_label ("Save Attachment"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_annot_save_file_attachment_button_clicked), + (gpointer)annot); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>File Attachment:</b>", button, row); + gtk_widget_show (button); + +} + +static void +pgd_annot_view_set_annot_movie (GtkWidget *table, + PopplerAnnotMovie *annot, + gint *row) +{ + GtkWidget *movie_view; + gchar *text; + + text = poppler_annot_movie_get_title (annot); + pgd_table_add_property (GTK_TABLE (table), "<b>Movie Title:</b>", text, row); + g_free (text); + + movie_view = pgd_movie_view_new (); + pgd_movie_view_set_movie (movie_view, poppler_annot_movie_get_movie (annot)); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Movie:</b>", movie_view, row); + gtk_widget_show (movie_view); +} + +static void +pgd_annot_view_set_annot_screen (GtkWidget *table, + PopplerAnnotScreen *annot, + gint *row) +{ + GtkWidget *action_view; + + action_view = pgd_action_view_new (NULL); + pgd_action_view_set_action (action_view, poppler_annot_screen_get_action (annot)); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Action:</b>", action_view, row); + gtk_widget_show (action_view); +} + +static void +pgd_annot_view_set_annot (GtkWidget *annot_view, + PopplerAnnot *annot) +{ + GtkWidget *alignment; + GtkWidget *table; + GEnumValue *enum_value; + gint row = 0; + gchar *text, *warning; + time_t timet; + + alignment = gtk_bin_get_child (GTK_BIN (annot_view)); + if (alignment) { + gtk_container_remove (GTK_CONTAINER (annot_view), alignment); + } + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (annot_view), alignment); + gtk_widget_show (alignment); + + if (!annot) + return; + + table = gtk_table_new (10, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + text = poppler_annot_get_contents (annot); + pgd_table_add_property (GTK_TABLE (table), "<b>Contents:</b>", text, &row); + g_free (text); + + text = poppler_annot_get_name (annot); + pgd_table_add_property (GTK_TABLE (table), "<b>Name:</b>", text, &row); + g_free (text); + + text = poppler_annot_get_modified (annot); + if (poppler_date_parse (text, &timet)) { + g_free (text); + text = pgd_format_date (timet); + } + pgd_table_add_property (GTK_TABLE (table), "<b>Modified:</b>", text, &row); + g_free (text); + + text = g_strdup_printf ("%d", poppler_annot_get_flags (annot)); + pgd_table_add_property (GTK_TABLE (table), "<b>Flags:</b>", text, &row); + g_free (text); + + text = g_strdup_printf ("%d", poppler_annot_get_page_index (annot)); + pgd_table_add_property (GTK_TABLE (table), "<b>Page:</b>", text, &row); + g_free (text); + + if (POPPLER_IS_ANNOT_MARKUP (annot)) + pgd_annot_view_set_annot_markup (table, POPPLER_ANNOT_MARKUP (annot), &row); + + switch (poppler_annot_get_annot_type (annot)) + { + case POPPLER_ANNOT_TEXT: + pgd_annot_view_set_annot_text (table, POPPLER_ANNOT_TEXT (annot), &row); + break; + case POPPLER_ANNOT_FREE_TEXT: + pgd_annot_view_set_annot_free_text (table, POPPLER_ANNOT_FREE_TEXT (annot), &row); + break; + case POPPLER_ANNOT_FILE_ATTACHMENT: + pgd_annot_view_set_annot_file_attachment (table, POPPLER_ANNOT_FILE_ATTACHMENT (annot), &row); + break; + case POPPLER_ANNOT_MOVIE: + pgd_annot_view_set_annot_movie (table, POPPLER_ANNOT_MOVIE (annot), &row); + break; + case POPPLER_ANNOT_SCREEN: + pgd_annot_view_set_annot_screen (table, POPPLER_ANNOT_SCREEN (annot), &row); + break; + default: + break; + } + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); +} + +static void +pgd_annots_get_annots (GtkWidget *button, + PgdAnnotsDemo *demo) +{ + GList *mapping, *l; + gint n_fields; + GTimer *timer; + + gtk_list_store_clear (demo->model); + pgd_annot_view_set_annot (demo->annot_view, NULL); + + if (demo->page) { + g_object_unref (demo->page); + demo->page = NULL; + } + + demo->page = poppler_document_get_page (demo->doc, demo->num_page); + if (!demo->page) + return; + + timer = g_timer_new (); + mapping = poppler_page_get_annot_mapping (demo->page); + g_timer_stop (timer); + + n_fields = g_list_length (mapping); + if (n_fields > 0) { + gchar *str; + + str = g_strdup_printf ("<i>%d annots found in %.4f seconds</i>", + n_fields, g_timer_elapsed (timer, NULL)); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); + g_free (str); + } else { + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No annots found</i>"); + } + + g_timer_destroy (timer); + + for (l = mapping; l; l = g_list_next (l)) { + PopplerAnnotMapping *amapping; + GtkTreeIter iter; + gchar *x1, *y1, *x2, *y2; + GdkPixbuf *pixbuf; + PopplerAnnotFlag flags; + + amapping = (PopplerAnnotMapping *) l->data; + + x1 = g_strdup_printf ("%.2f", amapping->area.x1); + y1 = g_strdup_printf ("%.2f", amapping->area.y1); + x2 = g_strdup_printf ("%.2f", amapping->area.x2); + y2 = g_strdup_printf ("%.2f", amapping->area.y2); + + pixbuf = get_annot_color (amapping->annot); + flags = poppler_annot_get_flags (amapping->annot); + + gtk_list_store_append (demo->model, &iter); + gtk_list_store_set (demo->model, &iter, + ANNOTS_X1_COLUMN, x1, + ANNOTS_Y1_COLUMN, y1, + ANNOTS_X2_COLUMN, x2, + ANNOTS_Y2_COLUMN, y2, + ANNOTS_TYPE_COLUMN, get_annot_type (amapping->annot), + ANNOTS_COLOR_COLUMN, pixbuf, + ANNOTS_FLAG_INVISIBLE_COLUMN, (flags & POPPLER_ANNOT_FLAG_INVISIBLE), + ANNOTS_FLAG_HIDDEN_COLUMN, (flags & POPPLER_ANNOT_FLAG_HIDDEN), + ANNOTS_FLAG_PRINT_COLUMN, (flags & POPPLER_ANNOT_FLAG_PRINT), + ANNOTS_COLUMN, amapping->annot, + -1); + + if (pixbuf) + g_object_unref (pixbuf); + + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + } + + poppler_page_free_annot_mapping (mapping); +} + +static void +pgd_annots_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdAnnotsDemo *demo) +{ + demo->num_page = (gint) gtk_spin_button_get_value (spinbutton) - 1; +} + +static void +pgd_annots_selection_changed (GtkTreeSelection *treeselection, + PgdAnnotsDemo *demo) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) { + PopplerAnnot *annot; + + gtk_tree_model_get (model, &iter, + ANNOTS_COLUMN, &annot, + -1); + pgd_annot_view_set_annot (demo->annot_view, annot); + g_object_unref (annot); + } +} + +static void +pgd_annots_add_annot (GtkWidget *button, + PgdAnnotsDemo *demo) +{ + GtkWidget *hbox, *vbox; + GtkWidget *type_selector; + GtkWidget *label; + GtkWidget *rect_hbox; + GtkWidget *rect_x1, *rect_y1, *rect_x2, *rect_y2; + GtkWidget *dialog; + PopplerPage *page; + gdouble width, height; + PopplerAnnot *annot; + PopplerRectangle rect; + + page = poppler_document_get_page (demo->doc, demo->num_page); + if (!page) + return; + poppler_page_get_size (page, &width, &height); + + dialog = gtk_dialog_new_with_buttons ("Add new annotation", + GTK_WINDOW (gtk_widget_get_toplevel (button)), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + "Add annotation", GTK_RESPONSE_ACCEPT, + NULL); + + vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + +#if GTK_CHECK_VERSION (2, 24, 0) + type_selector = gtk_combo_box_text_new (); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (type_selector), "POPPLER_ANNOT_UNKNOWN"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (type_selector), "POPPLER_ANNOT_TEXT"); +#else + type_selector = gtk_combo_box_new_text (); + gtk_combo_box_append_text (GTK_COMBO_BOX (type_selector), "POPPLER_ANNOT_UNKNOWN"); + gtk_combo_box_append_text (GTK_COMBO_BOX (type_selector), "POPPLER_ANNOT_TEXT"); +#endif + gtk_combo_box_set_active (GTK_COMBO_BOX (type_selector), 1); + gtk_box_pack_start (GTK_BOX (vbox), type_selector, TRUE, TRUE, 0); + gtk_widget_show (type_selector); + + hbox = gtk_hbox_new (FALSE, 6); + + rect_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("x1:"); + gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + rect_x1 = gtk_spin_button_new_with_range (0, width, 1.0); + gtk_box_pack_start (GTK_BOX (rect_hbox), rect_x1, TRUE, TRUE, 0); + gtk_widget_show (rect_x1); + + gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0); + gtk_widget_show (rect_hbox); + + rect_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("x2:"); + gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + rect_x2 = gtk_spin_button_new_with_range (0, width, 1.0); + gtk_box_pack_start (GTK_BOX (rect_hbox), rect_x2, TRUE, TRUE, 0); + gtk_widget_show (rect_x2); + + gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0); + gtk_widget_show (rect_hbox); + + rect_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("y1:"); + gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + rect_y1 = gtk_spin_button_new_with_range (0, height, 1.0); + gtk_box_pack_start (GTK_BOX (rect_hbox), rect_y1, TRUE, TRUE, 0); + gtk_widget_show (rect_y1); + + gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0); + gtk_widget_show (rect_hbox); + + rect_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("y2:"); + gtk_box_pack_start (GTK_BOX (rect_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + rect_y2 = gtk_spin_button_new_with_range (0, height, 1.0); + gtk_box_pack_start (GTK_BOX (rect_hbox), rect_y2, TRUE, TRUE, 0); + gtk_widget_show (rect_y2); + + gtk_box_pack_start (GTK_BOX (hbox), rect_hbox, FALSE, TRUE, 0); + gtk_widget_show (rect_hbox); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + rect.x1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_x1)); + rect.x2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_x2)); + rect.y1 = height - gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_y2)); + rect.y2 = height - gtk_spin_button_get_value (GTK_SPIN_BUTTON (rect_y1)); + annot = poppler_annot_text_new (demo->doc, &rect); + poppler_page_add_annot (page, annot); + + g_object_unref (page); + + gtk_widget_destroy (dialog); +} + +GtkWidget * +pgd_annots_create_widget (PopplerDocument *document) +{ + PgdAnnotsDemo *demo; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *hbox, *page_selector; + GtkWidget *button; + GtkWidget *hpaned; + GtkWidget *swindow, *treeview; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + gchar *str; + gint n_pages; + + demo = g_new0 (PgdAnnotsDemo, 1); + + demo->doc = g_object_ref (document); + + n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_annots_page_selector_value_changed), + (gpointer) demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + button = gtk_button_new_with_label ("Get Annots"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_annots_get_annots), + (gpointer) demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + button = gtk_button_new_with_label ("Add Annot"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_annots_add_annot), + (gpointer) demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + demo->timer_label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No annots found</i>"); + g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL); + gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0); + gtk_widget_show (demo->timer_label); + + hpaned = gtk_hpaned_new (); + + demo->annot_view = pgd_annot_view_new (); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + demo->model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, + G_TYPE_OBJECT); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_X1_COLUMN, "X1", + renderer, + "text", ANNOTS_X1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_Y1_COLUMN, "Y1", + renderer, + "text", ANNOTS_Y1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_X2_COLUMN, "X2", + renderer, + "text", ANNOTS_X2_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_Y2_COLUMN, "Y2", + renderer, + "text", ANNOTS_Y2_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_TYPE_COLUMN, "Type", + renderer, + "text", ANNOTS_TYPE_COLUMN, + NULL); + + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_COLOR_COLUMN, "Color", + renderer, + "pixbuf", ANNOTS_COLOR_COLUMN, + NULL); + + renderer = gtk_cell_renderer_toggle_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_FLAG_INVISIBLE_COLUMN, "Invisible", + renderer, + "active", ANNOTS_FLAG_INVISIBLE_COLUMN, + NULL); + + renderer = gtk_cell_renderer_toggle_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_FLAG_HIDDEN_COLUMN, "Hidden", + renderer, + "active", ANNOTS_FLAG_HIDDEN_COLUMN, + NULL); + + renderer = gtk_cell_renderer_toggle_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + ANNOTS_FLAG_PRINT_COLUMN, "Print", + renderer, + "active", ANNOTS_FLAG_PRINT_COLUMN, + NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (pgd_annots_selection_changed), + (gpointer) demo); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_paned_add2 (GTK_PANED (hpaned), demo->annot_view); + gtk_widget_show (demo->annot_view); + + gtk_paned_set_position (GTK_PANED (hpaned), 300); + + gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show (hpaned); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_annots_free, + demo); + + return vbox; +} diff --git a/glib/demo/annots.h b/glib/demo/annots.h new file mode 100644 index 0000000..844e4f5 --- /dev/null +++ b/glib/demo/annots.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008 Inigo Martinez <inigomartinez@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _ANNOTS_H_ +#define _ANNOTS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_annots_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _ANNOTS_H_ */ diff --git a/glib/demo/attachments.c b/glib/demo/attachments.c new file mode 100644 index 0000000..63565dd --- /dev/null +++ b/glib/demo/attachments.c @@ -0,0 +1,353 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> + +#include "attachments.h" +#include "utils.h" + +enum { + ATTACHMENTS_NAME_COLUMN, + ATTACHMENTS_DESCRIPTION_COLUMN, + ATTACHMENTS_SIZE_COLUMN, + ATTACHMENTS_CTIME_COLUMN, + ATTACHMENTS_MTIME_COLUMN, + ATTACHMENTS_ATTACHMENT_COLUMN, + N_COLUMNS +}; + +static void +pgd_attachments_fill_model (GtkListStore *model, + PopplerDocument *document) +{ + GList *list, *l; + + list = poppler_document_get_attachments (document); + + for (l = list; l && l->data; l = g_list_next (l)) { + PopplerAttachment *attachment = POPPLER_ATTACHMENT (l->data); + GtkTreeIter iter; + gchar *size; + gchar *ctime, *mtime; + + size = g_strdup_printf ("%" G_GSIZE_FORMAT, attachment->size); + ctime = pgd_format_date (attachment->ctime); + mtime = pgd_format_date (attachment->mtime); + + gtk_list_store_append (model, &iter); + gtk_list_store_set (model, &iter, + ATTACHMENTS_NAME_COLUMN, + attachment->name ? attachment->name : "Unknown", + ATTACHMENTS_DESCRIPTION_COLUMN, + attachment->description ? attachment->description : "Unknown", + ATTACHMENTS_SIZE_COLUMN, + size ? size : "Unknown", + ATTACHMENTS_CTIME_COLUMN, + ctime ? ctime : "Unknown", + ATTACHMENTS_MTIME_COLUMN, + mtime ? mtime : "Unknown", + ATTACHMENTS_ATTACHMENT_COLUMN, attachment, + -1); + + g_free (size); + g_free (ctime); + g_free (mtime); + + g_object_unref (attachment); + } + + g_list_free (list); +} + +static GtkWidget * +pgd_attachments_create_list (GtkTreeModel *model) +{ + GtkWidget *treeview; + GtkCellRenderer *renderer; + + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Name", + renderer, + "text", ATTACHMENTS_NAME_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "Description", + renderer, + "text", ATTACHMENTS_DESCRIPTION_COLUMN, + NULL); + g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 1)), + "expand", TRUE, NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 2, "Size", + renderer, + "text", ATTACHMENTS_SIZE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 3, "Creation Date", + renderer, + "text", ATTACHMENTS_CTIME_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 4, "Modification Date", + renderer, + "text", ATTACHMENTS_MTIME_COLUMN, + NULL); + return treeview; +} + +static void +pgd_attachments_save_dialog_response (GtkFileChooser *file_chooser, + gint response, + PopplerAttachment *attachment) +{ + gchar *filename; + GError *error = NULL; + + if (response != GTK_RESPONSE_ACCEPT) { + g_object_unref (attachment); + gtk_widget_destroy (GTK_WIDGET (file_chooser)); + return; + } + + filename = gtk_file_chooser_get_filename (file_chooser); + if (!poppler_attachment_save (attachment, filename, &error)) { + g_warning ("%s", error->message); + g_error_free (error); + } + g_free (filename); + g_object_unref (attachment); + gtk_widget_destroy (GTK_WIDGET (file_chooser)); +} + +static void +pgd_attachments_save_button_clicked (GtkButton *button, + GtkTreeView *treeview) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GtkWidget *file_chooser; + PopplerAttachment *attachment; + + selection = gtk_tree_view_get_selection (treeview); + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return; + + gtk_tree_model_get (model, &iter, + ATTACHMENTS_ATTACHMENT_COLUMN, &attachment, + -1); + + if (!attachment) + return; + + file_chooser = gtk_file_chooser_dialog_new ("Save attachment", + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (file_chooser), attachment->name); + g_signal_connect (G_OBJECT (file_chooser), "response", + G_CALLBACK (pgd_attachments_save_dialog_response), + (gpointer) attachment); + gtk_widget_show (file_chooser); + +} + +static gboolean +attachment_save_callback (const gchar *buf, + gsize count, + gpointer data, + GError **error) +{ + GChecksum *cs = (GChecksum *)data; + + g_checksum_update (cs, buf, count); + + return TRUE; +} + +static void +message_dialog_run (GtkWindow *parent, + const gchar *message) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, + "%s", message); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); +} + +static void +pgd_attachments_validate_button_clicked (GtkButton *button, + GtkTreeView *treeview) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GChecksum *cs; + guint8 *digest; + gsize digest_len; + PopplerAttachment *attachment; + gboolean valid = TRUE; + + selection = gtk_tree_view_get_selection (treeview); + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return; + + gtk_tree_model_get (model, &iter, + ATTACHMENTS_ATTACHMENT_COLUMN, &attachment, + -1); + + if (!attachment) + return; + + if (attachment->checksum->len == 0) { + message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), + "Impossible to validate attachment: checksum is not available"); + g_object_unref (attachment); + + return; + } + + cs = g_checksum_new (G_CHECKSUM_MD5); + poppler_attachment_save_to_callback (attachment, attachment_save_callback, + (gpointer)cs, NULL); + digest_len = g_checksum_type_get_length (G_CHECKSUM_MD5); + digest = (guint8 *) g_malloc (digest_len); + g_checksum_get_digest (cs, digest, &digest_len); + g_checksum_free (cs); + + if (attachment->checksum->len == digest_len) { + gint i; + + for (i = 0; i < digest_len; i++) { + if ((guint8)attachment->checksum->str[i] != digest[i]) { + valid = FALSE; + break; + } + } + } + + if (valid) { + message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), + "Attachment is valid"); + } else { + message_dialog_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (treeview))), + "Attachment is not valid: the checksum does not match"); + } + + g_free (digest); + g_object_unref (attachment); +} + +GtkWidget * +pgd_attachments_create_widget (PopplerDocument *document) +{ + GtkWidget *vbox; + GtkWidget *treeview; + GtkListStore *model; + GtkWidget *swindow; + GtkWidget *hbox, *button; + gboolean has_attachments; + + vbox = gtk_vbox_new (FALSE, 12); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + has_attachments = poppler_document_has_attachments (document); + if (has_attachments) { + model = gtk_list_store_new (N_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_OBJECT); + pgd_attachments_fill_model (model, document); + treeview = pgd_attachments_create_list (GTK_TREE_MODEL (model)); + } else { + GtkCellRenderer *renderer; + GtkTreeIter iter; + gchar *markup; + + model = gtk_list_store_new (1, G_TYPE_STRING); + gtk_list_store_append (model, &iter); + markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", + "The document doesn't contain attachments"); + gtk_list_store_set (model, &iter, 0, markup, -1); + g_free (markup); + + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Name", + renderer, + "markup", 0, + NULL); + } + g_object_unref (model); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); + gtk_widget_show (swindow); + + if (!has_attachments) + return vbox; + + hbox = gtk_hbutton_box_new (); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD); + + button = gtk_button_new_with_label ("Save"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_attachments_save_button_clicked), + (gpointer)treeview); + + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + button = gtk_button_new_with_label ("Validate"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_attachments_validate_button_clicked), + (gpointer)treeview); + + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show (hbox); + + return vbox; +} diff --git a/glib/demo/attachments.h b/glib/demo/attachments.h new file mode 100644 index 0000000..36dab82 --- /dev/null +++ b/glib/demo/attachments.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _ATTACHMENTS_H_ +#define _ATTACHMENTS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_attachments_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _ATTACHMENTS_H_ */ diff --git a/glib/demo/find.c b/glib/demo/find.c new file mode 100644 index 0000000..632e610 --- /dev/null +++ b/glib/demo/find.c @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "find.h" + +enum { + TITLE_COLUMN, + X1_COLUMN, + Y1_COLUMN, + X2_COLUMN, + Y2_COLUMN, + + VISIBLE_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkTreeModel *model; + GtkWidget *entry; + GtkWidget *progress; + + gint n_pages; + gint page_index; + + guint idle_id; +} PgdFindDemo; + +static void +pgd_find_free (PgdFindDemo *demo) +{ + if (!demo) + return; + + if (demo->idle_id > 0) { + g_source_remove (demo->idle_id); + demo->idle_id = 0; + } + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->model) { + g_object_unref (demo->model); + demo->model = NULL; + } + + g_free (demo); +} + +static void +pgd_find_update_progress (PgdFindDemo *demo, + gint scanned) +{ + gchar *str; + + str = g_strdup_printf ("Searching ... (%d%%)", + MIN (scanned * 100 / demo->n_pages, 100)); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress), + MIN ((gdouble)scanned / demo->n_pages, 1.0)); + g_free (str); +} + +static gboolean +pgd_find_find_text (PgdFindDemo *demo) +{ + PopplerPage *page; + GList *matches; + GTimer *timer; + + page = poppler_document_get_page (demo->doc, demo->page_index); + if (!page) { + demo->page_index++; + return demo->page_index < demo->n_pages; + } + + timer = g_timer_new (); + matches = poppler_page_find_text (page, gtk_entry_get_text (GTK_ENTRY (demo->entry))); + g_timer_stop (timer); + if (matches) { + GtkTreeIter iter; + gchar *str; + GList *l; + gint n_match = 0; + + str = g_strdup_printf ("%d matches found on page %d in %.4f seconds", + g_list_length (matches), demo->page_index + 1, + g_timer_elapsed (timer, NULL)); + + gtk_tree_store_append (GTK_TREE_STORE (demo->model), &iter, NULL); + gtk_tree_store_set (GTK_TREE_STORE (demo->model), &iter, + TITLE_COLUMN, str, + VISIBLE_COLUMN, FALSE, + -1); + g_free (str); + + for (l = matches; l && l->data; l = g_list_next (l)) { + PopplerRectangle *rect = (PopplerRectangle *)l->data; + GtkTreeIter iter_child; + gchar *x1, *y1, *x2, *y2; + + str = g_strdup_printf ("Match %d", ++n_match); + x1 = g_strdup_printf ("%.2f", rect->x1); + y1 = g_strdup_printf ("%.2f", rect->y1); + x2 = g_strdup_printf ("%.2f", rect->x2); + y2 = g_strdup_printf ("%.2f", rect->y2); + + gtk_tree_store_append (GTK_TREE_STORE (demo->model), &iter_child, &iter); + gtk_tree_store_set (GTK_TREE_STORE (demo->model), &iter_child, + TITLE_COLUMN, str, + X1_COLUMN, x1, + Y1_COLUMN, y1, + X2_COLUMN, x2, + Y2_COLUMN, y2, + VISIBLE_COLUMN, TRUE, + -1); + g_free (str); + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + poppler_rectangle_free (rect); + } + g_list_free (matches); + } + + g_timer_destroy (timer); + g_object_unref (page); + + demo->page_index++; + pgd_find_update_progress (demo, demo->page_index); + + return demo->page_index < demo->n_pages; +} + +static void +pgd_find_button_clicked (GtkButton *button, + PgdFindDemo *demo) +{ + gtk_tree_store_clear (GTK_TREE_STORE (demo->model)); + demo->page_index = 0; + pgd_find_update_progress (demo, demo->page_index); + if (demo->idle_id > 0) + g_source_remove (demo->idle_id); + demo->idle_id = g_idle_add ((GSourceFunc)pgd_find_find_text, demo); +} + +static void +pgd_find_button_sensitivity_cb (GtkWidget *button, + GtkEntry *entry) +{ + const gchar *text; + + text = gtk_entry_get_text (entry); + gtk_widget_set_sensitive (button, text != NULL && text[0] != '\0'); +} + +GtkWidget * +pgd_find_create_widget (PopplerDocument *document) +{ + PgdFindDemo *demo; + GtkWidget *vbox, *hbox; + GtkWidget *button; + GtkWidget *swindow; + GtkWidget *treeview; + GtkCellRenderer *renderer; + + demo = g_new0 (PgdFindDemo, 1); + + demo->doc = g_object_ref (document); + + demo->n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + demo->entry = gtk_entry_new (); + gtk_box_pack_start (GTK_BOX (hbox), demo->entry, FALSE, TRUE, 0); + gtk_widget_show (demo->entry); + + demo->progress = gtk_progress_bar_new (); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress), + PANGO_ELLIPSIZE_END); + gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0); + gtk_widget_show (demo->progress); + + button = gtk_button_new_with_label ("Find"); + gtk_widget_set_sensitive (button, FALSE); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_find_button_clicked), + (gpointer)demo); + g_signal_connect_swapped (G_OBJECT (demo->entry), "changed", + G_CALLBACK (pgd_find_button_sensitivity_cb), + (gpointer)button); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show (hbox); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + demo->model = GTK_TREE_MODEL ( + gtk_tree_store_new (N_COLUMNS, + G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_BOOLEAN)); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model)); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), + GTK_SELECTION_NONE); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + TITLE_COLUMN, "Matches", + renderer, + "text", TITLE_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + X1_COLUMN, "X1", + renderer, + "text", X1_COLUMN, + "visible", VISIBLE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + Y1_COLUMN, "Y1", + renderer, + "text", Y1_COLUMN, + "visible", VISIBLE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + X2_COLUMN, "X2", + renderer, + "text", X2_COLUMN, + "visible", VISIBLE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + Y2_COLUMN, "Y2", + renderer, + "text", Y2_COLUMN, + "visible", VISIBLE_COLUMN, + NULL); + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); + gtk_widget_show (swindow); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_find_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/find.h b/glib/demo/find.h new file mode 100644 index 0000000..36f95c1 --- /dev/null +++ b/glib/demo/find.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _FIND_H_ +#define _FIND_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_find_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _FIND_H_ */ diff --git a/glib/demo/fonts.c b/glib/demo/fonts.c new file mode 100644 index 0000000..24eb87c --- /dev/null +++ b/glib/demo/fonts.c @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> + +#include "fonts.h" + +enum { + FONTS_NAME_COLUMN, + FONTS_DETAILS_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkWidget *treeview; + GtkWidget *progress; + + guint idle_id; +} PgdFontsDemo; + +static void +pgd_fonts_free (PgdFontsDemo *demo) +{ + if (!demo) + return; + + if (demo->idle_id > 0) { + g_source_remove (demo->idle_id); + demo->idle_id = 0; + } + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + g_free (demo); +} + +static void +pdg_fonts_cell_data_func (GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ + char *name; + char *details; + char *markup; + + gtk_tree_model_get (model, iter, + FONTS_NAME_COLUMN, &name, + FONTS_DETAILS_COLUMN, &details, + -1); + + if (details) { + markup = g_strdup_printf ("<b><big>%s</big></b>\n<small>%s</small>", + name, details); + } else { + markup = g_strdup_printf ("<b><big>%s</big></b>", name); + } + + g_object_set (renderer, "markup", markup, NULL); + + g_free (markup); + g_free (details); + g_free (name); +} + +static const gchar * +font_type_to_string (PopplerFontType type) +{ + switch (type) { + case POPPLER_FONT_TYPE_TYPE1: + return "Type 1"; + case POPPLER_FONT_TYPE_TYPE1C: + return "Type 1C"; + case POPPLER_FONT_TYPE_TYPE3: + return "Type 3"; + case POPPLER_FONT_TYPE_TRUETYPE: + return "TrueType"; + case POPPLER_FONT_TYPE_CID_TYPE0: + return "Type 1 (CID)"; + case POPPLER_FONT_TYPE_CID_TYPE0C: + return "Type 1C (CID)"; + case POPPLER_FONT_TYPE_CID_TYPE2: + return "TrueType (CID)"; + default: + return "Unknown font type"; + } +} + +static void +pgd_fonts_update_progress (PgdFontsDemo *demo, + gint n_pages, + gint scanned) +{ + gchar *str; + + str = g_strdup_printf ("Scanning fonts (%d%%)", + MIN (scanned * 100 / n_pages, 100)); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress), + MIN ((gdouble)scanned / n_pages, 1.0)); + g_free (str); +} + +static gboolean +pgd_fonts_fill_model (PgdFontsDemo *demo) +{ + GtkTreeModel *model; + PopplerFontInfo *font_info; + PopplerFontsIter *fonts_iter; + gint n_pages, scanned = 0; + + n_pages = poppler_document_get_n_pages (demo->doc); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview)); + g_object_ref (model); + + gtk_list_store_clear (GTK_LIST_STORE (model)); + + font_info = poppler_font_info_new (demo->doc); + + while (poppler_font_info_scan (font_info, 20, &fonts_iter)) { + pgd_fonts_update_progress (demo, n_pages, scanned); + + while (gtk_events_pending ()) + gtk_main_iteration (); + + scanned += 20; + + if (!fonts_iter) + continue; + + do { + GtkTreeIter iter; + const gchar *name; + const gchar *type; + const gchar *embedded; + const gchar *substitute; + const gchar *filename; + const gchar *encoding; + gchar *details; + + name = poppler_fonts_iter_get_name (fonts_iter); + if (!name) + name = "No name"; + + encoding = poppler_fonts_iter_get_encoding (fonts_iter); + if (!encoding) + encoding = "None"; + + type = font_type_to_string (poppler_fonts_iter_get_font_type (fonts_iter)); + + if (poppler_fonts_iter_is_embedded (fonts_iter)) { + if (poppler_fonts_iter_is_subset (fonts_iter)) + embedded = "Embedded subset"; + else + embedded = "Embedded"; + } else { + embedded = "Not embedded"; + } + + substitute = poppler_fonts_iter_get_substitute_name (fonts_iter); + filename = poppler_fonts_iter_get_file_name (fonts_iter); + + if (substitute && filename) + details = g_markup_printf_escaped ("%s\nEncoding: %s\n%s, substituting with <b>%s</b>\n(%s)", type, encoding, embedded, substitute, filename); + else + details = g_markup_printf_escaped ("%s\nEncoding: %s\n%s", type, encoding, embedded); + + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + FONTS_NAME_COLUMN, name, + FONTS_DETAILS_COLUMN, details, + -1); + + g_free (details); + } while (poppler_fonts_iter_next (fonts_iter)); + poppler_fonts_iter_free (fonts_iter); + } + + pgd_fonts_update_progress (demo, n_pages, scanned); + + g_object_unref (font_info); + g_object_unref (model); + + return FALSE; +} + +static void +pgd_fonts_scan_button_clicked (GtkButton *button, + PgdFontsDemo *demo) +{ + demo->idle_id = g_idle_add ((GSourceFunc)pgd_fonts_fill_model, demo); +} + +GtkWidget * +pgd_fonts_create_widget (PopplerDocument *document) +{ + PgdFontsDemo *demo; + GtkWidget *vbox; + GtkListStore *model; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkWidget *swindow; + GtkWidget *hbox, *button; + + demo = g_new0 (PgdFontsDemo, 1); + + demo->doc = g_object_ref (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + demo->progress = gtk_progress_bar_new (); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress), + PANGO_ELLIPSIZE_END); + gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0); + gtk_widget_show (demo->progress); + + button = gtk_button_new_with_label ("Scan"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_fonts_scan_button_clicked), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show (hbox); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); + demo->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (demo->treeview), FALSE); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (demo->treeview), TRUE); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (demo->treeview)), + GTK_SELECTION_NONE); + g_object_unref (model); + + column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (GTK_TREE_VIEW (demo->treeview), column); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer, + pdg_fonts_cell_data_func, + NULL, NULL); + + gtk_container_add (GTK_CONTAINER (swindow), demo->treeview); + gtk_widget_show (demo->treeview); + + gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); + gtk_widget_show (swindow); + + g_object_weak_ref (G_OBJECT (swindow), + (GWeakNotify)pgd_fonts_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/fonts.h b/glib/demo/fonts.h new file mode 100644 index 0000000..b13447c --- /dev/null +++ b/glib/demo/fonts.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _FONTS_H_ +#define _FONTS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_fonts_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _FONTS_H_ */ diff --git a/glib/demo/forms.c b/glib/demo/forms.c new file mode 100644 index 0000000..3a74ef5 --- /dev/null +++ b/glib/demo/forms.c @@ -0,0 +1,516 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <string.h> + +#include "forms.h" +#include "utils.h" + +enum { + FORMS_FIELD_TYPE_COLUMN, + FORMS_ID_COLUMN, + FORMS_READ_ONLY_COLUMN, + FORMS_X1_COLUMN, + FORMS_Y1_COLUMN, + FORMS_X2_COLUMN, + FORMS_Y2_COLUMN, + FORMS_FIELD_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkListStore *model; + GtkWidget *field_view; + GtkWidget *timer_label; + + gint page; +} PgdFormsDemo; + +static void +pgd_forms_free (PgdFormsDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->model) { + g_object_unref (demo->model); + demo->model = NULL; + } + + g_free (demo); +} + +static GtkWidget * +pgd_form_field_view_new (void) +{ + GtkWidget *frame, *label; + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Form Field Properties</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + return frame; +} + +static void +pgd_form_field_view_add_choice_items (GtkTable *table, + PopplerFormField *field, + gint *selected, + gint *row) +{ + GtkWidget *label; + GtkWidget *textview, *swindow; + GtkTextBuffer *buffer; + gint i; + + label = gtk_label_new (NULL); + g_object_set (G_OBJECT (label), "xalign", 0.0, NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Items:</b>"); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (label); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + textview = gtk_text_view_new (); + gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); + + for (i = 0; i < poppler_form_field_choice_get_n_items (field); i++) { + gchar *item; + + item = poppler_form_field_choice_get_item (field, i); + gtk_text_buffer_insert_at_cursor (buffer, item, strlen (item)); + gtk_text_buffer_insert_at_cursor (buffer, "\n", strlen ("\n")); + g_free (item); + + if (poppler_form_field_choice_is_item_selected (field, i)) + *selected = i; + } + + gtk_container_add (GTK_CONTAINER (swindow), textview); + gtk_widget_show (textview); + + gtk_table_attach (GTK_TABLE (table), swindow, 1, 2, *row, *row + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (swindow); + + *row += 1; +} + +static void +pgd_form_field_view_set_field (GtkWidget *field_view, + PopplerFormField *field) +{ + GtkWidget *alignment; + GtkWidget *table; + PopplerAction *action; + GEnumValue *enum_value; + gchar *text; + gint row = 0; + + alignment = gtk_bin_get_child (GTK_BIN (field_view)); + if (alignment) { + gtk_container_remove (GTK_CONTAINER (field_view), alignment); + } + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (field_view), alignment); + gtk_widget_show (alignment); + + if (!field) + return; + + table = gtk_table_new (13, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + text = poppler_form_field_get_name (field); + if (text) { + pgd_table_add_property (GTK_TABLE (table), "<b>Name:</b>", text, &row); + g_free (text); + } + text = poppler_form_field_get_partial_name (field); + if (text) { + pgd_table_add_property (GTK_TABLE (table), "<b>Partial Name:</b>", text, &row); + g_free (text); + } + text = poppler_form_field_get_mapping_name (field); + if (text) { + pgd_table_add_property (GTK_TABLE (table), "<b>Mapping Name:</b>", text, &row); + g_free (text); + } + + action = poppler_form_field_get_action (field); + if (action) { + GtkWidget *action_view; + + action_view = pgd_action_view_new (NULL); + pgd_action_view_set_action (action_view, action); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Action:</b>", action_view, &row); + gtk_widget_show (action_view); + } + + switch (poppler_form_field_get_field_type (field)) { + case POPPLER_FORM_FIELD_BUTTON: + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_FORM_BUTTON_TYPE), + poppler_form_field_button_get_button_type (field)); + pgd_table_add_property (GTK_TABLE (table), "<b>Button Type:</b>", enum_value->value_name, &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Button State:</b>", + poppler_form_field_button_get_state (field) ? "Active" : "Inactive", &row); + break; + case POPPLER_FORM_FIELD_TEXT: + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_FORM_TEXT_TYPE), + poppler_form_field_text_get_text_type (field)); + pgd_table_add_property (GTK_TABLE (table), "<b>Text Type:</b>", enum_value->value_name, &row); + + text = poppler_form_field_text_get_text (field); + pgd_table_add_property (GTK_TABLE (table), "<b>Contents:</b>", text, &row); + g_free (text); + + text = g_strdup_printf ("%d", poppler_form_field_text_get_max_len (field)); + pgd_table_add_property (GTK_TABLE (table), "<b>Max Length:</b>", text, &row); + g_free (text); + + pgd_table_add_property (GTK_TABLE (table), "<b>Do spellcheck:</b>", + poppler_form_field_text_do_spell_check (field) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Do scroll:</b>", + poppler_form_field_text_do_scroll (field) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Rich Text:</b>", + poppler_form_field_text_is_rich_text (field) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Pasword type:</b>", + poppler_form_field_text_is_password (field) ? "Yes" : "No", &row); + break; + case POPPLER_FORM_FIELD_CHOICE: { + gchar *item; + gint selected = -1; + + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_FORM_CHOICE_TYPE), + poppler_form_field_choice_get_choice_type (field)); + pgd_table_add_property (GTK_TABLE (table), "<b>Choice Type:</b>", enum_value->value_name, &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Editable:</b>", + poppler_form_field_choice_is_editable (field) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Multiple Selection:</b>", + poppler_form_field_choice_can_select_multiple (field) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Do spellcheck:</b>", + poppler_form_field_choice_do_spell_check (field) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Commit on Change:</b>", + poppler_form_field_choice_commit_on_change (field) ? "Yes" : "No", &row); + + text = g_strdup_printf ("%d", poppler_form_field_choice_get_n_items (field)); + pgd_table_add_property (GTK_TABLE (table), "<b>Number of items:</b>", text, &row); + g_free (text); + + pgd_form_field_view_add_choice_items (GTK_TABLE (table), field, &selected, &row); + + if (selected >= 0 && poppler_form_field_choice_get_n_items (field) > selected) { + item = poppler_form_field_choice_get_item (field, selected); + text = g_strdup_printf ("%d (%s)", selected, item); + g_free (item); + pgd_table_add_property (GTK_TABLE (table), "<b>Selected item:</b>", text, &row); + g_free (text); + } + + text = poppler_form_field_choice_get_text (field); + pgd_table_add_property (GTK_TABLE (table), "<b>Contents:</b>", text, &row); + g_free (text); + } + break; + case POPPLER_FORM_FIELD_SIGNATURE: + case POPPLER_FORM_FIELD_UNKNOWN: + break; + default: + g_assert_not_reached (); + } + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); +} + +const gchar * +get_form_field_type (PopplerFormField *field) +{ + switch (poppler_form_field_get_field_type (field)) { + case POPPLER_FORM_FIELD_TEXT: + return "Text"; + case POPPLER_FORM_FIELD_BUTTON: + return "Button"; + case POPPLER_FORM_FIELD_CHOICE: + return "Choice"; + case POPPLER_FORM_FIELD_SIGNATURE: + return "Signature"; + case POPPLER_FORM_FIELD_UNKNOWN: + default: + break; + } + + return "Unknown"; +} + +static void +pgd_forms_get_form_fields (GtkWidget *button, + PgdFormsDemo *demo) +{ + PopplerPage *page; + GList *mapping, *l; + gint n_fields; + GTimer *timer; + + gtk_list_store_clear (demo->model); + pgd_form_field_view_set_field (demo->field_view, NULL); + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return; + + timer = g_timer_new (); + mapping = poppler_page_get_form_field_mapping (page); + g_timer_stop (timer); + + n_fields = g_list_length (mapping); + if (n_fields > 0) { + gchar *str; + + str = g_strdup_printf ("<i>%d form fields found in %.4f seconds</i>", + n_fields, g_timer_elapsed (timer, NULL)); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); + g_free (str); + } else { + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No form fields found</i>"); + } + + g_timer_destroy (timer); + + for (l = mapping; l; l = g_list_next (l)) { + PopplerFormFieldMapping *fmapping; + GtkTreeIter iter; + gchar *x1, *y1, *x2, *y2; + + fmapping = (PopplerFormFieldMapping *)l->data; + + x1 = g_strdup_printf ("%.2f", fmapping->area.x1); + y1 = g_strdup_printf ("%.2f", fmapping->area.y1); + x2 = g_strdup_printf ("%.2f", fmapping->area.x2); + y2 = g_strdup_printf ("%.2f", fmapping->area.y2); + + gtk_list_store_append (demo->model, &iter); + gtk_list_store_set (demo->model, &iter, + FORMS_FIELD_TYPE_COLUMN, get_form_field_type (fmapping->field), + FORMS_ID_COLUMN, poppler_form_field_get_id (fmapping->field), + FORMS_READ_ONLY_COLUMN, poppler_form_field_is_read_only (fmapping->field), + FORMS_X1_COLUMN, x1, + FORMS_Y1_COLUMN, y1, + FORMS_X2_COLUMN, x2, + FORMS_Y2_COLUMN, y2, + FORMS_FIELD_COLUMN, fmapping->field, + -1); + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + } + + poppler_page_free_form_field_mapping (mapping); + g_object_unref (page); +} + +static void +pgd_forms_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdFormsDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; +} + +static void +pgd_forms_selection_changed (GtkTreeSelection *treeselection, + PgdFormsDemo *demo) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) { + PopplerFormField *field; + + gtk_tree_model_get (model, &iter, + FORMS_FIELD_COLUMN, &field, + -1); + pgd_form_field_view_set_field (demo->field_view, field); + g_object_unref (field); + } +} + +GtkWidget * +pgd_forms_create_widget (PopplerDocument *document) +{ + PgdFormsDemo *demo; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *hbox, *page_selector; + GtkWidget *button; + GtkWidget *hpaned; + GtkWidget *swindow, *treeview; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + gchar *str; + gint n_pages; + + demo = g_new0 (PgdFormsDemo, 1); + + demo->doc = g_object_ref (document); + + n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_forms_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + button = gtk_button_new_with_label ("Get Forms Fields"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_forms_get_form_fields), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + demo->timer_label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No form fields found</i>"); + g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL); + gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0); + gtk_widget_show (demo->timer_label); + + hpaned = gtk_hpaned_new (); + + demo->field_view = pgd_form_field_view_new (); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + demo->model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, + G_TYPE_INT, G_TYPE_BOOLEAN, + G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_OBJECT); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Form Field Type", + renderer, + "text", FORMS_FIELD_TYPE_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "Form Field Id", + renderer, + "text", FORMS_ID_COLUMN, + NULL); + + renderer = gtk_cell_renderer_toggle_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 2, "Read Only", + renderer, + "active", FORMS_READ_ONLY_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 3, "X1", + renderer, + "text", FORMS_X1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 4, "Y1", + renderer, + "text", FORMS_Y1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 5, "X2", + renderer, + "text", FORMS_X2_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 6, "Y2", + renderer, + "text", FORMS_Y2_COLUMN, + NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (pgd_forms_selection_changed), + (gpointer)demo); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_paned_add2 (GTK_PANED (hpaned), demo->field_view); + gtk_widget_show (demo->field_view); + + gtk_paned_set_position (GTK_PANED (hpaned), 300); + + gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show (hpaned); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_forms_free, + demo); + + return vbox; +} diff --git a/glib/demo/forms.h b/glib/demo/forms.h new file mode 100644 index 0000000..5b793bd --- /dev/null +++ b/glib/demo/forms.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _FORMS_H_ +#define _FORMS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_forms_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _FORMS_H_ */ diff --git a/glib/demo/images.c b/glib/demo/images.c new file mode 100644 index 0000000..6e987d2 --- /dev/null +++ b/glib/demo/images.c @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include "images.h" + +enum { + IMAGES_ID_COLUMN, + IMAGES_X1_COLUMN, + IMAGES_Y1_COLUMN, + IMAGES_X2_COLUMN, + IMAGES_Y2_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkListStore *model; + GtkWidget *timer_label; + GtkWidget *image_view; + + gint page; +} PgdImagesDemo; + +static void +pgd_images_free (PgdImagesDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->model) { + g_object_unref (demo->model); + demo->model = NULL; + } + + g_free (demo); +} + +static gboolean +pgd_image_view_drawing_area_expose (GtkWidget *area, + GdkEventExpose *event, + GtkWidget *image_view) +{ + cairo_t *cr; + cairo_surface_t *image; + + image = g_object_get_data (G_OBJECT (image_view), "image-surface"); + if (!image) + return FALSE; + + gtk_widget_set_size_request (area, + cairo_image_surface_get_width (image), + cairo_image_surface_get_height (image)); + + cr = gdk_cairo_create (gtk_widget_get_window (area)); + cairo_set_source_surface (cr, image, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + return TRUE; +} + +static GtkWidget * +pgd_image_view_new () +{ + GtkWidget *swindow; + GtkWidget *darea; + + swindow = gtk_scrolled_window_new (NULL, NULL); + + darea = gtk_drawing_area_new (); + g_signal_connect (G_OBJECT (darea), "expose_event", + G_CALLBACK (pgd_image_view_drawing_area_expose), + (gpointer)swindow); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow), + darea); + gtk_widget_show (darea); + + return swindow; +} + +static void +pgd_image_view_set_image (GtkWidget *image_view, + cairo_surface_t *image) +{ + g_object_set_data_full (G_OBJECT (image_view), "image-surface", + image, + (GDestroyNotify)cairo_surface_destroy); + gtk_widget_queue_draw (image_view); +} + +static void +pgd_images_get_images (GtkWidget *button, + PgdImagesDemo *demo) +{ + PopplerPage *page; + GList *mapping, *l; + gint n_images; + GTimer *timer; + + gtk_list_store_clear (demo->model); + pgd_image_view_set_image (demo->image_view, NULL); + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return; + + timer = g_timer_new (); + mapping = poppler_page_get_image_mapping (page); + g_timer_stop (timer); + + n_images = g_list_length (mapping); + if (n_images > 0) { + gchar *str; + + str = g_strdup_printf ("<i>%d images found in %.4f seconds</i>", + n_images, g_timer_elapsed (timer, NULL)); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); + g_free (str); + } else { + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No images found</i>"); + } + + g_timer_destroy (timer); + + for (l = mapping; l; l = g_list_next (l)) { + PopplerImageMapping *imapping; + GtkTreeIter iter; + gchar *x1, *y1, *x2, *y2; + + imapping = (PopplerImageMapping *)l->data; + + x1 = g_strdup_printf ("%.2f", imapping->area.x1); + y1 = g_strdup_printf ("%.2f", imapping->area.y1); + x2 = g_strdup_printf ("%.2f", imapping->area.x2); + y2 = g_strdup_printf ("%.2f", imapping->area.y2); + + gtk_list_store_append (demo->model, &iter); + gtk_list_store_set (demo->model, &iter, + IMAGES_ID_COLUMN, imapping->image_id, + IMAGES_X1_COLUMN, x1, + IMAGES_Y1_COLUMN, y1, + IMAGES_X2_COLUMN, x2, + IMAGES_Y2_COLUMN, y2, + -1); + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + } + + poppler_page_free_image_mapping (mapping); + g_object_unref (page); +} + +static void +pgd_images_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdImagesDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; +} + +static void +pgd_images_selection_changed (GtkTreeSelection *treeselection, + PgdImagesDemo *demo) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) { + PopplerPage *page; + gint image_id; + + gtk_tree_model_get (model, &iter, + IMAGES_ID_COLUMN, &image_id, + -1); + page = poppler_document_get_page (demo->doc, demo->page); + pgd_image_view_set_image (demo->image_view, + poppler_page_get_image (page, image_id)); + g_object_unref (page); + + } +} + +GtkWidget * +pgd_images_create_widget (PopplerDocument *document) +{ + PgdImagesDemo *demo; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *hbox, *page_selector; + GtkWidget *button; + GtkWidget *hpaned; + GtkWidget *swindow, *treeview; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + gchar *str; + gint n_pages; + + demo = g_new0 (PgdImagesDemo, 1); + + demo->doc = g_object_ref (document); + + n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_images_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + button = gtk_button_new_with_label ("Get Images"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_images_get_images), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + demo->timer_label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No images found</i>"); + g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL); + gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0); + gtk_widget_show (demo->timer_label); + + hpaned = gtk_hpaned_new (); + + demo->image_view = pgd_image_view_new (); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + demo->model = gtk_list_store_new (N_COLUMNS, G_TYPE_INT, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model)); + + renderer = gtk_cell_renderer_text_new (); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Image", + renderer, + "text", IMAGES_ID_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "X1", + renderer, + "text", IMAGES_X1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 2, "Y1", + renderer, + "text", IMAGES_Y1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 3, "X2", + renderer, + "text", IMAGES_X2_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 4, "Y2", + renderer, + "text", IMAGES_Y2_COLUMN, + NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (pgd_images_selection_changed), + (gpointer)demo); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_paned_add2 (GTK_PANED (hpaned), demo->image_view); + gtk_widget_show (demo->image_view); + + gtk_paned_set_position (GTK_PANED (hpaned), 300); + + gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show (hpaned); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_images_free, + demo); + + return vbox; +} diff --git a/glib/demo/images.h b/glib/demo/images.h new file mode 100644 index 0000000..6180c3b --- /dev/null +++ b/glib/demo/images.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _IMAGES_H_ +#define _IMAGES_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_images_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _IMAGES_H_ */ diff --git a/glib/demo/info.cc b/glib/demo/info.cc new file mode 100644 index 0000000..e05cc15 --- /dev/null +++ b/glib/demo/info.cc @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> + +#include "config.h" +#include "info.h" +#include "utils.h" + +static void +pgd_info_add_permissions (GtkTable *table, + PopplerPermissions permissions, + gint *row) +{ + GtkWidget *label, *hbox, *vbox; + GtkWidget *checkbox; + + label = gtk_label_new (NULL); + g_object_set (G_OBJECT (label), "xalign", 0.0, NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Permissions:</b>"); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (label); + + vbox = gtk_vbox_new (FALSE, 0); + hbox = gtk_hbox_new (FALSE, 6); + + checkbox = gtk_check_button_new_with_label ("Print"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_PRINT)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + checkbox = gtk_check_button_new_with_label ("Copy"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_COPY)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + checkbox = gtk_check_button_new_with_label ("Modify"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_MODIFY)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + checkbox = gtk_check_button_new_with_label ("Add notes"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_ADD_NOTES)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + checkbox = gtk_check_button_new_with_label ("Fill forms"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_FILL_FORM)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + hbox = gtk_hbox_new (FALSE, 6); + + checkbox = gtk_check_button_new_with_label ("Extract contents"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + checkbox = gtk_check_button_new_with_label ("Assemble"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_ASSEMBLE)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + checkbox = gtk_check_button_new_with_label ("Print at high resolution"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), + (permissions & POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION)); + gtk_box_pack_start (GTK_BOX (hbox), checkbox, FALSE, TRUE, 0); + gtk_widget_show (checkbox); + + gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, *row, *row + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (vbox); + + *row += 1; +} + +static void +pgd_info_add_metadata (GtkTable *table, + const gchar *metadata, + gint *row) +{ + GtkWidget *label; + GtkWidget *textview, *swindow; + GtkTextBuffer *buffer; + + label = gtk_label_new (NULL); + g_object_set (G_OBJECT (label), "xalign", 0.0, NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Metadata:</b>"); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (label); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + textview = gtk_text_view_new (); + gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); + if (metadata) + gtk_text_buffer_set_text (buffer, metadata, -1); + + gtk_container_add (GTK_CONTAINER (swindow), textview); + gtk_widget_show (textview); + + gtk_table_attach (GTK_TABLE (table), swindow, 1, 2, *row, *row + 1, + (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), + (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_widget_show (swindow); + + *row += 1; +} + +GtkWidget * +pgd_info_create_widget (PopplerDocument *document) +{ + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *frame, *alignment, *table; + gchar *str; + gchar *title, *format, *author, *subject; + gchar *keywords, *creator, *producer; + gchar *metadata; + gchar *perm_id; + gchar *up_id; + gboolean linearized; + GTime creation_date, mod_date; + GEnumValue *enum_value; + PopplerBackend backend; + PopplerPageLayout layout; + PopplerPageMode mode; + PopplerPermissions permissions; + PopplerViewerPreferences view_prefs; + gint row = 0; + + g_object_get (document, + "title", &title, + "format", &format, + "author", &author, + "subject", &subject, + "keywords", &keywords, + "creation-date", &creation_date, + "mod-date", &mod_date, + "creator", &creator, + "producer", &producer, + "linearized", &linearized, + "page-mode", &mode, + "page-layout", &layout, + "permissions", &permissions, + "viewer-preferences", &view_prefs, + "metadata", &metadata, + NULL); + + vbox = gtk_vbox_new (FALSE, 12); + + backend = poppler_get_backend (); + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_BACKEND), backend); + str = g_strdup_printf ("<span weight='bold' size='larger'>Poppler %s (%s)</span>", + poppler_get_version (), enum_value->value_name); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), str); + g_free (str); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 12); + gtk_widget_show (label); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Document properties</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_widget_show (alignment); + + table = gtk_table_new (14, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + pgd_table_add_property (GTK_TABLE (table), "<b>Format:</b>", format, &row); + g_free (format); + + pgd_table_add_property (GTK_TABLE (table), "<b>Title:</b>", title, &row); + g_free (title); + + pgd_table_add_property (GTK_TABLE (table), "<b>Author:</b>", author, &row); + g_free (author); + + pgd_table_add_property (GTK_TABLE (table), "<b>Subject:</b>", subject, &row); + g_free (subject); + + pgd_table_add_property (GTK_TABLE (table), "<b>Keywords:</b>", keywords, &row); + g_free (keywords); + + pgd_table_add_property (GTK_TABLE (table), "<b>Creator:</b>", creator, &row); + g_free (creator); + + pgd_table_add_property (GTK_TABLE (table), "<b>Producer:</b>", producer, &row); + g_free (producer); + + pgd_table_add_property (GTK_TABLE (table), "<b>Linearized:</b>", linearized ? "Yes" : "No", &row); + + str = pgd_format_date (creation_date); + pgd_table_add_property (GTK_TABLE (table), "<b>Creation Date:</b>", str, &row); + g_free (str); + + str = pgd_format_date (mod_date); + pgd_table_add_property (GTK_TABLE (table), "<b>Modification Date:</b>", str, &row); + g_free (str); + + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_peek (POPPLER_TYPE_PAGE_MODE), mode); + pgd_table_add_property (GTK_TABLE (table), "<b>Page Mode:</b>", enum_value->value_name, &row); + + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_peek (POPPLER_TYPE_PAGE_LAYOUT), layout); + pgd_table_add_property (GTK_TABLE (table), "<b>Page Layout:</b>", enum_value->value_name, &row); + + if (poppler_document_get_id (document, &perm_id, &up_id)) { + str = g_strndup (perm_id, 32); + g_free (perm_id); + pgd_table_add_property (GTK_TABLE (table), "<b>Permanent ID:</b>", str, &row); + g_free (str); + str = g_strndup (up_id, 32); + g_free (up_id); + pgd_table_add_property (GTK_TABLE (table), "<b>Update ID:</b>", str, &row); + g_free (str); + } + + pgd_info_add_permissions (GTK_TABLE (table), permissions, &row); + + pgd_info_add_metadata (GTK_TABLE (table), metadata, &row); + g_free (metadata); + + /* TODO: view_prefs */ + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); + + gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + return vbox; +} diff --git a/glib/demo/info.h b/glib/demo/info.h new file mode 100644 index 0000000..a8b34d4 --- /dev/null +++ b/glib/demo/info.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _INFO_H_ +#define _INFO_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_info_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _INFO_H_ */ diff --git a/glib/demo/layers.c b/glib/demo/layers.c new file mode 100644 index 0000000..fc0ba35 --- /dev/null +++ b/glib/demo/layers.c @@ -0,0 +1,448 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include "layers.h" + +enum { + LAYERS_TITLE_COLUMN, + LAYERS_VISIBILITY_COLUMN, + LAYERS_ENABLE_COLUMN, + LAYERS_SHOWTOGGLE_COLUMN, + LAYERS_RB_GROUP_COLUMN, + LAYERS_LAYER_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + guint page; + GtkWidget *treeview; + GtkWidget *darea; + + cairo_surface_t *surface; +} PgdLayersDemo; + +static void +pgd_layers_free (PgdLayersDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->surface) { + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + } + + g_free (demo); +} + +static void +build_tree (PopplerDocument *document, + GtkTreeModel *model, + GtkTreeIter *parent, + PopplerLayersIter *iter) +{ + + do { + GtkTreeIter tree_iter; + PopplerLayersIter *child; + PopplerLayer *layer; + gboolean visible; + gchar *markup; + gint rb_group = 0; + + layer = poppler_layers_iter_get_layer (iter); + if (layer) { + markup = g_markup_escape_text (poppler_layer_get_title (layer), -1); + visible = poppler_layer_is_visible (layer); + rb_group = poppler_layer_get_radio_button_group_id (layer); + } else { + gchar *title; + + title = poppler_layers_iter_get_title (iter); + markup = g_markup_escape_text (title, -1); + g_free (title); + + visible = FALSE; + layer = NULL; + } + + gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent); + gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter, + LAYERS_TITLE_COLUMN, markup, + LAYERS_VISIBILITY_COLUMN, visible, + LAYERS_ENABLE_COLUMN, TRUE, /* FIXME */ + LAYERS_SHOWTOGGLE_COLUMN, (layer != NULL), + LAYERS_RB_GROUP_COLUMN, rb_group, + LAYERS_LAYER_COLUMN, layer, + -1); + if (layer) + g_object_unref (layer); + g_free (markup); + + child = poppler_layers_iter_get_child (iter); + if (child) + build_tree (document, model, &tree_iter, child); + poppler_layers_iter_free (child); + } while (poppler_layers_iter_next (iter)); +} + +GtkTreeModel * +pgd_layers_create_model (PopplerDocument *document) +{ + GtkTreeModel *model; + PopplerLayersIter *iter; + + iter = poppler_layers_iter_new (document); + if (iter) { + model = GTK_TREE_MODEL ( + gtk_tree_store_new (N_COLUMNS, + G_TYPE_STRING, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_INT, + G_TYPE_OBJECT)); + build_tree (document, model, NULL, iter); + poppler_layers_iter_free (iter); + } else { + GtkTreeIter tree_iter; + gchar *markup; + + model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING)); + gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter); + markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", + "The document doesn't contain layers"); + gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter, + 0, markup, -1); + g_free (markup); + } + + return model; +} + +static cairo_surface_t * +pgd_layers_render_page (PgdLayersDemo *demo) +{ + cairo_t *cr; + PopplerPage *page; + gdouble width, height; + cairo_surface_t *surface = NULL; + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return NULL; + + poppler_page_get_size (page, &width, &height); + gtk_widget_set_size_request (demo->darea, width, height); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + width, height); + cr = cairo_create (surface); + + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 0, 0, width, height); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + poppler_page_render (page, cr); + cairo_restore (cr); + + cairo_destroy (cr); + g_object_unref (page); + + return surface; +} + +static gboolean +pgd_layers_viewer_drawing_area_expose (GtkWidget *area, + GdkEventExpose *event, + PgdLayersDemo *demo) +{ + cairo_t *cr; + + if (!demo->surface) { + demo->surface = pgd_layers_render_page (demo); + if (!demo->surface) + return FALSE; + } + + gdk_window_clear (gtk_widget_get_window (area)); + + cr = gdk_cairo_create (gtk_widget_get_window (area)); + cairo_set_source_surface (cr, demo->surface, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + return TRUE; +} + +static gboolean +pgd_layers_viewer_redraw (PgdLayersDemo *demo) +{ + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + + gtk_widget_queue_draw (demo->darea); + + return FALSE; +} + +static void +pgd_layers_viewer_queue_redraw (PgdLayersDemo *demo) +{ + g_idle_add ((GSourceFunc)pgd_layers_viewer_redraw, demo); +} + +static void +pgd_layers_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdLayersDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; + pgd_layers_viewer_queue_redraw (demo); +} + +static GtkWidget * +pgd_layers_create_viewer (PgdLayersDemo *demo) +{ + GtkWidget *vbox, *hbox; + GtkWidget *label; + GtkWidget *swindow; + GtkWidget *page_selector; + guint n_pages; + gchar *str; + + vbox = gtk_vbox_new (FALSE, 6); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + n_pages = poppler_document_get_n_pages (demo->doc); + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_layers_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + demo->darea = gtk_drawing_area_new (); + g_signal_connect (G_OBJECT (demo->darea), "expose_event", + G_CALLBACK (pgd_layers_viewer_drawing_area_expose), + (gpointer)demo); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow), demo->darea); + gtk_widget_show (demo->darea); + + gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); + gtk_widget_show (swindow); + + return vbox; +} + +static gboolean +update_kids (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + GtkTreeIter *parent) +{ + if (gtk_tree_store_is_ancestor (GTK_TREE_STORE (model), parent, iter)) { + gboolean visible; + + gtk_tree_model_get (model, parent, + LAYERS_VISIBILITY_COLUMN, &visible, + -1); + gtk_tree_store_set (GTK_TREE_STORE (model), iter, + LAYERS_ENABLE_COLUMN, visible, + -1); + } + + return FALSE; +} + +static gboolean +clear_rb_group (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gint *rb_group) +{ + gint group; + + gtk_tree_model_get (model, iter, + LAYERS_RB_GROUP_COLUMN, &group, + -1); + + if (group == *rb_group) { + gtk_tree_store_set (GTK_TREE_STORE (model), iter, + LAYERS_VISIBILITY_COLUMN, FALSE, + -1); + } + + return FALSE; +} + +static void +pgd_layers_visibility_changed (GtkCellRendererToggle *cell, + gchar *path_str, + PgdLayersDemo *demo) +{ + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + gboolean visible; + PopplerLayer *layer; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview)); + + path = gtk_tree_path_new_from_string (path_str); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, + LAYERS_VISIBILITY_COLUMN, &visible, + LAYERS_LAYER_COLUMN, &layer, + -1); + + visible = !visible; + visible ? poppler_layer_show (layer) : poppler_layer_hide (layer); + + if (visible) { + gint rb_group; + + rb_group = poppler_layer_get_radio_button_group_id (layer); + if (rb_group) { + gtk_tree_model_foreach (model, + (GtkTreeModelForeachFunc)clear_rb_group, + &rb_group); + } + } + + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, + LAYERS_VISIBILITY_COLUMN, visible, + -1); + + if (poppler_layer_is_parent (layer)) { + gtk_tree_model_foreach (model, + (GtkTreeModelForeachFunc)update_kids, + &iter); + } + + pgd_layers_viewer_queue_redraw (demo); + + gtk_tree_path_free (path); + g_object_unref (layer); +} + +GtkWidget * +pgd_layers_create_widget (PopplerDocument *document) +{ + PgdLayersDemo *demo; + GtkWidget *swindow; + GtkWidget *treeview; + GtkTreeModel *model; + GtkCellRenderer *renderer; + GtkTreeSelection *selection; + GtkWidget *hpaned, *viewer; + + demo = g_new0 (PgdLayersDemo, 1); + demo->doc = g_object_ref (document); + + hpaned = gtk_hpaned_new (); + + viewer = pgd_layers_create_viewer (demo); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + model = pgd_layers_create_model (document); + treeview = gtk_tree_view_new_with_model (model); + demo->treeview = treeview; + g_object_unref (model); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Layer", + renderer, + "markup", LAYERS_TITLE_COLUMN, + NULL); + g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0)), + "expand", TRUE, NULL); + + if (GTK_IS_TREE_STORE (model)) { + renderer = gtk_cell_renderer_toggle_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "Show/Hide", + renderer, + "active", LAYERS_VISIBILITY_COLUMN, + "activatable", LAYERS_ENABLE_COLUMN, + "visible", LAYERS_SHOWTOGGLE_COLUMN, + NULL); + + g_signal_connect (renderer, "toggled", + G_CALLBACK (pgd_layers_visibility_changed), + (gpointer)demo); + gtk_tree_view_column_set_clickable (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 1), + TRUE); + } + + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), + GTK_SELECTION_NONE); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_paned_add2 (GTK_PANED (hpaned), viewer); + gtk_widget_show (viewer); + + gtk_paned_set_position (GTK_PANED (hpaned), 150); + + g_object_weak_ref (G_OBJECT (hpaned), + (GWeakNotify)pgd_layers_free, + (gpointer)demo); + + return hpaned; +} diff --git a/glib/demo/layers.h b/glib/demo/layers.h new file mode 100644 index 0000000..88b43c3 --- /dev/null +++ b/glib/demo/layers.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _LAYERS_H_ +#define _LAYERS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_layers_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _LAYERS_H_ */ diff --git a/glib/demo/links.c b/glib/demo/links.c new file mode 100644 index 0000000..6cb4a5d --- /dev/null +++ b/glib/demo/links.c @@ -0,0 +1,289 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> + +#include "links.h" +#include "utils.h" + +enum { + LINKS_ACTION_TYPE_COLUMN, + LINKS_X1_COLUMN, + LINKS_Y1_COLUMN, + LINKS_X2_COLUMN, + LINKS_Y2_COLUMN, + LINKS_ACTION_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkListStore *model; + GtkWidget *action_view; + GtkWidget *timer_label; + + gint page; +} PgdLinksDemo; + +static void +pgd_links_free (PgdLinksDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->model) { + g_object_unref (demo->model); + demo->model = NULL; + } + + g_free (demo); +} + +static void +pgd_links_get_links (GtkWidget *button, + PgdLinksDemo *demo) +{ + PopplerPage *page; + GList *mapping, *l; + gint n_links; + GTimer *timer; + + gtk_list_store_clear (demo->model); + pgd_action_view_set_action (demo->action_view, NULL); + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return; + + timer = g_timer_new (); + mapping = poppler_page_get_link_mapping (page); + g_timer_stop (timer); + + n_links = g_list_length (mapping); + if (n_links > 0) { + gchar *str; + + str = g_strdup_printf ("<i>%d links found in %.4f seconds</i>", + n_links, g_timer_elapsed (timer, NULL)); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); + g_free (str); + } else { + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No links found</i>"); + } + + g_timer_destroy (timer); + + for (l = mapping; l; l = g_list_next (l)) { + PopplerLinkMapping *lmapping; + PopplerAction *action; + GEnumValue *enum_value; + GtkTreeIter iter; + gchar *x1, *y1, *x2, *y2; + + lmapping = (PopplerLinkMapping *)l->data; + action = poppler_action_copy (lmapping->action); + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_ACTION_TYPE), action->type); + + x1 = g_strdup_printf ("%.2f", lmapping->area.x1); + y1 = g_strdup_printf ("%.2f", lmapping->area.y1); + x2 = g_strdup_printf ("%.2f", lmapping->area.x2); + y2 = g_strdup_printf ("%.2f", lmapping->area.y2); + + gtk_list_store_append (demo->model, &iter); + gtk_list_store_set (demo->model, &iter, + LINKS_ACTION_TYPE_COLUMN, enum_value->value_name, + LINKS_X1_COLUMN, x1, + LINKS_Y1_COLUMN, y1, + LINKS_X2_COLUMN, x2, + LINKS_Y2_COLUMN, y2, + LINKS_ACTION_COLUMN, action, + -1); + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + + g_object_weak_ref (G_OBJECT (demo->model), + (GWeakNotify)poppler_action_free, + action); + } + + poppler_page_free_link_mapping (mapping); + g_object_unref (page); +} + +static void +pgd_links_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdLinksDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; +} + +static void +pgd_links_selection_changed (GtkTreeSelection *treeselection, + PgdLinksDemo *demo) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) { + PopplerAction *action; + + gtk_tree_model_get (model, &iter, + LINKS_ACTION_COLUMN, &action, + -1); + pgd_action_view_set_action (demo->action_view, action); + } +} + +GtkWidget * +pgd_links_create_widget (PopplerDocument *document) +{ + PgdLinksDemo *demo; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *hbox, *page_selector; + GtkWidget *button; + GtkWidget *hpaned; + GtkWidget *swindow, *treeview; + GtkTreeSelection *selection; + GtkCellRenderer *renderer; + gchar *str; + gint n_pages; + + demo = g_new0 (PgdLinksDemo, 1); + + demo->doc = g_object_ref (document); + + n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_links_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + button = gtk_button_new_with_label ("Get Links"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_links_get_links), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + demo->timer_label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No links found</i>"); + g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL); + gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0); + gtk_widget_show (demo->timer_label); + + hpaned = gtk_hpaned_new (); + + demo->action_view = pgd_action_view_new (document); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + demo->model = gtk_list_store_new (N_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_POINTER); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Action Type", + renderer, + "text", LINKS_ACTION_TYPE_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "X1", + renderer, + "text", LINKS_X1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 2, "Y1", + renderer, + "text", LINKS_Y1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 3, "X2", + renderer, + "text", LINKS_X2_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 4, "Y2", + renderer, + "text", LINKS_Y2_COLUMN, + NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (pgd_links_selection_changed), + (gpointer)demo); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_paned_add2 (GTK_PANED (hpaned), demo->action_view); + gtk_widget_show (demo->action_view); + + gtk_paned_set_position (GTK_PANED (hpaned), 300); + + gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show (hpaned); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_links_free, + demo); + + return vbox; +} diff --git a/glib/demo/links.h b/glib/demo/links.h new file mode 100644 index 0000000..b7dbaeb --- /dev/null +++ b/glib/demo/links.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _LINKS_H_ +#define _LINKS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_links_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _LINKS_H_ */ diff --git a/glib/demo/main.c b/glib/demo/main.c new file mode 100644 index 0000000..f52c5b8 --- /dev/null +++ b/glib/demo/main.c @@ -0,0 +1,401 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <gio/gio.h> +#include <poppler.h> +#include <string.h> + +#include "info.h" +#include "fonts.h" +#include "render.h" +#include "page.h" +#include "outline.h" +#include "links.h" +#include "forms.h" +#include "transitions.h" +#include "images.h" +#include "annots.h" +#include "attachments.h" +#include "layers.h" +#include "text.h" +#include "find.h" +#include "print.h" +#include "selections.h" + +enum { + PGD_TITLE_COLUMN, + PGD_NPAGE_COLUMN, + PGD_WIDGET_COLUMN, + N_COLUMNS +}; + +typedef struct { + const gchar *name; + GtkWidget *(* create_widget) (PopplerDocument *document); +} PopplerGlibDemo; + +static const PopplerGlibDemo demo_list[] = { + { "Info", pgd_info_create_widget }, + { "Fonts", pgd_fonts_create_widget }, + { "Render", pgd_render_create_widget }, + { "Selections", pgd_selections_create_widget }, + { "Page Info", pgd_page_create_widget }, + { "Outline", pgd_outline_create_widget }, + { "Links", pgd_links_create_widget }, + { "Forms", pgd_forms_create_widget }, + { "Page Transitions", pgd_transitions_create_widget }, + { "Images", pgd_images_create_widget }, + { "Annots", pgd_annots_create_widget }, + { "Attachments", pgd_attachments_create_widget }, + { "Layers", pgd_layers_create_widget }, + { "Text", pgd_text_create_widget }, + { "Find", pgd_find_create_widget }, + { "Print", pgd_print_create_widget } +}; + +static void +pgd_demo_changed (GtkTreeSelection *selection, + GtkNotebook *notebook) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gint n_page; + + gtk_tree_model_get (model, &iter, + PGD_NPAGE_COLUMN, &n_page, + -1); + gtk_notebook_set_current_page (notebook, n_page); + } +} + +static GtkWidget * +pgd_demo_list_create (void) +{ + GtkWidget *treeview; + GtkListStore *model; + GtkCellRenderer *renderer; + gint i; + + model = gtk_list_store_new (N_COLUMNS, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_POINTER); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Demos", + renderer, + "text", PGD_TITLE_COLUMN, + NULL); + + for (i = 0; i < G_N_ELEMENTS (demo_list); i++) { + GtkTreeIter iter; + + gtk_list_store_append (model, &iter); + gtk_list_store_set (model, &iter, + PGD_TITLE_COLUMN, demo_list[i].name, + PGD_NPAGE_COLUMN, i, + -1); + } + + g_object_unref (model); + + return treeview; +} + +static GtkWidget * +pdg_demo_notebook_create (PopplerDocument *document) +{ + GtkWidget *notebook; + gint i; + + notebook = gtk_notebook_new (); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE); + + for (i = 0; i < G_N_ELEMENTS (demo_list); i++) { + GtkWidget *demo_widget; + + demo_widget = demo_list[i].create_widget (document); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), demo_widget, NULL); + gtk_widget_show (demo_widget); + } + + return notebook; +} + +static void +pgd_demo_auth_dialog_entry_changed (GtkEditable *editable, + GtkDialog *dialog) +{ + const char *text; + + text = gtk_entry_get_text (GTK_ENTRY (editable)); + + gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, + (text != NULL && *text != '\0')); + g_object_set_data (G_OBJECT (dialog), "pgd-password", (gpointer)text); +} + +static void +pgd_demo_auth_dialog_entry_activated (GtkEntry *entry, + GtkDialog *dialog) +{ + gtk_dialog_response (dialog, GTK_RESPONSE_OK); +} + +static GtkDialog * +pgd_demo_get_auth_dialog (GFile *uri_file) +{ + GtkDialog *dialog; + GtkWidget *content_area, *action_area; + GtkWidget *entry_container; + GtkWidget *password_entry; + GtkWidget *hbox, *main_vbox, *vbox, *icon; + GtkWidget *table; + GtkWidget *label; + gchar *format, *markup, *file_name; + + dialog = GTK_DIALOG (gtk_dialog_new ()); + content_area = gtk_dialog_get_content_area (dialog); + action_area = gtk_dialog_get_action_area (dialog); + + /* Set the dialog up with HIG properties */ +#if !GTK_CHECK_VERSION (2, 22, 0) + gtk_dialog_set_has_separator (dialog, FALSE); +#endif + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */ + gtk_container_set_border_width (GTK_CONTAINER (action_area), 5); + gtk_box_set_spacing (GTK_BOX (action_area), 6); + + gtk_window_set_title (GTK_WINDOW (dialog), "Enter password"); + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_DIALOG_AUTHENTICATION); + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + + gtk_dialog_add_buttons (dialog, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + "_Unlock Document", GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), + GTK_RESPONSE_OK, FALSE); + gtk_dialog_set_alternative_button_order (dialog, + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + + /* Build contents */ + hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, + GTK_ICON_SIZE_DIALOG); + + gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0.0); + gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); + gtk_widget_show (icon); + + main_vbox = gtk_vbox_new (FALSE, 18); + gtk_box_pack_start (GTK_BOX (hbox), main_vbox, TRUE, TRUE, 0); + gtk_widget_show (main_vbox); + + label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + file_name = g_file_get_basename (uri_file); + format = g_strdup_printf ("<span size=\"larger\" weight=\"bold\">%s</span>\n\n%s", + "Password required", + "The document “%s” is locked and requires a password before it can be opened."); + markup = g_markup_printf_escaped (format, file_name); + gtk_label_set_markup (GTK_LABEL (label), markup); + g_free (format); + g_free (markup); + g_free (file_name); + gtk_box_pack_start (GTK_BOX (main_vbox), label, + FALSE, FALSE, 0); + gtk_widget_show (label); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); + + /* The table that holds the entries */ + entry_container = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); + + gtk_alignment_set_padding (GTK_ALIGNMENT (entry_container), + 0, 0, 0, 0); + + gtk_box_pack_start (GTK_BOX (vbox), entry_container, + FALSE, FALSE, 0); + gtk_widget_show (entry_container); + + table = gtk_table_new (1, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 12); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_container_add (GTK_CONTAINER (entry_container), table); + gtk_widget_show (table); + + label = gtk_label_new_with_mnemonic ("_Password:"); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + + password_entry = gtk_entry_new (); + gtk_entry_set_visibility (GTK_ENTRY (password_entry), FALSE); + g_signal_connect (password_entry, "changed", + G_CALLBACK (pgd_demo_auth_dialog_entry_changed), + dialog); + g_signal_connect (password_entry, "activate", + G_CALLBACK (pgd_demo_auth_dialog_entry_activated), + dialog); + + gtk_table_attach (GTK_TABLE (table), label, + 0, 1, 0, 1, + GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_show (label); + + gtk_table_attach_defaults (GTK_TABLE (table), password_entry, + 1, 2, 0, 1); + gtk_widget_show (password_entry); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), password_entry); + + return dialog; +} + +gint main (gint argc, gchar **argv) +{ + PopplerDocument *document; + GtkWidget *win; + GtkWidget *hbox; + GtkWidget *notebook; + GtkWidget *treeview; + GtkTreeSelection *selection; + GFile *file; + gchar *uri; + GTimer *timer; + GError *error = NULL; + GtkAccelGroup *gtk_accel; + GClosure *closure; + + if (argc != 2) { + g_print ("Usage: poppler-glib-demo FILE\n"); + return 1; + } + +/* Threading is always enabled starting from GLib 2.24.0 */ +#if !GLIB_CHECK_VERSION (2, 24, 0) + if (!g_thread_supported ()) + g_thread_init (NULL); +#endif + + gtk_init (&argc, &argv); + + file = g_file_new_for_commandline_arg (argv[1]); + uri = g_file_get_uri (file); + + timer = g_timer_new (); + document = poppler_document_new_from_file (uri, NULL, &error); + g_timer_stop (timer); + if (error) { + while (g_error_matches (error, POPPLER_ERROR, POPPLER_ERROR_ENCRYPTED)) { + GtkDialog *dialog; + const gchar *password; + + dialog = pgd_demo_get_auth_dialog (file); + if (gtk_dialog_run (dialog) != GTK_RESPONSE_OK) { + g_print ("Error: no password provided\n"); + g_object_unref (file); + g_free (uri); + + return 1; + } + + g_clear_error (&error); + password = g_object_get_data (G_OBJECT (dialog), "pgd-password"); + + g_timer_start (timer); + document = poppler_document_new_from_file (uri, password, &error); + g_timer_stop (timer); + + gtk_widget_destroy (GTK_WIDGET (dialog)); + } + + if (error) { + g_print ("Error: %s\n", error->message); + g_error_free (error); + g_object_unref (file); + g_free (uri); + + return 1; + } + } + + g_object_unref (file); + g_free (uri); + + g_print ("Document successfully loaded in %.4f seconds\n", + g_timer_elapsed (timer, NULL)); + g_timer_destroy (timer); + + /* Main window */ + win = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (win), 600, 600); + gtk_window_set_title (GTK_WINDOW (win), "Poppler GLib Demo"); + g_signal_connect (G_OBJECT (win), "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + + gtk_accel = gtk_accel_group_new (); + closure = g_cclosure_new (G_CALLBACK (gtk_main_quit), NULL, NULL); + gtk_accel_group_connect (gtk_accel, gdk_keyval_from_name ("q"), + GDK_CONTROL_MASK, 0, closure); + g_closure_unref (closure); + gtk_window_add_accel_group (GTK_WINDOW(win), gtk_accel); + + hbox = gtk_hbox_new (FALSE, 6); + + treeview = pgd_demo_list_create (); + gtk_box_pack_start (GTK_BOX (hbox), treeview, FALSE, TRUE, 0); + gtk_widget_show (treeview); + + notebook = pdg_demo_notebook_create (document); + gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0); + gtk_widget_show (notebook); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (pgd_demo_changed), + (gpointer) notebook); + + gtk_container_add (GTK_CONTAINER (win), hbox); + gtk_widget_show (hbox); + + gtk_widget_show (win); + + gtk_main (); + + g_object_unref (document); + + return 0; +} diff --git a/glib/demo/outline.c b/glib/demo/outline.c new file mode 100644 index 0000000..5dc7189 --- /dev/null +++ b/glib/demo/outline.c @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> + +#include "outline.h" +#include "utils.h" + +enum { + OUTLINE_TITLE_COLUMN, + OUTLINE_ACTION_TYPE_COLUMN, + OUTLINE_EXPAND_COLUMN, + OUTLINE_ACTION_COLUMN, + N_COLUMNS +}; + +static void +build_tree (PopplerDocument *document, + GtkTreeModel *model, + GtkTreeIter *parent, + PopplerIndexIter *iter) +{ + + do { + GtkTreeIter tree_iter; + PopplerIndexIter *child; + PopplerAction *action; + gboolean expand; + gchar *markup; + GEnumValue *enum_value; + + action = poppler_index_iter_get_action (iter); + expand = poppler_index_iter_is_open (iter); + + if (!action) + continue; + + markup = g_markup_escape_text (action->any.title, -1); + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_ACTION_TYPE), action->type); + + if (action->type == POPPLER_ACTION_GOTO_DEST && + action->goto_dest.dest->type == POPPLER_DEST_NAMED) { + /* TODO */ + } + + gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent); + gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter, + OUTLINE_TITLE_COLUMN, markup, + OUTLINE_ACTION_TYPE_COLUMN, enum_value->value_name, + OUTLINE_EXPAND_COLUMN, expand, + OUTLINE_ACTION_COLUMN, action, + -1); + g_object_weak_ref (G_OBJECT (model), + (GWeakNotify)poppler_action_free, + action); + + g_free (markup); + + child = poppler_index_iter_get_child (iter); + if (child) + build_tree (document, model, &tree_iter, child); + poppler_index_iter_free (child); + } while (poppler_index_iter_next (iter)); +} + +GtkTreeModel * +pgd_outline_create_model (PopplerDocument *document) +{ + GtkTreeModel *model; + PopplerIndexIter *iter; + + iter = poppler_index_iter_new (document); + if (iter) { + model = GTK_TREE_MODEL ( + gtk_tree_store_new (N_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_BOOLEAN, G_TYPE_POINTER)); + build_tree (document, model, NULL, iter); + poppler_index_iter_free (iter); + } else { + GtkTreeIter tree_iter; + gchar *markup; + + model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING)); + gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter); + markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", + "The document doesn't contain outline"); + gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter, + 0, markup, -1); + g_free (markup); + } + + return model; +} + +static void +expand_open_links (GtkTreeView *tree_view, + GtkTreeModel *model, + GtkTreeIter *parent) +{ + GtkTreeIter iter; + gboolean expand; + + if (gtk_tree_model_iter_children (model, &iter, parent)) { + do { + gtk_tree_model_get (model, &iter, + OUTLINE_EXPAND_COLUMN, &expand, + -1); + if (expand) { + GtkTreePath *path; + + path = gtk_tree_model_get_path (model, &iter); + gtk_tree_view_expand_row (tree_view, path, FALSE); + gtk_tree_path_free (path); + } + + expand_open_links (tree_view, model, &iter); + } while (gtk_tree_model_iter_next (model, &iter)); + } +} + +static void +pgd_outline_selection_changed (GtkTreeSelection *treeselection, + GtkWidget *action_view) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) { + PopplerAction *action; + + gtk_tree_model_get (model, &iter, + OUTLINE_ACTION_COLUMN, &action, + -1); + pgd_action_view_set_action (action_view, action); + } +} + +GtkWidget * +pgd_outline_create_widget (PopplerDocument *document) +{ + GtkWidget *swindow; + GtkWidget *treeview; + GtkTreeModel *model; + GtkCellRenderer *renderer; + GtkTreeSelection *selection; + GtkWidget *hpaned, *action; + + hpaned = gtk_hpaned_new (); + + action = pgd_action_view_new (document); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + model = pgd_outline_create_model (document); + treeview = gtk_tree_view_new_with_model (model); + g_object_unref (model); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Title", + renderer, + "markup", OUTLINE_TITLE_COLUMN, + NULL); + g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set (G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0)), + "expand", TRUE, NULL); + + if (GTK_IS_TREE_STORE (model)) { + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "Action Type", + renderer, + "text", OUTLINE_ACTION_TYPE_COLUMN, + NULL); + + expand_open_links (GTK_TREE_VIEW (treeview), model, NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (pgd_outline_selection_changed), + (gpointer)action); + } else { + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), + GTK_SELECTION_NONE); + } + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_paned_add1 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_paned_add2 (GTK_PANED (hpaned), action); + gtk_widget_show (action); + + gtk_paned_set_position (GTK_PANED (hpaned), 300); + + return hpaned; +} diff --git a/glib/demo/outline.h b/glib/demo/outline.h new file mode 100644 index 0000000..61b8238 --- /dev/null +++ b/glib/demo/outline.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _OUTLINE_H_ +#define _OUTLINE_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_outline_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _OUTLINE_H_ */ diff --git a/glib/demo/page.c b/glib/demo/page.c new file mode 100644 index 0000000..7ab008c --- /dev/null +++ b/glib/demo/page.c @@ -0,0 +1,335 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <gtk/gtk.h> + +#include "page.h" +#include "utils.h" + +typedef struct { + PopplerDocument *doc; + + GtkWidget *index; + GtkWidget *label; + GtkWidget *size; + GtkWidget *duration; + GtkWidget *thumbnail; + GtkWidget *thumbnail_size; + + gint page; +} PgdPageDemo; + +static void +pgd_page_free (PgdPageDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + g_free (demo); +} + +#ifndef POPPLER_WITH_GDK +static void +image_set_from_surface (GtkImage *gtkimage, + cairo_surface_t *surface) +{ + GdkPixbuf *pixbuf; + cairo_surface_t *image; + cairo_t *cr; + gboolean has_alpha; + gint width, height; + cairo_format_t surface_format; + gint pixbuf_n_channels; + gint pixbuf_rowstride; + guchar *pixbuf_pixels; + gint x, y; + + width = cairo_image_surface_get_width (surface); + height = cairo_image_surface_get_height (surface); + + surface_format = cairo_image_surface_get_format (surface); + has_alpha = (surface_format == CAIRO_FORMAT_ARGB32); + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + TRUE, 8, + width, height); + pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf); + pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf); + pixbuf_pixels = gdk_pixbuf_get_pixels (pixbuf); + + image = cairo_image_surface_create_for_data (pixbuf_pixels, + surface_format, + width, height, + pixbuf_rowstride); + cr = cairo_create (image); + cairo_set_source_surface (cr, surface, 0, 0); + + if (has_alpha) + cairo_mask_surface (cr, surface, 0, 0); + else + cairo_paint (cr); + + cairo_destroy (cr); + cairo_surface_destroy (image); + + for (y = 0; y < height; y++) { + guchar *p = pixbuf_pixels + y * pixbuf_rowstride; + + for (x = 0; x < width; x++) { + guchar tmp; + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + tmp = p[0]; + p[0] = p[2]; + p[2] = tmp; + p[3] = (has_alpha) ? p[3] : 0xff; +#else + tmp = p[0]; + p[0] = (has_alpha) ? p[3] : 0xff; + p[3] = p[2]; + p[2] = p[1]; + p[1] = tmp; +#endif + p += pixbuf_n_channels; + } + } + + gtk_image_set_from_pixbuf (gtkimage, pixbuf); + g_object_unref (pixbuf); +} +#endif /* !POPPLER_WITH_GDK */ + +static void +pgd_page_set_page (PgdPageDemo *demo, + PopplerPage *page) +{ +#ifdef POPPLER_WITH_GDK + GdkPixbuf *thumbnail; +#else + cairo_surface_t *thumbnail; +#endif + gchar *str; + + str = page ? g_strdup_printf ("%d", poppler_page_get_index (page)) : NULL; + gtk_label_set_text (GTK_LABEL (demo->index), str); + g_free (str); + + if (page) { + str = poppler_page_get_label (page); + gtk_label_set_text (GTK_LABEL (demo->label), str); + g_free (str); + } else { + gtk_label_set_text (GTK_LABEL (demo->label), NULL); + } + + if (page) { + gdouble width, height; + + poppler_page_get_size (page, &width, &height); + str = g_strdup_printf ("%.2f x %.2f", width, height); + gtk_label_set_text (GTK_LABEL (demo->size), str); + g_free (str); + } else { + gtk_label_set_text (GTK_LABEL (demo->size), NULL); + } + + str = page ? g_strdup_printf ("%.2f seconds", poppler_page_get_duration (page)) : NULL; + gtk_label_set_text (GTK_LABEL (demo->duration), str); + g_free (str); + +#ifdef POPPLER_WITH_GDK + thumbnail = page ? poppler_page_get_thumbnail_pixbuf (page) : NULL; +#else + thumbnail = page ? poppler_page_get_thumbnail (page) : NULL; +#endif + if (thumbnail) { + gint width, height; + + poppler_page_get_thumbnail_size (page, &width, &height); + str = g_strdup_printf ("%d x %d", width, height); + gtk_label_set_text (GTK_LABEL (demo->thumbnail_size), str); + g_free (str); + +#ifdef POPPLER_WITH_GDK + gtk_image_set_from_pixbuf (GTK_IMAGE (demo->thumbnail), thumbnail); + g_object_unref (thumbnail); +#else + image_set_from_surface (GTK_IMAGE (demo->thumbnail), thumbnail); + cairo_surface_destroy (thumbnail); +#endif + } else { + str = g_strdup ("<i>No thumbnail found</i>"); + gtk_label_set_markup (GTK_LABEL (demo->thumbnail_size), str); + g_free (str); + + gtk_image_set_from_stock (GTK_IMAGE (demo->thumbnail), + GTK_STOCK_MISSING_IMAGE, + GTK_ICON_SIZE_DIALOG); + } +} + +static void +pgd_page_get_info (GtkWidget *button, + PgdPageDemo *demo) +{ + PopplerPage *page; + + page = poppler_document_get_page (demo->doc, demo->page); + pgd_page_set_page (demo, page); + g_object_unref (page); +} + +static void +pgd_page_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdPageDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; +} + +GtkWidget * +pgd_page_create_widget (PopplerDocument *document) +{ + PgdPageDemo *demo; + GtkWidget *vbox; + GtkWidget *hbox, *page_selector; + GtkWidget *button; + GtkWidget *frame, *alignment; + GtkWidget *table; + GtkWidget *label; + GtkWidget *thumnail_box; + gchar *str; + gint n_pages; + gint row = 0; + + demo = g_new0 (PgdPageDemo, 1); + + demo->doc = g_object_ref (document); + + n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_page_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + button = gtk_button_new_with_label ("Get Info"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_page_get_info), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + hbox = gtk_hbox_new (FALSE, 6); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Page Properties</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_widget_show (alignment); + + table = gtk_table_new (3, 2, FALSE); + + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Index:</b>", + &(demo->index), NULL, &row); + pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Label:</b>", + &(demo->label), NULL, &row); + pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Size:</b>", + &(demo->size), NULL, &row); + pgd_table_add_property_with_value_widget (GTK_TABLE (table), "<b>Page Duration:</b>", + &(demo->duration), NULL, &row); + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); + + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_frame_set_label_align (GTK_FRAME (frame), 0.5, 0.5); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Page Thumbnail</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_widget_show (alignment); + + thumnail_box = gtk_vbox_new (FALSE, 6); + + demo->thumbnail = gtk_image_new (); + gtk_box_pack_start (GTK_BOX (thumnail_box), demo->thumbnail, TRUE, TRUE, 0); + gtk_widget_show (demo->thumbnail); + + demo->thumbnail_size = gtk_label_new (NULL); + g_object_set (G_OBJECT (demo->thumbnail_size), "xalign", 0.5, NULL); + gtk_box_pack_start (GTK_BOX (thumnail_box), demo->thumbnail_size, TRUE, TRUE, 0); + gtk_widget_show (demo->thumbnail_size); + + gtk_container_add (GTK_CONTAINER (alignment), thumnail_box); + gtk_widget_show (thumnail_box); + + gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_page_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/page.h b/glib/demo/page.h new file mode 100644 index 0000000..5b86a81 --- /dev/null +++ b/glib/demo/page.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _PAGE_H_ +#define _PAGE_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_page_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _PAGE_H_ */ diff --git a/glib/demo/print.c b/glib/demo/print.c new file mode 100644 index 0000000..17bbe0e --- /dev/null +++ b/glib/demo/print.c @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <gtk/gtk.h> +#include "print.h" + +typedef enum { + PRINT_DOCUMENT, + PRINT_DOCUMENT_MARKUPS, + PRINT_DOCUMENT_STAMPS +} PgdPrintOptions; + +typedef struct { + PopplerDocument *doc; + GtkWidget *options_combo; + PgdPrintOptions options; +} PgdPrintDemo; + +#define PGD_PRINT_OPTIONS "pgd-print-options" + +static void +pgd_print_free (PgdPrintDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + g_free (demo); +} + +static void +pgd_print_begin_print (GtkPrintOperation *op, + GtkPrintContext *context, + PgdPrintDemo *demo) +{ + gtk_print_operation_set_n_pages (op, poppler_document_get_n_pages (demo->doc)); +} + +static void +pgd_print_draw_page (GtkPrintOperation *op, + GtkPrintContext *context, + gint page_nr, + PgdPrintDemo *demo) +{ + PopplerPage *page; + cairo_t *cr; + GtkPrintSettings *settings; + PgdPrintOptions options; + PopplerPrintFlags flags = 0; + + page = poppler_document_get_page (demo->doc, page_nr); + if (!page) + return; + + settings = gtk_print_operation_get_print_settings (op); + /* Workaround for gtk+ bug, we need to save the options ourselves */ + options = demo->options; +#if 0 + options = gtk_print_settings_get_int_with_default (settings, + PGD_PRINT_OPTIONS, + PRINT_DOCUMENT_MARKUPS); +#endif + switch (options) { + case PRINT_DOCUMENT: + flags |= POPPLER_PRINT_DOCUMENT; + break; + case PRINT_DOCUMENT_MARKUPS: + flags |= POPPLER_PRINT_MARKUP_ANNOTS; + break; + case PRINT_DOCUMENT_STAMPS: + flags |= POPPLER_PRINT_STAMP_ANNOTS_ONLY; + break; + default: + g_assert_not_reached (); + } + + cr = gtk_print_context_get_cairo_context (context); + poppler_page_render_for_printing_with_options (page, cr, flags); + g_object_unref (page); +} + +static GObject * +pgd_print_create_custom_widget (GtkPrintOperation *op, + PgdPrintDemo *demo) +{ + GtkWidget *hbox; + GtkWidget *label, *combo; + GtkPrintSettings *settings; + PgdPrintOptions options; + + settings = gtk_print_operation_get_print_settings (op); + options = gtk_print_settings_get_int_with_default (settings, + PGD_PRINT_OPTIONS, + PRINT_DOCUMENT_MARKUPS); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 12); + + label = gtk_label_new ("Print: "); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + +#if GTK_CHECK_VERSION (2, 24, 0) + combo = gtk_combo_box_text_new (); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "Document"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "Document and markup"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "Document and stamps"); +#else + combo = gtk_combo_box_new_text (); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Document"); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Document and markup"); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "Document and stamps"); +#endif + demo->options_combo = combo; + gtk_combo_box_set_active (GTK_COMBO_BOX (combo), options); + gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0); + gtk_widget_show (combo); + + return G_OBJECT (hbox); +} + +static void +pgd_print_custom_widget_apply (GtkPrintOperation *op, + GtkWidget *widget, + PgdPrintDemo *demo) +{ + GtkPrintSettings *settings; + PgdPrintOptions options; + + settings = gtk_print_operation_get_print_settings (op); + options = gtk_combo_box_get_active (GTK_COMBO_BOX (demo->options_combo)); + /* Workaround for gtk+ bug, we need to save the options ourselves */ + demo->options = options; + gtk_print_settings_set_int (settings, PGD_PRINT_OPTIONS, options); +} + +static void +pgd_print_print (GtkWidget *button, + PgdPrintDemo *demo) +{ + GtkPrintOperation *op; + GError *error = NULL; + + op = gtk_print_operation_new (); + gtk_print_operation_set_custom_tab_label (op, "PDF Options"); + g_signal_connect (op, "begin-print", + G_CALLBACK (pgd_print_begin_print), + demo); + g_signal_connect (op, "draw-page", + G_CALLBACK (pgd_print_draw_page), + demo); + g_signal_connect (op, "create_custom_widget", + G_CALLBACK (pgd_print_create_custom_widget), + demo); + g_signal_connect (op, "custom_widget_apply", + G_CALLBACK (pgd_print_custom_widget_apply), + demo); + gtk_print_operation_run (op, + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, + GTK_WINDOW (gtk_widget_get_toplevel (button)), + &error); + if (error) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (button)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "%s", error->message); + g_error_free (error); + + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), NULL); + + gtk_widget_show (dialog); + } + g_object_unref (op); +} + +GtkWidget * +pgd_print_create_widget (PopplerDocument *document) +{ + PgdPrintDemo *demo; + GtkWidget *vbox; + GtkWidget *hbox; + GtkWidget *button; + + demo = g_new0 (PgdPrintDemo, 1); + + demo->doc = g_object_ref (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + button = gtk_button_new_with_label ("Print..."); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_print_print), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_print_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/print.h b/glib/demo/print.h new file mode 100644 index 0000000..667259c --- /dev/null +++ b/glib/demo/print.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _PRINT_H_ +#define _PRINT_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_print_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _PRINT_H_ */ diff --git a/glib/demo/render.c b/glib/demo/render.c new file mode 100644 index 0000000..bb7afbd --- /dev/null +++ b/glib/demo/render.c @@ -0,0 +1,557 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <gtk/gtk.h> +#include <cairo.h> + +#include "render.h" + +typedef enum { + PGD_RENDER_CAIRO, + PGD_RENDER_PIXBUF +} PgdRenderMode; + +typedef struct { + PopplerDocument *doc; + + /* Properties */ + PgdRenderMode mode; + gint page; + gdouble scale; + gint rotate; + GdkRectangle slice; + gboolean printing; + + GtkWidget *swindow; + GtkWidget *darea; + GtkWidget *slice_x; + GtkWidget *slice_y; + GtkWidget *slice_w; + GtkWidget *slice_h; + GtkWidget *timer_label; + + cairo_surface_t *surface; + GdkPixbuf *pixbuf; +} PgdRenderDemo; + +static void +pgd_render_free (PgdRenderDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->surface) { + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + } + + if (demo->pixbuf) { + g_object_unref (demo->pixbuf); + demo->pixbuf = NULL; + } + + g_free (demo); +} + +static gboolean +pgd_render_drawing_area_expose (GtkWidget *area, + GdkEventExpose *event, + PgdRenderDemo *demo) +{ + if (demo->mode == PGD_RENDER_CAIRO && !demo->surface) + return FALSE; + + if (demo->mode == PGD_RENDER_PIXBUF && !demo->pixbuf) + return FALSE; + + gdk_window_clear (gtk_widget_get_window (area)); + + if (demo->mode == PGD_RENDER_CAIRO) { + cairo_t *cr; + + cr = gdk_cairo_create (gtk_widget_get_window (area)); + cairo_set_source_surface (cr, demo->surface, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + } else if (demo->mode == PGD_RENDER_PIXBUF) { + gdk_draw_pixbuf (gtk_widget_get_window (area), + gtk_widget_get_style(area)->fg_gc[GTK_STATE_NORMAL], + demo->pixbuf, + 0, 0, + 0, 0, + gdk_pixbuf_get_width (demo->pixbuf), + gdk_pixbuf_get_height (demo->pixbuf), + GDK_RGB_DITHER_NORMAL, + 0, 0); + } else { + g_assert_not_reached (); + } + + return TRUE; +} + +static void +pgd_render_start (GtkButton *button, + PgdRenderDemo *demo) +{ + PopplerPage *page; + gdouble page_width, page_height; + gdouble width, height; + gint x, y; + gchar *str; + GTimer *timer; + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return; + + if (demo->surface) + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + + if (demo->pixbuf) + g_object_unref (demo->pixbuf); + demo->pixbuf = NULL; + + poppler_page_get_size (page, &page_width, &page_height); + + if (demo->rotate == 0 || demo->rotate == 180) { + width = demo->slice.width * demo->scale; + height = demo->slice.height * demo->scale; + x = demo->slice.x * demo->scale; + y = demo->slice.y * demo->scale; + } else { + width = demo->slice.height * demo->scale; + height = demo->slice.width * demo->scale; + x = demo->slice.y * demo->scale; + y = demo->slice.x * demo->scale; + } + + if (demo->mode == PGD_RENDER_CAIRO) { + cairo_t *cr; + + timer = g_timer_new (); + demo->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height); + cr = cairo_create (demo->surface); + + cairo_save (cr); + switch (demo->rotate) { + case 90: + cairo_translate (cr, x + width, -y); + break; + case 180: + cairo_translate (cr, x + width, y + height); + break; + case 270: + cairo_translate (cr, -x, y + height); + break; + default: + cairo_translate (cr, -x, -y); + } + + if (demo->scale != 1.0) + cairo_scale (cr, demo->scale, demo->scale); + + if (demo->rotate != 0) + cairo_rotate (cr, demo->rotate * G_PI / 180.0); + + if (demo->printing) + poppler_page_render_for_printing (page, cr); + else + poppler_page_render (page, cr); + cairo_restore (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + g_timer_stop (timer); + + cairo_destroy (cr); + } else if (demo->mode == PGD_RENDER_PIXBUF) { +#ifdef POPPLER_WITH_GDK + timer = g_timer_new (); + demo->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + FALSE, 8, width, height); + gdk_pixbuf_fill (demo->pixbuf, 0xffffff); + if (demo->printing) { + poppler_page_render_to_pixbuf_for_printing (page, + x, y, + width, + height, + demo->scale, + demo->rotate, + demo->pixbuf); + } else { + poppler_page_render_to_pixbuf (page, + x, y, + width, + height, + demo->scale, + demo->rotate, + demo->pixbuf); + } + g_timer_stop (timer); +#endif /* POPPLER_WITH_GDK */ + } else { + g_assert_not_reached (); + } + + g_object_unref (page); + + str = g_strdup_printf ("<i>Page rendered in %.4f seconds</i>", + g_timer_elapsed (timer, NULL)); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); + g_free (str); + + g_timer_destroy (timer); + + gtk_widget_set_size_request (demo->darea, width, height); + gtk_widget_queue_draw (demo->darea); +} + +static void +pgd_render_slice_selector_setup (PgdRenderDemo *demo) +{ + PopplerPage *page; + gdouble width, height; + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return; + + poppler_page_get_size (page, &width, &height); + + gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_x), 0, width); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_y), 0, height); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_w), 0, width); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->slice_h), 0, height); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_x), 0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_y), 0); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_w), width); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->slice_h), height); + + g_object_unref (page); +} + +static void +pgd_render_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdRenderDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; + pgd_render_slice_selector_setup (demo); +} + +static void +pgd_render_scale_selector_value_changed (GtkSpinButton *spinbutton, + PgdRenderDemo *demo) +{ + demo->scale = gtk_spin_button_get_value (spinbutton); +} + +static void +pgd_render_rotate_selector_changed (GtkComboBox *combobox, + PgdRenderDemo *demo) +{ + demo->rotate = gtk_combo_box_get_active (combobox) * 90; +} + +static void +pgd_render_printing_selector_changed (GtkToggleButton *tooglebutton, + PgdRenderDemo *demo) +{ + demo->printing = gtk_toggle_button_get_active (tooglebutton); +} + +static void +pgd_render_mode_selector_changed (GtkComboBox *combobox, + PgdRenderDemo *demo) +{ + demo->mode = gtk_combo_box_get_active (combobox); +} + +static void +pgd_render_slice_selector_value_changed (GtkSpinButton *spinbutton, + PgdRenderDemo *demo) +{ + demo->slice.x = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_x)); + demo->slice.y = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_y)); + demo->slice.width = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_w)); + demo->slice.height = (gint)gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->slice_h)); +} + +GtkWidget * +pgd_render_properties_selector_create (PgdRenderDemo *demo) +{ + GtkWidget *hbox, *vbox; + GtkWidget *label; + GtkWidget *page_hbox, *page_selector; + GtkWidget *scale_hbox, *scale_selector; + GtkWidget *rotate_hbox, *rotate_selector; + GtkWidget *mode_hbox, *mode_selector; + GtkWidget *printing_selector; + GtkWidget *slice_hbox, *slice_selector; + GtkWidget *button; + gint n_pages; + gchar *str; + + n_pages = poppler_document_get_n_pages (demo->doc); + + vbox = gtk_vbox_new (FALSE, 6); + + hbox = gtk_hbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + page_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_render_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (page_hbox), page_selector, TRUE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + gtk_box_pack_start (GTK_BOX (hbox), page_hbox, FALSE, TRUE, 0); + gtk_widget_show (page_hbox); + + scale_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Scale:"); + gtk_box_pack_start (GTK_BOX (scale_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + scale_selector = gtk_spin_button_new_with_range (0, 10.0, 0.1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (scale_selector), 1.0); + g_signal_connect (G_OBJECT (scale_selector), "value-changed", + G_CALLBACK (pgd_render_scale_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (scale_hbox), scale_selector, TRUE, TRUE, 0); + gtk_widget_show (scale_selector); + + gtk_box_pack_start (GTK_BOX (hbox), scale_hbox, FALSE, TRUE, 0); + gtk_widget_show (scale_hbox); + + rotate_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Rotate:"); + gtk_box_pack_start (GTK_BOX (rotate_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + +#if GTK_CHECK_VERSION (2, 24, 0) + rotate_selector = gtk_combo_box_text_new (); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "0"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "90"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "180"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "270"); +#else + rotate_selector = gtk_combo_box_new_text (); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "0"); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "90"); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "180"); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "270"); +#endif + gtk_combo_box_set_active (GTK_COMBO_BOX (rotate_selector), 0); + g_signal_connect (G_OBJECT (rotate_selector), "changed", + G_CALLBACK (pgd_render_rotate_selector_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (rotate_hbox), rotate_selector, TRUE, TRUE, 0); + gtk_widget_show (rotate_selector); + + gtk_box_pack_start (GTK_BOX (hbox), rotate_hbox, FALSE, TRUE, 0); + gtk_widget_show (rotate_hbox); + + mode_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Mode:"); + gtk_box_pack_start (GTK_BOX (mode_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + +#if GTK_CHECK_VERSION (2, 24, 0) + mode_selector = gtk_combo_box_text_new (); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (mode_selector), "cairo"); +#ifdef POPPLER_WITH_GDK + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (mode_selector), "pixbuf"); +#endif +#else // ! GTK_CHECK_VERSION (2, 24, 0) + mode_selector = gtk_combo_box_new_text (); + gtk_combo_box_append_text (GTK_COMBO_BOX (mode_selector), "cairo"); +#ifdef POPPLER_WITH_GDK + gtk_combo_box_append_text (GTK_COMBO_BOX (mode_selector), "pixbuf"); +#endif +#endif // GTK_CHECK_VERSION (2, 24, 0) + gtk_combo_box_set_active (GTK_COMBO_BOX (mode_selector), 0); + g_signal_connect (G_OBJECT (mode_selector), "changed", + G_CALLBACK (pgd_render_mode_selector_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (mode_hbox), mode_selector, TRUE, TRUE, 0); + gtk_widget_show (mode_selector); + + gtk_box_pack_start (GTK_BOX (hbox), mode_hbox, FALSE, TRUE, 0); + gtk_widget_show (mode_hbox); + + printing_selector = gtk_check_button_new_with_label ("Printing"); + g_signal_connect (printing_selector, "toggled", + G_CALLBACK (pgd_render_printing_selector_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), printing_selector, FALSE, TRUE, 0); + gtk_widget_show (printing_selector); + + hbox = gtk_hbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + slice_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("x:"); + gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + demo->slice_x = gtk_spin_button_new_with_range (0, 0, 1.0); + g_signal_connect (G_OBJECT (demo->slice_x), "value-changed", + G_CALLBACK (pgd_render_slice_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_x, TRUE, TRUE, 0); + gtk_widget_show (demo->slice_x); + + gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0); + gtk_widget_show (slice_hbox); + + slice_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("y:"); + gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + demo->slice_y = gtk_spin_button_new_with_range (0, 0, 1.0); + g_signal_connect (G_OBJECT (demo->slice_y), "value-changed", + G_CALLBACK (pgd_render_slice_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_y, TRUE, TRUE, 0); + gtk_widget_show (demo->slice_y); + + gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0); + gtk_widget_show (slice_hbox); + + slice_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("width:"); + gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + demo->slice_w = gtk_spin_button_new_with_range (0, 0, 1.0); + g_signal_connect (G_OBJECT (demo->slice_w), "value-changed", + G_CALLBACK (pgd_render_slice_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_w, TRUE, TRUE, 0); + gtk_widget_show (demo->slice_w); + + gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0); + gtk_widget_show (slice_hbox); + + slice_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("height:"); + gtk_box_pack_start (GTK_BOX (slice_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + demo->slice_h = gtk_spin_button_new_with_range (0, 0, 1.0); + g_signal_connect (G_OBJECT (demo->slice_h), "value-changed", + G_CALLBACK (pgd_render_slice_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (slice_hbox), demo->slice_h, TRUE, TRUE, 0); + gtk_widget_show (demo->slice_h); + + gtk_box_pack_start (GTK_BOX (hbox), slice_hbox, FALSE, TRUE, 0); + gtk_widget_show (slice_hbox); + + pgd_render_slice_selector_setup (demo); + + button = gtk_button_new_with_label ("Render"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_render_start), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0); + gtk_widget_show (button); + + demo->timer_label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No page rendered</i>"); + g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL); + gtk_box_pack_end (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0); + gtk_widget_show (demo->timer_label); + + return vbox; +} + +GtkWidget * +pgd_render_create_widget (PopplerDocument *document) +{ + PgdRenderDemo *demo; + GtkWidget *vbox, *hbox; + + demo = g_new0 (PgdRenderDemo, 1); + + demo->doc = g_object_ref (document); + demo->scale = 1.0; + + vbox = gtk_vbox_new (FALSE, 6); + + hbox = pgd_render_properties_selector_create (demo); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show (hbox); + + demo->darea = gtk_drawing_area_new (); + g_signal_connect (G_OBJECT (demo->darea), "expose_event", + G_CALLBACK (pgd_render_drawing_area_expose), + (gpointer)demo); + + demo->swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (demo->swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (demo->swindow), + demo->darea); + gtk_widget_show (demo->darea); + + gtk_box_pack_start (GTK_BOX (vbox), demo->swindow, TRUE, TRUE, 0); + gtk_widget_show (demo->swindow); + + g_object_weak_ref (G_OBJECT (demo->swindow), + (GWeakNotify)pgd_render_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/render.h b/glib/demo/render.h new file mode 100644 index 0000000..46f7039 --- /dev/null +++ b/glib/demo/render.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _RENDER_H_ +#define _RENDER_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_render_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _RENDER_H_ */ diff --git a/glib/demo/selections.c b/glib/demo/selections.c new file mode 100644 index 0000000..bfd9070 --- /dev/null +++ b/glib/demo/selections.c @@ -0,0 +1,686 @@ +/* + * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <gtk/gtk.h> +#include <cairo.h> + +#include "selections.h" + +typedef struct { + PopplerDocument *doc; + + /* Properties */ + gint page_index; + gdouble scale; + + GtkWidget *swindow; + GtkWidget *darea; + GtkWidget *fg_color_button; + GtkWidget *bg_color_button; + GtkWidget *copy_button; + + PopplerPage *page; + cairo_surface_t *surface; + + GdkPoint start; + GdkPoint stop; + PopplerRectangle doc_area; + cairo_surface_t *selection_surface; + PopplerSelectionStyle style; + PopplerColor glyph_color; + PopplerColor background_color; + guint selections_idle; + cairo_region_t *selection_region; + cairo_region_t *selected_region; + GdkCursorType cursor; + gchar *selected_text; +} PgdSelectionsDemo; + +static void +pgd_selections_clear_selections (PgdSelectionsDemo *demo) +{ + demo->start.x = -1; + + if (demo->selection_surface) { + cairo_surface_destroy (demo->selection_surface); + demo->selection_surface = NULL; + } + + if (demo->selection_region) { + cairo_region_destroy (demo->selection_region); + demo->selection_region = NULL; + } + + if (demo->selected_text) { + g_free (demo->selected_text); + demo->selected_text = NULL; + } + + if (demo->selected_region) { + cairo_region_destroy (demo->selected_region); + demo->selected_region = NULL; + } + gtk_widget_set_sensitive(demo->copy_button, FALSE); +} + +static void +pgd_selections_free (PgdSelectionsDemo *demo) +{ + if (!demo) + return; + + if (demo->selections_idle > 0) { + g_source_remove (demo->selections_idle); + demo->selections_idle = 0; + } + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->page) { + g_object_unref (demo->page); + demo->page = NULL; + } + + if (demo->surface) { + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + } + + pgd_selections_clear_selections (demo); + + g_free (demo); +} + +static void +pgd_selections_update_selection_region (PgdSelectionsDemo *demo) +{ + PopplerRectangle area = { 0, 0, 0, 0 }; + + if (demo->selection_region) + cairo_region_destroy (demo->selection_region); + + poppler_page_get_size (demo->page, &area.x2, &area.y2); + demo->selection_region = poppler_page_get_selected_region (demo->page, + 1.0, + POPPLER_SELECTION_GLYPH, + &area); +} + +static void +pgd_selections_update_selected_text (PgdSelectionsDemo *demo) +{ + GList *region; + gchar *text; + + if (demo->selected_region) + cairo_region_destroy (demo->selected_region); + demo->selected_region = poppler_page_get_selected_region (demo->page, + 1.0, + demo->style, + &demo->doc_area); + if (demo->selected_text) + g_free (demo->selected_text); + demo->selected_text = NULL; + + text = poppler_page_get_selected_text (demo->page, + demo->style, + &demo->doc_area); + if (text) { + demo->selected_text = g_utf8_normalize (text, -1, G_NORMALIZE_NFKC); + g_free (text); + gtk_widget_set_sensitive(demo->copy_button, TRUE); + } +} + +static void +pgd_selections_update_cursor (PgdSelectionsDemo *demo, + GdkCursorType cursor_type) +{ + GdkWindow *window = gtk_widget_get_window (demo->darea); + GdkCursor *cursor = NULL; + + if (cursor_type == demo->cursor) + return; + + if (cursor_type != GDK_LAST_CURSOR) { + cursor = gdk_cursor_new_for_display (gtk_widget_get_display (demo->darea), + cursor_type); + } + + demo->cursor = cursor_type; + + gdk_window_set_cursor (window, cursor); + gdk_flush (); + if (cursor) + gdk_cursor_unref (cursor); +} + +static gboolean +pgd_selections_render_selections (PgdSelectionsDemo *demo) +{ + PopplerRectangle doc_area; + gdouble page_width, page_height; + cairo_t *cr; + + if (!demo->page || demo->start.x == -1) { + demo->selections_idle = 0; + + return FALSE; + } + + poppler_page_get_size (demo->page, &page_width, &page_height); + page_width *= demo->scale; + page_height *= demo->scale; + + doc_area.x1 = demo->start.x / demo->scale; + doc_area.y1 = demo->start.y / demo->scale; + doc_area.x2 = demo->stop.x / demo->scale; + doc_area.y2 = demo->stop.y / demo->scale; + + if (demo->selection_surface) + cairo_surface_destroy (demo->selection_surface); + demo->selection_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + page_width, page_height); + cr = cairo_create (demo->selection_surface); + if (demo->scale != 1.0) + cairo_scale (cr, demo->scale, demo->scale); + poppler_page_render_selection (demo->page, cr, + &doc_area, &demo->doc_area, + demo->style, + &demo->glyph_color, + &demo->background_color); + cairo_destroy (cr); + + demo->doc_area = doc_area; + gtk_widget_queue_draw (demo->darea); + + demo->selections_idle = 0; + + return FALSE; +} + +static gboolean +pgd_selections_drawing_area_expose (GtkWidget *area, + GdkEventExpose *event, + PgdSelectionsDemo *demo) +{ + cairo_t *cr; + + if (!demo->surface) + return FALSE; + + gdk_window_clear (gtk_widget_get_window (area)); + + cr = gdk_cairo_create (gtk_widget_get_window (area)); + + cairo_save (cr); + cairo_set_source_surface (cr, demo->surface, 0, 0); + cairo_paint (cr); + cairo_restore (cr); + + if (demo->selection_surface) { + cairo_set_source_surface (cr, demo->selection_surface, 0, 0); + cairo_paint (cr); + } + + cairo_destroy (cr); + + return TRUE; +} + +static gboolean +pgd_selections_drawing_area_button_press (GtkWidget *area, + GdkEventButton *event, + PgdSelectionsDemo *demo) +{ + if (!demo->page) + return FALSE; + + if (event->button != 1) + return FALSE; + + demo->start.x = event->x; + demo->start.y = event->y; + demo->stop = demo->start; + + switch (event->type) { + case GDK_2BUTTON_PRESS: + demo->style = POPPLER_SELECTION_WORD; + break; + case GDK_3BUTTON_PRESS: + demo->style = POPPLER_SELECTION_LINE; + break; + default: + demo->style = POPPLER_SELECTION_GLYPH; + } + + pgd_selections_render_selections (demo); + + return TRUE; +} + +static gboolean +pgd_selections_drawing_area_motion_notify (GtkWidget *area, + GdkEventMotion *event, + PgdSelectionsDemo *demo) +{ + if (!demo->page) + return FALSE; + + if (demo->start.x != -1) { + demo->stop.x = event->x; + demo->stop.y = event->y; + if (demo->selections_idle == 0) { + demo->selections_idle = + g_idle_add ((GSourceFunc)pgd_selections_render_selections, + demo); + } + } else { + gboolean over_text; + + over_text = cairo_region_contains_point (demo->selection_region, + event->x / demo->scale, + event->y / demo->scale); + pgd_selections_update_cursor (demo, over_text ? GDK_XTERM : GDK_LAST_CURSOR); + } + + return TRUE; +} + +static gboolean +pgd_selections_drawing_area_button_release (GtkWidget *area, + GdkEventButton *event, + PgdSelectionsDemo *demo) +{ + if (!demo->page) + return FALSE; + + if (event->button != 1) + return FALSE; + + if (demo->start.x != -1) + pgd_selections_update_selected_text (demo); + + demo->start.x = -1; + + if (demo->selections_idle > 0) { + g_source_remove (demo->selections_idle); + demo->selections_idle = 0; + } + + return TRUE; +} + +static void +pgd_selections_drawing_area_realize (GtkWidget *area, + PgdSelectionsDemo *demo) +{ + GtkStyle *style = gtk_widget_get_style (area); + + gtk_widget_add_events (area, + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK); + g_object_set (area, "has-tooltip", TRUE, NULL); + + gtk_color_button_set_color (GTK_COLOR_BUTTON (demo->fg_color_button), + &style->text[GTK_STATE_SELECTED]); + gtk_color_button_set_color (GTK_COLOR_BUTTON (demo->bg_color_button), + &style->base[GTK_STATE_SELECTED]); +} + +static gboolean +pgd_selections_drawing_area_query_tooltip (GtkWidget *area, + gint x, + gint y, + gboolean keyboard_mode, + GtkTooltip *tooltip, + PgdSelectionsDemo *demo) +{ + gboolean over_selection; + + if (!demo->selected_text) + return FALSE; + + over_selection = cairo_region_contains_point (demo->selected_region, + x / demo->scale, + y / demo->scale); + + if (over_selection) { + GdkRectangle selection_area; + + cairo_region_get_extents (demo->selected_region, + (cairo_rectangle_int_t *)&selection_area); + selection_area.x *= demo->scale; + selection_area.y *= demo->scale; + selection_area.width *= demo->scale; + selection_area.height *= demo->scale; + + gtk_tooltip_set_text (tooltip, demo->selected_text); + gtk_tooltip_set_tip_area (tooltip, &selection_area); + + return TRUE; + } + + return FALSE; +} + +static void +pgd_selections_render (GtkButton *button, + PgdSelectionsDemo *demo) +{ + gdouble page_width, page_height; + cairo_t *cr; + + if (!demo->page) + demo->page = poppler_document_get_page (demo->doc, demo->page_index); + + if (!demo->page) + return; + + pgd_selections_clear_selections (demo); + pgd_selections_update_selection_region (demo); + + if (demo->surface) + cairo_surface_destroy (demo->surface); + demo->surface = NULL; + + poppler_page_get_size (demo->page, &page_width, &page_height); + page_width *= demo->scale; + page_height *= demo->scale; + + demo->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + page_width, page_height); + cr = cairo_create (demo->surface); + + cairo_save (cr); + + if (demo->scale != 1.0) + cairo_scale (cr, demo->scale, demo->scale); + + poppler_page_render (demo->page, cr); + cairo_restore (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_destroy (cr); + + gtk_widget_set_size_request (demo->darea, page_width, page_height); + gtk_widget_queue_draw (demo->darea); +} + +static void +pgd_selections_copy (GtkButton *button, + PgdSelectionsDemo *demo) +{ + GtkClipboard *clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), + GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text (clipboard, demo->selected_text, -1); +} + +static void +pgd_selections_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdSelectionsDemo *demo) +{ + demo->page_index = (gint)gtk_spin_button_get_value (spinbutton) - 1; + if (demo->page) + g_object_unref (demo->page); + demo->page = NULL; +} + +static void +pgd_selections_scale_selector_value_changed (GtkSpinButton *spinbutton, + PgdSelectionsDemo *demo) +{ + demo->scale = gtk_spin_button_get_value (spinbutton); +} + +static void +pgd_selections_fg_color_changed (GtkColorButton *button, + GParamSpec *pspec, + PgdSelectionsDemo *demo) +{ + GdkColor color; + + gtk_color_button_get_color (GTK_COLOR_BUTTON (button), &color); + demo->glyph_color.red = color.red; + demo->glyph_color.green = color.green; + demo->glyph_color.blue = color.blue; +} + +static void +pgd_selections_bg_color_changed (GtkColorButton *button, + GParamSpec *pspec, + PgdSelectionsDemo *demo) +{ + GdkColor color; + + gtk_color_button_get_color (GTK_COLOR_BUTTON (button), &color); + demo->background_color.red = color.red; + demo->background_color.green = color.green; + demo->background_color.blue = color.blue; +} + +GtkWidget * +pgd_selections_properties_selector_create (PgdSelectionsDemo *demo) +{ + GtkWidget *hbox, *vbox; + GtkWidget *label; + GtkWidget *page_hbox, *page_selector; + GtkWidget *scale_hbox, *scale_selector; + GtkWidget *rotate_hbox, *rotate_selector; + GtkWidget *color_hbox; + GtkWidget *button; + gint n_pages; + gchar *str; + + n_pages = poppler_document_get_n_pages (demo->doc); + + vbox = gtk_vbox_new (FALSE, 6); + + hbox = gtk_hbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + page_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_selections_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (page_hbox), page_selector, TRUE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (page_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + gtk_box_pack_start (GTK_BOX (hbox), page_hbox, FALSE, TRUE, 0); + gtk_widget_show (page_hbox); + + scale_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Scale:"); + gtk_box_pack_start (GTK_BOX (scale_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + scale_selector = gtk_spin_button_new_with_range (0, 10.0, 0.1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (scale_selector), 1.0); + g_signal_connect (G_OBJECT (scale_selector), "value-changed", + G_CALLBACK (pgd_selections_scale_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (scale_hbox), scale_selector, TRUE, TRUE, 0); + gtk_widget_show (scale_selector); + + gtk_box_pack_start (GTK_BOX (hbox), scale_hbox, FALSE, TRUE, 0); + gtk_widget_show (scale_hbox); + + rotate_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Rotate:"); + gtk_box_pack_start (GTK_BOX (rotate_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + +#if GTK_CHECK_VERSION (2, 24, 0) + rotate_selector = gtk_combo_box_text_new (); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "0"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "90"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "180"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (rotate_selector), "270"); +#else + rotate_selector = gtk_combo_box_new_text (); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "0"); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "90"); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "180"); + gtk_combo_box_append_text (GTK_COMBO_BOX (rotate_selector), "270"); +#endif + gtk_combo_box_set_active (GTK_COMBO_BOX (rotate_selector), 0); +#if 0 + g_signal_connect (G_OBJECT (rotate_selector), "changed", + G_CALLBACK (pgd_selections_rotate_selector_changed), + (gpointer)demo); +#endif + gtk_box_pack_start (GTK_BOX (rotate_hbox), rotate_selector, TRUE, TRUE, 0); + gtk_widget_show (rotate_selector); + + gtk_box_pack_start (GTK_BOX (hbox), rotate_hbox, FALSE, TRUE, 0); + gtk_widget_show (rotate_hbox); + + hbox = gtk_hbox_new (FALSE, 12); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + color_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Foreground Color:"); + gtk_box_pack_start (GTK_BOX (color_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + demo->fg_color_button = gtk_color_button_new (); + g_signal_connect (demo->fg_color_button, "notify::color", + G_CALLBACK (pgd_selections_fg_color_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (color_hbox), demo->fg_color_button, TRUE, TRUE, 0); + gtk_widget_show (demo->fg_color_button); + + gtk_box_pack_start (GTK_BOX (hbox), color_hbox, FALSE, TRUE, 0); + gtk_widget_show (color_hbox); + + color_hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Background Color:"); + gtk_box_pack_start (GTK_BOX (color_hbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + demo->bg_color_button = gtk_color_button_new (); + g_signal_connect (demo->bg_color_button, "notify::color", + G_CALLBACK (pgd_selections_bg_color_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (color_hbox), demo->bg_color_button, TRUE, TRUE, 0); + gtk_widget_show (demo->bg_color_button); + + gtk_box_pack_start (GTK_BOX (hbox), color_hbox, FALSE, TRUE, 0); + gtk_widget_show (color_hbox); + + demo->copy_button = gtk_button_new_with_label ("Copy"); + g_signal_connect (G_OBJECT (demo->copy_button), "clicked", + G_CALLBACK (pgd_selections_copy), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), demo->copy_button, FALSE, TRUE, 0); + gtk_widget_set_sensitive(demo->copy_button, FALSE); + gtk_widget_show (demo->copy_button); + + button = gtk_button_new_with_label ("Render"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_selections_render), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0); + gtk_widget_show (button); + + return vbox; +} + +GtkWidget * +pgd_selections_create_widget (PopplerDocument *document) +{ + PgdSelectionsDemo *demo; + GtkWidget *vbox, *hbox; + + demo = g_new0 (PgdSelectionsDemo, 1); + + demo->doc = g_object_ref (document); + demo->scale = 1.0; + demo->cursor = GDK_LAST_CURSOR; + + pgd_selections_clear_selections (demo); + + vbox = gtk_vbox_new (FALSE, 6); + + hbox = pgd_selections_properties_selector_create (demo); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show (hbox); + + demo->darea = gtk_drawing_area_new (); + g_signal_connect (demo->darea, "realize", + G_CALLBACK (pgd_selections_drawing_area_realize), + (gpointer)demo); + g_signal_connect (demo->darea, "expose_event", + G_CALLBACK (pgd_selections_drawing_area_expose), + (gpointer)demo); + g_signal_connect (demo->darea, "button_press_event", + G_CALLBACK (pgd_selections_drawing_area_button_press), + (gpointer)demo); + g_signal_connect (demo->darea, "motion_notify_event", + G_CALLBACK (pgd_selections_drawing_area_motion_notify), + (gpointer)demo); + g_signal_connect (demo->darea, "button_release_event", + G_CALLBACK (pgd_selections_drawing_area_button_release), + (gpointer)demo); + g_signal_connect (demo->darea, "query_tooltip", + G_CALLBACK (pgd_selections_drawing_area_query_tooltip), + (gpointer)demo); + demo->swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (demo->swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (demo->swindow), + demo->darea); + gtk_widget_show (demo->darea); + + gtk_box_pack_start (GTK_BOX (vbox), demo->swindow, TRUE, TRUE, 0); + gtk_widget_show (demo->swindow); + + g_object_weak_ref (G_OBJECT (demo->swindow), + (GWeakNotify)pgd_selections_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/selections.h b/glib/demo/selections.h new file mode 100644 index 0000000..61f8349 --- /dev/null +++ b/glib/demo/selections.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _SELECTIONS_H_ +#define _SELECTIONS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_selections_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _SELECTIONS_H_ */ diff --git a/glib/demo/text.c b/glib/demo/text.c new file mode 100644 index 0000000..3a7b2cd --- /dev/null +++ b/glib/demo/text.c @@ -0,0 +1,466 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <string.h> + +#include "text.h" +#include "utils.h" + +enum { + TEXT_X1_COLUMN, + TEXT_Y1_COLUMN, + TEXT_X2_COLUMN, + TEXT_Y2_COLUMN, + TEXT_OFFSET_COLUMN, + TEXT_OFFPTR_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkWidget *timer_label; + GtkTextBuffer *buffer; + GtkWidget *treeview; + GtkListStore *model; + + /* Text attributes */ + GList *text_attrs; + GtkWidget *font_name; + GtkWidget *font_size; + GtkWidget *is_underlined; + GtkWidget *text_color; + + gint page; +} PgdTextDemo; + +static void +pgd_text_free (PgdTextDemo *demo) +{ + if (!demo) + return; + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + if (demo->buffer) { + g_object_unref (demo->buffer); + demo->buffer = NULL; + } + + if (demo->text_attrs) { + poppler_page_free_text_attributes (demo->text_attrs); + demo->text_attrs = NULL; + } + + if (demo->model) { + g_object_unref (demo->model); + demo->model = NULL; + } + + g_free (demo); +} + +static void +pgd_text_get_text (GtkWidget *button, + PgdTextDemo *demo) +{ + PopplerPage *page; + PopplerRectangle *recs = NULL; + guint n_recs; + gchar *text; + GTimer *timer; + gint i; + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) + return; + + gtk_list_store_clear (demo->model); + if (demo->text_attrs) + poppler_page_free_text_attributes (demo->text_attrs); + demo->text_attrs = NULL; + + timer = g_timer_new (); + text = poppler_page_get_text (page); + g_timer_stop (timer); + + if (text) { + gchar *str; + gdouble text_elapsed, layout_elapsed; + + text_elapsed = g_timer_elapsed (timer, NULL); + + g_timer_start (timer); + poppler_page_get_text_layout (page, &recs, &n_recs); + g_timer_stop (timer); + + layout_elapsed = g_timer_elapsed (timer, NULL); + + g_timer_start (timer); + demo->text_attrs = poppler_page_get_text_attributes (page); + g_timer_stop (timer); + + str = g_strdup_printf ("<i>got text in %.4f seconds, text layout in %.4f seconds, text attrs in %.4f seconds</i>", + text_elapsed, layout_elapsed, g_timer_elapsed (timer, NULL)); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); + g_free (str); + } else { + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No text found</i>"); + n_recs = 0; + } + + g_timer_destroy (timer); + g_object_unref (page); + + if (text) { + gtk_text_buffer_set_text (demo->buffer, text, strlen (text)); + g_free (text); + } + + for (i = 0; i < n_recs; i++) { + GtkTreeIter iter; + gchar *x1, *y1, *x2, *y2; + gchar *offset; + + x1 = g_strdup_printf ("%.2f", recs[i].x1); + y1 = g_strdup_printf ("%.2f", recs[i].y1); + x2 = g_strdup_printf ("%.2f", recs[i].x2); + y2 = g_strdup_printf ("%.2f", recs[i].y2); + + offset = g_strdup_printf ("%d", i); + + gtk_list_store_append (demo->model, &iter); + gtk_list_store_set (demo->model, &iter, + TEXT_X1_COLUMN, x1, + TEXT_Y1_COLUMN, y1, + TEXT_X2_COLUMN, x2, + TEXT_Y2_COLUMN, y2, + TEXT_OFFSET_COLUMN, offset, + TEXT_OFFPTR_COLUMN, GINT_TO_POINTER (i), + -1); + + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + g_free (offset); + } + + g_free (recs); +} + +static void +pgd_text_set_text_attrs_for_offset (PgdTextDemo *demo, + gint offset) +{ + GList *l; + + for (l = demo->text_attrs; l; l = g_list_next (l)) { + PopplerTextAttributes *attrs = (PopplerTextAttributes *)l->data; + + if (offset >= attrs->start_index && offset <= attrs->end_index) { + gchar *str; + GdkPixbuf *pixbuf; + + gtk_label_set_text (GTK_LABEL (demo->font_name), attrs->font_name); + + str = g_strdup_printf ("%.2f", attrs->font_size); + gtk_label_set_text (GTK_LABEL (demo->font_size), str); + g_free (str); + + gtk_label_set_text (GTK_LABEL (demo->is_underlined), attrs->is_underlined ? "Yes" : "No"); + + pixbuf = pgd_pixbuf_new_for_color (&(attrs->color)); + gtk_image_set_from_pixbuf (GTK_IMAGE (demo->text_color), pixbuf); + g_object_unref (pixbuf); + } + } +} + +static void +pgd_text_selection_changed (GtkTreeSelection *treeselection, + PgdTextDemo *demo) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) { + gpointer offset; + GtkTextIter begin_iter, end_iter; + + gtk_tree_model_get (model, &iter, + TEXT_OFFPTR_COLUMN, &offset, + -1); + + gtk_text_buffer_get_iter_at_offset (demo->buffer, &begin_iter, GPOINTER_TO_INT (offset)); + end_iter = begin_iter; + gtk_text_iter_forward_char (&end_iter); + gtk_text_buffer_select_range (demo->buffer, &begin_iter, &end_iter); + + pgd_text_set_text_attrs_for_offset (demo, GPOINTER_TO_INT (offset)); + } +} + +static void +pgd_text_buffer_selection_changed (GtkTextBuffer *buffer, + GParamSpec *pspec, + GtkWidget *textview) +{ + gtk_widget_set_has_tooltip (textview, gtk_text_buffer_get_has_selection (buffer)); +} + +static gboolean +pgd_text_view_query_tooltip (GtkTextView *textview, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + PgdTextDemo *demo) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (demo->treeview)); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + PopplerPage *page; + gchar *x1, *y1, *x2, *y2; + PopplerRectangle rect; + gchar *text; + + gtk_tree_model_get (model, &iter, + TEXT_X1_COLUMN, &x1, + TEXT_Y1_COLUMN, &y1, + TEXT_X2_COLUMN, &x2, + TEXT_Y2_COLUMN, &y2, + -1); + + rect.x1 = g_strtod (x1, NULL); + rect.y1 = g_strtod (y1, NULL); + rect.x2 = g_strtod (x2, NULL); + rect.y2 = g_strtod (y2, NULL); + + g_free (x1); + g_free (y1); + g_free (x2); + g_free (y2); + + page = page = poppler_document_get_page (demo->doc, demo->page); + text = poppler_page_get_selected_text (page, POPPLER_SELECTION_GLYPH, &rect); + gtk_tooltip_set_text (tooltip, text); + g_free (text); + g_object_unref (page); + } + +} + + +static void +pgd_text_page_selector_value_changed (GtkSpinButton *spinbutton, + PgdTextDemo *demo) +{ + demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1; +} + +GtkWidget * +pgd_text_create_widget (PopplerDocument *document) +{ + PgdTextDemo *demo; + GtkWidget *label; + GtkWidget *vbox, *vbox2; + GtkWidget *textinfo; + GtkWidget *hbox, *page_selector; + GtkWidget *button; + GtkWidget *swindow, *textview, *treeview; + GtkTreeSelection *selection; + GtkWidget *frame, *alignment, *table; + GtkWidget *hpaned; + GtkCellRenderer *renderer; + gchar *str; + gint n_pages; + gint row = 0; + + demo = g_new0 (PgdTextDemo, 1); + + demo->doc = g_object_ref (document); + + n_pages = poppler_document_get_n_pages (document); + + vbox = gtk_vbox_new (FALSE, 12); + vbox2 = gtk_vbox_new (FALSE, 12); + textinfo = gtk_label_new ("TextInfo"); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new ("Page:"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + + page_selector = gtk_spin_button_new_with_range (1, n_pages, 1); + g_signal_connect (G_OBJECT (page_selector), "value-changed", + G_CALLBACK (pgd_text_page_selector_value_changed), + (gpointer)demo); + gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0); + gtk_widget_show (page_selector); + + str = g_strdup_printf ("of %d", n_pages); + label = gtk_label_new (str); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_widget_show (label); + g_free (str); + + button = gtk_button_new_with_label ("Get Text"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_text_get_text), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + demo->timer_label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No text found</i>"); + g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL); + gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0); + gtk_widget_show (demo->timer_label); + + hpaned = gtk_hpaned_new (); + gtk_paned_set_position (GTK_PANED (hpaned), 300); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + demo->model = gtk_list_store_new (N_COLUMNS, + G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_POINTER); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model)); + demo->treeview = treeview; + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + TEXT_X1_COLUMN, "X1", + renderer, + "text", TEXT_X1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + TEXT_Y1_COLUMN, "Y1", + renderer, + "text", TEXT_Y1_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + TEXT_X2_COLUMN, "X2", + renderer, + "text", TEXT_X2_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + TEXT_Y2_COLUMN, "Y2", + renderer, + "text", TEXT_Y2_COLUMN, + NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + TEXT_OFFSET_COLUMN, "Offset", + renderer, + "text", TEXT_OFFSET_COLUMN, + NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + g_signal_connect (selection, "changed", + G_CALLBACK (pgd_text_selection_changed), + (gpointer) demo); + + gtk_container_add (GTK_CONTAINER (swindow), treeview); + gtk_widget_show (treeview); + + gtk_container_add (GTK_CONTAINER (vbox2), swindow); + gtk_widget_show (swindow); + + /* Text attributes */ + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Text Attributes</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_widget_show (alignment); + + table = gtk_table_new (4, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + demo->font_name = gtk_label_new (NULL); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Font Name:</b>", demo->font_name, &row); + demo->font_size = gtk_label_new (NULL); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Font Size:</b>", demo->font_size, &row); + demo->is_underlined = gtk_label_new (NULL); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Underlined:</b>", demo->is_underlined, &row); + demo->text_color = gtk_image_new (); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Color:</b>", demo->text_color, &row); + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); + + gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 12); + gtk_widget_show (frame); + gtk_paned_add1 (GTK_PANED (hpaned), vbox2); + gtk_widget_show (vbox2); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + + demo->buffer = gtk_text_buffer_new (NULL); + textview = gtk_text_view_new_with_buffer (demo->buffer); + g_signal_connect (textview, "query-tooltip", + G_CALLBACK (pgd_text_view_query_tooltip), + demo); + g_signal_connect (demo->buffer, "notify::has-selection", + G_CALLBACK (pgd_text_buffer_selection_changed), + textview); + + gtk_container_add (GTK_CONTAINER (swindow), textview); + gtk_widget_show (textview); + + gtk_paned_add2 (GTK_PANED (hpaned), swindow); + gtk_widget_show (swindow); + + gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show (hpaned); + + g_object_weak_ref (G_OBJECT (vbox), + (GWeakNotify)pgd_text_free, + demo); + + return vbox; +} diff --git a/glib/demo/text.h b/glib/demo/text.h new file mode 100644 index 0000000..87a1143 --- /dev/null +++ b/glib/demo/text.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _TEXT_H_ +#define _TEXT_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_text_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _TEXT_H_ */ diff --git a/glib/demo/transitions.c b/glib/demo/transitions.c new file mode 100644 index 0000000..b6188b5 --- /dev/null +++ b/glib/demo/transitions.c @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> + +#include "transitions.h" + +enum { + TRANSITIONS_PAGE_COLUMN, + TRANSITIONS_TYPE_COLUMN, + TRANSITIONS_ALIGNMENT_COLUMN, + TRANSITIONS_DIRECTION_COLUMN, + TRANSITIONS_DURATION_COLUMN, + TRANSITIONS_ANGLE_COLUMN, + TRANSITIONS_SCALE_COLUMN, + TRANSITIONS_RECTANGULAR_COLUMN, + N_COLUMNS +}; + +typedef struct { + PopplerDocument *doc; + + GtkWidget *treeview; + GtkWidget *progress; + + guint idle_id; +} PgdTransitionsDemo; + +static void +pgd_transitions_free (PgdTransitionsDemo *demo) +{ + if (!demo) + return; + + if (demo->idle_id > 0) { + g_source_remove (demo->idle_id); + demo->idle_id = 0; + } + + if (demo->doc) { + g_object_unref (demo->doc); + demo->doc = NULL; + } + + g_free (demo); +} + +static const gchar * +transition_type_to_string (PopplerPageTransitionType type) +{ + switch (type) { + case POPPLER_PAGE_TRANSITION_REPLACE: + return "Replace"; + case POPPLER_PAGE_TRANSITION_SPLIT: + return "Split"; + case POPPLER_PAGE_TRANSITION_BLINDS: + return "Blinds"; + case POPPLER_PAGE_TRANSITION_BOX: + return "Box"; + case POPPLER_PAGE_TRANSITION_WIPE: + return "Wipe"; + case POPPLER_PAGE_TRANSITION_DISSOLVE: + return "Dissolve"; + case POPPLER_PAGE_TRANSITION_GLITTER: + return "Glitter"; + case POPPLER_PAGE_TRANSITION_FLY: + return "Fly"; + case POPPLER_PAGE_TRANSITION_PUSH: + return "Push"; + case POPPLER_PAGE_TRANSITION_COVER: + return "Cover"; + case POPPLER_PAGE_TRANSITION_UNCOVER: + return "Uncover"; + case POPPLER_PAGE_TRANSITION_FADE: + return "Fade"; + } + + return "Unknown"; +} + +static const gchar * +transition_alignment_to_string (PopplerPageTransitionAlignment alignment) +{ + return alignment == POPPLER_PAGE_TRANSITION_HORIZONTAL ? "Horizontal" : "Vertical"; +} + +static const gchar * +transition_direction_to_string (PopplerPageTransitionDirection direction) +{ + return direction == POPPLER_PAGE_TRANSITION_INWARD ? "Inward" : "Outward"; +} + +static void +pgd_transitions_update_progress (PgdTransitionsDemo *demo, + gint n_pages, + gint scanned) +{ + gchar *str; + + str = g_strdup_printf ("Scanning transitions (%d%%)", + MIN (scanned * 100 / n_pages, 100)); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress), + MIN ((gdouble)scanned / n_pages, 1.0)); + g_free (str); +} + +static gboolean +pgd_transitions_fill_model (PgdTransitionsDemo *demo) +{ + GtkTreeModel *model; + gint i, n_pages; + + n_pages = poppler_document_get_n_pages (demo->doc); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview)); + g_object_ref (model); + + for (i = 0; i < n_pages; i++) { + PopplerPage *page; + PopplerPageTransition *transition; + + pgd_transitions_update_progress (demo, n_pages, i); + + while (gtk_events_pending ()) + gtk_main_iteration (); + + page = poppler_document_get_page (demo->doc, i); + if (!page) + continue; + + transition = poppler_page_get_transition (page); + if (transition) { + GtkTreeIter iter; + gchar *npage; + gchar *duration; + gchar *angle; + gchar *scale; + + npage = g_strdup_printf ("%d", i + 1); + duration = g_strdup_printf ("%d", transition->duration); + angle = g_strdup_printf ("%d", transition->angle); + scale = g_strdup_printf ("%.2f", transition->scale); + + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + TRANSITIONS_PAGE_COLUMN, npage, + TRANSITIONS_TYPE_COLUMN, + transition_type_to_string (transition->type), + TRANSITIONS_ALIGNMENT_COLUMN, + transition_alignment_to_string (transition->alignment), + TRANSITIONS_DIRECTION_COLUMN, + transition_direction_to_string (transition->direction), + TRANSITIONS_DURATION_COLUMN, duration, + TRANSITIONS_ANGLE_COLUMN, angle, + TRANSITIONS_SCALE_COLUMN, scale, + TRANSITIONS_RECTANGULAR_COLUMN, + transition->rectangular ? "Yes" : "No", + -1); + g_free (npage); + g_free (duration); + g_free (angle); + g_free (scale); + + poppler_page_transition_free (transition); + } + + g_object_unref (page); + } + + pgd_transitions_update_progress (demo, n_pages, n_pages); + g_object_unref (model); + + return FALSE; +} + +static void +pgd_transitions_scan_button_clicked (GtkButton *button, + PgdTransitionsDemo *demo) +{ + if (demo->idle_id > 0) + g_source_remove (demo->idle_id); + + demo->idle_id = g_idle_add ((GSourceFunc)pgd_transitions_fill_model, demo); +} + +static GtkWidget * +pgd_transitions_create_list (GtkTreeModel *model) +{ + GtkWidget *treeview; + GtkCellRenderer *renderer; + + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), + GTK_SELECTION_NONE); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 0, "Page", + renderer, + "text", TRANSITIONS_PAGE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 1, "Type", + renderer, + "text", TRANSITIONS_TYPE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 2, "Alignment", + renderer, + "text", TRANSITIONS_ALIGNMENT_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 3, "Direction", + renderer, + "text", TRANSITIONS_DIRECTION_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 4, "Duration", + renderer, + "text", TRANSITIONS_DURATION_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 5, "Angle", + renderer, + "text", TRANSITIONS_ANGLE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 6, "Scale", + renderer, + "text", TRANSITIONS_SCALE_COLUMN, + NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + 7, "Rectangular", + renderer, + "text", TRANSITIONS_RECTANGULAR_COLUMN, + NULL); + return treeview; +} + +GtkWidget * +pgd_transitions_create_widget (PopplerDocument *document) +{ + PgdTransitionsDemo *demo; + GtkWidget *vbox; + GtkListStore *model; + GtkWidget *swindow; + GtkWidget *hbox, *button; + + demo = g_new0 (PgdTransitionsDemo, 1); + + demo->doc = g_object_ref (document); + + vbox = gtk_vbox_new (FALSE, 12); + + hbox = gtk_hbox_new (FALSE, 6); + + demo->progress = gtk_progress_bar_new (); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress), + PANGO_ELLIPSIZE_END); + gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0); + gtk_widget_show (demo->progress); + + button = gtk_button_new_with_label ("Scan"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (pgd_transitions_scan_button_clicked), + (gpointer)demo); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6); + gtk_widget_show (hbox); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + model = gtk_list_store_new (N_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING); + demo->treeview = pgd_transitions_create_list (GTK_TREE_MODEL (model)); + g_object_unref (model); + + gtk_container_add (GTK_CONTAINER (swindow), demo->treeview); + gtk_widget_show (demo->treeview); + + gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); + gtk_widget_show (swindow); + + g_object_weak_ref (G_OBJECT (swindow), + (GWeakNotify)pgd_transitions_free, + (gpointer)demo); + + return vbox; +} diff --git a/glib/demo/transitions.h b/glib/demo/transitions.h new file mode 100644 index 0000000..11d8bd4 --- /dev/null +++ b/glib/demo/transitions.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _TRANSITIONS_H_ +#define _TRANSITIONS_H_ + +G_BEGIN_DECLS + +GtkWidget *pgd_transitions_create_widget (PopplerDocument *document); + +G_END_DECLS + +#endif /* _TRANSITIONS_H_ */ diff --git a/glib/demo/utils.c b/glib/demo/utils.c new file mode 100644 index 0000000..625596c --- /dev/null +++ b/glib/demo/utils.c @@ -0,0 +1,612 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <stdio.h> +#include <unistd.h> +#include <time.h> + +#include "utils.h" + +void +pgd_table_add_property_with_custom_widget (GtkTable *table, + const gchar *markup, + GtkWidget *widget, + gint *row) +{ + GtkWidget *label; + + label = gtk_label_new (NULL); + g_object_set (G_OBJECT (label), "xalign", 0.0, NULL); + gtk_label_set_markup (GTK_LABEL (label), markup); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, *row, *row + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (label); + + gtk_table_attach (GTK_TABLE (table), widget, 1, 2, *row, *row + 1, + GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); + gtk_widget_show (widget); + + *row += 1; +} + +void +pgd_table_add_property_with_value_widget (GtkTable *table, + const gchar *markup, + GtkWidget **value_widget, + const gchar *value, + gint *row) +{ + GtkWidget *label; + + *value_widget = label = gtk_label_new (value); + g_object_set (G_OBJECT (label), + "xalign", 0.0, + "selectable", TRUE, + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + pgd_table_add_property_with_custom_widget (table, markup, label, row); +} + +void +pgd_table_add_property (GtkTable *table, + const gchar *markup, + const gchar *value, + gint *row) +{ + GtkWidget *label; + + pgd_table_add_property_with_value_widget (table, markup, &label, value, row); +} + +GtkWidget * +pgd_action_view_new (PopplerDocument *document) +{ + GtkWidget *frame, *label; + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Action Properties</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + g_object_set_data (G_OBJECT (frame), "document", document); + + return frame; +} + +static void +pgd_action_view_add_destination (GtkWidget *action_view, + GtkTable *table, + PopplerDest *dest, + gboolean remote, + gint *row) +{ + PopplerDocument *document; + GEnumValue *enum_value; + gchar *str; + + pgd_table_add_property (table, "<b>Type:</b>", "Destination", row); + + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (POPPLER_TYPE_DEST_TYPE), dest->type); + pgd_table_add_property (table, "<b>Destination Type:</b>", enum_value->value_name, row); + + document = g_object_get_data (G_OBJECT (action_view), "document"); + + if (dest->type != POPPLER_DEST_NAMED) { + str = NULL; + + if (document && !remote) { + PopplerPage *poppler_page; + gchar *page_label; + + poppler_page = poppler_document_get_page (document, MAX (0, dest->page_num - 1)); + + g_object_get (G_OBJECT (poppler_page), + "label", &page_label, + NULL); + if (page_label) { + str = g_strdup_printf ("%d (%s)", dest->page_num, page_label); + g_free (page_label); + } + } + + if (!str) + str = g_strdup_printf ("%d", dest->page_num); + pgd_table_add_property (table, "<b>Page:</b>", str, row); + g_free (str); + + str = g_strdup_printf ("%.2f", dest->left); + pgd_table_add_property (table, "<b>Left:</b>", str, row); + g_free (str); + + str = g_strdup_printf ("%.2f", dest->right); + pgd_table_add_property (table, "<b>Right:</b>", str, row); + g_free (str); + + str = g_strdup_printf ("%.2f", dest->top); + pgd_table_add_property (table, "<b>Top:</b>", str, row); + g_free (str); + + str = g_strdup_printf ("%.2f", dest->bottom); + pgd_table_add_property (table, "<b>Bottom:</b>", str, row); + g_free (str); + + str = g_strdup_printf ("%.2f", dest->zoom); + pgd_table_add_property (table, "<b>Zoom:</b>", str, row); + g_free (str); + } else { + pgd_table_add_property (table, "<b>Named Dest:</b>", dest->named_dest, row); + + if (document && !remote) { + PopplerDest *new_dest; + + new_dest = poppler_document_find_dest (document, dest->named_dest); + if (new_dest) { + GtkWidget *new_table, *alignment; + gint new_row = 0; + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + + new_table = gtk_table_new (8, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (new_table), 6); + gtk_table_set_row_spacings (GTK_TABLE (new_table), 6); + gtk_table_attach_defaults (table, alignment, 0, 2, *row, *row + 1); + gtk_widget_show (alignment); + + pgd_action_view_add_destination (action_view, GTK_TABLE (new_table), + new_dest, FALSE, &new_row); + poppler_dest_free (new_dest); + + gtk_container_add (GTK_CONTAINER (alignment), new_table); + gtk_widget_show (new_table); + + *row += 1; + } + } + } +} + +static const gchar * +get_movie_op (PopplerActionMovieOperation op) +{ + switch (op) { + case POPPLER_ACTION_MOVIE_PLAY: + return "Play"; + case POPPLER_ACTION_MOVIE_PAUSE: + return "Pause"; + case POPPLER_ACTION_MOVIE_RESUME: + return "Resume"; + case POPPLER_ACTION_MOVIE_STOP: + return "Stop"; + } + return NULL; +} + +static void +free_tmp_file (GFile *tmp_file) +{ + + g_file_delete (tmp_file, NULL, NULL); + g_object_unref (tmp_file); +} + +static gboolean +save_helper (const gchar *buf, + gsize count, + gpointer data, + GError **error) +{ + gint fd = GPOINTER_TO_INT (data); + + return write (fd, buf, count) == count; +} + +static void +pgd_action_view_play_rendition (GtkWidget *button, + PopplerMedia *media) +{ + GFile *file = NULL; + gchar *uri; + + if (poppler_media_is_embedded (media)) { + gint fd; + gchar *tmp_filename = NULL; + + fd = g_file_open_tmp (NULL, &tmp_filename, NULL); + if (fd != -1) { + if (poppler_media_save_to_callback (media, save_helper, GINT_TO_POINTER (fd), NULL)) { + file = g_file_new_for_path (tmp_filename); + g_object_set_data_full (G_OBJECT (media), + "tmp-file", g_object_ref (file), + (GDestroyNotify)free_tmp_file); + } else { + g_free (tmp_filename); + } + close (fd); + } else if (tmp_filename) { + g_free (tmp_filename); + } + + } else { + const gchar *filename; + + filename = poppler_media_get_filename (media); + if (g_path_is_absolute (filename)) { + file = g_file_new_for_path (filename); + } else if (g_strrstr (filename, "://")) { + file = g_file_new_for_uri (filename); + } else { + gchar *cwd; + gchar *path; + + // FIXME: relative to doc uri, not cwd + cwd = g_get_current_dir (); + path = g_build_filename (cwd, filename, NULL); + g_free (cwd); + + file = g_file_new_for_path (path); + g_free (path); + } + } + + if (file) { + uri = g_file_get_uri (file); + g_object_unref (file); + if (uri) { + gtk_show_uri (gtk_widget_get_screen (button), + uri, GDK_CURRENT_TIME, NULL); + g_free (uri); + } + } +} + +static void +pgd_action_view_do_action_layer (GtkWidget *button, + GList *state_list) +{ + GList *l, *m; + + for (l = state_list; l; l = g_list_next (l)) { + PopplerActionLayer *action_layer = (PopplerActionLayer *)l->data; + + for (m = action_layer->layers; m; m = g_list_next (m)) { + PopplerLayer *layer = (PopplerLayer *)m->data; + + switch (action_layer->action) { + case POPPLER_ACTION_LAYER_ON: + poppler_layer_show (layer); + break; + case POPPLER_ACTION_LAYER_OFF: + poppler_layer_hide (layer); + break; + case POPPLER_ACTION_LAYER_TOGGLE: + if (poppler_layer_is_visible (layer)) + poppler_layer_hide (layer); + else + poppler_layer_show (layer); + break; + } + } + } +} + +void +pgd_action_view_set_action (GtkWidget *action_view, + PopplerAction *action) +{ + GtkWidget *alignment; + GtkWidget *table; + gint row = 0; + + alignment = gtk_bin_get_child (GTK_BIN (action_view)); + if (alignment) { + gtk_container_remove (GTK_CONTAINER (action_view), alignment); + } + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (action_view), alignment); + gtk_widget_show (alignment); + + if (!action) + return; + + table = gtk_table_new (10, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + pgd_table_add_property (GTK_TABLE (table), "<b>Title:</b>", action->any.title, &row); + + switch (action->type) { + case POPPLER_ACTION_UNKNOWN: + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Unknown", &row); + break; + case POPPLER_ACTION_NONE: + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "None", &row); + break; + case POPPLER_ACTION_GOTO_DEST: + pgd_action_view_add_destination (action_view, GTK_TABLE (table), action->goto_dest.dest, FALSE, &row); + break; + case POPPLER_ACTION_GOTO_REMOTE: + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Remote Destination", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", action->goto_remote.file_name, &row); + pgd_action_view_add_destination (action_view, GTK_TABLE (table), action->goto_remote.dest, TRUE, &row); + break; + case POPPLER_ACTION_LAUNCH: + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Launch", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", action->launch.file_name, &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Params:</b>", action->launch.params, &row); + break; + case POPPLER_ACTION_URI: + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "External URI", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>URI</b>", action->uri.uri, &row); + break; + case POPPLER_ACTION_NAMED: + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Named Action", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Name:</b>", action->named.named_dest, &row); + break; + case POPPLER_ACTION_MOVIE: { + GtkWidget *movie_view = pgd_movie_view_new (); + + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Movie", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Operation:</b>", get_movie_op (action->movie.operation), &row); + pgd_movie_view_set_movie (movie_view, action->movie.movie); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), "<b>Movie:</b>", movie_view, &row); + } + break; + case POPPLER_ACTION_RENDITION: { + gchar *text; + + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "Rendition", &row); + text = g_strdup_printf ("%d", action->rendition.op); + pgd_table_add_property (GTK_TABLE (table), "<b>Operation:</b>", text, &row); + g_free (text); + if (action->rendition.media) { + gboolean embedded = poppler_media_is_embedded (action->rendition.media); + GtkWidget *button; + + pgd_table_add_property (GTK_TABLE (table), "<b>Embedded:</b>", embedded ? "Yes": "No", &row); + if (embedded) { + const gchar *mime_type = poppler_media_get_mime_type (action->rendition.media); + pgd_table_add_property (GTK_TABLE (table), "<b>Mime type:</b>", + mime_type ? mime_type : "", + &row); + } else { + pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", + poppler_media_get_filename (action->rendition.media), + &row); + } + + button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY); + g_signal_connect (button, "clicked", + G_CALLBACK (pgd_action_view_play_rendition), + action->rendition.media); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, button, &row); + gtk_widget_show (button); + } + } + break; + case POPPLER_ACTION_OCG_STATE: { + GList *l; + GtkWidget *button; + + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "OCGState", &row); + + for (l = action->ocg_state.state_list; l; l = g_list_next (l)) { + PopplerActionLayer *action_layer = (PopplerActionLayer *)l->data; + gchar *text; + gint n_layers = g_list_length (action_layer->layers); + + switch (action_layer->action) { + case POPPLER_ACTION_LAYER_ON: + text = g_strdup_printf ("%d layers On", n_layers); + break; + case POPPLER_ACTION_LAYER_OFF: + text = g_strdup_printf ("%d layers Off", n_layers); + break; + case POPPLER_ACTION_LAYER_TOGGLE: + text = g_strdup_printf ("%d layers Toggle", n_layers); + break; + } + pgd_table_add_property (GTK_TABLE (table), "<b>Action:</b>", text, &row); + g_free (text); + } + + button = gtk_button_new_with_label ("Do action"); + g_signal_connect (button, "clicked", + G_CALLBACK (pgd_action_view_do_action_layer), + action->ocg_state.state_list); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, button, &row); + gtk_widget_show (button); + } + break; + case POPPLER_ACTION_JAVASCRIPT: { + GtkTextBuffer *buffer; + GtkWidget *textview; + GtkWidget *swindow; + + pgd_table_add_property (GTK_TABLE (table), "<b>Type:</b>", "JavaScript", &row); + + buffer = gtk_text_buffer_new (NULL); + if (action->javascript.script) + gtk_text_buffer_set_text (buffer, action->javascript.script, -1); + + textview = gtk_text_view_new_with_buffer (buffer); + gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE); + g_object_unref (buffer); + + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (swindow), textview); + gtk_widget_show (textview); + + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, swindow, &row); + gtk_widget_show (swindow); + } + break; + default: + g_assert_not_reached (); + } + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); +} + +gchar * +pgd_format_date (time_t utime) +{ + time_t time = (time_t) utime; + char s[256]; + const char *fmt_hack = "%c"; + size_t len; +#ifdef HAVE_LOCALTIME_R + struct tm t; + if (time == 0 || !localtime_r (&time, &t)) return NULL; + len = strftime (s, sizeof (s), fmt_hack, &t); +#else + struct tm *t; + if (time == 0 || !(t = localtime (&time)) ) return NULL; + len = strftime (s, sizeof (s), fmt_hack, t); +#endif + + if (len == 0 || s[0] == '\0') return NULL; + + return g_locale_to_utf8 (s, -1, NULL, NULL, NULL); +} + +GtkWidget * +pgd_movie_view_new (void) +{ + GtkWidget *frame, *label; + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), "<b>Movie Properties</b>"); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_widget_show (label); + + return frame; +} + +static void +pgd_movie_view_play_movie (GtkWidget *button, + PopplerMovie *movie) +{ + const gchar *filename; + GFile *file; + gchar *uri; + + filename = poppler_movie_get_filename (movie); + if (g_path_is_absolute (filename)) { + file = g_file_new_for_path (filename); + } else if (g_strrstr (filename, "://")) { + file = g_file_new_for_uri (filename); + } else { + gchar *cwd; + gchar *path; + + // FIXME: relative to doc uri, not cwd + cwd = g_get_current_dir (); + path = g_build_filename (cwd, filename, NULL); + g_free (cwd); + + file = g_file_new_for_path (path); + g_free (path); + } + + uri = g_file_get_uri (file); + g_object_unref (file); + if (uri) { + gtk_show_uri (gtk_widget_get_screen (button), + uri, GDK_CURRENT_TIME, NULL); + g_free (uri); + } +} + +void +pgd_movie_view_set_movie (GtkWidget *movie_view, + PopplerMovie *movie) +{ + GtkWidget *alignment; + GtkWidget *table; + GtkWidget *button; + gint row = 0; + + alignment = gtk_bin_get_child (GTK_BIN (movie_view)); + if (alignment) { + gtk_container_remove (GTK_CONTAINER (movie_view), alignment); + } + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5); + gtk_container_add (GTK_CONTAINER (movie_view), alignment); + gtk_widget_show (alignment); + + if (!movie) + return; + + table = gtk_table_new (10, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + + pgd_table_add_property (GTK_TABLE (table), "<b>Filename:</b>", poppler_movie_get_filename (movie), &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Need Poster:</b>", poppler_movie_need_poster (movie) ? "Yes" : "No", &row); + pgd_table_add_property (GTK_TABLE (table), "<b>Show Controls:</b>", poppler_movie_show_controls (movie) ? "Yes" : "No", &row); + + button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY); + g_signal_connect (button, "clicked", + G_CALLBACK (pgd_movie_view_play_movie), + movie); + pgd_table_add_property_with_custom_widget (GTK_TABLE (table), NULL, button, &row); + gtk_widget_show (button); + + gtk_container_add (GTK_CONTAINER (alignment), table); + gtk_widget_show (table); +} + +GdkPixbuf * +pgd_pixbuf_new_for_color (PopplerColor *poppler_color) +{ + GdkPixbuf *pixbuf; + gint num, x; + guchar *pixels; + + if (!poppler_color) + return NULL; + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, + FALSE, 8, + 64, 16); + + pixels = gdk_pixbuf_get_pixels (pixbuf); + num = gdk_pixbuf_get_width (pixbuf) * gdk_pixbuf_get_height (pixbuf); + + for (x = 0; x < num; x++) { + pixels[0] = poppler_color->red; + pixels[1] = poppler_color->green; + pixels[2] = poppler_color->blue; + pixels += 3; + } + + return pixbuf; +} diff --git a/glib/demo/utils.h b/glib/demo/utils.h new file mode 100644 index 0000000..452f3fa --- /dev/null +++ b/glib/demo/utils.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <gtk/gtk.h> +#include <poppler.h> + +#ifndef _UTILS_H_ +#define _UTILS_H_ + +G_BEGIN_DECLS + +void pgd_table_add_property (GtkTable *table, + const gchar *markup, + const gchar *value, + gint *row); +void pgd_table_add_property_with_value_widget (GtkTable *table, + const gchar *markup, + GtkWidget **value_widget, + const gchar *value, + gint *row); +void pgd_table_add_property_with_custom_widget (GtkTable *table, + const gchar *markup, + GtkWidget *widget, + gint *row); +GtkWidget *pgd_action_view_new (PopplerDocument *document); +void pgd_action_view_set_action (GtkWidget *action_view, + PopplerAction *action); +gchar *pgd_format_date (time_t utime); +GtkWidget *pgd_movie_view_new (void); +void pgd_movie_view_set_movie (GtkWidget *movie_view, + PopplerMovie *movie); +GdkPixbuf *pgd_pixbuf_new_for_color (PopplerColor *poppler_color); + +G_END_DECLS + +#endif /* _UTILS_H_ */ diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc new file mode 100644 index 0000000..384530f --- /dev/null +++ b/glib/poppler-action.cc @@ -0,0 +1,691 @@ +/* poppler-action.cc: glib wrapper for poppler -*- c-basic-offset: 8 -*- + * Copyright (C) 2005, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler.h" +#include "poppler-private.h" + +/** + * SECTION:poppler-action + * @short_description: Action links + * @title: PopplerAction + */ + +POPPLER_DEFINE_BOXED_TYPE (PopplerDest, poppler_dest, poppler_dest_copy, poppler_dest_free) + +/** + * poppler_dest_copy: + * @dest: a #PopplerDest + * + * Copies @dest, creating an identical #PopplerDest. + * + * Return value: a new destination identical to @dest + **/ +PopplerDest * +poppler_dest_copy (PopplerDest *dest) +{ + PopplerDest *new_dest; + + new_dest = g_slice_dup (PopplerDest, dest); + + if (dest->named_dest) + new_dest->named_dest = g_strdup (dest->named_dest); + + return new_dest; +} + + +/** + * poppler_dest_free: + * @dest: a #PopplerDest + * + * Frees @dest + **/ +void +poppler_dest_free (PopplerDest *dest) +{ + if (!dest) + return; + + if (dest->named_dest) + g_free (dest->named_dest); + + g_slice_free (PopplerDest, dest); +} + +static void +poppler_action_layer_free (PopplerActionLayer *action_layer) +{ + if (!action_layer) + return; + + if (action_layer->layers) { + g_list_foreach (action_layer->layers, (GFunc)g_object_unref, NULL); + g_list_free (action_layer->layers); + action_layer->layers = NULL; + } + + g_slice_free (PopplerActionLayer, action_layer); +} + +static PopplerActionLayer * +poppler_action_layer_copy (PopplerActionLayer *action_layer) +{ + PopplerActionLayer *retval = g_slice_dup (PopplerActionLayer, action_layer); + + retval->layers = g_list_copy (action_layer->layers); + g_list_foreach (action_layer->layers, (GFunc)g_object_ref, NULL); + + return retval; +} + +POPPLER_DEFINE_BOXED_TYPE (PopplerAction, poppler_action, poppler_action_copy, poppler_action_free) + +/** + * poppler_action_free: + * @action: a #PopplerAction + * + * Frees @action + **/ +void +poppler_action_free (PopplerAction *action) +{ + if (action == NULL) + return; + + /* Action specific stuff */ + switch (action->type) { + case POPPLER_ACTION_GOTO_DEST: + poppler_dest_free (action->goto_dest.dest); + break; + case POPPLER_ACTION_GOTO_REMOTE: + poppler_dest_free (action->goto_remote.dest); + g_free (action->goto_remote.file_name); + break; + case POPPLER_ACTION_URI: + g_free (action->uri.uri); + break; + case POPPLER_ACTION_LAUNCH: + g_free (action->launch.file_name); + g_free (action->launch.params); + break; + case POPPLER_ACTION_NAMED: + g_free (action->named.named_dest); + break; + case POPPLER_ACTION_MOVIE: + if (action->movie.movie) + g_object_unref (action->movie.movie); + break; + case POPPLER_ACTION_RENDITION: + if (action->rendition.media) + g_object_unref (action->rendition.media); + break; + case POPPLER_ACTION_OCG_STATE: + if (action->ocg_state.state_list) { + g_list_foreach (action->ocg_state.state_list, (GFunc)poppler_action_layer_free, NULL); + g_list_free (action->ocg_state.state_list); + } + break; + case POPPLER_ACTION_JAVASCRIPT: + if (action->javascript.script) + g_free (action->javascript.script); + break; + default: + break; + } + + g_free (action->any.title); + g_slice_free (PopplerAction, action); +} + +/** + * poppler_action_copy: + * @action: a #PopplerAction + * + * Copies @action, creating an identical #PopplerAction. + * + * Return value: a new action identical to @action + **/ +PopplerAction * +poppler_action_copy (PopplerAction *action) +{ + PopplerAction *new_action; + + g_return_val_if_fail (action != NULL, NULL); + + /* Do a straight copy of the memory */ + new_action = g_slice_dup (PopplerAction, action); + + if (action->any.title != NULL) + new_action->any.title = g_strdup (action->any.title); + + switch (action->type) { + case POPPLER_ACTION_GOTO_DEST: + new_action->goto_dest.dest = poppler_dest_copy (action->goto_dest.dest); + break; + case POPPLER_ACTION_GOTO_REMOTE: + new_action->goto_remote.dest = poppler_dest_copy (action->goto_remote.dest); + if (action->goto_remote.file_name) + new_action->goto_remote.file_name = g_strdup (action->goto_remote.file_name); + break; + case POPPLER_ACTION_URI: + if (action->uri.uri) + new_action->uri.uri = g_strdup (action->uri.uri); + break; + case POPPLER_ACTION_LAUNCH: + if (action->launch.file_name) + new_action->launch.file_name = g_strdup (action->launch.file_name); + if (action->launch.params) + new_action->launch.params = g_strdup (action->launch.params); + break; + case POPPLER_ACTION_NAMED: + if (action->named.named_dest) + new_action->named.named_dest = g_strdup (action->named.named_dest); + break; + case POPPLER_ACTION_MOVIE: + if (action->movie.movie) + new_action->movie.movie = (PopplerMovie *)g_object_ref (action->movie.movie); + break; + case POPPLER_ACTION_RENDITION: + if (action->rendition.media) + new_action->rendition.media = (PopplerMedia *)g_object_ref (action->rendition.media); + break; + case POPPLER_ACTION_OCG_STATE: + if (action->ocg_state.state_list) { + GList *l; + GList *new_list = NULL; + + for (l = action->ocg_state.state_list; l; l = g_list_next (l)) { + PopplerActionLayer *alayer = (PopplerActionLayer *)l->data; + new_list = g_list_prepend (new_list, poppler_action_layer_copy (alayer)); + } + + new_action->ocg_state.state_list = g_list_reverse (new_list); + } + + break; + case POPPLER_ACTION_JAVASCRIPT: + if (action->javascript.script) + new_action->javascript.script = g_strdup (action->javascript.script); + break; + default: + break; + } + + return new_action; +} + +PopplerDest * +dest_new_goto (PopplerDocument *document, + LinkDest *link_dest) +{ + PopplerDest *dest; + + dest = g_slice_new0 (PopplerDest); + + if (link_dest == NULL) { + dest->type = POPPLER_DEST_UNKNOWN; + return dest; + } + + switch (link_dest->getKind ()) { + case destXYZ: + dest->type = POPPLER_DEST_XYZ; + break; + case destFit: + dest->type = POPPLER_DEST_FIT; + break; + case destFitH: + dest->type = POPPLER_DEST_FITH; + break; + case destFitV: + dest->type = POPPLER_DEST_FITV; + break; + case destFitR: + dest->type = POPPLER_DEST_FITR; + break; + case destFitB: + dest->type = POPPLER_DEST_FITB; + break; + case destFitBH: + dest->type = POPPLER_DEST_FITBH; + break; + case destFitBV: + dest->type = POPPLER_DEST_FITBV; + break; + default: + dest->type = POPPLER_DEST_UNKNOWN; + } + + if (link_dest->isPageRef ()) { + if (document) { + Ref page_ref = link_dest->getPageRef (); + dest->page_num = document->doc->findPage (page_ref.num, page_ref.gen); + } else { + /* FIXME: We don't keep areound the page_ref for the + * remote doc, so we can't look this up. Guess that + * it's 0*/ + dest->page_num = 0; + } + } else { + dest->page_num = link_dest->getPageNum (); + } + + dest->left = link_dest->getLeft (); + dest->bottom = link_dest->getBottom (); + dest->right = link_dest->getRight (); + dest->top = link_dest->getTop (); + dest->zoom = link_dest->getZoom (); + dest->change_left = link_dest->getChangeLeft (); + dest->change_top = link_dest->getChangeTop (); + dest->change_zoom = link_dest->getChangeZoom (); + + if (document && dest->page_num > 0) { + PopplerPage *page; + + page = poppler_document_get_page (document, dest->page_num - 1); + + if (page) { + dest->left -= page->page->getCropBox ()->x1; + dest->bottom -= page->page->getCropBox ()->x1; + dest->right -= page->page->getCropBox ()->y1; + dest->top -= page->page->getCropBox ()->y1; + + g_object_unref (page); + } else { + g_warning ("Invalid page %d in Link Destination\n", dest->page_num); + dest->page_num = 0; + } + } + + return dest; +} + +static PopplerDest * +dest_new_named (GooString *named_dest) +{ + PopplerDest *dest; + + dest = g_slice_new0 (PopplerDest); + + if (named_dest == NULL) { + dest->type = POPPLER_DEST_UNKNOWN; + return dest; + } + + dest->type = POPPLER_DEST_NAMED; + dest->named_dest = g_strdup (named_dest->getCString ()); + + return dest; +} + +static void +build_goto_dest (PopplerDocument *document, + PopplerAction *action, + LinkGoTo *link) +{ + LinkDest *link_dest; + GooString *named_dest; + + /* Return if it isn't OK */ + if (! link->isOk ()) { + action->goto_dest.dest = dest_new_goto (NULL, NULL); + return; + } + + link_dest = link->getDest (); + named_dest = link->getNamedDest (); + + if (link_dest != NULL) { + action->goto_dest.dest = dest_new_goto (document, link_dest); + } else if (named_dest != NULL) { + action->goto_dest.dest = dest_new_named (named_dest); + } else { + action->goto_dest.dest = dest_new_goto (document, NULL); + } +} + +static void +build_goto_remote (PopplerAction *action, + LinkGoToR *link) +{ + LinkDest *link_dest; + GooString *named_dest; + + /* Return if it isn't OK */ + if (! link->isOk ()) { + action->goto_remote.dest = dest_new_goto (NULL, NULL); + return; + } + + action->goto_remote.file_name = _poppler_goo_string_to_utf8 (link->getFileName()); + + link_dest = link->getDest (); + named_dest = link->getNamedDest (); + + if (link_dest != NULL) { + action->goto_remote.dest = dest_new_goto (NULL, link_dest); + } else if (named_dest != NULL) { + action->goto_remote.dest = dest_new_named (named_dest); + } else { + action->goto_remote.dest = dest_new_goto (NULL, NULL); + } +} + +static void +build_launch (PopplerAction *action, + LinkLaunch *link) +{ + if (link->getFileName()) { + action->launch.file_name = g_strdup (link->getFileName()->getCString ()); + } + if (link->getParams()) { + action->launch.params = g_strdup (link->getParams()->getCString ()); + } +} + +static void +build_uri (PopplerAction *action, + LinkURI *link) +{ + gchar *uri; + + uri = link->getURI()->getCString (); + if (uri != NULL) + action->uri.uri = g_strdup (uri); +} + +static void +build_named (PopplerAction *action, + LinkNamed *link) +{ + gchar *name; + + name = link->getName ()->getCString (); + if (name != NULL) + action->named.named_dest = g_strdup (name); +} + +static AnnotMovie * +find_annot_movie_for_action (PopplerDocument *document, + LinkMovie *link) +{ + AnnotMovie *annot = NULL; + XRef *xref = document->doc->getXRef (); + Object annotObj; + + if (link->hasAnnotRef ()) { + Ref *ref = link->getAnnotRef (); + + xref->fetch (ref->num, ref->gen, &annotObj); + } else if (link->hasAnnotTitle ()) { + Object annots; + GooString *title = link->getAnnotTitle (); + int i; + + for (i = 1; i <= document->doc->getNumPages (); ++i) { + Page *p = document->doc->getPage (i); + if (!p) continue; + + if (p->getAnnots (&annots)->isArray ()) { + int j; + GBool found = gFalse; + + for (j = 0; j < annots.arrayGetLength () && !found; ++j) { + if (annots.arrayGet(j, &annotObj)->isDict()) { + Object obj1; + + if (!annotObj.dictLookup ("Subtype", &obj1)->isName ("Movie")) { + obj1.free (); + continue; + } + obj1.free (); + + if (annotObj.dictLookup ("T", &obj1)->isString()) { + GooString *t = obj1.getString (); + + if (title->cmp(t) == 0) + found = gTrue; + } + obj1.free (); + } + if (!found) + annotObj.free (); + } + if (found) { + annots.free (); + break; + } else { + annotObj.free (); + } + } + annots.free (); + } + } + + if (annotObj.isDict ()) { + Object tmp; + + annot = new AnnotMovie (document->doc, annotObj.getDict(), &tmp); + if (!annot->isOk ()) { + delete annot; + annot = NULL; + } + } + annotObj.free (); + + return annot; +} + +static void +build_movie (PopplerDocument *document, + PopplerAction *action, + LinkMovie *link) +{ + AnnotMovie *annot; + + switch (link->getOperation ()) { + case LinkMovie::operationTypePause: + action->movie.operation = POPPLER_ACTION_MOVIE_PAUSE; + break; + case LinkMovie::operationTypeResume: + action->movie.operation = POPPLER_ACTION_MOVIE_RESUME; + break; + case LinkMovie::operationTypeStop: + action->movie.operation = POPPLER_ACTION_MOVIE_STOP; + break; + default: + case LinkMovie::operationTypePlay: + action->movie.operation = POPPLER_ACTION_MOVIE_PLAY; + break; + } + + annot = find_annot_movie_for_action (document, link); + if (annot) { + action->movie.movie = _poppler_movie_new (annot->getMovie()); + delete annot; + } +} + +static void +build_javascript (PopplerAction *action, + LinkJavaScript *link) +{ + GooString *script; + + script = link->getScript(); + if (script) + action->javascript.script = _poppler_goo_string_to_utf8 (script); + +} + +static void +build_rendition (PopplerAction *action, + LinkRendition *link) +{ + action->rendition.op = link->getOperation(); + if (link->hasRenditionObject()) + action->rendition.media = _poppler_media_new (link->getMedia()); + // TODO: annotation reference +} + +static PopplerLayer * +get_layer_for_ref (PopplerDocument *document, + GList *layers, + Ref *ref, + gboolean preserve_rb) +{ + GList *l; + + for (l = layers; l; l = g_list_next (l)) { + Layer *layer = (Layer *)l->data; + + if (layer->oc) { + Ref ocgRef = layer->oc->getRef(); + + if (ref->num == ocgRef.num && ref->gen == ocgRef.gen) { + GList *rb_group = NULL; + + if (preserve_rb) + rb_group = _poppler_document_get_layer_rbgroup (document, layer); + return _poppler_layer_new (document, layer, rb_group); + } + } + + if (layer->kids) { + PopplerLayer *retval = get_layer_for_ref (document, layer->kids, ref, preserve_rb); + if (retval) + return retval; + } + } + + return NULL; +} + +static void +build_ocg_state (PopplerDocument *document, + PopplerAction *action, + LinkOCGState *ocg_state) +{ + GooList *st_list = ocg_state->getStateList(); + GBool preserve_rb = ocg_state->getPreserveRB(); + gint i, j; + GList *layer_state = NULL; + + if (!document->layers) { + if (!_poppler_document_get_layers (document)) + return; + } + + for (i = 0; i < st_list->getLength(); ++i) { + LinkOCGState::StateList *list = (LinkOCGState::StateList *)st_list->get(i); + PopplerActionLayer *action_layer = g_new0 (PopplerActionLayer, 1); + + switch (list->st) { + case LinkOCGState::On: + action_layer->action = POPPLER_ACTION_LAYER_ON; + break; + case LinkOCGState::Off: + action_layer->action = POPPLER_ACTION_LAYER_OFF; + break; + case LinkOCGState::Toggle: + action_layer->action = POPPLER_ACTION_LAYER_TOGGLE; + break; + } + + for (j = 0; j < list->list->getLength(); ++j) { + Ref *ref = (Ref *)list->list->get(j); + PopplerLayer *layer = get_layer_for_ref (document, document->layers, ref, preserve_rb); + + action_layer->layers = g_list_prepend (action_layer->layers, layer); + } + + layer_state = g_list_prepend (layer_state, action_layer); + } + + action->ocg_state.state_list = g_list_reverse (layer_state); +} + +PopplerAction * +_poppler_action_new (PopplerDocument *document, + LinkAction *link, + const gchar *title) +{ + PopplerAction *action; + + action = g_slice_new0 (PopplerAction); + + if (title) + action->any.title = g_strdup (title); + + if (link == NULL) { + action->type = POPPLER_ACTION_NONE; + return action; + } + + switch (link->getKind ()) { + case actionGoTo: + action->type = POPPLER_ACTION_GOTO_DEST; + build_goto_dest (document, action, dynamic_cast <LinkGoTo *> (link)); + break; + case actionGoToR: + action->type = POPPLER_ACTION_GOTO_REMOTE; + build_goto_remote (action, dynamic_cast <LinkGoToR *> (link)); + break; + case actionLaunch: + action->type = POPPLER_ACTION_LAUNCH; + build_launch (action, dynamic_cast <LinkLaunch *> (link)); + break; + case actionURI: + action->type = POPPLER_ACTION_URI; + build_uri (action, dynamic_cast <LinkURI *> (link)); + break; + case actionNamed: + action->type = POPPLER_ACTION_NAMED; + build_named (action, dynamic_cast <LinkNamed *> (link)); + break; + case actionMovie: + action->type = POPPLER_ACTION_MOVIE; + build_movie (document, action, dynamic_cast<LinkMovie*> (link)); + break; + case actionRendition: + action->type = POPPLER_ACTION_RENDITION; + build_rendition (action, dynamic_cast<LinkRendition*> (link)); + break; + case actionOCGState: + action->type = POPPLER_ACTION_OCG_STATE; + build_ocg_state (document, action, dynamic_cast<LinkOCGState*> (link)); + break; + case actionJavaScript: + action->type = POPPLER_ACTION_JAVASCRIPT; + build_javascript (action, dynamic_cast<LinkJavaScript*> (link)); + break; + case actionUnknown: + default: + action->type = POPPLER_ACTION_UNKNOWN; + break; + } + + return action; +} + +PopplerDest * +_poppler_dest_new_goto (PopplerDocument *document, + LinkDest *link_dest) +{ + return dest_new_goto (document, link_dest); +} diff --git a/glib/poppler-action.h b/glib/poppler-action.h new file mode 100644 index 0000000..2a5d7f8 --- /dev/null +++ b/glib/poppler-action.h @@ -0,0 +1,316 @@ +/* poppler-action.h: glib interface to poppler + * Copyright (C) 2004, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_ACTION_H__ +#define __POPPLER_ACTION_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +/** + * PopplerActionType: + * @POPPLER_ACTION_UNKNOWN: unknown action + * @POPPLER_ACTION_NONE: no action specified + * @POPPLER_ACTION_GOTO_DEST: go to destination + * @POPPLER_ACTION_GOTO_REMOTE: go to destination in another document + * @POPPLER_ACTION_LAUNCH: launch app (or open document + * @POPPLER_ACTION_URI: URI + * @POPPLER_ACTION_NAMED: predefined action + * @POPPLER_ACTION_MOVIE: play movies. Since 0.14 + * @POPPLER_ACTION_RENDITION: play multimedia content. Since 0.14 + * @POPPLER_ACTION_OCG_STATE: state of layer. Since 0.14 + * @POPPLER_ACTION_JAVASCRIPT: Javascript. Since 0.18 + * + * Action types + */ +typedef enum +{ + POPPLER_ACTION_UNKNOWN, /* unknown action */ + POPPLER_ACTION_NONE, /* no action specified */ + POPPLER_ACTION_GOTO_DEST, /* go to destination */ + POPPLER_ACTION_GOTO_REMOTE, /* go to destination in new file */ + POPPLER_ACTION_LAUNCH, /* launch app (or open document) */ + POPPLER_ACTION_URI, /* URI */ + POPPLER_ACTION_NAMED, /* named action*/ + POPPLER_ACTION_MOVIE, /* movie action */ + POPPLER_ACTION_RENDITION, /* rendition action */ + POPPLER_ACTION_OCG_STATE, /* Set-OCG-State action */ + POPPLER_ACTION_JAVASCRIPT /* Javascript action */ +} PopplerActionType; + +/** + * PopplerDestType: + * @POPPLER_DEST_UNKNOWN: unknown destination + * @POPPLER_DEST_XYZ: go to page with coordinates (left, top) + * positioned at the upper-left corner of the window and the contents of + * the page magnified by the factor zoom + * @POPPLER_DEST_FIT: go to page with its contents magnified just + * enough to fit the entire page within the window both horizontally and + * vertically + * @POPPLER_DEST_FITH: go to page with the vertical coordinate top + * positioned at the top edge of the window and the contents of the page + * magnified just enough to fit the entire width of the page within the window + * @POPPLER_DEST_FITV: go to page with the horizontal coordinate + * left positioned at the left edge of the window and the contents of the + * page magnified just enough to fit the entire height of the page within the window + * @POPPLER_DEST_FITR: go to page with its contents magnified just + * enough to fit the rectangle specified by the coordinates left, bottom, + * right, and top entirely within the window both horizontally and vertically + * @POPPLER_DEST_FITB: go to page with its contents magnified just enough to fit + * its bounding box entirely within the window both horizontally and vertically + * @POPPLER_DEST_FITBH: go to page with the vertical + * coordinate top positioned at the top edge of the window and the + * contents of the page magnified just enough to fit the entire width of its + * bounding box within the window + * @POPPLER_DEST_FITBV: go to page with the horizontal + * coordinate left positioned at the left edge of the window and the + * contents of the page magnified just enough to fit the entire height of its + * bounding box within the window + * @POPPLER_DEST_NAMED: got to page specified by a name. See poppler_document_find_dest() + * + * Destination types + */ +typedef enum +{ + POPPLER_DEST_UNKNOWN, + POPPLER_DEST_XYZ, + POPPLER_DEST_FIT, + POPPLER_DEST_FITH, + POPPLER_DEST_FITV, + POPPLER_DEST_FITR, + POPPLER_DEST_FITB, + POPPLER_DEST_FITBH, + POPPLER_DEST_FITBV, + POPPLER_DEST_NAMED +} PopplerDestType; + +/** + * PopplerActionMovieOperation: + * @POPPLER_ACTION_MOVIE_PLAY: play movie + * @POPPLER_ACTION_MOVIE_PAUSE: pause playing movie + * @POPPLER_ACTION_MOVIE_RESUME: resume paused movie + * @POPPLER_ACTION_MOVIE_STOP: stop playing movie + * + * Movie operations + * + * Since: 0.14 + */ +typedef enum +{ + POPPLER_ACTION_MOVIE_PLAY, + POPPLER_ACTION_MOVIE_PAUSE, + POPPLER_ACTION_MOVIE_RESUME, + POPPLER_ACTION_MOVIE_STOP +} PopplerActionMovieOperation; + +/** + * PopplerActionLayerAction: + * @POPPLER_ACTION_LAYER_ON: set layer visibility on + * @POPPLER_ACTION_LAYER_OFF: set layer visibility off + * @POPPLER_ACTION_LAYER_TOGGLE: reverse the layer visibility state + * + * Layer actions + * + * Since: 0.14 + */ +typedef enum +{ + POPPLER_ACTION_LAYER_ON, + POPPLER_ACTION_LAYER_OFF, + POPPLER_ACTION_LAYER_TOGGLE +} PopplerActionLayerAction; + +/* Define the PopplerAction types */ +typedef struct _PopplerActionAny PopplerActionAny; +typedef struct _PopplerActionGotoDest PopplerActionGotoDest; +typedef struct _PopplerActionGotoRemote PopplerActionGotoRemote; +typedef struct _PopplerActionLaunch PopplerActionLaunch; +typedef struct _PopplerActionUri PopplerActionUri; +typedef struct _PopplerActionNamed PopplerActionNamed; +typedef struct _PopplerActionMovie PopplerActionMovie; +typedef struct _PopplerActionRendition PopplerActionRendition; +typedef struct _PopplerActionOCGState PopplerActionOCGState; +typedef struct _PopplerActionJavascript PopplerActionJavascript; + +/** + * PopplerDest: + * @type: type of destination + * @page_num: page number + * @left: left coordinate + * @bottom: bottom coordinate + * @right: right coordinate + * @top: top coordinate + * @zoom: scale factor + * @named_dest: name of the destination (#POPPLER_DEST_NAMED only) + * @change_left: whether left coordinate should be changed + * @change_top: whether top coordinate should be changed + * @change_zoom: whether scale factor should be changed + * + * Data structure for holding a destination + */ +struct _PopplerDest +{ + PopplerDestType type; + + int page_num; + double left; + double bottom; + double right; + double top; + double zoom; + gchar *named_dest; + guint change_left : 1; + guint change_top : 1; + guint change_zoom : 1; +}; + +/** + * PopplerActionLayer: + * @action: a #PopplerActionLayerAction + * @layers: list of #PopplerLayer<!-- -->s + * + * Action to perform over a list of layers + */ +struct _PopplerActionLayer +{ + PopplerActionLayerAction action; + GList *layers; +}; + +struct _PopplerActionAny +{ + PopplerActionType type; + gchar *title; +}; + +struct _PopplerActionGotoDest +{ + PopplerActionType type; + gchar *title; + + PopplerDest *dest; +}; + +struct _PopplerActionGotoRemote +{ + PopplerActionType type; + gchar *title; + + gchar *file_name; + PopplerDest *dest; +}; + +struct _PopplerActionLaunch +{ + PopplerActionType type; + gchar *title; + + gchar *file_name; + gchar *params; +}; + +struct _PopplerActionUri +{ + PopplerActionType type; + gchar *title; + + char *uri; +}; + +struct _PopplerActionNamed +{ + PopplerActionType type; + gchar *title; + + gchar *named_dest; +}; + +struct _PopplerActionMovie +{ + PopplerActionType type; + gchar *title; + + PopplerActionMovieOperation operation; + PopplerMovie *movie; +}; + +struct _PopplerActionRendition +{ + PopplerActionType type; + gchar *title; + + gint op; + PopplerMedia *media; +}; + +struct _PopplerActionOCGState +{ + PopplerActionType type; + gchar *title; + + GList *state_list; +}; + +struct _PopplerActionJavascript +{ + PopplerActionType type; + gchar *title; + + gchar *script; +}; + +/** + * PopplerAction: + * + * A data structure for holding actions + */ +union _PopplerAction +{ + PopplerActionType type; + PopplerActionAny any; + PopplerActionGotoDest goto_dest; + PopplerActionGotoRemote goto_remote; + PopplerActionLaunch launch; + PopplerActionUri uri; + PopplerActionNamed named; + PopplerActionMovie movie; + PopplerActionRendition rendition; + PopplerActionOCGState ocg_state; + PopplerActionJavascript javascript; +}; + +#define POPPLER_TYPE_ACTION (poppler_action_get_type ()) +#define POPPLER_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ACTION, PopplerAction)) + +GType poppler_action_get_type (void) G_GNUC_CONST; + +void poppler_action_free (PopplerAction *action); +PopplerAction *poppler_action_copy (PopplerAction *action); + + +#define POPPLER_TYPE_DEST (poppler_dest_get_type ()) +GType poppler_dest_get_type (void) G_GNUC_CONST; + +void poppler_dest_free (PopplerDest *dest); +PopplerDest *poppler_dest_copy (PopplerDest *dest); + +G_END_DECLS + +#endif /* __POPPLER_GLIB_H__ */ diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc new file mode 100644 index 0000000..2a544f1 --- /dev/null +++ b/glib/poppler-annot.cc @@ -0,0 +1,1373 @@ +/* poppler-annot.cc: glib interface to poppler + * + * Copyright (C) 2007 Inigo Martinez <inigomartinez@gmail.com> + * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include "poppler.h" +#include "poppler-private.h" + +/** + * SECTION:poppler-annot + * @short_description: Annotations + * @title: PopplerAnnot + */ + +typedef struct _PopplerAnnotClass PopplerAnnotClass; +typedef struct _PopplerAnnotMarkupClass PopplerAnnotMarkupClass; +typedef struct _PopplerAnnotFreeTextClass PopplerAnnotFreeTextClass; +typedef struct _PopplerAnnotTextClass PopplerAnnotTextClass; +typedef struct _PopplerAnnotFileAttachmentClass PopplerAnnotFileAttachmentClass; +typedef struct _PopplerAnnotMovieClass PopplerAnnotMovieClass; +typedef struct _PopplerAnnotScreenClass PopplerAnnotScreenClass; + +struct _PopplerAnnotClass +{ + GObjectClass parent_class; +}; + +struct _PopplerAnnotMarkup +{ + PopplerAnnot parent_instance; +}; + +struct _PopplerAnnotMarkupClass +{ + PopplerAnnotClass parent_class; +}; + +struct _PopplerAnnotText +{ + PopplerAnnotMarkup parent_instance; +}; + +struct _PopplerAnnotTextClass +{ + PopplerAnnotMarkupClass parent_class; +}; + +struct _PopplerAnnotFreeText +{ + PopplerAnnotMarkup parent_instance; +}; + +struct _PopplerAnnotFreeTextClass +{ + PopplerAnnotMarkupClass parent_class; +}; + +struct _PopplerAnnotFileAttachment +{ + PopplerAnnotMarkup parent_instance; +}; + +struct _PopplerAnnotFileAttachmentClass +{ + PopplerAnnotMarkupClass parent_class; +}; + +struct _PopplerAnnotMovie +{ + PopplerAnnot parent_instance; + + PopplerMovie *movie; +}; + +struct _PopplerAnnotMovieClass +{ + PopplerAnnotClass parent_class; +}; + +struct _PopplerAnnotScreen +{ + PopplerAnnot parent_instance; + + PopplerAction *action; +}; + +struct _PopplerAnnotScreenClass +{ + PopplerAnnotClass parent_class; +}; + + +G_DEFINE_TYPE (PopplerAnnot, poppler_annot, G_TYPE_OBJECT) +G_DEFINE_TYPE (PopplerAnnotMarkup, poppler_annot_markup, POPPLER_TYPE_ANNOT) +G_DEFINE_TYPE (PopplerAnnotText, poppler_annot_text, POPPLER_TYPE_ANNOT_MARKUP) +G_DEFINE_TYPE (PopplerAnnotFreeText, poppler_annot_free_text, POPPLER_TYPE_ANNOT_MARKUP) +G_DEFINE_TYPE (PopplerAnnotFileAttachment, poppler_annot_file_attachment, POPPLER_TYPE_ANNOT_MARKUP) +G_DEFINE_TYPE (PopplerAnnotMovie, poppler_annot_movie, POPPLER_TYPE_ANNOT) +G_DEFINE_TYPE (PopplerAnnotScreen, poppler_annot_screen, POPPLER_TYPE_ANNOT) + +static void +poppler_annot_finalize (GObject *object) +{ + PopplerAnnot *poppler_annot = POPPLER_ANNOT (object); + + poppler_annot->annot = NULL; + + G_OBJECT_CLASS (poppler_annot_parent_class)->finalize (object); +} + +static void +poppler_annot_init (PopplerAnnot *poppler_annot) +{ +} + +static void +poppler_annot_class_init (PopplerAnnotClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_annot_finalize; +} + +PopplerAnnot * +_poppler_annot_new (Annot *annot) +{ + PopplerAnnot *poppler_annot; + + poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT, NULL)); + poppler_annot->annot = annot; + + return poppler_annot; +} + +static void +poppler_annot_markup_init (PopplerAnnotMarkup *poppler_annot) +{ +} + +static void +poppler_annot_markup_class_init (PopplerAnnotMarkupClass *klass) +{ +} + +static void +poppler_annot_text_init (PopplerAnnotText *poppler_annot) +{ +} + +static void +poppler_annot_text_class_init (PopplerAnnotTextClass *klass) +{ +} + +PopplerAnnot * +_poppler_annot_text_new (Annot *annot) +{ + PopplerAnnot *poppler_annot; + + poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_TEXT, NULL)); + poppler_annot->annot = annot; + + return poppler_annot; +} + +/** + * poppler_annot_text_new: + * @doc: a #PopplerDocument + * @rect: a #PopplerRectangle + * + * Creates a new Text annotation that will be + * located on @rect when added to a page. See + * poppler_page_add_annot() + * + * Return value: A newly created #PopplerAnnotText annotation + * + * Since: 0.16 + */ +PopplerAnnot * +poppler_annot_text_new (PopplerDocument *doc, + PopplerRectangle *rect) +{ + Annot *annot; + PDFRectangle pdf_rect(rect->x1, rect->y1, + rect->x2, rect->y2); + + annot = new AnnotText (doc->doc, &pdf_rect); + + return _poppler_annot_text_new (annot); +} + +static void +poppler_annot_free_text_init (PopplerAnnotFreeText *poppler_annot) +{ +} + +static void +poppler_annot_free_text_class_init (PopplerAnnotFreeTextClass *klass) +{ +} + +PopplerAnnot * +_poppler_annot_free_text_new (Annot *annot) +{ + PopplerAnnot *poppler_annot; + + poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_FREE_TEXT, NULL)); + poppler_annot->annot = annot; + + return poppler_annot; +} + +static void +poppler_annot_file_attachment_init (PopplerAnnotFileAttachment *poppler_annot) +{ +} + +static void +poppler_annot_file_attachment_class_init (PopplerAnnotFileAttachmentClass *klass) +{ +} + +PopplerAnnot * +_poppler_annot_file_attachment_new (Annot *annot) +{ + PopplerAnnot *poppler_annot; + + poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_FILE_ATTACHMENT, NULL)); + poppler_annot->annot = annot; + + return poppler_annot; +} + + +static void +poppler_annot_movie_finalize (GObject *object) +{ + PopplerAnnotMovie *annot_movie = POPPLER_ANNOT_MOVIE (object); + + if (annot_movie->movie) { + g_object_unref (annot_movie->movie); + annot_movie->movie = NULL; + } + + G_OBJECT_CLASS (poppler_annot_movie_parent_class)->finalize (object); +} + +static void +poppler_annot_movie_init (PopplerAnnotMovie *poppler_annot) +{ +} + +static void +poppler_annot_movie_class_init (PopplerAnnotMovieClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_annot_movie_finalize; +} + +PopplerAnnot * +_poppler_annot_movie_new (Annot *annot) +{ + PopplerAnnot *poppler_annot; + AnnotMovie *annot_movie; + + poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_MOVIE, NULL)); + poppler_annot->annot = annot; + + annot_movie = static_cast<AnnotMovie *>(poppler_annot->annot); + POPPLER_ANNOT_MOVIE (poppler_annot)->movie = _poppler_movie_new (annot_movie->getMovie()); + + return poppler_annot; +} + +static void +poppler_annot_screen_finalize (GObject *object) +{ + PopplerAnnotScreen *annot_screen = POPPLER_ANNOT_SCREEN (object); + + if (annot_screen->action) { + poppler_action_free (annot_screen->action); + annot_screen->action = NULL; + } + + G_OBJECT_CLASS (poppler_annot_screen_parent_class)->finalize (object); +} + +static void +poppler_annot_screen_init (PopplerAnnotScreen *poppler_annot) +{ +} + +static void +poppler_annot_screen_class_init (PopplerAnnotScreenClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_annot_screen_finalize; +} + +PopplerAnnot * +_poppler_annot_screen_new (Annot *annot) +{ + PopplerAnnot *poppler_annot; + AnnotScreen *annot_screen; + LinkAction *action; + + poppler_annot = POPPLER_ANNOT (g_object_new (POPPLER_TYPE_ANNOT_SCREEN, NULL)); + poppler_annot->annot = annot; + + annot_screen = static_cast<AnnotScreen *>(poppler_annot->annot); + action = annot_screen->getAction(); + if (action) + POPPLER_ANNOT_SCREEN (poppler_annot)->action = _poppler_action_new (NULL, action, NULL); + + return poppler_annot; +} + + +/* Public methods */ +/** + * poppler_annot_get_annot_type: + * @poppler_annot: a #PopplerAnnot + * + * Gets the type of @poppler_annot + * + * Return value: #PopplerAnnotType of @poppler_annot. + **/ +PopplerAnnotType +poppler_annot_get_annot_type (PopplerAnnot *poppler_annot) +{ + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), POPPLER_ANNOT_UNKNOWN); + + switch (poppler_annot->annot->getType ()) + { + case Annot::typeText: + return POPPLER_ANNOT_TEXT; + case Annot::typeLink: + return POPPLER_ANNOT_LINK; + case Annot::typeFreeText: + return POPPLER_ANNOT_FREE_TEXT; + case Annot::typeLine: + return POPPLER_ANNOT_LINE; + case Annot::typeSquare: + return POPPLER_ANNOT_SQUARE; + case Annot::typeCircle: + return POPPLER_ANNOT_CIRCLE; + case Annot::typePolygon: + return POPPLER_ANNOT_POLYGON; + case Annot::typePolyLine: + return POPPLER_ANNOT_POLY_LINE; + case Annot::typeHighlight: + return POPPLER_ANNOT_HIGHLIGHT; + case Annot::typeUnderline: + return POPPLER_ANNOT_UNDERLINE; + case Annot::typeSquiggly: + return POPPLER_ANNOT_SQUIGGLY; + case Annot::typeStrikeOut: + return POPPLER_ANNOT_STRIKE_OUT; + case Annot::typeStamp: + return POPPLER_ANNOT_STAMP; + case Annot::typeCaret: + return POPPLER_ANNOT_CARET; + case Annot::typeInk: + return POPPLER_ANNOT_INK; + case Annot::typePopup: + return POPPLER_ANNOT_POPUP; + case Annot::typeFileAttachment: + return POPPLER_ANNOT_FILE_ATTACHMENT; + case Annot::typeSound: + return POPPLER_ANNOT_SOUND; + case Annot::typeMovie: + return POPPLER_ANNOT_MOVIE; + case Annot::typeWidget: + return POPPLER_ANNOT_WIDGET; + case Annot::typeScreen: + return POPPLER_ANNOT_SCREEN; + case Annot::typePrinterMark: + return POPPLER_ANNOT_PRINTER_MARK; + case Annot::typeTrapNet: + return POPPLER_ANNOT_TRAP_NET; + case Annot::typeWatermark: + return POPPLER_ANNOT_WATERMARK; + case Annot::type3D: + return POPPLER_ANNOT_3D; + default: + g_warning ("Unsupported Annot Type"); + } + + return POPPLER_ANNOT_UNKNOWN; +} + +/** + * poppler_annot_get_contents: + * @poppler_annot: a #PopplerAnnot + * + * Retrieves the contents of @poppler_annot. + * + * Return value: a new allocated string with the contents of @poppler_annot. It + * must be freed with g_free() when done. + **/ +gchar * +poppler_annot_get_contents (PopplerAnnot *poppler_annot) +{ + GooString *contents; + + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL); + + contents = poppler_annot->annot->getContents (); + + return contents ? _poppler_goo_string_to_utf8 (contents) : NULL; +} + +/** + * poppler_annot_set_contents: + * @poppler_annot: a #PopplerAnnot + * @contents: a text string containing the new contents + * + * Sets the contents of @poppler_annot to the given value, + * replacing the current contents. + * + * Since: 0.12 + **/ +void +poppler_annot_set_contents (PopplerAnnot *poppler_annot, + const gchar *contents) +{ + GooString *goo_tmp; + gchar *tmp; + gsize length = 0; + + g_return_if_fail (POPPLER_IS_ANNOT (poppler_annot)); + + tmp = contents ? g_convert (contents, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL; + goo_tmp = new GooString (tmp, length); + g_free (tmp); + poppler_annot->annot->setContents (goo_tmp); + delete (goo_tmp); +} + +/** + * poppler_annot_get_name: + * @poppler_annot: a #PopplerAnnot + * + * Retrieves the name of @poppler_annot. + * + * Return value: a new allocated string with the name of @poppler_annot. It must + * be freed with g_free() when done. + **/ +gchar * +poppler_annot_get_name (PopplerAnnot *poppler_annot) +{ + GooString *name; + + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL); + + name = poppler_annot->annot->getName (); + + return name ? _poppler_goo_string_to_utf8 (name) : NULL; +} + +/** + * poppler_annot_get_modified: + * @poppler_annot: a #PopplerAnnot + * + * Retrieves the last modification data of @poppler_annot. The returned + * string will be either a PDF format date or a text string. + * See also #poppler_date_parse() + * + * Return value: a new allocated string with the last modification data of + * @poppler_annot. It must be freed with g_free() when done. + **/ +gchar * +poppler_annot_get_modified (PopplerAnnot *poppler_annot) +{ + GooString *text; + + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL); + + text = poppler_annot->annot->getModified (); + + return text ? _poppler_goo_string_to_utf8 (text) : NULL; +} + +/** + * poppler_annot_get_flags + * @poppler_annot: a #PopplerAnnot + * + * Retrieves the flag field specifying various characteristics of the + * @poppler_annot. + * + * Return value: the flag field of @poppler_annot. + **/ +PopplerAnnotFlag +poppler_annot_get_flags (PopplerAnnot *poppler_annot) +{ + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), (PopplerAnnotFlag) 0); + + return (PopplerAnnotFlag) poppler_annot->annot->getFlags (); +} + +/** + * poppler_annot_get_color: + * @poppler_annot: a #PopplerAnnot + * + * Retrieves the color of @poppler_annot. + * + * Return value: a new allocated #PopplerColor with the color values of + * @poppler_annot, or %NULL. It must be freed with g_free() when done. + **/ +PopplerColor * +poppler_annot_get_color (PopplerAnnot *poppler_annot) +{ + AnnotColor *color; + PopplerColor *poppler_color = NULL; + + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), NULL); + + color = poppler_annot->annot->getColor (); + + if (color) { + const double *values = color->getValues (); + + switch (color->getSpace ()) + { + case AnnotColor::colorGray: + poppler_color = g_new (PopplerColor, 1); + + poppler_color->red = (guint16) (values[0] * 65535); + poppler_color->green = poppler_color->red; + poppler_color->blue = poppler_color->red; + + break; + case AnnotColor::colorRGB: + poppler_color = g_new (PopplerColor, 1); + + poppler_color->red = (guint16) (values[0] * 65535); + poppler_color->green = (guint16) (values[1] * 65535); + poppler_color->blue = (guint16) (values[2] * 65535); + + break; + case AnnotColor::colorCMYK: + g_warning ("Unsupported Annot Color: colorCMYK"); + case AnnotColor::colorTransparent: + break; + } + } + + return poppler_color; +} + +/** + * poppler_annot_set_color: + * @poppler_annot: a #PopplerAnnot + * @poppler_color: (allow-none): a #PopplerColor, or %NULL + * + * Sets the color of @poppler_annot. + * + * Since: 0.16 + */ +void +poppler_annot_set_color (PopplerAnnot *poppler_annot, + PopplerColor *poppler_color) +{ + AnnotColor *color = NULL; + + if (poppler_color) { + color = new AnnotColor ((double)poppler_color->red / 65535, + (double)poppler_color->green / 65535, + (double)poppler_color->blue / 65535); + } + + /* Annot takes ownership of the color */ + poppler_annot->annot->setColor (color); +} + +/** + * poppler_annot_get_page_index: + * @poppler_annot: a #PopplerAnnot + * + * Returns the page index to which @poppler_annot is associated, or -1 if unknown + * + * Return value: page index or -1 + * + * Since: 0.14 + **/ +gint +poppler_annot_get_page_index (PopplerAnnot *poppler_annot) +{ + gint page_num; + + g_return_val_if_fail (POPPLER_IS_ANNOT (poppler_annot), -1); + + page_num = poppler_annot->annot->getPageNum(); + return page_num <= 0 ? -1 : page_num - 1; +} + +/* PopplerAnnotMarkup */ +/** + * poppler_annot_markup_get_label: + * @poppler_annot: a #PopplerAnnotMarkup + * + * Retrieves the label text of @poppler_annot. + * + * Return value: the label text of @poppler_annot. + */ +gchar * +poppler_annot_markup_get_label (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + GooString *text; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + text = annot->getLabel (); + + return text ? _poppler_goo_string_to_utf8 (text) : NULL; +} + +/** + * poppler_annot_markup_set_label: + * @poppler_annot: a #PopplerAnnotMarkup + * @label: (allow-none): a text string containing the new label, or %NULL + * + * Sets the label text of @poppler_annot, replacing the current one + * + * Since: 0.16 + */ +void +poppler_annot_markup_set_label (PopplerAnnotMarkup *poppler_annot, + const gchar *label) +{ + AnnotMarkup *annot; + GooString *goo_tmp; + gchar *tmp; + gsize length = 0; + + g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot)); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + tmp = label ? g_convert (label, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL; + goo_tmp = new GooString (tmp, length); + g_free (tmp); + annot->setLabel (goo_tmp); + delete goo_tmp; +} + +/** + * poppler_annot_markup_has_popup: + * @poppler_annot: a #PopplerAnnotMarkup + * + * Return %TRUE if the markup annotation has a popup window associated + * + * Return value: %TRUE, if @poppler_annot has popup, %FALSE otherwise + * + * Since: 0.12 + **/ +gboolean +poppler_annot_markup_has_popup (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), FALSE); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + return annot->getPopup () != NULL; +} + +/** + * poppler_annot_markup_set_popup: + * @poppler_annot: a #PopplerAnnotMarkup + * @popup_rect: a #PopplerRectangle + * + * Associates a new popup window for editing contents of @poppler_annot. + * Popup window shall be displayed by viewers at @popup_rect on the page. + * + * Since: 0.16 + */ +void +poppler_annot_markup_set_popup (PopplerAnnotMarkup *poppler_annot, + PopplerRectangle *popup_rect) +{ + AnnotMarkup *annot; + AnnotPopup *popup; + PDFRectangle pdf_rect(popup_rect->x1, popup_rect->y1, + popup_rect->x2, popup_rect->y2); + + g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot)); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + popup = new AnnotPopup (annot->getDoc(), &pdf_rect); + annot->setPopup (popup); +} + +/** + * poppler_annot_markup_get_popup_is_open: + * @poppler_annot: a #PopplerAnnotMarkup + * + * Retrieves the state of the popup window related to @poppler_annot. + * + * Return value: the state of @poppler_annot. %TRUE if it's open, %FALSE in + * other case. + **/ +gboolean +poppler_annot_markup_get_popup_is_open (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + AnnotPopup *annot_popup; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), FALSE); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + if ((annot_popup = annot->getPopup ())) + return annot_popup->getOpen (); + + return FALSE; +} + +/** + * poppler_annot_markup_set_popup_is_open: + * @poppler_annot: a #PopplerAnnotMarkup + * @is_open: whether popup window should initially be displayed open + * + * Sets the state of the popup window related to @poppler_annot. + * + * Since: 0.16 + **/ +void +poppler_annot_markup_set_popup_is_open (PopplerAnnotMarkup *poppler_annot, + gboolean is_open) +{ + AnnotMarkup *annot; + AnnotPopup *annot_popup; + + g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot)); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + annot_popup = annot->getPopup (); + if (!annot_popup) + return; + + if (annot_popup->getOpen () != is_open) + annot_popup->setOpen (is_open); +} + +/** + * poppler_annot_markup_get_popup_rectangle: + * @poppler_annot: a #PopplerAnnotMarkup + * @poppler_rect: (out): a #PopplerRectangle to store the popup rectangle + * + * Retrieves the rectangle of the popup window related to @poppler_annot. + * + * Return value: %TRUE if #PopplerRectangle was correctly filled, %FALSE otherwise + * + * Since: 0.12 + **/ +gboolean +poppler_annot_markup_get_popup_rectangle (PopplerAnnotMarkup *poppler_annot, + PopplerRectangle *poppler_rect) +{ + AnnotMarkup *annot; + Annot *annot_popup; + PDFRectangle *annot_rect; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), FALSE); + g_return_val_if_fail (poppler_rect != NULL, FALSE); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + annot_popup = annot->getPopup (); + if (!annot_popup) + return FALSE; + + annot_rect = annot_popup->getRect (); + poppler_rect->x1 = annot_rect->x1; + poppler_rect->x2 = annot_rect->x2; + poppler_rect->y1 = annot_rect->y1; + poppler_rect->y2 = annot_rect->y2; + + return TRUE; +} + +/** + * poppler_annot_markup_get_opacity: + * @poppler_annot: a #PopplerAnnotMarkup + * + * Retrieves the opacity value of @poppler_annot. + * + * Return value: the opacity value of @poppler_annot, + * between 0 (transparent) and 1 (opaque) + */ +gdouble +poppler_annot_markup_get_opacity (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), 0); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + return annot->getOpacity (); +} + +/** + * poppler_annot_markup_set_opacity: + * @poppler_annot: a #PopplerAnnotMarkup + * @opacity: a constant opacity value, between 0 (transparent) and 1 (opaque) + * + * Sets the opacity of @poppler_annot. This value applies to + * all visible elements of @poppler_annot in its closed state, + * but not to the pop-up window that appears when it's openened + * + * Since: 0.16 + */ +void +poppler_annot_markup_set_opacity (PopplerAnnotMarkup *poppler_annot, + gdouble opacity) +{ + AnnotMarkup *annot; + + g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot)); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + annot->setOpacity(opacity); +} + +/** + * poppler_annot_markup_get_date: + * @poppler_annot: a #PopplerAnnotMarkup + * + * Returns the date and time when the annotation was created + * + * Return value: (transfer full): a #GDate representing the date and time + * when the annotation was created, or %NULL + */ +GDate * +poppler_annot_markup_get_date (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + GooString *annot_date; + time_t timet; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + annot_date = annot->getDate (); + if (!annot_date) + return NULL; + + if (_poppler_convert_pdf_date_to_gtime (annot_date, &timet)) { + GDate *date; + + date = g_date_new (); + g_date_set_time_t (date, timet); + + return date; + } + + return NULL; +} + +/** +* poppler_annot_markup_get_subject: +* @poppler_annot: a #PopplerAnnotMarkup +* +* Retrives the subject text of @poppler_annot. +* +* Return value: the subject text of @poppler_annot. +*/ +gchar * +poppler_annot_markup_get_subject (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + GooString *text; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + text = annot->getSubject (); + + return text ? _poppler_goo_string_to_utf8 (text) : NULL; +} + +/** +* poppler_annot_markup_get_reply_to: +* @poppler_annot: a #PopplerAnnotMarkup +* +* Gets the reply type of @poppler_annot. +* +* Return value: #PopplerAnnotMarkupReplyType of @poppler_annot. +*/ +PopplerAnnotMarkupReplyType +poppler_annot_markup_get_reply_to (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), POPPLER_ANNOT_MARKUP_REPLY_TYPE_R); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + switch (annot->getReplyTo ()) + { + case AnnotMarkup::replyTypeR: + return POPPLER_ANNOT_MARKUP_REPLY_TYPE_R; + case AnnotMarkup::replyTypeGroup: + return POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP; + default: + g_warning ("Unsupported Annot Markup Reply To Type"); + } + + return POPPLER_ANNOT_MARKUP_REPLY_TYPE_R; +} + +/** +* poppler_annot_markup_get_external_data: +* @poppler_annot: a #PopplerAnnotMarkup +* +* Gets the external data type of @poppler_annot. +* +* Return value: #PopplerAnnotExternalDataType of @poppler_annot. +*/ +PopplerAnnotExternalDataType +poppler_annot_markup_get_external_data (PopplerAnnotMarkup *poppler_annot) +{ + AnnotMarkup *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN); + + annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); + + switch (annot->getExData ()) + { + case annotExternalDataMarkup3D: + return POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D; + case annotExternalDataMarkupUnknown: + return POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN; + default: + g_warning ("Unsupported Annot Markup External Data"); + } + + return POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN; +} + +/* PopplerAnnotText */ +/** + * poppler_annot_text_get_is_open: + * @poppler_annot: a #PopplerAnnotText + * + * Retrieves the state of @poppler_annot. + * + * Return value: the state of @poppler_annot. %TRUE if it's open, %FALSE in + * other case. + **/ +gboolean +poppler_annot_text_get_is_open (PopplerAnnotText *poppler_annot) +{ + AnnotText *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot), FALSE); + + annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot); + + return annot->getOpen (); +} + +/** + * poppler_annot_text_set_is_open: + * @poppler_annot: a #PopplerAnnotText + * @is_open: whether annotation should initially be displayed open + * + * Sets whether @poppler_annot should initially be displayed open + * + * Since: 0.16 + */ +void +poppler_annot_text_set_is_open (PopplerAnnotText *poppler_annot, + gboolean is_open) +{ + AnnotText *annot; + + g_return_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot)); + + annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot); + annot->setOpen(is_open); +} + +/** + * poppler_annot_text_get_icon: + * @poppler_annot: a #PopplerAnnotText + * + * Gets name of the icon of @poppler_annot. + * + * Return value: a new allocated string containing the icon name + */ +gchar * +poppler_annot_text_get_icon (PopplerAnnotText *poppler_annot) +{ + AnnotText *annot; + GooString *text; + + g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot), NULL); + + annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot); + + text = annot->getIcon (); + + return text ? _poppler_goo_string_to_utf8 (text) : NULL; +} + +/** + * poppler_annot_text_set_icon: + * @poppler_annot: a #PopplerAnnotText + * @icon: the name of an icon + * + * Sets the icon of @poppler_annot. The following predefined + * icons are currently supported: + * <variablelist> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_NOTE</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_COMMENT</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_KEY</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_HELP</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_PARAGRAPH</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_INSERT</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_CROSS</term> + * </varlistentry> + * <varlistentry> + * <term>#POPPLER_ANNOT_TEXT_ICON_CIRCLE</term> + * </varlistentry> + * </variablelist> + * + * Since: 0.16 + */ +void +poppler_annot_text_set_icon (PopplerAnnotText *poppler_annot, + const gchar *icon) +{ + AnnotText *annot; + GooString *text; + + g_return_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot)); + + annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot); + + text = new GooString(icon); + annot->setIcon(text); + delete text; +} + +/** + * poppler_annot_text_get_state: + * @poppler_annot: a #PopplerAnnotText + * + * Retrieves the state of @poppler_annot. + * + * Return value: #PopplerAnnotTextState of @poppler_annot. + **/ +PopplerAnnotTextState +poppler_annot_text_get_state (PopplerAnnotText *poppler_annot) +{ + AnnotText *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_TEXT (poppler_annot), POPPLER_ANNOT_TEXT_STATE_UNKNOWN); + + annot = static_cast<AnnotText *>(POPPLER_ANNOT (poppler_annot)->annot); + + switch (annot->getState ()) + { + case AnnotText::stateUnknown: + return POPPLER_ANNOT_TEXT_STATE_UNKNOWN; + case AnnotText::stateMarked: + return POPPLER_ANNOT_TEXT_STATE_MARKED; + case AnnotText::stateUnmarked: + return POPPLER_ANNOT_TEXT_STATE_UNMARKED; + case AnnotText::stateAccepted: + return POPPLER_ANNOT_TEXT_STATE_ACCEPTED; + case AnnotText::stateRejected: + return POPPLER_ANNOT_TEXT_STATE_REJECTED; + case AnnotText::stateCancelled: + return POPPLER_ANNOT_TEXT_STATE_CANCELLED; + case AnnotText::stateCompleted: + return POPPLER_ANNOT_TEXT_STATE_COMPLETED; + case AnnotText::stateNone: + return POPPLER_ANNOT_TEXT_STATE_NONE; + default: + g_warning ("Unsupported Annot Text State"); + } + + return POPPLER_ANNOT_TEXT_STATE_UNKNOWN; +} + +/* PopplerAnnotFreeText */ +/** + * poppler_annot_free_text_get_quadding: + * @poppler_annot: a #PopplerAnnotFreeText + * + * Retrieves the justification of the text of @poppler_annot. + * + * Return value: #PopplerAnnotFreeTextQuadding of @poppler_annot. + **/ +PopplerAnnotFreeTextQuadding +poppler_annot_free_text_get_quadding (PopplerAnnotFreeText *poppler_annot) +{ + AnnotFreeText *annot; + + g_return_val_if_fail (POPPLER_IS_ANNOT_FREE_TEXT (poppler_annot), POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED); + + annot = static_cast<AnnotFreeText *>(POPPLER_ANNOT (poppler_annot)->annot); + + switch (annot->getQuadding ()) + { + case AnnotFreeText::quaddingLeftJustified: + return POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED; + case AnnotFreeText::quaddingCentered: + return POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED; + case AnnotFreeText::quaddingRightJustified: + return POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED; + default: + g_warning ("Unsupported Annot Free Text Quadding"); + } + + return POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED; +} + +/** + * poppler_annot_free_text_get_callout_line: + * @poppler_annot: a #PopplerAnnotFreeText + * + * Retrieves a #PopplerAnnotCalloutLine of four or six numbers specifying a callout + * line attached to the @poppler_annot. + * + * Return value: a new allocated #PopplerAnnotCalloutLine if the annot has a callout + * line, %NULL in other case. It must be freed with g_free() when + * done. + **/ +PopplerAnnotCalloutLine * +poppler_annot_free_text_get_callout_line (PopplerAnnotFreeText *poppler_annot) +{ + AnnotFreeText *annot; + AnnotCalloutLine *line; + + g_return_val_if_fail (POPPLER_IS_ANNOT_FREE_TEXT (poppler_annot), NULL); + + annot = static_cast<AnnotFreeText *>(POPPLER_ANNOT (poppler_annot)->annot); + + if ((line = annot->getCalloutLine ())) { + AnnotCalloutMultiLine *multiline; + PopplerAnnotCalloutLine *callout = g_new0 (PopplerAnnotCalloutLine, 1); + + callout->x1 = line->getX1(); + callout->y1 = line->getY1(); + callout->x2 = line->getX2(); + callout->y2 = line->getY2(); + + if ((multiline = static_cast<AnnotCalloutMultiLine *>(line))) { + callout->multiline = TRUE; + callout->x3 = multiline->getX3(); + callout->y3 = multiline->getY3(); + return callout; + } + + callout->multiline = FALSE; + return callout; + } + + return NULL; +} + +/* PopplerAnnotFileAttachment */ +/** + * poppler_annot_file_attachment_get_attachment: + * @poppler_annot: a #PopplerAnnotFileAttachment + * + * Creates a #PopplerAttachment for the file of the file attachment annotation @annot. + * The #PopplerAttachment must be unrefed with g_object_unref by the caller. + * + * Return value: (transfer full): @PopplerAttachment + * + * Since: 0.14 + **/ +PopplerAttachment * +poppler_annot_file_attachment_get_attachment (PopplerAnnotFileAttachment *poppler_annot) +{ + AnnotFileAttachment *annot; + PopplerAttachment *attachment; + + g_return_val_if_fail (POPPLER_IS_ANNOT_FILE_ATTACHMENT (poppler_annot), NULL); + + annot = static_cast<AnnotFileAttachment *>(POPPLER_ANNOT (poppler_annot)->annot); + + FileSpec *file = new FileSpec (annot->getFile()); + attachment = _poppler_attachment_new (file); + delete file; + + return attachment; +} + +/** + * poppler_annot_file_attachment_get_name: + * @poppler_annot: a #PopplerAnnotFileAttachment + * + * Retrieves the name of @poppler_annot. + * + * Return value: a new allocated string with the name of @poppler_annot. It must + * be freed with g_free() when done. + * Since: 0.14 + **/ +gchar * +poppler_annot_file_attachment_get_name (PopplerAnnotFileAttachment *poppler_annot) +{ + AnnotFileAttachment *annot; + GooString *name; + + g_return_val_if_fail (POPPLER_IS_ANNOT_FILE_ATTACHMENT (poppler_annot), NULL); + + annot = static_cast<AnnotFileAttachment *>(POPPLER_ANNOT (poppler_annot)->annot); + name = annot->getName (); + + return name ? _poppler_goo_string_to_utf8 (name) : NULL; +} + +/* PopplerAnnotCalloutLine */ +POPPLER_DEFINE_BOXED_TYPE (PopplerAnnotCalloutLine, poppler_annot_callout_line, + poppler_annot_callout_line_copy, + poppler_annot_callout_line_free) + +/** + * poppler_annot_callout_line_new: + * + * Creates a new empty #PopplerAnnotCalloutLine. + * + * Return value: a new allocated #PopplerAnnotCalloutLine, %NULL in other case. + * It must be freed when done. + **/ +PopplerAnnotCalloutLine * +poppler_annot_callout_line_new (void) +{ + return g_new0 (PopplerAnnotCalloutLine, 1); +} + +/** + * poppler_annot_callout_line_copy: + * @callout: the #PopplerAnnotCalloutLine to be copied. + * + * It does copy @callout to a new #PopplerAnnotCalloutLine. + * + * Return value: a new allocated #PopplerAnnotCalloutLine as exact copy of + * @callout, %NULL in other case. It must be freed when done. + **/ +PopplerAnnotCalloutLine * +poppler_annot_callout_line_copy (PopplerAnnotCalloutLine *callout) +{ + PopplerAnnotCalloutLine *new_callout; + + g_return_val_if_fail (callout != NULL, NULL); + + new_callout = g_new0 (PopplerAnnotCalloutLine, 1); + *new_callout = *callout; + + return new_callout; +} + +/** + * poppler_annot_callout_line_free: + * @callout: a #PopplerAnnotCalloutLine + * + * Frees the memory used by #PopplerAnnotCalloutLine. + **/ +void +poppler_annot_callout_line_free (PopplerAnnotCalloutLine *callout) +{ + g_free (callout); +} + + +/* PopplerAnnotMovie */ +/** + * poppler_annot_movie_get_title: + * @poppler_annot: a #PopplerAnnotMovie + * + * Retrieves the movie title of @poppler_annot. + * + * Return value: the title text of @poppler_annot. + * + * Since: 0.14 + */ +gchar * +poppler_annot_movie_get_title (PopplerAnnotMovie *poppler_annot) +{ + AnnotMovie *annot; + GooString *title; + + g_return_val_if_fail (POPPLER_IS_ANNOT_MOVIE (poppler_annot), NULL); + + annot = static_cast<AnnotMovie *>(POPPLER_ANNOT (poppler_annot)->annot); + + title = annot->getTitle (); + + return title ? _poppler_goo_string_to_utf8 (title) : NULL; +} + +/** + * poppler_annot_movie_get_movie: + * @poppler_annot: a #PopplerAnnotMovie + * + * Retrieves the movie object (PopplerMovie) stored in the @poppler_annot. + * + * Return value: (transfer none): the movie object stored in the @poppler_annot. The returned + * object is owned by #PopplerAnnotMovie and should not be freed + * + * Since: 0.14 + */ +PopplerMovie * +poppler_annot_movie_get_movie (PopplerAnnotMovie *poppler_annot) +{ + return poppler_annot->movie; +} + +/* PopplerAnnotScreen */ +/** + * poppler_annot_screen_get_action: + * @poppler_annot: a #PopplerAnnotScreen + * + * Retrieves the action (#PopplerAction) that shall be performed when @poppler_annot is activated + * + * Return value: (transfer none): the action to perform. The returned + * object is owned by @poppler_annot and should not be freed + * + * Since: 0.14 + */ +PopplerAction * +poppler_annot_screen_get_action (PopplerAnnotScreen *poppler_annot) +{ + return poppler_annot->action; +} diff --git a/glib/poppler-annot.h b/glib/poppler-annot.h new file mode 100644 index 0000000..17440fb --- /dev/null +++ b/glib/poppler-annot.h @@ -0,0 +1,230 @@ +/* poppler-annot.h: glib interface to poppler + * + * Copyright (C) 2007 Inigo Martinez <inigomartinez@gmail.com> + * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_ANNOT_H__ +#define __POPPLER_ANNOT_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +#define POPPLER_TYPE_ANNOT (poppler_annot_get_type ()) +#define POPPLER_ANNOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT, PopplerAnnot)) +#define POPPLER_IS_ANNOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT)) + +#define POPPLER_TYPE_ANNOT_MARKUP (poppler_annot_markup_get_type ()) +#define POPPLER_ANNOT_MARKUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_MARKUP, PopplerAnnotMarkup)) +#define POPPLER_IS_ANNOT_MARKUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_MARKUP)) + +#define POPPLER_TYPE_ANNOT_TEXT (poppler_annot_text_get_type ()) +#define POPPLER_ANNOT_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_TEXT, PopplerAnnotText)) +#define POPPLER_IS_ANNOT_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_TEXT)) + +#define POPPLER_TYPE_ANNOT_FREE_TEXT (poppler_annot_free_text_get_type ()) +#define POPPLER_ANNOT_FREE_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_FREE_TEXT, PopplerAnnotFreeText)) +#define POPPLER_IS_ANNOT_FREE_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_FREE_TEXT)) + +#define POPPLER_TYPE_ANNOT_FILE_ATTACHMENT (poppler_annot_file_attachment_get_type ()) +#define POPPLER_ANNOT_FILE_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_MARKUP, PopplerAnnotFileAttachment)) +#define POPPLER_IS_ANNOT_FILE_ATTACHMENT(obj)(G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_FILE_ATTACHMENT)) + +#define POPPLER_TYPE_ANNOT_MOVIE (poppler_annot_movie_get_type ()) +#define POPPLER_ANNOT_MOVIE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_MOVIE, PopplerAnnotMovie)) +#define POPPLER_IS_ANNOT_MOVIE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_MOVIE)) + +#define POPPLER_TYPE_ANNOT_SCREEN (poppler_annot_screen_get_type ()) +#define POPPLER_ANNOT_SCREEN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT_SCREEN, PopplerAnnotScreen)) +#define POPPLER_IS_ANNOT_SCREEN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_SCREEN)) + +#define POPPLER_TYPE_ANNOT_CALLOUT_LINE (poppler_annot_callout_line_get_type ()) + + +typedef enum +{ + POPPLER_ANNOT_UNKNOWN, + POPPLER_ANNOT_TEXT, + POPPLER_ANNOT_LINK, + POPPLER_ANNOT_FREE_TEXT, + POPPLER_ANNOT_LINE, + POPPLER_ANNOT_SQUARE, + POPPLER_ANNOT_CIRCLE, + POPPLER_ANNOT_POLYGON, + POPPLER_ANNOT_POLY_LINE, + POPPLER_ANNOT_HIGHLIGHT, + POPPLER_ANNOT_UNDERLINE, + POPPLER_ANNOT_SQUIGGLY, + POPPLER_ANNOT_STRIKE_OUT, + POPPLER_ANNOT_STAMP, + POPPLER_ANNOT_CARET, + POPPLER_ANNOT_INK, + POPPLER_ANNOT_POPUP, + POPPLER_ANNOT_FILE_ATTACHMENT, + POPPLER_ANNOT_SOUND, + POPPLER_ANNOT_MOVIE, + POPPLER_ANNOT_WIDGET, + POPPLER_ANNOT_SCREEN, + POPPLER_ANNOT_PRINTER_MARK, + POPPLER_ANNOT_TRAP_NET, + POPPLER_ANNOT_WATERMARK, + POPPLER_ANNOT_3D +} PopplerAnnotType; + +typedef enum /*< flags >*/ +{ + POPPLER_ANNOT_FLAG_UNKNOWN = 0, + POPPLER_ANNOT_FLAG_INVISIBLE = 1 << 0, + POPPLER_ANNOT_FLAG_HIDDEN = 1 << 1, + POPPLER_ANNOT_FLAG_PRINT = 1 << 2, + POPPLER_ANNOT_FLAG_NO_ZOOM = 1 << 3, + POPPLER_ANNOT_FLAG_NO_ROTATE = 1 << 4, + POPPLER_ANNOT_FLAG_NO_VIEW = 1 << 5, + POPPLER_ANNOT_FLAG_READ_ONLY = 1 << 6, + POPPLER_ANNOT_FLAG_LOCKED = 1 << 7, + POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW = 1 << 8, + POPPLER_ANNOT_FLAG_LOCKED_CONTENTS = 1 << 9 +} PopplerAnnotFlag; + +typedef enum +{ + POPPLER_ANNOT_MARKUP_REPLY_TYPE_R, + POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP +} PopplerAnnotMarkupReplyType; + +typedef enum +{ + POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D, + POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN +} PopplerAnnotExternalDataType; + +#define POPPLER_ANNOT_TEXT_ICON_NOTE "Note" +#define POPPLER_ANNOT_TEXT_ICON_COMMENT "Comment" +#define POPPLER_ANNOT_TEXT_ICON_KEY "Key" +#define POPPLER_ANNOT_TEXT_ICON_HELP "Help" +#define POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH "NewParagraph" +#define POPPLER_ANNOT_TEXT_ICON_PARAGRAPH "Paragraph" +#define POPPLER_ANNOT_TEXT_ICON_INSERT "Insert" +#define POPPLER_ANNOT_TEXT_ICON_CROSS "Cross" +#define POPPLER_ANNOT_TEXT_ICON_CIRCLE "Circle" + +typedef enum +{ + POPPLER_ANNOT_TEXT_STATE_MARKED, + POPPLER_ANNOT_TEXT_STATE_UNMARKED, + POPPLER_ANNOT_TEXT_STATE_ACCEPTED, + POPPLER_ANNOT_TEXT_STATE_REJECTED, + POPPLER_ANNOT_TEXT_STATE_CANCELLED, + POPPLER_ANNOT_TEXT_STATE_COMPLETED, + POPPLER_ANNOT_TEXT_STATE_NONE, + POPPLER_ANNOT_TEXT_STATE_UNKNOWN +} PopplerAnnotTextState; + +typedef enum +{ + POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED, + POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED, + POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED +} PopplerAnnotFreeTextQuadding; + +struct _PopplerAnnotCalloutLine +{ + gboolean multiline; + gdouble x1; + gdouble y1; + gdouble x2; + gdouble y2; + gdouble x3; + gdouble y3; +}; + +GType poppler_annot_get_type (void) G_GNUC_CONST; +PopplerAnnotType poppler_annot_get_annot_type (PopplerAnnot *poppler_annot); +gchar *poppler_annot_get_contents (PopplerAnnot *poppler_annot); +void poppler_annot_set_contents (PopplerAnnot *poppler_annot, + const gchar *contents); +gchar *poppler_annot_get_name (PopplerAnnot *poppler_annot); +gchar *poppler_annot_get_modified (PopplerAnnot *poppler_annot); +PopplerAnnotFlag poppler_annot_get_flags (PopplerAnnot *poppler_annot); +PopplerColor *poppler_annot_get_color (PopplerAnnot *poppler_annot); +void poppler_annot_set_color (PopplerAnnot *poppler_annot, + PopplerColor *poppler_color); +gint poppler_annot_get_page_index (PopplerAnnot *poppler_annot); + +/* PopplerAnnotMarkup */ +GType poppler_annot_markup_get_type (void) G_GNUC_CONST; +gchar *poppler_annot_markup_get_label (PopplerAnnotMarkup *poppler_annot); +void poppler_annot_markup_set_label (PopplerAnnotMarkup *poppler_annot, + const gchar *label); +gboolean poppler_annot_markup_has_popup (PopplerAnnotMarkup *poppler_annot); +void poppler_annot_markup_set_popup (PopplerAnnotMarkup *poppler_annot, + PopplerRectangle *popup_rect); +gboolean poppler_annot_markup_get_popup_is_open (PopplerAnnotMarkup *poppler_annot); +void poppler_annot_markup_set_popup_is_open (PopplerAnnotMarkup *poppler_annot, + gboolean is_open); +gboolean poppler_annot_markup_get_popup_rectangle (PopplerAnnotMarkup *poppler_annot, + PopplerRectangle *poppler_rect); +gdouble poppler_annot_markup_get_opacity (PopplerAnnotMarkup *poppler_annot); +void poppler_annot_markup_set_opacity (PopplerAnnotMarkup *poppler_annot, + gdouble opacity); +GDate *poppler_annot_markup_get_date (PopplerAnnotMarkup *poppler_annot); +gchar *poppler_annot_markup_get_subject (PopplerAnnotMarkup *poppler_annot); +PopplerAnnotMarkupReplyType poppler_annot_markup_get_reply_to (PopplerAnnotMarkup *poppler_annot); +PopplerAnnotExternalDataType poppler_annot_markup_get_external_data (PopplerAnnotMarkup *poppler_annot); + +/* PopplerAnnotText */ +GType poppler_annot_text_get_type (void) G_GNUC_CONST; +PopplerAnnot *poppler_annot_text_new (PopplerDocument *doc, + PopplerRectangle *rect); +gboolean poppler_annot_text_get_is_open (PopplerAnnotText *poppler_annot); +void poppler_annot_text_set_is_open (PopplerAnnotText *poppler_annot, + gboolean is_open); +gchar *poppler_annot_text_get_icon (PopplerAnnotText *poppler_annot); +void poppler_annot_text_set_icon (PopplerAnnotText *poppler_annot, + const gchar *icon); +PopplerAnnotTextState poppler_annot_text_get_state (PopplerAnnotText *poppler_annot); + +/* PopplerAnnotFreeText */ +GType poppler_annot_free_text_get_type (void) G_GNUC_CONST; +PopplerAnnotFreeTextQuadding poppler_annot_free_text_get_quadding (PopplerAnnotFreeText *poppler_annot); +PopplerAnnotCalloutLine *poppler_annot_free_text_get_callout_line (PopplerAnnotFreeText *poppler_annot); + +/* PopplerAnnotFileAttachment */ +GType poppler_annot_file_attachment_get_type (void) G_GNUC_CONST; +PopplerAttachment *poppler_annot_file_attachment_get_attachment (PopplerAnnotFileAttachment *poppler_annot); +gchar *poppler_annot_file_attachment_get_name (PopplerAnnotFileAttachment *poppler_annot); + +/* PopplerAnnotMovie */ +GType poppler_annot_movie_get_type (void) G_GNUC_CONST; +gchar *poppler_annot_movie_get_title (PopplerAnnotMovie *poppler_annot); +PopplerMovie *poppler_annot_movie_get_movie (PopplerAnnotMovie *poppler_annot); + +/* PopplerAnnotScreen */ +GType poppler_annot_screen_get_type (void) G_GNUC_CONST; +PopplerAction *poppler_annot_screen_get_action (PopplerAnnotScreen *poppler_annot); + +/* PopplerAnnotCalloutLine */ +GType poppler_annot_callout_line_get_type (void) G_GNUC_CONST; +PopplerAnnotCalloutLine *poppler_annot_callout_line_new (void); +PopplerAnnotCalloutLine *poppler_annot_callout_line_copy (PopplerAnnotCalloutLine *callout); +void poppler_annot_callout_line_free (PopplerAnnotCalloutLine *callout); + +G_END_DECLS + +#endif /* __POPPLER_ANNOT_H__ */ diff --git a/glib/poppler-attachment.cc b/glib/poppler-attachment.cc new file mode 100644 index 0000000..874bffb --- /dev/null +++ b/glib/poppler-attachment.cc @@ -0,0 +1,274 @@ +/* poppler-attachment.cc: glib wrapper for poppler + * Copyright (C) 2006, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include <errno.h> +#include <glib/gstdio.h> + +#include "poppler.h" +#include "poppler-private.h" + +/** + * SECTION:poppler-attachment + * @short_description: Attachments + * @title: PopplerAttachment + */ + +/* FIXME: We need to add gettext support sometime */ +#define _(x) (x) + +typedef struct _PopplerAttachmentPrivate PopplerAttachmentPrivate; +struct _PopplerAttachmentPrivate +{ + Object *obj_stream; +}; + +#define POPPLER_ATTACHMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachmentPrivate)) + +static void poppler_attachment_dispose (GObject *obj); +static void poppler_attachment_finalize (GObject *obj); + +G_DEFINE_TYPE (PopplerAttachment, poppler_attachment, G_TYPE_OBJECT) + +static void +poppler_attachment_init (PopplerAttachment *attachment) +{ +} + +static void +poppler_attachment_class_init (PopplerAttachmentClass *klass) +{ + G_OBJECT_CLASS (klass)->dispose = poppler_attachment_dispose; + G_OBJECT_CLASS (klass)->finalize = poppler_attachment_finalize; + g_type_class_add_private (klass, sizeof (PopplerAttachmentPrivate)); +} + +static void +poppler_attachment_dispose (GObject *obj) +{ + PopplerAttachmentPrivate *priv; + + priv = POPPLER_ATTACHMENT_GET_PRIVATE (obj); + + if (priv->obj_stream) + { + priv->obj_stream->free(); + delete priv->obj_stream; + priv->obj_stream = NULL; + } + + G_OBJECT_CLASS (poppler_attachment_parent_class)->dispose (obj); +} + +static void +poppler_attachment_finalize (GObject *obj) +{ + PopplerAttachment *attachment; + + attachment = (PopplerAttachment *) obj; + + if (attachment->name) + g_free (attachment->name); + attachment->name = NULL; + + if (attachment->description) + g_free (attachment->description); + attachment->description = NULL; + + if (attachment->checksum) + g_string_free (attachment->checksum, TRUE); + attachment->checksum = NULL; + + G_OBJECT_CLASS (poppler_attachment_parent_class)->finalize (obj); +} + +/* Public functions */ + +PopplerAttachment * +_poppler_attachment_new (FileSpec *emb_file) +{ + PopplerAttachment *attachment; + PopplerAttachmentPrivate *priv; + EmbFile *embFile; + + g_assert (emb_file != NULL); + + attachment = (PopplerAttachment *) g_object_new (POPPLER_TYPE_ATTACHMENT, NULL); + priv = POPPLER_ATTACHMENT_GET_PRIVATE (attachment); + + if (emb_file->getFileName ()) + attachment->name = _poppler_goo_string_to_utf8 (emb_file->getFileName ()); + if (emb_file->getDescription ()) + attachment->description = _poppler_goo_string_to_utf8 (emb_file->getDescription ()); + + embFile = emb_file->getEmbeddedFile(); + attachment->size = embFile->size (); + + if (embFile->createDate ()) + _poppler_convert_pdf_date_to_gtime (embFile->createDate (), (time_t *)&attachment->ctime); + if (embFile->modDate ()) + _poppler_convert_pdf_date_to_gtime (embFile->modDate (), (time_t *)&attachment->mtime); + + if (embFile->checksum () && embFile->checksum ()->getLength () > 0) + attachment->checksum = g_string_new_len (embFile->checksum ()->getCString (), + embFile->checksum ()->getLength ()); + priv->obj_stream = new Object(); + priv->obj_stream->initStream(embFile->stream()); + // Copy the stream + embFile->stream()->incRef(); + + return attachment; +} + +static gboolean +save_helper (const gchar *buf, + gsize count, + gpointer data, + GError **error) +{ + FILE *f = (FILE *) data; + gsize n; + + n = fwrite (buf, 1, count, f); + if (n != count) + { + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + _("Error writing to image file: %s"), + g_strerror (errno)); + return FALSE; + } + + return TRUE; +} + +/** + * poppler_attachment_save: + * @attachment: A #PopplerAttachment. + * @filename: name of file to save + * @error: (allow-none): return location for error, or %NULL. + * + * Saves @attachment to a file indicated by @filename. If @error is set, %FALSE + * will be returned. Possible errors include those in the #G_FILE_ERROR domain + * and whatever the save function generates. + * + * Return value: %TRUE, if the file successfully saved + **/ +gboolean +poppler_attachment_save (PopplerAttachment *attachment, + const char *filename, + GError **error) +{ + gboolean result; + FILE *f; + + g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE); + + f = g_fopen (filename, "wb"); + + if (f == NULL) + { + gchar *display_name = g_filename_display_name (filename); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + _("Failed to open '%s' for writing: %s"), + display_name, + g_strerror (errno)); + g_free (display_name); + return FALSE; + } + + result = poppler_attachment_save_to_callback (attachment, save_helper, f, error); + + if (fclose (f) < 0) + { + gchar *display_name = g_filename_display_name (filename); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + _("Failed to close '%s', all data may not have been saved: %s"), + display_name, + g_strerror (errno)); + g_free (display_name); + return FALSE; + } + + return result; +} + +#define BUF_SIZE 1024 + +/** + * poppler_attachment_save_to_callback: + * @attachment: A #PopplerAttachment. + * @save_func: (scope call): a function that is called to save each block of data that the save routine generates. + * @user_data: user data to pass to the save function. + * @error: (allow-none): return location for error, or %NULL. + * + * Saves @attachment by feeding the produced data to @save_func. Can be used + * when you want to store the attachment to something other than a file, such as + * an in-memory buffer or a socket. If @error is set, %FALSE will be + * returned. Possible errors include those in the #G_FILE_ERROR domain and + * whatever the save function generates. + * + * Return value: %TRUE, if the save successfully completed + **/ +gboolean +poppler_attachment_save_to_callback (PopplerAttachment *attachment, + PopplerAttachmentSaveFunc save_func, + gpointer user_data, + GError **error) +{ + Stream *stream; + gchar buf[BUF_SIZE]; + int i; + gboolean eof_reached = FALSE; + + g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE); + + stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream->getStream(); + stream->reset(); + + do + { + int data; + + for (i = 0; i < BUF_SIZE; i++) + { + data = stream->getChar (); + if (data == EOF) + { + eof_reached = TRUE; + break; + } + buf[i] = data; + } + + if (i > 0) + { + if (! (save_func) (buf, i, user_data, error)) + return FALSE; + } + } + while (! eof_reached); + + + return TRUE; +} diff --git a/glib/poppler-attachment.h b/glib/poppler-attachment.h new file mode 100644 index 0000000..e87971e --- /dev/null +++ b/glib/poppler-attachment.h @@ -0,0 +1,87 @@ +/* poppler-attachment.h: glib interface to poppler + * Copyright (C) 2004, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_ATTACHMENT_H__ +#define __POPPLER_ATTACHMENT_H__ + +#include <glib.h> +#include <glib-object.h> + +#include "poppler.h" + +G_BEGIN_DECLS + + +#define POPPLER_TYPE_ATTACHMENT (poppler_attachment_get_type ()) +#define POPPLER_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachment)) +#define POPPLER_IS_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ATTACHMENT)) + + +/** + * PopplerAttachmentSaveFunc: + * @buf: (array length=count) (element-type guint8): buffer containing + * bytes to be written. + * @count: number of bytes in @buf. + * @data: (closure): user data passed to poppler_attachment_save_to_callback() + * @error: GError to set on error, or %NULL + * + * Specifies the type of the function passed to + * poppler_attachment_save_to_callback(). It is called once for each block of + * bytes that is "written" by poppler_attachment_save_to_callback(). If + * successful it should return %TRUE. If an error occurs it should set + * @error and return %FALSE, in which case poppler_attachment_save_to_callback() + * will fail with the same error. + * + * @Returns: %TRUE if successful, %FALSE (with @error set) if failed. + */ +typedef gboolean (*PopplerAttachmentSaveFunc) (const gchar *buf, + gsize count, + gpointer data, + GError **error); + +struct _PopplerAttachment +{ + GObject parent; + + gchar *name; + gchar *description; + gsize size; + GTime mtime; + GTime ctime; + GString *checksum; +}; + +typedef struct _PopplerAttachmentClass +{ + GObjectClass parent_class; +} PopplerAttachmentClass; + + +GType poppler_attachment_get_type (void) G_GNUC_CONST; +gboolean poppler_attachment_save (PopplerAttachment *attachment, + const char *filename, + GError **error); +gboolean poppler_attachment_save_to_callback (PopplerAttachment *attachment, + PopplerAttachmentSaveFunc save_func, + gpointer user_data, + GError **error); + + +G_END_DECLS + +#endif /* __POPPLER_ATTACHMENT_H__ */ diff --git a/glib/poppler-date.cc b/glib/poppler-date.cc new file mode 100644 index 0000000..e3141c1 --- /dev/null +++ b/glib/poppler-date.cc @@ -0,0 +1,68 @@ +/* poppler-date.cc: glib interface to poppler + * + * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <DateInfo.h> + +#include "poppler-date.h" + +/** + * poppler_date_parse: + * @date: string to parse + * @timet: an uninitialized #time_t + * + * Parses a PDF format date string and converts it to a #time_t. Returns #FALSE + * if the parsing fails or the input string is not a valid PDF format date string + * + * Return value: #TRUE, if @timet was set + * + * Since: 0.12 + **/ +gboolean +poppler_date_parse (const gchar *date, + time_t *timet) +{ + gint year, mon, day, hour, min, sec, tz_hour, tz_minute; + gchar tz; + struct tm time; + time_t retval; + + /* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */ + // TODO do something with the timezone information + if (!parseDateString (date, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute)) + return FALSE; + + time.tm_year = year - 1900; + time.tm_mon = mon - 1; + time.tm_mday = day; + time.tm_hour = hour; + time.tm_min = min; + time.tm_sec = sec; + time.tm_wday = -1; + time.tm_yday = -1; + time.tm_isdst = -1; /* 0 = DST off, 1 = DST on, -1 = don't know */ + + /* compute tm_wday and tm_yday and check date */ + retval = mktime (&time); + if (retval == (time_t) - 1) + return FALSE; + + *timet = retval; + + return TRUE; +} diff --git a/glib/poppler-date.h b/glib/poppler-date.h new file mode 100644 index 0000000..2bb52b2 --- /dev/null +++ b/glib/poppler-date.h @@ -0,0 +1,30 @@ +/* poppler-date.h: glib interface to poppler + * + * Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_DATE_H__ +#define __POPPLER_DATE_H__ + +#include "poppler.h" + +G_BEGIN_DECLS +gboolean poppler_date_parse (const gchar *date, + time_t *timet); +G_END_DECLS + +#endif /* __POPPLER_DATE_H__ */ diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc new file mode 100644 index 0000000..24badd9 --- /dev/null +++ b/glib/poppler-document.cc @@ -0,0 +1,2601 @@ +/* poppler-document.cc: glib wrapper for poppler + * Copyright (C) 2005, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include <string.h> + +#ifndef __GI_SCANNER__ +#include <goo/GooList.h> +#include <splash/SplashBitmap.h> +#include <GlobalParams.h> +#include <PDFDoc.h> +#include <Outline.h> +#include <ErrorCodes.h> +#include <UnicodeMap.h> +#include <GfxState.h> +#include <SplashOutputDev.h> +#include <Stream.h> +#include <FontInfo.h> +#include <PDFDocEncoding.h> +#include <OptionalContent.h> +#endif + +#include "poppler.h" +#include "poppler-private.h" +#include "poppler-enums.h" + +/** + * SECTION:poppler-document + * @short_description: Information about a document + * @title: PopplerDocument + * + * The #PopplerDocument is an object used to refer to a main document. + */ + +enum { + PROP_0, + PROP_TITLE, + PROP_FORMAT, + PROP_FORMAT_MAJOR, + PROP_FORMAT_MINOR, + PROP_AUTHOR, + PROP_SUBJECT, + PROP_KEYWORDS, + PROP_CREATOR, + PROP_PRODUCER, + PROP_CREATION_DATE, + PROP_MOD_DATE, + PROP_LINEARIZED, + PROP_PAGE_LAYOUT, + PROP_PAGE_MODE, + PROP_VIEWER_PREFERENCES, + PROP_PERMISSIONS, + PROP_METADATA +}; + +static void poppler_document_layers_free (PopplerDocument *document); + +typedef struct _PopplerDocumentClass PopplerDocumentClass; +struct _PopplerDocumentClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerDocument, poppler_document, G_TYPE_OBJECT) + +static PopplerDocument * +_poppler_document_new_from_pdfdoc (PDFDoc *newDoc, + GError **error) +{ + PopplerDocument *document; + + if (!newDoc->isOk()) { + int fopen_errno; + switch (newDoc->getErrorCode()) + { + case errOpenFile: + // If there was an error opening the file, count it as a G_FILE_ERROR + // and set the GError parameters accordingly. (this assumes that the + // only way to get an errOpenFile error is if newDoc was created using + // a filename and thus fopen was called, which right now is true. + fopen_errno = newDoc->getFopenErrno(); + g_set_error (error, G_FILE_ERROR, + g_file_error_from_errno (fopen_errno), + "%s", g_strerror (fopen_errno)); + break; + case errBadCatalog: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_BAD_CATALOG, + "Failed to read the document catalog"); + break; + case errDamaged: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_DAMAGED, + "PDF document is damaged"); + break; + case errEncrypted: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_ENCRYPTED, + "Document is encrypted"); + break; + default: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_INVALID, + "Failed to load document"); + } + + delete newDoc; + return NULL; + } + + document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, NULL); + document->doc = newDoc; + + document->output_dev = new CairoOutputDev (); + document->output_dev->startDoc(document->doc); + + return document; +} + +static GooString * +poppler_password_to_latin1 (const gchar *password) +{ + gchar *password_latin; + GooString *password_g; + + if (!password) + return NULL; + + password_latin = g_convert(password, -1, "ISO-8859-1", "UTF-8", + NULL, NULL, NULL); + password_g = new GooString (password_latin); + g_free (password_latin); + + return password_g; +} + +/** + * poppler_document_new_from_file: + * @uri: uri of the file to load + * @password: (allow-none): password to unlock the file with, or %NULL + * @error: (allow-none): Return location for an error, or %NULL + * + * Creates a new #PopplerDocument. If %NULL is returned, then @error will be + * set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR + * domains. + * + * Return value: A newly created #PopplerDocument, or %NULL + **/ +PopplerDocument * +poppler_document_new_from_file (const char *uri, + const char *password, + GError **error) +{ + PDFDoc *newDoc; + GooString *filename_g; + GooString *password_g; + char *filename; + + if (!globalParams) { + globalParams = new GlobalParams(); + } + + filename = g_filename_from_uri (uri, NULL, error); + if (!filename) + return NULL; + + password_g = poppler_password_to_latin1(password); + +#ifdef G_OS_WIN32 + wchar_t *filenameW; + int length; + + length = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); + + filenameW = new WCHAR[length]; + if (!filenameW) + return NULL; + + length = MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, length); + + newDoc = new PDFDoc(filenameW, length, password_g, password_g); + delete [] filenameW; +#else + filename_g = new GooString (filename); + newDoc = new PDFDoc(filename_g, password_g, password_g); +#endif + g_free (filename); + + delete password_g; + + return _poppler_document_new_from_pdfdoc (newDoc, error); +} + +/** + * poppler_document_new_from_data: + * @data: the pdf data contained in a char array + * @length: the length of #data + * @password: (allow-none): password to unlock the file with, or %NULL + * @error: (allow-none): Return location for an error, or %NULL + * + * Creates a new #PopplerDocument. If %NULL is returned, then @error will be + * set. Possible errors include those in the #POPPLER_ERROR and #G_FILE_ERROR + * domains. + * + * Return value: A newly created #PopplerDocument, or %NULL + **/ +PopplerDocument * +poppler_document_new_from_data (char *data, + int length, + const char *password, + GError **error) +{ + Object obj; + PDFDoc *newDoc; + MemStream *str; + GooString *password_g; + + if (!globalParams) { + globalParams = new GlobalParams(); + } + + // create stream + obj.initNull(); + str = new MemStream(data, 0, length, &obj); + + password_g = poppler_password_to_latin1(password); + newDoc = new PDFDoc(str, password_g, password_g); + delete password_g; + + return _poppler_document_new_from_pdfdoc (newDoc, error); +} + +static gboolean +handle_save_error (int err_code, + GError **error) +{ + switch (err_code) + { + case errNone: + break; + case errOpenFile: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_OPEN_FILE, + "Failed to open file for writing"); + break; + case errEncrypted: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_ENCRYPTED, + "Document is encrypted"); + break; + default: + g_set_error (error, POPPLER_ERROR, + POPPLER_ERROR_INVALID, + "Failed to save document"); + } + + return err_code == errNone; +} + +/** + * poppler_document_save: + * @document: a #PopplerDocument + * @uri: uri of file to save + * @error: (allow-none): return location for an error, or %NULL + * + * Saves @document. Any change made in the document such as + * form fields filled, annotations added or modified + * will be saved. + * If @error is set, %FALSE will be returned. Possible errors + * include those in the #G_FILE_ERROR domain. + * + * Return value: %TRUE, if the document was successfully saved + **/ +gboolean +poppler_document_save (PopplerDocument *document, + const char *uri, + GError **error) +{ + char *filename; + gboolean retval = FALSE; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE); + + filename = g_filename_from_uri (uri, NULL, error); + if (filename != NULL) { + GooString *fname = new GooString (filename); + int err_code; + g_free (filename); + + err_code = document->doc->saveAs (fname); + retval = handle_save_error (err_code, error); + delete fname; + } + + return retval; +} + +/** + * poppler_document_save_a_copy: + * @document: a #PopplerDocument + * @uri: uri of file to save + * @error: (allow-none): return location for an error, or %NULL + * + * Saves a copy of the original @document. + * Any change made in the document such as + * form fields filled by the user will not be saved. + * If @error is set, %FALSE will be returned. Possible errors + * include those in the #G_FILE_ERROR domain. + * + * Return value: %TRUE, if the document was successfully saved + **/ +gboolean +poppler_document_save_a_copy (PopplerDocument *document, + const char *uri, + GError **error) +{ + char *filename; + gboolean retval = FALSE; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE); + + filename = g_filename_from_uri (uri, NULL, error); + if (filename != NULL) { + GooString *fname = new GooString (filename); + int err_code; + g_free (filename); + + err_code = document->doc->saveWithoutChangesAs (fname); + retval = handle_save_error (err_code, error); + delete fname; + } + + return retval; +} + +static void +poppler_document_finalize (GObject *object) +{ + PopplerDocument *document = POPPLER_DOCUMENT (object); + + poppler_document_layers_free (document); + delete document->output_dev; + delete document->doc; +} + +/** + * poppler_document_get_id: + * @document: A #PopplerDocument + * @permanent_id: (out) (allow-none): location to store an allocated string, use g_free() to free the returned string + * @update_id: (out) (allow-none): location to store an allocated string, use g_free() to free the returned string + * + * Returns the PDF file identifier represented as two byte string arrays of size 32. + * @permanent_id is the permanent identifier that is built based on the file + * contents at the time it was originally created, so that this identifer + * never changes. @update_id is the update identifier that is built based on + * the file contents at the time it was last updated. + * + * Note that returned strings are not null-terminated, they have a fixed + * size of 32 bytes. + * + * Returns: %TRUE if the @document contains an id, %FALSE otherwise + * + * Since: 0.16 + */ +gboolean +poppler_document_get_id (PopplerDocument *document, + gchar **permanent_id, + gchar **update_id) +{ + GooString permanent; + GooString update; + gboolean retval = FALSE; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE); + + if (permanent_id) + *permanent_id = NULL; + if (update_id) + *update_id = NULL; + + if (document->doc->getID (permanent_id ? &permanent : NULL, update_id ? &update : NULL)) { + if (permanent_id) + *permanent_id = (gchar *)g_memdup (permanent.getCString(), 32); + if (update_id) + *update_id = (gchar *)g_memdup (update.getCString(), 32); + + retval = TRUE; + } + + return retval; +} + +/** + * poppler_document_get_n_pages: + * @document: A #PopplerDocument + * + * Returns the number of pages in a loaded document. + * + * Return value: Number of pages + **/ +int +poppler_document_get_n_pages (PopplerDocument *document) +{ + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), 0); + + return document->doc->getNumPages(); +} + +/** + * poppler_document_get_page: + * @document: A #PopplerDocument + * @index: a page index + * + * Returns the #PopplerPage indexed at @index. This object is owned by the + * caller. + * + * Return value: (transfer full) : The #PopplerPage at @index + **/ +PopplerPage * +poppler_document_get_page (PopplerDocument *document, + int index) +{ + Page *page; + + g_return_val_if_fail (0 <= index && + index < poppler_document_get_n_pages (document), + NULL); + + page = document->doc->getPage (index + 1); + if (!page) return NULL; + + return _poppler_page_new (document, page, index); +} + +/** + * poppler_document_get_page_by_label: + * @document: A #PopplerDocument + * @label: a page label + * + * Returns the #PopplerPage reference by @label. This object is owned by the + * caller. @label is a human-readable string representation of the page number, + * and can be document specific. Typically, it is a value such as "iii" or "3". + * + * By default, "1" refers to the first page. + * + * Return value: (transfer full) :The #PopplerPage referenced by @label + **/ +PopplerPage * +poppler_document_get_page_by_label (PopplerDocument *document, + const char *label) +{ + Catalog *catalog; + GooString label_g(label); + int index; + + catalog = document->doc->getCatalog(); + if (!catalog->labelToIndex (&label_g, &index)) + return NULL; + + return poppler_document_get_page (document, index); +} + +/** + * poppler_document_get_n_attachments: + * @document: A #PopplerDocument + * + * Returns the number of attachments in a loaded document. + * See also poppler_document_get_attachments() + * + * Return value: Number of attachments + * + * Since: 0.18 + */ +guint +poppler_document_get_n_attachments (PopplerDocument *document) +{ + Catalog *catalog; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), 0); + + catalog = document->doc->getCatalog (); + + return catalog && catalog->isOk () ? catalog->numEmbeddedFiles () : 0; +} + +/** + * poppler_document_has_attachments: + * @document: A #PopplerDocument + * + * Returns %TRUE of @document has any attachments. + * + * Return value: %TRUE, if @document has attachments. + **/ +gboolean +poppler_document_has_attachments (PopplerDocument *document) +{ + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE); + + return (poppler_document_get_n_attachments (document) != 0); +} + +/** + * poppler_document_get_attachments: + * @document: A #PopplerDocument + * + * Returns a #GList containing #PopplerAttachment<!-- -->s. These attachments + * are unowned, and must be unreffed, and the list must be freed with + * g_list_free(). + * + * Return value: (element-type PopplerAttachment) (transfer full): a list of available attachments. + **/ +GList * +poppler_document_get_attachments (PopplerDocument *document) +{ + Catalog *catalog; + int n_files, i; + GList *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + catalog = document->doc->getCatalog (); + if (catalog == NULL || ! catalog->isOk ()) + return NULL; + + n_files = catalog->numEmbeddedFiles (); + for (i = 0; i < n_files; i++) + { + PopplerAttachment *attachment; + FileSpec *emb_file; + + emb_file = catalog->embeddedFile (i); + if (!emb_file->isOk () || !emb_file->getEmbeddedFile()->isOk()) { + delete emb_file; + continue; + } + + attachment = _poppler_attachment_new (emb_file); + delete emb_file; + + retval = g_list_prepend (retval, attachment); + } + return g_list_reverse (retval); +} + +/** + * poppler_document_find_dest: + * @document: A #PopplerDocument + * @link_name: a named destination + * + * Finds named destination @link_name in @document + * + * Return value: The #PopplerDest destination or %NULL if + * @link_name is not a destination. Returned value must + * be freed with #poppler_dest_free + **/ +PopplerDest * +poppler_document_find_dest (PopplerDocument *document, + const gchar *link_name) +{ + PopplerDest *dest = NULL; + LinkDest *link_dest = NULL; + GooString *g_link_name; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + g_return_val_if_fail (link_name != NULL, NULL); + + g_link_name = new GooString (link_name); + + if (g_link_name) { + link_dest = document->doc->findDest (g_link_name); + delete g_link_name; + } + + if (link_dest) { + dest = _poppler_dest_new_goto (document, link_dest); + delete link_dest; + } + + return dest; +} + +char *_poppler_goo_string_to_utf8(GooString *s) +{ + char *result; + + if (s->hasUnicodeMarker()) { + result = g_convert (s->getCString () + 2, + s->getLength () - 2, + "UTF-8", "UTF-16BE", NULL, NULL, NULL); + } else { + int len; + gunichar *ucs4_temp; + int i; + + len = s->getLength (); + ucs4_temp = g_new (gunichar, len + 1); + for (i = 0; i < len; ++i) { + ucs4_temp[i] = pdfDocEncoding[(unsigned char)s->getChar(i)]; + } + ucs4_temp[i] = 0; + + result = g_ucs4_to_utf8 (ucs4_temp, -1, NULL, NULL, NULL); + + g_free (ucs4_temp); + } + + return result; +} + +static gchar * +info_dict_get_string (Dict *info_dict, const gchar *key) +{ + Object obj; + GooString *goo_value; + gchar *result; + + if (!info_dict->lookup ((gchar *)key, &obj)->isString ()) { + obj.free (); + return NULL; + } + + goo_value = obj.getString (); + result = _poppler_goo_string_to_utf8(goo_value); + obj.free (); + + return result; +} + +static time_t +info_dict_get_date (Dict *info_dict, const gchar *key) +{ + Object obj; + time_t result; + + if (!info_dict->lookup ((gchar *)key, &obj)->isString ()) { + obj.free (); + return (time_t)-1; + } + + if (!_poppler_convert_pdf_date_to_gtime (obj.getString (), &result)) + result = (time_t)-1; + obj.free (); + + return result; +} + +static PopplerPageLayout +convert_page_layout (Catalog::PageLayout pageLayout) +{ + switch (pageLayout) + { + case Catalog::pageLayoutSinglePage: + return POPPLER_PAGE_LAYOUT_SINGLE_PAGE; + case Catalog::pageLayoutOneColumn: + return POPPLER_PAGE_LAYOUT_ONE_COLUMN; + case Catalog::pageLayoutTwoColumnLeft: + return POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT; + case Catalog::pageLayoutTwoColumnRight: + return POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT; + case Catalog::pageLayoutTwoPageLeft: + return POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT; + case Catalog::pageLayoutTwoPageRight: + return POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT; + case Catalog::pageLayoutNone: + default: + return POPPLER_PAGE_LAYOUT_UNSET; + } +} + +static PopplerPageMode +convert_page_mode (Catalog::PageMode pageMode) +{ + switch (pageMode) + { + case Catalog::pageModeOutlines: + return POPPLER_PAGE_MODE_USE_OUTLINES; + case Catalog::pageModeThumbs: + return POPPLER_PAGE_MODE_USE_THUMBS; + case Catalog::pageModeFullScreen: + return POPPLER_PAGE_MODE_FULL_SCREEN; + case Catalog::pageModeOC: + return POPPLER_PAGE_MODE_USE_OC; + case Catalog::pageModeAttach: + return POPPLER_PAGE_MODE_USE_ATTACHMENTS; + case Catalog::pageModeNone: + default: + return POPPLER_PAGE_MODE_UNSET; + } +} + +/** + * poppler_document_get_pdf_version_string: + * @document: A #PopplerDocument + * + * Returns the PDF version of @document as a string (e.g. PDF-1.6) + * + * Return value: a new allocated string containing the PDF version + * of @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_pdf_version_string (PopplerDocument *document) +{ + gchar *retval; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + retval = g_strndup ("PDF-", 15); /* allocates 16 chars, pads with \0s */ + g_ascii_formatd (retval + 4, 15 + 1 - 4, "%.2g", + document->doc->getPDFMajorVersion () + document->doc->getPDFMinorVersion() / 10.0); + return retval; +} + +/** + * poppler_document_get_pdf_version: + * @document: A #PopplerDocument + * @major_version: (out) (allow-none): return location for the PDF major version number + * @minor_version: (out) (allow-none): return location for the PDF minor version number + * + * Returns: the major and minor PDF version numbers + * + * Since: 0.16 + **/ +void +poppler_document_get_pdf_version (PopplerDocument *document, + guint *major_version, + guint *minor_version) +{ + g_return_if_fail (POPPLER_IS_DOCUMENT (document)); + + if (major_version) + *major_version = document->doc->getPDFMajorVersion (); + if (minor_version) + *minor_version = document->doc->getPDFMinorVersion(); +} + +/** + * poppler_document_get_title: + * @document: A #PopplerDocument + * + * Returns the document's title + * + * Return value: a new allocated string containing the title + * of @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_title (PopplerDocument *document) +{ + Object obj; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_string (obj.getDict(), "Title"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_author: + * @document: A #PopplerDocument + * + * Returns the author of the document + * + * Return value: a new allocated string containing the author + * of @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_author (PopplerDocument *document) +{ + Object obj; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_string (obj.getDict(), "Author"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_subject: + * @document: A #PopplerDocument + * + * Returns the subject of the document + * + * Return value: a new allocated string containing the subject + * of @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_subject (PopplerDocument *document) +{ + Object obj; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_string (obj.getDict(), "Subject"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_keywords: + * @document: A #PopplerDocument + * + * Returns the keywords associated to the document + * + * Return value: a new allocated string containing keywords associated + * to @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_keywords (PopplerDocument *document) +{ + Object obj; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_string (obj.getDict(), "Keywords"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_creator: + * @document: A #PopplerDocument + * + * Returns the creator of the document. If the document was converted + * from another format, the creator is the name of the product + * that created the original document from which it was converted. + * + * Return value: a new allocated string containing the creator + * of @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_creator (PopplerDocument *document) +{ + Object obj; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_string (obj.getDict(), "Creator"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_producer: + * @document: A #PopplerDocument + * + * Returns the producer of the document. If the document was converted + * from another format, the producer is the name of the product + * that converted it to PDF + * + * Return value: a new allocated string containing the producer + * of @document, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_producer (PopplerDocument *document) +{ + Object obj; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_string (obj.getDict(), "Producer"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_creation_date: + * @document: A #PopplerDocument + * + * Returns the date the document was created as seconds since the Epoch + * + * Return value: the date the document was created, or -1 + * + * Since: 0.16 + **/ +time_t +poppler_document_get_creation_date (PopplerDocument *document) +{ + Object obj; + time_t retval = (time_t)-1; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), (time_t)-1); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_date (obj.getDict(), "CreationDate"); + obj.free (); + + return retval; +} + +/** + * poppler_document_get_modification_date: + * @document: A #PopplerDocument + * + * Returns the date the document was most recently modified as seconds since the Epoch + * + * Return value: the date the document was most recently modified, or -1 + * + * Since: 0.16 + **/ +time_t +poppler_document_get_modification_date (PopplerDocument *document) +{ + Object obj; + time_t retval = (time_t)-1; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), (time_t)-1); + + document->doc->getDocInfo (&obj); + if (obj.isDict ()) + retval = info_dict_get_date (obj.getDict(), "ModDate"); + obj.free (); + + return retval; +} + +/** + * poppler_document_is_linearized: + * @document: A #PopplerDocument + * + * Returns whether @document is linearized or not. Linearization of PDF + * enables efficient incremental access of the PDF file in a network environment. + * + * Return value: %TRUE if @document is linearized, %FALSE otherwhise + * + * Since: 0.16 + **/ +gboolean +poppler_document_is_linearized (PopplerDocument *document) +{ + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE); + + return document->doc->isLinearized (); +} + +/** + * poppler_document_get_page_layout: + * @document: A #PopplerDocument + * + * Returns the page layout that should be used when the document is opened + * + * Return value: a #PopplerPageLayout that should be used when the document is opened + * + * Since: 0.16 + **/ +PopplerPageLayout +poppler_document_get_page_layout (PopplerDocument *document) +{ + Catalog *catalog; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), POPPLER_PAGE_LAYOUT_UNSET); + + catalog = document->doc->getCatalog (); + if (catalog && catalog->isOk ()) + return convert_page_layout (catalog->getPageLayout ()); + + return POPPLER_PAGE_LAYOUT_UNSET; +} + +/** + * poppler_document_get_page_mode: + * @document: A #PopplerDocument + * + * Returns a #PopplerPageMode representing how the document should + * be initially displayed when opened. + * + * Return value: a #PopplerPageMode that should be used when document is opened + * + * Since: 0.16 + **/ +PopplerPageMode +poppler_document_get_page_mode (PopplerDocument *document) +{ + Catalog *catalog; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), POPPLER_PAGE_MODE_UNSET); + + catalog = document->doc->getCatalog (); + if (catalog && catalog->isOk ()) + return convert_page_mode (catalog->getPageMode ()); + + return POPPLER_PAGE_MODE_UNSET; +} + +/** + * poppler_document_get_permissions: + * @document: A #PopplerDocument + * + * Returns the flags specifying which operations are permitted when the document is opened. + * + * Return value: a set of falgs from #PopplerPermissions enumeration + * + * Since: 0.16 + **/ +PopplerPermissions +poppler_document_get_permissions (PopplerDocument *document) +{ + guint flag = 0; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), POPPLER_PERMISSIONS_FULL); + + if (document->doc->okToPrint ()) + flag |= POPPLER_PERMISSIONS_OK_TO_PRINT; + if (document->doc->okToChange ()) + flag |= POPPLER_PERMISSIONS_OK_TO_MODIFY; + if (document->doc->okToCopy ()) + flag |= POPPLER_PERMISSIONS_OK_TO_COPY; + if (document->doc->okToAddNotes ()) + flag |= POPPLER_PERMISSIONS_OK_TO_ADD_NOTES; + if (document->doc->okToFillForm ()) + flag |= POPPLER_PERMISSIONS_OK_TO_FILL_FORM; + if (document->doc->okToAccessibility()) + flag |= POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS; + if (document->doc->okToAssemble()) + flag |= POPPLER_PERMISSIONS_OK_TO_ASSEMBLE; + if (document->doc->okToPrintHighRes()) + flag |= POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION; + + return (PopplerPermissions)flag; +} + +/** + * poppler_document_get_metadata: + * @document: A #PopplerDocument + * + * Returns the XML metadata string of the document + * + * Return value: a new allocated string containing the XML + * metadata, or %NULL + * + * Since: 0.16 + **/ +gchar * +poppler_document_get_metadata (PopplerDocument *document) +{ + Catalog *catalog; + gchar *retval = NULL; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + catalog = document->doc->getCatalog (); + if (catalog && catalog->isOk ()) { + GooString *s = catalog->readMetadata (); + + if (s != NULL) { + retval = g_strdup (s->getCString()); + delete s; + } + } + + return retval; +} + +static void +poppler_document_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + PopplerDocument *document = POPPLER_DOCUMENT (object); + guint version; + + switch (prop_id) + { + case PROP_TITLE: + g_value_take_string (value, poppler_document_get_title (document)); + break; + case PROP_FORMAT: + g_value_take_string (value, poppler_document_get_pdf_version_string (document)); + break; + case PROP_FORMAT_MAJOR: + poppler_document_get_pdf_version (document, &version, NULL); + g_value_set_uint (value, version); + break; + case PROP_FORMAT_MINOR: + poppler_document_get_pdf_version (document, NULL, &version); + g_value_set_uint (value, version); + break; + case PROP_AUTHOR: + g_value_take_string (value, poppler_document_get_author (document)); + break; + case PROP_SUBJECT: + g_value_take_string (value, poppler_document_get_subject (document)); + break; + case PROP_KEYWORDS: + g_value_take_string (value, poppler_document_get_keywords (document)); + break; + case PROP_CREATOR: + g_value_take_string (value, poppler_document_get_creator (document)); + break; + case PROP_PRODUCER: + g_value_take_string (value, poppler_document_get_producer (document)); + break; + case PROP_CREATION_DATE: + g_value_set_int (value, poppler_document_get_creation_date (document)); + break; + case PROP_MOD_DATE: + g_value_set_int (value, poppler_document_get_modification_date (document)); + break; + case PROP_LINEARIZED: + g_value_set_boolean (value, poppler_document_is_linearized (document)); + break; + case PROP_PAGE_LAYOUT: + g_value_set_enum (value, poppler_document_get_page_layout (document)); + break; + case PROP_PAGE_MODE: + g_value_set_enum (value, poppler_document_get_page_mode (document)); + break; + case PROP_VIEWER_PREFERENCES: + /* FIXME: write... */ + g_value_set_flags (value, POPPLER_VIEWER_PREFERENCES_UNSET); + break; + case PROP_PERMISSIONS: + g_value_set_flags (value, poppler_document_get_permissions (document)); + break; + case PROP_METADATA: + g_value_take_string (value, poppler_document_get_metadata (document)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +poppler_document_class_init (PopplerDocumentClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_document_finalize; + gobject_class->get_property = poppler_document_get_property; + + /** + * PopplerDocument:title: + * + * The document's title or %NULL + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_TITLE, + g_param_spec_string ("title", + "Document Title", + "The title of the document", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:format: + * + * The PDF version as string. See also poppler_document_get_pdf_version_string() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_FORMAT, + g_param_spec_string ("format", + "PDF Format", + "The PDF version of the document", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:format-major: + * + * The PDF major version number. See also poppler_document_get_pdf_version() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_FORMAT_MAJOR, + g_param_spec_uint ("format-major", + "PDF Format Major", + "The PDF major version number of the document", + 0, G_MAXUINT, 1, + G_PARAM_READABLE)); + + /** + * PopplerDocument:format-minor: + * + * The PDF minor version number. See also poppler_document_get_pdf_version() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_FORMAT_MINOR, + g_param_spec_uint ("format-minor", + "PDF Format Minor", + "The PDF minor version number of the document", + 0, G_MAXUINT, 0, + G_PARAM_READABLE)); + + /** + * PopplerDocument:author: + * + * The author of the document + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_AUTHOR, + g_param_spec_string ("author", + "Author", + "The author of the document", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:subject: + * + * The subject of the document + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_SUBJECT, + g_param_spec_string ("subject", + "Subject", + "Subjects the document touches", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:keywords: + * + * The keywords associated to the document + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_KEYWORDS, + g_param_spec_string ("keywords", + "Keywords", + "Keywords", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:creator: + * + * The creator of the document. See also poppler_document_get_creator() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_CREATOR, + g_param_spec_string ("creator", + "Creator", + "The software that created the document", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:producer: + * + * The producer of the document. See also poppler_document_get_producer() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PRODUCER, + g_param_spec_string ("producer", + "Producer", + "The software that converted the document", + NULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:creation-date: + * + * The date the document was created as seconds since the Epoch, or -1 + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_CREATION_DATE, + g_param_spec_int ("creation-date", + "Creation Date", + "The date and time the document was created", + -1, G_MAXINT, -1, + G_PARAM_READABLE)); + + /** + * PopplerDocument:mod-date: + * + * The date the document was most recently modified as seconds since the Epoch, or -1 + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_MOD_DATE, + g_param_spec_int ("mod-date", + "Modification Date", + "The date and time the document was modified", + -1, G_MAXINT, -1, + G_PARAM_READABLE)); + + /** + * PopplerDocument:linearized: + * + * Whether document is linearized. See also poppler_document_is_linearized() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_LINEARIZED, + g_param_spec_boolean ("linearized", + "Fast Web View Enabled", + "Is the document optimized for web viewing?", + FALSE, + G_PARAM_READABLE)); + + /** + * PopplerDocument:page-layout: + * + * The page layout that should be used when the document is opened + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PAGE_LAYOUT, + g_param_spec_enum ("page-layout", + "Page Layout", + "Initial Page Layout", + POPPLER_TYPE_PAGE_LAYOUT, + POPPLER_PAGE_LAYOUT_UNSET, + G_PARAM_READABLE)); + + /** + * PopplerDocument:page-mode: + * + * The mode that should be used when the document is opened + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PAGE_MODE, + g_param_spec_enum ("page-mode", + "Page Mode", + "Page Mode", + POPPLER_TYPE_PAGE_MODE, + POPPLER_PAGE_MODE_UNSET, + G_PARAM_READABLE)); + + /** + * PopplerDocument:viewer-preferences: + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_VIEWER_PREFERENCES, + g_param_spec_flags ("viewer-preferences", + "Viewer Preferences", + "Viewer Preferences", + POPPLER_TYPE_VIEWER_PREFERENCES, + POPPLER_VIEWER_PREFERENCES_UNSET, + G_PARAM_READABLE)); + + /** + * PopplerDocument:permissions: + * + * Flags specifying which operations are permitted when the document is opened + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_PERMISSIONS, + g_param_spec_flags ("permissions", + "Permissions", + "Permissions", + POPPLER_TYPE_PERMISSIONS, + POPPLER_PERMISSIONS_FULL, + G_PARAM_READABLE)); + + /** + * PopplerDocument:metadata: + * + * Document metadata in XML format, or %NULL + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_METADATA, + g_param_spec_string ("metadata", + "XML Metadata", + "Embedded XML metadata", + NULL, + G_PARAM_READABLE)); +} + +static void +poppler_document_init (PopplerDocument *document) +{ +} + +/* PopplerIndexIter: For determining the index of a tree */ +struct _PopplerIndexIter +{ + PopplerDocument *document; + GooList *items; + int index; +}; + + +POPPLER_DEFINE_BOXED_TYPE (PopplerIndexIter, poppler_index_iter, + poppler_index_iter_copy, + poppler_index_iter_free) + +/** + * poppler_index_iter_copy: + * @iter: a #PopplerIndexIter + * + * Creates a new #PopplerIndexIter as a copy of @iter. This must be freed with + * poppler_index_iter_free(). + * + * Return value: a new #PopplerIndexIter + **/ +PopplerIndexIter * +poppler_index_iter_copy (PopplerIndexIter *iter) +{ + PopplerIndexIter *new_iter; + + g_return_val_if_fail (iter != NULL, NULL); + + new_iter = g_slice_dup (PopplerIndexIter, iter); + new_iter->document = (PopplerDocument *) g_object_ref (new_iter->document); + + return new_iter; +} + +/** + * poppler_index_iter_new: + * @document: a #PopplerDocument + * + * Returns the root #PopplerIndexIter for @document, or %NULL. This must be + * freed with poppler_index_iter_free(). + * + * Certain documents have an index associated with them. This index can be used + * to help the user navigate the document, and is similar to a table of + * contents. Each node in the index will contain a #PopplerAction that can be + * displayed to the user — typically a #POPPLER_ACTION_GOTO_DEST or a + * #POPPLER_ACTION_URI<!-- -->. + * + * Here is a simple example of some code that walks the full index: + * + * <informalexample><programlisting> + * static void + * walk_index (PopplerIndexIter *iter) + * { + * do + * { + * /<!-- -->* Get the the action and do something with it *<!-- -->/ + * PopplerIndexIter *child = poppler_index_iter_get_child (iter); + * if (child) + * walk_index (child); + * poppler_index_iter_free (child); + * } + * while (poppler_index_iter_next (iter)); + * } + * ... + * { + * iter = poppler_index_iter_new (document); + * walk_index (iter); + * poppler_index_iter_free (iter); + * } + *</programlisting></informalexample> + * + * Return value: a new #PopplerIndexIter + **/ +PopplerIndexIter * +poppler_index_iter_new (PopplerDocument *document) +{ + PopplerIndexIter *iter; + Outline *outline; + GooList *items; + + outline = document->doc->getOutline(); + if (outline == NULL) + return NULL; + + items = outline->getItems(); + if (items == NULL) + return NULL; + + iter = g_slice_new (PopplerIndexIter); + iter->document = (PopplerDocument *) g_object_ref (document); + iter->items = items; + iter->index = 0; + + return iter; +} + +/** + * poppler_index_iter_get_child: + * @parent: a #PopplerIndexIter + * + * Returns a newly created child of @parent, or %NULL if the iter has no child. + * See poppler_index_iter_new() for more information on this function. + * + * Return value: a new #PopplerIndexIter + **/ +PopplerIndexIter * +poppler_index_iter_get_child (PopplerIndexIter *parent) +{ + PopplerIndexIter *child; + OutlineItem *item; + + g_return_val_if_fail (parent != NULL, NULL); + + item = (OutlineItem *)parent->items->get (parent->index); + item->open (); + if (! (item->hasKids() && item->getKids()) ) + return NULL; + + child = g_slice_new0 (PopplerIndexIter); + child->document = (PopplerDocument *)g_object_ref (parent->document); + child->items = item->getKids (); + + g_assert (child->items); + + return child; +} + +static gchar * +unicode_to_char (Unicode *unicode, + int len) +{ + static UnicodeMap *uMap = NULL; + if (uMap == NULL) { + GooString *enc = new GooString("UTF-8"); + uMap = globalParams->getUnicodeMap(enc); + uMap->incRefCnt (); + delete enc; + } + + GooString gstr; + gchar buf[8]; /* 8 is enough for mapping an unicode char to a string */ + int i, n; + + for (i = 0; i < len; ++i) { + n = uMap->mapUnicode(unicode[i], buf, sizeof(buf)); + gstr.append(buf, n); + } + + return g_strdup (gstr.getCString ()); +} + +/** + * poppler_index_iter_is_open: + * @iter: a #PopplerIndexIter + * + * Returns whether this node should be expanded by default to the user. The + * document can provide a hint as to how the document's index should be expanded + * initially. + * + * Return value: %TRUE, if the document wants @iter to be expanded + **/ +gboolean +poppler_index_iter_is_open (PopplerIndexIter *iter) +{ + OutlineItem *item; + + item = (OutlineItem *)iter->items->get (iter->index); + + return item->isOpen(); +} + +/** + * poppler_index_iter_get_action: + * @iter: a #PopplerIndexIter + * + * Returns the #PopplerAction associated with @iter. It must be freed with + * poppler_action_free(). + * + * Return value: a new #PopplerAction + **/ +PopplerAction * +poppler_index_iter_get_action (PopplerIndexIter *iter) +{ + OutlineItem *item; + LinkAction *link_action; + PopplerAction *action; + gchar *title; + + g_return_val_if_fail (iter != NULL, NULL); + + item = (OutlineItem *)iter->items->get (iter->index); + link_action = item->getAction (); + + title = unicode_to_char (item->getTitle(), + item->getTitleLength ()); + + action = _poppler_action_new (iter->document, link_action, title); + g_free (title); + + return action; +} + +/** + * poppler_index_iter_next: + * @iter: a #PopplerIndexIter + * + * Sets @iter to point to the next action at the current level, if valid. See + * poppler_index_iter_new() for more information. + * + * Return value: %TRUE, if @iter was set to the next action + **/ +gboolean +poppler_index_iter_next (PopplerIndexIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + iter->index++; + if (iter->index >= iter->items->getLength()) + return FALSE; + + return TRUE; +} + +/** + * poppler_index_iter_free: + * @iter: a #PopplerIndexIter + * + * Frees @iter. + **/ +void +poppler_index_iter_free (PopplerIndexIter *iter) +{ + if (G_UNLIKELY (iter == NULL)) + return; + + g_object_unref (iter->document); + g_slice_free (PopplerIndexIter, iter); +} + +struct _PopplerFontsIter +{ + GooList *items; + int index; +}; + +POPPLER_DEFINE_BOXED_TYPE (PopplerFontsIter, poppler_fonts_iter, + poppler_fonts_iter_copy, + poppler_fonts_iter_free) + +/** + * poppler_fonts_iter_get_full_name: + * @iter: a #PopplerFontsIter + * + * Returns the full name of the font associated with @iter + * + * Returns: the font full name + */ +const char * +poppler_fonts_iter_get_full_name (PopplerFontsIter *iter) +{ + GooString *name; + FontInfo *info; + + info = (FontInfo *)iter->items->get (iter->index); + + name = info->getName(); + if (name != NULL) { + return info->getName()->getCString(); + } else { + return NULL; + } +} + +/** + * poppler_fonts_iter_get_name: + * @iter: a #PopplerFontsIter + * + * Returns the name of the font associated with @iter + * + * Returns: the font name + */ +const char * +poppler_fonts_iter_get_name (PopplerFontsIter *iter) +{ + FontInfo *info; + const char *name; + + name = poppler_fonts_iter_get_full_name (iter); + info = (FontInfo *)iter->items->get (iter->index); + + if (info->getSubset() && name) { + while (*name && *name != '+') + name++; + + if (*name) + name++; + } + + return name; +} + +/** + * poppler_fonts_iter_get_substitute_name: + * @iter: a #PopplerFontsIter + * + * The name of the substitute font of the font associated with @iter or %NULL if + * the font is embedded + * + * Returns: the name of the substitute font or %NULL if font is embedded + * + * Since: 0.20 + */ +const char * +poppler_fonts_iter_get_substitute_name (PopplerFontsIter *iter) +{ + GooString *name; + FontInfo *info; + + info = (FontInfo *)iter->items->get (iter->index); + + name = info->getSubstituteName(); + if (name != NULL) { + return name->getCString(); + } else { + return NULL; + } +} + +/** + * poppler_fonts_iter_get_file_name: + * @iter: a #PopplerFontsIter + * + * The filename of the font associated with @iter or %NULL if + * the font is embedded + * + * Returns: the filename of the font or %NULL if font is embedded + */ +const char * +poppler_fonts_iter_get_file_name (PopplerFontsIter *iter) +{ + GooString *file; + FontInfo *info; + + info = (FontInfo *)iter->items->get (iter->index); + + file = info->getFile(); + if (file != NULL) { + return file->getCString(); + } else { + return NULL; + } +} + +/** + * poppler_fonts_iter_get_font_type: + * @iter: a #PopplerFontsIter + * + * Returns the type of the font associated with @iter + * + * Returns: the font type + */ +PopplerFontType +poppler_fonts_iter_get_font_type (PopplerFontsIter *iter) +{ + FontInfo *info; + + g_return_val_if_fail (iter != NULL, POPPLER_FONT_TYPE_UNKNOWN); + + info = (FontInfo *)iter->items->get (iter->index); + + return (PopplerFontType)info->getType (); +} + +/** + * poppler_fonts_iter_get_encoding: + * @iter: a #PopplerFontsIter + * + * Returns the encoding of the font associated with @iter + * + * Returns: the font encoding + * + * Since: 0.20 + */ +const char * +poppler_fonts_iter_get_encoding (PopplerFontsIter *iter) +{ + GooString *encoding; + FontInfo *info; + + info = (FontInfo *)iter->items->get (iter->index); + + encoding = info->getEncoding(); + if (encoding != NULL) { + return encoding->getCString(); + } else { + return NULL; + } +} + +/** + * poppler_fonts_iter_is_embedded: + * @iter: a #PopplerFontsIter + * + * Returns whether the font associated with @iter is embedded in the document + * + * Returns: %TRUE if font is emebdded, %FALSE otherwise + */ +gboolean +poppler_fonts_iter_is_embedded (PopplerFontsIter *iter) +{ + FontInfo *info; + + info = (FontInfo *)iter->items->get (iter->index); + + return info->getEmbedded(); +} + +/** + * poppler_fonts_iter_is_subset: + * @iter: a #PopplerFontsIter + * + * Returns whether the font associated with @iter is a subset of another font + * + * Returns: %TRUE if font is a subset, %FALSE otherwise + */ +gboolean +poppler_fonts_iter_is_subset (PopplerFontsIter *iter) +{ + FontInfo *info; + + info = (FontInfo *)iter->items->get (iter->index); + + return info->getSubset(); +} + +/** + * poppler_fonts_iter_next: + * @iter: a #PopplerFontsIter + * + * Sets @iter to point to the next font + * + * Returns: %TRUE, if @iter was set to the next font + **/ +gboolean +poppler_fonts_iter_next (PopplerFontsIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + iter->index++; + if (iter->index >= iter->items->getLength()) + return FALSE; + + return TRUE; +} + +/** + * poppler_fonts_iter_copy: + * @iter: a #PopplerFontsIter to copy + * + * Creates a copy of @iter + * + * Returns: a new allocated copy of @iter + */ +PopplerFontsIter * +poppler_fonts_iter_copy (PopplerFontsIter *iter) +{ + PopplerFontsIter *new_iter; + + g_return_val_if_fail (iter != NULL, NULL); + + new_iter = g_slice_dup (PopplerFontsIter, iter); + + new_iter->items = new GooList (); + for (int i = 0; i < iter->items->getLength(); i++) { + FontInfo *info = (FontInfo *)iter->items->get(i); + new_iter->items->append (new FontInfo (*info)); + } + + return new_iter; +} + +/** + * poppler_fonts_iter_free: + * @iter: a #PopplerFontsIter + * + * Frees the given #PopplerFontsIter + */ +void +poppler_fonts_iter_free (PopplerFontsIter *iter) +{ + if (G_UNLIKELY (iter == NULL)) + return; + + deleteGooList (iter->items, FontInfo); + + g_slice_free (PopplerFontsIter, iter); +} + +static PopplerFontsIter * +poppler_fonts_iter_new (GooList *items) +{ + PopplerFontsIter *iter; + + iter = g_slice_new (PopplerFontsIter); + iter->items = items; + iter->index = 0; + + return iter; +} + + +typedef struct _PopplerFontInfoClass PopplerFontInfoClass; +struct _PopplerFontInfoClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerFontInfo, poppler_font_info, G_TYPE_OBJECT) + +static void poppler_font_info_finalize (GObject *object); + + +static void +poppler_font_info_class_init (PopplerFontInfoClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_font_info_finalize; +} + +static void +poppler_font_info_init (PopplerFontInfo *font_info) +{ + font_info->document = NULL; + font_info->scanner = NULL; +} + +static void +poppler_font_info_finalize (GObject *object) +{ + PopplerFontInfo *font_info = POPPLER_FONT_INFO (object); + + delete font_info->scanner; + g_object_unref (font_info->document); +} + +/** + * poppler_font_info_new: + * @document: a #PopplerDocument + * + * Creates a new #PopplerFontInfo object + * + * Returns: a new #PopplerFontInfo instance + */ +PopplerFontInfo * +poppler_font_info_new (PopplerDocument *document) +{ + PopplerFontInfo *font_info; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + font_info = (PopplerFontInfo *) g_object_new (POPPLER_TYPE_FONT_INFO, + NULL); + font_info->document = (PopplerDocument *) g_object_ref (document); + font_info->scanner = new FontInfoScanner(document->doc); + + return font_info; +} + +/** + * poppler_font_info_scan: + * @font_info: a #PopplerFontInfo + * @n_pages: number of pages to scan + * @iter: (out): return location for a #PopplerFontsIter + * + * Scans the document associated with @font_info for fonts. At most + * @n_pages will be scanned starting from the current iterator. @iter will + * point to the first font scanned. + * + * Here is a simple example of code to scan fonts in a document + * + * <informalexample><programlisting> + * font_info = poppler_font_info_new (document); + * while (poppler_font_info_scan (font_info, 20, &fonts_iter)) { + * if (!fonts_iter) + * continue; /<!-- -->* No fonts found in these 20 pages *<!-- -->/ + * do { + * /<!-- -->* Do something with font iter *<!-- -->/ + * g_print ("Font Name: %s\n", poppler_fonts_iter_get_name (fonts_iter)); + * } while (poppler_fonts_iter_next (fonts_iter)); + * poppler_fonts_iter_free (fonts_iter); + * } + * </programlisting></informalexample> + * + * Returns: %TRUE, if there are more fonts left to scan + */ +gboolean +poppler_font_info_scan (PopplerFontInfo *font_info, + int n_pages, + PopplerFontsIter **iter) +{ + GooList *items; + + g_return_val_if_fail (iter != NULL, FALSE); + + items = font_info->scanner->scan(n_pages); + + if (items == NULL) { + *iter = NULL; + } else if (items->getLength() == 0) { + *iter = NULL; + delete items; + } else { + *iter = poppler_fonts_iter_new(items); + } + + return (items != NULL); +} + +/* For backward compatibility */ +void +poppler_font_info_free (PopplerFontInfo *font_info) +{ + g_return_if_fail (font_info != NULL); + + g_object_unref (font_info); +} + + +/* Optional content (layers) */ +static Layer * +layer_new (OptionalContentGroup *oc) +{ + Layer *layer; + + layer = g_slice_new0 (Layer); + layer->oc = oc; + + return layer; +} + +static void +layer_free (Layer *layer) +{ + if (G_UNLIKELY (!layer)) + return; + + if (layer->kids) { + g_list_foreach (layer->kids, (GFunc)layer_free, NULL); + g_list_free (layer->kids); + } + + if (layer->label) { + g_free (layer->label); + } + + g_slice_free (Layer, layer); +} + +static GList * +get_optional_content_rbgroups (OCGs *ocg) +{ + Array *rb; + GList *groups = NULL; + + rb = ocg->getRBGroupsArray (); + + if (rb) { + int i, j; + + for (i = 0; i < rb->getLength (); ++i) { + Object obj; + Array *rb_array; + GList *group = NULL; + + rb->get (i, &obj); + if (!obj.isArray ()) { + obj.free (); + continue; + } + + rb_array = obj.getArray (); + for (j = 0; j < rb_array->getLength (); ++j) { + Object ref; + OptionalContentGroup *oc; + + rb_array->getNF (j, &ref); + if (!ref.isRef ()) { + ref.free (); + continue; + } + + oc = ocg->findOcgByRef (ref.getRef ()); + group = g_list_prepend (group, oc); + ref.free (); + } + obj.free (); + + groups = g_list_prepend (groups, group); + } + } + + return groups; +} + +GList * +_poppler_document_get_layer_rbgroup (PopplerDocument *document, + Layer *layer) +{ + GList *l; + + for (l = document->layers_rbgroups; l && l->data; l = g_list_next (l)) { + GList *group = (GList *)l->data; + + if (g_list_find (group, layer->oc)) + return group; + } + + return NULL; +} + +static GList * +get_optional_content_items_sorted (OCGs *ocg, Layer *parent, Array *order) +{ + GList *items = NULL; + Layer *last_item = parent; + int i; + + for (i = 0; i < order->getLength (); ++i) { + Object orderItem; + + order->get (i, &orderItem); + + if (orderItem.isDict ()) { + Object ref; + + order->getNF (i, &ref); + if (ref.isRef ()) { + OptionalContentGroup *oc = ocg->findOcgByRef (ref.getRef ()); + Layer *layer = layer_new (oc); + + items = g_list_prepend (items, layer); + last_item = layer; + } + ref.free (); + } else if (orderItem.isArray () && orderItem.arrayGetLength () > 0) { + if (!last_item) { + last_item = layer_new (NULL); + items = g_list_prepend (items, last_item); + } + last_item->kids = get_optional_content_items_sorted (ocg, last_item, orderItem.getArray ()); + last_item = NULL; + } else if (orderItem.isString ()) { + last_item->label = _poppler_goo_string_to_utf8 (orderItem.getString ()); + } + orderItem.free (); + } + + return g_list_reverse (items); +} + +static GList * +get_optional_content_items (OCGs *ocg) +{ + Array *order; + GList *items = NULL; + + order = ocg->getOrderArray (); + + if (order) { + items = get_optional_content_items_sorted (ocg, NULL, order); + } else { + GooList *ocgs; + int i; + + ocgs = ocg->getOCGs (); + + for (i = 0; i < ocgs->getLength (); ++i) { + OptionalContentGroup *oc = (OptionalContentGroup *) ocgs->get (i); + Layer *layer = layer_new (oc); + + items = g_list_prepend (items, layer); + } + + items = g_list_reverse (items); + } + + return items; +} + +GList * +_poppler_document_get_layers (PopplerDocument *document) +{ + if (!document->layers) { + Catalog *catalog = document->doc->getCatalog (); + OCGs *ocg = catalog->getOptContentConfig (); + + if (!ocg) + return NULL; + + document->layers = get_optional_content_items (ocg); + document->layers_rbgroups = get_optional_content_rbgroups (ocg); + } + + return document->layers; +} + +static void +poppler_document_layers_free (PopplerDocument *document) +{ + if (G_UNLIKELY (!document->layers)) + return; + + g_list_foreach (document->layers, (GFunc)layer_free, NULL); + g_list_free (document->layers); + + g_list_foreach (document->layers_rbgroups, (GFunc)g_list_free, NULL); + g_list_free (document->layers_rbgroups); + + document->layers = NULL; + document->layers_rbgroups = NULL; +} + +/* PopplerLayersIter */ +struct _PopplerLayersIter { + PopplerDocument *document; + GList *items; + int index; +}; + +POPPLER_DEFINE_BOXED_TYPE (PopplerLayersIter, poppler_layers_iter, + poppler_layers_iter_copy, + poppler_layers_iter_free) + +/** + * poppler_layers_iter_copy: + * @iter: a #PopplerLayersIter + * + * Creates a new #PopplerLayersIter as a copy of @iter. This must be freed with + * poppler_layers_iter_free(). + * + * Return value: a new #PopplerLayersIter + * + * Since 0.12 + **/ +PopplerLayersIter * +poppler_layers_iter_copy (PopplerLayersIter *iter) +{ + PopplerLayersIter *new_iter; + + g_return_val_if_fail (iter != NULL, NULL); + + new_iter = g_slice_dup (PopplerLayersIter, iter); + new_iter->document = (PopplerDocument *) g_object_ref (new_iter->document); + + return new_iter; +} + +/** + * poppler_layers_iter_free: + * @iter: a #PopplerLayersIter + * + * Frees @iter. + * + * Since: 0.12 + **/ +void +poppler_layers_iter_free (PopplerLayersIter *iter) +{ + if (G_UNLIKELY (iter == NULL)) + return; + + g_object_unref (iter->document); + g_slice_free (PopplerLayersIter, iter); +} + +/** + * poppler_layers_iter_new: + * @document: a #PopplerDocument + * + * Since: 0.12 + **/ +PopplerLayersIter * +poppler_layers_iter_new (PopplerDocument *document) +{ + PopplerLayersIter *iter; + GList *items; + + items = _poppler_document_get_layers (document); + + if (!items) + return NULL; + + iter = g_slice_new0 (PopplerLayersIter); + iter->document = (PopplerDocument *)g_object_ref (document); + iter->items = items; + + return iter; +} + +/** + * poppler_layers_iter_get_child: + * @parent: a #PopplerLayersIter + * + * Returns a newly created child of @parent, or %NULL if the iter has no child. + * See poppler_layers_iter_new() for more information on this function. + * + * Return value: a new #PopplerLayersIter, or %NULL + * + * Since: 0.12 + **/ +PopplerLayersIter * +poppler_layers_iter_get_child (PopplerLayersIter *parent) +{ + PopplerLayersIter *child; + Layer *layer; + + g_return_val_if_fail (parent != NULL, NULL); + + layer = (Layer *) g_list_nth_data (parent->items, parent->index); + if (!layer || !layer->kids) + return NULL; + + child = g_slice_new0 (PopplerLayersIter); + child->document = (PopplerDocument *)g_object_ref (parent->document); + child->items = layer->kids; + + g_assert (child->items); + + return child; +} + +/** + * poppler_layers_iter_get_title: + * @iter: a #PopplerLayersIter + * + * Returns the title associated with @iter. It must be freed with + * g_free(). + * + * Return value: a new string containing the @iter's title or %NULL if @iter doesn't have a title. + * The returned string should be freed with g_free() when no longer needed. + * + * Since: 0.12 + **/ +gchar * +poppler_layers_iter_get_title (PopplerLayersIter *iter) +{ + Layer *layer; + + g_return_val_if_fail (iter != NULL, NULL); + + layer = (Layer *)g_list_nth_data (iter->items, iter->index); + + return layer->label ? g_strdup (layer->label) : NULL; +} + +/** + * poppler_layers_iter_get_layer: + * @iter: a #PopplerLayersIter + * + * Returns the #PopplerLayer associated with @iter. + * + * Return value: (transfer full): a new #PopplerLayer, or %NULL if + * there isn't any layer associated with @iter + * + * Since: 0.12 + **/ +PopplerLayer * +poppler_layers_iter_get_layer (PopplerLayersIter *iter) +{ + Layer *layer; + PopplerLayer *poppler_layer = NULL; + + g_return_val_if_fail (iter != NULL, NULL); + + layer = (Layer *)g_list_nth_data (iter->items, iter->index); + if (layer->oc) { + GList *rb_group = NULL; + + rb_group = _poppler_document_get_layer_rbgroup (iter->document, layer); + poppler_layer = _poppler_layer_new (iter->document, layer, rb_group); + } + + return poppler_layer; +} + +/** + * poppler_layers_iter_next: + * @iter: a #PopplerLayersIter + * + * Sets @iter to point to the next action at the current level, if valid. See + * poppler_layers_iter_new() for more information. + * + * Return value: %TRUE, if @iter was set to the next action + * + * Since: 0.12 + **/ +gboolean +poppler_layers_iter_next (PopplerLayersIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + iter->index++; + if (iter->index >= (gint)g_list_length (iter->items)) + return FALSE; + + return TRUE; +} + +typedef struct _PopplerPSFileClass PopplerPSFileClass; +struct _PopplerPSFileClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerPSFile, poppler_ps_file, G_TYPE_OBJECT) + +static void poppler_ps_file_finalize (GObject *object); + + +static void +poppler_ps_file_class_init (PopplerPSFileClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_ps_file_finalize; +} + +static void +poppler_ps_file_init (PopplerPSFile *ps_file) +{ + ps_file->out = NULL; + ps_file->paper_width = -1; + ps_file->paper_height = -1; + ps_file->duplex = FALSE; +} + +static void +poppler_ps_file_finalize (GObject *object) +{ + PopplerPSFile *ps_file = POPPLER_PS_FILE (object); + + delete ps_file->out; + g_object_unref (ps_file->document); + g_free (ps_file->filename); +} + +/** + * poppler_ps_file_new: + * @document: a #PopplerDocument + * @filename: the path of the output filename + * @first_page: the first page to print + * @n_pages: the number of pages to print + * + * Create a new postscript file to render to + * + * Return value: a PopplerPSFile + **/ +PopplerPSFile * +poppler_ps_file_new (PopplerDocument *document, const char *filename, + int first_page, int n_pages) +{ + PopplerPSFile *ps_file; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (n_pages > 0, NULL); + + ps_file = (PopplerPSFile *) g_object_new (POPPLER_TYPE_PS_FILE, NULL); + ps_file->document = (PopplerDocument *) g_object_ref (document); + ps_file->filename = g_strdup (filename); + ps_file->first_page = first_page + 1; + ps_file->last_page = first_page + 1 + n_pages - 1; + + return ps_file; +} + +/** + * poppler_ps_file_set_paper_size: + * @ps_file: a PopplerPSFile which was not yet printed to. + * @width: the paper width in 1/72 inch + * @height: the paper height in 1/72 inch + * + * Set the output paper size. These values will end up in the + * DocumentMedia, the BoundingBox DSC comments and other places in the + * generated PostScript. + * + **/ +void +poppler_ps_file_set_paper_size (PopplerPSFile *ps_file, + double width, double height) +{ + g_return_if_fail (ps_file->out == NULL); + + ps_file->paper_width = width; + ps_file->paper_height = height; +} + +/** + * poppler_ps_file_set_duplex: + * @ps_file: a PopplerPSFile which was not yet printed to + * @duplex: whether to force duplex printing (on printers which support this) + * + * Enable or disable Duplex printing. + * + **/ +void +poppler_ps_file_set_duplex (PopplerPSFile *ps_file, gboolean duplex) +{ + g_return_if_fail (ps_file->out == NULL); + + ps_file->duplex = duplex; +} + +/** + * poppler_ps_file_free: + * @ps_file: a PopplerPSFile + * + * Frees @ps_file + * + **/ +void +poppler_ps_file_free (PopplerPSFile *ps_file) +{ + g_return_if_fail (ps_file != NULL); + g_object_unref (ps_file); +} + +/** + * poppler_document_get_form_field: + * @document: a #PopplerDocument + * @id: an id of a #PopplerFormField + * + * Returns the #PopplerFormField for the given @id. It must be freed with + * g_object_unref() + * + * Return value: (transfer full): a new #PopplerFormField or %NULL if + * not found + **/ +PopplerFormField * +poppler_document_get_form_field (PopplerDocument *document, + gint id) +{ + Page *page; + unsigned pageNum; + unsigned fieldNum; + FormPageWidgets *widgets; + FormWidget *field; + + FormWidget::decodeID (id, &pageNum, &fieldNum); + + page = document->doc->getPage (pageNum); + if (!page) + return NULL; + + widgets = page->getFormWidgets (); + if (!widgets) + return NULL; + + field = widgets->getWidget (fieldNum); + if (field) + return _poppler_form_field_new (document, field); + + return NULL; +} + +gboolean +_poppler_convert_pdf_date_to_gtime (GooString *date, + time_t *gdate) +{ + gchar *date_string; + gboolean retval; + + if (date->hasUnicodeMarker()) { + date_string = g_convert (date->getCString () + 2, + date->getLength () - 2, + "UTF-8", "UTF-16BE", NULL, NULL, NULL); + } else { + date_string = g_strndup (date->getCString (), date->getLength ()); + } + + retval = poppler_date_parse (date_string, gdate); + g_free (date_string); + + return retval; +} diff --git a/glib/poppler-document.h b/glib/poppler-document.h new file mode 100644 index 0000000..7051830 --- /dev/null +++ b/glib/poppler-document.h @@ -0,0 +1,289 @@ +/* poppler-document.h: glib interface to poppler + * Copyright (C) 2004, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_DOCUMENT_H__ +#define __POPPLER_DOCUMENT_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +#define POPPLER_TYPE_DOCUMENT (poppler_document_get_type ()) +#define POPPLER_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_DOCUMENT, PopplerDocument)) +#define POPPLER_IS_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_DOCUMENT)) + +/** + * PopplerPageLayout: + * @POPPLER_PAGE_LAYOUT_UNSET: no specific layout set + * @POPPLER_PAGE_LAYOUT_SINGLE_PAGE: one page at a time + * @POPPLER_PAGE_LAYOUT_ONE_COLUMN: pages in one column + * @POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT: pages in two columns with odd numbered pages on the left + * @POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT: pages in two columns with odd numbered pages on the right + * @POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT: two pages at a time with odd numbered pages on the left + * @POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT: two pages at a time with odd numbered pages on the right + * + * Page layout types + */ +typedef enum +{ + POPPLER_PAGE_LAYOUT_UNSET, + POPPLER_PAGE_LAYOUT_SINGLE_PAGE, + POPPLER_PAGE_LAYOUT_ONE_COLUMN, + POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT, + POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT, + POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT, + POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT +} PopplerPageLayout; + +/** + * PopplerPageMode: + * @POPPLER_PAGE_MODE_UNSET: no specific mode set + * @POPPLER_PAGE_MODE_NONE: neither document outline nor thumbnails visible + * @POPPLER_PAGE_MODE_USE_OUTLINES: document outline visible + * @POPPLER_PAGE_MODE_USE_THUMBS: thumbnails visible + * @POPPLER_PAGE_MODE_FULL_SCREEN: full-screen mode + * @POPPLER_PAGE_MODE_USE_OC: layers panel visible + * @POPPLER_PAGE_MODE_USE_ATTACHMENTS: attachments panel visible + * + * Page modes + */ +typedef enum +{ + POPPLER_PAGE_MODE_UNSET, + POPPLER_PAGE_MODE_NONE, + POPPLER_PAGE_MODE_USE_OUTLINES, + POPPLER_PAGE_MODE_USE_THUMBS, + POPPLER_PAGE_MODE_FULL_SCREEN, + POPPLER_PAGE_MODE_USE_OC, + POPPLER_PAGE_MODE_USE_ATTACHMENTS +} PopplerPageMode; + +/** + * PopplerFontType: + * @POPPLER_FONT_TYPE_UNKNOWN: unknown font type + * @POPPLER_FONT_TYPE_TYPE1: Type 1 font type + * @POPPLER_FONT_TYPE_TYPE1C: Type 1 font type embedded in Compact Font Format (CFF) font program + * @POPPLER_FONT_TYPE_TYPE1COT: Type 1 font type embedded in OpenType font program + * @POPPLER_FONT_TYPE_TYPE3: A font type that is defined with PDF graphics operators + * @POPPLER_FONT_TYPE_TRUETYPE: TrueType font type + * @POPPLER_FONT_TYPE_TRUETYPEOT: TrueType font type embedded in OpenType font program + * @POPPLER_FONT_TYPE_CID_TYPE0: CIDFont type based on Type 1 font technology + * @POPPLER_FONT_TYPE_CID_TYPE0C: CIDFont type based on Type 1 font technology embedded in CFF font program + * @POPPLER_FONT_TYPE_CID_TYPE0COT: CIDFont type based on Type 1 font technology embedded in OpenType font program + * @POPPLER_FONT_TYPE_CID_TYPE2: CIDFont type based on TrueType font technology + * @POPPLER_FONT_TYPE_CID_TYPE2OT: CIDFont type based on TrueType font technology embedded in OpenType font program + * + * Font types + */ +typedef enum +{ + POPPLER_FONT_TYPE_UNKNOWN, + POPPLER_FONT_TYPE_TYPE1, + POPPLER_FONT_TYPE_TYPE1C, + POPPLER_FONT_TYPE_TYPE1COT, + POPPLER_FONT_TYPE_TYPE3, + POPPLER_FONT_TYPE_TRUETYPE, + POPPLER_FONT_TYPE_TRUETYPEOT, + POPPLER_FONT_TYPE_CID_TYPE0, + POPPLER_FONT_TYPE_CID_TYPE0C, + POPPLER_FONT_TYPE_CID_TYPE0COT, + POPPLER_FONT_TYPE_CID_TYPE2, + POPPLER_FONT_TYPE_CID_TYPE2OT +} PopplerFontType; + +/** + * PopplerViewerPreferences: + * @POPPLER_VIEWER_PREFERENCES_UNSET: no preferences set + * @POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR: hider toolbars when document is active + * @POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR: hide menu bar when document is active + * @POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI: hide UI elements in document's window + * @POPPLER_VIEWER_PREFERENCES_FIT_WINDOW: resize document's window to fit the size of the first displayed page + * @POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW: position the document's window in the center of the screen + * @POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE: display document title in window's title bar + * @POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL: the predominant reading order for text is right to left + * + * Viewer preferences + */ +typedef enum /*< flags >*/ +{ + POPPLER_VIEWER_PREFERENCES_UNSET = 0, + POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR = 1 << 0, + POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR = 1 << 1, + POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI = 1 << 2, + POPPLER_VIEWER_PREFERENCES_FIT_WINDOW = 1 << 3, + POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW = 1 << 4, + POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE = 1 << 5, + POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL = 1 << 6 +} PopplerViewerPreferences; + +/** + * PopplerPermissions: + * @POPPLER_PERMISSIONS_OK_TO_PRINT: document can be printer + * @POPPLER_PERMISSIONS_OK_TO_MODIFY: document contents can be modified + * @POPPLER_PERMISSIONS_OK_TO_COPY: document can be copied + * @POPPLER_PERMISSIONS_OK_TO_ADD_NOTES: annotations can added to the document + * @POPPLER_PERMISSIONS_OK_TO_FILL_FORM: interactive form fields can be filled in + * @POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS: extract text and graphics + * (in support of accessibility to users with disabilities or for other purposes). Since 0.18 + * @POPPLER_PERMISSIONS_OK_TO_ASSEMBLE: assemble the document (insert, rotate, or delete pages and create + * bookmarks or thumbnail images). Since 0.18 + * @POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION: document can be printer at high resolution. Since 0.18 + * @POPPLER_PERMISSIONS_FULL: document permits all operations + * + * Permissions + */ +typedef enum /*< flags >*/ +{ + POPPLER_PERMISSIONS_OK_TO_PRINT = 1 << 0, + POPPLER_PERMISSIONS_OK_TO_MODIFY = 1 << 1, + POPPLER_PERMISSIONS_OK_TO_COPY = 1 << 2, + POPPLER_PERMISSIONS_OK_TO_ADD_NOTES = 1 << 3, + POPPLER_PERMISSIONS_OK_TO_FILL_FORM = 1 << 4, + POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS = 1 << 5, + POPPLER_PERMISSIONS_OK_TO_ASSEMBLE = 1 << 6, + POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION = 1 << 7, + POPPLER_PERMISSIONS_FULL = (POPPLER_PERMISSIONS_OK_TO_PRINT | POPPLER_PERMISSIONS_OK_TO_MODIFY | POPPLER_PERMISSIONS_OK_TO_COPY | POPPLER_PERMISSIONS_OK_TO_ADD_NOTES | POPPLER_PERMISSIONS_OK_TO_FILL_FORM | POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS | POPPLER_PERMISSIONS_OK_TO_ASSEMBLE | POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION) + +} PopplerPermissions; + + + +GType poppler_document_get_type (void) G_GNUC_CONST; +PopplerDocument *poppler_document_new_from_file (const char *uri, + const char *password, + GError **error); +PopplerDocument *poppler_document_new_from_data (char *data, + int length, + const char *password, + GError **error); +gboolean poppler_document_save (PopplerDocument *document, + const char *uri, + GError **error); +gboolean poppler_document_save_a_copy (PopplerDocument *document, + const char *uri, + GError **error); +gboolean poppler_document_get_id (PopplerDocument *document, + gchar **permanent_id, + gchar **update_id); +int poppler_document_get_n_pages (PopplerDocument *document); +PopplerPage *poppler_document_get_page (PopplerDocument *document, + int index); +PopplerPage *poppler_document_get_page_by_label (PopplerDocument *document, + const char *label); +gchar *poppler_document_get_pdf_version_string (PopplerDocument *document); +void poppler_document_get_pdf_version (PopplerDocument *document, + guint *major_version, + guint *minor_version); +gchar *poppler_document_get_title (PopplerDocument *document); +gchar *poppler_document_get_author (PopplerDocument *document); +gchar *poppler_document_get_subject (PopplerDocument *document); +gchar *poppler_document_get_keywords (PopplerDocument *document); +gchar *poppler_document_get_creator (PopplerDocument *document); +gchar *poppler_document_get_producer (PopplerDocument *document); +time_t poppler_document_get_creation_date (PopplerDocument *document); +time_t poppler_document_get_modification_date (PopplerDocument *document); +gboolean poppler_document_is_linearized (PopplerDocument *document); +PopplerPageLayout poppler_document_get_page_layout (PopplerDocument *document); +PopplerPageMode poppler_document_get_page_mode (PopplerDocument *document); +PopplerPermissions poppler_document_get_permissions (PopplerDocument *document); +gchar *poppler_document_get_metadata (PopplerDocument *document); + +/* Attachments */ +guint poppler_document_get_n_attachments (PopplerDocument *document); +gboolean poppler_document_has_attachments (PopplerDocument *document); +GList *poppler_document_get_attachments (PopplerDocument *document); + +/* Links */ +PopplerDest *poppler_document_find_dest (PopplerDocument *document, + const gchar *link_name); + +/* Form */ +PopplerFormField *poppler_document_get_form_field (PopplerDocument *document, + gint id); + +/* Interface for getting the Index of a poppler_document */ +#define POPPLER_TYPE_INDEX_ITER (poppler_index_iter_get_type ()) +GType poppler_index_iter_get_type (void) G_GNUC_CONST; +PopplerIndexIter *poppler_index_iter_new (PopplerDocument *document); +PopplerIndexIter *poppler_index_iter_copy (PopplerIndexIter *iter); +void poppler_index_iter_free (PopplerIndexIter *iter); + +PopplerIndexIter *poppler_index_iter_get_child (PopplerIndexIter *parent); +gboolean poppler_index_iter_is_open (PopplerIndexIter *iter); +PopplerAction *poppler_index_iter_get_action (PopplerIndexIter *iter); +gboolean poppler_index_iter_next (PopplerIndexIter *iter); + +/* Interface for getting the Fonts of a poppler_document */ +#define POPPLER_TYPE_FONT_INFO (poppler_font_info_get_type ()) +#define POPPLER_FONT_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_FONT_INFO, PopplerFontInfo)) +#define POPPLER_IS_FONT_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_FONT_INFO)) +GType poppler_font_info_get_type (void) G_GNUC_CONST; +PopplerFontInfo *poppler_font_info_new (PopplerDocument *document); +gboolean poppler_font_info_scan (PopplerFontInfo *font_info, + int n_pages, + PopplerFontsIter **iter); +void poppler_font_info_free (PopplerFontInfo *font_info); + +#define POPPLER_TYPE_FONTS_ITER (poppler_fonts_iter_get_type ()) +GType poppler_fonts_iter_get_type (void) G_GNUC_CONST; +PopplerFontsIter *poppler_fonts_iter_copy (PopplerFontsIter *iter); +void poppler_fonts_iter_free (PopplerFontsIter *iter); +const char *poppler_fonts_iter_get_name (PopplerFontsIter *iter); +const char *poppler_fonts_iter_get_full_name (PopplerFontsIter *iter); +const char *poppler_fonts_iter_get_substitute_name (PopplerFontsIter *iter); +const char *poppler_fonts_iter_get_file_name (PopplerFontsIter *iter); +PopplerFontType poppler_fonts_iter_get_font_type (PopplerFontsIter *iter); +const char *poppler_fonts_iter_get_encoding (PopplerFontsIter *iter); +gboolean poppler_fonts_iter_is_embedded (PopplerFontsIter *iter); +gboolean poppler_fonts_iter_is_subset (PopplerFontsIter *iter); +gboolean poppler_fonts_iter_next (PopplerFontsIter *iter); + +/* Interface for getting the Layers of a poppler_document */ +#define POPPLER_TYPE_LAYERS_ITER (poppler_layers_iter_get_type ()) +GType poppler_layers_iter_get_type (void) G_GNUC_CONST; +PopplerLayersIter *poppler_layers_iter_new (PopplerDocument *document); +PopplerLayersIter *poppler_layers_iter_copy (PopplerLayersIter *iter); +void poppler_layers_iter_free (PopplerLayersIter *iter); + +PopplerLayersIter *poppler_layers_iter_get_child (PopplerLayersIter *parent); +gchar *poppler_layers_iter_get_title (PopplerLayersIter *iter); +PopplerLayer *poppler_layers_iter_get_layer (PopplerLayersIter *iter); +gboolean poppler_layers_iter_next (PopplerLayersIter *iter); + +/* Export to ps */ +#define POPPLER_TYPE_PS_FILE (poppler_ps_file_get_type ()) +#define POPPLER_PS_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_PS_FILE, PopplerPSFile)) +#define POPPLER_IS_PS_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_PS_FILE)) +GType poppler_ps_file_get_type (void) G_GNUC_CONST; +PopplerPSFile *poppler_ps_file_new (PopplerDocument *document, + const char *filename, + int first_page, + int n_pages); +void poppler_ps_file_set_paper_size (PopplerPSFile *ps_file, + double width, + double height); +void poppler_ps_file_set_duplex (PopplerPSFile *ps_file, + gboolean duplex); +void poppler_ps_file_free (PopplerPSFile *ps_file); + + + +G_END_DECLS + +#endif /* __POPPLER_DOCUMENT_H__ */ diff --git a/glib/poppler-enums.c b/glib/poppler-enums.c new file mode 100644 index 0000000..2c5dbe5 --- /dev/null +++ b/glib/poppler-enums.c @@ -0,0 +1,678 @@ + +/* Generated data (by glib-mkenums) */ + +#include <config.h> + +#include "poppler-enums.h" + +/* enumerations from "poppler-action.h" */ +#include "poppler-action.h" +GType +poppler_action_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ACTION_UNKNOWN, "POPPLER_ACTION_UNKNOWN", "unknown" }, + { POPPLER_ACTION_NONE, "POPPLER_ACTION_NONE", "none" }, + { POPPLER_ACTION_GOTO_DEST, "POPPLER_ACTION_GOTO_DEST", "goto-dest" }, + { POPPLER_ACTION_GOTO_REMOTE, "POPPLER_ACTION_GOTO_REMOTE", "goto-remote" }, + { POPPLER_ACTION_LAUNCH, "POPPLER_ACTION_LAUNCH", "launch" }, + { POPPLER_ACTION_URI, "POPPLER_ACTION_URI", "uri" }, + { POPPLER_ACTION_NAMED, "POPPLER_ACTION_NAMED", "named" }, + { POPPLER_ACTION_MOVIE, "POPPLER_ACTION_MOVIE", "movie" }, + { POPPLER_ACTION_RENDITION, "POPPLER_ACTION_RENDITION", "rendition" }, + { POPPLER_ACTION_OCG_STATE, "POPPLER_ACTION_OCG_STATE", "ocg-state" }, + { POPPLER_ACTION_JAVASCRIPT, "POPPLER_ACTION_JAVASCRIPT", "javascript" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerActionType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_dest_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_DEST_UNKNOWN, "POPPLER_DEST_UNKNOWN", "unknown" }, + { POPPLER_DEST_XYZ, "POPPLER_DEST_XYZ", "xyz" }, + { POPPLER_DEST_FIT, "POPPLER_DEST_FIT", "fit" }, + { POPPLER_DEST_FITH, "POPPLER_DEST_FITH", "fith" }, + { POPPLER_DEST_FITV, "POPPLER_DEST_FITV", "fitv" }, + { POPPLER_DEST_FITR, "POPPLER_DEST_FITR", "fitr" }, + { POPPLER_DEST_FITB, "POPPLER_DEST_FITB", "fitb" }, + { POPPLER_DEST_FITBH, "POPPLER_DEST_FITBH", "fitbh" }, + { POPPLER_DEST_FITBV, "POPPLER_DEST_FITBV", "fitbv" }, + { POPPLER_DEST_NAMED, "POPPLER_DEST_NAMED", "named" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerDestType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_action_movie_operation_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ACTION_MOVIE_PLAY, "POPPLER_ACTION_MOVIE_PLAY", "play" }, + { POPPLER_ACTION_MOVIE_PAUSE, "POPPLER_ACTION_MOVIE_PAUSE", "pause" }, + { POPPLER_ACTION_MOVIE_RESUME, "POPPLER_ACTION_MOVIE_RESUME", "resume" }, + { POPPLER_ACTION_MOVIE_STOP, "POPPLER_ACTION_MOVIE_STOP", "stop" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerActionMovieOperation"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_action_layer_action_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ACTION_LAYER_ON, "POPPLER_ACTION_LAYER_ON", "on" }, + { POPPLER_ACTION_LAYER_OFF, "POPPLER_ACTION_LAYER_OFF", "off" }, + { POPPLER_ACTION_LAYER_TOGGLE, "POPPLER_ACTION_LAYER_TOGGLE", "toggle" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerActionLayerAction"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/* enumerations from "poppler-document.h" */ +#include "poppler-document.h" +GType +poppler_page_layout_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_PAGE_LAYOUT_UNSET, "POPPLER_PAGE_LAYOUT_UNSET", "unset" }, + { POPPLER_PAGE_LAYOUT_SINGLE_PAGE, "POPPLER_PAGE_LAYOUT_SINGLE_PAGE", "single-page" }, + { POPPLER_PAGE_LAYOUT_ONE_COLUMN, "POPPLER_PAGE_LAYOUT_ONE_COLUMN", "one-column" }, + { POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT, "POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT", "two-column-left" }, + { POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT, "POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT", "two-column-right" }, + { POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT, "POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT", "two-page-left" }, + { POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT, "POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT", "two-page-right" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerPageLayout"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_page_mode_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_PAGE_MODE_UNSET, "POPPLER_PAGE_MODE_UNSET", "unset" }, + { POPPLER_PAGE_MODE_NONE, "POPPLER_PAGE_MODE_NONE", "none" }, + { POPPLER_PAGE_MODE_USE_OUTLINES, "POPPLER_PAGE_MODE_USE_OUTLINES", "use-outlines" }, + { POPPLER_PAGE_MODE_USE_THUMBS, "POPPLER_PAGE_MODE_USE_THUMBS", "use-thumbs" }, + { POPPLER_PAGE_MODE_FULL_SCREEN, "POPPLER_PAGE_MODE_FULL_SCREEN", "full-screen" }, + { POPPLER_PAGE_MODE_USE_OC, "POPPLER_PAGE_MODE_USE_OC", "use-oc" }, + { POPPLER_PAGE_MODE_USE_ATTACHMENTS, "POPPLER_PAGE_MODE_USE_ATTACHMENTS", "use-attachments" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerPageMode"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_font_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_FONT_TYPE_UNKNOWN, "POPPLER_FONT_TYPE_UNKNOWN", "unknown" }, + { POPPLER_FONT_TYPE_TYPE1, "POPPLER_FONT_TYPE_TYPE1", "type1" }, + { POPPLER_FONT_TYPE_TYPE1C, "POPPLER_FONT_TYPE_TYPE1C", "type1c" }, + { POPPLER_FONT_TYPE_TYPE1COT, "POPPLER_FONT_TYPE_TYPE1COT", "type1cot" }, + { POPPLER_FONT_TYPE_TYPE3, "POPPLER_FONT_TYPE_TYPE3", "type3" }, + { POPPLER_FONT_TYPE_TRUETYPE, "POPPLER_FONT_TYPE_TRUETYPE", "truetype" }, + { POPPLER_FONT_TYPE_TRUETYPEOT, "POPPLER_FONT_TYPE_TRUETYPEOT", "truetypeot" }, + { POPPLER_FONT_TYPE_CID_TYPE0, "POPPLER_FONT_TYPE_CID_TYPE0", "cid-type0" }, + { POPPLER_FONT_TYPE_CID_TYPE0C, "POPPLER_FONT_TYPE_CID_TYPE0C", "cid-type0c" }, + { POPPLER_FONT_TYPE_CID_TYPE0COT, "POPPLER_FONT_TYPE_CID_TYPE0COT", "cid-type0cot" }, + { POPPLER_FONT_TYPE_CID_TYPE2, "POPPLER_FONT_TYPE_CID_TYPE2", "cid-type2" }, + { POPPLER_FONT_TYPE_CID_TYPE2OT, "POPPLER_FONT_TYPE_CID_TYPE2OT", "cid-type2ot" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerFontType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_viewer_preferences_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GFlagsValue values[] = { + { POPPLER_VIEWER_PREFERENCES_UNSET, "POPPLER_VIEWER_PREFERENCES_UNSET", "unset" }, + { POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR, "POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR", "hide-toolbar" }, + { POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR, "POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR", "hide-menubar" }, + { POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI, "POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI", "hide-windowui" }, + { POPPLER_VIEWER_PREFERENCES_FIT_WINDOW, "POPPLER_VIEWER_PREFERENCES_FIT_WINDOW", "fit-window" }, + { POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW, "POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW", "center-window" }, + { POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE, "POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE", "display-doc-title" }, + { POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL, "POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL", "direction-rtl" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("PopplerViewerPreferences"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_permissions_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GFlagsValue values[] = { + { POPPLER_PERMISSIONS_OK_TO_PRINT, "POPPLER_PERMISSIONS_OK_TO_PRINT", "ok-to-print" }, + { POPPLER_PERMISSIONS_OK_TO_MODIFY, "POPPLER_PERMISSIONS_OK_TO_MODIFY", "ok-to-modify" }, + { POPPLER_PERMISSIONS_OK_TO_COPY, "POPPLER_PERMISSIONS_OK_TO_COPY", "ok-to-copy" }, + { POPPLER_PERMISSIONS_OK_TO_ADD_NOTES, "POPPLER_PERMISSIONS_OK_TO_ADD_NOTES", "ok-to-add-notes" }, + { POPPLER_PERMISSIONS_OK_TO_FILL_FORM, "POPPLER_PERMISSIONS_OK_TO_FILL_FORM", "ok-to-fill-form" }, + { POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS, "POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS", "ok-to-extract-contents" }, + { POPPLER_PERMISSIONS_OK_TO_ASSEMBLE, "POPPLER_PERMISSIONS_OK_TO_ASSEMBLE", "ok-to-assemble" }, + { POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION, "POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION", "ok-to-print-high-resolution" }, + { POPPLER_PERMISSIONS_FULL, "POPPLER_PERMISSIONS_FULL", "full" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("PopplerPermissions"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/* enumerations from "poppler-form-field.h" */ +#include "poppler-form-field.h" +GType +poppler_form_field_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_FORM_FIELD_UNKNOWN, "POPPLER_FORM_FIELD_UNKNOWN", "unknown" }, + { POPPLER_FORM_FIELD_BUTTON, "POPPLER_FORM_FIELD_BUTTON", "button" }, + { POPPLER_FORM_FIELD_TEXT, "POPPLER_FORM_FIELD_TEXT", "text" }, + { POPPLER_FORM_FIELD_CHOICE, "POPPLER_FORM_FIELD_CHOICE", "choice" }, + { POPPLER_FORM_FIELD_SIGNATURE, "POPPLER_FORM_FIELD_SIGNATURE", "signature" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerFormFieldType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_form_button_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_FORM_BUTTON_PUSH, "POPPLER_FORM_BUTTON_PUSH", "push" }, + { POPPLER_FORM_BUTTON_CHECK, "POPPLER_FORM_BUTTON_CHECK", "check" }, + { POPPLER_FORM_BUTTON_RADIO, "POPPLER_FORM_BUTTON_RADIO", "radio" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerFormButtonType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_form_text_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_FORM_TEXT_NORMAL, "POPPLER_FORM_TEXT_NORMAL", "normal" }, + { POPPLER_FORM_TEXT_MULTILINE, "POPPLER_FORM_TEXT_MULTILINE", "multiline" }, + { POPPLER_FORM_TEXT_FILE_SELECT, "POPPLER_FORM_TEXT_FILE_SELECT", "file-select" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerFormTextType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_form_choice_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_FORM_CHOICE_COMBO, "POPPLER_FORM_CHOICE_COMBO", "combo" }, + { POPPLER_FORM_CHOICE_LIST, "POPPLER_FORM_CHOICE_LIST", "list" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerFormChoiceType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/* enumerations from "poppler-annot.h" */ +#include "poppler-annot.h" +GType +poppler_annot_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ANNOT_UNKNOWN, "POPPLER_ANNOT_UNKNOWN", "unknown" }, + { POPPLER_ANNOT_TEXT, "POPPLER_ANNOT_TEXT", "text" }, + { POPPLER_ANNOT_LINK, "POPPLER_ANNOT_LINK", "link" }, + { POPPLER_ANNOT_FREE_TEXT, "POPPLER_ANNOT_FREE_TEXT", "free-text" }, + { POPPLER_ANNOT_LINE, "POPPLER_ANNOT_LINE", "line" }, + { POPPLER_ANNOT_SQUARE, "POPPLER_ANNOT_SQUARE", "square" }, + { POPPLER_ANNOT_CIRCLE, "POPPLER_ANNOT_CIRCLE", "circle" }, + { POPPLER_ANNOT_POLYGON, "POPPLER_ANNOT_POLYGON", "polygon" }, + { POPPLER_ANNOT_POLY_LINE, "POPPLER_ANNOT_POLY_LINE", "poly-line" }, + { POPPLER_ANNOT_HIGHLIGHT, "POPPLER_ANNOT_HIGHLIGHT", "highlight" }, + { POPPLER_ANNOT_UNDERLINE, "POPPLER_ANNOT_UNDERLINE", "underline" }, + { POPPLER_ANNOT_SQUIGGLY, "POPPLER_ANNOT_SQUIGGLY", "squiggly" }, + { POPPLER_ANNOT_STRIKE_OUT, "POPPLER_ANNOT_STRIKE_OUT", "strike-out" }, + { POPPLER_ANNOT_STAMP, "POPPLER_ANNOT_STAMP", "stamp" }, + { POPPLER_ANNOT_CARET, "POPPLER_ANNOT_CARET", "caret" }, + { POPPLER_ANNOT_INK, "POPPLER_ANNOT_INK", "ink" }, + { POPPLER_ANNOT_POPUP, "POPPLER_ANNOT_POPUP", "popup" }, + { POPPLER_ANNOT_FILE_ATTACHMENT, "POPPLER_ANNOT_FILE_ATTACHMENT", "file-attachment" }, + { POPPLER_ANNOT_SOUND, "POPPLER_ANNOT_SOUND", "sound" }, + { POPPLER_ANNOT_MOVIE, "POPPLER_ANNOT_MOVIE", "movie" }, + { POPPLER_ANNOT_WIDGET, "POPPLER_ANNOT_WIDGET", "widget" }, + { POPPLER_ANNOT_SCREEN, "POPPLER_ANNOT_SCREEN", "screen" }, + { POPPLER_ANNOT_PRINTER_MARK, "POPPLER_ANNOT_PRINTER_MARK", "printer-mark" }, + { POPPLER_ANNOT_TRAP_NET, "POPPLER_ANNOT_TRAP_NET", "trap-net" }, + { POPPLER_ANNOT_WATERMARK, "POPPLER_ANNOT_WATERMARK", "watermark" }, + { POPPLER_ANNOT_3D, "POPPLER_ANNOT_3D", "3d" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerAnnotType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_annot_flag_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GFlagsValue values[] = { + { POPPLER_ANNOT_FLAG_UNKNOWN, "POPPLER_ANNOT_FLAG_UNKNOWN", "unknown" }, + { POPPLER_ANNOT_FLAG_INVISIBLE, "POPPLER_ANNOT_FLAG_INVISIBLE", "invisible" }, + { POPPLER_ANNOT_FLAG_HIDDEN, "POPPLER_ANNOT_FLAG_HIDDEN", "hidden" }, + { POPPLER_ANNOT_FLAG_PRINT, "POPPLER_ANNOT_FLAG_PRINT", "print" }, + { POPPLER_ANNOT_FLAG_NO_ZOOM, "POPPLER_ANNOT_FLAG_NO_ZOOM", "no-zoom" }, + { POPPLER_ANNOT_FLAG_NO_ROTATE, "POPPLER_ANNOT_FLAG_NO_ROTATE", "no-rotate" }, + { POPPLER_ANNOT_FLAG_NO_VIEW, "POPPLER_ANNOT_FLAG_NO_VIEW", "no-view" }, + { POPPLER_ANNOT_FLAG_READ_ONLY, "POPPLER_ANNOT_FLAG_READ_ONLY", "read-only" }, + { POPPLER_ANNOT_FLAG_LOCKED, "POPPLER_ANNOT_FLAG_LOCKED", "locked" }, + { POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW, "POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW", "toggle-no-view" }, + { POPPLER_ANNOT_FLAG_LOCKED_CONTENTS, "POPPLER_ANNOT_FLAG_LOCKED_CONTENTS", "locked-contents" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("PopplerAnnotFlag"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_annot_markup_reply_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ANNOT_MARKUP_REPLY_TYPE_R, "POPPLER_ANNOT_MARKUP_REPLY_TYPE_R", "r" }, + { POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP, "POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP", "group" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerAnnotMarkupReplyType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_annot_external_data_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D, "POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D", "3d" }, + { POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN, "POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN", "unknown" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerAnnotExternalDataType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_annot_text_state_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ANNOT_TEXT_STATE_MARKED, "POPPLER_ANNOT_TEXT_STATE_MARKED", "marked" }, + { POPPLER_ANNOT_TEXT_STATE_UNMARKED, "POPPLER_ANNOT_TEXT_STATE_UNMARKED", "unmarked" }, + { POPPLER_ANNOT_TEXT_STATE_ACCEPTED, "POPPLER_ANNOT_TEXT_STATE_ACCEPTED", "accepted" }, + { POPPLER_ANNOT_TEXT_STATE_REJECTED, "POPPLER_ANNOT_TEXT_STATE_REJECTED", "rejected" }, + { POPPLER_ANNOT_TEXT_STATE_CANCELLED, "POPPLER_ANNOT_TEXT_STATE_CANCELLED", "cancelled" }, + { POPPLER_ANNOT_TEXT_STATE_COMPLETED, "POPPLER_ANNOT_TEXT_STATE_COMPLETED", "completed" }, + { POPPLER_ANNOT_TEXT_STATE_NONE, "POPPLER_ANNOT_TEXT_STATE_NONE", "none" }, + { POPPLER_ANNOT_TEXT_STATE_UNKNOWN, "POPPLER_ANNOT_TEXT_STATE_UNKNOWN", "unknown" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerAnnotTextState"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_annot_free_text_quadding_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED, "POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED", "left-justified" }, + { POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED, "POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED", "centered" }, + { POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED, "POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED", "right-justified" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerAnnotFreeTextQuadding"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/* enumerations from "poppler.h" */ +#include "poppler.h" +GType +poppler_error_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ERROR_INVALID, "POPPLER_ERROR_INVALID", "invalid" }, + { POPPLER_ERROR_ENCRYPTED, "POPPLER_ERROR_ENCRYPTED", "encrypted" }, + { POPPLER_ERROR_OPEN_FILE, "POPPLER_ERROR_OPEN_FILE", "open-file" }, + { POPPLER_ERROR_BAD_CATALOG, "POPPLER_ERROR_BAD_CATALOG", "bad-catalog" }, + { POPPLER_ERROR_DAMAGED, "POPPLER_ERROR_DAMAGED", "damaged" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerError"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_orientation_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_ORIENTATION_PORTRAIT, "POPPLER_ORIENTATION_PORTRAIT", "portrait" }, + { POPPLER_ORIENTATION_LANDSCAPE, "POPPLER_ORIENTATION_LANDSCAPE", "landscape" }, + { POPPLER_ORIENTATION_UPSIDEDOWN, "POPPLER_ORIENTATION_UPSIDEDOWN", "upsidedown" }, + { POPPLER_ORIENTATION_SEASCAPE, "POPPLER_ORIENTATION_SEASCAPE", "seascape" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerOrientation"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_page_transition_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_PAGE_TRANSITION_REPLACE, "POPPLER_PAGE_TRANSITION_REPLACE", "replace" }, + { POPPLER_PAGE_TRANSITION_SPLIT, "POPPLER_PAGE_TRANSITION_SPLIT", "split" }, + { POPPLER_PAGE_TRANSITION_BLINDS, "POPPLER_PAGE_TRANSITION_BLINDS", "blinds" }, + { POPPLER_PAGE_TRANSITION_BOX, "POPPLER_PAGE_TRANSITION_BOX", "box" }, + { POPPLER_PAGE_TRANSITION_WIPE, "POPPLER_PAGE_TRANSITION_WIPE", "wipe" }, + { POPPLER_PAGE_TRANSITION_DISSOLVE, "POPPLER_PAGE_TRANSITION_DISSOLVE", "dissolve" }, + { POPPLER_PAGE_TRANSITION_GLITTER, "POPPLER_PAGE_TRANSITION_GLITTER", "glitter" }, + { POPPLER_PAGE_TRANSITION_FLY, "POPPLER_PAGE_TRANSITION_FLY", "fly" }, + { POPPLER_PAGE_TRANSITION_PUSH, "POPPLER_PAGE_TRANSITION_PUSH", "push" }, + { POPPLER_PAGE_TRANSITION_COVER, "POPPLER_PAGE_TRANSITION_COVER", "cover" }, + { POPPLER_PAGE_TRANSITION_UNCOVER, "POPPLER_PAGE_TRANSITION_UNCOVER", "uncover" }, + { POPPLER_PAGE_TRANSITION_FADE, "POPPLER_PAGE_TRANSITION_FADE", "fade" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerPageTransitionType"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_page_transition_alignment_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_PAGE_TRANSITION_HORIZONTAL, "POPPLER_PAGE_TRANSITION_HORIZONTAL", "horizontal" }, + { POPPLER_PAGE_TRANSITION_VERTICAL, "POPPLER_PAGE_TRANSITION_VERTICAL", "vertical" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerPageTransitionAlignment"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_page_transition_direction_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_PAGE_TRANSITION_INWARD, "POPPLER_PAGE_TRANSITION_INWARD", "inward" }, + { POPPLER_PAGE_TRANSITION_OUTWARD, "POPPLER_PAGE_TRANSITION_OUTWARD", "outward" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerPageTransitionDirection"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_selection_style_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_SELECTION_GLYPH, "POPPLER_SELECTION_GLYPH", "glyph" }, + { POPPLER_SELECTION_WORD, "POPPLER_SELECTION_WORD", "word" }, + { POPPLER_SELECTION_LINE, "POPPLER_SELECTION_LINE", "line" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerSelectionStyle"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_print_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GFlagsValue values[] = { + { POPPLER_PRINT_DOCUMENT, "POPPLER_PRINT_DOCUMENT", "document" }, + { POPPLER_PRINT_MARKUP_ANNOTS, "POPPLER_PRINT_MARKUP_ANNOTS", "markup-annots" }, + { POPPLER_PRINT_STAMP_ANNOTS_ONLY, "POPPLER_PRINT_STAMP_ANNOTS_ONLY", "stamp-annots-only" }, + { POPPLER_PRINT_ALL, "POPPLER_PRINT_ALL", "all" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("PopplerPrintFlags"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +poppler_backend_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const GEnumValue values[] = { + { POPPLER_BACKEND_UNKNOWN, "POPPLER_BACKEND_UNKNOWN", "unknown" }, + { POPPLER_BACKEND_SPLASH, "POPPLER_BACKEND_SPLASH", "splash" }, + { POPPLER_BACKEND_CAIRO, "POPPLER_BACKEND_CAIRO", "cairo" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("PopplerBackend"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + + + +/* Generated data ends here */ + diff --git a/glib/poppler-enums.c.template b/glib/poppler-enums.c.template new file mode 100644 index 0000000..26a51b4 --- /dev/null +++ b/glib/poppler-enums.c.template @@ -0,0 +1,44 @@ +/*** BEGIN file-header ***/ +#include <config.h> + +#include "poppler-enums.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ +#include "@filename@" +/*** END file-production ***/ + + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/*** END value-tail ***/ + +/*** BEGIN file-tail ***/ + +/*** END file-tail ***/ diff --git a/glib/poppler-enums.h b/glib/poppler-enums.h new file mode 100644 index 0000000..311fdec --- /dev/null +++ b/glib/poppler-enums.h @@ -0,0 +1,80 @@ + +/* Generated data (by glib-mkenums) */ + + +#ifndef POPPLER_ENUMS_H +#define POPPLER_ENUMS_H + +#include <glib-object.h> + +G_BEGIN_DECLS + +/* enumerations from "poppler-action.h" */ +GType poppler_action_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ACTION_TYPE (poppler_action_type_get_type ()) +GType poppler_dest_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_DEST_TYPE (poppler_dest_type_get_type ()) +GType poppler_action_movie_operation_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ACTION_MOVIE_OPERATION (poppler_action_movie_operation_get_type ()) +GType poppler_action_layer_action_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ACTION_LAYER_ACTION (poppler_action_layer_action_get_type ()) + +/* enumerations from "poppler-document.h" */ +GType poppler_page_layout_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PAGE_LAYOUT (poppler_page_layout_get_type ()) +GType poppler_page_mode_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PAGE_MODE (poppler_page_mode_get_type ()) +GType poppler_font_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_FONT_TYPE (poppler_font_type_get_type ()) +GType poppler_viewer_preferences_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_VIEWER_PREFERENCES (poppler_viewer_preferences_get_type ()) +GType poppler_permissions_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PERMISSIONS (poppler_permissions_get_type ()) + +/* enumerations from "poppler-form-field.h" */ +GType poppler_form_field_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_FORM_FIELD_TYPE (poppler_form_field_type_get_type ()) +GType poppler_form_button_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_FORM_BUTTON_TYPE (poppler_form_button_type_get_type ()) +GType poppler_form_text_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_FORM_TEXT_TYPE (poppler_form_text_type_get_type ()) +GType poppler_form_choice_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_FORM_CHOICE_TYPE (poppler_form_choice_type_get_type ()) + +/* enumerations from "poppler-annot.h" */ +GType poppler_annot_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ANNOT_TYPE (poppler_annot_type_get_type ()) +GType poppler_annot_flag_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ANNOT_FLAG (poppler_annot_flag_get_type ()) +GType poppler_annot_markup_reply_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ANNOT_MARKUP_REPLY_TYPE (poppler_annot_markup_reply_type_get_type ()) +GType poppler_annot_external_data_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ANNOT_EXTERNAL_DATA_TYPE (poppler_annot_external_data_type_get_type ()) +GType poppler_annot_text_state_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ANNOT_TEXT_STATE (poppler_annot_text_state_get_type ()) +GType poppler_annot_free_text_quadding_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ANNOT_FREE_TEXT_QUADDING (poppler_annot_free_text_quadding_get_type ()) + +/* enumerations from "poppler.h" */ +GType poppler_error_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ERROR (poppler_error_get_type ()) +GType poppler_orientation_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_ORIENTATION (poppler_orientation_get_type ()) +GType poppler_page_transition_type_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PAGE_TRANSITION_TYPE (poppler_page_transition_type_get_type ()) +GType poppler_page_transition_alignment_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT (poppler_page_transition_alignment_get_type ()) +GType poppler_page_transition_direction_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PAGE_TRANSITION_DIRECTION (poppler_page_transition_direction_get_type ()) +GType poppler_selection_style_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_SELECTION_STYLE (poppler_selection_style_get_type ()) +GType poppler_print_flags_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_PRINT_FLAGS (poppler_print_flags_get_type ()) +GType poppler_backend_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_BACKEND (poppler_backend_get_type ()) +G_END_DECLS + +#endif /* !POPPLER_ENUMS_H */ + +/* Generated data ends here */ + diff --git a/glib/poppler-enums.h.template b/glib/poppler-enums.h.template new file mode 100644 index 0000000..5d056dd --- /dev/null +++ b/glib/poppler-enums.h.template @@ -0,0 +1,25 @@ +/*** BEGIN file-header ***/ + +#ifndef POPPLER_ENUMS_H +#define POPPLER_ENUMS_H + +#include <glib-object.h> + +G_BEGIN_DECLS +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define POPPLER_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +#endif /* !POPPLER_ENUMS_H */ +/*** END file-tail ***/ diff --git a/glib/poppler-features.h.cmake b/glib/poppler-features.h.cmake new file mode 100644 index 0000000..1f79ce4 --- /dev/null +++ b/glib/poppler-features.h.cmake @@ -0,0 +1,33 @@ +/* poppler-features.h: glib interface to poppler + * Copyright (C) 2006, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_FEATURES_H__ +#define __POPPLER_FEATURES_H__ + +@CAIRO_FEATURE@ + +#define POPPLER_MAJOR_VERSION (@POPPLER_MAJOR_VERSION@) +#define POPPLER_MINOR_VERSION (@POPPLER_MINOR_VERSION@) +#define POPPLER_MICRO_VERSION (@POPPLER_MICRO_VERSION@) + +#define POPPLER_CHECK_VERSION(major,minor,micro) \ + (POPPLER_MAJOR_VERSION > (major) || \ + (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION > (minor)) || \ + (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION == (minor) && POPPLER_MICRO_VERSION >= (micro))) + +#endif /* __POPPLER_FEATURES_H__ */ diff --git a/glib/poppler-features.h.in b/glib/poppler-features.h.in new file mode 100644 index 0000000..e6b3a8e --- /dev/null +++ b/glib/poppler-features.h.in @@ -0,0 +1,88 @@ +/* poppler-features.h: glib interface to poppler + * Copyright (C) 2006, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_FEATURES_H__ +#define __POPPLER_FEATURES_H__ + +/** + * SECTION:poppler-features + * @short_description: Variables and functions to check the poppler version and features + * @Title: Version and Features Information + * + * Poppler provides version information, and information about features + * enabled at compile time. This is primarily useful in configure checks + * for builds that have a configure script, or for allowing code to optionally + * depend but not require a specific poppler version. + */ + +/** + * POPPLER_HAS_CAIRO: + * + * Defined if poppler was compiled with cairo support. + */ +@CAIRO_FEATURE@ + +/** + * POPPLER_MAJOR_VERSION: + * + * The major version number of the poppler header files (e.g. in poppler version + * 0.1.2 this is 0.) + * + * Since: 0.12 + */ +#define POPPLER_MAJOR_VERSION (@POPPLER_MAJOR_VERSION@) + +/** + * POPPLER_MINOR_VERSION: + * + * The major version number of the poppler header files (e.g. in poppler version + * 0.1.2 this is 1.) + * + * Since: 0.12 + */ +#define POPPLER_MINOR_VERSION (@POPPLER_MINOR_VERSION@) + +/** + * POPPLER_MICRO_VERSION: + * + * The micro version number of the poppler header files (e.g. in poppler version + * 0.1.2 this is 2.) + * + * Since: 0.12 + */ +#define POPPLER_MICRO_VERSION (@POPPLER_MICRO_VERSION@) + +/** + * POPPLER_CHECK_VERSION: + * @major: major version (e.g. 0 for version 0.1.2) + * @minor: minor version (e.g. 1 for version 0.1.2) + * @micro: micro version (e.g. 2 for version 0.1.2) + * + * Checks the version fo the poppler library + * + * Returns: %TRUE if the version of the poppler header files is the same + * as or newer than the passed-in version + * + * Since: 0.12 + */ +#define POPPLER_CHECK_VERSION(major,minor,micro) \ + (POPPLER_MAJOR_VERSION > (major) || \ + (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION > (minor)) || \ + (POPPLER_MAJOR_VERSION == (major) && POPPLER_MINOR_VERSION == (minor) && POPPLER_MICRO_VERSION >= (micro))) + +#endif /* __POPPLER_FEATURES_H__ */ diff --git a/glib/poppler-form-field.cc b/glib/poppler-form-field.cc new file mode 100644 index 0000000..09f8be1 --- /dev/null +++ b/glib/poppler-form-field.cc @@ -0,0 +1,691 @@ +/* poppler-form-field.cc: glib interface to poppler + * + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * Copyright (C) 2006 Julien Rebetez + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler.h" +#include "poppler-private.h" + +/** + * SECTION:poppler-form-field + * @short_description: Form Field + * @title: PoppplerFormField + */ + +typedef struct _PopplerFormFieldClass PopplerFormFieldClass; +struct _PopplerFormFieldClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerFormField, poppler_form_field, G_TYPE_OBJECT) + +static void +poppler_form_field_finalize (GObject *object) +{ + PopplerFormField *field = POPPLER_FORM_FIELD (object); + + if (field->document) + { + g_object_unref (field->document); + field->document = NULL; + } + if (field->action) + { + poppler_action_free (field->action); + field->action = NULL; + } + field->widget = NULL; + + G_OBJECT_CLASS (poppler_form_field_parent_class)->finalize (object); +} + +static void +poppler_form_field_init (PopplerFormField *field) +{ +} + +static void +poppler_form_field_class_init (PopplerFormFieldClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_form_field_finalize; +} + +PopplerFormField * +_poppler_form_field_new (PopplerDocument *document, + FormWidget *field) +{ + PopplerFormField *poppler_field; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + g_return_val_if_fail (field != NULL, NULL); + + poppler_field = POPPLER_FORM_FIELD (g_object_new (POPPLER_TYPE_FORM_FIELD, NULL)); + + poppler_field->document = (PopplerDocument *)g_object_ref (document); + poppler_field->widget = field; + + return poppler_field; +} + +/* Public methods */ +/** + * poppler_form_field_get_field_type: + * @field: a #PopplerFormField + * + * Gets the type of @field + * + * Return value: #PopplerFormFieldType of @field + **/ +PopplerFormFieldType +poppler_form_field_get_field_type (PopplerFormField *field) +{ + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), POPPLER_FORM_FIELD_UNKNOWN); + + switch (field->widget->getType ()) + { + case formButton: + return POPPLER_FORM_FIELD_BUTTON; + case formText: + return POPPLER_FORM_FIELD_TEXT; + case formChoice: + return POPPLER_FORM_FIELD_CHOICE; + case formSignature: + return POPPLER_FORM_FIELD_SIGNATURE; + default: + g_warning ("Unsupported Form Field Type"); + } + + return POPPLER_FORM_FIELD_UNKNOWN; +} + +/** + * poppler_form_field_get_id: + * @field: a #PopplerFormField + * + * Gets the id of @field + * + * Return value: the id of @field + **/ +gint +poppler_form_field_get_id (PopplerFormField *field) +{ + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), -1); + + return field->widget->getID (); +} + +/** + * poppler_form_field_get_font_size + * @field: a #PopplerFormField + * + * Gets the font size of @field + * + * Return value: the font size of @field + **/ +gdouble +poppler_form_field_get_font_size (PopplerFormField *field) +{ + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), 0); + + return field->widget->getFontSize (); +} + +/** + * poppler_form_field_is_read_only + * @field: a #PopplerFormField + * + * Checks whether @field is read only + * + * Return value: %TRUE if @field is read only + **/ +gboolean +poppler_form_field_is_read_only (PopplerFormField *field) +{ + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), FALSE); + + return field->widget->isReadOnly (); +} + +/** + * poppler_form_field_get_action: + * @field: a #PopplerFormField + * + * Retrieves the action (#PopplerAction) that shall be + * performed when @field is activated, or %NULL + * + * Return value: (transfer none): the action to perform. The returned + * object is owned by @field and should not be freed + * + * Since: 0.18 + */ +PopplerAction * +poppler_form_field_get_action (PopplerFormField *field) +{ + LinkAction *action; + + if (field->action) + return field->action; + + action = field->widget->getActivationAction(); + if (!action) + return NULL; + + field->action = _poppler_action_new (NULL, action, NULL); + + return field->action; +} + +/* Button Field */ +/** + * poppler_form_field_button_get_button_type + * @field: a #PopplerFormField + * + * Gets the button type of @field + * + * Return value: #PopplerFormButtonType of @field + **/ +PopplerFormButtonType +poppler_form_field_button_get_button_type (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formButton, POPPLER_FORM_BUTTON_PUSH); + + switch (static_cast<FormWidgetButton*>(field->widget)->getButtonType ()) + { + case formButtonPush: + return POPPLER_FORM_BUTTON_PUSH; + case formButtonCheck: + return POPPLER_FORM_BUTTON_CHECK; + case formButtonRadio: + return POPPLER_FORM_BUTTON_RADIO; + default: + g_assert_not_reached (); + } +} + +/** + * poppler_form_field_button_get_state + * @field: a #PopplerFormField + * + * Queries a #PopplerFormField and returns its current state. Returns %TRUE if + * @field is pressed in and %FALSE if it is raised. + * + * Return value: current state of @field + **/ +gboolean +poppler_form_field_button_get_state (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formButton, FALSE); + + return static_cast<FormWidgetButton*>(field->widget)->getState (); +} + +/** + * poppler_form_field_button_set_state + * @field: a #PopplerFormField + * @state: %TRUE or %FALSE + * + * Sets the status of @field. Set to %TRUE if you want the #PopplerFormField + * to be 'pressed in', and %FALSE to raise it. + **/ +void +poppler_form_field_button_set_state (PopplerFormField *field, + gboolean state) +{ + g_return_if_fail (field->widget->getType () == formButton); + + static_cast<FormWidgetButton*>(field->widget)->setState ((GBool)state); +} + +/** + * poppler_form_field_get_partial_name: + * @field: a #PopplerFormField + * + * Gets the partial name of @field. + * + * Return value: a new allocated string. It must be freed with g_free() when done. + * + * Since: 0.16 + **/ +gchar* +poppler_form_field_get_partial_name (PopplerFormField *field) +{ + GooString *tmp; + + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), NULL); + + tmp = field->widget->getPartialName(); + + return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL; +} + +/** + * poppler_form_field_get_mapping_name: + * @field: a #PopplerFormField + * + * Gets the mapping name of @field that is used when + * exporting interactive form field data from the document + * + * Return value: a new allocated string. It must be freed with g_free() when done. + * + * Since: 0.16 + **/ +gchar* +poppler_form_field_get_mapping_name (PopplerFormField *field) +{ + GooString *tmp; + + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), NULL); + + tmp = field->widget->getMappingName(); + + return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL; +} + +/** + * poppler_form_field_get_name: + * @field: a #PopplerFormField + * + * Gets the fully qualified name of @field. It's constructed by concatenating + * the partial field names of the field and all of its ancestors. + * + * Return value: a new allocated string. It must be freed with g_free() when done. + * + * Since: 0.16 + **/ +gchar* +poppler_form_field_get_name (PopplerFormField *field) +{ + GooString *tmp; + + g_return_val_if_fail (POPPLER_IS_FORM_FIELD (field), NULL); + + tmp = field->widget->getFullyQualifiedName(); + + return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL; +} + +/* Text Field */ +/** + * poppler_form_field_text_get_text_type: + * @field: a #PopplerFormField + * + * Gets the text type of @field. + * + * Return value: #PopplerFormTextType of @field + **/ +PopplerFormTextType +poppler_form_field_text_get_text_type (PopplerFormField *field) +{ + FormWidgetText *text_field; + + g_return_val_if_fail (field->widget->getType () == formText, POPPLER_FORM_TEXT_NORMAL); + + text_field = static_cast<FormWidgetText*>(field->widget); + + if (text_field->isMultiline ()) + return POPPLER_FORM_TEXT_MULTILINE; + else if (text_field->isFileSelect ()) + return POPPLER_FORM_TEXT_FILE_SELECT; + + return POPPLER_FORM_TEXT_NORMAL; +} + +/** + * poppler_form_field_text_get_text: + * @field: a #PopplerFormField + * + * Retrieves the contents of @field. + * + * Return value: a new allocated string. It must be freed with g_free() when done. + **/ +gchar * +poppler_form_field_text_get_text (PopplerFormField *field) +{ + FormWidgetText *text_field; + GooString *tmp; + + g_return_val_if_fail (field->widget->getType () == formText, NULL); + + text_field = static_cast<FormWidgetText*>(field->widget); + tmp = text_field->getContent (); + + return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL; +} + +/** + * poppler_form_field_text_set_text: + * @field: a #PopplerFormField + * @text: the new text + * + * Sets the text in @field to the given value, replacing the current contents. + **/ +void +poppler_form_field_text_set_text (PopplerFormField *field, + const gchar *text) +{ + GooString *goo_tmp; + gchar *tmp; + gsize length = 0; + + g_return_if_fail (field->widget->getType () == formText); + + tmp = text ? g_convert (text, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL; + goo_tmp = new GooString (tmp, length); + g_free (tmp); + static_cast<FormWidgetText*>(field->widget)->setContent (goo_tmp); + delete goo_tmp; +} + +/** + * poppler_form_field_text_get_max_len: + * @field: a #PopplerFormField + * + * Retrieves the maximum allowed length of the text in @field + * + * Return value: the maximum allowed number of characters in @field, or -1 if there is no maximum. + **/ +gint +poppler_form_field_text_get_max_len (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formText, 0); + + return static_cast<FormWidgetText*>(field->widget)->getMaxLen (); +} + +/** + * poppler_form_field_text_do_spell_check: + * @field: a #PopplerFormField + * + * Checks whether spell checking should be done for the contents of @field + * + * Return value: %TRUE if spell checking should be done for @field + **/ +gboolean +poppler_form_field_text_do_spell_check (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formText, FALSE); + + return !static_cast<FormWidgetText*>(field->widget)->noSpellCheck (); +} + +gboolean +poppler_form_field_text_do_scroll (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formText, FALSE); + + return !static_cast<FormWidgetText*>(field->widget)->noScroll (); +} + +/** + * poppler_form_field_text_is_rich_text: + * @field: a #PopplerFormField + * + * Checks whether the contents of @field are rich text + * + * Return value: %TRUE if the contents of @field are rich text + **/ +gboolean +poppler_form_field_text_is_rich_text (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formText, FALSE); + + return static_cast<FormWidgetText*>(field->widget)->isRichText (); +} + +/** + * poppler_form_field_text_is_password: + * @field: a #PopplerFormField + * + * Checks whether content of @field is a password and it must be hidden + * + * Return value: %TRUE if the content of @field is a password + **/ +gboolean +poppler_form_field_text_is_password (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formText, FALSE); + + return static_cast<FormWidgetText*>(field->widget)->isPassword (); +} + +/* Choice Field */ +/** + * poppler_form_field_choice_get_choice_type: + * @field: a #PopplerFormField + * + * Gets the choice type of @field + * + * Return value: #PopplerFormChoiceType of @field + **/ +PopplerFormChoiceType +poppler_form_field_choice_get_choice_type (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, POPPLER_FORM_CHOICE_COMBO); + + if (static_cast<FormWidgetChoice*>(field->widget)->isCombo ()) + return POPPLER_FORM_CHOICE_COMBO; + else + return POPPLER_FORM_CHOICE_LIST; +} + +/** + * poppler_form_field_choice_is_editable: + * @field: a #PopplerFormField + * + * Checks whether @field is editable + * + * Return value: %TRUE if @field is editable + **/ +gboolean +poppler_form_field_choice_is_editable (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, FALSE); + + return static_cast<FormWidgetChoice*>(field->widget)->hasEdit (); +} + +/** + * poppler_form_field_choice_can_select_multiple: + * @field: a #PopplerFormField + * + * Checks whether @field allows multiple choices to be selected + * + * Return value: %TRUE if @field allows multiple choices to be selected + **/ +gboolean +poppler_form_field_choice_can_select_multiple (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, FALSE); + + return static_cast<FormWidgetChoice*>(field->widget)->isMultiSelect (); +} + +/** + * poppler_form_field_choice_do_spell_check: + * @field: a #PopplerFormField + * + * Checks whether spell checking should be done for the contents of @field + * + * Return value: %TRUE if spell checking should be done for @field + **/ +gboolean +poppler_form_field_choice_do_spell_check (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, FALSE); + + return !static_cast<FormWidgetChoice*>(field->widget)->noSpellCheck (); +} + +gboolean +poppler_form_field_choice_commit_on_change (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, FALSE); + + return static_cast<FormWidgetChoice*>(field->widget)->commitOnSelChange (); +} + +/** + * poppler_form_field_choice_get_n_items: + * @field: a #PopplerFormField + * + * Returns the number of items on @field + * + * Return value: the number of items on @field + **/ +gint +poppler_form_field_choice_get_n_items (PopplerFormField *field) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, -1); + + return static_cast<FormWidgetChoice*>(field->widget)->getNumChoices (); +} + +/** + * poppler_form_field_choice_get_item: + * @field: a #PopplerFormField + * @index: the index of the item + * + * Returns the contents of the item on @field at the given index + * + * Return value: a new allocated string. It must be freed with g_free() when done. + **/ +gchar * +poppler_form_field_choice_get_item (PopplerFormField *field, + gint index) +{ + GooString *tmp; + + g_return_val_if_fail (field->widget->getType () == formChoice, NULL); + g_return_val_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field), NULL); + + tmp = static_cast<FormWidgetChoice*>(field->widget)->getChoice (index); + return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL; +} + +/** + * poppler_form_field_choice_is_item_selected: + * @field: a #PopplerFormField + * @index: the index of the item + * + * Checks whether the item at the given index on @field is currently selected + * + * Return value: %TRUE if item at @index is currently selected + **/ +gboolean +poppler_form_field_choice_is_item_selected (PopplerFormField *field, + gint index) +{ + g_return_val_if_fail (field->widget->getType () == formChoice, FALSE); + g_return_val_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field), FALSE); + + return static_cast<FormWidgetChoice*>(field->widget)->isSelected (index); +} + +/** + * poppler_form_field_choice_select_item: + * @field: a #PopplerFormField + * @index: the index of the item + * + * Selects the item at the given index on @field + **/ +void +poppler_form_field_choice_select_item (PopplerFormField *field, + gint index) +{ + g_return_if_fail (field->widget->getType () == formChoice); + g_return_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field)); + + static_cast<FormWidgetChoice*>(field->widget)->select (index); +} + +/** + * poppler_form_field_choice_unselect_all: + * @field: a #PopplerFormField + * + * Unselects all the items on @field + **/ +void +poppler_form_field_choice_unselect_all (PopplerFormField *field) +{ + g_return_if_fail (field->widget->getType () == formChoice); + + static_cast<FormWidgetChoice*>(field->widget)->deselectAll (); +} + +/** + * poppler_form_field_choice_toggle_item: + * @field: a #PopplerFormField + * @index: the index of the item + * + * Changes the state of the item at the given index + **/ +void +poppler_form_field_choice_toggle_item (PopplerFormField *field, + gint index) +{ + g_return_if_fail (field->widget->getType () == formChoice); + g_return_if_fail (index >= 0 && index < poppler_form_field_choice_get_n_items (field)); + + static_cast<FormWidgetChoice*>(field->widget)->toggle (index); +} + +/** + * poppler_form_field_choice_set_text: + * @field: a #PopplerFormField + * @text: the new text + * + * Sets the text in @field to the given value, replacing the current contents + **/ +void +poppler_form_field_choice_set_text (PopplerFormField *field, + const gchar *text) +{ + GooString *goo_tmp; + gchar *tmp; + gsize length = 0; + + g_return_if_fail (field->widget->getType () == formChoice); + + tmp = text ? g_convert (text, -1, "UTF-16BE", "UTF-8", NULL, &length, NULL) : NULL; + goo_tmp = new GooString (tmp, length); + g_free (tmp); + static_cast<FormWidgetChoice*>(field->widget)->setEditChoice (goo_tmp); + delete goo_tmp; +} + +/** + * poppler_form_field_choice_get_text: + * @field: a #PopplerFormField + * + * Retrieves the contents of @field. + * + * Return value: a new allocated string. It must be freed with g_free() when done. + **/ +gchar * +poppler_form_field_choice_get_text (PopplerFormField *field) +{ + GooString *tmp; + + g_return_val_if_fail (field->widget->getType () == formChoice, NULL); + + tmp = static_cast<FormWidgetChoice*>(field->widget)->getEditChoice (); + return tmp ? _poppler_goo_string_to_utf8 (tmp) : NULL; +} diff --git a/glib/poppler-form-field.h b/glib/poppler-form-field.h new file mode 100644 index 0000000..898e0f6 --- /dev/null +++ b/glib/poppler-form-field.h @@ -0,0 +1,111 @@ +/* poppler-form-field.h: glib interface to poppler + * + * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_FORM_FIELD_H__ +#define __POPPLER_FORM_FIELD_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +#define POPPLER_TYPE_FORM_FIELD (poppler_form_field_get_type ()) +#define POPPLER_FORM_FIELD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_FORM_FIELD, PopplerFormField)) +#define POPPLER_IS_FORM_FIELD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_FORM_FIELD)) + +typedef enum +{ + POPPLER_FORM_FIELD_UNKNOWN, + POPPLER_FORM_FIELD_BUTTON, + POPPLER_FORM_FIELD_TEXT, + POPPLER_FORM_FIELD_CHOICE, + POPPLER_FORM_FIELD_SIGNATURE +} PopplerFormFieldType; + +typedef enum +{ + POPPLER_FORM_BUTTON_PUSH, + POPPLER_FORM_BUTTON_CHECK, + POPPLER_FORM_BUTTON_RADIO +} PopplerFormButtonType; + +typedef enum +{ + POPPLER_FORM_TEXT_NORMAL, + POPPLER_FORM_TEXT_MULTILINE, + POPPLER_FORM_TEXT_FILE_SELECT +} PopplerFormTextType; + +typedef enum +{ + POPPLER_FORM_CHOICE_COMBO, + POPPLER_FORM_CHOICE_LIST +} PopplerFormChoiceType; + +GType poppler_form_field_get_type (void) G_GNUC_CONST; + +PopplerFormFieldType poppler_form_field_get_field_type (PopplerFormField *field); +gint poppler_form_field_get_id (PopplerFormField *field); +gdouble poppler_form_field_get_font_size (PopplerFormField *field); +gboolean poppler_form_field_is_read_only (PopplerFormField *field); +gchar *poppler_form_field_get_partial_name (PopplerFormField *field); +gchar *poppler_form_field_get_mapping_name (PopplerFormField *field); +gchar *poppler_form_field_get_name (PopplerFormField *field); +PopplerAction *poppler_form_field_get_action (PopplerFormField *field); + +/* Button Field */ +PopplerFormButtonType poppler_form_field_button_get_button_type (PopplerFormField *field); +gboolean poppler_form_field_button_get_state (PopplerFormField *field); +void poppler_form_field_button_set_state (PopplerFormField *field, + gboolean state); + +/* Text Field */ +PopplerFormTextType poppler_form_field_text_get_text_type (PopplerFormField *field); +gchar *poppler_form_field_text_get_text (PopplerFormField *field); +void poppler_form_field_text_set_text (PopplerFormField *field, + const gchar *text); +gint poppler_form_field_text_get_max_len (PopplerFormField *field); +gboolean poppler_form_field_text_do_spell_check (PopplerFormField *field); +gboolean poppler_form_field_text_do_scroll (PopplerFormField *field); +gboolean poppler_form_field_text_is_rich_text (PopplerFormField *field); +gboolean poppler_form_field_text_is_password (PopplerFormField *field); + +/* Choice Field */ +PopplerFormChoiceType poppler_form_field_choice_get_choice_type (PopplerFormField *field); +gboolean poppler_form_field_choice_is_editable (PopplerFormField *field); +gboolean poppler_form_field_choice_can_select_multiple (PopplerFormField *field); +gboolean poppler_form_field_choice_do_spell_check (PopplerFormField *field); +gboolean poppler_form_field_choice_commit_on_change (PopplerFormField *field); +gint poppler_form_field_choice_get_n_items (PopplerFormField *field); +gchar *poppler_form_field_choice_get_item (PopplerFormField *field, + gint index); +gboolean poppler_form_field_choice_is_item_selected (PopplerFormField *field, + gint index); +void poppler_form_field_choice_select_item (PopplerFormField *field, + gint index); +void poppler_form_field_choice_unselect_all (PopplerFormField *field); +void poppler_form_field_choice_toggle_item (PopplerFormField *field, + gint index); +void poppler_form_field_choice_set_text (PopplerFormField *field, + const gchar *text); +gchar *poppler_form_field_choice_get_text (PopplerFormField *field); + +G_END_DECLS + +#endif /* __POPPLER_FORM_FIELD_H__ */ diff --git a/glib/poppler-layer.cc b/glib/poppler-layer.cc new file mode 100644 index 0000000..8a481dd --- /dev/null +++ b/glib/poppler-layer.cc @@ -0,0 +1,223 @@ +/* poppler-layer.cc: glib interface to poppler + * + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-layer.h" +#include "poppler-private.h" + +/** + * SECTION:poppler-layer + * @short_description: Layers + * @title: PopplerLayer + */ + +typedef struct _PopplerLayerClass PopplerLayerClass; +struct _PopplerLayerClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerLayer, poppler_layer, G_TYPE_OBJECT) + +static void +poppler_layer_finalize (GObject *object) +{ + PopplerLayer *poppler_layer = POPPLER_LAYER (object); + + if (poppler_layer->document) + { + g_object_unref (poppler_layer->document); + poppler_layer->document = NULL; + } + + if (poppler_layer->title) + { + g_free (poppler_layer->title); + poppler_layer->title = NULL; + } + poppler_layer->layer = NULL; + poppler_layer->rbgroup = NULL; + + G_OBJECT_CLASS (poppler_layer_parent_class)->finalize (object); +} + +static void +poppler_layer_init (PopplerLayer *layer) +{ +} + +static void +poppler_layer_class_init (PopplerLayerClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_layer_finalize; +} + +PopplerLayer * +_poppler_layer_new (PopplerDocument *document, + Layer *layer, + GList *rbgroup) +{ + PopplerLayer *poppler_layer; + GooString *layer_name; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + g_return_val_if_fail (layer != NULL, NULL); + + poppler_layer = POPPLER_LAYER (g_object_new (POPPLER_TYPE_LAYER, NULL)); + + poppler_layer->document = (PopplerDocument *)g_object_ref (document); + poppler_layer->layer = layer; + poppler_layer->rbgroup = rbgroup; + layer_name = layer->oc->getName (); + poppler_layer->title = layer_name ? _poppler_goo_string_to_utf8 (layer_name) : NULL; + + return poppler_layer; +} + +/** + * poppler_layer_get_title + * @layer: a #PopplerLayer + * + * Returns the name of the layer suitable for + * presentation as a title in a viewer's GUI + * + * Return value: a string containing the title of the layer + * + * Since: 0.12 + **/ +const gchar * +poppler_layer_get_title (PopplerLayer *poppler_layer) +{ + g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), NULL); + + return poppler_layer->title; +} + +/** + * poppler_layer_is_visible + * @layer: a #PopplerLayer + * + * Returns whether @layer is visible + * + * Return value: %TRUE if @layer is visible + * + * Since: 0.12 + **/ +gboolean +poppler_layer_is_visible (PopplerLayer *poppler_layer) +{ + g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), FALSE); + + return poppler_layer->layer->oc->getState () == OptionalContentGroup::On; +} + +/** + * poppler_layer_show + * @layer: a #PopplerLayer + * + * Shows @layer + * + * Since: 0.12 + **/ +void +poppler_layer_show (PopplerLayer *poppler_layer) +{ + GList *l; + Layer *layer; + + g_return_if_fail (POPPLER_IS_LAYER (poppler_layer)); + + layer = poppler_layer->layer; + + if (layer->oc->getState () == OptionalContentGroup::On) + return; + + layer->oc->setState (OptionalContentGroup::On); + + for (l = poppler_layer->rbgroup; l && l->data; l = g_list_next (l)) { + OptionalContentGroup *oc = (OptionalContentGroup *)l->data; + + if (oc != layer->oc) + oc->setState (OptionalContentGroup::Off); + } +} + +/** + * poppler_layer_hide + * @layer: a #PopplerLayer + * + * Hides @layer. If @layer is the parent of other nested layers, + * such layers will be also hidden and will be blocked until @layer + * is shown again + * + * Since: 0.12 + **/ +void +poppler_layer_hide (PopplerLayer *poppler_layer) +{ + Layer *layer; + + g_return_if_fail (POPPLER_IS_LAYER (poppler_layer)); + + layer = poppler_layer->layer; + + if (layer->oc->getState () == OptionalContentGroup::Off) + return; + + layer->oc->setState (OptionalContentGroup::Off); +} + + +/** + * poppler_layer_is_parent + * @layer: a #PopplerLayer + * + * Returns whether @layer is parent of other nested layers. + * + * Return value: %TRUE if @layer is a parent layer + * + * Since: 0.12 + **/ +gboolean +poppler_layer_is_parent (PopplerLayer *poppler_layer) +{ + g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), FALSE); + + return poppler_layer->layer->kids != NULL; +} + +/** + * poppler_layer_get_radio_button_group_id + * @layer: a #PopplerLayer + * + * Returns the numeric ID the radio button group associated with @layer. + * + * Return value: the ID of the radio button group associated with @layer, + * or 0 if the layer is not associated to any radio button group + * + * Since: 0.12 + **/ +gint +poppler_layer_get_radio_button_group_id (PopplerLayer *poppler_layer) +{ + g_return_val_if_fail (POPPLER_IS_LAYER (poppler_layer), FALSE); + + return GPOINTER_TO_INT (poppler_layer->rbgroup); +} diff --git a/glib/poppler-layer.h b/glib/poppler-layer.h new file mode 100644 index 0000000..2434e27 --- /dev/null +++ b/glib/poppler-layer.h @@ -0,0 +1,43 @@ +/* poppler-layer.h: glib interface to poppler + * + * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_LAYER_H__ +#define __POPPLER_LAYER_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +#define POPPLER_TYPE_LAYER (poppler_layer_get_type ()) +#define POPPLER_LAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_LAYER, PopplerLayer)) +#define POPPLER_IS_LAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_LAYER)) + +GType poppler_layer_get_type (void) G_GNUC_CONST; + +const gchar *poppler_layer_get_title (PopplerLayer *layer); +gboolean poppler_layer_is_visible (PopplerLayer *layer); +void poppler_layer_show (PopplerLayer *layer); +void poppler_layer_hide (PopplerLayer *layer); +gboolean poppler_layer_is_parent (PopplerLayer *layer); +gint poppler_layer_get_radio_button_group_id (PopplerLayer *layer); + +G_END_DECLS + +#endif /* __POPPLER_LAYER_H__ */ diff --git a/glib/poppler-media.cc b/glib/poppler-media.cc new file mode 100644 index 0000000..5712371 --- /dev/null +++ b/glib/poppler-media.cc @@ -0,0 +1,318 @@ +/* poppler-media.cc: glib interface to MediaRendition + * + * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <errno.h> +#include <glib/gstdio.h> + +#include "poppler-media.h" +#include "poppler-private.h" + +/** + * SECTION: poppler-media + * @short_description: Media + * @title: PopplerMedia + */ + +typedef struct _PopplerMediaClass PopplerMediaClass; + +struct _PopplerMedia +{ + GObject parent_instance; + + gchar *filename; + + gchar *mime_type; + Stream *stream; +}; + +struct _PopplerMediaClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerMedia, poppler_media, G_TYPE_OBJECT); + +static void +poppler_media_finalize (GObject *object) +{ + PopplerMedia *media = POPPLER_MEDIA(object); + + if (media->filename) { + g_free (media->filename); + media->filename = NULL; + } + + if (media->mime_type) { + g_free (media->mime_type); + media->mime_type = NULL; + } + + if (media->stream) { + media->stream->decRef(); + media->stream = NULL; + } + + G_OBJECT_CLASS (poppler_media_parent_class)->finalize (object); +} + +static void +poppler_media_class_init (PopplerMediaClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_media_finalize; +} + +static void +poppler_media_init (PopplerMedia *media) +{ +} + +PopplerMedia * +_poppler_media_new (MediaRendition *poppler_media) +{ + PopplerMedia *media; + + g_assert (poppler_media != NULL); + + media = POPPLER_MEDIA (g_object_new (POPPLER_TYPE_MEDIA, NULL)); + + if (poppler_media->getIsEmbedded()) { + GooString* mime_type; + + media->stream = poppler_media->getEmbbededStream(); + mime_type = poppler_media->getContentType(); + if (mime_type) + media->mime_type = g_strdup (mime_type->getCString()); + } else { + media->filename = g_strdup (poppler_media->getFileName()->getCString()); + } + + return media; +} + +/** +* poppler_media_get_filename: +* @poppler_media: a #PopplerMedia +* +* Returns the media clip filename, in case of non-embedded media. filename might be +* a local relative or absolute path or a URI +* +* Return value: a filename, return value is owned by #PopplerMedia and should not be freed +* +* Since: 0.14 +*/ +const gchar * +poppler_media_get_filename (PopplerMedia *poppler_media) +{ + g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), NULL); + g_return_val_if_fail (poppler_media->stream == NULL, NULL); + + return poppler_media->filename; +} + +/** + * poppler_media_is_embedded: + * @poppler_media: a #PopplerMedia + * + * Whether the media clip is embedded in the PDF. If the result is %TRUE, the embedded stream + * can be saved with poppler_media_save() or poppler_media_save_to_callback() function. + * If the result is %FALSE, the media clip filename can be retrieved with + * poppler_media_get_filename() function. + * + * Return value: %TRUE if media clip is embedded, %FALSE otherwise + * + * Since: 0.14 + */ +gboolean +poppler_media_is_embedded (PopplerMedia *poppler_media) +{ + g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE); + + return poppler_media->stream != NULL; +} + +/** + * poppler_media_get_mime_type: + * @poppler_media: a #PopplerMedia + * + * Returns the media clip mime-type + * + * Return value: the mime-type, return value is owned by #PopplerMedia and should not be freed + * + * Since: 0.14 + */ +const gchar * +poppler_media_get_mime_type (PopplerMedia *poppler_media) +{ + g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), NULL); + + return poppler_media->mime_type; +} + +static gboolean +save_helper (const gchar *buf, + gsize count, + gpointer data, + GError **error) +{ + FILE *f = (FILE *) data; + gsize n; + + n = fwrite (buf, 1, count, f); + if (n != count) + { + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + "Error writing to media file: %s", + g_strerror (errno)); + return FALSE; + } + + return TRUE; +} + +/** + * poppler_media_save: + * @poppler_media: a #PopplerMedia + * @filename: name of file to save + * @error: (allow-none): return location for error, or %NULL. + * + * Saves embedded stream of @poppler_media to a file indicated by @filename. + * If @error is set, %FALSE will be returned. + * Possible errors include those in the #G_FILE_ERROR domain + * and whatever the save function generates. + * + * Return value: %TRUE, if the file successfully saved + * + * Since: 0.14 + */ +gboolean +poppler_media_save (PopplerMedia *poppler_media, + const char *filename, + GError **error) +{ + gboolean result; + FILE *f; + + g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE); + g_return_val_if_fail (poppler_media->stream != NULL, FALSE); + + f = g_fopen (filename, "wb"); + + if (f == NULL) + { + gchar *display_name = g_filename_display_name (filename); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + "Failed to open '%s' for writing: %s", + display_name, + g_strerror (errno)); + g_free (display_name); + return FALSE; + } + + result = poppler_media_save_to_callback (poppler_media, save_helper, f, error); + + if (fclose (f) < 0) + { + gchar *display_name = g_filename_display_name (filename); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errno), + "Failed to close '%s', all data may not have been saved: %s", + display_name, + g_strerror (errno)); + g_free (display_name); + return FALSE; + } + + return result; +} + +#define BUF_SIZE 1024 + +/** + * poppler_media_save_to_callback: + * @poppler_media: a #PopplerMedia + * @save_func: (scope call): a function that is called to save each block of data that the save routine generates. + * @user_data: user data to pass to the save function. + * @error: (allow-none): return location for error, or %NULL. + * + * Saves embedded stream of @poppler_media by feeding the produced data to @save_func. Can be used + * when you want to store the media clip stream to something other than a file, such as + * an in-memory buffer or a socket. If @error is set, %FALSE will be + * returned. Possible errors include those in the #G_FILE_ERROR domain and + * whatever the save function generates. + * + * Return value: %TRUE, if the save successfully completed + * + * Since: 0.14 + */ +gboolean +poppler_media_save_to_callback (PopplerMedia *poppler_media, + PopplerMediaSaveFunc save_func, + gpointer user_data, + GError **error) +{ + Stream *stream; + gchar buf[BUF_SIZE]; + int i; + gboolean eof_reached = FALSE; + + g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE); + g_return_val_if_fail (poppler_media->stream != NULL, FALSE); + + stream = poppler_media->stream; + stream->reset(); + + do + { + int data; + + for (i = 0; i < BUF_SIZE; i++) + { + data = stream->getChar (); + if (data == EOF) + { + eof_reached = TRUE; + break; + } + buf[i] = data; + } + + if (i > 0) + { + if (! (save_func) (buf, i, user_data, error)) + { + stream->close (); + return FALSE; + } + } + } + while (! eof_reached); + + stream->close (); + + return TRUE; +} diff --git a/glib/poppler-media.h b/glib/poppler-media.h new file mode 100644 index 0000000..f324e1b --- /dev/null +++ b/glib/poppler-media.h @@ -0,0 +1,73 @@ +/* poppler-media.h: glib interface to MediaRendition + * + * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_MEDIA_H__ +#define __POPPLER_MEDIA_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +#define POPPLER_TYPE_MEDIA (poppler_media_get_type ()) +#define POPPLER_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_MEDIA, PopplerMedia)) +#define POPPLER_IS_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_MEDIA)) + +// FIXME: this should be generic (PopplerSaveToCallbackFunc) + +/** + * PopplerMediaSaveFunc: + * @buf: (array length=count) (element-type guint8): buffer containing + * bytes to be written. + * @count: number of bytes in @buf. + * @data: (closure): user data passed to poppler_media_save_to_callback() + * @error: GError to set on error, or %NULL + * + * Specifies the type of the function passed to + * poppler_media_save_to_callback(). It is called once for each block of + * bytes that is "written" by poppler_media_save_to_callback(). If + * successful it should return %TRUE. If an error occurs it should set + * @error and return %FALSE, in which case poppler_media_save_to_callback() + * will fail with the same error. + * + * Returns: %TRUE if successful, %FALSE (with @error set) if failed. + * + * Since: 0.14 + */ +typedef gboolean (*PopplerMediaSaveFunc) (const gchar *buf, + gsize count, + gpointer data, + GError **error); + +GType poppler_media_get_type (void) G_GNUC_CONST; +gboolean poppler_media_is_embedded (PopplerMedia *poppler_media); +const gchar *poppler_media_get_filename (PopplerMedia *poppler_media); +const gchar *poppler_media_get_mime_type (PopplerMedia *poppler_media); +gboolean poppler_media_save (PopplerMedia *poppler_media, + const char *filename, + GError **error); +gboolean poppler_media_save_to_callback (PopplerMedia *poppler_media, + PopplerMediaSaveFunc save_func, + gpointer user_data, + GError **error); + +G_END_DECLS + +#endif /* __POPPLER_MEDIA_H__ */ + diff --git a/glib/poppler-movie.cc b/glib/poppler-movie.cc new file mode 100644 index 0000000..cb5a2ad --- /dev/null +++ b/glib/poppler-movie.cc @@ -0,0 +1,152 @@ +/* poppler-movie.cc: glib interface to Movie + * + * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> + * Copyright (C) 2008 Hugo Mercier <hmercier31[@]gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-movie.h" +#include "poppler-private.h" + +/** + * SECTION: poppler-movie + * @short_description: Movies + * @title: PopplerMovie + */ + +typedef struct _PopplerMovieClass PopplerMovieClass; + +struct _PopplerMovie +{ + GObject parent_instance; + + gchar *filename; + gboolean need_poster; + gboolean show_controls; +}; + +struct _PopplerMovieClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerMovie, poppler_movie, G_TYPE_OBJECT); + +static void +poppler_movie_finalize (GObject *object) +{ + PopplerMovie* movie = POPPLER_MOVIE(object); + + if (movie->filename) { + g_free (movie->filename); + movie->filename = NULL; + } + + G_OBJECT_CLASS (poppler_movie_parent_class)->finalize (object); +} + +static void +poppler_movie_class_init (PopplerMovieClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_movie_finalize; +} + +static void +poppler_movie_init (PopplerMovie *movie) +{ +} + +PopplerMovie * +_poppler_movie_new (Movie *poppler_movie) +{ + PopplerMovie *movie; + + g_assert (poppler_movie != NULL); + + movie = POPPLER_MOVIE (g_object_new (POPPLER_TYPE_MOVIE, NULL)); + + movie->filename = g_strdup (poppler_movie->getFileName()->getCString()); + if (poppler_movie->getShowPoster()) { + Object tmp; + + poppler_movie->getPoster(&tmp); + movie->need_poster = (!tmp.isRef() && !tmp.isStream()); + tmp.free(); + } + + movie->show_controls = poppler_movie->getActivationParameters()->showControls; + + return movie; +} + +/** +* poppler_movie_get_filename: +* @poppler_movie: a #PopplerMovie +* +* Returns the local filename identifying a self-describing movie file +* +* Return value: a local filename, return value is owned by #PopplerMovie and +* should not be freed +* +* Since: 0.14 +*/ +const gchar * +poppler_movie_get_filename (PopplerMovie *poppler_movie) +{ + g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), NULL); + + return poppler_movie->filename; +} + +/** + * poppler_movie_need_poster: + * @poppler_movie: a #PopplerMovie + * + * Returns whether a poster image representing the Movie + * shall be displayed. The poster image must be retrieved + * from the movie file. + * + * Return value: %TRUE if move needs a poster image, %FALSE otherwise + * + * Since: 0.14 + */ +gboolean +poppler_movie_need_poster (PopplerMovie *poppler_movie) +{ + g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE); + + return poppler_movie->need_poster; +} + +/** + * poppler_movie_show_controls: + * @poppler_movie: a #PopplerMovie + * + * Returns whether to display a movie controller bar while playing the movie + * + * Return value: %TRUE if controller bar should be displayed, %FALSE otherwise + * + * Since: 0.14 + */ +gboolean +poppler_movie_show_controls (PopplerMovie *poppler_movie) +{ + g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE); + + return poppler_movie->show_controls; +} diff --git a/glib/poppler-movie.h b/glib/poppler-movie.h new file mode 100644 index 0000000..9e1bc32 --- /dev/null +++ b/glib/poppler-movie.h @@ -0,0 +1,42 @@ +/* poppler-movie.h: glib interface to Movie + * + * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> + * Copyright (C) 2008 Hugo Mercier <hmercier31[@]gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_MOVIE_H__ +#define __POPPLER_MOVIE_H__ + +#include <glib-object.h> +#include "poppler.h" + +G_BEGIN_DECLS + +#define POPPLER_TYPE_MOVIE (poppler_movie_get_type ()) +#define POPPLER_MOVIE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_MOVIE, PopplerMovie)) +#define POPPLER_IS_MOVIE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_MOVIE)) + + +GType poppler_movie_get_type (void) G_GNUC_CONST; +const gchar *poppler_movie_get_filename (PopplerMovie *poppler_movie); +gboolean poppler_movie_need_poster (PopplerMovie *poppler_movie); +gboolean poppler_movie_show_controls (PopplerMovie *poppler_movie); + +G_END_DECLS + +#endif /* __POPPLER_MOVIE_H__ */ + diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc new file mode 100644 index 0000000..156e2d7 --- /dev/null +++ b/glib/poppler-page.cc @@ -0,0 +1,2108 @@ +/* poppler-page.cc: glib wrapper for poppler + * Copyright (C) 2005, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include <math.h> + +#ifndef __GI_SCANNER__ +#include <goo/GooList.h> +#include <GlobalParams.h> +#include <PDFDoc.h> +#include <Outline.h> +#include <ErrorCodes.h> +#include <UnicodeMap.h> +#include <GfxState.h> +#include <PageTransition.h> +#endif + +#include "poppler.h" +#include "poppler-private.h" + +/** + * SECTION:poppler-page + * @short_description: Information about a page in a document + * @title: PopplerPage + */ + +enum +{ + PROP_0, + PROP_LABEL +}; + +typedef struct _PopplerPageClass PopplerPageClass; +struct _PopplerPageClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (PopplerPage, poppler_page, G_TYPE_OBJECT) + +PopplerPage * +_poppler_page_new (PopplerDocument *document, Page *page, int index) +{ + PopplerPage *poppler_page; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL); + + poppler_page = (PopplerPage *) g_object_new (POPPLER_TYPE_PAGE, NULL, NULL); + poppler_page->document = (PopplerDocument *) g_object_ref (document); + poppler_page->page = page; + poppler_page->index = index; + + return poppler_page; +} + +static void +poppler_page_finalize (GObject *object) +{ + PopplerPage *page = POPPLER_PAGE (object); + + g_object_unref (page->document); + page->document = NULL; + + if (page->text != NULL) + page->text->decRefCnt(); + /* page->page is owned by the document */ +} + +/** + * poppler_page_get_size: + * @page: A #PopplerPage + * @width: (out) (allow-none): return location for the width of @page + * @height: (out) (allow-none): return location for the height of @page + * + * Gets the size of @page at the current scale and rotation. + **/ +void +poppler_page_get_size (PopplerPage *page, + double *width, + double *height) +{ + double page_width, page_height; + int rotate; + + g_return_if_fail (POPPLER_IS_PAGE (page)); + + rotate = page->page->getRotate (); + if (rotate == 90 || rotate == 270) { + page_height = page->page->getCropWidth (); + page_width = page->page->getCropHeight (); + } else { + page_width = page->page->getCropWidth (); + page_height = page->page->getCropHeight (); + } + + if (width != NULL) + *width = page_width; + if (height != NULL) + *height = page_height; +} + +/** + * poppler_page_get_index: + * @page: a #PopplerPage + * + * Returns the index of @page + * + * Return value: index value of @page + **/ +int +poppler_page_get_index (PopplerPage *page) +{ + g_return_val_if_fail (POPPLER_IS_PAGE (page), 0); + + return page->index; +} + +/** + * poppler_page_get_label: + * @page: a #PopplerPage + * + * Returns the label of @page. Note that page labels + * and page indices might not coincide. + * + * Return value: a new allocated string containing the label of @page, + * or %NULL if @page doesn't have a label + * + * Since: 0.16 + **/ +gchar * +poppler_page_get_label (PopplerPage *page) +{ + GooString label; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + page->document->doc->getCatalog ()->indexToLabel (page->index, &label); + return _poppler_goo_string_to_utf8 (&label); +} + +/** + * poppler_page_get_duration: + * @page: a #PopplerPage + * + * Returns the duration of @page + * + * Return value: duration in seconds of @page or -1. + **/ +double +poppler_page_get_duration (PopplerPage *page) +{ + g_return_val_if_fail (POPPLER_IS_PAGE (page), -1); + + return page->page->getDuration (); +} + +/** + * poppler_page_get_transition: + * @page: a #PopplerPage + * + * Returns the transition effect of @page + * + * Return value: a #PopplerPageTransition or %NULL. + **/ +PopplerPageTransition * +poppler_page_get_transition (PopplerPage *page) +{ + PageTransition *trans; + PopplerPageTransition *transition; + Object obj; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + trans = new PageTransition (page->page->getTrans (&obj)); + obj.free (); + + if (!trans->isOk ()) { + delete trans; + return NULL; + } + + transition = poppler_page_transition_new (); + + switch (trans->getType ()) + { + case transitionReplace: + transition->type = POPPLER_PAGE_TRANSITION_REPLACE; + break; + case transitionSplit: + transition->type = POPPLER_PAGE_TRANSITION_SPLIT; + break; + case transitionBlinds: + transition->type = POPPLER_PAGE_TRANSITION_BLINDS; + break; + case transitionBox: + transition->type = POPPLER_PAGE_TRANSITION_BOX; + break; + case transitionWipe: + transition->type = POPPLER_PAGE_TRANSITION_WIPE; + break; + case transitionDissolve: + transition->type = POPPLER_PAGE_TRANSITION_DISSOLVE; + break; + case transitionGlitter: + transition->type = POPPLER_PAGE_TRANSITION_GLITTER; + break; + case transitionFly: + transition->type = POPPLER_PAGE_TRANSITION_FLY; + break; + case transitionPush: + transition->type = POPPLER_PAGE_TRANSITION_PUSH; + break; + case transitionCover: + transition->type = POPPLER_PAGE_TRANSITION_COVER; + break; + case transitionUncover: + transition->type = POPPLER_PAGE_TRANSITION_UNCOVER; + break; + case transitionFade: + transition->type = POPPLER_PAGE_TRANSITION_FADE; + break; + default: + g_assert_not_reached (); + } + + transition->alignment = (trans->getAlignment() == transitionHorizontal) ? + POPPLER_PAGE_TRANSITION_HORIZONTAL : + POPPLER_PAGE_TRANSITION_VERTICAL; + + transition->direction = (trans->getDirection() == transitionInward) ? + POPPLER_PAGE_TRANSITION_INWARD : + POPPLER_PAGE_TRANSITION_OUTWARD; + + transition->duration = trans->getDuration(); + transition->angle = trans->getAngle(); + transition->scale = trans->getScale(); + transition->rectangular = trans->isRectangular(); + + delete trans; + + return transition; +} + +static TextPage * +poppler_page_get_text_page (PopplerPage *page) +{ + if (page->text == NULL) { + TextOutputDev *text_dev; + Gfx *gfx; + + text_dev = new TextOutputDev (NULL, gTrue, 0, gFalse, gFalse); + gfx = page->page->createGfx(text_dev, + 72.0, 72.0, 0, + gFalse, /* useMediaBox */ + gTrue, /* Crop */ + -1, -1, -1, -1, + gFalse, /* printing */ + NULL, NULL); + page->page->display(gfx); + text_dev->endPage(); + + page->text = text_dev->takeText(); + delete gfx; + delete text_dev; + } + + return page->text; +} + +static gboolean +annot_is_markup (Annot *annot) +{ + switch (annot->getType()) + { + case Annot::typeLink: + case Annot::typePopup: + case Annot::typeMovie: + case Annot::typeScreen: + case Annot::typePrinterMark: + case Annot::typeTrapNet: + case Annot::typeWatermark: + case Annot::type3D: + case Annot::typeWidget: + return FALSE; + default: + return TRUE; + } +} + +static GBool +poppler_print_annot_cb (Annot *annot, void *user_data) +{ + PopplerPrintFlags user_print_flags = (PopplerPrintFlags)GPOINTER_TO_INT (user_data); + + if (annot->getFlags () & Annot::flagHidden) + return gFalse; + + if (user_print_flags & POPPLER_PRINT_STAMP_ANNOTS_ONLY) { + return (annot->getType() == Annot::typeStamp) ? + (annot->getFlags () & Annot::flagPrint) : + (annot->getType() == Annot::typeWidget); + } + + if (user_print_flags & POPPLER_PRINT_MARKUP_ANNOTS) { + return annot_is_markup (annot) ? + (annot->getFlags () & Annot::flagPrint) : + (annot->getType() == Annot::typeWidget); + } + + /* Print document only, form fields are always printed */ + return (annot->getType() == Annot::typeWidget); +} + +static void +_poppler_page_render (PopplerPage *page, + cairo_t *cairo, + GBool printing, + PopplerPrintFlags print_flags) +{ + CairoOutputDev *output_dev; + + g_return_if_fail (POPPLER_IS_PAGE (page)); + + output_dev = page->document->output_dev; + output_dev->setCairo (cairo); + output_dev->setPrinting (printing); + + if (!printing) + output_dev->setTextPage (page->text); + + /* NOTE: instead of passing -1 we should/could use cairo_clip_extents() + * to get a bounding box */ + cairo_save (cairo); + page->page->displaySlice(output_dev, + 72.0, 72.0, 0, + gFalse, /* useMediaBox */ + gTrue, /* Crop */ + -1, -1, + -1, -1, + printing, + NULL, NULL, + printing ? poppler_print_annot_cb : NULL, + printing ? GINT_TO_POINTER ((gint)print_flags) : NULL); + cairo_restore (cairo); + + output_dev->setCairo (NULL); + output_dev->setTextPage (NULL); +} + +/** + * poppler_page_render: + * @page: the page to render from + * @cairo: cairo context to render to + * + * Render the page to the given cairo context. This function + * is for rendering a page that will be displayed. If you want + * to render a page that will be printed use + * poppler_page_render_for_printing() instead + **/ +void +poppler_page_render (PopplerPage *page, + cairo_t *cairo) +{ + g_return_if_fail (POPPLER_IS_PAGE (page)); + + if (!page->text) + page->text = new TextPage(gFalse); + + _poppler_page_render (page, cairo, gFalse, (PopplerPrintFlags)0); +} + +/** + * poppler_page_render_for_printing_with_options: + * @page: the page to render from + * @cairo: cairo context to render to + * @options: print options + * + * Render the page to the given cairo context for printing + * with the specified options + * + * Since: 0.16 + **/ +void +poppler_page_render_for_printing_with_options (PopplerPage *page, + cairo_t *cairo, + PopplerPrintFlags options) +{ + g_return_if_fail (POPPLER_IS_PAGE (page)); + + _poppler_page_render (page, cairo, gTrue, options); +} + +/** + * poppler_page_render_for_printing: + * @page: the page to render from + * @cairo: cairo context to render to + * + * Render the page to the given cairo context for printing. + **/ +void +poppler_page_render_for_printing (PopplerPage *page, + cairo_t *cairo) +{ + g_return_if_fail (POPPLER_IS_PAGE (page)); + + _poppler_page_render (page, cairo, gTrue, POPPLER_PRINT_ALL); +} + +static cairo_surface_t * +create_surface_from_thumbnail_data (guchar *data, + gint width, + gint height, + gint rowstride) +{ + guchar *cairo_pixels; + gint cairo_stride; + cairo_surface_t *surface; + int j; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + if (cairo_surface_status (surface)) + return NULL; + + cairo_pixels = cairo_image_surface_get_data (surface); + cairo_stride = cairo_image_surface_get_stride (surface); + + for (j = height; j; j--) { + guchar *p = data; + guchar *q = cairo_pixels; + guchar *end = p + 3 * width; + + while (p < end) { +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + q[0] = p[2]; + q[1] = p[1]; + q[2] = p[0]; +#else + q[1] = p[0]; + q[2] = p[1]; + q[3] = p[2]; +#endif + p += 3; + q += 4; + } + + data += rowstride; + cairo_pixels += cairo_stride; + } + + return surface; +} + + +/** + * poppler_page_get_thumbnail: + * @page: the #PopplerPage to get the thumbnail for + * + * Get the embedded thumbnail for the specified page. If the document + * doesn't have an embedded thumbnail for the page, this function + * returns %NULL. + * + * Return value: the tumbnail as a cairo_surface_t or %NULL if the document + * doesn't have a thumbnail for this page. + **/ +cairo_surface_t * +poppler_page_get_thumbnail (PopplerPage *page) +{ + unsigned char *data; + int width, height, rowstride; + cairo_surface_t *surface; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + if (!page->page->loadThumb (&data, &width, &height, &rowstride)) + return NULL; + + surface = create_surface_from_thumbnail_data (data, width, height, rowstride); + gfree (data); + + return surface; +} + +/** + * poppler_page_render_selection: + * @page: the #PopplerPage for which to render selection + * @cairo: cairo context to render to + * @selection: start and end point of selection as a rectangle + * @old_selection: previous selection + * @style: a #PopplerSelectionStyle + * @glyph_color: color to use for drawing glyphs + * @background_color: color to use for the selection background + * + * Render the selection specified by @selection for @page to + * the given cairo context. The selection will be rendered, using + * @glyph_color for the glyphs and @background_color for the selection + * background. + * + * If non-NULL, @old_selection specifies the selection that is already + * rendered to @cairo, in which case this function will (some day) + * only render the changed part of the selection. + **/ +void +poppler_page_render_selection (PopplerPage *page, + cairo_t *cairo, + PopplerRectangle *selection, + PopplerRectangle *old_selection, + PopplerSelectionStyle style, + PopplerColor *glyph_color, + PopplerColor *background_color) +{ + CairoOutputDev *output_dev; + TextPage *text; + SelectionStyle selection_style = selectionStyleGlyph; + PDFRectangle pdf_selection(selection->x1, selection->y1, + selection->x2, selection->y2); + + GfxColor gfx_background_color = { + { + background_color->red, + background_color->green, + background_color->blue + } + }; + GfxColor gfx_glyph_color = { + { + glyph_color->red, + glyph_color->green, + glyph_color->blue + } + }; + + switch (style) + { + case POPPLER_SELECTION_GLYPH: + selection_style = selectionStyleGlyph; + break; + case POPPLER_SELECTION_WORD: + selection_style = selectionStyleWord; + break; + case POPPLER_SELECTION_LINE: + selection_style = selectionStyleLine; + break; + } + + output_dev = page->document->output_dev; + output_dev->setCairo (cairo); + + text = poppler_page_get_text_page (page); + text->drawSelection (output_dev, 1.0, 0, + &pdf_selection, selection_style, + &gfx_glyph_color, &gfx_background_color); + + output_dev->setCairo (NULL); +} + +/** + * poppler_page_get_thumbnail_size: + * @page: A #PopplerPage + * @width: (out) return location for width + * @height: (out) return location for height + * + * Returns %TRUE if @page has a thumbnail associated with it. It also + * fills in @width and @height with the width and height of the + * thumbnail. The values of width and height are not changed if no + * appropriate thumbnail exists. + * + * Return value: %TRUE, if @page has a thumbnail associated with it. + **/ +gboolean +poppler_page_get_thumbnail_size (PopplerPage *page, + int *width, + int *height) +{ + Object thumb; + Dict *dict; + gboolean retval = FALSE; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); + g_return_val_if_fail (width != NULL, FALSE); + g_return_val_if_fail (height != NULL, FALSE); + + page->page->getThumb (&thumb); + if (!thumb.isStream ()) + { + thumb.free (); + return FALSE; + } + + dict = thumb.streamGetDict(); + + /* Theoretically, this could succeed and you would still fail when + * loading the thumb */ + if (dict->lookupInt ("Width", "W", width) && + dict->lookupInt ("Height", "H", height)) + retval = TRUE; + + thumb.free (); + + return retval; +} + +/** + * poppler_page_get_selection_region: + * @page: a #PopplerPage + * @scale: scale specified as pixels per point + * @style: a #PopplerSelectionStyle + * @selection: start and end point of selection as a rectangle + * + * Returns a region containing the area that would be rendered by + * poppler_page_render_selection() as a #GList of + * #PopplerRectangle. The returned list must be freed with + * poppler_page_selection_region_free(). + * + * Return value: (element-type PopplerRectangle) (transfer full): a #GList of #PopplerRectangle + * + * Deprecated: 0.16: Use poppler_page_get_selected_region() instead. + **/ +GList * +poppler_page_get_selection_region (PopplerPage *page, + gdouble scale, + PopplerSelectionStyle style, + PopplerRectangle *selection) +{ + PDFRectangle poppler_selection; + TextPage *text; + SelectionStyle selection_style = selectionStyleGlyph; + GooList *list; + GList *region = NULL; + int i; + + poppler_selection.x1 = selection->x1; + poppler_selection.y1 = selection->y1; + poppler_selection.x2 = selection->x2; + poppler_selection.y2 = selection->y2; + + switch (style) + { + case POPPLER_SELECTION_GLYPH: + selection_style = selectionStyleGlyph; + break; + case POPPLER_SELECTION_WORD: + selection_style = selectionStyleWord; + break; + case POPPLER_SELECTION_LINE: + selection_style = selectionStyleLine; + break; + } + + text = poppler_page_get_text_page (page); + list = text->getSelectionRegion(&poppler_selection, + selection_style, scale); + + for (i = 0; i < list->getLength(); i++) { + PDFRectangle *selection_rect = (PDFRectangle *) list->get(i); + PopplerRectangle *rect; + + rect = poppler_rectangle_new (); + + rect->x1 = selection_rect->x1; + rect->y1 = selection_rect->y1; + rect->x2 = selection_rect->x2; + rect->y2 = selection_rect->y2; + + region = g_list_prepend (region, rect); + + delete selection_rect; + } + + delete list; + + return g_list_reverse (region); +} + +/** + * poppler_page_selection_region_free: + * @region: (element-type PopplerRectangle): a #GList of + * #PopplerRectangle + * + * Frees @region + * + * Deprecated: 0.16 + */ +void +poppler_page_selection_region_free (GList *region) +{ + if (G_UNLIKELY (!region)) + return; + + g_list_foreach (region, (GFunc)poppler_rectangle_free, NULL); + g_list_free (region); +} + +/** + * poppler_page_get_selected_region: + * @page: a #PopplerPage + * @scale: scale specified as pixels per point + * @style: a #PopplerSelectionStyle + * @selection: start and end point of selection as a rectangle + * + * Returns a region containing the area that would be rendered by + * poppler_page_render_selection(). + * The returned region must be freed with cairo_region_destroy() + * + * Return value: (transfer full): a cairo_region_t + * + * Since: 0.16 + **/ +cairo_region_t * +poppler_page_get_selected_region (PopplerPage *page, + gdouble scale, + PopplerSelectionStyle style, + PopplerRectangle *selection) +{ + PDFRectangle poppler_selection; + TextPage *text; + SelectionStyle selection_style = selectionStyleGlyph; + GooList *list; + cairo_region_t *region; + int i; + + poppler_selection.x1 = selection->x1; + poppler_selection.y1 = selection->y1; + poppler_selection.x2 = selection->x2; + poppler_selection.y2 = selection->y2; + + switch (style) + { + case POPPLER_SELECTION_GLYPH: + selection_style = selectionStyleGlyph; + break; + case POPPLER_SELECTION_WORD: + selection_style = selectionStyleWord; + break; + case POPPLER_SELECTION_LINE: + selection_style = selectionStyleLine; + break; + } + + text = poppler_page_get_text_page (page); + list = text->getSelectionRegion(&poppler_selection, + selection_style, 1.0); + + region = cairo_region_create (); + + for (i = 0; i < list->getLength(); i++) { + PDFRectangle *selection_rect = (PDFRectangle *) list->get(i); + cairo_rectangle_int_t rect; + + rect.x = (gint) ((selection_rect->x1 * scale) + 0.5); + rect.y = (gint) ((selection_rect->y1 * scale) + 0.5); + rect.width = (gint) (((selection_rect->x2 - selection_rect->x1) * scale) + 0.5); + rect.height = (gint) (((selection_rect->y2 - selection_rect->y1) * scale) + 0.5); + cairo_region_union_rectangle (region, &rect); + + delete selection_rect; + } + + delete list; + + return region; +} + +/** + * poppler_page_get_selected_text: + * @page: a #PopplerPage + * @style: a #PopplerSelectionStyle + * @selection: the #PopplerRectangle including the text + * + * Retrieves the contents of the specified @selection as text. + * + * Return value: a pointer to the contents of the @selection + * as a string + * Since: 0.16 + **/ +char * +poppler_page_get_selected_text (PopplerPage *page, + PopplerSelectionStyle style, + PopplerRectangle *selection) +{ + GooString *sel_text; + char *result; + TextPage *text; + SelectionStyle selection_style = selectionStyleGlyph; + PDFRectangle pdf_selection; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + g_return_val_if_fail (selection != NULL, NULL); + + pdf_selection.x1 = selection->x1; + pdf_selection.y1 = selection->y1; + pdf_selection.x2 = selection->x2; + pdf_selection.y2 = selection->y2; + + switch (style) + { + case POPPLER_SELECTION_GLYPH: + selection_style = selectionStyleGlyph; + break; + case POPPLER_SELECTION_WORD: + selection_style = selectionStyleWord; + break; + case POPPLER_SELECTION_LINE: + selection_style = selectionStyleLine; + break; + } + + text = poppler_page_get_text_page (page); + sel_text = text->getSelectionText (&pdf_selection, selection_style); + result = g_strdup (sel_text->getCString ()); + delete sel_text; + + return result; +} + +/** + * poppler_page_get_text: + * @page: a #PopplerPage + * + * Retrieves the text of @page. + * + * Return value: a pointer to the text of the @page + * as a string + * Since: 0.16 + **/ +char * +poppler_page_get_text (PopplerPage *page) +{ + PopplerRectangle rectangle = {0, 0, 0, 0}; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + poppler_page_get_size (page, &rectangle.x2, &rectangle.y2); + + return poppler_page_get_selected_text (page, POPPLER_SELECTION_GLYPH, &rectangle); +} + +/** + * poppler_page_find_text: + * @page: a #PopplerPage + * @text: the text to search for (UTF-8 encoded) + * + * A #GList of rectangles for each occurance of the text on the page. + * The coordinates are in PDF points. + * + * Return value: (element-type PopplerRectangle) (transfer full): a #GList of #PopplerRectangle, + **/ +GList * +poppler_page_find_text (PopplerPage *page, + const char *text) +{ + PopplerRectangle *match; + GList *matches; + double xMin, yMin, xMax, yMax; + gunichar *ucs4; + glong ucs4_len; + double height; + TextPage *text_dev; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + g_return_val_if_fail (text != NULL, NULL); + + text_dev = poppler_page_get_text_page (page); + + ucs4 = g_utf8_to_ucs4_fast (text, -1, &ucs4_len); + poppler_page_get_size (page, NULL, &height); + + matches = NULL; + xMin = 0; + yMin = 0; + + while (text_dev->findText (ucs4, ucs4_len, + gFalse, gTrue, // startAtTop, stopAtBottom + gFalse, gFalse, // startAtLast, stopAtLast + gFalse, gFalse, // caseSensitive, backwards + gFalse, // wholeWord + &xMin, &yMin, &xMax, &yMax)) + { + match = poppler_rectangle_new (); + match->x1 = xMin; + match->y1 = height - yMax; + match->x2 = xMax; + match->y2 = height - yMin; + matches = g_list_prepend (matches, match); + } + + g_free (ucs4); + + return g_list_reverse (matches); +} + +static CairoImageOutputDev * +poppler_page_get_image_output_dev (PopplerPage *page, + GBool (*imgDrawDeviceCbk)(int img_id, void *data), + void *imgDrawCbkData) +{ + CairoImageOutputDev *image_dev; + Gfx *gfx; + + image_dev = new CairoImageOutputDev (); + + if (imgDrawDeviceCbk) { + image_dev->setImageDrawDecideCbk (imgDrawDeviceCbk, + imgDrawCbkData); + } + + gfx = page->page->createGfx(image_dev, + 72.0, 72.0, 0, + gFalse, /* useMediaBox */ + gTrue, /* Crop */ + -1, -1, -1, -1, + gFalse, /* printing */ + NULL, NULL); + page->page->display(gfx); + delete gfx; + + return image_dev; +} + +/** + * poppler_page_get_image_mapping: + * @page: A #PopplerPage + * + * Returns a list of #PopplerImageMapping items that map from a + * location on @page to an image of the page. This list must be freed + * with poppler_page_free_image_mapping() when done. + * + * Return value: (element-type PopplerImageMapping) (transfer full): A #GList of #PopplerImageMapping + **/ +GList * +poppler_page_get_image_mapping (PopplerPage *page) +{ + GList *map_list = NULL; + CairoImageOutputDev *out; + gint i; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + out = poppler_page_get_image_output_dev (page, NULL, NULL); + + for (i = 0; i < out->getNumImages (); i++) { + PopplerImageMapping *mapping; + CairoImage *image; + + image = out->getImage (i); + + /* Create the mapping */ + mapping = poppler_image_mapping_new (); + + image->getRect (&(mapping->area.x1), &(mapping->area.y1), + &(mapping->area.x2), &(mapping->area.y2)); + mapping->image_id = i; + + mapping->area.x1 -= page->page->getCropBox()->x1; + mapping->area.x2 -= page->page->getCropBox()->x1; + mapping->area.y1 -= page->page->getCropBox()->y1; + mapping->area.y2 -= page->page->getCropBox()->y1; + + map_list = g_list_prepend (map_list, mapping); + } + + delete out; + + return map_list; +} + +static GBool +image_draw_decide_cb (int image_id, void *data) +{ + return (image_id == GPOINTER_TO_INT (data)); +} + +/** + * poppler_page_get_image: + * @page: A #PopplerPage + * @image_id: The image identifier + * + * Returns a cairo surface for the image of the @page + * + * Return value: A cairo surface for the image + **/ +cairo_surface_t * +poppler_page_get_image (PopplerPage *page, + gint image_id) +{ + CairoImageOutputDev *out; + cairo_surface_t *image; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + out = poppler_page_get_image_output_dev (page, + image_draw_decide_cb, + GINT_TO_POINTER (image_id)); + + if (image_id >= out->getNumImages ()) { + delete out; + + return NULL; + } + + image = out->getImage (image_id)->getImage (); + if (!image) { + delete out; + + return NULL; + } + + cairo_surface_reference (image); + delete out; + + return image; +} + +/** + * poppler_page_free_image_mapping: + * @list: (element-type PopplerImageMapping): A list of + * #PopplerImageMapping<!-- -->s + * + * Frees a list of #PopplerImageMapping<!-- -->s allocated by + * poppler_page_get_image_mapping(). + **/ +void +poppler_page_free_image_mapping (GList *list) +{ + if (G_UNLIKELY (list == NULL)) + return; + + g_list_foreach (list, (GFunc)poppler_image_mapping_free, NULL); + g_list_free (list); +} + +/** + * poppler_page_render_to_ps: + * @page: a #PopplerPage + * @ps_file: the PopplerPSFile to render to + * + * Render the page on a postscript file + * + **/ +void +poppler_page_render_to_ps (PopplerPage *page, + PopplerPSFile *ps_file) +{ + g_return_if_fail (POPPLER_IS_PAGE (page)); + g_return_if_fail (ps_file != NULL); + + if (!ps_file->out) + ps_file->out = new PSOutputDev (ps_file->filename, + ps_file->document->doc, + NULL, + ps_file->first_page, ps_file->last_page, + psModePS, (int)ps_file->paper_width, + (int)ps_file->paper_height, ps_file->duplex, + 0, 0, 0, 0, gFalse, gFalse); + + + ps_file->document->doc->displayPage (ps_file->out, page->index + 1, 72.0, 72.0, + 0, gFalse, gTrue, gFalse); +} + +static void +poppler_page_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + PopplerPage *page = POPPLER_PAGE (object); + + switch (prop_id) + { + case PROP_LABEL: + g_value_take_string (value, poppler_page_get_label (page)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +poppler_page_class_init (PopplerPageClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = poppler_page_finalize; + gobject_class->get_property = poppler_page_get_property; + + /** + * PopplerPage:label: + * + * The label of the page or %NULL. See also poppler_page_get_label() + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_LABEL, + g_param_spec_string ("label", + "Page Label", + "The label of the page", + NULL, + G_PARAM_READABLE)); +} + +static void +poppler_page_init (PopplerPage *page) +{ +} + +/** + * poppler_page_get_link_mapping: + * @page: A #PopplerPage + * + * Returns a list of #PopplerLinkMapping items that map from a + * location on @page to a #PopplerAction. This list must be freed + * with poppler_page_free_link_mapping() when done. + * + * Return value: (element-type PopplerLinkMapping) (transfer full): A #GList of #PopplerLinkMapping + **/ +GList * +poppler_page_get_link_mapping (PopplerPage *page) +{ + GList *map_list = NULL; + gint i; + Links *links; + double width, height; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + links = new Links (page->page->getAnnots ()); + + if (links == NULL) + return NULL; + + poppler_page_get_size (page, &width, &height); + + for (i = 0; i < links->getNumLinks (); i++) + { + PopplerLinkMapping *mapping; + PopplerRectangle rect; + LinkAction *link_action; + AnnotLink *link; + + link = links->getLink (i); + link_action = link->getAction (); + + /* Create the mapping */ + mapping = poppler_link_mapping_new (); + mapping->action = _poppler_action_new (page->document, link_action, NULL); + + link->getRect (&rect.x1, &rect.y1, &rect.x2, &rect.y2); + + rect.x1 -= page->page->getCropBox()->x1; + rect.x2 -= page->page->getCropBox()->x1; + rect.y1 -= page->page->getCropBox()->y1; + rect.y2 -= page->page->getCropBox()->y1; + + switch (page->page->getRotate ()) + { + case 90: + mapping->area.x1 = rect.y1; + mapping->area.y1 = height - rect.x2; + mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); + mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); + + break; + case 180: + mapping->area.x1 = width - rect.x2; + mapping->area.y1 = height - rect.y2; + mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1); + mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1); + + break; + case 270: + mapping->area.x1 = width - rect.y2; + mapping->area.y1 = rect.x1; + mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); + mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); + + break; + default: + mapping->area.x1 = rect.x1; + mapping->area.y1 = rect.y1; + mapping->area.x2 = rect.x2; + mapping->area.y2 = rect.y2; + } + + map_list = g_list_prepend (map_list, mapping); + } + + delete links; + + return map_list; +} + +/** + * poppler_page_free_link_mapping: + * @list: (element-type PopplerLinkMapping): A list of + * #PopplerLinkMapping<!-- -->s + * + * Frees a list of #PopplerLinkMapping<!-- -->s allocated by + * poppler_page_get_link_mapping(). It also frees the #PopplerAction<!-- -->s + * that each mapping contains, so if you want to keep them around, you need to + * copy them with poppler_action_copy(). + **/ +void +poppler_page_free_link_mapping (GList *list) +{ + if (G_UNLIKELY (list == NULL)) + return; + + g_list_foreach (list, (GFunc)poppler_link_mapping_free, NULL); + g_list_free (list); +} + +/** + * poppler_page_get_form_field_mapping: + * @page: A #PopplerPage + * + * Returns a list of #PopplerFormFieldMapping items that map from a + * location on @page to a form field. This list must be freed + * with poppler_page_free_form_field_mapping() when done. + * + * Return value: (element-type PopplerFormFieldMapping) (transfer full): A #GList of #PopplerFormFieldMapping + **/ +GList * +poppler_page_get_form_field_mapping (PopplerPage *page) +{ + GList *map_list = NULL; + FormPageWidgets *forms; + gint i; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + forms = page->page->getFormWidgets (); + + if (forms == NULL) + return NULL; + + for (i = 0; i < forms->getNumWidgets (); i++) { + PopplerFormFieldMapping *mapping; + FormWidget *field; + + mapping = poppler_form_field_mapping_new (); + + field = forms->getWidget (i); + + mapping->field = _poppler_form_field_new (page->document, field); + field->getRect (&(mapping->area.x1), &(mapping->area.y1), + &(mapping->area.x2), &(mapping->area.y2)); + + mapping->area.x1 -= page->page->getCropBox()->x1; + mapping->area.x2 -= page->page->getCropBox()->x1; + mapping->area.y1 -= page->page->getCropBox()->y1; + mapping->area.y2 -= page->page->getCropBox()->y1; + + map_list = g_list_prepend (map_list, mapping); + } + + delete forms; + + return map_list; +} + +/** + * poppler_page_free_form_field_mapping: + * @list: (element-type PopplerFormFieldMapping): A list of + * #PopplerFormFieldMapping<!-- -->s + * + * Frees a list of #PopplerFormFieldMapping<!-- -->s allocated by + * poppler_page_get_form_field_mapping(). + **/ +void +poppler_page_free_form_field_mapping (GList *list) +{ + if (G_UNLIKELY (list == NULL)) + return; + + g_list_foreach (list, (GFunc) poppler_form_field_mapping_free, NULL); + g_list_free (list); +} + +/** + * poppler_page_get_annot_mapping: + * @page: A #PopplerPage + * + * Returns a list of #PopplerAnnotMapping items that map from a location on + * @page to a #PopplerAnnot. This list must be freed with + * poppler_page_free_annot_mapping() when done. + * + * Return value: (element-type PopplerAnnotMapping) (transfer full): A #GList of #PopplerAnnotMapping + **/ +GList * +poppler_page_get_annot_mapping (PopplerPage *page) +{ + GList *map_list = NULL; + double width, height; + gint i; + Annots *annots; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + annots = page->page->getAnnots (); + if (!annots) + return NULL; + + poppler_page_get_size (page, &width, &height); + + for (i = 0; i < annots->getNumAnnots (); i++) { + PopplerAnnotMapping *mapping; + PopplerRectangle rect; + Annot *annot; + PDFRectangle *annot_rect; + gint rotation = 0; + + annot = annots->getAnnot (i); + + /* Create the mapping */ + mapping = poppler_annot_mapping_new (); + + switch (annot->getType ()) + { + case Annot::typeText: + mapping->annot = _poppler_annot_text_new (annot); + break; + case Annot::typeFreeText: + mapping->annot = _poppler_annot_free_text_new (annot); + break; + case Annot::typeFileAttachment: + mapping->annot = _poppler_annot_file_attachment_new (annot); + break; + case Annot::typeMovie: + mapping->annot = _poppler_annot_movie_new (annot); + break; + case Annot::typeScreen: + mapping->annot = _poppler_annot_screen_new (annot); + break; + default: + mapping->annot = _poppler_annot_new (annot); + break; + } + + annot_rect = annot->getRect (); + rect.x1 = annot_rect->x1 - page->page->getCropBox()->x1; + rect.y1 = annot_rect->y1 - page->page->getCropBox()->y1; + rect.x2 = annot_rect->x2 - page->page->getCropBox()->x1; + rect.y2 = annot_rect->y2 - page->page->getCropBox()->y1; + + if (! (annot->getFlags () & Annot::flagNoRotate)) + rotation = page->page->getRotate (); + + switch (rotation) + { + case 90: + mapping->area.x1 = rect.y1; + mapping->area.y1 = height - rect.x2; + mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); + mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); + break; + case 180: + mapping->area.x1 = width - rect.x2; + mapping->area.y1 = height - rect.y2; + mapping->area.x2 = mapping->area.x1 + (rect.x2 - rect.x1); + mapping->area.y2 = mapping->area.y1 + (rect.y2 - rect.y1); + break; + case 270: + mapping->area.x1 = width - rect.y2; + mapping->area.y1 = rect.x1; + mapping->area.x2 = mapping->area.x1 + (rect.y2 - rect.y1); + mapping->area.y2 = mapping->area.y1 + (rect.x2 - rect.x1); + break; + default: + mapping->area.x1 = rect.x1; + mapping->area.y1 = rect.y1; + mapping->area.x2 = rect.x2; + mapping->area.y2 = rect.y2; + } + + map_list = g_list_prepend (map_list, mapping); + } + + return g_list_reverse (map_list); +} + +/** + * poppler_page_free_annot_mapping: + * @list: (element-type PopplerAnnotMapping): A list of + * #PopplerAnnotMapping<!-- -->s + * + * Frees a list of #PopplerAnnotMapping<!-- -->s allocated by + * poppler_page_get_annot_mapping(). It also unreferences the #PopplerAnnot<!-- -->s + * that each mapping contains, so if you want to keep them around, you need to + * reference them with g_object_ref(). + **/ +void +poppler_page_free_annot_mapping (GList *list) +{ + if (G_UNLIKELY (!list)) + return; + + g_list_foreach (list, (GFunc)poppler_annot_mapping_free, NULL); + g_list_free (list); +} + +/** + * poppler_page_add_annot: + * @page: a #PopplerPage + * @annot: a #PopplerAnnot to add + * + * Adds annotation @annot to @page. + * + * Since: 0.16 + */ +void +poppler_page_add_annot (PopplerPage *page, + PopplerAnnot *annot) +{ + g_return_if_fail (POPPLER_IS_PAGE (page)); + g_return_if_fail (POPPLER_IS_ANNOT (annot)); + + page->page->addAnnot (annot->annot); +} + +/* PopplerRectangle type */ + +POPPLER_DEFINE_BOXED_TYPE (PopplerRectangle, poppler_rectangle, + poppler_rectangle_copy, + poppler_rectangle_free) + +/** + * poppler_rectangle_new: + * + * Creates a new #PopplerRectangle + * + * Returns: a new #PopplerRectangle, use poppler_rectangle_free() to free it + */ +PopplerRectangle * +poppler_rectangle_new (void) +{ + return g_slice_new0 (PopplerRectangle); +} + +/** + * poppler_rectangle_copy: + * @rectangle: a #PopplerRectangle to copy + * + * Creates a copy of @rectangle + * + * Returns: a new allocated copy of @rectangle + */ +PopplerRectangle * +poppler_rectangle_copy (PopplerRectangle *rectangle) +{ + g_return_val_if_fail (rectangle != NULL, NULL); + + return g_slice_dup (PopplerRectangle, rectangle); +} + +/** + * poppler_rectangle_free: + * @rectangle: a #PopplerRectangle + * + * Frees the given #PopplerRectangle + */ +void +poppler_rectangle_free (PopplerRectangle *rectangle) +{ + g_slice_free (PopplerRectangle, rectangle); +} + +/* PopplerTextAttributes type */ + +POPPLER_DEFINE_BOXED_TYPE (PopplerTextAttributes, poppler_text_attributes, + poppler_text_attributes_copy, + poppler_text_attributes_free) + +/** + * poppler_text_attributes_new: + * + * Creates a new #PopplerTextAttributes + * + * Returns: a new #PopplerTextAttributes, use poppler_text_attributes_free() to free it + * + * Since: 0.18 + */ +PopplerTextAttributes * +poppler_text_attributes_new (void) +{ + return (PopplerTextAttributes *) g_slice_new0 (PopplerTextAttributes); +} + +static gchar * +get_font_name_from_word (TextWord *word) +{ + GooString *font_name = word->getFontName(); + const gchar *name; + gboolean subset; + gint i; + + if (!font_name || font_name->getLength () == 0) + return g_strdup ("Default"); + + // check for a font subset name: capital letters followed by a '+' sign + for (i = 0; i < font_name->getLength (); ++i) { + if (font_name->getChar (i) < 'A' || font_name->getChar (i) > 'Z') { + break; + } + } + subset = i > 0 && i < font_name->getLength () && font_name->getChar (i) == '+'; + name = font_name->getCString (); + if (subset) + name += i + 1; + + return g_strdup (name); +} + +/* + * Allocates a new PopplerTextAttributes with word attributes + */ +static PopplerTextAttributes * +poppler_text_attributes_new_from_word (TextWord *word) +{ + PopplerTextAttributes *attrs = poppler_text_attributes_new (); + gdouble r, g, b; + + attrs->font_name = get_font_name_from_word (word); + attrs->font_size = word->getFontSize(); + attrs->is_underlined = word->isUnderlined(); + word->getColor (&r, &g, &b); + attrs->color.red = (int) (r * 65535. + 0.5); + attrs->color.green = (int)(g * 65535. + 0.5); + attrs->color.blue = (int)(b * 65535. + 0.5); + + return attrs; +} + +/** + * poppler_text_attributes_copy: + * @text_attrs: a #PopplerTextAttributes to copy + * + * Creates a copy of @text_attrs + * + * Returns: a new allocated copy of @text_attrs + * + * Since: 0.18 + */ +PopplerTextAttributes * +poppler_text_attributes_copy (PopplerTextAttributes *text_attrs) +{ + PopplerTextAttributes *attrs; + + attrs = g_slice_dup (PopplerTextAttributes, text_attrs); + attrs->font_name = g_strdup (text_attrs->font_name); + return attrs; +} + +/** + * poppler_text_attributes_free: + * @text_attrs: a #PopplerTextAttributes + * + * Frees the given #PopplerTextAttributes + * + * Since: 0.18 + */ +void +poppler_text_attributes_free (PopplerTextAttributes *text_attrs) +{ + g_free (text_attrs->font_name); + g_slice_free (PopplerTextAttributes, text_attrs); +} + +/* PopplerColor type */ +POPPLER_DEFINE_BOXED_TYPE (PopplerColor, poppler_color, poppler_color_copy, poppler_color_free) + +/** + * poppler_color_new: + * + * Creates a new #PopplerColor + * + * Returns: a new #PopplerColor, use poppler_color_free() to free it + */ +PopplerColor * +poppler_color_new (void) +{ + return (PopplerColor *) g_new0 (PopplerColor, 1); +} + +/** + * poppler_color_copy: + * @color: a #PopplerColor to copy + * + * Creates a copy of @color + * + * Returns: a new allocated copy of @color + */ +PopplerColor * +poppler_color_copy (PopplerColor *color) +{ + PopplerColor *new_color; + + new_color = g_new (PopplerColor, 1); + *new_color = *color; + + return new_color; +} + +/** + * poppler_color_free: + * @color: a #PopplerColor + * + * Frees the given #PopplerColor + */ +void +poppler_color_free (PopplerColor *color) +{ + g_free (color); +} + +/* PopplerLinkMapping type */ +POPPLER_DEFINE_BOXED_TYPE (PopplerLinkMapping, poppler_link_mapping, + poppler_link_mapping_copy, + poppler_link_mapping_free) + +/** + * poppler_link_mapping_new: + * + * Creates a new #PopplerLinkMapping + * + * Returns: a new #PopplerLinkMapping, use poppler_link_mapping_free() to free it + */ +PopplerLinkMapping * +poppler_link_mapping_new (void) +{ + return g_slice_new0 (PopplerLinkMapping); +} + +/** + * poppler_link_mapping_copy: + * @mapping: a #PopplerLinkMapping to copy + * + * Creates a copy of @mapping + * + * Returns: a new allocated copy of @mapping + */ +PopplerLinkMapping * +poppler_link_mapping_copy (PopplerLinkMapping *mapping) +{ + PopplerLinkMapping *new_mapping; + + new_mapping = g_slice_dup (PopplerLinkMapping, mapping); + + if (new_mapping->action) + new_mapping->action = poppler_action_copy (new_mapping->action); + + return new_mapping; +} + +/** + * poppler_link_mapping_free: + * @mapping: a #PopplerLinkMapping + * + * Frees the given #PopplerLinkMapping + */ +void +poppler_link_mapping_free (PopplerLinkMapping *mapping) +{ + if (G_UNLIKELY (!mapping)) + return; + + if (mapping->action) + poppler_action_free (mapping->action); + + g_slice_free (PopplerLinkMapping, mapping); +} + +/* Poppler Image mapping type */ +POPPLER_DEFINE_BOXED_TYPE (PopplerImageMapping, poppler_image_mapping, + poppler_image_mapping_copy, + poppler_image_mapping_free) + +/** + * poppler_image_mapping_new: + * + * Creates a new #PopplerImageMapping + * + * Returns: a new #PopplerImageMapping, use poppler_image_mapping_free() to free it + */ +PopplerImageMapping * +poppler_image_mapping_new (void) +{ + return g_slice_new0 (PopplerImageMapping); +} + +/** + * poppler_image_mapping_copy: + * @mapping: a #PopplerImageMapping to copy + * + * Creates a copy of @mapping + * + * Returns: a new allocated copy of @mapping + */ +PopplerImageMapping * +poppler_image_mapping_copy (PopplerImageMapping *mapping) +{ + return g_slice_dup (PopplerImageMapping, mapping); +} + +/** + * poppler_image_mapping_free: + * @mapping: a #PopplerImageMapping + * + * Frees the given #PopplerImageMapping + */ +void +poppler_image_mapping_free (PopplerImageMapping *mapping) +{ + g_slice_free (PopplerImageMapping, mapping); +} + +/* Page Transition */ +POPPLER_DEFINE_BOXED_TYPE (PopplerPageTransition, poppler_page_transition, + poppler_page_transition_copy, + poppler_page_transition_free) + +/** + * poppler_page_transition_new: + * + * Creates a new #PopplerPageTransition + * + * Returns: a new #PopplerPageTransition, use poppler_page_transition_free() to free it + */ +PopplerPageTransition * +poppler_page_transition_new (void) +{ + return (PopplerPageTransition *) g_new0 (PopplerPageTransition, 1); +} + +/** + * poppler_page_transition_copy: + * @transition: a #PopplerPageTransition to copy + * + * Creates a copy of @transition + * + * Returns: a new allocated copy of @transition + */ +PopplerPageTransition * +poppler_page_transition_copy (PopplerPageTransition *transition) +{ + PopplerPageTransition *new_transition; + + new_transition = poppler_page_transition_new (); + *new_transition = *transition; + + return new_transition; +} + +/** + * poppler_page_transition_free: + * @transition: a #PopplerPageTransition + * + * Frees the given #PopplerPageTransition + */ +void +poppler_page_transition_free (PopplerPageTransition *transition) +{ + g_free (transition); +} + +/* Form Field Mapping Type */ +POPPLER_DEFINE_BOXED_TYPE (PopplerFormFieldMapping, poppler_form_field_mapping, + poppler_form_field_mapping_copy, + poppler_form_field_mapping_free) + +/** + * poppler_form_field_mapping_new: + * + * Creates a new #PopplerFormFieldMapping + * + * Returns: a new #PopplerFormFieldMapping, use poppler_form_field_mapping_free() to free it + */ +PopplerFormFieldMapping * +poppler_form_field_mapping_new (void) +{ + return g_slice_new0 (PopplerFormFieldMapping); +} + +/** + * poppler_form_field_mapping_copy: + * @mapping: a #PopplerFormFieldMapping to copy + * + * Creates a copy of @mapping + * + * Returns: a new allocated copy of @mapping + */ +PopplerFormFieldMapping * +poppler_form_field_mapping_copy (PopplerFormFieldMapping *mapping) +{ + PopplerFormFieldMapping *new_mapping; + + new_mapping = g_slice_dup (PopplerFormFieldMapping, mapping); + + if (mapping->field) + new_mapping->field = (PopplerFormField *)g_object_ref (mapping->field); + + return new_mapping; +} + +/** + * poppler_form_field_mapping_free: + * @mapping: a #PopplerFormFieldMapping + * + * Frees the given #PopplerFormFieldMapping + */ +void +poppler_form_field_mapping_free (PopplerFormFieldMapping *mapping) +{ + if (G_UNLIKELY (!mapping)) + return; + + if (mapping->field) + g_object_unref (mapping->field); + + g_slice_free (PopplerFormFieldMapping, mapping); +} + +/* PopplerAnnot Mapping Type */ +POPPLER_DEFINE_BOXED_TYPE (PopplerAnnotMapping, poppler_annot_mapping, + poppler_annot_mapping_copy, + poppler_annot_mapping_free) + +/** + * poppler_annot_mapping_new: + * + * Creates a new #PopplerAnnotMapping + * + * Returns: a new #PopplerAnnotMapping, use poppler_annot_mapping_free() to free it + */ +PopplerAnnotMapping * +poppler_annot_mapping_new (void) +{ + return g_slice_new0 (PopplerAnnotMapping); +} + +/** + * poppler_annot_mapping_copy: + * @mapping: a #PopplerAnnotMapping to copy + * + * Creates a copy of @mapping + * + * Returns: a new allocated copy of @mapping + */ +PopplerAnnotMapping * +poppler_annot_mapping_copy (PopplerAnnotMapping *mapping) +{ + PopplerAnnotMapping *new_mapping; + + new_mapping = g_slice_dup (PopplerAnnotMapping, mapping); + + if (mapping->annot) + new_mapping->annot = (PopplerAnnot *) g_object_ref (mapping->annot); + + return new_mapping; +} + +/** + * poppler_annot_mapping_free: + * @mapping: a #PopplerAnnotMapping + * + * Frees the given #PopplerAnnotMapping + */ +void +poppler_annot_mapping_free (PopplerAnnotMapping *mapping) +{ + if (G_UNLIKELY (!mapping)) + return; + + if (mapping->annot) + g_object_unref (mapping->annot); + + g_slice_free (PopplerAnnotMapping, mapping); +} + +/** + * poppler_page_get_crop_box: + * @page: a #PopplerPage + * @rect: (out): a #PopplerRectangle to fill + * + * Retrurns the crop box of @page + */ +void +poppler_page_get_crop_box (PopplerPage *page, PopplerRectangle *rect) +{ + PDFRectangle* cropBox = page->page->getCropBox (); + + rect->x1 = cropBox->x1; + rect->x2 = cropBox->x2; + rect->y1 = cropBox->y1; + rect->y2 = cropBox->y2; +} + +/** + * poppler_page_get_text_layout: + * @page: A #PopplerPage + * @rectangles: (out) (array length=n_rectangles) (transfer container): return location for an array of #PopplerRectangle + * @n_rectangles: (out) length of returned array + * + * Obtains the layout of the text as a list of #PopplerRectangle + * This array must be freed with g_free () when done. + * + * The position in the array represents an offset in the text returned by + * poppler_page_get_text() + * + * Return value: %TRUE if the page contains text, %FALSE otherwise + * + * Since: 0.16 + **/ +gboolean +poppler_page_get_text_layout (PopplerPage *page, + PopplerRectangle **rectangles, + guint *n_rectangles) +{ + TextPage *text; + TextWordList *wordlist; + TextWord *word, *nextword; + PopplerRectangle *rect; + int i, j, offset = 0; + gdouble x1, y1, x2, y2; + gdouble x3, y3, x4, y4; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); + + *n_rectangles = 0; + + text = poppler_page_get_text_page (page); + wordlist = text->makeWordList (gFalse); + + if (wordlist->getLength () <= 0) + { + delete wordlist; + return FALSE; + } + + // Getting the array size + for (i = 0; i < wordlist->getLength (); i++) + { + word = wordlist->get (i); + *n_rectangles += word->getLength () + 1; + } + + *rectangles = g_new (PopplerRectangle, *n_rectangles); + + // Calculating each char position + for (i = 0; i < wordlist->getLength (); i++) + { + word = wordlist->get (i); + for (j = 0; j < word->getLength (); j++) + { + rect = *rectangles + offset; + word->getCharBBox (j, + &(rect->x1), + &(rect->y1), + &(rect->x2), + &(rect->y2)); + offset++; + } + + // adding spaces and break lines + rect = *rectangles + offset; + word->getBBox (&x1, &y1, &x2, &y2); + + nextword = word->getNext (); + if (nextword) + { + nextword->getBBox (&x3, &y3, &x4, &y4); + // space is from one word to other and with the same height as + // first word. + rect->x1 = x2; + rect->y1 = y1; + rect->x2 = x3; + rect->y2 = y2; + } + else + { + // end of line + rect->x1 = x2; + rect->y1 = y2; + rect->x2 = x2; + rect->y2 = y2; + } + offset++; + } + + delete wordlist; + + return TRUE; +} + +/** + * poppler_page_free_text_attributes: + * @list: (element-type PopplerTextAttributes): A list of + * #PopplerTextAttributes<!-- -->s + * + * Frees a list of #PopplerTextAttributes<!-- -->s allocated by + * poppler_page_get_text_attributes(). + * + * Since: 0.18 + **/ +void +poppler_page_free_text_attributes (GList *list) +{ + if (G_UNLIKELY (list == NULL)) + return; + + g_list_foreach (list, (GFunc)poppler_text_attributes_free, NULL); + g_list_free (list); +} + +static gboolean +word_text_attributes_equal (TextWord *a, TextWord *b) +{ + double ar, ag, ab, br, bg, bb; + + if (!a->getFontInfo()->matches (b->getFontInfo())) + return FALSE; + + if (a->getFontSize() != b->getFontSize()) + return FALSE; + + if (a->isUnderlined() != b->isUnderlined()) + return FALSE; + + a->getColor(&ar, &ag, &ab); + b->getColor(&br, &bg, &bb); + return (ar == br && ag == bg && ab == bb); +} + +/** + * poppler_page_get_text_attributes: + * @page: A #PopplerPage + * + * Obtains the attributes of the text as a GList of #PopplerTextAttributes. + * This list must be freed with poppler_page_free_text_attributes() when done. + * + * Each list element is a #PopplerTextAttributes struct where start_index and + * end_index indicates the range of text (as returned by poppler_page_get_text()) + * to which text attributes apply. + * + * Return value: (element-type PopplerTextAttributes) (transfer full): A #GList of #PopplerTextAttributes + * + * Since: 0.18 + **/ +GList * +poppler_page_get_text_attributes (PopplerPage *page) +{ + TextPage *text; + TextWordList *wordlist; + PopplerTextAttributes *attrs = NULL; + PopplerTextAttributes *previous = NULL; + gint i, offset = 0; + GList *attributes = NULL; + + g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL); + + text = poppler_page_get_text_page (page); + wordlist = text->makeWordList (gFalse); + + if (wordlist->getLength () <= 0) + { + delete wordlist; + return NULL; + } + + // Calculating each word attributes + for (i = 0; i < wordlist->getLength (); i++) + { + TextWord *word = wordlist->get (i); + + // each char of the word has the same attributes + if (i > 0 && word_text_attributes_equal (word, wordlist->get (i - 1))) { + attrs = previous; + } else { + attrs = poppler_text_attributes_new_from_word (word); + attrs->start_index = offset; + if (previous) + previous->end_index--; + previous = attrs; + attributes = g_list_prepend (attributes, attrs); + } + offset += word->getLength () + 1; + attrs->end_index = offset; + } + if (attrs) + attrs->end_index--; + + delete wordlist; + + return g_list_reverse(attributes); +} diff --git a/glib/poppler-page.h b/glib/poppler-page.h new file mode 100644 index 0000000..7b36843 --- /dev/null +++ b/glib/poppler-page.h @@ -0,0 +1,311 @@ +/* poppler-page.h: glib interface to poppler + * Copyright (C) 2004, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_PAGE_H__ +#define __POPPLER_PAGE_H__ + +#include <glib-object.h> + +#include "poppler.h" + +#include <cairo.h> + +G_BEGIN_DECLS + +#define POPPLER_TYPE_PAGE (poppler_page_get_type ()) +#define POPPLER_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_PAGE, PopplerPage)) +#define POPPLER_IS_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_PAGE)) + + +GType poppler_page_get_type (void) G_GNUC_CONST; + +void poppler_page_render (PopplerPage *page, + cairo_t *cairo); +void poppler_page_render_for_printing (PopplerPage *page, + cairo_t *cairo); +void poppler_page_render_for_printing_with_options (PopplerPage *page, + cairo_t *cairo, + PopplerPrintFlags options); +cairo_surface_t *poppler_page_get_thumbnail (PopplerPage *page); +void poppler_page_render_selection (PopplerPage *page, + cairo_t *cairo, + PopplerRectangle *selection, + PopplerRectangle *old_selection, + PopplerSelectionStyle style, + PopplerColor *glyph_color, + PopplerColor *background_color); + +void poppler_page_get_size (PopplerPage *page, + double *width, + double *height); +int poppler_page_get_index (PopplerPage *page); +gchar *poppler_page_get_label (PopplerPage *page); +double poppler_page_get_duration (PopplerPage *page); +PopplerPageTransition *poppler_page_get_transition (PopplerPage *page); +gboolean poppler_page_get_thumbnail_size (PopplerPage *page, + int *width, + int *height); +GList *poppler_page_find_text (PopplerPage *page, + const char *text); +void poppler_page_render_to_ps (PopplerPage *page, + PopplerPSFile *ps_file); +char *poppler_page_get_text (PopplerPage *page); +char *poppler_page_get_selected_text (PopplerPage *page, + PopplerSelectionStyle style, + PopplerRectangle *selection); +cairo_region_t *poppler_page_get_selected_region (PopplerPage *page, + gdouble scale, + PopplerSelectionStyle style, + PopplerRectangle *selection); +GList *poppler_page_get_selection_region (PopplerPage *page, + gdouble scale, + PopplerSelectionStyle style, + PopplerRectangle *selection); +void poppler_page_selection_region_free(GList *region); +GList *poppler_page_get_link_mapping (PopplerPage *page); +void poppler_page_free_link_mapping (GList *list); +GList *poppler_page_get_image_mapping (PopplerPage *page); +void poppler_page_free_image_mapping (GList *list); +cairo_surface_t *poppler_page_get_image (PopplerPage *page, + gint image_id); +GList *poppler_page_get_form_field_mapping (PopplerPage *page); +void poppler_page_free_form_field_mapping (GList *list); +GList *poppler_page_get_annot_mapping (PopplerPage *page); +void poppler_page_free_annot_mapping (GList *list); +void poppler_page_add_annot (PopplerPage *page, + PopplerAnnot *annot); +void poppler_page_get_crop_box (PopplerPage *page, + PopplerRectangle *rect); +gboolean poppler_page_get_text_layout (PopplerPage *page, + PopplerRectangle **rectangles, + guint *n_rectangles); +GList *poppler_page_get_text_attributes (PopplerPage *page); +void poppler_page_free_text_attributes (GList *list); + +/* A rectangle on a page, with coordinates in PDF points. */ +#define POPPLER_TYPE_RECTANGLE (poppler_rectangle_get_type ()) +/** + * PopplerRectangle: + * @x1: x coordinate of lower left corner + * @y1: y coordinate of lower left corner + * @x2: x coordinate of upper right corner + * @y2: y coordinate of upper right corner + * + * A #PopplerRectangle is used to describe + * locations on a page and bounding boxes + */ +struct _PopplerRectangle +{ + gdouble x1; + gdouble y1; + gdouble x2; + gdouble y2; +}; + +GType poppler_rectangle_get_type (void) G_GNUC_CONST; +PopplerRectangle *poppler_rectangle_new (void); +PopplerRectangle *poppler_rectangle_copy (PopplerRectangle *rectangle); +void poppler_rectangle_free (PopplerRectangle *rectangle); + +/* A color in RGB */ +#define POPPLER_TYPE_COLOR (poppler_color_get_type ()) + +/** + * PopplerColor: + * @red: the red componment of color + * @green: the green component of color + * @blue: the blue component of color + * + * A #PopplerColor describes a RGB color. Color components + * are values between 0 and 65535 + */ +struct _PopplerColor +{ + guint16 red; + guint16 green; + guint16 blue; +}; + +GType poppler_color_get_type (void) G_GNUC_CONST; +PopplerColor *poppler_color_new (void); +PopplerColor *poppler_color_copy (PopplerColor *color); +void poppler_color_free (PopplerColor *color); + +/* Text attributes. */ +#define POPPLER_TYPE_TEXT_ATTRIBUTES (poppler_text_attributes_get_type ()) +/** + * PopplerTextAttributes: + * @font_name: font name + * @font_size: font size + * @is_underlined: if text is underlined + * @color: a #PopplerColor, the foreground color + * @start_index: start position this text attributes apply + * @end_index: end position this text text attributes apply + * + * A #PopplerTextAttributes is used to describe text attributes of a range of text + * + * Since: 0.18 + */ +struct _PopplerTextAttributes +{ + gchar *font_name; + gdouble font_size; + gboolean is_underlined; + PopplerColor color; + + gint start_index; + gint end_index; +}; + +GType poppler_text_attributes_get_type (void) G_GNUC_CONST; +PopplerTextAttributes *poppler_text_attributes_new (void); +PopplerTextAttributes *poppler_text_attributes_copy (PopplerTextAttributes *text_attrs); +void poppler_text_attributes_free (PopplerTextAttributes *text_attrs); + +/* Mapping between areas on the current page and PopplerActions */ +#define POPPLER_TYPE_LINK_MAPPING (poppler_link_mapping_get_type ()) + +/** + * PopplerLinkMapping: + * @area: a #PopplerRectangle representing an area of the page + * @action: a #PopplerAction + * + * A #PopplerLinkMapping structure represents the location + * of @action on the page + */ +struct _PopplerLinkMapping +{ + PopplerRectangle area; + PopplerAction *action; +}; + +GType poppler_link_mapping_get_type (void) G_GNUC_CONST; +PopplerLinkMapping *poppler_link_mapping_new (void); +PopplerLinkMapping *poppler_link_mapping_copy (PopplerLinkMapping *mapping); +void poppler_link_mapping_free (PopplerLinkMapping *mapping); + +/* Page Transition */ +#define POPPLER_TYPE_PAGE_TRANSITION (poppler_page_transition_get_type ()) + +/** + * PopplerPageTransition: + * @type: the type of transtition + * @alignment: the dimension in which the transition effect shall occur. + * Only for #POPPLER_PAGE_TRANSITION_SPLIT and #POPPLER_PAGE_TRANSITION_BLINDS transition types + * @direction: the direccion of motion for the transition effect. + * Only for #POPPLER_PAGE_TRANSITION_SPLIT, #POPPLER_PAGE_TRANSITION_BOX and #POPPLER_PAGE_TRANSITION_FLY + * transition types + * @duration: the duration of the transition effect + * @angle: the direction in which the specified transition effect shall moves, + * expressed in degrees counterclockwise starting from a left-to-right direction. + * Only for #POPPLER_PAGE_TRANSITION_WIPE, #POPPLER_PAGE_TRANSITION_GLITTER, #POPPLER_PAGE_TRANSITION_FLY, + * #POPPLER_PAGE_TRANSITION_COVER, #POPPLER_PAGE_TRANSITION_UNCOVER and #POPPLER_PAGE_TRANSITION_PUSH + * transition types + * @scale: the starting or ending scale at which the changes shall be drawn. + * Only for #POPPLER_PAGE_TRANSITION_FLY transition type + * @rectangular: whether the area that will be flown is rectangular and opaque. + * Only for #POPPLER_PAGE_TRANSITION_FLY transition type + * + * A #PopplerPageTransition structures describes a visual transition + * to use when moving between pages during a presentation + */ +struct _PopplerPageTransition +{ + PopplerPageTransitionType type; + PopplerPageTransitionAlignment alignment; + PopplerPageTransitionDirection direction; + gint duration; + gint angle; + gdouble scale; + gboolean rectangular; +}; + +GType poppler_page_transition_get_type (void) G_GNUC_CONST; +PopplerPageTransition *poppler_page_transition_new (void); +PopplerPageTransition *poppler_page_transition_copy (PopplerPageTransition *transition); +void poppler_page_transition_free (PopplerPageTransition *transition); + +/* Mapping between areas on the current page and images */ +#define POPPLER_TYPE_IMAGE_MAPPING (poppler_image_mapping_get_type ()) + +/** + * PopplerImageMapping: + * @area: a #PopplerRectangle representing an area of the page + * @image_id: an image identifier + * + * A #PopplerImageMapping structure represents the location + * of an image on the page + */ +struct _PopplerImageMapping +{ + PopplerRectangle area; + gint image_id; +}; + +GType poppler_image_mapping_get_type (void) G_GNUC_CONST; +PopplerImageMapping *poppler_image_mapping_new (void); +PopplerImageMapping *poppler_image_mapping_copy (PopplerImageMapping *mapping); +void poppler_image_mapping_free (PopplerImageMapping *mapping); + +/* Mapping between areas on the current page and form fields */ +#define POPPLER_TYPE_FORM_FIELD_MAPPING (poppler_form_field_mapping_get_type ()) + +/** + * PopplerFormFieldMapping: + * @area: a #PopplerRectangle representing an area of the page + * @field: a #PopplerFormField + * + * A #PopplerFormFieldMapping structure represents the location + * of @field on the page + */ +struct _PopplerFormFieldMapping +{ + PopplerRectangle area; + PopplerFormField *field; +}; + +GType poppler_form_field_mapping_get_type (void) G_GNUC_CONST; +PopplerFormFieldMapping *poppler_form_field_mapping_new (void); +PopplerFormFieldMapping *poppler_form_field_mapping_copy (PopplerFormFieldMapping *mapping); +void poppler_form_field_mapping_free (PopplerFormFieldMapping *mapping); + +/* Mapping between areas on the current page and annots */ +#define POPPLER_TYPE_ANNOT_MAPPING (poppler_annot_mapping_get_type ()) + +/** + * PopplerAnnotMapping: + * @area: a #PopplerRectangle representing an area of the page + * @annot: a #PopplerAnnot + * + * A #PopplerAnnotMapping structure represents the location + * of @annot on the page + */ +struct _PopplerAnnotMapping +{ + PopplerRectangle area; + PopplerAnnot *annot; +}; + +GType poppler_annot_mapping_get_type (void) G_GNUC_CONST; +PopplerAnnotMapping *poppler_annot_mapping_new (void); +PopplerAnnotMapping *poppler_annot_mapping_copy (PopplerAnnotMapping *mapping); +void poppler_annot_mapping_free (PopplerAnnotMapping *mapping); + +G_END_DECLS + +#endif /* __POPPLER_PAGE_H__ */ diff --git a/glib/poppler-private.h b/glib/poppler-private.h new file mode 100644 index 0000000..ab39b49 --- /dev/null +++ b/glib/poppler-private.h @@ -0,0 +1,147 @@ +#ifndef __POPPLER_PRIVATE_H__ +#define __POPPLER_PRIVATE_H__ + +#include <config.h> + +#ifndef __GI_SCANNER__ +#include <PDFDoc.h> +#include <PSOutputDev.h> +#include <Link.h> +#include <Movie.h> +#include <Rendition.h> +#include <Form.h> +#include <Gfx.h> +#include <FontInfo.h> +#include <TextOutputDev.h> +#include <Catalog.h> +#include <OptionalContent.h> +#include <CairoOutputDev.h> +#include <FileSpec.h> +#endif + +struct _PopplerDocument +{ + /*< private >*/ + GObject parent_instance; + PDFDoc *doc; + + GList *layers; + GList *layers_rbgroups; + CairoOutputDev *output_dev; +}; + +struct _PopplerPSFile +{ + /*< private >*/ + GObject parent_instance; + + PopplerDocument *document; + PSOutputDev *out; + char *filename; + int first_page; + int last_page; + double paper_width; + double paper_height; + gboolean duplex; +}; + +struct _PopplerFontInfo +{ + /*< private >*/ + GObject parent_instance; + PopplerDocument *document; + FontInfoScanner *scanner; +}; + +struct _PopplerPage +{ + /*< private >*/ + GObject parent_instance; + PopplerDocument *document; + Page *page; + int index; + TextPage *text; +}; + +struct _PopplerFormField +{ + /*< private >*/ + GObject parent_instance; + PopplerDocument *document; + FormWidget *widget; + PopplerAction *action; +}; + +struct _PopplerAnnot +{ + GObject parent_instance; + Annot *annot; +}; + +typedef struct _Layer { + /*< private >*/ + GList *kids; + gchar *label; + OptionalContentGroup *oc; +} Layer; + +struct _PopplerLayer +{ + /*< private >*/ + GObject parent_instance; + PopplerDocument *document; + Layer *layer; + GList *rbgroup; + gchar *title; +}; + +GList *_poppler_document_get_layers (PopplerDocument *document); +GList *_poppler_document_get_layer_rbgroup (PopplerDocument *document, + Layer *layer); +PopplerPage *_poppler_page_new (PopplerDocument *document, + Page *page, + int index); +PopplerAction *_poppler_action_new (PopplerDocument *document, + LinkAction *link, + const gchar *title); +PopplerLayer *_poppler_layer_new (PopplerDocument *document, + Layer *layer, + GList *rbgroup); +PopplerDest *_poppler_dest_new_goto (PopplerDocument *document, + LinkDest *link_dest); +PopplerFormField *_poppler_form_field_new (PopplerDocument *document, + FormWidget *field); +PopplerAttachment *_poppler_attachment_new (FileSpec *file); +PopplerMovie *_poppler_movie_new (Movie *movie); +PopplerMedia *_poppler_media_new (MediaRendition *media); +PopplerAnnot *_poppler_annot_new (Annot *annot); +PopplerAnnot *_poppler_annot_text_new (Annot *annot); +PopplerAnnot *_poppler_annot_free_text_new (Annot *annot); +PopplerAnnot *_poppler_annot_file_attachment_new (Annot *annot); +PopplerAnnot *_poppler_annot_movie_new (Annot *annot); +PopplerAnnot *_poppler_annot_screen_new (Annot *annot); + +char *_poppler_goo_string_to_utf8(GooString *s); +gboolean _poppler_convert_pdf_date_to_gtime (GooString *date, + time_t *gdate); + +/* + * A convenience macro for boxed type implementations, which defines a + * type_name_get_type() function registering the boxed type. + */ +#define POPPLER_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func) \ +GType \ +type_name##_get_type (void) \ +{ \ + static volatile gsize g_define_type_id__volatile = 0; \ + if (g_once_init_enter (&g_define_type_id__volatile)) { \ + GType g_define_type_id = \ + g_boxed_type_register_static (g_intern_static_string (#TypeName), \ + (GBoxedCopyFunc) copy_func, \ + (GBoxedFreeFunc) free_func); \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} + +#endif diff --git a/glib/poppler.cc b/glib/poppler.cc new file mode 100644 index 0000000..cc2ca4d --- /dev/null +++ b/glib/poppler.cc @@ -0,0 +1,58 @@ +/* poppler.cc: glib wrapper for poppler + * Copyright (C) 2005, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> +#include "poppler.h" + +GQuark poppler_error_quark (void) +{ + static GQuark q = 0; + + if (q == 0) + q = g_quark_from_static_string ("poppler-quark"); + + return q; +} + +/** + * poppler_get_backend: + * + * Returns the backend compiled into the poppler library. + * + * Return value: The backend used by poppler + **/ +PopplerBackend +poppler_get_backend (void) +{ + return POPPLER_BACKEND_CAIRO; +} + +static const char poppler_version[] = PACKAGE_VERSION; + +/** + * poppler_get_version: + * + * Returns the version of poppler in use. This result is not to be freed. + * + * Return value: the version of poppler. + **/ +const char * +poppler_get_version (void) +{ + return poppler_version; +} diff --git a/glib/poppler.h b/glib/poppler.h new file mode 100644 index 0000000..6c2eefd --- /dev/null +++ b/glib/poppler.h @@ -0,0 +1,213 @@ +/* poppler.h: glib interface to poppler + * Copyright (C) 2004, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_GLIB_H__ +#define __POPPLER_GLIB_H__ + +#include <glib-object.h> + +G_BEGIN_DECLS + +GQuark poppler_error_quark (void); + +#define POPPLER_ERROR poppler_error_quark () + +/** + * PopplerError: + * @POPPLER_ERROR_INVALID: Generic error when a document opration fails + * @POPPLER_ERROR_ENCRYPTED: Document is encrypted + * @POPPLER_ERROR_OPEN_FILE: File could not be opened for writing when saving document + * @POPPLER_ERROR_BAD_CATALOG: Failed to read the document catalog + * @POPPLER_ERROR_DAMAGED: Document is damaged + * + * Error codes returned by #PopplerDocument + */ +typedef enum +{ + POPPLER_ERROR_INVALID, + POPPLER_ERROR_ENCRYPTED, + POPPLER_ERROR_OPEN_FILE, + POPPLER_ERROR_BAD_CATALOG, + POPPLER_ERROR_DAMAGED +} PopplerError; + +typedef enum +{ + POPPLER_ORIENTATION_PORTRAIT, + POPPLER_ORIENTATION_LANDSCAPE, + POPPLER_ORIENTATION_UPSIDEDOWN, + POPPLER_ORIENTATION_SEASCAPE +} PopplerOrientation; + +/** + * PopplerPageTransitionType: + * @POPPLER_PAGE_TRANSITION_REPLACE: the new page replace the old one + * @POPPLER_PAGE_TRANSITION_SPLIT: two lines sweep across the screen, revealing the new page + * @POPPLER_PAGE_TRANSITION_BLINDS: multiple lines, evenly spaced across the screen, synchronously + * sweep in the same direction to reveal the new page + * @POPPLER_PAGE_TRANSITION_BOX: a rectangular box sweeps inward from the edges of the page or + * outward from the center revealing the new page + * @POPPLER_PAGE_TRANSITION_WIPE: a single line sweeps across the screen from one edge to the other + * revealing the new page + * @POPPLER_PAGE_TRANSITION_DISSOLVE: the old page dissolves gradually to reveal the new one + * @POPPLER_PAGE_TRANSITION_GLITTER: similar to #POPPLER_PAGE_TRANSITION_DISSOLVE, except that the effect + * sweeps across the page in a wide band moving from one side of the screen to the other + * @POPPLER_PAGE_TRANSITION_FLY: changes are flown out or in to or from a location that is offscreen + * @POPPLER_PAGE_TRANSITION_PUSH: the old page slides off the screen while the new page slides in + * @POPPLER_PAGE_TRANSITION_COVER: the new page slides on to the screen covering the old page + * @POPPLER_PAGE_TRANSITION_UNCOVER: the old page slides off the screen uncovering the new page + * @POPPLER_PAGE_TRANSITION_FADE: the new page gradually becomes visible through the old one + * + * Page transition types + */ +typedef enum +{ + POPPLER_PAGE_TRANSITION_REPLACE, + POPPLER_PAGE_TRANSITION_SPLIT, + POPPLER_PAGE_TRANSITION_BLINDS, + POPPLER_PAGE_TRANSITION_BOX, + POPPLER_PAGE_TRANSITION_WIPE, + POPPLER_PAGE_TRANSITION_DISSOLVE, + POPPLER_PAGE_TRANSITION_GLITTER, + POPPLER_PAGE_TRANSITION_FLY, + POPPLER_PAGE_TRANSITION_PUSH, + POPPLER_PAGE_TRANSITION_COVER, + POPPLER_PAGE_TRANSITION_UNCOVER, + POPPLER_PAGE_TRANSITION_FADE +} PopplerPageTransitionType; + +/** + * PopplerPageTransitionAlignment: + * @POPPLER_PAGE_TRANSITION_HORIZONTAL: horizontal dimension + * @POPPLER_PAGE_TRANSITION_VERTICAL: vertical dimension + * + * Page transition alignment types for #POPPLER_PAGE_TRANSITION_SPLIT + * and #POPPLER_PAGE_TRANSITION_BLINDS transition types + */ +typedef enum +{ + POPPLER_PAGE_TRANSITION_HORIZONTAL, + POPPLER_PAGE_TRANSITION_VERTICAL +} PopplerPageTransitionAlignment; + +/** + * PopplerPageTransitionDirection: + * @POPPLER_PAGE_TRANSITION_INWARD: inward from the edges of the page + * @POPPLER_PAGE_TRANSITION_OUTWARD: outward from the center of the page + * + * Page transition direction types for #POPPLER_PAGE_TRANSITION_SPLIT, + * #POPPLER_PAGE_TRANSITION_BOX and #POPPLER_PAGE_TRANSITION_FLY transition types + */ +typedef enum +{ + POPPLER_PAGE_TRANSITION_INWARD, + POPPLER_PAGE_TRANSITION_OUTWARD +} PopplerPageTransitionDirection; + +/** + * PopplerSelectionStyle: + * @POPPLER_SELECTION_GLYPH: glyph is the minimum unit for selection + * @POPPLER_SELECTION_WORD: word is the minimum unit for selection + * @POPPLER_SELECTION_LINE: line is the minimum unit for selection + * + * Selection styles + */ +typedef enum +{ + POPPLER_SELECTION_GLYPH, + POPPLER_SELECTION_WORD, + POPPLER_SELECTION_LINE +} PopplerSelectionStyle; + +/** + * PopplerPrintFlags: + * @POPPLER_PRINT_DOCUMENT: print main document contents + * @POPPLER_PRINT_MARKUP_ANNOTS: print document and markup annotations + * @POPPLER_PRINT_STAMP_ANNOTS_ONLY: print document and only stamp annotations + * @POPPLER_PRINT_ALL: print main document contents and all markup annotations + * + * Printing flags + * + * Since: 0.16 + */ +typedef enum /*< flags >*/ +{ + POPPLER_PRINT_DOCUMENT = 0, + POPPLER_PRINT_MARKUP_ANNOTS = 1 << 0, + POPPLER_PRINT_STAMP_ANNOTS_ONLY = 1 << 1, + POPPLER_PRINT_ALL = POPPLER_PRINT_MARKUP_ANNOTS +} PopplerPrintFlags; + +typedef struct _PopplerDocument PopplerDocument; +typedef struct _PopplerIndexIter PopplerIndexIter; +typedef struct _PopplerFontsIter PopplerFontsIter; +typedef struct _PopplerLayersIter PopplerLayersIter; +typedef struct _PopplerRectangle PopplerRectangle; +typedef struct _PopplerTextAttributes PopplerTextAttributes; +typedef struct _PopplerColor PopplerColor; +typedef struct _PopplerLinkMapping PopplerLinkMapping; +typedef struct _PopplerPageTransition PopplerPageTransition; +typedef struct _PopplerImageMapping PopplerImageMapping; +typedef struct _PopplerFormFieldMapping PopplerFormFieldMapping; +typedef struct _PopplerAnnotMapping PopplerAnnotMapping; +typedef struct _PopplerPage PopplerPage; +typedef struct _PopplerFontInfo PopplerFontInfo; +typedef struct _PopplerLayer PopplerLayer; +typedef struct _PopplerPSFile PopplerPSFile; +typedef union _PopplerAction PopplerAction; +typedef struct _PopplerDest PopplerDest; +typedef struct _PopplerActionLayer PopplerActionLayer; +typedef struct _PopplerFormField PopplerFormField; +typedef struct _PopplerAttachment PopplerAttachment; +typedef struct _PopplerMovie PopplerMovie; +typedef struct _PopplerMedia PopplerMedia; +typedef struct _PopplerAnnot PopplerAnnot; +typedef struct _PopplerAnnotMarkup PopplerAnnotMarkup; +typedef struct _PopplerAnnotText PopplerAnnotText; +typedef struct _PopplerAnnotFreeText PopplerAnnotFreeText; +typedef struct _PopplerAnnotFileAttachment PopplerAnnotFileAttachment; +typedef struct _PopplerAnnotMovie PopplerAnnotMovie; +typedef struct _PopplerAnnotScreen PopplerAnnotScreen; +typedef struct _PopplerAnnotCalloutLine PopplerAnnotCalloutLine; + +typedef enum +{ + POPPLER_BACKEND_UNKNOWN, + POPPLER_BACKEND_SPLASH, + POPPLER_BACKEND_CAIRO +} PopplerBackend; + +PopplerBackend poppler_get_backend (void); +const char * poppler_get_version (void); + +G_END_DECLS + +#include "poppler-features.h" +#include "poppler-document.h" +#include "poppler-page.h" +#include "poppler-layer.h" +#include "poppler-action.h" +#include "poppler-form-field.h" +#include "poppler-enums.h" +#include "poppler-attachment.h" +#include "poppler-annot.h" +#include "poppler-date.h" +#include "poppler-movie.h" +#include "poppler-media.h" + +#endif /* __POPPLER_GLIB_H__ */ diff --git a/glib/reference/Makefile.am b/glib/reference/Makefile.am new file mode 100644 index 0000000..b01192d --- /dev/null +++ b/glib/reference/Makefile.am @@ -0,0 +1,87 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE=poppler + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# Directories containing the source code. +# gtk-doc will search all .c and .h files beneath these paths +# for inline comments documenting functions and macros. +# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk +DOC_SOURCE_DIR=$(top_builddir)/glib $(top_srcdir)/glib + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS= + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml --source-suffixes=c,cc,h + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB=$(top_srcdir)/glib/*.h +CFILE_GLOB=$(top_srcdir)/glib/*.cc + +# Header files to ignore when scanning. +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES=demo + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files=version.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +INCLUDES=-I$(top_srcdir)/glib -I$(top_builddir)/glib \ + $(CAIRO_CFLAGS) \ + $(POPPLER_GLIB_CFLAGS) \ + $(FREETYPE_CFLAGS) + +GTKDOC_LIBS=$(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(POPPLER_GLIB_LIBS) \ + $(FREETYPE_LIBS) \ + $(cairo_libs) + + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST += version.xml.in diff --git a/glib/reference/Makefile.in b/glib/reference/Makefile.in new file mode 100644 index 0000000..402f7b5 --- /dev/null +++ b/glib/reference/Makefile.in @@ -0,0 +1,806 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/version.xml.in $(top_srcdir)/gtk-doc.make +subdir = glib/reference +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = version.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE = poppler + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml + +# Directories containing the source code. +# gtk-doc will search all .c and .h files beneath these paths +# for inline comments documenting functions and macros. +# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk +DOC_SOURCE_DIR = $(top_builddir)/glib $(top_srcdir)/glib + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS = + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS = + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS = --sgml-mode --output-format=xml --source-suffixes=c,cc,h + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS = + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS = + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB = $(top_srcdir)/glib/*.h +CFILE_GLOB = $(top_srcdir)/glib/*.cc + +# Header files to ignore when scanning. +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES = demo + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files = version.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files = + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +INCLUDES = -I$(top_srcdir)/glib -I$(top_builddir)/glib \ + $(CAIRO_CFLAGS) \ + $(POPPLER_GLIB_CFLAGS) \ + $(FREETYPE_CFLAGS) + +GTKDOC_LIBS = $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(POPPLER_GLIB_LIBS) \ + $(FREETYPE_LIBS) \ + $(cairo_libs) + +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +SETUP_FILES = \ + $(content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + + +# This includes the standard gtk-doc make rules, copied by gtkdocize. + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in +DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glib/reference/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign glib/reference/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/gtk-doc.make: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool clean-local dist-hook distclean \ + distclean-generic distclean-libtool distclean-local distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-local + + +@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +@ENABLE_GTK_DOC_FALSE@all-local: + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +setup-build.stamp: + -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + echo ' DOC Preparing build'; \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ + done; \ + fi; \ + fi + @touch setup-build.stamp + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo ' DOC Scanning header files' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + echo " DOC Introspecting gobjects"; \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + @touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### xml #### + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) + @echo ' DOC Building XML' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + @touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building HTML' + @rm -rf html + @mkdir html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + @echo ' DOC Fixing cross-references' + @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + @touch html-build.stamp + +#### pdf #### + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building PDF' + @rm -f $(DOC_MODULE).pdf + @mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: clean + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" +@ENABLE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/glib/reference/html/PopplerAnnot.html b/glib/reference/html/PopplerAnnot.html new file mode 100644 index 0000000..fc2c4d4 --- /dev/null +++ b/glib/reference/html/PopplerAnnot.html @@ -0,0 +1,1298 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<title>PopplerAnnot + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerAnnot

+

PopplerAnnot — Annotations

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerAnnot;
+                    PopplerAnnotMarkup;
+                    PopplerAnnotText;
+                    PopplerAnnotFreeText;
+                    PopplerAnnotFileAttachment;
+                    PopplerAnnotMovie;
+                    PopplerAnnotScreen;
+enum                PopplerAnnotType;
+enum                PopplerAnnotFlag;
+enum                PopplerAnnotExternalDataType;
+enum                PopplerAnnotMarkupReplyType;
+enum                PopplerAnnotTextState;
+                    PopplerAnnotCalloutLine;
+enum                PopplerAnnotFreeTextQuadding;
+PopplerAnnotType    poppler_annot_get_annot_type        (PopplerAnnot *poppler_annot);
+PopplerAnnotFlag    poppler_annot_get_flags             (PopplerAnnot *poppler_annot);
+gchar *             poppler_annot_get_name              (PopplerAnnot *poppler_annot);
+gint                poppler_annot_get_page_index        (PopplerAnnot *poppler_annot);
+PopplerColor *      poppler_annot_get_color             (PopplerAnnot *poppler_annot);
+void                poppler_annot_set_color             (PopplerAnnot *poppler_annot,
+                                                         PopplerColor *poppler_color);
+gchar *             poppler_annot_get_contents          (PopplerAnnot *poppler_annot);
+void                poppler_annot_set_contents          (PopplerAnnot *poppler_annot,
+                                                         const gchar *contents);
+gchar *             poppler_annot_get_modified          (PopplerAnnot *poppler_annot);
+gchar *             poppler_annot_markup_get_label      (PopplerAnnotMarkup *poppler_annot);
+void                poppler_annot_markup_set_label      (PopplerAnnotMarkup *poppler_annot,
+                                                         const gchar *label);
+gchar *             poppler_annot_markup_get_subject    (PopplerAnnotMarkup *poppler_annot);
+gdouble             poppler_annot_markup_get_opacity    (PopplerAnnotMarkup *poppler_annot);
+void                poppler_annot_markup_set_opacity    (PopplerAnnotMarkup *poppler_annot,
+                                                         gdouble opacity);
+gboolean            poppler_annot_markup_has_popup      (PopplerAnnotMarkup *poppler_annot);
+void                poppler_annot_markup_set_popup      (PopplerAnnotMarkup *poppler_annot,
+                                                         PopplerRectangle *popup_rect);
+gboolean            poppler_annot_markup_get_popup_is_open
+                                                        (PopplerAnnotMarkup *poppler_annot);
+void                poppler_annot_markup_set_popup_is_open
+                                                        (PopplerAnnotMarkup *poppler_annot,
+                                                         gboolean is_open);
+gboolean            poppler_annot_markup_get_popup_rectangle
+                                                        (PopplerAnnotMarkup *poppler_annot,
+                                                         PopplerRectangle *poppler_rect);
+GDate *             poppler_annot_markup_get_date       (PopplerAnnotMarkup *poppler_annot);
+PopplerAnnotExternalDataType poppler_annot_markup_get_external_data
+                                                        (PopplerAnnotMarkup *poppler_annot);
+PopplerAnnotMarkupReplyType poppler_annot_markup_get_reply_to
+                                                        (PopplerAnnotMarkup *poppler_annot);
+PopplerAnnot *      poppler_annot_text_new              (PopplerDocument *doc,
+                                                         PopplerRectangle *rect);
+gchar *             poppler_annot_text_get_icon         (PopplerAnnotText *poppler_annot);
+#define             POPPLER_ANNOT_TEXT_ICON_NOTE
+#define             POPPLER_ANNOT_TEXT_ICON_COMMENT
+#define             POPPLER_ANNOT_TEXT_ICON_KEY
+#define             POPPLER_ANNOT_TEXT_ICON_HELP
+#define             POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH
+#define             POPPLER_ANNOT_TEXT_ICON_PARAGRAPH
+#define             POPPLER_ANNOT_TEXT_ICON_INSERT
+#define             POPPLER_ANNOT_TEXT_ICON_CROSS
+#define             POPPLER_ANNOT_TEXT_ICON_CIRCLE
+void                poppler_annot_text_set_icon         (PopplerAnnotText *poppler_annot,
+                                                         const gchar *icon);
+gboolean            poppler_annot_text_get_is_open      (PopplerAnnotText *poppler_annot);
+void                poppler_annot_text_set_is_open      (PopplerAnnotText *poppler_annot,
+                                                         gboolean is_open);
+PopplerAnnotTextState poppler_annot_text_get_state      (PopplerAnnotText *poppler_annot);
+PopplerAnnotCalloutLine * poppler_annot_free_text_get_callout_line
+                                                        (PopplerAnnotFreeText *poppler_annot);
+PopplerAnnotFreeTextQuadding poppler_annot_free_text_get_quadding
+                                                        (PopplerAnnotFreeText *poppler_annot);
+PopplerAttachment * poppler_annot_file_attachment_get_attachment
+                                                        (PopplerAnnotFileAttachment *poppler_annot);
+gchar *             poppler_annot_file_attachment_get_name
+                                                        (PopplerAnnotFileAttachment *poppler_annot);
+PopplerAction *     poppler_annot_screen_get_action     (PopplerAnnotScreen *poppler_annot);
+PopplerMovie *      poppler_annot_movie_get_movie       (PopplerAnnotMovie *poppler_annot);
+gchar *             poppler_annot_movie_get_title       (PopplerAnnotMovie *poppler_annot);
+PopplerAnnotCalloutLine * poppler_annot_callout_line_new
+                                                        (void);
+PopplerAnnotCalloutLine * poppler_annot_callout_line_copy
+                                                        (PopplerAnnotCalloutLine *callout);
+void                poppler_annot_callout_line_free     (PopplerAnnotCalloutLine *callout);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerAnnot
+
+
+
+

Description

+
+
+

Details

+
+

PopplerAnnot

+
typedef struct _PopplerAnnot PopplerAnnot;
+
+
+
+

PopplerAnnotMarkup

+
typedef struct _PopplerAnnotMarkup PopplerAnnotMarkup;
+
+
+
+

PopplerAnnotText

+
typedef struct _PopplerAnnotText PopplerAnnotText;
+
+
+
+

PopplerAnnotFreeText

+
typedef struct _PopplerAnnotFreeText PopplerAnnotFreeText;
+
+
+
+

PopplerAnnotFileAttachment

+
typedef struct _PopplerAnnotFileAttachment PopplerAnnotFileAttachment;
+
+
+
+

PopplerAnnotMovie

+
typedef struct _PopplerAnnotMovie PopplerAnnotMovie;
+
+
+
+

PopplerAnnotScreen

+
typedef struct _PopplerAnnotScreen PopplerAnnotScreen;
+
+
+
+

enum PopplerAnnotType

+
typedef enum {
+  POPPLER_ANNOT_UNKNOWN,
+  POPPLER_ANNOT_TEXT,
+  POPPLER_ANNOT_LINK,
+  POPPLER_ANNOT_FREE_TEXT,
+  POPPLER_ANNOT_LINE,
+  POPPLER_ANNOT_SQUARE,
+  POPPLER_ANNOT_CIRCLE,
+  POPPLER_ANNOT_POLYGON,
+  POPPLER_ANNOT_POLY_LINE,
+  POPPLER_ANNOT_HIGHLIGHT,
+  POPPLER_ANNOT_UNDERLINE,
+  POPPLER_ANNOT_SQUIGGLY,
+  POPPLER_ANNOT_STRIKE_OUT,
+  POPPLER_ANNOT_STAMP,
+  POPPLER_ANNOT_CARET,
+  POPPLER_ANNOT_INK,
+  POPPLER_ANNOT_POPUP,
+  POPPLER_ANNOT_FILE_ATTACHMENT,
+  POPPLER_ANNOT_SOUND,
+  POPPLER_ANNOT_MOVIE,
+  POPPLER_ANNOT_WIDGET,
+  POPPLER_ANNOT_SCREEN,
+  POPPLER_ANNOT_PRINTER_MARK,
+  POPPLER_ANNOT_TRAP_NET,
+  POPPLER_ANNOT_WATERMARK,
+  POPPLER_ANNOT_3D
+} PopplerAnnotType;
+
+
+
+
+

enum PopplerAnnotFlag

+
typedef enum {
+  POPPLER_ANNOT_FLAG_UNKNOWN = 0,
+  POPPLER_ANNOT_FLAG_INVISIBLE = 1 << 0,
+  POPPLER_ANNOT_FLAG_HIDDEN = 1 << 1,
+  POPPLER_ANNOT_FLAG_PRINT = 1 << 2,
+  POPPLER_ANNOT_FLAG_NO_ZOOM = 1 << 3,
+  POPPLER_ANNOT_FLAG_NO_ROTATE = 1 << 4,
+  POPPLER_ANNOT_FLAG_NO_VIEW = 1 << 5,
+  POPPLER_ANNOT_FLAG_READ_ONLY = 1 << 6,
+  POPPLER_ANNOT_FLAG_LOCKED = 1 << 7,
+  POPPLER_ANNOT_FLAG_TOGGLE_NO_VIEW = 1 << 8,
+  POPPLER_ANNOT_FLAG_LOCKED_CONTENTS = 1 << 9
+} PopplerAnnotFlag;
+
+
+
+
+

enum PopplerAnnotExternalDataType

+
typedef enum {
+  POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_3D,
+  POPPLER_ANNOT_EXTERNAL_DATA_MARKUP_UNKNOWN
+} PopplerAnnotExternalDataType;
+
+
+
+
+

enum PopplerAnnotMarkupReplyType

+
typedef enum {
+  POPPLER_ANNOT_MARKUP_REPLY_TYPE_R,
+  POPPLER_ANNOT_MARKUP_REPLY_TYPE_GROUP
+} PopplerAnnotMarkupReplyType;
+
+
+
+
+

enum PopplerAnnotTextState

+
typedef enum {
+  POPPLER_ANNOT_TEXT_STATE_MARKED,
+  POPPLER_ANNOT_TEXT_STATE_UNMARKED,
+  POPPLER_ANNOT_TEXT_STATE_ACCEPTED,
+  POPPLER_ANNOT_TEXT_STATE_REJECTED,
+  POPPLER_ANNOT_TEXT_STATE_CANCELLED,
+  POPPLER_ANNOT_TEXT_STATE_COMPLETED,
+  POPPLER_ANNOT_TEXT_STATE_NONE,
+  POPPLER_ANNOT_TEXT_STATE_UNKNOWN
+} PopplerAnnotTextState;
+
+
+
+
+

PopplerAnnotCalloutLine

+
typedef struct {
+  gboolean multiline;
+  gdouble  x1;
+  gdouble  y1;
+  gdouble  x2;
+  gdouble  y2;
+  gdouble  x3;
+  gdouble  y3;
+} PopplerAnnotCalloutLine;
+
+
+
+
+

enum PopplerAnnotFreeTextQuadding

+
typedef enum {
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_LEFT_JUSTIFIED,
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_CENTERED,
+  POPPLER_ANNOT_FREE_TEXT_QUADDING_RIGHT_JUSTIFIED
+} PopplerAnnotFreeTextQuadding;
+
+
+
+
+

poppler_annot_get_annot_type ()

+
PopplerAnnotType    poppler_annot_get_annot_type        (PopplerAnnot *poppler_annot);
+

+Gets the type of poppler_annot +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

+PopplerAnnotType of poppler_annot.
+
+
+
+

poppler_annot_get_flags ()

+
PopplerAnnotFlag    poppler_annot_get_flags             (PopplerAnnot *poppler_annot);
+

+Retrieves the flag field specifying various characteristics of the +poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

the flag field of poppler_annot.
+
+
+
+

poppler_annot_get_name ()

+
gchar *             poppler_annot_get_name              (PopplerAnnot *poppler_annot);
+

+Retrieves the name of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

a new allocated string with the name of poppler_annot. It must +be freed with g_free() when done.
+
+
+
+

poppler_annot_get_page_index ()

+
gint                poppler_annot_get_page_index        (PopplerAnnot *poppler_annot);
+

+Returns the page index to which poppler_annot is associated, or -1 if unknown +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

page index or -1
+

Since 0.14

+
+
+
+

poppler_annot_get_color ()

+
PopplerColor *      poppler_annot_get_color             (PopplerAnnot *poppler_annot);
+

+Retrieves the color of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

a new allocated PopplerColor with the color values of +poppler_annot, or NULL. It must be freed with g_free() when done.
+
+
+
+

poppler_annot_set_color ()

+
void                poppler_annot_set_color             (PopplerAnnot *poppler_annot,
+                                                         PopplerColor *poppler_color);
+

+Sets the color of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

poppler_color :

a PopplerColor, or NULL. [allow-none] +
+

Since 0.16

+
+
+
+

poppler_annot_get_contents ()

+
gchar *             poppler_annot_get_contents          (PopplerAnnot *poppler_annot);
+

+Retrieves the contents of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

a new allocated string with the contents of poppler_annot. It +must be freed with g_free() when done.
+
+
+
+

poppler_annot_set_contents ()

+
void                poppler_annot_set_contents          (PopplerAnnot *poppler_annot,
+                                                         const gchar *contents);
+

+Sets the contents of poppler_annot to the given value, +replacing the current contents. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

contents :

a text string containing the new contents
+

Since 0.12

+
+
+
+

poppler_annot_get_modified ()

+
gchar *             poppler_annot_get_modified          (PopplerAnnot *poppler_annot);
+

+Retrieves the last modification data of poppler_annot. The returned +string will be either a PDF format date or a text string. +See also #poppler_date_parse() +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnot +

Returns :

a new allocated string with the last modification data of +poppler_annot. It must be freed with g_free() when done.
+
+
+
+

poppler_annot_markup_get_label ()

+
gchar *             poppler_annot_markup_get_label      (PopplerAnnotMarkup *poppler_annot);
+

+Retrieves the label text of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

the label text of poppler_annot.
+
+
+
+

poppler_annot_markup_set_label ()

+
void                poppler_annot_markup_set_label      (PopplerAnnotMarkup *poppler_annot,
+                                                         const gchar *label);
+

+Sets the label text of poppler_annot, replacing the current one +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

label :

a text string containing the new label, or NULL. [allow-none] +
+

Since 0.16

+
+
+
+

poppler_annot_markup_get_subject ()

+
gchar *             poppler_annot_markup_get_subject    (PopplerAnnotMarkup *poppler_annot);
+

+Retrives the subject text of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

the subject text of poppler_annot.
+
+
+
+

poppler_annot_markup_get_opacity ()

+
gdouble             poppler_annot_markup_get_opacity    (PopplerAnnotMarkup *poppler_annot);
+

+Retrieves the opacity value of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

the opacity value of poppler_annot, +between 0 (transparent) and 1 (opaque)
+
+
+
+

poppler_annot_markup_set_opacity ()

+
void                poppler_annot_markup_set_opacity    (PopplerAnnotMarkup *poppler_annot,
+                                                         gdouble opacity);
+

+Sets the opacity of poppler_annot. This value applies to +all visible elements of poppler_annot in its closed state, +but not to the pop-up window that appears when it's openened +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

opacity :

a constant opacity value, between 0 (transparent) and 1 (opaque)
+

Since 0.16

+
+
+
+

poppler_annot_markup_has_popup ()

+
gboolean            poppler_annot_markup_has_popup      (PopplerAnnotMarkup *poppler_annot);
+

+Return TRUE if the markup annotation has a popup window associated +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

+TRUE, if poppler_annot has popup, FALSE otherwise
+

Since 0.12

+
+
+
+

poppler_annot_markup_set_popup ()

+
void                poppler_annot_markup_set_popup      (PopplerAnnotMarkup *poppler_annot,
+                                                         PopplerRectangle *popup_rect);
+

+Associates a new popup window for editing contents of poppler_annot. +Popup window shall be displayed by viewers at popup_rect on the page. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

popup_rect :

a PopplerRectangle +
+

Since 0.16

+
+
+
+

poppler_annot_markup_get_popup_is_open ()

+
gboolean            poppler_annot_markup_get_popup_is_open
+                                                        (PopplerAnnotMarkup *poppler_annot);
+

+Retrieves the state of the popup window related to poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

the state of poppler_annot. TRUE if it's open, FALSE in +other case.
+
+
+
+

poppler_annot_markup_set_popup_is_open ()

+
void                poppler_annot_markup_set_popup_is_open
+                                                        (PopplerAnnotMarkup *poppler_annot,
+                                                         gboolean is_open);
+

+Sets the state of the popup window related to poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

is_open :

whether popup window should initially be displayed open
+

Since 0.16

+
+
+
+

poppler_annot_markup_get_popup_rectangle ()

+
gboolean            poppler_annot_markup_get_popup_rectangle
+                                                        (PopplerAnnotMarkup *poppler_annot,
+                                                         PopplerRectangle *poppler_rect);
+

+Retrieves the rectangle of the popup window related to poppler_annot. +

+
++ + + + + + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

poppler_rect :

a PopplerRectangle to store the popup rectangle. [out] +

Returns :

+TRUE if PopplerRectangle was correctly filled, FALSE otherwise
+

Since 0.12

+
+
+
+

poppler_annot_markup_get_date ()

+
GDate *             poppler_annot_markup_get_date       (PopplerAnnotMarkup *poppler_annot);
+

+Returns the date and time when the annotation was created +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

a GDate representing the date and time +when the annotation was created, or NULL. [transfer full] +
+
+
+
+

poppler_annot_markup_get_external_data ()

+
PopplerAnnotExternalDataType poppler_annot_markup_get_external_data
+                                                        (PopplerAnnotMarkup *poppler_annot);
+

+Gets the external data type of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

+PopplerAnnotExternalDataType of poppler_annot.
+
+
+
+

poppler_annot_markup_get_reply_to ()

+
PopplerAnnotMarkupReplyType poppler_annot_markup_get_reply_to
+                                                        (PopplerAnnotMarkup *poppler_annot);
+

+Gets the reply type of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMarkup +

Returns :

+PopplerAnnotMarkupReplyType of poppler_annot.
+
+
+
+

poppler_annot_text_new ()

+
PopplerAnnot *      poppler_annot_text_new              (PopplerDocument *doc,
+                                                         PopplerRectangle *rect);
+

+Creates a new Text annotation that will be +located on rect when added to a page. See +poppler_page_add_annot() +

+
++ + + + + + + + + + + + + + +

doc :

a PopplerDocument +

rect :

a PopplerRectangle +

Returns :

A newly created PopplerAnnotText annotation
+

Since 0.16

+
+
+
+

poppler_annot_text_get_icon ()

+
gchar *             poppler_annot_text_get_icon         (PopplerAnnotText *poppler_annot);
+

+Gets name of the icon of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotText +

Returns :

a new allocated string containing the icon name
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_NOTE

+
#define POPPLER_ANNOT_TEXT_ICON_NOTE          "Note"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_COMMENT

+
#define POPPLER_ANNOT_TEXT_ICON_COMMENT       "Comment"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_KEY

+
#define POPPLER_ANNOT_TEXT_ICON_KEY           "Key"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_HELP

+
#define POPPLER_ANNOT_TEXT_ICON_HELP          "Help"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH

+
#define POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH "NewParagraph"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_PARAGRAPH

+
#define POPPLER_ANNOT_TEXT_ICON_PARAGRAPH     "Paragraph"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_INSERT

+
#define POPPLER_ANNOT_TEXT_ICON_INSERT        "Insert"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_CROSS

+
#define POPPLER_ANNOT_TEXT_ICON_CROSS         "Cross"
+
+
+
+
+

POPPLER_ANNOT_TEXT_ICON_CIRCLE

+
#define POPPLER_ANNOT_TEXT_ICON_CIRCLE        "Circle"
+
+
+
+
+

poppler_annot_text_set_icon ()

+
void                poppler_annot_text_set_icon         (PopplerAnnotText *poppler_annot,
+                                                         const gchar *icon);
+

+Sets the icon of poppler_annot. The following predefined +icons are currently supported: +

+ +

+

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotText +

icon :

the name of an icon
+

Since 0.16

+
+
+
+

poppler_annot_text_get_is_open ()

+
gboolean            poppler_annot_text_get_is_open      (PopplerAnnotText *poppler_annot);
+

+Retrieves the state of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotText +

Returns :

the state of poppler_annot. TRUE if it's open, FALSE in +other case.
+
+
+
+

poppler_annot_text_set_is_open ()

+
void                poppler_annot_text_set_is_open      (PopplerAnnotText *poppler_annot,
+                                                         gboolean is_open);
+

+Sets whether poppler_annot should initially be displayed open +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotText +

is_open :

whether annotation should initially be displayed open
+

Since 0.16

+
+
+
+

poppler_annot_text_get_state ()

+
PopplerAnnotTextState poppler_annot_text_get_state      (PopplerAnnotText *poppler_annot);
+

+Retrieves the state of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotText +

Returns :

+PopplerAnnotTextState of poppler_annot.
+
+
+
+

poppler_annot_free_text_get_callout_line ()

+
PopplerAnnotCalloutLine * poppler_annot_free_text_get_callout_line
+                                                        (PopplerAnnotFreeText *poppler_annot);
+

+Retrieves a PopplerAnnotCalloutLine of four or six numbers specifying a callout +line attached to the poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotFreeText +

Returns :

a new allocated PopplerAnnotCalloutLine if the annot has a callout +line, NULL in other case. It must be freed with g_free() when +done.
+
+
+
+

poppler_annot_free_text_get_quadding ()

+
PopplerAnnotFreeTextQuadding poppler_annot_free_text_get_quadding
+                                                        (PopplerAnnotFreeText *poppler_annot);
+

+Retrieves the justification of the text of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotFreeText +

Returns :

+PopplerAnnotFreeTextQuadding of poppler_annot.
+
+
+
+

poppler_annot_file_attachment_get_attachment ()

+
PopplerAttachment * poppler_annot_file_attachment_get_attachment
+                                                        (PopplerAnnotFileAttachment *poppler_annot);
+

+Creates a PopplerAttachment for the file of the file attachment annotation annot. +The PopplerAttachment must be unrefed with g_object_unref by the caller. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotFileAttachment +

Returns :

+PopplerAttachment. [transfer full] +
+

Since 0.14

+
+
+
+

poppler_annot_file_attachment_get_name ()

+
gchar *             poppler_annot_file_attachment_get_name
+                                                        (PopplerAnnotFileAttachment *poppler_annot);
+

+Retrieves the name of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotFileAttachment +

Returns :

a new allocated string with the name of poppler_annot. It must +be freed with g_free() when done.
+

Since 0.14

+
+
+
+

poppler_annot_screen_get_action ()

+
PopplerAction *     poppler_annot_screen_get_action     (PopplerAnnotScreen *poppler_annot);
+

+Retrieves the action (PopplerAction) that shall be performed when poppler_annot is activated +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotScreen +

Returns :

the action to perform. The returned +object is owned by poppler_annot and should not be freed. [transfer none] +
+

Since 0.14

+
+
+
+

poppler_annot_movie_get_movie ()

+
PopplerMovie *      poppler_annot_movie_get_movie       (PopplerAnnotMovie *poppler_annot);
+

+Retrieves the movie object (PopplerMovie) stored in the poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMovie +

Returns :

the movie object stored in the poppler_annot. The returned +object is owned by PopplerAnnotMovie and should not be freed. [transfer none] +
+

Since 0.14

+
+
+
+

poppler_annot_movie_get_title ()

+
gchar *             poppler_annot_movie_get_title       (PopplerAnnotMovie *poppler_annot);
+

+Retrieves the movie title of poppler_annot. +

+
++ + + + + + + + + + +

poppler_annot :

a PopplerAnnotMovie +

Returns :

the title text of poppler_annot.
+

Since 0.14

+
+
+
+

poppler_annot_callout_line_new ()

+
PopplerAnnotCalloutLine * poppler_annot_callout_line_new
+                                                        (void);
+

+Creates a new empty PopplerAnnotCalloutLine. +

+
++ + + + +

Returns :

a new allocated PopplerAnnotCalloutLine, NULL in other case. +It must be freed when done.
+
+
+
+

poppler_annot_callout_line_copy ()

+
PopplerAnnotCalloutLine * poppler_annot_callout_line_copy
+                                                        (PopplerAnnotCalloutLine *callout);
+

+It does copy callout to a new PopplerAnnotCalloutLine. +

+
++ + + + + + + + + + +

callout :

the PopplerAnnotCalloutLine to be copied.

Returns :

a new allocated PopplerAnnotCalloutLine as exact copy of +callout, NULL in other case. It must be freed when done.
+
+
+
+

poppler_annot_callout_line_free ()

+
void                poppler_annot_callout_line_free     (PopplerAnnotCalloutLine *callout);
+

+Frees the memory used by PopplerAnnotCalloutLine. +

+
++ + + + +

callout :

a PopplerAnnotCalloutLine +
+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerAttachment.html b/glib/reference/html/PopplerAttachment.html new file mode 100644 index 0000000..66a4f2f --- /dev/null +++ b/glib/reference/html/PopplerAttachment.html @@ -0,0 +1,203 @@ + + + + +PopplerAttachment + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerAttachment

+

PopplerAttachment — Attachments

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerAttachment;
+gboolean            (*PopplerAttachmentSaveFunc)        (const gchar *buf,
+                                                         gsize count,
+                                                         gpointer data,
+                                                         GError **error);
+gboolean            poppler_attachment_save             (PopplerAttachment *attachment,
+                                                         const char *filename,
+                                                         GError **error);
+gboolean            poppler_attachment_save_to_callback (PopplerAttachment *attachment,
+                                                         PopplerAttachmentSaveFunc save_func,
+                                                         gpointer user_data,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerAttachment
+
+
+
+

Description

+
+
+

Details

+
+

PopplerAttachment

+
typedef struct _PopplerAttachment PopplerAttachment;
+
+
+
+

PopplerAttachmentSaveFunc ()

+
gboolean            (*PopplerAttachmentSaveFunc)        (const gchar *buf,
+                                                         gsize count,
+                                                         gpointer data,
+                                                         GError **error);
+

+Specifies the type of the function passed to +poppler_attachment_save_to_callback(). It is called once for each block of +bytes that is "written" by poppler_attachment_save_to_callback(). If +successful it should return TRUE. If an error occurs it should set +error and return FALSE, in which case poppler_attachment_save_to_callback() +will fail with the same error. +

+

+Returns: TRUE if successful, FALSE (with error set) if failed. +

+
++ + + + + + + + + + + + + + + + + + +

buf :

buffer containing +bytes to be written. [array length=count][element-type guint8] +

count :

number of bytes in buf.

data :

user data passed to poppler_attachment_save_to_callback(). [closure] +

error :

GError to set on error, or NULL +
+
+
+
+

poppler_attachment_save ()

+
gboolean            poppler_attachment_save             (PopplerAttachment *attachment,
+                                                         const char *filename,
+                                                         GError **error);
+

+Saves attachment to a file indicated by filename. If error is set, FALSE +will be returned. Possible errors include those in the G_FILE_ERROR domain +and whatever the save function generates. +

+
++ + + + + + + + + + + + + + + + + + +

attachment :

A PopplerAttachment.

filename :

name of file to save

error :

return location for error, or NULL. [allow-none] +

Returns :

+TRUE, if the file successfully saved
+
+
+
+

poppler_attachment_save_to_callback ()

+
gboolean            poppler_attachment_save_to_callback (PopplerAttachment *attachment,
+                                                         PopplerAttachmentSaveFunc save_func,
+                                                         gpointer user_data,
+                                                         GError **error);
+

+Saves attachment by feeding the produced data to save_func. Can be used +when you want to store the attachment to something other than a file, such as +an in-memory buffer or a socket. If error is set, FALSE will be +returned. Possible errors include those in the G_FILE_ERROR domain and +whatever the save function generates. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

attachment :

A PopplerAttachment.

save_func :

a function that is called to save each block of data that the save routine generates. [scope call] +

user_data :

user data to pass to the save function.

error :

return location for error, or NULL. [allow-none] +

Returns :

+TRUE, if the save successfully completed
+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerDocument.html b/glib/reference/html/PopplerDocument.html new file mode 100644 index 0000000..b1410f0 --- /dev/null +++ b/glib/reference/html/PopplerDocument.html @@ -0,0 +1,2287 @@ + + + + +PopplerDocument + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerDocument

+

PopplerDocument — Information about a document

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerDocument;
+                    PopplerIndexIter;
+                    PopplerFontsIter;
+                    PopplerLayersIter;
+enum                PopplerPageLayout;
+enum                PopplerPageMode;
+                    PopplerFontInfo;
+enum                PopplerFontType;
+                    PopplerPSFile;
+enum                PopplerViewerPreferences;
+enum                PopplerPermissions;
+PopplerDocument *   poppler_document_new_from_file      (const char *uri,
+                                                         const char *password,
+                                                         GError **error);
+PopplerDocument *   poppler_document_new_from_data      (char *data,
+                                                         int length,
+                                                         const char *password,
+                                                         GError **error);
+gboolean            poppler_document_save               (PopplerDocument *document,
+                                                         const char *uri,
+                                                         GError **error);
+gboolean            poppler_document_save_a_copy        (PopplerDocument *document,
+                                                         const char *uri,
+                                                         GError **error);
+gboolean            poppler_document_get_id             (PopplerDocument *document,
+                                                         gchar **permanent_id,
+                                                         gchar **update_id);
+gchar *             poppler_document_get_pdf_version_string
+                                                        (PopplerDocument *document);
+void                poppler_document_get_pdf_version    (PopplerDocument *document,
+                                                         guint *major_version,
+                                                         guint *minor_version);
+gchar *             poppler_document_get_title          (PopplerDocument *document);
+gchar *             poppler_document_get_author         (PopplerDocument *document);
+gchar *             poppler_document_get_subject        (PopplerDocument *document);
+gchar *             poppler_document_get_keywords       (PopplerDocument *document);
+gchar *             poppler_document_get_creator        (PopplerDocument *document);
+gchar *             poppler_document_get_producer       (PopplerDocument *document);
+time_t              poppler_document_get_creation_date  (PopplerDocument *document);
+time_t              poppler_document_get_modification_date
+                                                        (PopplerDocument *document);
+PopplerPageLayout   poppler_document_get_page_layout    (PopplerDocument *document);
+PopplerPageMode     poppler_document_get_page_mode      (PopplerDocument *document);
+PopplerPermissions  poppler_document_get_permissions    (PopplerDocument *document);
+gchar *             poppler_document_get_metadata       (PopplerDocument *document);
+gboolean            poppler_document_is_linearized      (PopplerDocument *document);
+int                 poppler_document_get_n_pages        (PopplerDocument *document);
+PopplerPage *       poppler_document_get_page           (PopplerDocument *document,
+                                                         int index);
+PopplerPage *       poppler_document_get_page_by_label  (PopplerDocument *document,
+                                                         const char *label);
+PopplerDest *       poppler_document_find_dest          (PopplerDocument *document,
+                                                         const gchar *link_name);
+guint               poppler_document_get_n_attachments  (PopplerDocument *document);
+gboolean            poppler_document_has_attachments    (PopplerDocument *document);
+GList *             poppler_document_get_attachments    (PopplerDocument *document);
+PopplerFormField *  poppler_document_get_form_field     (PopplerDocument *document,
+                                                         gint id);
+PopplerIndexIter *  poppler_index_iter_new              (PopplerDocument *document);
+PopplerIndexIter *  poppler_index_iter_copy             (PopplerIndexIter *iter);
+void                poppler_index_iter_free             (PopplerIndexIter *iter);
+PopplerIndexIter *  poppler_index_iter_get_child        (PopplerIndexIter *parent);
+gboolean            poppler_index_iter_is_open          (PopplerIndexIter *iter);
+PopplerAction *     poppler_index_iter_get_action       (PopplerIndexIter *iter);
+gboolean            poppler_index_iter_next             (PopplerIndexIter *iter);
+PopplerFontInfo *   poppler_font_info_new               (PopplerDocument *document);
+gboolean            poppler_font_info_scan              (PopplerFontInfo *font_info,
+                                                         int n_pages,
+                                                         PopplerFontsIter **iter);
+void                poppler_font_info_free              (PopplerFontInfo *font_info);
+PopplerFontsIter *  poppler_fonts_iter_copy             (PopplerFontsIter *iter);
+void                poppler_fonts_iter_free             (PopplerFontsIter *iter);
+const char *        poppler_fonts_iter_get_name         (PopplerFontsIter *iter);
+const char *        poppler_fonts_iter_get_full_name    (PopplerFontsIter *iter);
+PopplerFontType     poppler_fonts_iter_get_font_type    (PopplerFontsIter *iter);
+const char *        poppler_fonts_iter_get_substitute_name
+                                                        (PopplerFontsIter *iter);
+const char *        poppler_fonts_iter_get_file_name    (PopplerFontsIter *iter);
+const char *        poppler_fonts_iter_get_encoding     (PopplerFontsIter *iter);
+gboolean            poppler_fonts_iter_is_embedded      (PopplerFontsIter *iter);
+gboolean            poppler_fonts_iter_is_subset        (PopplerFontsIter *iter);
+gboolean            poppler_fonts_iter_next             (PopplerFontsIter *iter);
+PopplerLayersIter * poppler_layers_iter_new             (PopplerDocument *document);
+PopplerLayersIter * poppler_layers_iter_copy            (PopplerLayersIter *iter);
+void                poppler_layers_iter_free            (PopplerLayersIter *iter);
+PopplerLayersIter * poppler_layers_iter_get_child       (PopplerLayersIter *parent);
+PopplerLayer *      poppler_layers_iter_get_layer       (PopplerLayersIter *iter);
+gchar *             poppler_layers_iter_get_title       (PopplerLayersIter *iter);
+gboolean            poppler_layers_iter_next            (PopplerLayersIter *iter);
+PopplerPSFile *     poppler_ps_file_new                 (PopplerDocument *document,
+                                                         const char *filename,
+                                                         int first_page,
+                                                         int n_pages);
+void                poppler_ps_file_free                (PopplerPSFile *ps_file);
+void                poppler_ps_file_set_paper_size      (PopplerPSFile *ps_file,
+                                                         double width,
+                                                         double height);
+void                poppler_ps_file_set_duplex          (PopplerPSFile *ps_file,
+                                                         gboolean duplex);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerDocument
+
+
+
+

Properties

+
+  "author"                   gchar*                : Read
+  "creation-date"            gint                  : Read
+  "creator"                  gchar*                : Read
+  "format"                   gchar*                : Read
+  "format-major"             guint                 : Read
+  "format-minor"             guint                 : Read
+  "keywords"                 gchar*                : Read
+  "linearized"               gboolean              : Read
+  "metadata"                 gchar*                : Read
+  "mod-date"                 gint                  : Read
+  "page-layout"              PopplerPageLayout     : Read
+  "page-mode"                PopplerPageMode       : Read
+  "permissions"              PopplerPermissions    : Read
+  "producer"                 gchar*                : Read
+  "subject"                  gchar*                : Read
+  "title"                    gchar*                : Read
+  "viewer-preferences"       PopplerViewerPreferences  : Read
+
+
+
+

Description

+

+The PopplerDocument is an object used to refer to a main document. +

+
+
+

Details

+
+

PopplerDocument

+
typedef struct _PopplerDocument PopplerDocument;
+
+
+
+

PopplerIndexIter

+
typedef struct _PopplerIndexIter PopplerIndexIter;
+
+
+
+

PopplerFontsIter

+
typedef struct _PopplerFontsIter PopplerFontsIter;
+
+
+
+

PopplerLayersIter

+
typedef struct _PopplerLayersIter PopplerLayersIter;
+
+
+
+

enum PopplerPageLayout

+
typedef enum {
+  POPPLER_PAGE_LAYOUT_UNSET,
+  POPPLER_PAGE_LAYOUT_SINGLE_PAGE,
+  POPPLER_PAGE_LAYOUT_ONE_COLUMN,
+  POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT,
+  POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT,
+  POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT,
+  POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT
+} PopplerPageLayout;
+
+

+Page layout types +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_PAGE_LAYOUT_UNSET

no specific layout set +

POPPLER_PAGE_LAYOUT_SINGLE_PAGE

one page at a time +

POPPLER_PAGE_LAYOUT_ONE_COLUMN

pages in one column +

POPPLER_PAGE_LAYOUT_TWO_COLUMN_LEFT

pages in two columns with odd numbered pages on the left +

POPPLER_PAGE_LAYOUT_TWO_COLUMN_RIGHT

pages in two columns with odd numbered pages on the right +

POPPLER_PAGE_LAYOUT_TWO_PAGE_LEFT

two pages at a time with odd numbered pages on the left +

POPPLER_PAGE_LAYOUT_TWO_PAGE_RIGHT

two pages at a time with odd numbered pages on the right +
+
+
+
+

enum PopplerPageMode

+
typedef enum {
+  POPPLER_PAGE_MODE_UNSET,
+  POPPLER_PAGE_MODE_NONE,
+  POPPLER_PAGE_MODE_USE_OUTLINES,
+  POPPLER_PAGE_MODE_USE_THUMBS,
+  POPPLER_PAGE_MODE_FULL_SCREEN,
+  POPPLER_PAGE_MODE_USE_OC,
+  POPPLER_PAGE_MODE_USE_ATTACHMENTS
+} PopplerPageMode;
+
+

+Page modes +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_PAGE_MODE_UNSET

no specific mode set +

POPPLER_PAGE_MODE_NONE

neither document outline nor thumbnails visible +

POPPLER_PAGE_MODE_USE_OUTLINES

document outline visible +

POPPLER_PAGE_MODE_USE_THUMBS

thumbnails visible +

POPPLER_PAGE_MODE_FULL_SCREEN

full-screen mode +

POPPLER_PAGE_MODE_USE_OC

layers panel visible +

POPPLER_PAGE_MODE_USE_ATTACHMENTS

attachments panel visible +
+
+
+
+

PopplerFontInfo

+
typedef struct {
+} PopplerFontInfo;
+
+
+
+
+

enum PopplerFontType

+
typedef enum {
+  POPPLER_FONT_TYPE_UNKNOWN,
+  POPPLER_FONT_TYPE_TYPE1,
+  POPPLER_FONT_TYPE_TYPE1C,
+  POPPLER_FONT_TYPE_TYPE1COT,
+  POPPLER_FONT_TYPE_TYPE3,
+  POPPLER_FONT_TYPE_TRUETYPE,
+  POPPLER_FONT_TYPE_TRUETYPEOT,
+  POPPLER_FONT_TYPE_CID_TYPE0,
+  POPPLER_FONT_TYPE_CID_TYPE0C,
+  POPPLER_FONT_TYPE_CID_TYPE0COT,
+  POPPLER_FONT_TYPE_CID_TYPE2,
+  POPPLER_FONT_TYPE_CID_TYPE2OT
+} PopplerFontType;
+
+

+Font types +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_FONT_TYPE_UNKNOWN

unknown font type +

POPPLER_FONT_TYPE_TYPE1

Type 1 font type +

POPPLER_FONT_TYPE_TYPE1C

Type 1 font type embedded in Compact Font Format (CFF) font program +

POPPLER_FONT_TYPE_TYPE1COT

Type 1 font type embedded in OpenType font program +

POPPLER_FONT_TYPE_TYPE3

A font type that is defined with PDF graphics operators +

POPPLER_FONT_TYPE_TRUETYPE

TrueType font type +

POPPLER_FONT_TYPE_TRUETYPEOT

TrueType font type embedded in OpenType font program +

POPPLER_FONT_TYPE_CID_TYPE0

CIDFont type based on Type 1 font technology +

POPPLER_FONT_TYPE_CID_TYPE0C

CIDFont type based on Type 1 font technology embedded in CFF font program +

POPPLER_FONT_TYPE_CID_TYPE0COT

CIDFont type based on Type 1 font technology embedded in OpenType font program +

POPPLER_FONT_TYPE_CID_TYPE2

CIDFont type based on TrueType font technology +

POPPLER_FONT_TYPE_CID_TYPE2OT

CIDFont type based on TrueType font technology embedded in OpenType font program +
+
+
+
+

PopplerPSFile

+
typedef struct {
+} PopplerPSFile;
+
+
+
+
+

enum PopplerViewerPreferences

+
typedef enum {
+  POPPLER_VIEWER_PREFERENCES_UNSET = 0,
+  POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR = 1 << 0,
+  POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR = 1 << 1,
+  POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI = 1 << 2,
+  POPPLER_VIEWER_PREFERENCES_FIT_WINDOW = 1 << 3,
+  POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW = 1 << 4,
+  POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE = 1 << 5,
+  POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL = 1 << 6
+} PopplerViewerPreferences;
+
+

+Viewer preferences +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_VIEWER_PREFERENCES_UNSET

no preferences set +

POPPLER_VIEWER_PREFERENCES_HIDE_TOOLBAR

hider toolbars when document is active +

POPPLER_VIEWER_PREFERENCES_HIDE_MENUBAR

hide menu bar when document is active +

POPPLER_VIEWER_PREFERENCES_HIDE_WINDOWUI

hide UI elements in document's window +

POPPLER_VIEWER_PREFERENCES_FIT_WINDOW

resize document's window to fit the size of the first displayed page +

POPPLER_VIEWER_PREFERENCES_CENTER_WINDOW

position the document's window in the center of the screen +

POPPLER_VIEWER_PREFERENCES_DISPLAY_DOC_TITLE

display document title in window's title bar +

POPPLER_VIEWER_PREFERENCES_DIRECTION_RTL

the predominant reading order for text is right to left +
+
+
+
+

enum PopplerPermissions

+
typedef enum {
+  POPPLER_PERMISSIONS_OK_TO_PRINT = 1 << 0,
+  POPPLER_PERMISSIONS_OK_TO_MODIFY = 1 << 1,
+  POPPLER_PERMISSIONS_OK_TO_COPY = 1 << 2,
+  POPPLER_PERMISSIONS_OK_TO_ADD_NOTES = 1 << 3,
+  POPPLER_PERMISSIONS_OK_TO_FILL_FORM = 1 << 4,
+  POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS = 1 << 5,
+  POPPLER_PERMISSIONS_OK_TO_ASSEMBLE = 1 << 6,
+  POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION = 1 << 7,
+  POPPLER_PERMISSIONS_FULL = (POPPLER_PERMISSIONS_OK_TO_PRINT | POPPLER_PERMISSIONS_OK_TO_MODIFY | POPPLER_PERMISSIONS_OK_TO_COPY | POPPLER_PERMISSIONS_OK_TO_ADD_NOTES | POPPLER_PERMISSIONS_OK_TO_FILL_FORM | POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS | POPPLER_PERMISSIONS_OK_TO_ASSEMBLE | POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION)
+} PopplerPermissions;
+
+

+Permissions +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_PERMISSIONS_OK_TO_PRINT

document can be printer +

POPPLER_PERMISSIONS_OK_TO_MODIFY

document contents can be modified +

POPPLER_PERMISSIONS_OK_TO_COPY

document can be copied +

POPPLER_PERMISSIONS_OK_TO_ADD_NOTES

annotations can added to the document +

POPPLER_PERMISSIONS_OK_TO_FILL_FORM

interactive form fields can be filled in +

POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS

extract text and graphics +(in support of accessibility to users with disabilities or for other purposes). Since 0.18 +

POPPLER_PERMISSIONS_OK_TO_ASSEMBLE

assemble the document (insert, rotate, or delete pages and create +bookmarks or thumbnail images). Since 0.18 +

POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION

document can be printer at high resolution. Since 0.18 +

POPPLER_PERMISSIONS_FULL

document permits all operations +
+
+
+
+

poppler_document_new_from_file ()

+
PopplerDocument *   poppler_document_new_from_file      (const char *uri,
+                                                         const char *password,
+                                                         GError **error);
+

+Creates a new PopplerDocument. If NULL is returned, then error will be +set. Possible errors include those in the POPPLER_ERROR and G_FILE_ERROR +domains. +

+
++ + + + + + + + + + + + + + + + + + +

uri :

uri of the file to load

password :

password to unlock the file with, or NULL. [allow-none] +

error :

Return location for an error, or NULL. [allow-none] +

Returns :

A newly created PopplerDocument, or NULL +
+
+
+
+

poppler_document_new_from_data ()

+
PopplerDocument *   poppler_document_new_from_data      (char *data,
+                                                         int length,
+                                                         const char *password,
+                                                         GError **error);
+

+Creates a new PopplerDocument. If NULL is returned, then error will be +set. Possible errors include those in the POPPLER_ERROR and G_FILE_ERROR +domains. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

data :

the pdf data contained in a char array

length :

the length of data +

password :

password to unlock the file with, or NULL. [allow-none] +

error :

Return location for an error, or NULL. [allow-none] +

Returns :

A newly created PopplerDocument, or NULL +
+
+
+
+

poppler_document_save ()

+
gboolean            poppler_document_save               (PopplerDocument *document,
+                                                         const char *uri,
+                                                         GError **error);
+

+Saves document. Any change made in the document such as +form fields filled, annotations added or modified +will be saved. +If error is set, FALSE will be returned. Possible errors +include those in the G_FILE_ERROR domain. +

+
++ + + + + + + + + + + + + + + + + + +

document :

a PopplerDocument +

uri :

uri of file to save

error :

return location for an error, or NULL. [allow-none] +

Returns :

+TRUE, if the document was successfully saved
+
+
+
+

poppler_document_save_a_copy ()

+
gboolean            poppler_document_save_a_copy        (PopplerDocument *document,
+                                                         const char *uri,
+                                                         GError **error);
+

+Saves a copy of the original document. +Any change made in the document such as +form fields filled by the user will not be saved. +If error is set, FALSE will be returned. Possible errors +include those in the G_FILE_ERROR domain. +

+
++ + + + + + + + + + + + + + + + + + +

document :

a PopplerDocument +

uri :

uri of file to save

error :

return location for an error, or NULL. [allow-none] +

Returns :

+TRUE, if the document was successfully saved
+
+
+
+

poppler_document_get_id ()

+
gboolean            poppler_document_get_id             (PopplerDocument *document,
+                                                         gchar **permanent_id,
+                                                         gchar **update_id);
+

+Returns the PDF file identifier represented as two byte string arrays of size 32. +permanent_id is the permanent identifier that is built based on the file +contents at the time it was originally created, so that this identifer +never changes. update_id is the update identifier that is built based on +the file contents at the time it was last updated. +

+

+Note that returned strings are not null-terminated, they have a fixed +size of 32 bytes. +

+
++ + + + + + + + + + + + + + + + + + +

document :

A PopplerDocument +

permanent_id :

location to store an allocated string, use g_free() to free the returned string. [out][allow-none] +

update_id :

location to store an allocated string, use g_free() to free the returned string. [out][allow-none] +

Returns :

+TRUE if the document contains an id, FALSE otherwise
+

Since 0.16

+
+
+
+

poppler_document_get_pdf_version_string ()

+
gchar *             poppler_document_get_pdf_version_string
+                                                        (PopplerDocument *document);
+

+Returns the PDF version of document as a string (e.g. PDF-1.6) +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the PDF version +of document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_pdf_version ()

+
void                poppler_document_get_pdf_version    (PopplerDocument *document,
+                                                         guint *major_version,
+                                                         guint *minor_version);
+
++ + + + + + + + + + + + + + + + + + +

document :

A PopplerDocument +

major_version :

return location for the PDF major version number. [out][allow-none] +

minor_version :

return location for the PDF minor version number. [out][allow-none] +

Returns :

the major and minor PDF version numbers
+

Since 0.16

+
+
+
+

poppler_document_get_title ()

+
gchar *             poppler_document_get_title          (PopplerDocument *document);
+

+Returns the document's title +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the title +of document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_author ()

+
gchar *             poppler_document_get_author         (PopplerDocument *document);
+

+Returns the author of the document +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the author +of document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_subject ()

+
gchar *             poppler_document_get_subject        (PopplerDocument *document);
+

+Returns the subject of the document +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the subject +of document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_keywords ()

+
gchar *             poppler_document_get_keywords       (PopplerDocument *document);
+

+Returns the keywords associated to the document +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing keywords associated +to document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_creator ()

+
gchar *             poppler_document_get_creator        (PopplerDocument *document);
+

+Returns the creator of the document. If the document was converted +from another format, the creator is the name of the product +that created the original document from which it was converted. +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the creator +of document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_producer ()

+
gchar *             poppler_document_get_producer       (PopplerDocument *document);
+

+Returns the producer of the document. If the document was converted +from another format, the producer is the name of the product +that converted it to PDF +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the producer +of document, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_get_creation_date ()

+
time_t              poppler_document_get_creation_date  (PopplerDocument *document);
+

+Returns the date the document was created as seconds since the Epoch +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

the date the document was created, or -1
+

Since 0.16

+
+
+
+

poppler_document_get_modification_date ()

+
time_t              poppler_document_get_modification_date
+                                                        (PopplerDocument *document);
+

+Returns the date the document was most recently modified as seconds since the Epoch +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

the date the document was most recently modified, or -1
+

Since 0.16

+
+
+
+

poppler_document_get_page_layout ()

+
PopplerPageLayout   poppler_document_get_page_layout    (PopplerDocument *document);
+

+Returns the page layout that should be used when the document is opened +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a PopplerPageLayout that should be used when the document is opened
+

Since 0.16

+
+
+
+

poppler_document_get_page_mode ()

+
PopplerPageMode     poppler_document_get_page_mode      (PopplerDocument *document);
+

+Returns a PopplerPageMode representing how the document should +be initially displayed when opened. +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a PopplerPageMode that should be used when document is opened
+

Since 0.16

+
+
+
+

poppler_document_get_permissions ()

+
PopplerPermissions  poppler_document_get_permissions    (PopplerDocument *document);
+

+Returns the flags specifying which operations are permitted when the document is opened. +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a set of falgs from PopplerPermissions enumeration
+

Since 0.16

+
+
+
+

poppler_document_get_metadata ()

+
gchar *             poppler_document_get_metadata       (PopplerDocument *document);
+

+Returns the XML metadata string of the document +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a new allocated string containing the XML +metadata, or NULL +
+

Since 0.16

+
+
+
+

poppler_document_is_linearized ()

+
gboolean            poppler_document_is_linearized      (PopplerDocument *document);
+

+Returns whether document is linearized or not. Linearization of PDF +enables efficient incremental access of the PDF file in a network environment. +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

+TRUE if document is linearized, FALSE otherwhise
+

Since 0.16

+
+
+
+

poppler_document_get_n_pages ()

+
int                 poppler_document_get_n_pages        (PopplerDocument *document);
+

+Returns the number of pages in a loaded document. +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

Number of pages
+
+
+
+

poppler_document_get_page ()

+
PopplerPage *       poppler_document_get_page           (PopplerDocument *document,
+                                                         int index);
+

+Returns the PopplerPage indexed at index. This object is owned by the +caller. +

+
++ + + + + + + + + + + + + + +

document :

A PopplerDocument +

index :

a page index

Returns :

(transfer full) : The PopplerPage at index +
+
+
+
+

poppler_document_get_page_by_label ()

+
PopplerPage *       poppler_document_get_page_by_label  (PopplerDocument *document,
+                                                         const char *label);
+

+Returns the PopplerPage reference by label. This object is owned by the +caller. label is a human-readable string representation of the page number, +and can be document specific. Typically, it is a value such as "iii" or "3". +

+

+By default, "1" refers to the first page. +

+
++ + + + + + + + + + + + + + +

document :

A PopplerDocument +

label :

a page label

Returns :

(transfer full) :The PopplerPage referenced by label +
+
+
+
+

poppler_document_find_dest ()

+
PopplerDest *       poppler_document_find_dest          (PopplerDocument *document,
+                                                         const gchar *link_name);
+

+Finds named destination link_name in document +

+
++ + + + + + + + + + + + + + +

document :

A PopplerDocument +

link_name :

a named destination

Returns :

The PopplerDest destination or NULL if +link_name is not a destination. Returned value must +be freed with poppler_dest_free +
+
+
+
+

poppler_document_get_n_attachments ()

+
guint               poppler_document_get_n_attachments  (PopplerDocument *document);
+

+Returns the number of attachments in a loaded document. +See also poppler_document_get_attachments() +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

Number of attachments
+

Since 0.18

+
+
+
+

poppler_document_has_attachments ()

+
gboolean            poppler_document_has_attachments    (PopplerDocument *document);
+

+Returns TRUE of document has any attachments. +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

+TRUE, if document has attachments.
+
+
+
+

poppler_document_get_attachments ()

+
GList *             poppler_document_get_attachments    (PopplerDocument *document);
+

+Returns a GList containing PopplerAttachments. These attachments +are unowned, and must be unreffed, and the list must be freed with +g_list_free(). +

+
++ + + + + + + + + + +

document :

A PopplerDocument +

Returns :

a list of available attachments. [element-type PopplerAttachment][transfer full] +
+
+
+
+

poppler_document_get_form_field ()

+
PopplerFormField *  poppler_document_get_form_field     (PopplerDocument *document,
+                                                         gint id);
+

+Returns the PopplerFormField for the given id. It must be freed with +g_object_unref() +

+
++ + + + + + + + + + + + + + +

document :

a PopplerDocument +

id :

an id of a PopplerFormField +

Returns :

a new PopplerFormField or NULL if +not found. [transfer full] +
+
+
+
+

poppler_index_iter_new ()

+
PopplerIndexIter *  poppler_index_iter_new              (PopplerDocument *document);
+

+Returns the root PopplerIndexIter for document, or NULL. This must be +freed with poppler_index_iter_free(). +

+

+Certain documents have an index associated with them. This index can be used +to help the user navigate the document, and is similar to a table of +contents. Each node in the index will contain a PopplerAction that can be +displayed to the user — typically a POPPLER_ACTION_GOTO_DEST or a +POPPLER_ACTION_URI. +

+

+Here is a simple example of some code that walks the full index: +

+

+

+
+static void
+walk_index (PopplerIndexIter *iter)
+{
+  do
+    {
+      /* Get the the action and do something with it */
+      PopplerIndexIter *child = poppler_index_iter_get_child (iter);
+      if (child)
+        walk_index (child);
+      poppler_index_iter_free (child);
+    }
+  while (poppler_index_iter_next (iter));
+}
+...
+{
+  iter = poppler_index_iter_new (document);
+  walk_index (iter);
+  poppler_index_iter_free (iter);
+}
+
+

+

+
++ + + + + + + + + + +

document :

a PopplerDocument +

Returns :

a new PopplerIndexIter +
+
+
+
+

poppler_index_iter_copy ()

+
PopplerIndexIter *  poppler_index_iter_copy             (PopplerIndexIter *iter);
+

+Creates a new PopplerIndexIter as a copy of iter. This must be freed with +poppler_index_iter_free(). +

+
++ + + + + + + + + + +

iter :

a PopplerIndexIter +

Returns :

a new PopplerIndexIter +
+
+
+
+

poppler_index_iter_free ()

+
void                poppler_index_iter_free             (PopplerIndexIter *iter);
+

+Frees iter. +

+
++ + + + +

iter :

a PopplerIndexIter +
+
+
+
+

poppler_index_iter_get_child ()

+
PopplerIndexIter *  poppler_index_iter_get_child        (PopplerIndexIter *parent);
+

+Returns a newly created child of parent, or NULL if the iter has no child. +See poppler_index_iter_new() for more information on this function. +

+
++ + + + + + + + + + +

parent :

a PopplerIndexIter +

Returns :

a new PopplerIndexIter +
+
+
+
+

poppler_index_iter_is_open ()

+
gboolean            poppler_index_iter_is_open          (PopplerIndexIter *iter);
+

+Returns whether this node should be expanded by default to the user. The +document can provide a hint as to how the document's index should be expanded +initially. +

+
++ + + + + + + + + + +

iter :

a PopplerIndexIter +

Returns :

+TRUE, if the document wants iter to be expanded
+
+
+
+

poppler_index_iter_get_action ()

+
PopplerAction *     poppler_index_iter_get_action       (PopplerIndexIter *iter);
+

+Returns the PopplerAction associated with iter. It must be freed with +poppler_action_free(). +

+
++ + + + + + + + + + +

iter :

a PopplerIndexIter +

Returns :

a new PopplerAction +
+
+
+
+

poppler_index_iter_next ()

+
gboolean            poppler_index_iter_next             (PopplerIndexIter *iter);
+

+Sets iter to point to the next action at the current level, if valid. See +poppler_index_iter_new() for more information. +

+
++ + + + + + + + + + +

iter :

a PopplerIndexIter +

Returns :

+TRUE, if iter was set to the next action
+
+
+
+

poppler_font_info_new ()

+
PopplerFontInfo *   poppler_font_info_new               (PopplerDocument *document);
+

+Creates a new PopplerFontInfo object +

+
++ + + + + + + + + + +

document :

a PopplerDocument +

Returns :

a new PopplerFontInfo instance
+
+
+
+

poppler_font_info_scan ()

+
gboolean            poppler_font_info_scan              (PopplerFontInfo *font_info,
+                                                         int n_pages,
+                                                         PopplerFontsIter **iter);
+

+Scans the document associated with font_info for fonts. At most +n_pages will be scanned starting from the current iterator. iter will +point to the first font scanned. +

+

+Here is a simple example of code to scan fonts in a document +

+

+

+
+font_info = poppler_font_info_new (document);
+while (poppler_font_info_scan (font_info, 20, &fonts_iter)) {
+        if (!fonts_iter)
+                continue; /* No fonts found in these 20 pages */
+        do {
+                /* Do something with font iter */
+                g_print ("Font Name: %s\n", poppler_fonts_iter_get_name (fonts_iter));
+        } while (poppler_fonts_iter_next (fonts_iter));
+        poppler_fonts_iter_free (fonts_iter);
+}
+
+

+

+
++ + + + + + + + + + + + + + + + + + +

font_info :

a PopplerFontInfo +

n_pages :

number of pages to scan

iter :

return location for a PopplerFontsIter. [out] +

Returns :

+TRUE, if there are more fonts left to scan
+
+
+
+

poppler_font_info_free ()

+
void                poppler_font_info_free              (PopplerFontInfo *font_info);
+
+
+
+

poppler_fonts_iter_copy ()

+
PopplerFontsIter *  poppler_fonts_iter_copy             (PopplerFontsIter *iter);
+

+Creates a copy of iter +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter to copy

Returns :

a new allocated copy of iter +
+
+
+
+

poppler_fonts_iter_free ()

+
void                poppler_fonts_iter_free             (PopplerFontsIter *iter);
+

+Frees the given PopplerFontsIter +

+
++ + + + +

iter :

a PopplerFontsIter +
+
+
+
+

poppler_fonts_iter_get_name ()

+
const char *        poppler_fonts_iter_get_name         (PopplerFontsIter *iter);
+

+Returns the name of the font associated with iter +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

the font name
+
+
+
+

poppler_fonts_iter_get_full_name ()

+
const char *        poppler_fonts_iter_get_full_name    (PopplerFontsIter *iter);
+

+Returns the full name of the font associated with iter +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

the font full name
+
+
+
+

poppler_fonts_iter_get_font_type ()

+
PopplerFontType     poppler_fonts_iter_get_font_type    (PopplerFontsIter *iter);
+

+Returns the type of the font associated with iter +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

the font type
+
+
+
+

poppler_fonts_iter_get_substitute_name ()

+
const char *        poppler_fonts_iter_get_substitute_name
+                                                        (PopplerFontsIter *iter);
+

+The name of the substitute font of the font associated with iter or NULL if +the font is embedded +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

the name of the substitute font or NULL if font is embedded
+

Since 0.20

+
+
+
+

poppler_fonts_iter_get_file_name ()

+
const char *        poppler_fonts_iter_get_file_name    (PopplerFontsIter *iter);
+

+The filename of the font associated with iter or NULL if +the font is embedded +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

the filename of the font or NULL if font is embedded
+
+
+
+

poppler_fonts_iter_get_encoding ()

+
const char *        poppler_fonts_iter_get_encoding     (PopplerFontsIter *iter);
+

+Returns the encoding of the font associated with iter +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

the font encoding
+

Since 0.20

+
+
+
+

poppler_fonts_iter_is_embedded ()

+
gboolean            poppler_fonts_iter_is_embedded      (PopplerFontsIter *iter);
+

+Returns whether the font associated with iter is embedded in the document +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

+TRUE if font is emebdded, FALSE otherwise
+
+
+
+

poppler_fonts_iter_is_subset ()

+
gboolean            poppler_fonts_iter_is_subset        (PopplerFontsIter *iter);
+

+Returns whether the font associated with iter is a subset of another font +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

+TRUE if font is a subset, FALSE otherwise
+
+
+
+

poppler_fonts_iter_next ()

+
gboolean            poppler_fonts_iter_next             (PopplerFontsIter *iter);
+

+Sets iter to point to the next font +

+
++ + + + + + + + + + +

iter :

a PopplerFontsIter +

Returns :

+TRUE, if iter was set to the next font
+
+
+
+

poppler_layers_iter_new ()

+
PopplerLayersIter * poppler_layers_iter_new             (PopplerDocument *document);
+
++ + + + +

document :

a PopplerDocument +
+

Since 0.12

+
+
+
+

poppler_layers_iter_copy ()

+
PopplerLayersIter * poppler_layers_iter_copy            (PopplerLayersIter *iter);
+

+Creates a new PopplerLayersIter as a copy of iter. This must be freed with +poppler_layers_iter_free(). +

+
++ + + + + + + + + + +

iter :

a PopplerLayersIter +

Returns :

a new PopplerLayersIter +Since 0.12
+
+
+
+

poppler_layers_iter_free ()

+
void                poppler_layers_iter_free            (PopplerLayersIter *iter);
+

+Frees iter. +

+
++ + + + +

iter :

a PopplerLayersIter +
+

Since 0.12

+
+
+
+

poppler_layers_iter_get_child ()

+
PopplerLayersIter * poppler_layers_iter_get_child       (PopplerLayersIter *parent);
+

+Returns a newly created child of parent, or NULL if the iter has no child. +See poppler_layers_iter_new() for more information on this function. +

+
++ + + + + + + + + + +

parent :

a PopplerLayersIter +

Returns :

a new PopplerLayersIter, or NULL +
+

Since 0.12

+
+
+
+

poppler_layers_iter_get_layer ()

+
PopplerLayer *      poppler_layers_iter_get_layer       (PopplerLayersIter *iter);
+

+Returns the PopplerLayer associated with iter. +

+
++ + + + + + + + + + +

iter :

a PopplerLayersIter +

Returns :

a new PopplerLayer, or NULL if +there isn't any layer associated with iter. [transfer full] +
+

Since 0.12

+
+
+
+

poppler_layers_iter_get_title ()

+
gchar *             poppler_layers_iter_get_title       (PopplerLayersIter *iter);
+

+Returns the title associated with iter. It must be freed with +g_free(). +

+
++ + + + + + + + + + +

iter :

a PopplerLayersIter +

Returns :

a new string containing the iter's title or NULL if iter doesn't have a title. +The returned string should be freed with g_free() when no longer needed.
+

Since 0.12

+
+
+
+

poppler_layers_iter_next ()

+
gboolean            poppler_layers_iter_next            (PopplerLayersIter *iter);
+

+Sets iter to point to the next action at the current level, if valid. See +poppler_layers_iter_new() for more information. +

+
++ + + + + + + + + + +

iter :

a PopplerLayersIter +

Returns :

+TRUE, if iter was set to the next action
+

Since 0.12

+
+
+
+

poppler_ps_file_new ()

+
PopplerPSFile *     poppler_ps_file_new                 (PopplerDocument *document,
+                                                         const char *filename,
+                                                         int first_page,
+                                                         int n_pages);
+

+Create a new postscript file to render to +

+
++ + + + + + + + + + + + + + + + + + + + + + +

document :

a PopplerDocument +

filename :

the path of the output filename

first_page :

the first page to print

n_pages :

the number of pages to print

Returns :

a PopplerPSFile
+
+
+
+

poppler_ps_file_free ()

+
void                poppler_ps_file_free                (PopplerPSFile *ps_file);
+

+Frees ps_file +

+
++ + + + +

ps_file :

a PopplerPSFile
+
+
+
+

poppler_ps_file_set_paper_size ()

+
void                poppler_ps_file_set_paper_size      (PopplerPSFile *ps_file,
+                                                         double width,
+                                                         double height);
+

+Set the output paper size. These values will end up in the +DocumentMedia, the BoundingBox DSC comments and other places in the +generated PostScript. +

+
++ + + + + + + + + + + + + + +

ps_file :

a PopplerPSFile which was not yet printed to.

width :

the paper width in 1/72 inch

height :

the paper height in 1/72 inch
+
+
+
+

poppler_ps_file_set_duplex ()

+
void                poppler_ps_file_set_duplex          (PopplerPSFile *ps_file,
+                                                         gboolean duplex);
+

+Enable or disable Duplex printing. +

+
++ + + + + + + + + + +

ps_file :

a PopplerPSFile which was not yet printed to

duplex :

whether to force duplex printing (on printers which support this)
+
+
+
+

Property Details

+
+

The "author" property

+
  "author"                   gchar*                : Read
+

+The author of the document +

+

Default value: NULL

+
+
+
+

The "creation-date" property

+
  "creation-date"            gint                  : Read
+

+The date the document was created as seconds since the Epoch, or -1 +

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "creator" property

+
  "creator"                  gchar*                : Read
+

+The creator of the document. See also poppler_document_get_creator() +

+

Default value: NULL

+
+
+
+

The "format" property

+
  "format"                   gchar*                : Read
+

+The PDF version as string. See also poppler_document_get_pdf_version_string() +

+

Default value: NULL

+
+
+
+

The "format-major" property

+
  "format-major"             guint                 : Read
+

+The PDF major version number. See also poppler_document_get_pdf_version() +

+

Default value: 1

+
+
+
+

The "format-minor" property

+
  "format-minor"             guint                 : Read
+

+The PDF minor version number. See also poppler_document_get_pdf_version() +

+

Default value: 0

+
+
+
+

The "keywords" property

+
  "keywords"                 gchar*                : Read
+

+The keywords associated to the document +

+

Default value: NULL

+
+
+
+

The "linearized" property

+
  "linearized"               gboolean              : Read
+

+Whether document is linearized. See also poppler_document_is_linearized() +

+

Default value: FALSE

+
+
+
+

The "metadata" property

+
  "metadata"                 gchar*                : Read
+

+Document metadata in XML format, or NULL +

+

Default value: NULL

+
+
+
+

The "mod-date" property

+
  "mod-date"                 gint                  : Read
+

+The date the document was most recently modified as seconds since the Epoch, or -1 +

+

Allowed values: >= G_MAXULONG

+

Default value: -1

+
+
+
+

The "page-layout" property

+
  "page-layout"              PopplerPageLayout     : Read
+

+The page layout that should be used when the document is opened +

+

Default value: POPPLER_PAGE_LAYOUT_UNSET

+
+
+
+

The "page-mode" property

+
  "page-mode"                PopplerPageMode       : Read
+

+The mode that should be used when the document is opened +

+

Default value: POPPLER_PAGE_MODE_UNSET

+
+
+
+

The "permissions" property

+
  "permissions"              PopplerPermissions    : Read
+

+Flags specifying which operations are permitted when the document is opened +

+

Default value: POPPLER_PERMISSIONS_OK_TO_PRINT|POPPLER_PERMISSIONS_OK_TO_MODIFY|POPPLER_PERMISSIONS_OK_TO_COPY|POPPLER_PERMISSIONS_OK_TO_ADD_NOTES|POPPLER_PERMISSIONS_OK_TO_FILL_FORM|POPPLER_PERMISSIONS_OK_TO_EXTRACT_CONTENTS|POPPLER_PERMISSIONS_OK_TO_ASSEMBLE|POPPLER_PERMISSIONS_OK_TO_PRINT_HIGH_RESOLUTION

+
+
+
+

The "producer" property

+
  "producer"                 gchar*                : Read
+

+The producer of the document. See also poppler_document_get_producer() +

+

Default value: NULL

+
+
+
+

The "subject" property

+
  "subject"                  gchar*                : Read
+

+The subject of the document +

+

Default value: NULL

+
+
+
+

The "title" property

+
  "title"                    gchar*                : Read
+

+The document's title or NULL +

+

Default value: NULL

+
+
+
+

The "viewer-preferences" property

+
  "viewer-preferences"       PopplerViewerPreferences  : Read
+

Viewer Preferences.

+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerFormField.html b/glib/reference/html/PopplerFormField.html new file mode 100644 index 0000000..8d0b0c8 --- /dev/null +++ b/glib/reference/html/PopplerFormField.html @@ -0,0 +1,896 @@ + + + + +PoppplerFormField + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PoppplerFormField

+

PoppplerFormField — Form Field

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerFormField;
+enum                PopplerFormFieldType;
+enum                PopplerFormButtonType;
+enum                PopplerFormChoiceType;
+enum                PopplerFormTextType;
+PopplerFormFieldType poppler_form_field_get_field_type  (PopplerFormField *field);
+gint                poppler_form_field_get_id           (PopplerFormField *field);
+gboolean            poppler_form_field_is_read_only     (PopplerFormField *field);
+gdouble             poppler_form_field_get_font_size    (PopplerFormField *field);
+gchar *             poppler_form_field_get_partial_name (PopplerFormField *field);
+gchar *             poppler_form_field_get_mapping_name (PopplerFormField *field);
+gchar *             poppler_form_field_get_name         (PopplerFormField *field);
+PopplerAction *     poppler_form_field_get_action       (PopplerFormField *field);
+PopplerFormButtonType poppler_form_field_button_get_button_type
+                                                        (PopplerFormField *field);
+gboolean            poppler_form_field_button_get_state (PopplerFormField *field);
+void                poppler_form_field_button_set_state (PopplerFormField *field,
+                                                         gboolean state);
+PopplerFormChoiceType poppler_form_field_choice_get_choice_type
+                                                        (PopplerFormField *field);
+gboolean            poppler_form_field_choice_can_select_multiple
+                                                        (PopplerFormField *field);
+gboolean            poppler_form_field_choice_commit_on_change
+                                                        (PopplerFormField *field);
+gboolean            poppler_form_field_choice_do_spell_check
+                                                        (PopplerFormField *field);
+gchar *             poppler_form_field_choice_get_item  (PopplerFormField *field,
+                                                         gint index);
+gint                poppler_form_field_choice_get_n_items
+                                                        (PopplerFormField *field);
+gchar *             poppler_form_field_choice_get_text  (PopplerFormField *field);
+void                poppler_form_field_choice_set_text  (PopplerFormField *field,
+                                                         const gchar *text);
+gboolean            poppler_form_field_choice_is_editable
+                                                        (PopplerFormField *field);
+gboolean            poppler_form_field_choice_is_item_selected
+                                                        (PopplerFormField *field,
+                                                         gint index);
+void                poppler_form_field_choice_select_item
+                                                        (PopplerFormField *field,
+                                                         gint index);
+void                poppler_form_field_choice_toggle_item
+                                                        (PopplerFormField *field,
+                                                         gint index);
+void                poppler_form_field_choice_unselect_all
+                                                        (PopplerFormField *field);
+PopplerFormTextType poppler_form_field_text_get_text_type
+                                                        (PopplerFormField *field);
+gchar *             poppler_form_field_text_get_text    (PopplerFormField *field);
+void                poppler_form_field_text_set_text    (PopplerFormField *field,
+                                                         const gchar *text);
+gint                poppler_form_field_text_get_max_len (PopplerFormField *field);
+gboolean            poppler_form_field_text_do_scroll   (PopplerFormField *field);
+gboolean            poppler_form_field_text_do_spell_check
+                                                        (PopplerFormField *field);
+gboolean            poppler_form_field_text_is_password (PopplerFormField *field);
+gboolean            poppler_form_field_text_is_rich_text
+                                                        (PopplerFormField *field);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerFormField
+
+
+
+

Description

+
+
+

Details

+
+

PopplerFormField

+
typedef struct _PopplerFormField PopplerFormField;
+
+
+
+

enum PopplerFormFieldType

+
typedef enum {
+  POPPLER_FORM_FIELD_UNKNOWN,
+  POPPLER_FORM_FIELD_BUTTON,
+  POPPLER_FORM_FIELD_TEXT,
+  POPPLER_FORM_FIELD_CHOICE,
+  POPPLER_FORM_FIELD_SIGNATURE
+} PopplerFormFieldType;
+
+
+
+
+

enum PopplerFormButtonType

+
typedef enum {
+  POPPLER_FORM_BUTTON_PUSH,
+  POPPLER_FORM_BUTTON_CHECK,
+  POPPLER_FORM_BUTTON_RADIO
+} PopplerFormButtonType;
+
+
+
+
+

enum PopplerFormChoiceType

+
typedef enum {
+  POPPLER_FORM_CHOICE_COMBO,
+  POPPLER_FORM_CHOICE_LIST
+} PopplerFormChoiceType;
+
+
+
+
+

enum PopplerFormTextType

+
typedef enum {
+  POPPLER_FORM_TEXT_NORMAL,
+  POPPLER_FORM_TEXT_MULTILINE,
+  POPPLER_FORM_TEXT_FILE_SELECT
+} PopplerFormTextType;
+
+
+
+
+

poppler_form_field_get_field_type ()

+
PopplerFormFieldType poppler_form_field_get_field_type  (PopplerFormField *field);
+

+Gets the type of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+PopplerFormFieldType of field +
+
+
+
+

poppler_form_field_get_id ()

+
gint                poppler_form_field_get_id           (PopplerFormField *field);
+

+Gets the id of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

the id of field +
+
+
+
+

poppler_form_field_is_read_only ()

+
gboolean            poppler_form_field_is_read_only     (PopplerFormField *field);
+

+Checks whether field is read only +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if field is read only
+
+
+
+

poppler_form_field_get_font_size ()

+
gdouble             poppler_form_field_get_font_size    (PopplerFormField *field);
+

+Gets the font size of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

the font size of field +
+
+
+
+

poppler_form_field_get_partial_name ()

+
gchar *             poppler_form_field_get_partial_name (PopplerFormField *field);
+

+Gets the partial name of field. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

a new allocated string. It must be freed with g_free() when done.
+

Since 0.16

+
+
+
+

poppler_form_field_get_mapping_name ()

+
gchar *             poppler_form_field_get_mapping_name (PopplerFormField *field);
+

+Gets the mapping name of field that is used when +exporting interactive form field data from the document +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

a new allocated string. It must be freed with g_free() when done.
+

Since 0.16

+
+
+
+

poppler_form_field_get_name ()

+
gchar *             poppler_form_field_get_name         (PopplerFormField *field);
+

+Gets the fully qualified name of field. It's constructed by concatenating +the partial field names of the field and all of its ancestors. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

a new allocated string. It must be freed with g_free() when done.
+

Since 0.16

+
+
+
+

poppler_form_field_get_action ()

+
PopplerAction *     poppler_form_field_get_action       (PopplerFormField *field);
+

+Retrieves the action (PopplerAction) that shall be +performed when field is activated, or NULL +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

the action to perform. The returned +object is owned by field and should not be freed. [transfer none] +
+

Since 0.18

+
+
+
+

poppler_form_field_button_get_button_type ()

+
PopplerFormButtonType poppler_form_field_button_get_button_type
+                                                        (PopplerFormField *field);
+

+Gets the button type of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+PopplerFormButtonType of field +
+
+
+
+

poppler_form_field_button_get_state ()

+
gboolean            poppler_form_field_button_get_state (PopplerFormField *field);
+

+Queries a PopplerFormField and returns its current state. Returns TRUE if +field is pressed in and FALSE if it is raised. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

current state of field +
+
+
+
+

poppler_form_field_button_set_state ()

+
void                poppler_form_field_button_set_state (PopplerFormField *field,
+                                                         gboolean state);
+

+Sets the status of field. Set to TRUE if you want the PopplerFormField +to be 'pressed in', and FALSE to raise it. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

state :

+TRUE or FALSE +
+
+
+
+

poppler_form_field_choice_get_choice_type ()

+
PopplerFormChoiceType poppler_form_field_choice_get_choice_type
+                                                        (PopplerFormField *field);
+

+Gets the choice type of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+PopplerFormChoiceType of field +
+
+
+
+

poppler_form_field_choice_can_select_multiple ()

+
gboolean            poppler_form_field_choice_can_select_multiple
+                                                        (PopplerFormField *field);
+

+Checks whether field allows multiple choices to be selected +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if field allows multiple choices to be selected
+
+
+
+

poppler_form_field_choice_commit_on_change ()

+
gboolean            poppler_form_field_choice_commit_on_change
+                                                        (PopplerFormField *field);
+
+
+
+

poppler_form_field_choice_do_spell_check ()

+
gboolean            poppler_form_field_choice_do_spell_check
+                                                        (PopplerFormField *field);
+

+Checks whether spell checking should be done for the contents of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if spell checking should be done for field +
+
+
+
+

poppler_form_field_choice_get_item ()

+
gchar *             poppler_form_field_choice_get_item  (PopplerFormField *field,
+                                                         gint index);
+

+Returns the contents of the item on field at the given index +

+
++ + + + + + + + + + + + + + +

field :

a PopplerFormField +

index :

the index of the item

Returns :

a new allocated string. It must be freed with g_free() when done.
+
+
+
+

poppler_form_field_choice_get_n_items ()

+
gint                poppler_form_field_choice_get_n_items
+                                                        (PopplerFormField *field);
+

+Returns the number of items on field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

the number of items on field +
+
+
+
+

poppler_form_field_choice_get_text ()

+
gchar *             poppler_form_field_choice_get_text  (PopplerFormField *field);
+

+Retrieves the contents of field. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

a new allocated string. It must be freed with g_free() when done.
+
+
+
+

poppler_form_field_choice_set_text ()

+
void                poppler_form_field_choice_set_text  (PopplerFormField *field,
+                                                         const gchar *text);
+

+Sets the text in field to the given value, replacing the current contents +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

text :

the new text
+
+
+
+

poppler_form_field_choice_is_editable ()

+
gboolean            poppler_form_field_choice_is_editable
+                                                        (PopplerFormField *field);
+

+Checks whether field is editable +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if field is editable
+
+
+
+

poppler_form_field_choice_is_item_selected ()

+
gboolean            poppler_form_field_choice_is_item_selected
+                                                        (PopplerFormField *field,
+                                                         gint index);
+

+Checks whether the item at the given index on field is currently selected +

+
++ + + + + + + + + + + + + + +

field :

a PopplerFormField +

index :

the index of the item

Returns :

+TRUE if item at index is currently selected
+
+
+
+

poppler_form_field_choice_select_item ()

+
void                poppler_form_field_choice_select_item
+                                                        (PopplerFormField *field,
+                                                         gint index);
+

+Selects the item at the given index on field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

index :

the index of the item
+
+
+
+

poppler_form_field_choice_toggle_item ()

+
void                poppler_form_field_choice_toggle_item
+                                                        (PopplerFormField *field,
+                                                         gint index);
+

+Changes the state of the item at the given index +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

index :

the index of the item
+
+
+
+

poppler_form_field_choice_unselect_all ()

+
void                poppler_form_field_choice_unselect_all
+                                                        (PopplerFormField *field);
+

+Unselects all the items on field +

+
++ + + + +

field :

a PopplerFormField +
+
+
+
+

poppler_form_field_text_get_text_type ()

+
PopplerFormTextType poppler_form_field_text_get_text_type
+                                                        (PopplerFormField *field);
+

+Gets the text type of field. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+PopplerFormTextType of field +
+
+
+
+

poppler_form_field_text_get_text ()

+
gchar *             poppler_form_field_text_get_text    (PopplerFormField *field);
+

+Retrieves the contents of field. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

a new allocated string. It must be freed with g_free() when done.
+
+
+
+

poppler_form_field_text_set_text ()

+
void                poppler_form_field_text_set_text    (PopplerFormField *field,
+                                                         const gchar *text);
+

+Sets the text in field to the given value, replacing the current contents. +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

text :

the new text
+
+
+
+

poppler_form_field_text_get_max_len ()

+
gint                poppler_form_field_text_get_max_len (PopplerFormField *field);
+

+Retrieves the maximum allowed length of the text in field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

the maximum allowed number of characters in field, or -1 if there is no maximum.
+
+
+
+

poppler_form_field_text_do_scroll ()

+
gboolean            poppler_form_field_text_do_scroll   (PopplerFormField *field);
+
+
+
+

poppler_form_field_text_do_spell_check ()

+
gboolean            poppler_form_field_text_do_spell_check
+                                                        (PopplerFormField *field);
+

+Checks whether spell checking should be done for the contents of field +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if spell checking should be done for field +
+
+
+
+

poppler_form_field_text_is_password ()

+
gboolean            poppler_form_field_text_is_password (PopplerFormField *field);
+

+Checks whether content of field is a password and it must be hidden +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if the content of field is a password
+
+
+
+

poppler_form_field_text_is_rich_text ()

+
gboolean            poppler_form_field_text_is_rich_text
+                                                        (PopplerFormField *field);
+

+Checks whether the contents of field are rich text +

+
++ + + + + + + + + + +

field :

a PopplerFormField +

Returns :

+TRUE if the contents of field are rich text
+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerLayer.html b/glib/reference/html/PopplerLayer.html new file mode 100644 index 0000000..f7b1a8d --- /dev/null +++ b/glib/reference/html/PopplerLayer.html @@ -0,0 +1,210 @@ + + + + +PopplerLayer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerLayer

+

PopplerLayer — Layers

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----PopplerLayer
+
+
+
+

Description

+
+
+

Details

+
+

PopplerLayer

+
typedef struct _PopplerLayer PopplerLayer;
+
+
+
+

poppler_layer_get_title ()

+
const gchar *       poppler_layer_get_title             (PopplerLayer *layer);
+

+Returns the name of the layer suitable for +presentation as a title in a viewer's GUI +

+
++ + + + + + + + + + +

layer :

a PopplerLayer +

Returns :

a string containing the title of the layer
+

Since 0.12

+
+
+
+

poppler_layer_is_visible ()

+
gboolean            poppler_layer_is_visible            (PopplerLayer *layer);
+

+Returns whether layer is visible +

+
++ + + + + + + + + + +

layer :

a PopplerLayer +

Returns :

+TRUE if layer is visible
+

Since 0.12

+
+
+
+

poppler_layer_show ()

+
void                poppler_layer_show                  (PopplerLayer *layer);
+

+Shows layer +

+
++ + + + +

layer :

a PopplerLayer +
+

Since 0.12

+
+
+
+

poppler_layer_hide ()

+
void                poppler_layer_hide                  (PopplerLayer *layer);
+

+Hides layer. If layer is the parent of other nested layers, +such layers will be also hidden and will be blocked until layer +is shown again +

+
++ + + + +

layer :

a PopplerLayer +
+

Since 0.12

+
+
+
+

poppler_layer_is_parent ()

+
gboolean            poppler_layer_is_parent             (PopplerLayer *layer);
+

+Returns whether layer is parent of other nested layers. +

+
++ + + + + + + + + + +

layer :

a PopplerLayer +

Returns :

+TRUE if layer is a parent layer
+

Since 0.12

+
+
+
+

poppler_layer_get_radio_button_group_id ()

+
gint                poppler_layer_get_radio_button_group_id
+                                                        (PopplerLayer *layer);
+

+Returns the numeric ID the radio button group associated with layer. +

+
++ + + + + + + + + + +

layer :

a PopplerLayer +

Returns :

the ID of the radio button group associated with layer, +or 0 if the layer is not associated to any radio button group
+

Since 0.12

+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerMedia.html b/glib/reference/html/PopplerMedia.html new file mode 100644 index 0000000..5d39d26 --- /dev/null +++ b/glib/reference/html/PopplerMedia.html @@ -0,0 +1,288 @@ + + + + +PopplerMedia + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerMedia

+

PopplerMedia — Media

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerMedia;
+gboolean            (*PopplerMediaSaveFunc)             (const gchar *buf,
+                                                         gsize count,
+                                                         gpointer data,
+                                                         GError **error);
+const gchar *       poppler_media_get_filename          (PopplerMedia *poppler_media);
+const gchar *       poppler_media_get_mime_type         (PopplerMedia *poppler_media);
+gboolean            poppler_media_is_embedded           (PopplerMedia *poppler_media);
+gboolean            poppler_media_save                  (PopplerMedia *poppler_media,
+                                                         const char *filename,
+                                                         GError **error);
+gboolean            poppler_media_save_to_callback      (PopplerMedia *poppler_media,
+                                                         PopplerMediaSaveFunc save_func,
+                                                         gpointer user_data,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerMedia
+
+
+
+

Description

+
+
+

Details

+
+

PopplerMedia

+
typedef struct _PopplerMedia PopplerMedia;
+
+
+
+

PopplerMediaSaveFunc ()

+
gboolean            (*PopplerMediaSaveFunc)             (const gchar *buf,
+                                                         gsize count,
+                                                         gpointer data,
+                                                         GError **error);
+

+Specifies the type of the function passed to +poppler_media_save_to_callback(). It is called once for each block of +bytes that is "written" by poppler_media_save_to_callback(). If +successful it should return TRUE. If an error occurs it should set +error and return FALSE, in which case poppler_media_save_to_callback() +will fail with the same error. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

buf :

buffer containing +bytes to be written. [array length=count][element-type guint8] +

count :

number of bytes in buf.

data :

user data passed to poppler_media_save_to_callback(). [closure] +

error :

GError to set on error, or NULL +

Returns :

+TRUE if successful, FALSE (with error set) if failed.
+

Since 0.14

+
+
+
+

poppler_media_get_filename ()

+
const gchar *       poppler_media_get_filename          (PopplerMedia *poppler_media);
+

+Returns the media clip filename, in case of non-embedded media. filename might be +a local relative or absolute path or a URI +

+
++ + + + + + + + + + +

poppler_media :

a PopplerMedia +

Returns :

a filename, return value is owned by PopplerMedia and should not be freed
+

Since 0.14

+
+
+
+

poppler_media_get_mime_type ()

+
const gchar *       poppler_media_get_mime_type         (PopplerMedia *poppler_media);
+

+Returns the media clip mime-type +

+
++ + + + + + + + + + +

poppler_media :

a PopplerMedia +

Returns :

the mime-type, return value is owned by PopplerMedia and should not be freed
+

Since 0.14

+
+
+
+

poppler_media_is_embedded ()

+
gboolean            poppler_media_is_embedded           (PopplerMedia *poppler_media);
+

+Whether the media clip is embedded in the PDF. If the result is TRUE, the embedded stream +can be saved with poppler_media_save() or poppler_media_save_to_callback() function. +If the result is FALSE, the media clip filename can be retrieved with +poppler_media_get_filename() function. +

+
++ + + + + + + + + + +

poppler_media :

a PopplerMedia +

Returns :

+TRUE if media clip is embedded, FALSE otherwise
+

Since 0.14

+
+
+
+

poppler_media_save ()

+
gboolean            poppler_media_save                  (PopplerMedia *poppler_media,
+                                                         const char *filename,
+                                                         GError **error);
+

+Saves embedded stream of poppler_media to a file indicated by filename. +If error is set, FALSE will be returned. +Possible errors include those in the G_FILE_ERROR domain +and whatever the save function generates. +

+
++ + + + + + + + + + + + + + + + + + +

poppler_media :

a PopplerMedia +

filename :

name of file to save

error :

return location for error, or NULL. [allow-none] +

Returns :

+TRUE, if the file successfully saved
+

Since 0.14

+
+
+
+

poppler_media_save_to_callback ()

+
gboolean            poppler_media_save_to_callback      (PopplerMedia *poppler_media,
+                                                         PopplerMediaSaveFunc save_func,
+                                                         gpointer user_data,
+                                                         GError **error);
+

+Saves embedded stream of poppler_media by feeding the produced data to save_func. Can be used +when you want to store the media clip stream to something other than a file, such as +an in-memory buffer or a socket. If error is set, FALSE will be +returned. Possible errors include those in the G_FILE_ERROR domain and +whatever the save function generates. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

poppler_media :

a PopplerMedia +

save_func :

a function that is called to save each block of data that the save routine generates. [scope call] +

user_data :

user data to pass to the save function.

error :

return location for error, or NULL. [allow-none] +

Returns :

+TRUE, if the save successfully completed
+

Since 0.14

+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerMovie.html b/glib/reference/html/PopplerMovie.html new file mode 100644 index 0000000..77d90ac --- /dev/null +++ b/glib/reference/html/PopplerMovie.html @@ -0,0 +1,147 @@ + + + + +PopplerMovie + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerMovie

+

PopplerMovie — Movies

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerMovie;
+const gchar *       poppler_movie_get_filename          (PopplerMovie *poppler_movie);
+gboolean            poppler_movie_need_poster           (PopplerMovie *poppler_movie);
+gboolean            poppler_movie_show_controls         (PopplerMovie *poppler_movie);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerMovie
+
+
+
+

Description

+
+
+

Details

+
+

PopplerMovie

+
typedef struct _PopplerMovie PopplerMovie;
+
+
+
+

poppler_movie_get_filename ()

+
const gchar *       poppler_movie_get_filename          (PopplerMovie *poppler_movie);
+

+Returns the local filename identifying a self-describing movie file +

+
++ + + + + + + + + + +

poppler_movie :

a PopplerMovie +

Returns :

a local filename, return value is owned by PopplerMovie and +should not be freed
+

Since 0.14

+
+
+
+

poppler_movie_need_poster ()

+
gboolean            poppler_movie_need_poster           (PopplerMovie *poppler_movie);
+

+Returns whether a poster image representing the Movie +shall be displayed. The poster image must be retrieved +from the movie file. +

+
++ + + + + + + + + + +

poppler_movie :

a PopplerMovie +

Returns :

+TRUE if move needs a poster image, FALSE otherwise
+

Since 0.14

+
+
+
+

poppler_movie_show_controls ()

+
gboolean            poppler_movie_show_controls         (PopplerMovie *poppler_movie);
+

+Returns whether to display a movie controller bar while playing the movie +

+
++ + + + + + + + + + +

poppler_movie :

a PopplerMovie +

Returns :

+TRUE if controller bar should be displayed, FALSE otherwise
+

Since 0.14

+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/PopplerPage.html b/glib/reference/html/PopplerPage.html new file mode 100644 index 0000000..72e101d --- /dev/null +++ b/glib/reference/html/PopplerPage.html @@ -0,0 +1,1868 @@ + + + + +PopplerPage + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerPage

+

PopplerPage — Information about a page in a document

+
+
+

Synopsis

+
+#include <poppler.h>
+
+                    PopplerPage;
+                    PopplerRectangle;
+                    PopplerPageTransition;
+                    PopplerLinkMapping;
+                    PopplerImageMapping;
+                    PopplerFormFieldMapping;
+                    PopplerAnnotMapping;
+enum                PopplerPageTransitionType;
+enum                PopplerPageTransitionAlignment;
+enum                PopplerPageTransitionDirection;
+enum                PopplerSelectionStyle;
+                    PopplerTextAttributes;
+int                 poppler_page_get_index              (PopplerPage *page);
+gchar *             poppler_page_get_label              (PopplerPage *page);
+void                poppler_page_get_size               (PopplerPage *page,
+                                                         double *width,
+                                                         double *height);
+void                poppler_page_get_crop_box           (PopplerPage *page,
+                                                         PopplerRectangle *rect);
+double              poppler_page_get_duration           (PopplerPage *page);
+PopplerPageTransition * poppler_page_get_transition     (PopplerPage *page);
+gboolean            poppler_page_get_thumbnail_size     (PopplerPage *page,
+                                                         int *width,
+                                                         int *height);
+cairo_surface_t *   poppler_page_get_thumbnail          (PopplerPage *page);
+void                poppler_page_render                 (PopplerPage *page,
+                                                         cairo_t *cairo);
+void                poppler_page_render_for_printing    (PopplerPage *page,
+                                                         cairo_t *cairo);
+void                poppler_page_render_for_printing_with_options
+                                                        (PopplerPage *page,
+                                                         cairo_t *cairo,
+                                                         PopplerPrintFlags options);
+void                poppler_page_render_to_ps           (PopplerPage *page,
+                                                         PopplerPSFile *ps_file);
+void                poppler_page_render_selection       (PopplerPage *page,
+                                                         cairo_t *cairo,
+                                                         PopplerRectangle *selection,
+                                                         PopplerRectangle *old_selection,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerColor *glyph_color,
+                                                         PopplerColor *background_color);
+cairo_region_t *    poppler_page_get_selected_region    (PopplerPage *page,
+                                                         gdouble scale,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle *selection);
+GList *             poppler_page_get_selection_region   (PopplerPage *page,
+                                                         gdouble scale,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle *selection);
+void                poppler_page_selection_region_free  (GList *region);
+char *              poppler_page_get_selected_text      (PopplerPage *page,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle *selection);
+GList *             poppler_page_find_text              (PopplerPage *page,
+                                                         const char *text);
+char *              poppler_page_get_text               (PopplerPage *page);
+gboolean            poppler_page_get_text_layout        (PopplerPage *page,
+                                                         PopplerRectangle **rectangles,
+                                                         guint *n_rectangles);
+GList *             poppler_page_get_text_attributes    (PopplerPage *page);
+void                poppler_page_free_text_attributes   (GList *list);
+GList *             poppler_page_get_link_mapping       (PopplerPage *page);
+void                poppler_page_free_link_mapping      (GList *list);
+GList *             poppler_page_get_image_mapping      (PopplerPage *page);
+cairo_surface_t *   poppler_page_get_image              (PopplerPage *page,
+                                                         gint image_id);
+void                poppler_page_free_image_mapping     (GList *list);
+GList *             poppler_page_get_form_field_mapping (PopplerPage *page);
+void                poppler_page_free_form_field_mapping
+                                                        (GList *list);
+GList *             poppler_page_get_annot_mapping      (PopplerPage *page);
+void                poppler_page_free_annot_mapping     (GList *list);
+void                poppler_page_add_annot              (PopplerPage *page,
+                                                         PopplerAnnot *annot);
+PopplerRectangle *  poppler_rectangle_new               (void);
+PopplerRectangle *  poppler_rectangle_copy              (PopplerRectangle *rectangle);
+void                poppler_rectangle_free              (PopplerRectangle *rectangle);
+PopplerPageTransition * poppler_page_transition_new     (void);
+PopplerPageTransition * poppler_page_transition_copy    (PopplerPageTransition *transition);
+void                poppler_page_transition_free        (PopplerPageTransition *transition);
+PopplerLinkMapping * poppler_link_mapping_new           (void);
+PopplerLinkMapping * poppler_link_mapping_copy          (PopplerLinkMapping *mapping);
+void                poppler_link_mapping_free           (PopplerLinkMapping *mapping);
+PopplerImageMapping * poppler_image_mapping_new         (void);
+PopplerImageMapping * poppler_image_mapping_copy        (PopplerImageMapping *mapping);
+void                poppler_image_mapping_free          (PopplerImageMapping *mapping);
+PopplerFormFieldMapping * poppler_form_field_mapping_new
+                                                        (void);
+PopplerFormFieldMapping * poppler_form_field_mapping_copy
+                                                        (PopplerFormFieldMapping *mapping);
+void                poppler_form_field_mapping_free     (PopplerFormFieldMapping *mapping);
+PopplerAnnotMapping * poppler_annot_mapping_new         (void);
+PopplerAnnotMapping * poppler_annot_mapping_copy        (PopplerAnnotMapping *mapping);
+void                poppler_annot_mapping_free          (PopplerAnnotMapping *mapping);
+PopplerTextAttributes * poppler_text_attributes_new     (void);
+PopplerTextAttributes * poppler_text_attributes_copy    (PopplerTextAttributes *text_attrs);
+void                poppler_text_attributes_free        (PopplerTextAttributes *text_attrs);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----PopplerPage
+
+
+
+

Properties

+
+  "label"                    gchar*                : Read
+
+
+
+

Description

+
+
+

Details

+
+

PopplerPage

+
typedef struct _PopplerPage PopplerPage;
+
+
+
+

PopplerRectangle

+
typedef struct {
+  gdouble x1;
+  gdouble y1;
+  gdouble x2;
+  gdouble y2;
+} PopplerRectangle;
+
+

+A PopplerRectangle is used to describe +locations on a page and bounding boxes +

+
++ + + + + + + + + + + + + + + + + + +

gdouble x1;

x coordinate of lower left corner

gdouble y1;

y coordinate of lower left corner

gdouble x2;

x coordinate of upper right corner

gdouble y2;

y coordinate of upper right corner
+
+
+
+

PopplerPageTransition

+
typedef struct {
+  PopplerPageTransitionType type;
+  PopplerPageTransitionAlignment alignment;
+  PopplerPageTransitionDirection direction;
+  gint duration;
+  gint angle;
+  gdouble scale;
+  gboolean rectangular;
+} PopplerPageTransition;
+
+

+A PopplerPageTransition structures describes a visual transition +to use when moving between pages during a presentation +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PopplerPageTransitionType type;

the type of transtition

PopplerPageTransitionAlignment alignment;

the dimension in which the transition effect shall occur. +Only for POPPLER_PAGE_TRANSITION_SPLIT and POPPLER_PAGE_TRANSITION_BLINDS transition types

PopplerPageTransitionDirection direction;

the direccion of motion for the transition effect. +Only for POPPLER_PAGE_TRANSITION_SPLIT, POPPLER_PAGE_TRANSITION_BOX and POPPLER_PAGE_TRANSITION_FLY +transition types

gint duration;

the duration of the transition effect

gint angle;

the direction in which the specified transition effect shall moves, +expressed in degrees counterclockwise starting from a left-to-right direction. +Only for POPPLER_PAGE_TRANSITION_WIPE, POPPLER_PAGE_TRANSITION_GLITTER, POPPLER_PAGE_TRANSITION_FLY, +POPPLER_PAGE_TRANSITION_COVER, POPPLER_PAGE_TRANSITION_UNCOVER and POPPLER_PAGE_TRANSITION_PUSH +transition types

gdouble scale;

the starting or ending scale at which the changes shall be drawn. +Only for POPPLER_PAGE_TRANSITION_FLY transition type

gboolean rectangular;

whether the area that will be flown is rectangular and opaque. +Only for POPPLER_PAGE_TRANSITION_FLY transition type
+
+
+
+

PopplerLinkMapping

+
typedef struct {
+  PopplerRectangle area;
+  PopplerAction *action;
+} PopplerLinkMapping;
+
+

+A PopplerLinkMapping structure represents the location +of action on the page +

+
++ + + + + + + + + + +

PopplerRectangle area;

a PopplerRectangle representing an area of the page

PopplerAction *action;

a PopplerAction +
+
+
+
+

PopplerImageMapping

+
typedef struct {
+  PopplerRectangle area;
+  gint image_id;	
+} PopplerImageMapping;
+
+

+A PopplerImageMapping structure represents the location +of an image on the page +

+
++ + + + + + + + + + +

PopplerRectangle area;

a PopplerRectangle representing an area of the page

gint image_id;

an image identifier
+
+
+
+

PopplerFormFieldMapping

+
typedef struct {
+  PopplerRectangle area;
+  PopplerFormField *field;
+} PopplerFormFieldMapping;
+
+

+A PopplerFormFieldMapping structure represents the location +of field on the page +

+
++ + + + + + + + + + +

PopplerRectangle area;

a PopplerRectangle representing an area of the page

PopplerFormField *field;

a PopplerFormField +
+
+
+
+

PopplerAnnotMapping

+
typedef struct {
+  PopplerRectangle area;
+  PopplerAnnot *annot;
+} PopplerAnnotMapping;
+
+

+A PopplerAnnotMapping structure represents the location +of annot on the page +

+
++ + + + + + + + + + +

PopplerRectangle area;

a PopplerRectangle representing an area of the page

PopplerAnnot *annot;

a PopplerAnnot +
+
+
+
+

enum PopplerPageTransitionType

+
typedef enum {
+  POPPLER_PAGE_TRANSITION_REPLACE,
+  POPPLER_PAGE_TRANSITION_SPLIT,
+  POPPLER_PAGE_TRANSITION_BLINDS,
+  POPPLER_PAGE_TRANSITION_BOX,
+  POPPLER_PAGE_TRANSITION_WIPE,
+  POPPLER_PAGE_TRANSITION_DISSOLVE,
+  POPPLER_PAGE_TRANSITION_GLITTER,
+  POPPLER_PAGE_TRANSITION_FLY,
+  POPPLER_PAGE_TRANSITION_PUSH,
+  POPPLER_PAGE_TRANSITION_COVER,
+  POPPLER_PAGE_TRANSITION_UNCOVER,
+  POPPLER_PAGE_TRANSITION_FADE
+} PopplerPageTransitionType;
+
+

+Page transition types +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_PAGE_TRANSITION_REPLACE

the new page replace the old one +

POPPLER_PAGE_TRANSITION_SPLIT

two lines sweep across the screen, revealing the new page +

POPPLER_PAGE_TRANSITION_BLINDS

multiple lines, evenly spaced across the screen, synchronously +sweep in the same direction to reveal the new page +

POPPLER_PAGE_TRANSITION_BOX

a rectangular box sweeps inward from the edges of the page or +outward from the center revealing the new page +

POPPLER_PAGE_TRANSITION_WIPE

a single line sweeps across the screen from one edge to the other +revealing the new page +

POPPLER_PAGE_TRANSITION_DISSOLVE

the old page dissolves gradually to reveal the new one +

POPPLER_PAGE_TRANSITION_GLITTER

similar to POPPLER_PAGE_TRANSITION_DISSOLVE, except that the effect +sweeps across the page in a wide band moving from one side of the screen to the other +

POPPLER_PAGE_TRANSITION_FLY

changes are flown out or in to or from a location that is offscreen +

POPPLER_PAGE_TRANSITION_PUSH

the old page slides off the screen while the new page slides in +

POPPLER_PAGE_TRANSITION_COVER

the new page slides on to the screen covering the old page +

POPPLER_PAGE_TRANSITION_UNCOVER

the old page slides off the screen uncovering the new page +

POPPLER_PAGE_TRANSITION_FADE

the new page gradually becomes visible through the old one +
+
+
+
+

enum PopplerPageTransitionAlignment

+
typedef enum {
+  POPPLER_PAGE_TRANSITION_HORIZONTAL,
+  POPPLER_PAGE_TRANSITION_VERTICAL
+} PopplerPageTransitionAlignment;
+
+

+Page transition alignment types for POPPLER_PAGE_TRANSITION_SPLIT +and POPPLER_PAGE_TRANSITION_BLINDS transition types +

+
++ + + + + + + + + + +

POPPLER_PAGE_TRANSITION_HORIZONTAL

horizontal dimension +

POPPLER_PAGE_TRANSITION_VERTICAL

vertical dimension +
+
+
+
+

enum PopplerPageTransitionDirection

+
typedef enum {
+  POPPLER_PAGE_TRANSITION_INWARD,
+  POPPLER_PAGE_TRANSITION_OUTWARD
+} PopplerPageTransitionDirection;
+
+

+Page transition direction types for POPPLER_PAGE_TRANSITION_SPLIT, +POPPLER_PAGE_TRANSITION_BOX and POPPLER_PAGE_TRANSITION_FLY transition types +

+
++ + + + + + + + + + +

POPPLER_PAGE_TRANSITION_INWARD

inward from the edges of the page +

POPPLER_PAGE_TRANSITION_OUTWARD

outward from the center of the page +
+
+
+
+

enum PopplerSelectionStyle

+
typedef enum {
+  POPPLER_SELECTION_GLYPH,
+  POPPLER_SELECTION_WORD,
+  POPPLER_SELECTION_LINE
+} PopplerSelectionStyle;
+
+

+Selection styles +

+
++ + + + + + + + + + + + + + +

POPPLER_SELECTION_GLYPH

glyph is the minimum unit for selection +

POPPLER_SELECTION_WORD

word is the minimum unit for selection +

POPPLER_SELECTION_LINE

line is the minimum unit for selection +
+
+
+
+

PopplerTextAttributes

+
typedef struct {
+  gchar *font_name;
+  gdouble font_size;
+  gboolean is_underlined;
+  PopplerColor color;
+
+  gint start_index;
+  gint end_index;
+} PopplerTextAttributes;
+
+

+A PopplerTextAttributes is used to describe text attributes of a range of text +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

gchar *font_name;

font name

gdouble font_size;

font size

gboolean is_underlined;

if text is underlined

PopplerColor color;

a PopplerColor, the foreground color

gint start_index;

start position this text attributes apply

gint end_index;

end position this text text attributes apply
+

Since 0.18

+
+
+
+

poppler_page_get_index ()

+
int                 poppler_page_get_index              (PopplerPage *page);
+

+Returns the index of page +

+
++ + + + + + + + + + +

page :

a PopplerPage +

Returns :

index value of page +
+
+
+
+

poppler_page_get_label ()

+
gchar *             poppler_page_get_label              (PopplerPage *page);
+

+Returns the label of page. Note that page labels +and page indices might not coincide. +

+
++ + + + + + + + + + +

page :

a PopplerPage +

Returns :

a new allocated string containing the label of page, +or NULL if page doesn't have a label
+

Since 0.16

+
+
+
+

poppler_page_get_size ()

+
void                poppler_page_get_size               (PopplerPage *page,
+                                                         double *width,
+                                                         double *height);
+

+Gets the size of page at the current scale and rotation. +

+
++ + + + + + + + + + + + + + +

page :

A PopplerPage +

width :

return location for the width of page. [out][allow-none] +

height :

return location for the height of page. [out][allow-none] +
+
+
+
+

poppler_page_get_crop_box ()

+
void                poppler_page_get_crop_box           (PopplerPage *page,
+                                                         PopplerRectangle *rect);
+

+Retrurns the crop box of page +

+
++ + + + + + + + + + +

page :

a PopplerPage +

rect :

a PopplerRectangle to fill. [out] +
+
+
+
+

poppler_page_get_duration ()

+
double              poppler_page_get_duration           (PopplerPage *page);
+

+Returns the duration of page +

+
++ + + + + + + + + + +

page :

a PopplerPage +

Returns :

duration in seconds of page or -1.
+
+
+
+

poppler_page_get_transition ()

+
PopplerPageTransition * poppler_page_get_transition     (PopplerPage *page);
+

+Returns the transition effect of page +

+
++ + + + + + + + + + +

page :

a PopplerPage +

Returns :

a PopplerPageTransition or NULL.
+
+
+
+

poppler_page_get_thumbnail_size ()

+
gboolean            poppler_page_get_thumbnail_size     (PopplerPage *page,
+                                                         int *width,
+                                                         int *height);
+

+Returns TRUE if page has a thumbnail associated with it. It also +fills in width and height with the width and height of the +thumbnail. The values of width and height are not changed if no +appropriate thumbnail exists. +

+
++ + + + + + + + + + + + + + + + + + +

page :

A PopplerPage +

width :

(out) return location for width

height :

(out) return location for height

Returns :

+TRUE, if page has a thumbnail associated with it.
+
+
+
+

poppler_page_get_thumbnail ()

+
cairo_surface_t *   poppler_page_get_thumbnail          (PopplerPage *page);
+

+Get the embedded thumbnail for the specified page. If the document +doesn't have an embedded thumbnail for the page, this function +returns NULL. +

+
++ + + + + + + + + + +

page :

the PopplerPage to get the thumbnail for

Returns :

the tumbnail as a cairo_surface_t or NULL if the document +doesn't have a thumbnail for this page.
+
+
+
+

poppler_page_render ()

+
void                poppler_page_render                 (PopplerPage *page,
+                                                         cairo_t *cairo);
+

+Render the page to the given cairo context. This function +is for rendering a page that will be displayed. If you want +to render a page that will be printed use +poppler_page_render_for_printing() instead +

+
++ + + + + + + + + + +

page :

the page to render from

cairo :

cairo context to render to
+
+
+
+

poppler_page_render_for_printing ()

+
void                poppler_page_render_for_printing    (PopplerPage *page,
+                                                         cairo_t *cairo);
+

+Render the page to the given cairo context for printing. +

+
++ + + + + + + + + + +

page :

the page to render from

cairo :

cairo context to render to
+
+
+
+

poppler_page_render_for_printing_with_options ()

+
void                poppler_page_render_for_printing_with_options
+                                                        (PopplerPage *page,
+                                                         cairo_t *cairo,
+                                                         PopplerPrintFlags options);
+

+Render the page to the given cairo context for printing +with the specified options +

+
++ + + + + + + + + + + + + + +

page :

the page to render from

cairo :

cairo context to render to

options :

print options
+

Since 0.16

+
+
+
+

poppler_page_render_to_ps ()

+
void                poppler_page_render_to_ps           (PopplerPage *page,
+                                                         PopplerPSFile *ps_file);
+

+Render the page on a postscript file +

+
++ + + + + + + + + + +

page :

a PopplerPage +

ps_file :

the PopplerPSFile to render to
+
+
+
+

poppler_page_render_selection ()

+
void                poppler_page_render_selection       (PopplerPage *page,
+                                                         cairo_t *cairo,
+                                                         PopplerRectangle *selection,
+                                                         PopplerRectangle *old_selection,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerColor *glyph_color,
+                                                         PopplerColor *background_color);
+

+Render the selection specified by selection for page to +the given cairo context. The selection will be rendered, using +glyph_color for the glyphs and background_color for the selection +background. +

+

+If non-NULL, old_selection specifies the selection that is already +rendered to cairo, in which case this function will (some day) +only render the changed part of the selection. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

page :

the PopplerPage for which to render selection

cairo :

cairo context to render to

selection :

start and end point of selection as a rectangle

old_selection :

previous selection

style :

a PopplerSelectionStyle +

glyph_color :

color to use for drawing glyphs

background_color :

color to use for the selection background
+
+
+
+

poppler_page_get_selected_region ()

+
cairo_region_t *    poppler_page_get_selected_region    (PopplerPage *page,
+                                                         gdouble scale,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle *selection);
+

+Returns a region containing the area that would be rendered by +poppler_page_render_selection(). +The returned region must be freed with cairo_region_destroy() +

+
++ + + + + + + + + + + + + + + + + + + + + + +

page :

a PopplerPage +

scale :

scale specified as pixels per point

style :

a PopplerSelectionStyle +

selection :

start and end point of selection as a rectangle

Returns :

a cairo_region_t. [transfer full] +
+

Since 0.16

+
+
+
+

poppler_page_get_selection_region ()

+
GList *             poppler_page_get_selection_region   (PopplerPage *page,
+                                                         gdouble scale,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle *selection);
+
+

Warning

+

poppler_page_get_selection_region has been deprecated since version 0.16 and should not be used in newly-written code. Use poppler_page_get_selected_region() instead.

+
+

+Returns a region containing the area that would be rendered by +poppler_page_render_selection() as a GList of +PopplerRectangle. The returned list must be freed with +poppler_page_selection_region_free(). +

+
++ + + + + + + + + + + + + + + + + + + + + + +

page :

a PopplerPage +

scale :

scale specified as pixels per point

style :

a PopplerSelectionStyle +

selection :

start and end point of selection as a rectangle

Returns :

a GList of PopplerRectangle. [element-type PopplerRectangle][transfer full] +
+
+
+
+

poppler_page_selection_region_free ()

+
void                poppler_page_selection_region_free  (GList *region);
+
+

Warning

+

poppler_page_selection_region_free is deprecated and should not be used in newly-written code. 0.16

+
+

+Frees region +

+
++ + + + +

region :

a GList of +PopplerRectangle. [element-type PopplerRectangle] +
+
+
+
+

poppler_page_get_selected_text ()

+
char *              poppler_page_get_selected_text      (PopplerPage *page,
+                                                         PopplerSelectionStyle style,
+                                                         PopplerRectangle *selection);
+

+Retrieves the contents of the specified selection as text. +

+
++ + + + + + + + + + + + + + + + + + +

page :

a PopplerPage +

style :

a PopplerSelectionStyle +

selection :

the PopplerRectangle including the text

Returns :

a pointer to the contents of the selection +as a string
+

Since 0.16

+
+
+
+

poppler_page_find_text ()

+
GList *             poppler_page_find_text              (PopplerPage *page,
+                                                         const char *text);
+

+A GList of rectangles for each occurance of the text on the page. +The coordinates are in PDF points. +

+
++ + + + + + + + + + + + + + +

page :

a PopplerPage +

text :

the text to search for (UTF-8 encoded)

Returns :

a GList of PopplerRectangle,. [element-type PopplerRectangle][transfer full] +
+
+
+
+

poppler_page_get_text ()

+
char *              poppler_page_get_text               (PopplerPage *page);
+

+Retrieves the text of page. +

+
++ + + + + + + + + + +

page :

a PopplerPage +

Returns :

a pointer to the text of the page +as a string
+

Since 0.16

+
+
+
+

poppler_page_get_text_layout ()

+
gboolean            poppler_page_get_text_layout        (PopplerPage *page,
+                                                         PopplerRectangle **rectangles,
+                                                         guint *n_rectangles);
+

+Obtains the layout of the text as a list of PopplerRectangle +This array must be freed with g_free() when done. +

+

+The position in the array represents an offset in the text returned by +poppler_page_get_text() +

+
++ + + + + + + + + + + + + + + + + + +

page :

A PopplerPage +

rectangles :

return location for an array of PopplerRectangle. [out][array length=n_rectangles][transfer container] +

n_rectangles :

(out) length of returned array

Returns :

+TRUE if the page contains text, FALSE otherwise
+

Since 0.16

+
+
+
+

poppler_page_get_text_attributes ()

+
GList *             poppler_page_get_text_attributes    (PopplerPage *page);
+

+Obtains the attributes of the text as a GList of PopplerTextAttributes. +This list must be freed with poppler_page_free_text_attributes() when done. +

+

+Each list element is a PopplerTextAttributes struct where start_index and +end_index indicates the range of text (as returned by poppler_page_get_text()) +to which text attributes apply. +

+
++ + + + + + + + + + +

page :

A PopplerPage +

Returns :

A GList of PopplerTextAttributes. [element-type PopplerTextAttributes][transfer full] +
+

Since 0.18

+
+
+
+

poppler_page_free_text_attributes ()

+
void                poppler_page_free_text_attributes   (GList *list);
+

+Frees a list of PopplerTextAttributess allocated by +poppler_page_get_text_attributes(). +

+
++ + + + +

list :

A list of +PopplerTextAttributess. [element-type PopplerTextAttributes] +
+

Since 0.18

+
+
+
+

poppler_page_get_link_mapping ()

+
GList *             poppler_page_get_link_mapping       (PopplerPage *page);
+

+Returns a list of PopplerLinkMapping items that map from a +location on page to a PopplerAction. This list must be freed +with poppler_page_free_link_mapping() when done. +

+
++ + + + + + + + + + +

page :

A PopplerPage +

Returns :

A GList of PopplerLinkMapping. [element-type PopplerLinkMapping][transfer full] +
+
+
+
+

poppler_page_free_link_mapping ()

+
void                poppler_page_free_link_mapping      (GList *list);
+

+Frees a list of PopplerLinkMappings allocated by +poppler_page_get_link_mapping(). It also frees the PopplerActions +that each mapping contains, so if you want to keep them around, you need to +copy them with poppler_action_copy(). +

+
++ + + + +

list :

A list of +PopplerLinkMappings. [element-type PopplerLinkMapping] +
+
+
+
+

poppler_page_get_image_mapping ()

+
GList *             poppler_page_get_image_mapping      (PopplerPage *page);
+

+Returns a list of PopplerImageMapping items that map from a +location on page to an image of the page. This list must be freed +with poppler_page_free_image_mapping() when done. +

+
++ + + + + + + + + + +

page :

A PopplerPage +

Returns :

A GList of PopplerImageMapping. [element-type PopplerImageMapping][transfer full] +
+
+
+
+

poppler_page_get_image ()

+
cairo_surface_t *   poppler_page_get_image              (PopplerPage *page,
+                                                         gint image_id);
+

+Returns a cairo surface for the image of the page +

+
++ + + + + + + + + + + + + + +

page :

A PopplerPage +

image_id :

The image identifier

Returns :

A cairo surface for the image
+
+
+
+

poppler_page_free_image_mapping ()

+
void                poppler_page_free_image_mapping     (GList *list);
+

+Frees a list of PopplerImageMappings allocated by +poppler_page_get_image_mapping(). +

+
++ + + + +

list :

A list of +PopplerImageMappings. [element-type PopplerImageMapping] +
+
+
+
+

poppler_page_get_form_field_mapping ()

+
GList *             poppler_page_get_form_field_mapping (PopplerPage *page);
+

+Returns a list of PopplerFormFieldMapping items that map from a +location on page to a form field. This list must be freed +with poppler_page_free_form_field_mapping() when done. +

+
++ + + + + + + + + + +

page :

A PopplerPage +

Returns :

A GList of PopplerFormFieldMapping. [element-type PopplerFormFieldMapping][transfer full] +
+
+
+
+

poppler_page_free_form_field_mapping ()

+
void                poppler_page_free_form_field_mapping
+                                                        (GList *list);
+

+Frees a list of PopplerFormFieldMappings allocated by +poppler_page_get_form_field_mapping(). +

+
++ + + + +

list :

A list of +PopplerFormFieldMappings. [element-type PopplerFormFieldMapping] +
+
+
+
+

poppler_page_get_annot_mapping ()

+
GList *             poppler_page_get_annot_mapping      (PopplerPage *page);
+

+Returns a list of PopplerAnnotMapping items that map from a location on +page to a PopplerAnnot. This list must be freed with +poppler_page_free_annot_mapping() when done. +

+
++ + + + + + + + + + +

page :

A PopplerPage +

Returns :

A GList of PopplerAnnotMapping. [element-type PopplerAnnotMapping][transfer full] +
+
+
+
+

poppler_page_free_annot_mapping ()

+
void                poppler_page_free_annot_mapping     (GList *list);
+

+Frees a list of PopplerAnnotMappings allocated by +poppler_page_get_annot_mapping(). It also unreferences the PopplerAnnots +that each mapping contains, so if you want to keep them around, you need to +reference them with g_object_ref(). +

+
++ + + + +

list :

A list of +PopplerAnnotMappings. [element-type PopplerAnnotMapping] +
+
+
+
+

poppler_page_add_annot ()

+
void                poppler_page_add_annot              (PopplerPage *page,
+                                                         PopplerAnnot *annot);
+

+Adds annotation annot to page. +

+
++ + + + + + + + + + +

page :

a PopplerPage +

annot :

a PopplerAnnot to add
+

Since 0.16

+
+
+
+

poppler_rectangle_new ()

+
PopplerRectangle *  poppler_rectangle_new               (void);
+

+Creates a new PopplerRectangle +

+
++ + + + +

Returns :

a new PopplerRectangle, use poppler_rectangle_free() to free it
+
+
+
+

poppler_rectangle_copy ()

+
PopplerRectangle *  poppler_rectangle_copy              (PopplerRectangle *rectangle);
+

+Creates a copy of rectangle +

+
++ + + + + + + + + + +

rectangle :

a PopplerRectangle to copy

Returns :

a new allocated copy of rectangle +
+
+
+
+

poppler_rectangle_free ()

+
void                poppler_rectangle_free              (PopplerRectangle *rectangle);
+

+Frees the given PopplerRectangle +

+
++ + + + +

rectangle :

a PopplerRectangle +
+
+
+
+

poppler_page_transition_new ()

+
PopplerPageTransition * poppler_page_transition_new     (void);
+

+Creates a new PopplerPageTransition +

+
++ + + + +

Returns :

a new PopplerPageTransition, use poppler_page_transition_free() to free it
+
+
+
+

poppler_page_transition_copy ()

+
PopplerPageTransition * poppler_page_transition_copy    (PopplerPageTransition *transition);
+

+Creates a copy of transition +

+
++ + + + + + + + + + +

transition :

a PopplerPageTransition to copy

Returns :

a new allocated copy of transition +
+
+
+
+

poppler_page_transition_free ()

+
void                poppler_page_transition_free        (PopplerPageTransition *transition);
+

+Frees the given PopplerPageTransition +

+
++ + + + +

transition :

a PopplerPageTransition +
+
+
+
+

poppler_link_mapping_new ()

+
PopplerLinkMapping * poppler_link_mapping_new           (void);
+

+Creates a new PopplerLinkMapping +

+
++ + + + +

Returns :

a new PopplerLinkMapping, use poppler_link_mapping_free() to free it
+
+
+
+

poppler_link_mapping_copy ()

+
PopplerLinkMapping * poppler_link_mapping_copy          (PopplerLinkMapping *mapping);
+

+Creates a copy of mapping +

+
++ + + + + + + + + + +

mapping :

a PopplerLinkMapping to copy

Returns :

a new allocated copy of mapping +
+
+
+
+

poppler_link_mapping_free ()

+
void                poppler_link_mapping_free           (PopplerLinkMapping *mapping);
+

+Frees the given PopplerLinkMapping +

+
++ + + + +

mapping :

a PopplerLinkMapping +
+
+
+
+

poppler_image_mapping_new ()

+
PopplerImageMapping * poppler_image_mapping_new         (void);
+

+Creates a new PopplerImageMapping +

+
++ + + + +

Returns :

a new PopplerImageMapping, use poppler_image_mapping_free() to free it
+
+
+
+

poppler_image_mapping_copy ()

+
PopplerImageMapping * poppler_image_mapping_copy        (PopplerImageMapping *mapping);
+

+Creates a copy of mapping +

+
++ + + + + + + + + + +

mapping :

a PopplerImageMapping to copy

Returns :

a new allocated copy of mapping +
+
+
+
+

poppler_image_mapping_free ()

+
void                poppler_image_mapping_free          (PopplerImageMapping *mapping);
+

+Frees the given PopplerImageMapping +

+
++ + + + +

mapping :

a PopplerImageMapping +
+
+
+
+

poppler_form_field_mapping_new ()

+
PopplerFormFieldMapping * poppler_form_field_mapping_new
+                                                        (void);
+

+Creates a new PopplerFormFieldMapping +

+
++ + + + +

Returns :

a new PopplerFormFieldMapping, use poppler_form_field_mapping_free() to free it
+
+
+
+

poppler_form_field_mapping_copy ()

+
PopplerFormFieldMapping * poppler_form_field_mapping_copy
+                                                        (PopplerFormFieldMapping *mapping);
+

+Creates a copy of mapping +

+
++ + + + + + + + + + +

mapping :

a PopplerFormFieldMapping to copy

Returns :

a new allocated copy of mapping +
+
+
+
+

poppler_form_field_mapping_free ()

+
void                poppler_form_field_mapping_free     (PopplerFormFieldMapping *mapping);
+

+Frees the given PopplerFormFieldMapping +

+
++ + + + +

mapping :

a PopplerFormFieldMapping +
+
+
+
+

poppler_annot_mapping_new ()

+
PopplerAnnotMapping * poppler_annot_mapping_new         (void);
+

+Creates a new PopplerAnnotMapping +

+
++ + + + +

Returns :

a new PopplerAnnotMapping, use poppler_annot_mapping_free() to free it
+
+
+
+

poppler_annot_mapping_copy ()

+
PopplerAnnotMapping * poppler_annot_mapping_copy        (PopplerAnnotMapping *mapping);
+

+Creates a copy of mapping +

+
++ + + + + + + + + + +

mapping :

a PopplerAnnotMapping to copy

Returns :

a new allocated copy of mapping +
+
+
+
+

poppler_annot_mapping_free ()

+
void                poppler_annot_mapping_free          (PopplerAnnotMapping *mapping);
+

+Frees the given PopplerAnnotMapping +

+
++ + + + +

mapping :

a PopplerAnnotMapping +
+
+
+
+

poppler_text_attributes_new ()

+
PopplerTextAttributes * poppler_text_attributes_new     (void);
+

+Creates a new PopplerTextAttributes +

+
++ + + + +

Returns :

a new PopplerTextAttributes, use poppler_text_attributes_free() to free it
+

Since 0.18

+
+
+
+

poppler_text_attributes_copy ()

+
PopplerTextAttributes * poppler_text_attributes_copy    (PopplerTextAttributes *text_attrs);
+

+Creates a copy of text_attrs +

+
++ + + + + + + + + + +

text_attrs :

a PopplerTextAttributes to copy

Returns :

a new allocated copy of text_attrs +
+

Since 0.18

+
+
+
+

poppler_text_attributes_free ()

+
void                poppler_text_attributes_free        (PopplerTextAttributes *text_attrs);
+

+Frees the given PopplerTextAttributes +

+
++ + + + +

text_attrs :

a PopplerTextAttributes +
+

Since 0.18

+
+
+
+

Property Details

+
+

The "label" property

+
  "label"                    gchar*                : Read
+

+The label of the page or NULL. See also poppler_page_get_label() +

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/annotation-glossary.html b/glib/reference/html/annotation-glossary.html new file mode 100644 index 0000000..36d0bda --- /dev/null +++ b/glib/reference/html/annotation-glossary.html @@ -0,0 +1,83 @@ + + + + +Annotation Glossary + + + + + + + + + + + + + + + + + + +
+

+Annotation Glossary

+

O

+
+out
+

Parameter for returning results. Default is transfer full.

+

A

+
+allow-none
+

NULL is ok, both for passing and for returning.

+

C

+
+closure
+

This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.

+

T

+
+transfer none
+

Don't free data after the code is done.

+

A

+
+array
+

Parameter points to an array of items.

+

E

+
+element-type
+

Generics and defining elements of containers and arrays.

+

T

+
+transfer container
+

Free data container after the code is done.

+
+transfer full
+

Free data after the code is done.

+

S

+
+scope call
+

The callback is valid only during the call to the method.

+
+ + + \ No newline at end of file diff --git a/glib/reference/html/api-index-0-12.html b/glib/reference/html/api-index-0-12.html new file mode 100644 index 0000000..75d9c06 --- /dev/null +++ b/glib/reference/html/api-index-0-12.html @@ -0,0 +1,128 @@ + + + + +Index of new symbols in 0.12 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/glib/reference/html/api-index-0-14.html b/glib/reference/html/api-index-0-14.html new file mode 100644 index 0000000..a5d59ca --- /dev/null +++ b/glib/reference/html/api-index-0-14.html @@ -0,0 +1,107 @@ + + + + +Index of new symbols in 0.14 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/glib/reference/html/api-index-0-16.html b/glib/reference/html/api-index-0-16.html new file mode 100644 index 0000000..5135b5f --- /dev/null +++ b/glib/reference/html/api-index-0-16.html @@ -0,0 +1,185 @@ + + + + +Index of new symbols in 0.16 + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 0.16

+

A

+
+poppler_annot_markup_set_label, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_opacity, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_popup, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_popup_is_open, function in PopplerAnnot +
+
+
+poppler_annot_set_color, function in PopplerAnnot +
+
+
+poppler_annot_text_new, function in PopplerAnnot +
+
+
+poppler_annot_text_set_icon, function in PopplerAnnot +
+
+
+poppler_annot_text_set_is_open, function in PopplerAnnot +
+
+

D

+
+poppler_document_get_author, function in PopplerDocument +
+
+
+poppler_document_get_creation_date, function in PopplerDocument +
+
+
+poppler_document_get_creator, function in PopplerDocument +
+
+
+poppler_document_get_id, function in PopplerDocument +
+
+
+poppler_document_get_keywords, function in PopplerDocument +
+
+
+poppler_document_get_metadata, function in PopplerDocument +
+
+
+poppler_document_get_modification_date, function in PopplerDocument +
+
+
+poppler_document_get_page_layout, function in PopplerDocument +
+
+
+poppler_document_get_page_mode, function in PopplerDocument +
+
+
+poppler_document_get_pdf_version, function in PopplerDocument +
+
+
+poppler_document_get_pdf_version_string, function in PopplerDocument +
+
+
+poppler_document_get_permissions, function in PopplerDocument +
+
+
+poppler_document_get_producer, function in PopplerDocument +
+
+
+poppler_document_get_subject, function in PopplerDocument +
+
+
+poppler_document_get_title, function in PopplerDocument +
+
+
+poppler_document_is_linearized, function in PopplerDocument +
+
+

F

+
+poppler_form_field_get_mapping_name, function in PopplerFormField +
+
+
+poppler_form_field_get_name, function in PopplerFormField +
+
+
+poppler_form_field_get_partial_name, function in PopplerFormField +
+
+

P

+
+poppler_page_add_annot, function in PopplerPage +
+
+
+poppler_page_get_label, function in PopplerPage +
+
+
+poppler_page_get_selected_region, function in PopplerPage +
+
+
+poppler_page_get_selected_text, function in PopplerPage +
+
+
+poppler_page_get_text, function in PopplerPage +
+
+
+poppler_page_get_text_layout, function in PopplerPage +
+
+
+poppler_page_render_for_printing_with_options, function in PopplerPage +
+
+
+PopplerPrintFlags, enum in poppler +
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/api-index-0-18.html b/glib/reference/html/api-index-0-18.html new file mode 100644 index 0000000..e310d04 --- /dev/null +++ b/glib/reference/html/api-index-0-18.html @@ -0,0 +1,77 @@ + + + + +Index of new symbols in 0.18 + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 0.18

+

D

+
+poppler_document_get_n_attachments, function in PopplerDocument +
+
+

F

+
+poppler_form_field_get_action, function in PopplerFormField +
+
+

P

+
+poppler_page_free_text_attributes, function in PopplerPage +
+
+
+poppler_page_get_text_attributes, function in PopplerPage +
+
+

T

+
+PopplerTextAttributes, struct in PopplerPage +
+
+
+poppler_text_attributes_copy, function in PopplerPage +
+
+
+poppler_text_attributes_free, function in PopplerPage +
+
+
+poppler_text_attributes_new, function in PopplerPage +
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/api-index-0-20.html b/glib/reference/html/api-index-0-20.html new file mode 100644 index 0000000..06e5e08 --- /dev/null +++ b/glib/reference/html/api-index-0-20.html @@ -0,0 +1,42 @@ + + + + +Index of new symbols in 0.20 + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 0.20

+

F

+
+poppler_fonts_iter_get_encoding, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_substitute_name, function in PopplerDocument +
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/api-index-deprecated.html b/glib/reference/html/api-index-deprecated.html new file mode 100644 index 0000000..064568d --- /dev/null +++ b/glib/reference/html/api-index-deprecated.html @@ -0,0 +1,42 @@ + + + + +Index of deprecated symbols + + + + + + + + + + + + + + + + + + + +
+

+Index of deprecated symbols

+

P

+
+poppler_page_get_selection_region, function in PopplerPage +
+
+
+poppler_page_selection_region_free, function in PopplerPage +
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/api-index-full.html b/glib/reference/html/api-index-full.html new file mode 100644 index 0000000..7dc7b02 --- /dev/null +++ b/glib/reference/html/api-index-full.html @@ -0,0 +1,1332 @@ + + + + +Index of all symbols + + + + + + + + + + + + + + + + + + + +
+

+Index of all symbols

+

A

+
+PopplerAction, union in PopplerAction +
+
+
+PopplerActionAny, struct in PopplerAction +
+
+
+PopplerActionGotoDest, struct in PopplerAction +
+
+
+PopplerActionGotoRemote, struct in PopplerAction +
+
+
+PopplerActionJavascript, struct in PopplerAction +
+
+
+PopplerActionLaunch, struct in PopplerAction +
+
+
+PopplerActionLayer, struct in PopplerAction +
+
+
+PopplerActionLayerAction, enum in PopplerAction +
+
+
+PopplerActionMovie, struct in PopplerAction +
+
+
+PopplerActionMovieOperation, enum in PopplerAction +
+
+
+PopplerActionNamed, struct in PopplerAction +
+
+
+PopplerActionOCGState, struct in PopplerAction +
+
+
+PopplerActionRendition, struct in PopplerAction +
+
+
+PopplerActionType, enum in PopplerAction +
+
+
+PopplerActionUri, struct in PopplerAction +
+
+
+poppler_action_copy, function in PopplerAction +
+
+
+poppler_action_free, function in PopplerAction +
+
+
+PopplerAnnot, struct in PopplerAnnot +
+
+
+PopplerAnnotCalloutLine, struct in PopplerAnnot +
+
+
+PopplerAnnotExternalDataType, enum in PopplerAnnot +
+
+
+PopplerAnnotFileAttachment, struct in PopplerAnnot +
+
+
+PopplerAnnotFlag, enum in PopplerAnnot +
+
+
+PopplerAnnotFreeText, struct in PopplerAnnot +
+
+
+PopplerAnnotFreeTextQuadding, enum in PopplerAnnot +
+
+
+PopplerAnnotMapping, struct in PopplerPage +
+
+
+PopplerAnnotMarkup, struct in PopplerAnnot +
+
+
+PopplerAnnotMarkupReplyType, enum in PopplerAnnot +
+
+
+PopplerAnnotMovie, struct in PopplerAnnot +
+
+
+PopplerAnnotScreen, struct in PopplerAnnot +
+
+
+PopplerAnnotText, struct in PopplerAnnot +
+
+
+PopplerAnnotTextState, enum in PopplerAnnot +
+
+
+PopplerAnnotType, enum in PopplerAnnot +
+
+
+poppler_annot_callout_line_copy, function in PopplerAnnot +
+
+
+poppler_annot_callout_line_free, function in PopplerAnnot +
+
+
+poppler_annot_callout_line_new, function in PopplerAnnot +
+
+
+poppler_annot_file_attachment_get_attachment, function in PopplerAnnot +
+
+
+poppler_annot_file_attachment_get_name, function in PopplerAnnot +
+
+
+poppler_annot_free_text_get_callout_line, function in PopplerAnnot +
+
+
+poppler_annot_free_text_get_quadding, function in PopplerAnnot +
+
+
+poppler_annot_get_annot_type, function in PopplerAnnot +
+
+
+poppler_annot_get_color, function in PopplerAnnot +
+
+
+poppler_annot_get_contents, function in PopplerAnnot +
+
+
+poppler_annot_get_flags, function in PopplerAnnot +
+
+
+poppler_annot_get_modified, function in PopplerAnnot +
+
+
+poppler_annot_get_name, function in PopplerAnnot +
+
+
+poppler_annot_get_page_index, function in PopplerAnnot +
+
+
+poppler_annot_mapping_copy, function in PopplerPage +
+
+
+poppler_annot_mapping_free, function in PopplerPage +
+
+
+poppler_annot_mapping_new, function in PopplerPage +
+
+
+poppler_annot_markup_get_date, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_external_data, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_label, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_opacity, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_popup_is_open, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_popup_rectangle, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_reply_to, function in PopplerAnnot +
+
+
+poppler_annot_markup_get_subject, function in PopplerAnnot +
+
+
+poppler_annot_markup_has_popup, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_label, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_opacity, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_popup, function in PopplerAnnot +
+
+
+poppler_annot_markup_set_popup_is_open, function in PopplerAnnot +
+
+
+poppler_annot_movie_get_movie, function in PopplerAnnot +
+
+
+poppler_annot_movie_get_title, function in PopplerAnnot +
+
+
+poppler_annot_screen_get_action, function in PopplerAnnot +
+
+
+poppler_annot_set_color, function in PopplerAnnot +
+
+
+poppler_annot_set_contents, function in PopplerAnnot +
+
+
+poppler_annot_text_get_icon, function in PopplerAnnot +
+
+
+poppler_annot_text_get_is_open, function in PopplerAnnot +
+
+
+poppler_annot_text_get_state, function in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_CIRCLE, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_COMMENT, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_CROSS, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_HELP, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_INSERT, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_KEY, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_NOTE, macro in PopplerAnnot +
+
+
+POPPLER_ANNOT_TEXT_ICON_PARAGRAPH, macro in PopplerAnnot +
+
+
+poppler_annot_text_new, function in PopplerAnnot +
+
+
+poppler_annot_text_set_icon, function in PopplerAnnot +
+
+
+poppler_annot_text_set_is_open, function in PopplerAnnot +
+
+
+PopplerAttachment, struct in PopplerAttachment +
+
+
+PopplerAttachmentSaveFunc, user_function in PopplerAttachment +
+
+
+poppler_attachment_save, function in PopplerAttachment +
+
+
+poppler_attachment_save_to_callback, function in PopplerAttachment +
+
+

B

+
+PopplerBackend, enum in poppler +
+
+

C

+
+POPPLER_CHECK_VERSION, macro in Version and Features Information +
+
+
+PopplerColor, struct in poppler +
+
+
+poppler_color_copy, function in poppler +
+
+
+poppler_color_free, function in poppler +
+
+
+poppler_color_new, function in poppler +
+
+

D

+
+poppler_date_parse, function in poppler +
+
+
+PopplerDest, struct in PopplerAction +
+
+
+PopplerDestType, enum in PopplerAction +
+
+
+poppler_dest_copy, function in PopplerAction +
+
+
+poppler_dest_free, function in PopplerAction +
+
+
+PopplerDocument, struct in PopplerDocument +
+
+
+PopplerDocument:author, object property in PopplerDocument +
+
+
+PopplerDocument:creation-date, object property in PopplerDocument +
+
+
+PopplerDocument:creator, object property in PopplerDocument +
+
+
+PopplerDocument:format, object property in PopplerDocument +
+
+
+PopplerDocument:format-major, object property in PopplerDocument +
+
+
+PopplerDocument:format-minor, object property in PopplerDocument +
+
+
+PopplerDocument:keywords, object property in PopplerDocument +
+
+
+PopplerDocument:linearized, object property in PopplerDocument +
+
+
+PopplerDocument:metadata, object property in PopplerDocument +
+
+
+PopplerDocument:mod-date, object property in PopplerDocument +
+
+
+PopplerDocument:page-layout, object property in PopplerDocument +
+
+
+PopplerDocument:page-mode, object property in PopplerDocument +
+
+
+PopplerDocument:permissions, object property in PopplerDocument +
+
+
+PopplerDocument:producer, object property in PopplerDocument +
+
+
+PopplerDocument:subject, object property in PopplerDocument +
+
+
+PopplerDocument:title, object property in PopplerDocument +
+
+
+PopplerDocument:viewer-preferences, object property in PopplerDocument +
+
+
+poppler_document_find_dest, function in PopplerDocument +
+
+
+poppler_document_get_attachments, function in PopplerDocument +
+
+
+poppler_document_get_author, function in PopplerDocument +
+
+
+poppler_document_get_creation_date, function in PopplerDocument +
+
+
+poppler_document_get_creator, function in PopplerDocument +
+
+
+poppler_document_get_form_field, function in PopplerDocument +
+
+
+poppler_document_get_id, function in PopplerDocument +
+
+
+poppler_document_get_keywords, function in PopplerDocument +
+
+
+poppler_document_get_metadata, function in PopplerDocument +
+
+
+poppler_document_get_modification_date, function in PopplerDocument +
+
+
+poppler_document_get_n_attachments, function in PopplerDocument +
+
+
+poppler_document_get_n_pages, function in PopplerDocument +
+
+
+poppler_document_get_page, function in PopplerDocument +
+
+
+poppler_document_get_page_by_label, function in PopplerDocument +
+
+
+poppler_document_get_page_layout, function in PopplerDocument +
+
+
+poppler_document_get_page_mode, function in PopplerDocument +
+
+
+poppler_document_get_pdf_version, function in PopplerDocument +
+
+
+poppler_document_get_pdf_version_string, function in PopplerDocument +
+
+
+poppler_document_get_permissions, function in PopplerDocument +
+
+
+poppler_document_get_producer, function in PopplerDocument +
+
+
+poppler_document_get_subject, function in PopplerDocument +
+
+
+poppler_document_get_title, function in PopplerDocument +
+
+
+poppler_document_has_attachments, function in PopplerDocument +
+
+
+poppler_document_is_linearized, function in PopplerDocument +
+
+
+poppler_document_new_from_data, function in PopplerDocument +
+
+
+poppler_document_new_from_file, function in PopplerDocument +
+
+
+poppler_document_save, function in PopplerDocument +
+
+
+poppler_document_save_a_copy, function in PopplerDocument +
+
+

E

+
+POPPLER_ERROR, macro in poppler +
+
+
+PopplerError, enum in poppler +
+
+

F

+
+PopplerFontInfo, struct in PopplerDocument +
+
+
+PopplerFontsIter, struct in PopplerDocument +
+
+
+poppler_fonts_iter_copy, function in PopplerDocument +
+
+
+poppler_fonts_iter_free, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_encoding, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_file_name, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_font_type, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_full_name, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_name, function in PopplerDocument +
+
+
+poppler_fonts_iter_get_substitute_name, function in PopplerDocument +
+
+
+poppler_fonts_iter_is_embedded, function in PopplerDocument +
+
+
+poppler_fonts_iter_is_subset, function in PopplerDocument +
+
+
+poppler_fonts_iter_next, function in PopplerDocument +
+
+
+PopplerFontType, enum in PopplerDocument +
+
+
+poppler_font_info_free, function in PopplerDocument +
+
+
+poppler_font_info_new, function in PopplerDocument +
+
+
+poppler_font_info_scan, function in PopplerDocument +
+
+
+PopplerFormButtonType, enum in PopplerFormField +
+
+
+PopplerFormChoiceType, enum in PopplerFormField +
+
+
+PopplerFormField, struct in PopplerFormField +
+
+
+PopplerFormFieldMapping, struct in PopplerPage +
+
+
+PopplerFormFieldType, enum in PopplerFormField +
+
+
+PopplerFormTextType, enum in PopplerFormField +
+
+
+poppler_form_field_button_get_button_type, function in PopplerFormField +
+
+
+poppler_form_field_button_get_state, function in PopplerFormField +
+
+
+poppler_form_field_button_set_state, function in PopplerFormField +
+
+
+poppler_form_field_choice_can_select_multiple, function in PopplerFormField +
+
+
+poppler_form_field_choice_commit_on_change, function in PopplerFormField +
+
+
+poppler_form_field_choice_do_spell_check, function in PopplerFormField +
+
+
+poppler_form_field_choice_get_choice_type, function in PopplerFormField +
+
+
+poppler_form_field_choice_get_item, function in PopplerFormField +
+
+
+poppler_form_field_choice_get_n_items, function in PopplerFormField +
+
+
+poppler_form_field_choice_get_text, function in PopplerFormField +
+
+
+poppler_form_field_choice_is_editable, function in PopplerFormField +
+
+
+poppler_form_field_choice_is_item_selected, function in PopplerFormField +
+
+
+poppler_form_field_choice_select_item, function in PopplerFormField +
+
+
+poppler_form_field_choice_set_text, function in PopplerFormField +
+
+
+poppler_form_field_choice_toggle_item, function in PopplerFormField +
+
+
+poppler_form_field_choice_unselect_all, function in PopplerFormField +
+
+
+poppler_form_field_get_action, function in PopplerFormField +
+
+
+poppler_form_field_get_field_type, function in PopplerFormField +
+
+
+poppler_form_field_get_font_size, function in PopplerFormField +
+
+
+poppler_form_field_get_id, function in PopplerFormField +
+
+
+poppler_form_field_get_mapping_name, function in PopplerFormField +
+
+
+poppler_form_field_get_name, function in PopplerFormField +
+
+
+poppler_form_field_get_partial_name, function in PopplerFormField +
+
+
+poppler_form_field_is_read_only, function in PopplerFormField +
+
+
+poppler_form_field_mapping_copy, function in PopplerPage +
+
+
+poppler_form_field_mapping_free, function in PopplerPage +
+
+
+poppler_form_field_mapping_new, function in PopplerPage +
+
+
+poppler_form_field_text_do_scroll, function in PopplerFormField +
+
+
+poppler_form_field_text_do_spell_check, function in PopplerFormField +
+
+
+poppler_form_field_text_get_max_len, function in PopplerFormField +
+
+
+poppler_form_field_text_get_text, function in PopplerFormField +
+
+
+poppler_form_field_text_get_text_type, function in PopplerFormField +
+
+
+poppler_form_field_text_is_password, function in PopplerFormField +
+
+
+poppler_form_field_text_is_rich_text, function in PopplerFormField +
+
+
+poppler_form_field_text_set_text, function in PopplerFormField +
+
+

G

+
+poppler_get_backend, function in poppler +
+
+
+poppler_get_version, function in poppler +
+
+

H

+
+POPPLER_HAS_CAIRO, macro in Version and Features Information +
+
+

I

+
+PopplerImageMapping, struct in PopplerPage +
+
+
+poppler_image_mapping_copy, function in PopplerPage +
+
+
+poppler_image_mapping_free, function in PopplerPage +
+
+
+poppler_image_mapping_new, function in PopplerPage +
+
+
+PopplerIndexIter, struct in PopplerDocument +
+
+
+poppler_index_iter_copy, function in PopplerDocument +
+
+
+poppler_index_iter_free, function in PopplerDocument +
+
+
+poppler_index_iter_get_action, function in PopplerDocument +
+
+
+poppler_index_iter_get_child, function in PopplerDocument +
+
+
+poppler_index_iter_is_open, function in PopplerDocument +
+
+
+poppler_index_iter_new, function in PopplerDocument +
+
+
+poppler_index_iter_next, function in PopplerDocument +
+
+

L

+
+PopplerLayer, struct in PopplerLayer +
+
+
+PopplerLayersIter, struct in PopplerDocument +
+
+
+poppler_layers_iter_copy, function in PopplerDocument +
+
+
+poppler_layers_iter_free, function in PopplerDocument +
+
+
+poppler_layers_iter_get_child, function in PopplerDocument +
+
+
+poppler_layers_iter_get_layer, function in PopplerDocument +
+
+
+poppler_layers_iter_get_title, function in PopplerDocument +
+
+
+poppler_layers_iter_new, function in PopplerDocument +
+
+
+poppler_layers_iter_next, function in PopplerDocument +
+
+
+poppler_layer_get_radio_button_group_id, function in PopplerLayer +
+
+
+poppler_layer_get_title, function in PopplerLayer +
+
+
+poppler_layer_hide, function in PopplerLayer +
+
+
+poppler_layer_is_parent, function in PopplerLayer +
+
+
+poppler_layer_is_visible, function in PopplerLayer +
+
+
+poppler_layer_show, function in PopplerLayer +
+
+
+PopplerLinkMapping, struct in PopplerPage +
+
+
+poppler_link_mapping_copy, function in PopplerPage +
+
+
+poppler_link_mapping_free, function in PopplerPage +
+
+
+poppler_link_mapping_new, function in PopplerPage +
+
+

M

+
+POPPLER_MAJOR_VERSION, macro in Version and Features Information +
+
+
+PopplerMedia, struct in PopplerMedia +
+
+
+PopplerMediaSaveFunc, user_function in PopplerMedia +
+
+
+poppler_media_get_filename, function in PopplerMedia +
+
+
+poppler_media_get_mime_type, function in PopplerMedia +
+
+
+poppler_media_is_embedded, function in PopplerMedia +
+
+
+poppler_media_save, function in PopplerMedia +
+
+
+poppler_media_save_to_callback, function in PopplerMedia +
+
+
+POPPLER_MICRO_VERSION, macro in Version and Features Information +
+
+
+POPPLER_MINOR_VERSION, macro in Version and Features Information +
+
+
+PopplerMovie, struct in PopplerMovie +
+
+
+poppler_movie_get_filename, function in PopplerMovie +
+
+
+poppler_movie_need_poster, function in PopplerMovie +
+
+
+poppler_movie_show_controls, function in PopplerMovie +
+
+

O

+
+PopplerOrientation, enum in poppler +
+
+

P

+
+PopplerPage, struct in PopplerPage +
+
+
+PopplerPage:label, object property in PopplerPage +
+
+
+PopplerPageLayout, enum in PopplerDocument +
+
+
+PopplerPageMode, enum in PopplerDocument +
+
+
+PopplerPageTransition, struct in PopplerPage +
+
+
+PopplerPageTransitionAlignment, enum in PopplerPage +
+
+
+PopplerPageTransitionDirection, enum in PopplerPage +
+
+
+PopplerPageTransitionType, enum in PopplerPage +
+
+
+poppler_page_add_annot, function in PopplerPage +
+
+
+poppler_page_find_text, function in PopplerPage +
+
+
+poppler_page_free_annot_mapping, function in PopplerPage +
+
+
+poppler_page_free_form_field_mapping, function in PopplerPage +
+
+
+poppler_page_free_image_mapping, function in PopplerPage +
+
+
+poppler_page_free_link_mapping, function in PopplerPage +
+
+
+poppler_page_free_text_attributes, function in PopplerPage +
+
+
+poppler_page_get_annot_mapping, function in PopplerPage +
+
+
+poppler_page_get_crop_box, function in PopplerPage +
+
+
+poppler_page_get_duration, function in PopplerPage +
+
+
+poppler_page_get_form_field_mapping, function in PopplerPage +
+
+
+poppler_page_get_image, function in PopplerPage +
+
+
+poppler_page_get_image_mapping, function in PopplerPage +
+
+
+poppler_page_get_index, function in PopplerPage +
+
+
+poppler_page_get_label, function in PopplerPage +
+
+
+poppler_page_get_link_mapping, function in PopplerPage +
+
+
+poppler_page_get_selected_region, function in PopplerPage +
+
+
+poppler_page_get_selected_text, function in PopplerPage +
+
+
+poppler_page_get_selection_region, function in PopplerPage +
+
+
+poppler_page_get_size, function in PopplerPage +
+
+
+poppler_page_get_text, function in PopplerPage +
+
+
+poppler_page_get_text_attributes, function in PopplerPage +
+
+
+poppler_page_get_text_layout, function in PopplerPage +
+
+
+poppler_page_get_thumbnail, function in PopplerPage +
+
+
+poppler_page_get_thumbnail_size, function in PopplerPage +
+
+
+poppler_page_get_transition, function in PopplerPage +
+
+
+poppler_page_render, function in PopplerPage +
+
+
+poppler_page_render_for_printing, function in PopplerPage +
+
+
+poppler_page_render_for_printing_with_options, function in PopplerPage +
+
+
+poppler_page_render_selection, function in PopplerPage +
+
+
+poppler_page_render_to_ps, function in PopplerPage +
+
+
+poppler_page_selection_region_free, function in PopplerPage +
+
+
+poppler_page_transition_copy, function in PopplerPage +
+
+
+poppler_page_transition_free, function in PopplerPage +
+
+
+poppler_page_transition_new, function in PopplerPage +
+
+
+PopplerPermissions, enum in PopplerDocument +
+
+
+PopplerPrintFlags, enum in poppler +
+
+
+PopplerPSFile, struct in PopplerDocument +
+
+
+poppler_ps_file_free, function in PopplerDocument +
+
+
+poppler_ps_file_new, function in PopplerDocument +
+
+
+poppler_ps_file_set_duplex, function in PopplerDocument +
+
+
+poppler_ps_file_set_paper_size, function in PopplerDocument +
+
+

R

+
+PopplerRectangle, struct in PopplerPage +
+
+
+poppler_rectangle_copy, function in PopplerPage +
+
+
+poppler_rectangle_free, function in PopplerPage +
+
+
+poppler_rectangle_new, function in PopplerPage +
+
+

S

+
+PopplerSelectionStyle, enum in PopplerPage +
+
+

T

+
+PopplerTextAttributes, struct in PopplerPage +
+
+
+poppler_text_attributes_copy, function in PopplerPage +
+
+
+poppler_text_attributes_free, function in PopplerPage +
+
+
+poppler_text_attributes_new, function in PopplerPage +
+
+

V

+
+PopplerViewerPreferences, enum in PopplerDocument +
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/ch01.html b/glib/reference/html/ch01.html new file mode 100644 index 0000000..6450a2c --- /dev/null +++ b/glib/reference/html/ch01.html @@ -0,0 +1,65 @@ + + + + +Poppler + + + + + + + + + + + + + + + + +
+

+Poppler

+
+
+poppler +
+
+PopplerDocument — Information about a document +
+
+PopplerPage — Information about a page in a document +
+
+PopplerAction — Action links +
+
+PopplerAttachment — Attachments +
+
+PoppplerFormField — Form Field +
+
+PopplerAnnot — Annotations +
+
+PopplerLayer — Layers +
+
+PopplerMedia — Media +
+
+PopplerMovie — Movies +
+
+Version and Features Information — Variables and functions to check the poppler version and features +
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/home.png b/glib/reference/html/home.png new file mode 100644 index 0000000..fb60b55 Binary files /dev/null and b/glib/reference/html/home.png differ diff --git a/glib/reference/html/index.html b/glib/reference/html/index.html new file mode 100644 index 0000000..c685708 --- /dev/null +++ b/glib/reference/html/index.html @@ -0,0 +1,75 @@ + + + + +Poppler Reference Manual + + + + + + + +
+
+
+
+

+ for Poppler 0.20.4 + +

+
+
+
+
+
Poppler
+
+
+poppler +
+
+PopplerDocument — Information about a document +
+
+PopplerPage — Information about a page in a document +
+
+PopplerAction — Action links +
+
+PopplerAttachment — Attachments +
+
+PoppplerFormField — Form Field +
+
+PopplerAnnot — Annotations +
+
+PopplerLayer — Layers +
+
+PopplerMedia — Media +
+
+PopplerMovie — Movies +
+
+Version and Features Information — Variables and functions to check the poppler version and features +
+
+
Index of all symbols
+
Index of deprecated symbols
+
Index of new symbols in 0.12
+
Index of new symbols in 0.14
+
Index of new symbols in 0.16
+
Index of new symbols in 0.18
+
Index of new symbols in 0.20
+
Annotation Glossary
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/index.sgml b/glib/reference/html/index.sgml new file mode 100644 index 0000000..91c955a --- /dev/null +++ b/glib/reference/html/index.sgml @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glib/reference/html/left.png b/glib/reference/html/left.png new file mode 100644 index 0000000..48cab27 Binary files /dev/null and b/glib/reference/html/left.png differ diff --git a/glib/reference/html/poppler-PopplerAction.html b/glib/reference/html/poppler-PopplerAction.html new file mode 100644 index 0000000..b2c7df2 --- /dev/null +++ b/glib/reference/html/poppler-PopplerAction.html @@ -0,0 +1,632 @@ + + + + +PopplerAction + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PopplerAction

+

PopplerAction — Action links

+
+ +
+

Description

+
+
+

Details

+
+

union PopplerAction

+
union _PopplerAction
+{
+	PopplerActionType type;
+	PopplerActionAny any;
+	PopplerActionGotoDest goto_dest;
+	PopplerActionGotoRemote goto_remote;
+	PopplerActionLaunch launch;
+	PopplerActionUri uri;
+	PopplerActionNamed named;
+	PopplerActionMovie movie;
+	PopplerActionRendition rendition;
+	PopplerActionOCGState ocg_state;
+	PopplerActionJavascript javascript;
+};
+
+

+A data structure for holding actions +

+
+
+
+

PopplerDest

+
typedef struct {
+	PopplerDestType type;
+
+	int page_num;
+	double left;
+	double bottom;
+	double right;
+	double top;
+	double zoom;
+	gchar *named_dest;
+	guint change_left : 1;
+	guint change_top : 1;
+	guint change_zoom : 1;
+} PopplerDest;
+
+

+Data structure for holding a destination +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PopplerDestType type;

type of destination

int page_num;

page number

double left;

left coordinate

double bottom;

bottom coordinate

double right;

right coordinate

double top;

top coordinate

double zoom;

scale factor

gchar *named_dest;

name of the destination (POPPLER_DEST_NAMED only)

guint change_left : 1;

whether left coordinate should be changed

guint change_top : 1;

whether top coordinate should be changed

guint change_zoom : 1;

whether scale factor should be changed
+
+
+
+

struct PopplerActionAny

+
struct PopplerActionAny {
+	PopplerActionType type;
+	gchar *title;
+};
+
+
+
+
+

struct PopplerActionGotoDest

+
struct PopplerActionGotoDest {
+	PopplerActionType type;
+	gchar *title;
+
+	PopplerDest *dest;
+};
+
+
+
+
+

struct PopplerActionGotoRemote

+
struct PopplerActionGotoRemote {
+	PopplerActionType type;
+	gchar *title;
+
+	gchar *file_name;
+	PopplerDest *dest;
+};
+
+
+
+
+

struct PopplerActionLaunch

+
struct PopplerActionLaunch {
+	PopplerActionType type;
+	gchar *title;
+
+	gchar *file_name;
+	gchar *params;
+};
+
+
+
+
+

struct PopplerActionUri

+
struct PopplerActionUri {
+	PopplerActionType type;
+	gchar *title;
+
+	char *uri;
+};
+
+
+
+
+

struct PopplerActionNamed

+
struct PopplerActionNamed {
+	PopplerActionType type;
+	gchar *title;
+
+	gchar *named_dest;
+};
+
+
+
+
+

struct PopplerActionMovie

+
struct PopplerActionMovie {
+        PopplerActionType           type;
+        gchar                      *title;
+
+        PopplerActionMovieOperation operation;
+	PopplerMovie               *movie;
+};
+
+
+
+
+

struct PopplerActionRendition

+
struct PopplerActionRendition {
+	PopplerActionType type;
+	gchar            *title;
+
+	gint               op;
+	PopplerMedia      *media;
+};
+
+
+
+
+

struct PopplerActionOCGState

+
struct PopplerActionOCGState {
+	PopplerActionType type;
+	gchar            *title;
+
+	GList            *state_list;
+};
+
+
+
+
+

struct PopplerActionJavascript

+
struct PopplerActionJavascript {
+	PopplerActionType  type;
+	gchar 		  *title;
+
+	gchar		  *script;
+};
+
+
+
+
+

enum PopplerActionType

+
typedef enum {
+	POPPLER_ACTION_UNKNOWN,		/* unknown action */
+	POPPLER_ACTION_NONE,            /* no action specified */
+	POPPLER_ACTION_GOTO_DEST, /* go to destination */
+	POPPLER_ACTION_GOTO_REMOTE, /* go to destination in new file */
+	POPPLER_ACTION_LAUNCH,		/* launch app (or open document) */
+	POPPLER_ACTION_URI,		/* URI */
+	POPPLER_ACTION_NAMED,		/* named action*/
+	POPPLER_ACTION_MOVIE,		/* movie action */
+	POPPLER_ACTION_RENDITION,       /* rendition action */
+	POPPLER_ACTION_OCG_STATE,       /* Set-OCG-State action */
+	POPPLER_ACTION_JAVASCRIPT /* Javascript action */
+} PopplerActionType;
+
+

+Action types +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_ACTION_UNKNOWN

unknown action +

POPPLER_ACTION_NONE

no action specified +

POPPLER_ACTION_GOTO_DEST

go to destination +

POPPLER_ACTION_GOTO_REMOTE

go to destination in another document +

POPPLER_ACTION_LAUNCH

launch app (or open document +

POPPLER_ACTION_URI

URI +

POPPLER_ACTION_NAMED

predefined action +

POPPLER_ACTION_MOVIE

play movies. Since 0.14 +

POPPLER_ACTION_RENDITION

play multimedia content. Since 0.14 +

POPPLER_ACTION_OCG_STATE

state of layer. Since 0.14 +

POPPLER_ACTION_JAVASCRIPT

Javascript. Since 0.18 +
+
+
+
+

enum PopplerDestType

+
typedef enum {
+	POPPLER_DEST_UNKNOWN,
+	POPPLER_DEST_XYZ,
+	POPPLER_DEST_FIT,
+	POPPLER_DEST_FITH,
+	POPPLER_DEST_FITV,
+	POPPLER_DEST_FITR,
+	POPPLER_DEST_FITB,
+	POPPLER_DEST_FITBH,
+	POPPLER_DEST_FITBV,
+	POPPLER_DEST_NAMED
+} PopplerDestType;
+
+

+Destination types +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

POPPLER_DEST_UNKNOWN

unknown destination +

POPPLER_DEST_XYZ

go to page with coordinates (left, top) +positioned at the upper-left corner of the window and the contents of +the page magnified by the factor zoom +

POPPLER_DEST_FIT

go to page with its contents magnified just +enough to fit the entire page within the window both horizontally and +vertically +

POPPLER_DEST_FITH

go to page with the vertical coordinate top +positioned at the top edge of the window and the contents of the page +magnified just enough to fit the entire width of the page within the window +

POPPLER_DEST_FITV

go to page with the horizontal coordinate +left positioned at the left edge of the window and the contents of the +page magnified just enough to fit the entire height of the page within the window +

POPPLER_DEST_FITR

go to page with its contents magnified just +enough to fit the rectangle specified by the coordinates left, bottom, +right, and top entirely within the window both horizontally and vertically +

POPPLER_DEST_FITB

go to page with its contents magnified just enough to fit +its bounding box entirely within the window both horizontally and vertically +

POPPLER_DEST_FITBH

go to page with the vertical +coordinate top positioned at the top edge of the window and the +contents of the page magnified just enough to fit the entire width of its +bounding box within the window +

POPPLER_DEST_FITBV

go to page with the horizontal +coordinate left positioned at the left edge of the window and the +contents of the page magnified just enough to fit the entire height of its +bounding box within the window +

POPPLER_DEST_NAMED

got to page specified by a name. See poppler_document_find_dest() +
+
+
+
+

enum PopplerActionMovieOperation

+
typedef enum {
+        POPPLER_ACTION_MOVIE_PLAY,
+	POPPLER_ACTION_MOVIE_PAUSE,
+	POPPLER_ACTION_MOVIE_RESUME,
+	POPPLER_ACTION_MOVIE_STOP
+} PopplerActionMovieOperation;
+
+

+Movie operations +

+
++ + + + + + + + + + + + + + + + + + +

POPPLER_ACTION_MOVIE_PLAY

play movie +

POPPLER_ACTION_MOVIE_PAUSE

pause playing movie +

POPPLER_ACTION_MOVIE_RESUME

resume paused movie +

POPPLER_ACTION_MOVIE_STOP

stop playing movie +
+

Since 0.14

+
+
+
+

PopplerActionLayer

+
typedef struct {
+	PopplerActionLayerAction action;
+	GList *layers;
+} PopplerActionLayer;
+
+

+Action to perform over a list of layers +

+
++ + + + + + + + + + +

PopplerActionLayerAction action;

a PopplerActionLayerAction +

GList *layers;

list of PopplerLayers
+
+
+
+

enum PopplerActionLayerAction

+
typedef enum {
+	POPPLER_ACTION_LAYER_ON,
+	POPPLER_ACTION_LAYER_OFF,
+	POPPLER_ACTION_LAYER_TOGGLE
+} PopplerActionLayerAction;
+
+

+Layer actions +

+
++ + + + + + + + + + + + + + +

POPPLER_ACTION_LAYER_ON

set layer visibility on +

POPPLER_ACTION_LAYER_OFF

set layer visibility off +

POPPLER_ACTION_LAYER_TOGGLE

reverse the layer visibility state +
+

Since 0.14

+
+
+
+

poppler_action_copy ()

+
PopplerAction *     poppler_action_copy                 (PopplerAction *action);
+

+Copies action, creating an identical PopplerAction. +

+
++ + + + + + + + + + +

action :

a PopplerAction +

Returns :

a new action identical to action +
+
+
+
+

poppler_action_free ()

+
void                poppler_action_free                 (PopplerAction *action);
+

+Frees action +

+
++ + + + +

action :

a PopplerAction +
+
+
+
+

poppler_dest_copy ()

+
PopplerDest *       poppler_dest_copy                   (PopplerDest *dest);
+

+Copies dest, creating an identical PopplerDest. +

+
++ + + + + + + + + + +

dest :

a PopplerDest +

Returns :

a new destination identical to dest +
+
+
+
+

poppler_dest_free ()

+
void                poppler_dest_free                   (PopplerDest *dest);
+

+Frees dest +

+
++ + + + +

dest :

a PopplerDest +
+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/poppler-Version-and-Features-Information.html b/glib/reference/html/poppler-Version-and-Features-Information.html new file mode 100644 index 0000000..adb25e6 --- /dev/null +++ b/glib/reference/html/poppler-Version-and-Features-Information.html @@ -0,0 +1,142 @@ + + + + +Version and Features Information + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Version and Features Information

+

Version and Features Information — Variables and functions to check the poppler version and features

+
+
+

Synopsis

+
+#include <poppler.h>
+
+#define             POPPLER_HAS_CAIRO
+#define             POPPLER_MAJOR_VERSION
+#define             POPPLER_MINOR_VERSION
+#define             POPPLER_MICRO_VERSION
+#define             POPPLER_CHECK_VERSION               (major,
+                                                         minor,
+                                                         micro)
+
+
+
+

Description

+

+Poppler provides version information, and information about features +enabled at compile time. This is primarily useful in configure checks +for builds that have a configure script, or for allowing code to optionally +depend but not require a specific poppler version. +

+
+
+

Details

+
+

POPPLER_HAS_CAIRO

+
#define POPPLER_HAS_CAIRO 1
+
+

+Defined if poppler was compiled with cairo support. +

+
+
+
+

POPPLER_MAJOR_VERSION

+
#define POPPLER_MAJOR_VERSION (0)
+
+

+The major version number of the poppler header files (e.g. in poppler version +0.1.2 this is 0.) +

+

Since 0.12

+
+
+
+

POPPLER_MINOR_VERSION

+
#define POPPLER_MINOR_VERSION (20)
+
+

+The major version number of the poppler header files (e.g. in poppler version +0.1.2 this is 1.) +

+

Since 0.12

+
+
+
+

POPPLER_MICRO_VERSION

+
#define POPPLER_MICRO_VERSION (4)
+
+

+The micro version number of the poppler header files (e.g. in poppler version +0.1.2 this is 2.) +

+

Since 0.12

+
+
+
+

POPPLER_CHECK_VERSION()

+
#define             POPPLER_CHECK_VERSION(major,minor,micro)
+

+Checks the version fo the poppler library +

+
++ + + + + + + + + + + + + + + + + + +

major :

major version (e.g. 0 for version 0.1.2)

minor :

minor version (e.g. 1 for version 0.1.2)

micro :

micro version (e.g. 2 for version 0.1.2)

Returns :

+TRUE if the version of the poppler header files is the same +as or newer than the passed-in version
+

Since 0.12

+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/poppler-poppler.html b/glib/reference/html/poppler-poppler.html new file mode 100644 index 0000000..dc853f6 --- /dev/null +++ b/glib/reference/html/poppler-poppler.html @@ -0,0 +1,324 @@ + + + + +poppler + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

poppler

+

poppler

+
+
+

Synopsis

+
+#include <poppler.h>
+
+#define             POPPLER_ERROR
+enum                PopplerError;
+enum                PopplerOrientation;
+enum                PopplerBackend;
+                    PopplerColor;
+enum                PopplerPrintFlags;
+PopplerBackend      poppler_get_backend                 (void);
+const char *        poppler_get_version                 (void);
+gboolean            poppler_date_parse                  (const gchar *date,
+                                                         time_t *timet);
+PopplerColor *      poppler_color_new                   (void);
+PopplerColor *      poppler_color_copy                  (PopplerColor *color);
+void                poppler_color_free                  (PopplerColor *color);
+
+
+
+

Description

+
+
+

Details

+
+

POPPLER_ERROR

+
#define POPPLER_ERROR poppler_error_quark ()
+
+
+
+
+

enum PopplerError

+
typedef enum {
+  POPPLER_ERROR_INVALID,
+  POPPLER_ERROR_ENCRYPTED,
+  POPPLER_ERROR_OPEN_FILE,
+  POPPLER_ERROR_BAD_CATALOG,
+  POPPLER_ERROR_DAMAGED
+} PopplerError;
+
+

+Error codes returned by PopplerDocument +

+
++ + + + + + + + + + + + + + + + + + + + + + +

POPPLER_ERROR_INVALID

Generic error when a document opration fails +

POPPLER_ERROR_ENCRYPTED

Document is encrypted +

POPPLER_ERROR_OPEN_FILE

File could not be opened for writing when saving document +

POPPLER_ERROR_BAD_CATALOG

Failed to read the document catalog +

POPPLER_ERROR_DAMAGED

Document is damaged +
+
+
+
+

enum PopplerOrientation

+
typedef enum {
+  POPPLER_ORIENTATION_PORTRAIT,
+  POPPLER_ORIENTATION_LANDSCAPE,
+  POPPLER_ORIENTATION_UPSIDEDOWN,
+  POPPLER_ORIENTATION_SEASCAPE
+} PopplerOrientation;
+
+
+
+
+

enum PopplerBackend

+
typedef enum {
+  POPPLER_BACKEND_UNKNOWN,
+  POPPLER_BACKEND_SPLASH,
+  POPPLER_BACKEND_CAIRO
+} PopplerBackend;
+
+
+
+
+

PopplerColor

+
typedef struct {
+  guint16 red;
+  guint16 green;
+  guint16 blue;
+} PopplerColor;
+
+

+A PopplerColor describes a RGB color. Color components +are values between 0 and 65535 +

+
++ + + + + + + + + + + + + + +

guint16 red;

the red componment of color

guint16 green;

the green component of color

guint16 blue;

the blue component of color
+
+
+
+

enum PopplerPrintFlags

+
typedef enum {
+  POPPLER_PRINT_DOCUMENT          = 0,
+  POPPLER_PRINT_MARKUP_ANNOTS     = 1 << 0,
+  POPPLER_PRINT_STAMP_ANNOTS_ONLY = 1 << 1,
+  POPPLER_PRINT_ALL               = POPPLER_PRINT_MARKUP_ANNOTS
+} PopplerPrintFlags;
+
+

+Printing flags +

+
++ + + + + + + + + + + + + + + + + + +

POPPLER_PRINT_DOCUMENT

print main document contents +

POPPLER_PRINT_MARKUP_ANNOTS

print document and markup annotations +

POPPLER_PRINT_STAMP_ANNOTS_ONLY

print document and only stamp annotations +

POPPLER_PRINT_ALL

print main document contents and all markup annotations +
+

Since 0.16

+
+
+
+

poppler_get_backend ()

+
PopplerBackend      poppler_get_backend                 (void);
+

+Returns the backend compiled into the poppler library. +

+
++ + + + +

Returns :

The backend used by poppler
+
+
+
+

poppler_get_version ()

+
const char *        poppler_get_version                 (void);
+

+Returns the version of poppler in use. This result is not to be freed. +

+
++ + + + +

Returns :

the version of poppler.
+
+
+
+

poppler_date_parse ()

+
gboolean            poppler_date_parse                  (const gchar *date,
+                                                         time_t *timet);
+

+Parses a PDF format date string and converts it to a time_t. Returns FALSE +if the parsing fails or the input string is not a valid PDF format date string +

+
++ + + + + + + + + + + + + + +

date :

string to parse

timet :

an uninitialized time_t +

Returns :

+TRUE, if timet was set
+

Since 0.12

+
+
+
+

poppler_color_new ()

+
PopplerColor *      poppler_color_new                   (void);
+

+Creates a new PopplerColor +

+
++ + + + +

Returns :

a new PopplerColor, use poppler_color_free() to free it
+
+
+
+

poppler_color_copy ()

+
PopplerColor *      poppler_color_copy                  (PopplerColor *color);
+

+Creates a copy of color +

+
++ + + + + + + + + + +

color :

a PopplerColor to copy

Returns :

a new allocated copy of color +
+
+
+
+

poppler_color_free ()

+
void                poppler_color_free                  (PopplerColor *color);
+

+Frees the given PopplerColor +

+
++ + + + +

color :

a PopplerColor +
+
+
+
+ + + \ No newline at end of file diff --git a/glib/reference/html/poppler.devhelp2 b/glib/reference/html/poppler.devhelp2 new file mode 100644 index 0000000..acae862 --- /dev/null +++ b/glib/reference/html/poppler.devhelp2 @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/glib/reference/html/right.png b/glib/reference/html/right.png new file mode 100644 index 0000000..ed55207 Binary files /dev/null and b/glib/reference/html/right.png differ diff --git a/glib/reference/html/style.css b/glib/reference/html/style.css new file mode 100644 index 0000000..d6f6c26 --- /dev/null +++ b/glib/reference/html/style.css @@ -0,0 +1,266 @@ +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + border: solid 1px #d3d7cf; + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + background: #e6f3ff; + border: solid 1px #729fcf; + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +@media screen { + sup a.footnote + { + position: relative; + top: 0em ! important; + + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 3.2em; + padding-bottom: 20em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + /* tango:scarlet red 0/1 */ + background: #ffe6e6; + border: solid 1px #ef2929; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + z-index: 10; + } + .navigation a, .navigation a:visited + { + /* tango:scarlet red 3 */ + color: #a40000; + } + .navigation a:hover + { + /* tango:scarlet red 1 */ + color: #ef2929; + } + td.shortcuts + { + /* tango:scarlet red 1 */ + color: #ef2929; + font-size: 80%; + white-space: nowrap; + } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + /* tango:scarlet red 0/1 */ + background: #ffe6e6; + border: solid 1px #ef2929; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + +.navigation .title +{ + font-size: 200%; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +hr +{ + /* tango:aluminium 3 */ + color: #babdb6; + background: #babdb6; + border: none 0px; + height: 1px; + clear: both; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + border-color: #ffb04f; +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + border-color: #abf562; +} +.note, .warning +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; +} +.note h3, .warning h3 +{ + margin-top: 0.0em +} +.note p, .warning p +{ + margin-bottom: 0.0em +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-size: 80%; + font-weight: normal; +} + +/* code listings */ + +.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.listing_code .programlisting .function { color: #000000; font-weight: bold; } +.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .normal { color: #000000; } +.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.listing_code .programlisting .type { color: #000000; } +.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + diff --git a/glib/reference/html/up.png b/glib/reference/html/up.png new file mode 100644 index 0000000..8eb591f Binary files /dev/null and b/glib/reference/html/up.png differ diff --git a/glib/reference/poppler-docs.sgml b/glib/reference/poppler-docs.sgml new file mode 100644 index 0000000..d15bd18 --- /dev/null +++ b/glib/reference/poppler-docs.sgml @@ -0,0 +1,59 @@ + + +]> + + + Poppler Reference Manual + + for Poppler &version; + + + + + Poppler + + + + + + + + + + + + + + + Index of all symbols + + + + Index of deprecated symbols + + + + Index of new symbols in 0.12 + + + + Index of new symbols in 0.14 + + + + Index of new symbols in 0.16 + + + + Index of new symbols in 0.18 + + + + Index of new symbols in 0.20 + + + + + diff --git a/glib/reference/poppler-overrides.txt b/glib/reference/poppler-overrides.txt new file mode 100644 index 0000000..e69de29 diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt new file mode 100644 index 0000000..5a6708b --- /dev/null +++ b/glib/reference/poppler-sections.txt @@ -0,0 +1,539 @@ +poppler.h + +
+poppler-page +PopplerPage +PopplerPage +PopplerRectangle +PopplerPageTransition +PopplerLinkMapping +PopplerImageMapping +PopplerFormFieldMapping +PopplerAnnotMapping +PopplerPageTransitionType +PopplerPageTransitionAlignment +PopplerPageTransitionDirection +PopplerSelectionStyle +PopplerTextAttributes +poppler_page_get_index +poppler_page_get_label +poppler_page_get_size +poppler_page_get_crop_box +poppler_page_get_duration +poppler_page_get_transition +poppler_page_get_thumbnail_size +poppler_page_get_thumbnail +poppler_page_render +poppler_page_render_for_printing +poppler_page_render_for_printing_with_options +poppler_page_render_to_ps +poppler_page_render_selection +poppler_page_get_selected_region +poppler_page_get_selection_region +poppler_page_selection_region_free +poppler_page_get_selected_text +poppler_page_find_text +poppler_page_get_text +poppler_page_get_text_layout +poppler_page_get_text_attributes +poppler_page_free_text_attributes +poppler_page_get_link_mapping +poppler_page_free_link_mapping +poppler_page_get_image_mapping +poppler_page_get_image +poppler_page_free_image_mapping +poppler_page_get_form_field_mapping +poppler_page_free_form_field_mapping +poppler_page_get_annot_mapping +poppler_page_free_annot_mapping +poppler_page_add_annot +poppler_rectangle_new +poppler_rectangle_copy +poppler_rectangle_free +poppler_page_transition_new +poppler_page_transition_copy +poppler_page_transition_free +poppler_link_mapping_new +poppler_link_mapping_copy +poppler_link_mapping_free +poppler_image_mapping_new +poppler_image_mapping_copy +poppler_image_mapping_free +poppler_form_field_mapping_new +poppler_form_field_mapping_copy +poppler_form_field_mapping_free +poppler_annot_mapping_new +poppler_annot_mapping_copy +poppler_annot_mapping_free +poppler_text_attributes_new +poppler_text_attributes_copy +poppler_text_attributes_free + + +POPPLER_PAGE +POPPLER_IS_PAGE +POPPLER_TYPE_PAGE +POPPLER_TYPE_RECTANGLE +POPPLER_TYPE_TEXT_ATTRIBUTES +POPPLER_TYPE_PAGE_TRANSITION +POPPLER_TYPE_LINK_MAPPING +POPPLER_TYPE_IMAGE_MAPPING +POPPLER_TYPE_FORM_FIELD_MAPPING +POPPLER_TYPE_ANNOT_MAPPING +POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT +POPPLER_TYPE_PAGE_TRANSITION_DIRECTION +POPPLER_TYPE_PAGE_TRANSITION_TYPE +POPPLER_TYPE_SELECTION_STYLE + +poppler_page_get_type +poppler_rectangle_get_type +poppler_page_transition_get_type +poppler_link_mapping_get_type +poppler_image_mapping_get_type +poppler_form_field_mapping_get_type +poppler_annot_mapping_get_type +poppler_page_transition_alignment_get_type +poppler_page_transition_direction_get_type +poppler_page_transition_type_get_type +poppler_selection_style_get_type +poppler_text_attributes_get_type +
+ +
+poppler-document +PopplerDocument +PopplerDocument +PopplerIndexIter +PopplerFontsIter +PopplerLayersIter +PopplerPageLayout +PopplerPageMode +PopplerFontInfo +PopplerFontType +PopplerPSFile +PopplerViewerPreferences +PopplerPermissions +poppler_document_new_from_file +poppler_document_new_from_data +poppler_document_save +poppler_document_save_a_copy +poppler_document_get_id +poppler_document_get_pdf_version_string +poppler_document_get_pdf_version +poppler_document_get_title +poppler_document_get_author +poppler_document_get_subject +poppler_document_get_keywords +poppler_document_get_creator +poppler_document_get_producer +poppler_document_get_creation_date +poppler_document_get_modification_date +poppler_document_get_page_layout +poppler_document_get_page_mode +poppler_document_get_permissions +poppler_document_get_metadata +poppler_document_is_linearized +poppler_document_get_n_pages +poppler_document_get_page +poppler_document_get_page_by_label +poppler_document_find_dest +poppler_document_get_n_attachments +poppler_document_has_attachments +poppler_document_get_attachments +poppler_document_get_form_field +poppler_index_iter_new +poppler_index_iter_copy +poppler_index_iter_free +poppler_index_iter_get_child +poppler_index_iter_is_open +poppler_index_iter_get_action +poppler_index_iter_next +poppler_font_info_new +poppler_font_info_scan +poppler_font_info_free +poppler_fonts_iter_copy +poppler_fonts_iter_free +poppler_fonts_iter_get_name +poppler_fonts_iter_get_full_name +poppler_fonts_iter_get_font_type +poppler_fonts_iter_get_substitute_name +poppler_fonts_iter_get_file_name +poppler_fonts_iter_get_encoding +poppler_fonts_iter_is_embedded +poppler_fonts_iter_is_subset +poppler_fonts_iter_next +poppler_layers_iter_new +poppler_layers_iter_copy +poppler_layers_iter_free +poppler_layers_iter_get_child +poppler_layers_iter_get_layer +poppler_layers_iter_get_title +poppler_layers_iter_next +poppler_ps_file_new +poppler_ps_file_free +poppler_ps_file_set_paper_size +poppler_ps_file_set_duplex + + +POPPLER_DOCUMENT +POPPLER_IS_DOCUMENT +POPPLER_TYPE_DOCUMENT +POPPLER_FONT_INFO +POPPLER_IS_FONT_INFO +POPPLER_TYPE_FONT_INFO +POPPLER_TYPE_FONTS_ITER +POPPLER_TYPE_INDEX_ITER +POPPLER_TYPE_LAYER +POPPLER_TYPE_LAYERS_ITER +POPPLER_PS_FILE +POPPLER_IS_PS_FILE +POPPLER_TYPE_PS_FILE +POPPLER_TYPE_FONT_TYPE +POPPLER_TYPE_PAGE_LAYOUT +POPPLER_TYPE_PAGE_MODE +POPPLER_TYPE_PERMISSIONS +POPPLER_TYPE_VIEWER_PREFERENCES + + +poppler_document_get_type +poppler_index_iter_get_type +poppler_font_info_get_type +poppler_fonts_iter_get_type +poppler_layers_iter_get_type +poppler_ps_file_get_type +poppler_font_type_get_type +poppler_page_layout_get_type +poppler_page_mode_get_type +poppler_permissions_get_type +poppler_viewer_preferences_get_type +
+ +
+poppler-action +PopplerAction +PopplerAction +PopplerDest +PopplerActionAny +PopplerActionGotoDest +PopplerActionGotoRemote +PopplerActionLaunch +PopplerActionUri +PopplerActionNamed +PopplerActionMovie +PopplerActionRendition +PopplerActionOCGState +PopplerActionJavascript +PopplerActionType +PopplerDestType +PopplerActionMovieOperation +PopplerActionLayer +PopplerActionLayerAction +poppler_action_copy +poppler_action_free +poppler_dest_copy +poppler_dest_free + + +POPPLER_ACTION +POPPLER_TYPE_ACTION +POPPLER_TYPE_ACTION_TYPE +POPPLER_TYPE_DEST +POPPLER_TYPE_DEST_TYPE +POPPLER_TYPE_ACTION_LAYER_ACTION +POPPLER_TYPE_ACTION_MOVIE_OPERATION + + + +poppler_action_get_type +poppler_dest_get_type +poppler_action_type_get_type +poppler_dest_type_get_type +poppler_action_layer_action_get_type +poppler_action_movie_operation_get_type +
+ +
+poppler-attachment +PopplerAttachment +PopplerAttachment +PopplerAttachmentSaveFunc +poppler_attachment_save +poppler_attachment_save_to_callback + + +POPPLER_ATTACHMENT +POPPLER_IS_ATTACHMENT +POPPLER_TYPE_ATTACHMENT + + +poppler_attachment_get_type +
+ +
+poppler-form-field +PopplerFormField +PopplerFormField +PopplerFormFieldType +PopplerFormButtonType +PopplerFormChoiceType +PopplerFormTextType +poppler_form_field_get_field_type +poppler_form_field_get_id +poppler_form_field_is_read_only +poppler_form_field_get_font_size +poppler_form_field_get_partial_name +poppler_form_field_get_mapping_name +poppler_form_field_get_name +poppler_form_field_get_action +poppler_form_field_button_get_button_type +poppler_form_field_button_get_state +poppler_form_field_button_set_state +poppler_form_field_choice_get_choice_type +poppler_form_field_choice_can_select_multiple +poppler_form_field_choice_commit_on_change +poppler_form_field_choice_do_spell_check +poppler_form_field_choice_get_item +poppler_form_field_choice_get_n_items +poppler_form_field_choice_get_text +poppler_form_field_choice_set_text +poppler_form_field_choice_is_editable +poppler_form_field_choice_is_item_selected +poppler_form_field_choice_select_item +poppler_form_field_choice_toggle_item +poppler_form_field_choice_unselect_all +poppler_form_field_text_get_text_type +poppler_form_field_text_get_text +poppler_form_field_text_set_text +poppler_form_field_text_get_max_len +poppler_form_field_text_do_scroll +poppler_form_field_text_do_spell_check +poppler_form_field_text_is_password +poppler_form_field_text_is_rich_text + + +POPPLER_FORM_FIELD +POPPLER_IS_FORM_FIELD +POPPLER_TYPE_FORM_FIELD +POPPLER_TYPE_FORM_BUTTON_TYPE +POPPLER_TYPE_FORM_CHOICE_TYPE +POPPLER_TYPE_FORM_FIELD_TYPE +POPPLER_TYPE_FORM_TEXT_TYPE + + +poppler_form_field_get_type +poppler_form_field_type_get_type +poppler_form_button_type_get_type +poppler_form_choice_type_get_type +poppler_form_text_type_get_type +
+ +
+poppler +POPPLER_ERROR +PopplerError +PopplerOrientation +PopplerBackend +PopplerColor +PopplerPrintFlags +poppler_get_backend +poppler_get_version +poppler_date_parse +poppler_color_new +poppler_color_copy +poppler_color_free + + +POPPLER_TYPE_COLOR +POPPLER_TYPE_BACKEND +POPPLER_TYPE_ERROR +POPPLER_TYPE_ORIENTATION +POPPLER_TYPE_PRINT_FLAGS + + +POPPLER_DEFINE_BOXED_TYPE +poppler_error_get_type +poppler_error_quark +poppler_backend_get_type +poppler_color_get_type +poppler_orientation_get_type +poppler_print_flags_get_type +
+ +
+poppler-annot +PopplerAnnot +PopplerAnnot +PopplerAnnotMarkup +PopplerAnnotText +PopplerAnnotFreeText +PopplerAnnotFileAttachment +PopplerAnnotMovie +PopplerAnnotScreen +PopplerAnnotType +PopplerAnnotFlag +PopplerAnnotExternalDataType +PopplerAnnotMarkupReplyType +PopplerAnnotTextState +PopplerAnnotCalloutLine +PopplerAnnotFreeTextQuadding +poppler_annot_get_annot_type +poppler_annot_get_flags +poppler_annot_get_name +poppler_annot_get_page_index +poppler_annot_get_color +poppler_annot_set_color +poppler_annot_get_contents +poppler_annot_set_contents +poppler_annot_get_modified +poppler_annot_markup_get_label +poppler_annot_markup_set_label +poppler_annot_markup_get_subject +poppler_annot_markup_get_opacity +poppler_annot_markup_set_opacity +poppler_annot_markup_has_popup +poppler_annot_markup_set_popup +poppler_annot_markup_get_popup_is_open +poppler_annot_markup_set_popup_is_open +poppler_annot_markup_get_popup_rectangle +poppler_annot_markup_get_date +poppler_annot_markup_get_external_data +poppler_annot_markup_get_reply_to +poppler_annot_text_new +poppler_annot_text_get_icon +POPPLER_ANNOT_TEXT_ICON_NOTE +POPPLER_ANNOT_TEXT_ICON_COMMENT +POPPLER_ANNOT_TEXT_ICON_KEY +POPPLER_ANNOT_TEXT_ICON_HELP +POPPLER_ANNOT_TEXT_ICON_NEW_PARAGRAPH +POPPLER_ANNOT_TEXT_ICON_PARAGRAPH +POPPLER_ANNOT_TEXT_ICON_INSERT +POPPLER_ANNOT_TEXT_ICON_CROSS +POPPLER_ANNOT_TEXT_ICON_CIRCLE +poppler_annot_text_set_icon +poppler_annot_text_get_is_open +poppler_annot_text_set_is_open +poppler_annot_text_get_state +poppler_annot_free_text_get_callout_line +poppler_annot_free_text_get_quadding +poppler_annot_file_attachment_get_attachment +poppler_annot_file_attachment_get_name +poppler_annot_screen_get_action +poppler_annot_movie_get_movie +poppler_annot_movie_get_title +poppler_annot_callout_line_new +poppler_annot_callout_line_copy +poppler_annot_callout_line_free + + +POPPLER_ANNOT +POPPLER_IS_ANNOT +POPPLER_TYPE_ANNOT +POPPLER_ANNOT_FILE_ATTACHMENT +POPPLER_IS_ANNOT_FILE_ATTACHMENT +POPPLER_TYPE_ANNOT_FILE_ATTACHMENT +POPPLER_ANNOT_FREE_TEXT +POPPLER_IS_ANNOT_FREE_TEXT +POPPLER_TYPE_ANNOT_FREE_TEXT +POPPLER_ANNOT_MARKUP +POPPLER_IS_ANNOT_MARKUP +POPPLER_TYPE_ANNOT_MARKUP +POPPLER_ANNOT_MOVIE +POPPLER_IS_ANNOT_MOVIE +POPPLER_TYPE_ANNOT_MOVIE +POPPLER_ANNOT_SCREEN +POPPLER_IS_ANNOT_SCREEN +POPPLER_TYPE_ANNOT_SCREEN +POPPLER_ANNOT_TEXT +POPPLER_IS_ANNOT_TEXT +POPPLER_TYPE_ANNOT_TEXT +POPPLER_TYPE_ANNOT_CALLOUT_LINE +POPPLER_TYPE_ANNOT_EXTERNAL_DATA_TYPE +POPPLER_TYPE_ANNOT_FLAG +POPPLER_TYPE_ANNOT_MARKUP_REPLY_TYPE +POPPLER_TYPE_ANNOT_TEXT_STATE +POPPLER_TYPE_ANNOT_FREE_TEXT_QUADDING +POPPLER_TYPE_ANNOT_TYPE + + +poppler_annot_get_type +poppler_annot_type_get_type +poppler_annot_markup_get_type +poppler_annot_text_get_type +poppler_annot_free_text_get_type +poppler_annot_file_attachment_get_type +poppler_annot_screen_get_type +poppler_annot_movie_get_type +poppler_annot_flag_get_type +poppler_annot_external_data_type_get_type +poppler_annot_markup_reply_type_get_type +poppler_annot_callout_line_get_type +poppler_annot_text_state_get_type +poppler_annot_free_text_quadding_get_type +
+ +
+poppler-layer +PopplerLayer +PopplerLayer +poppler_layer_get_title +poppler_layer_is_visible +poppler_layer_show +poppler_layer_hide +poppler_layer_is_parent +poppler_layer_get_radio_button_group_id + + +POPPLER_LAYER +POPPLER_IS_LAYER +POPPLER_TYPE_LAYER + + +Layer +poppler_layer_get_type +
+ +
+poppler-media +PopplerMedia +PopplerMedia +PopplerMediaSaveFunc +poppler_media_get_filename +poppler_media_get_mime_type +poppler_media_is_embedded +poppler_media_save +poppler_media_save_to_callback + + +POPPLER_MEDIA +POPPLER_IS_MEDIA +POPPLER_TYPE_MEDIA + + +poppler_media_get_type +
+ +
+poppler-movie +PopplerMovie +PopplerMovie +poppler_movie_get_filename +poppler_movie_need_poster +poppler_movie_show_controls + + +POPPLER_MOVIE +POPPLER_IS_MOVIE +POPPLER_TYPE_MOVIE + +poppler_movie_get_type + +
+ +
+poppler-features +POPPLER_HAS_CAIRO +POPPLER_MAJOR_VERSION +POPPLER_MINOR_VERSION +POPPLER_MICRO_VERSION +POPPLER_CHECK_VERSION +
diff --git a/glib/reference/poppler.types b/glib/reference/poppler.types new file mode 100644 index 0000000..eed9849 --- /dev/null +++ b/glib/reference/poppler.types @@ -0,0 +1,10 @@ +#include + +poppler_document_get_type +poppler_page_get_type +poppler_attachment_get_type +poppler_form_field_get_type +poppler_annot_get_type +poppler_layer_get_type +poppler_media_get_type +poppler_movie_get_type diff --git a/glib/reference/version.xml b/glib/reference/version.xml new file mode 100644 index 0000000..6dd4602 --- /dev/null +++ b/glib/reference/version.xml @@ -0,0 +1 @@ +0.20.4 diff --git a/glib/reference/version.xml.in b/glib/reference/version.xml.in new file mode 100644 index 0000000..9b6e99e --- /dev/null +++ b/glib/reference/version.xml.in @@ -0,0 +1 @@ +@POPPLER_VERSION@ diff --git a/goo/FixedPoint.cc b/goo/FixedPoint.cc new file mode 100644 index 0000000..26b2f0f --- /dev/null +++ b/goo/FixedPoint.cc @@ -0,0 +1,135 @@ +//======================================================================== +// +// FixedPoint.cc +// +// Fixed point type, with C++ operators. +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#if USE_FIXEDPOINT + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "FixedPoint.h" + +#define ln2 ((FixedPoint)0.69314718) + +#define ln2 ((FixedPoint)0.69314718) + +FixedPoint FixedPoint::sqrt(FixedPoint x) { + FixedPoint y0, y1, z; + + if (x.val <= 0) { + y1.val = 0; + } else { + y1.val = x.val == 1 ? 2 : x.val >> 1; + do { + y0.val = y1.val; + z = x / y0; + y1.val = (y0.val + z.val) >> 1; + } while (::abs(y0.val - y1.val) > 1); + } + return y1; +} + +FixedPoint FixedPoint::pow(FixedPoint x, FixedPoint y) { + FixedPoint t, t2, lnx0, lnx, z0, z; + int d, n, i; + + if (y.val <= 0) { + z.val = 0; + } else { + // y * ln(x) + t = (x - 1) / (x + 1); + t2 = t * t; + d = 1; + lnx = 0; + do { + lnx0 = lnx; + lnx += t / d; + t *= t2; + d += 2; + } while (::abs(lnx.val - lnx0.val) > 2); + lnx.val <<= 1; + t = y * lnx; + // exp(y * ln(x)) + n = floor(t / ln2); + t -= ln2 * n; + t2 = t; + d = 1; + i = 1; + z = 1; + do { + z0 = z; + z += t2 / d; + t2 *= t; + ++i; + d *= i; + } while (::abs(z.val - z0.val) > 2 && d < (1 << fixptShift)); + if (n >= 0) { + z.val <<= n; + } else if (n < 0) { + z.val >>= -n; + } + } + return z; +} + +int FixedPoint::mul(int x, int y) { + FixPtInt64 z; + + z = ((FixPtInt64)x * y) >> fixptShift; + if (z > 0x7fffffffLL) { + return 0x7fffffff; + } else if (z < -0x80000000LL) { + return 0x80000000; + } else { + return (int)z; + } +} + +int FixedPoint::div(int x, int y) { + FixPtInt64 z; + + z = ((FixPtInt64)x << fixptShift) / y; + if (z > 0x7fffffffLL) { + return 0x7fffffff; + } else if (z < -0x80000000LL) { + return 0x80000000; + } else { + return (int)z; + } +} + +GBool FixedPoint::divCheck(FixedPoint x, FixedPoint y, FixedPoint *result) { + FixPtInt64 z; + + z = ((FixPtInt64)x.val << fixptShift) / y.val; + if ((z == 0 && x != 0) || + z >= ((FixPtInt64)1 << 31) || z < -((FixPtInt64)1 << 31)) { + return gFalse; + } + result->val = z; + return gTrue; +} + +GBool FixedPoint::checkDet(FixedPoint m11, FixedPoint m12, + FixedPoint m21, FixedPoint m22, + FixedPoint epsilon) { + FixPtInt64 det, e; + + det = (FixPtInt64)m11.val * (FixPtInt64)m22.val + - (FixPtInt64)m12.val * (FixPtInt64)m21.val; + e = (FixPtInt64)epsilon.val << fixptShift; + // NB: this comparison has to be >= not > because epsilon can be + // truncated to zero as a fixed point value. + return det >= e || det <= -e; +} + +#endif // USE_FIXEDPOINT diff --git a/goo/FixedPoint.h b/goo/FixedPoint.h new file mode 100644 index 0000000..9974980 --- /dev/null +++ b/goo/FixedPoint.h @@ -0,0 +1,166 @@ +//======================================================================== +// +// FixedPoint.h +// +// Fixed point type, with C++ operators. +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FIXEDPOINT_H +#define FIXEDPOINT_H + +#include "poppler-config.h" + +#if USE_FIXEDPOINT + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include +#include "gtypes.h" + +#define fixptShift 16 +#define fixptMaskL ((1 << fixptShift) - 1) +#define fixptMaskH (~fixptMaskL) + +typedef long long FixPtInt64; + +class FixedPoint { +public: + + FixedPoint() { val = 0; } + FixedPoint(const FixedPoint &x) { val = x.val; } + FixedPoint(double x) { val = (int)(x * (1 << fixptShift) + 0.5); } + FixedPoint(int x) { val = x << fixptShift; } + FixedPoint(long x) { val = x << fixptShift; } + + operator float() + { return (float) val * ((float)1 / (float)(1 << fixptShift)); } + operator double() + { return (double) val * (1.0 / (double)(1 << fixptShift)); } + operator int() + { return val >> fixptShift; } + + int get16Dot16() { return val; } + + FixedPoint operator =(FixedPoint x) { val = x.val; return *this; } + + int operator ==(FixedPoint x) { return val == x.val; } + int operator ==(double x) { return *this == (FixedPoint)x; } + int operator ==(int x) { return *this == (FixedPoint)x; } + int operator ==(long x) { return *this == (FixedPoint)x; } + + int operator !=(FixedPoint x) { return val != x.val; } + int operator !=(double x) { return *this != (FixedPoint)x; } + int operator !=(int x) { return *this != (FixedPoint)x; } + int operator !=(long x) { return *this != (FixedPoint)x; } + + int operator <(FixedPoint x) { return val < x.val; } + int operator <(double x) { return *this < (FixedPoint)x; } + int operator <(int x) { return *this < (FixedPoint)x; } + int operator <(long x) { return *this < (FixedPoint)x; } + + int operator <=(FixedPoint x) { return val <= x.val; } + int operator <=(double x) { return *this <= (FixedPoint)x; } + int operator <=(int x) { return *this <= (FixedPoint)x; } + int operator <=(long x) { return *this <= (FixedPoint)x; } + + int operator >(FixedPoint x) { return val > x.val; } + int operator >(double x) { return *this > (FixedPoint)x; } + int operator >(int x) { return *this > (FixedPoint)x; } + int operator >(long x) { return *this > (FixedPoint)x; } + + int operator >=(FixedPoint x) { return val >= x.val; } + int operator >=(double x) { return *this >= (FixedPoint)x; } + int operator >=(int x) { return *this >= (FixedPoint)x; } + int operator >=(long x) { return *this >= (FixedPoint)x; } + + FixedPoint operator -() { return make(-val); } + + FixedPoint operator +(FixedPoint x) { return make(val + x.val); } + FixedPoint operator +(double x) { return *this + (FixedPoint)x; } + FixedPoint operator +(int x) { return *this + (FixedPoint)x; } + FixedPoint operator +(long x) { return *this + (FixedPoint)x; } + + FixedPoint operator +=(FixedPoint x) { val = val + x.val; return *this; } + FixedPoint operator +=(double x) { return *this += (FixedPoint)x; } + FixedPoint operator +=(int x) { return *this += (FixedPoint)x; } + FixedPoint operator +=(long x) { return *this += (FixedPoint)x; } + + FixedPoint operator -(FixedPoint x) { return make(val - x.val); } + FixedPoint operator -(double x) { return *this - (FixedPoint)x; } + FixedPoint operator -(int x) { return *this - (FixedPoint)x; } + FixedPoint operator -(long x) { return *this - (FixedPoint)x; } + + FixedPoint operator -=(FixedPoint x) { val = val - x.val; return *this; } + FixedPoint operator -=(double x) { return *this -= (FixedPoint)x; } + FixedPoint operator -=(int x) { return *this -= (FixedPoint)x; } + FixedPoint operator -=(long x) { return *this -= (FixedPoint)x; } + + FixedPoint operator *(FixedPoint x) { return make(mul(val, x.val)); } + FixedPoint operator *(double x) { return *this * (FixedPoint)x; } + FixedPoint operator *(int x) { return *this * (FixedPoint)x; } + FixedPoint operator *(long x) { return *this * (FixedPoint)x; } + + FixedPoint operator *=(FixedPoint x) { val = mul(val, x.val); return *this; } + FixedPoint operator *=(double x) { return *this *= (FixedPoint)x; } + FixedPoint operator *=(int x) { return *this *= (FixedPoint)x; } + FixedPoint operator *=(long x) { return *this *= (FixedPoint)x; } + + FixedPoint operator /(FixedPoint x) { return make(div(val, x.val)); } + FixedPoint operator /(double x) { return *this / (FixedPoint)x; } + FixedPoint operator /(int x) { return *this / (FixedPoint)x; } + FixedPoint operator /(long x) { return *this / (FixedPoint)x; } + + FixedPoint operator /=(FixedPoint x) { val = div(val, x.val); return *this; } + FixedPoint operator /=(double x) { return *this /= (FixedPoint)x; } + FixedPoint operator /=(int x) { return *this /= (FixedPoint)x; } + FixedPoint operator /=(long x) { return *this /= (FixedPoint)x; } + + static FixedPoint abs(FixedPoint x) { return make(::abs(x.val)); } + + static int floor(FixedPoint x) { return x.val >> fixptShift; } + + static int ceil(FixedPoint x) + { return (x.val & fixptMaskL) ? ((x.val >> fixptShift) + 1) + : (x.val >> fixptShift); } + + static int round(FixedPoint x) + { return (x.val + (1 << (fixptShift - 1))) >> fixptShift; } + + // Computes (x+y)/2 avoiding overflow and LSbit accuracy issues. + static FixedPoint avg(FixedPoint x, FixedPoint y) + { return make((x.val >> 1) + (y.val >> 1) + ((x.val | y.val) & 1)); } + + + static FixedPoint sqrt(FixedPoint x); + + static FixedPoint pow(FixedPoint x, FixedPoint y); + + // Compute *result = x/y; return false if there is an underflow or + // overflow. + static GBool divCheck(FixedPoint x, FixedPoint y, FixedPoint *result); + + // Compute abs(m11*m22 - m12*m21) >= epsilon, handling the case + // where the multiplications overflow. + static GBool checkDet(FixedPoint m11, FixedPoint m12, + FixedPoint m21, FixedPoint m22, + FixedPoint epsilon); + +private: + + static FixedPoint make(int valA) { FixedPoint x; x.val = valA; return x; } + + static int mul(int x, int y); + static int div(int x, int y); + + int val; // fixed point: (n-fixptShift).(fixptShift) +}; + +#endif // USE_FIXEDPOINT + +#endif diff --git a/goo/GooHash.cc b/goo/GooHash.cc new file mode 100644 index 0000000..f4a92f1 --- /dev/null +++ b/goo/GooHash.cc @@ -0,0 +1,384 @@ +//======================================================================== +// +// GooHash.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "gmem.h" +#include "GooString.h" +#include "GooHash.h" + +//------------------------------------------------------------------------ + +struct GooHashBucket { + GooString *key; + union { + void *p; + int i; + } val; + GooHashBucket *next; +}; + +struct GooHashIter { + int h; + GooHashBucket *p; +}; + +//------------------------------------------------------------------------ + +GooHash::GooHash(GBool deleteKeysA) { + int h; + + deleteKeys = deleteKeysA; + size = 7; + tab = (GooHashBucket **)gmallocn(size, sizeof(GooHashBucket *)); + for (h = 0; h < size; ++h) { + tab[h] = NULL; + } + len = 0; +} + +GooHash::~GooHash() { + GooHashBucket *p; + int h; + + for (h = 0; h < size; ++h) { + while (tab[h]) { + p = tab[h]; + tab[h] = p->next; + if (deleteKeys) { + delete p->key; + } + delete p; + } + } + gfree(tab); +} + +void GooHash::add(GooString *key, void *val) { + GooHashBucket *p; + int h; + + // expand the table if necessary + if (len >= size) { + expand(); + } + + // add the new symbol + p = new GooHashBucket; + p->key = key; + p->val.p = val; + h = hash(key); + p->next = tab[h]; + tab[h] = p; + ++len; +} + +void GooHash::add(GooString *key, int val) { + GooHashBucket *p; + int h; + + // expand the table if necessary + if (len >= size) { + expand(); + } + + // add the new symbol + p = new GooHashBucket; + p->key = key; + p->val.i = val; + h = hash(key); + p->next = tab[h]; + tab[h] = p; + ++len; +} + +void GooHash::replace(GooString *key, void *val) { + GooHashBucket *p; + int h; + + if ((p = find(key, &h))) { + p->val.p = val; + if (deleteKeys) { + delete key; + } + } else { + add(key, val); + } +} + +void GooHash::replace(GooString *key, int val) { + GooHashBucket *p; + int h; + + if ((p = find(key, &h))) { + p->val.i = val; + if (deleteKeys) { + delete key; + } + } else { + add(key, val); + } +} + +void *GooHash::lookup(GooString *key) { + GooHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + return p->val.p; +} + +int GooHash::lookupInt(GooString *key) { + GooHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + return p->val.i; +} + +void *GooHash::lookup(const char *key) { + GooHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + return p->val.p; +} + +int GooHash::lookupInt(const char *key) { + GooHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + return p->val.i; +} + +void *GooHash::remove(GooString *key) { + GooHashBucket *p; + GooHashBucket **q; + void *val; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.p; + delete p; + --len; + return val; +} + +int GooHash::removeInt(GooString *key) { + GooHashBucket *p; + GooHashBucket **q; + int val; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.i; + delete p; + --len; + return val; +} + +void *GooHash::remove(const char *key) { + GooHashBucket *p; + GooHashBucket **q; + void *val; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.p; + delete p; + --len; + return val; +} + +int GooHash::removeInt(const char *key) { + GooHashBucket *p; + GooHashBucket **q; + int val; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.i; + delete p; + --len; + return val; +} + +void GooHash::startIter(GooHashIter **iter) { + *iter = new GooHashIter; + (*iter)->h = -1; + (*iter)->p = NULL; +} + +GBool GooHash::getNext(GooHashIter **iter, GooString **key, void **val) { + if (!*iter) { + return gFalse; + } + if ((*iter)->p) { + (*iter)->p = (*iter)->p->next; + } + while (!(*iter)->p) { + if (++(*iter)->h == size) { + delete *iter; + *iter = NULL; + return gFalse; + } + (*iter)->p = tab[(*iter)->h]; + } + *key = (*iter)->p->key; + *val = (*iter)->p->val.p; + return gTrue; +} + +GBool GooHash::getNext(GooHashIter **iter, GooString **key, int *val) { + if (!*iter) { + return gFalse; + } + if ((*iter)->p) { + (*iter)->p = (*iter)->p->next; + } + while (!(*iter)->p) { + if (++(*iter)->h == size) { + delete *iter; + *iter = NULL; + return gFalse; + } + (*iter)->p = tab[(*iter)->h]; + } + *key = (*iter)->p->key; + *val = (*iter)->p->val.i; + return gTrue; +} + +void GooHash::killIter(GooHashIter **iter) { + delete *iter; + *iter = NULL; +} + +void GooHash::expand() { + GooHashBucket **oldTab; + GooHashBucket *p; + int oldSize, h, i; + + oldSize = size; + oldTab = tab; + size = 2*size + 1; + tab = (GooHashBucket **)gmallocn(size, sizeof(GooHashBucket *)); + for (h = 0; h < size; ++h) { + tab[h] = NULL; + } + for (i = 0; i < oldSize; ++i) { + while (oldTab[i]) { + p = oldTab[i]; + oldTab[i] = oldTab[i]->next; + h = hash(p->key); + p->next = tab[h]; + tab[h] = p; + } + } + gfree(oldTab); +} + +GooHashBucket *GooHash::find(GooString *key, int *h) { + GooHashBucket *p; + + *h = hash(key); + for (p = tab[*h]; p; p = p->next) { + if (!p->key->cmp(key)) { + return p; + } + } + return NULL; +} + +GooHashBucket *GooHash::find(const char *key, int *h) { + GooHashBucket *p; + + *h = hash(key); + for (p = tab[*h]; p; p = p->next) { + if (!p->key->cmp(key)) { + return p; + } + } + return NULL; +} + +int GooHash::hash(GooString *key) { + const char *p; + unsigned int h; + int i; + + h = 0; + for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} + +int GooHash::hash(const char *key) { + const char *p; + unsigned int h; + + h = 0; + for (p = key; *p; ++p) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} diff --git a/goo/GooHash.h b/goo/GooHash.h new file mode 100644 index 0000000..b973a93 --- /dev/null +++ b/goo/GooHash.h @@ -0,0 +1,76 @@ +//======================================================================== +// +// GooHash.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GHASH_H +#define GHASH_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +class GooString; +struct GooHashBucket; +struct GooHashIter; + +//------------------------------------------------------------------------ + +class GooHash { +public: + + GooHash(GBool deleteKeysA = gFalse); + ~GooHash(); + void add(GooString *key, void *val); + void add(GooString *key, int val); + void replace(GooString *key, void *val); + void replace(GooString *key, int val); + void *lookup(GooString *key); + int lookupInt(GooString *key); + void *lookup(const char *key); + int lookupInt(const char *key); + void *remove(GooString *key); + int removeInt(GooString *key); + void *remove(const char *key); + int removeInt(const char *key); + int getLength() { return len; } + void startIter(GooHashIter **iter); + GBool getNext(GooHashIter **iter, GooString **key, void **val); + GBool getNext(GooHashIter **iter, GooString **key, int *val); + void killIter(GooHashIter **iter); + +private: + + void expand(); + GooHashBucket *find(GooString *key, int *h); + GooHashBucket *find(const char *key, int *h); + int hash(GooString *key); + int hash(const char *key); + + GBool deleteKeys; // set if key strings should be deleted + int size; // number of buckets + int len; // number of entries + GooHashBucket **tab; +}; + +#define deleteGooHash(hash, T) \ + do { \ + GooHash *_hash = (hash); \ + { \ + GooHashIter *_iter; \ + GooString *_key; \ + void *_p; \ + _hash->startIter(&_iter); \ + while (_hash->getNext(&_iter, &_key, &_p)) { \ + delete (T*)_p; \ + } \ + delete _hash; \ + } \ + } while(0) + +#endif diff --git a/goo/GooLikely.h b/goo/GooLikely.h new file mode 100644 index 0000000..724ccf0 --- /dev/null +++ b/goo/GooLikely.h @@ -0,0 +1,22 @@ +//======================================================================== +// +// GooLikely.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2008 Kees Cook +// +//======================================================================== + +#ifndef GOOLIKELY_H +#define GOOLIKELY_H + +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +# define likely(x) __builtin_expect((x), 1) +# define unlikely(x) __builtin_expect((x), 0) +#else +# define likely(x) (x) +# define unlikely(x) (x) +#endif + +#endif diff --git a/goo/GooList.cc b/goo/GooList.cc new file mode 100644 index 0000000..6ce4952 --- /dev/null +++ b/goo/GooList.cc @@ -0,0 +1,122 @@ +//======================================================================== +// +// GooList.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "GooList.h" + +//------------------------------------------------------------------------ +// GooList +//------------------------------------------------------------------------ + +GooList::GooList() { + size = 8; + data = (void **)gmallocn(size, sizeof(void*)); + length = 0; + inc = 0; +} + +GooList::GooList(int sizeA) { + size = sizeA ? sizeA : 8; + data = (void **)gmallocn(size, sizeof(void*)); + length = 0; + inc = 0; +} + +GooList::~GooList() { + gfree(data); +} + +GooList *GooList::copy() { + GooList *ret; + + ret = new GooList(length); + ret->length = length; + memcpy(ret->data, data, length * sizeof(void *)); + ret->inc = inc; + return ret; +} + +void GooList::append(void *p) { + if (length >= size) { + expand(); + } + data[length++] = p; +} + +void GooList::append(GooList *list) { + int i; + + while (length + list->length > size) { + expand(); + } + for (i = 0; i < list->length; ++i) { + data[length++] = list->data[i]; + } +} + +void GooList::insert(int i, void *p) { + if (length >= size) { + expand(); + } + if (i < 0) { + i = 0; + } + if (i < length) { + memmove(data+i+1, data+i, (length - i) * sizeof(void *)); + } + data[i] = p; + ++length; +} + +void *GooList::del(int i) { + void *p; + + p = data[i]; + if (i < length - 1) { + memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *)); + } + --length; + if (size - length >= ((inc > 0) ? inc : size/2)) { + shrink(); + } + return p; +} + +void GooList::sort(int (*cmp)(const void *obj1, const void *obj2)) { + qsort(data, length, sizeof(void *), cmp); +} + +void GooList::reverse() { + void *t; + int n, i; + + n = length / 2; + for (i = 0; i < n; ++i) { + t = data[i]; + data[i] = data[length - 1 - i]; + data[length - 1 - i] = t; + } +} + +void GooList::expand() { + size += (inc > 0) ? inc : size; + data = (void **)greallocn(data, size, sizeof(void*)); +} + +void GooList::shrink() { + size -= (inc > 0) ? inc : size/2; + data = (void **)greallocn(data, size, sizeof(void*)); +} diff --git a/goo/GooList.h b/goo/GooList.h new file mode 100644 index 0000000..964568a --- /dev/null +++ b/goo/GooList.h @@ -0,0 +1,104 @@ +//======================================================================== +// +// GooList.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GLIST_H +#define GLIST_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ +// GooList +//------------------------------------------------------------------------ + +class GooList { +public: + + // Create an empty list. + GooList(); + + // Create an empty list with space for elements. + GooList(int sizeA); + + // Destructor - does not free pointed-to objects. + ~GooList(); + + //----- general + + // Get the number of elements. + int getLength() { return length; } + + // Returns a (shallow) copy of this list. + GooList *copy(); + + //----- ordered list support + + // Return the th element. + // Assumes 0 <= i < length. + void *get(int i) { return data[i]; } + + // Replace the th element. + // Assumes 0 <= i < length. + void put(int i, void *p) { data[i] = p; } + + // Append an element to the end of the list. + void append(void *p); + + // Append another list to the end of this one. + void append(GooList *list); + + // Insert an element at index . + // Assumes 0 <= i <= length. + void insert(int i, void *p); + + // Deletes and returns the element at index . + // Assumes 0 <= i < length. + void *del(int i); + + // Sort the list accoring to the given comparison function. + // NB: this sorts an array of pointers, so the pointer args need to + // be double-dereferenced. + void sort(int (*cmp)(const void *ptr1, const void *ptr2)); + + // Reverse the list. + void reverse(); + + //----- control + + // Set allocation increment to . If inc > 0, that many + // elements will be allocated every time the list is expanded. + // If inc <= 0, the list will be doubled in size. + void setAllocIncr(int incA) { inc = incA; } + +private: + + void expand(); + void shrink(); + + void **data; // the list elements + int size; // size of data array + int length; // number of elements on list + int inc; // allocation increment +}; + +#define deleteGooList(list, T) \ + do { \ + GooList *_list = (list); \ + { \ + int _i; \ + for (_i = 0; _i < _list->getLength(); ++_i) { \ + delete (T*)_list->get(_i); \ + } \ + delete _list; \ + } \ + } while (0) + +#endif diff --git a/goo/GooMutex.h b/goo/GooMutex.h new file mode 100644 index 0000000..3f53a62 --- /dev/null +++ b/goo/GooMutex.h @@ -0,0 +1,63 @@ +//======================================================================== +// +// GooMutex.h +// +// Portable mutex macros. +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 Kovid Goyal +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GMUTEX_H +#define GMUTEX_H + +// Usage: +// +// GooMutex m; +// gInitMutex(&m); +// ... +// gLockMutex(&m); +// ... critical section ... +// gUnlockMutex(&m); +// ... +// gDestroyMutex(&m); + +#ifdef _WIN32 + +#include + +typedef CRITICAL_SECTION GooMutex; + +#define gInitMutex(m) InitializeCriticalSection(m) +#define gDestroyMutex(m) DeleteCriticalSection(m) +#define gLockMutex(m) EnterCriticalSection(m) +#define gUnlockMutex(m) LeaveCriticalSection(m) + +#else // assume pthreads + +#include + +typedef pthread_mutex_t GooMutex; + +#define gInitMutex(m) pthread_mutex_init(m, NULL) +#define gDestroyMutex(m) pthread_mutex_destroy(m) +#define gLockMutex(m) pthread_mutex_lock(m) +#define gUnlockMutex(m) pthread_mutex_unlock(m) + +#endif + +#endif diff --git a/goo/GooString.cc b/goo/GooString.cc new file mode 100644 index 0000000..fc78d90 --- /dev/null +++ b/goo/GooString.cc @@ -0,0 +1,894 @@ +//======================================================================== +// +// GooString.cc +// +// Simple variable-length string type. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2007 Jeff Muizelaar +// Copyright (C) 2008-2011 Albert Astals Cid +// Copyright (C) 2011 Kenji Uno +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include +#include "gmem.h" +#include "GooString.h" + +static const int MAXIMUM_DOUBLE_PREC = 16; + +//------------------------------------------------------------------------ + +union GooStringFormatArg { + int i; + Guint ui; + long l; + Gulong ul; +#ifdef LLONG_MAX + long long ll; +#endif +#ifdef ULLONG_MAX + unsigned long long ull; +#endif + double f; + char c; + char *s; + GooString *gs; +}; + +enum GooStringFormatType { + fmtIntDecimal, + fmtIntHex, + fmtIntOctal, + fmtIntBinary, + fmtUIntDecimal, + fmtUIntHex, + fmtUIntOctal, + fmtUIntBinary, + fmtLongDecimal, + fmtLongHex, + fmtLongOctal, + fmtLongBinary, + fmtULongDecimal, + fmtULongHex, + fmtULongOctal, + fmtULongBinary, +#ifdef LLONG_MAX + fmtLongLongDecimal, + fmtLongLongHex, + fmtLongLongOctal, + fmtLongLongBinary, +#endif +#ifdef ULLONG_MAX + fmtULongLongDecimal, + fmtULongLongHex, + fmtULongLongOctal, + fmtULongLongBinary, +#endif + fmtDouble, + fmtDoubleTrimSmallAware, + fmtDoubleTrim, + fmtChar, + fmtString, + fmtGooString, + fmtSpace +}; + +static const char *formatStrings[] = { + "d", "x", "o", "b", "ud", "ux", "uo", "ub", + "ld", "lx", "lo", "lb", "uld", "ulx", "ulo", "ulb", +#ifdef LLONG_MAX + "lld", "llx", "llo", "llb", +#endif +#ifdef ULLONG_MAX + "ulld", "ullx", "ullo", "ullb", +#endif + "f", "gs", "g", + "c", + "s", + "t", + "w", + NULL +}; + +//------------------------------------------------------------------------ + +int inline GooString::roundedSize(int len) { + int delta; + if (len <= STR_STATIC_SIZE-1) + return STR_STATIC_SIZE; + delta = len < 256 ? 7 : 255; + return ((len + 1) + delta) & ~delta; +} + +// Make sure that the buffer is big enough to contain characters +// plus terminating 0. +// We assume that if this is being called from the constructor, was set +// to NULL and was set to 0 to indicate unused string before calling us. +void inline GooString::resize(int newLength) { + char *s1 = s; + + if (!s || (roundedSize(length) != roundedSize(newLength))) { + // requires re-allocating data for string + if (newLength < STR_STATIC_SIZE) { + s1 = sStatic; + } else { + // allocate a rounded amount + if (s == sStatic) + s1 = (char*)gmalloc(roundedSize(newLength)); + else + s1 = (char*)grealloc(s, roundedSize(newLength)); + } + if (s == sStatic || s1 == sStatic) { + // copy the minimum, we only need to if are moving to or + // from sStatic. + // assert(s != s1) the roundedSize condition ensures this + if (newLength < length) { + memcpy(s1, s, newLength); + } else { + memcpy(s1, s, length); + } + if (s != sStatic) + gfree(s); + } + + } + + s = s1; + length = newLength; + s[length] = '\0'; +} + +GooString* GooString::Set(const char *s1, int s1Len, const char *s2, int s2Len) +{ + int newLen = 0; + char *p; + + if (s1) { + if (CALC_STRING_LEN == s1Len) { + s1Len = strlen(s1); + } else + assert(s1Len >= 0); + newLen += s1Len; + } + + if (s2) { + if (CALC_STRING_LEN == s2Len) { + s2Len = strlen(s2); + } else + assert(s2Len >= 0); + newLen += s2Len; + } + + resize(newLen); + p = s; + if (s1) { + memcpy(p, s1, s1Len); + p += s1Len; + } + if (s2) { + memcpy(p, s2, s2Len); + p += s2Len; + } + return this; +} + +GooString::GooString() { + s = NULL; + length = 0; + Set(NULL); +} + +GooString::GooString(const char *sA) { + s = NULL; + length = 0; + Set(sA, CALC_STRING_LEN); +} + +GooString::GooString(const char *sA, int lengthA) { + s = NULL; + length = 0; + Set(sA, lengthA); +} + +GooString::GooString(GooString *str, int idx, int lengthA) { + s = NULL; + length = 0; + assert(idx + lengthA <= str->length); + Set(str->getCString() + idx, lengthA); +} + +GooString::GooString(const GooString *str) { + s = NULL; + length = 0; + Set(str->getCString(), str->length); +} + +GooString::GooString(GooString *str1, GooString *str2) { + s = NULL; + length = 0; + Set(str1->getCString(), str1->length, str2->getCString(), str2->length); +} + +GooString *GooString::fromInt(int x) { + char buf[24]; // enough space for 64-bit ints plus a little extra + char *p; + int len; + formatInt(x, buf, sizeof(buf), gFalse, 0, 10, &p, &len); + return new GooString(p, len); +} + +GooString *GooString::format(const char *fmt, ...) { + va_list argList; + GooString *s; + + s = new GooString(); + va_start(argList, fmt); + s->appendfv(fmt, argList); + va_end(argList); + return s; +} + +GooString *GooString::formatv(const char *fmt, va_list argList) { + GooString *s; + + s = new GooString(); + s->appendfv(fmt, argList); + return s; +} + +GooString::~GooString() { + if (s != sStatic) + gfree(s); +} + +GooString *GooString::clear() { + resize(0); + return this; +} + +GooString *GooString::append(char c) { + return append((const char*)&c, 1); +} + +GooString *GooString::append(GooString *str) { + return append(str->getCString(), str->getLength()); +} + +GooString *GooString::append(const char *str, int lengthA) { + int prevLen = length; + if (CALC_STRING_LEN == lengthA) + lengthA = strlen(str); + resize(length + lengthA); + memcpy(s + prevLen, str, lengthA); + return this; +} + +GooString *GooString::appendf(const char *fmt, ...) { + va_list argList; + + va_start(argList, fmt); + appendfv(fmt, argList); + va_end(argList); + return this; +} + +GooString *GooString::appendfv(const char *fmt, va_list argList) { + GooStringFormatArg *args; + int argsLen, argsSize; + GooStringFormatArg arg; + int idx, width, prec; + GBool reverseAlign, zeroFill; + GooStringFormatType ft; + char buf[65]; + int len, i; + const char *p0, *p1; + char *str; + + argsLen = 0; + argsSize = 8; + args = (GooStringFormatArg *)gmallocn(argsSize, sizeof(GooStringFormatArg)); + + p0 = fmt; + while (*p0) { + if (*p0 == '{') { + ++p0; + if (*p0 == '{') { + ++p0; + append('{'); + } else { + + // parse the format string + if (!(*p0 >= '0' && *p0 <= '9')) { + break; + } + idx = *p0 - '0'; + for (++p0; *p0 >= '0' && *p0 <= '9'; ++p0) { + idx = 10 * idx + (*p0 - '0'); + } + if (*p0 != ':') { + break; + } + ++p0; + if (*p0 == '-') { + reverseAlign = gTrue; + ++p0; + } else { + reverseAlign = gFalse; + } + width = 0; + zeroFill = *p0 == '0'; + for (; *p0 >= '0' && *p0 <= '9'; ++p0) { + width = 10 * width + (*p0 - '0'); + } + if (width < 0) { + width = 0; + } + if (*p0 == '.') { + ++p0; + prec = 0; + for (; *p0 >= '0' && *p0 <= '9'; ++p0) { + prec = 10 * prec + (*p0 - '0'); + } + } else { + prec = 0; + } + for (ft = (GooStringFormatType)0; + formatStrings[ft]; + ft = (GooStringFormatType)(ft + 1)) { + if (!strncmp(p0, formatStrings[ft], strlen(formatStrings[ft]))) { + break; + } + } + if (!formatStrings[ft]) { + break; + } + p0 += strlen(formatStrings[ft]); + if (*p0 != '}') { + break; + } + ++p0; + + // fetch the argument + if (idx > argsLen) { + break; + } + if (idx == argsLen) { + if (argsLen == argsSize) { + argsSize *= 2; + args = (GooStringFormatArg *)greallocn(args, argsSize, + sizeof(GooStringFormatArg)); + } + switch (ft) { + case fmtIntDecimal: + case fmtIntHex: + case fmtIntOctal: + case fmtIntBinary: + case fmtSpace: + args[argsLen].i = va_arg(argList, int); + break; + case fmtUIntDecimal: + case fmtUIntHex: + case fmtUIntOctal: + case fmtUIntBinary: + args[argsLen].ui = va_arg(argList, Guint); + break; + case fmtLongDecimal: + case fmtLongHex: + case fmtLongOctal: + case fmtLongBinary: + args[argsLen].l = va_arg(argList, long); + break; + case fmtULongDecimal: + case fmtULongHex: + case fmtULongOctal: + case fmtULongBinary: + args[argsLen].ul = va_arg(argList, Gulong); + break; +#ifdef LLONG_MAX + case fmtLongLongDecimal: + case fmtLongLongHex: + case fmtLongLongOctal: + case fmtLongLongBinary: + args[argsLen].ll = va_arg(argList, long long); + break; +#endif +#ifdef ULLONG_MAX + case fmtULongLongDecimal: + case fmtULongLongHex: + case fmtULongLongOctal: + case fmtULongLongBinary: + args[argsLen].ull = va_arg(argList, unsigned long long); + break; +#endif + case fmtDouble: + case fmtDoubleTrim: + case fmtDoubleTrimSmallAware: + args[argsLen].f = va_arg(argList, double); + break; + case fmtChar: + args[argsLen].c = (char)va_arg(argList, int); + break; + case fmtString: + args[argsLen].s = va_arg(argList, char *); + break; + case fmtGooString: + args[argsLen].gs = va_arg(argList, GooString *); + break; + } + ++argsLen; + } + + // format the argument + arg = args[idx]; + switch (ft) { + case fmtIntDecimal: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 10, &str, &len); + break; + case fmtIntHex: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 16, &str, &len); + break; + case fmtIntOctal: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtIntBinary: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtUIntDecimal: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 10, + &str, &len); + break; + case fmtUIntHex: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 16, + &str, &len); + break; + case fmtUIntOctal: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtUIntBinary: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtLongDecimal: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 10, &str, &len); + break; + case fmtLongHex: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 16, &str, &len); + break; + case fmtLongOctal: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtLongBinary: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtULongDecimal: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 10, + &str, &len); + break; + case fmtULongHex: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 16, + &str, &len); + break; + case fmtULongOctal: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtULongBinary: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; +#ifdef LLONG_MAX + case fmtLongLongDecimal: + formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 10, &str, &len); + break; + case fmtLongLongHex: + formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 16, &str, &len); + break; + case fmtLongLongOctal: + formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtLongLongBinary: + formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; +#endif +#ifdef ULLONG_MAX + case fmtULongLongDecimal: + formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 10, + &str, &len); + break; + case fmtULongLongHex: + formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 16, + &str, &len); + break; + case fmtULongLongOctal: + formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 8, + &str, &len); + break; + case fmtULongLongBinary: + formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 2, + &str, &len); + break; +#endif + case fmtDouble: + formatDouble(arg.f, buf, sizeof(buf), prec, gFalse, &str, &len); + break; + case fmtDoubleTrim: + formatDouble(arg.f, buf, sizeof(buf), prec, gTrue, &str, &len); + break; + case fmtDoubleTrimSmallAware: + formatDoubleSmallAware(arg.f, buf, sizeof(buf), prec, gTrue, &str, &len); + break; + case fmtChar: + buf[0] = arg.c; + str = buf; + len = 1; + reverseAlign = !reverseAlign; + break; + case fmtString: + str = arg.s; + len = strlen(str); + reverseAlign = !reverseAlign; + break; + case fmtGooString: + str = arg.gs->getCString(); + len = arg.gs->getLength(); + reverseAlign = !reverseAlign; + break; + case fmtSpace: + str = buf; + len = 0; + width = arg.i; + break; + } + + // append the formatted arg, handling width and alignment + if (!reverseAlign && len < width) { + for (i = len; i < width; ++i) { + append(' '); + } + } + append(str, len); + if (reverseAlign && len < width) { + for (i = len; i < width; ++i) { + append(' '); + } + } + } + + } else if (*p0 == '}') { + ++p0; + if (*p0 == '}') { + ++p0; + } + append('}'); + + } else { + for (p1 = p0 + 1; *p1 && *p1 != '{' && *p1 != '}'; ++p1) ; + append(p0, p1 - p0); + p0 = p1; + } + } + + gfree(args); + return this; +} +#ifdef LLONG_MAX +void GooString::formatInt(long long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len) { +#else +void GooString::formatInt(long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len) { +#endif + static char vals[17] = "0123456789abcdef"; + GBool neg; + int start, i, j; + + i = bufSize; + if ((neg = x < 0)) { + x = -x; + } + start = neg ? 1 : 0; + if (x == 0) { + buf[--i] = '0'; + } else { + while (i > start && x) { + buf[--i] = vals[x % base]; + x /= base; + } + } + if (zeroFill) { + for (j = bufSize - i; i > start && j < width - start; ++j) { + buf[--i] = '0'; + } + } + if (neg) { + buf[--i] = '-'; + } + *p = buf + i; + *len = bufSize - i; +} + +#ifdef ULLONG_MAX +void GooString::formatUInt(unsigned long long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len) { +#else +void GooString::formatUInt(Gulong x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len) { +#endif + static char vals[17] = "0123456789abcdef"; + int i, j; + + i = bufSize; + if (x == 0) { + buf[--i] = '0'; + } else { + while (i > 0 && x) { + buf[--i] = vals[x % base]; + x /= base; + } + } + if (zeroFill) { + for (j = bufSize - i; i > 0 && j < width; ++j) { + buf[--i] = '0'; + } + } + *p = buf + i; + *len = bufSize - i; +} + +void GooString::formatDouble(double x, char *buf, int bufSize, int prec, + GBool trim, char **p, int *len) { + GBool neg, started; + double x2; + int d, i, j; + + if ((neg = x < 0)) { + x = -x; + } + x = floor(x * pow(10.0, prec) + 0.5); + i = bufSize; + started = !trim; + for (j = 0; j < prec && i > 1; ++j) { + x2 = floor(0.1 * (x + 0.5)); + d = (int)floor(x - 10 * x2 + 0.5); + if (started || d != 0) { + buf[--i] = '0' + d; + started = gTrue; + } + x = x2; + } + if (i > 1 && started) { + buf[--i] = '.'; + } + if (i > 1) { + do { + x2 = floor(0.1 * (x + 0.5)); + d = (int)floor(x - 10 * x2 + 0.5); + buf[--i] = '0' + d; + x = x2; + } while (i > 1 && x); + } + if (neg) { + buf[--i] = '-'; + } + *p = buf + i; + *len = bufSize - i; +} + +void GooString::formatDoubleSmallAware(double x, char *buf, int bufSize, int prec, + GBool trim, char **p, int *len) +{ + double absX = fabs(x); + if (absX >= 0.1) { + formatDouble(x, buf, bufSize, prec, trim, p, len); + } else { + while (absX < 0.1 && prec < MAXIMUM_DOUBLE_PREC) + { + absX = absX * 10; + prec++; + } + formatDouble(x, buf, bufSize, prec, trim, p, len); + } +} + +GooString *GooString::insert(int i, char c) { + return insert(i, (const char*)&c, 1); +} + +GooString *GooString::insert(int i, GooString *str) { + return insert(i, str->getCString(), str->getLength()); +} + +GooString *GooString::insert(int i, const char *str, int lengthA) { + int j; + int prevLen = length; + if (CALC_STRING_LEN == lengthA) + lengthA = strlen(str); + + resize(length + lengthA); + for (j = prevLen; j >= i; --j) + s[j+lengthA] = s[j]; + memcpy(s+i, str, lengthA); + return this; +} + +GooString *GooString::del(int i, int n) { + int j; + + if (i >= 0 && n > 0 && i + n > 0) { + if (i + n > length) { + n = length - i; + } + for (j = i; j <= length - n; ++j) { + s[j] = s[j + n]; + } + resize(length - n); + } + return this; +} + +GooString *GooString::upperCase() { + int i; + + for (i = 0; i < length; ++i) { + if (islower(s[i])) + s[i] = toupper(s[i]); + } + return this; +} + +GooString *GooString::lowerCase() { + int i; + + for (i = 0; i < length; ++i) { + if (isupper(s[i])) + s[i] = tolower(s[i]); + } + return this; +} + +int GooString::cmp(GooString *str) const { + int n1, n2, i, x; + char *p1, *p2; + + n1 = length; + n2 = str->length; + for (i = 0, p1 = s, p2 = str->s; i < n1 && i < n2; ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + return n1 - n2; +} + +int GooString::cmpN(GooString *str, int n) const { + int n1, n2, i, x; + char *p1, *p2; + + n1 = length; + n2 = str->length; + for (i = 0, p1 = s, p2 = str->s; + i < n1 && i < n2 && i < n; + ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + if (i == n) { + return 0; + } + return n1 - n2; +} + +int GooString::cmp(const char *sA) const { + int n1, i, x; + const char *p1, *p2; + + n1 = length; + for (i = 0, p1 = s, p2 = sA; i < n1 && *p2; ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + if (i < n1) { + return 1; + } + if (*p2) { + return -1; + } + return 0; +} + +int GooString::cmpN(const char *sA, int n) const { + int n1, i, x; + const char *p1, *p2; + + n1 = length; + for (i = 0, p1 = s, p2 = sA; i < n1 && *p2 && i < n; ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + if (i == n) { + return 0; + } + if (i < n1) { + return 1; + } + if (*p2) { + return -1; + } + return 0; +} + +GBool GooString::hasUnicodeMarker(void) +{ + return (s[0] & 0xff) == 0xfe && (s[1] & 0xff) == 0xff; +} + +GooString *GooString::sanitizedName(GBool psmode) +{ + GooString *name; + char buf[8]; + int i; + char c; + + name = new GooString(); + + if (psmode) + { + // ghostscript chokes on names that begin with out-of-limits + // numbers, e.g., 1e4foo is handled correctly (as a name), but + // 1e999foo generates a limitcheck error + c = getChar(0); + if (c >= '0' && c <= '9') { + name->append('f'); + } + } + + for (i = 0; i < getLength(); ++i) { + c = getChar(i); + if (c <= (char)0x20 || c >= (char)0x7f || + c == ' ' || + c == '(' || c == ')' || c == '<' || c == '>' || + c == '[' || c == ']' || c == '{' || c == '}' || + c == '/' || c == '%' || c == '#') { + sprintf(buf, "#%02x", c & 0xff); + name->append(buf); + } else { + name->append(c); + } + } + return name; +} diff --git a/goo/GooString.h b/goo/GooString.h new file mode 100644 index 0000000..23558b0 --- /dev/null +++ b/goo/GooString.h @@ -0,0 +1,194 @@ +//======================================================================== +// +// GooString.h +// +// Simple variable-length string type. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2008-2010, 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GooString_H +#define GooString_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include // for LLONG_MAX and ULLONG_MAX +#include +#include // for NULL +#include "gtypes.h" + +class GooString { +public: + + // Create an empty string. + GooString(); + + // Create a string from a C string. + explicit GooString(const char *sA); + + // Create a string from chars at . This string + // can contain null characters. + GooString(const char *sA, int lengthA); + + // Create a string from chars at in . + GooString(GooString *str, int idx, int lengthA); + + // Set content of a string to concatination of and . They can both + // be NULL. if or is CALC_STRING_LEN, then length of the string + // will be calculated with strlen(). Otherwise we assume they are a valid + // length of string (or its substring) + GooString* Set(const char *s1, int s1Len=CALC_STRING_LEN, const char *s2=NULL, int s2Len=CALC_STRING_LEN); + + // Copy a string. + explicit GooString(const GooString *str); + GooString *copy() const { return new GooString(this); } + + // Concatenate two strings. + GooString(GooString *str1, GooString *str2); + + // Convert an integer to a string. + static GooString *fromInt(int x); + + // Create a formatted string. Similar to printf, but without the + // string overflow issues. Formatting elements consist of: + // {:[][.]} + // where: + // - is the argument number (arg 0 is the first argument + // following the format string) -- NB: args must be first used in + // order; they can be reused in any order + // - is the field width -- negative to reverse the alignment; + // starting with a leading zero to zero-fill (for integers) + // - is the number of digits to the right of the decimal + // point (for floating point numbers) + // - is one of: + // d, x, o, b -- int in decimal, hex, octal, binary + // ud, ux, uo, ub -- unsigned int + // ld, lx, lo, lb, uld, ulx, ulo, ulb -- long, unsigned long + // lld, llx, llo, llb, ulld, ullx, ullo, ullb + // -- long long, unsigned long long + // f, g -- double + // c -- char + // s -- string (char *) + // t -- GooString * + // w -- blank space; arg determines width + // To get literal curly braces, use {{ or }}. + static GooString *format(const char *fmt, ...); + static GooString *formatv(const char *fmt, va_list argList); + + // Destructor. + ~GooString(); + + // Get length. + int getLength() { return length; } + + // Get C string. + char *getCString() const { return s; } + + // Get th character. + char getChar(int i) { return s[i]; } + + // Change th character. + void setChar(int i, char c) { s[i] = c; } + + // Clear string to zero length. + GooString *clear(); + + // Append a character or string. + GooString *append(char c); + GooString *append(GooString *str); + GooString *append(const char *str, int lengthA=CALC_STRING_LEN); + + // Append a formatted string. + GooString *appendf(const char *fmt, ...); + GooString *appendfv(const char *fmt, va_list argList); + + // Insert a character or string. + GooString *insert(int i, char c); + GooString *insert(int i, GooString *str); + GooString *insert(int i, const char *str, int lengthA=CALC_STRING_LEN); + + // Delete a character or range of characters. + GooString *del(int i, int n = 1); + + // Convert string to all-upper/all-lower case. + GooString *upperCase(); + GooString *lowerCase(); + + // Compare two strings: -1:< 0:= +1:> + int cmp(GooString *str) const; + int cmpN(GooString *str, int n) const; + int cmp(const char *sA) const; + int cmpN(const char *sA, int n) const; + + GBool hasUnicodeMarker(void); + + // Sanitizes the string so that it does + // not contain any ( ) < > [ ] { } / % + // The postscript mode also has some more strict checks + // The caller owns the return value + GooString *sanitizedName(GBool psmode); + +private: + GooString(const GooString &other); + GooString& operator=(const GooString &other); + + // you can tweak this number for a different speed/memory usage tradeoffs. + // In libc malloc() rounding is 16 so it's best to choose a value that + // results in sizeof(GooString) be a multiple of 16. + // 24 makes sizeof(GooString) to be 32. + static const int STR_STATIC_SIZE = 24; + // a special value telling that the length of the string is not given + // so it must be calculated from the strings + static const int CALC_STRING_LEN = -1; + + int roundedSize(int len); + + char sStatic[STR_STATIC_SIZE]; + int length; + char *s; + + void resize(int newLength); +#ifdef LLONG_MAX + static void formatInt(long long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len); +#else + static void formatInt(long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len); +#endif +#ifdef ULLONG_MAX + static void formatUInt(unsigned long long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len); +#else + static void formatUInt(Gulong x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len); +#endif + static void formatDouble(double x, char *buf, int bufSize, int prec, + GBool trim, char **p, int *len); + static void formatDoubleSmallAware(double x, char *buf, int bufSize, int prec, + GBool trim, char **p, int *len); +}; + +#endif diff --git a/goo/GooTimer.cc b/goo/GooTimer.cc new file mode 100644 index 0000000..c766c6b --- /dev/null +++ b/goo/GooTimer.cc @@ -0,0 +1,95 @@ +//======================================================================== +// +// GooTimer.cc +// +// This file is licensed under GPLv2 or later +// +// Copyright 2005 Jonathan Blandford +// Copyright 2007 Krzysztof Kowalczyk +// Copyright 2010 Hib Eris +// Inspired by gtimer.c in glib, which is Copyright 2000 by the GLib Team +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "GooTimer.h" +#include + +#define USEC_PER_SEC 1000000 + +//------------------------------------------------------------------------ +// GooTimer +//------------------------------------------------------------------------ + +GooTimer::GooTimer() { + start(); +} + +void GooTimer::start() { +#ifdef HAVE_GETTIMEOFDAY + gettimeofday(&start_time, NULL); +#elif defined(_WIN32) + QueryPerformanceCounter(&start_time); +#endif + active = true; +} + +void GooTimer::stop() { +#ifdef HAVE_GETTIMEOFDAY + gettimeofday(&end_time, NULL); +#elif defined(_WIN32) + QueryPerformanceCounter(&end_time); +#endif + active = false; +} + +#ifdef HAVE_GETTIMEOFDAY +double GooTimer::getElapsed() +{ + double total; + struct timeval elapsed; + + if (active) + gettimeofday(&end_time, NULL); + + if (start_time.tv_usec > end_time.tv_usec) { + end_time.tv_usec += USEC_PER_SEC; + end_time.tv_sec--; + } + + elapsed.tv_usec = end_time.tv_usec - start_time.tv_usec; + elapsed.tv_sec = end_time.tv_sec - start_time.tv_sec; + + total = elapsed.tv_sec + ((double) elapsed.tv_usec / 1e6); + if (total < 0) + total = 0; + + return total; +} +#elif defined(_WIN32) +double GooTimer::getElapsed() +{ + LARGE_INTEGER freq; + double time_in_secs; + QueryPerformanceFrequency(&freq); + + if (active) + QueryPerformanceCounter(&end_time); + + time_in_secs = (double)(end_time.QuadPart-start_time.QuadPart)/(double)freq.QuadPart; + return time_in_secs * 1000.0; + +} +#else +double GooTimer::getElapsed() +{ +#warning "no support for GooTimer" + return 0; +} +#endif + diff --git a/goo/GooTimer.h b/goo/GooTimer.h new file mode 100644 index 0000000..d77373e --- /dev/null +++ b/goo/GooTimer.h @@ -0,0 +1,57 @@ +//======================================================================== +// +// GooTimer.cc +// +// This file is licensed under GPLv2 or later +// +// Copyright 2005 Jonathan Blandford +// Copyright 2007 Krzysztof Kowalczyk +// Copyright 2010 Hib Eris +// Copyright 2011 Albert Astals cid +// Inspired by gtimer.c in glib, which is Copyright 2000 by the GLib Team +// +//======================================================================== + +#ifndef GOOTIMER_H +#define GOOTIMER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "gtypes.h" +#ifdef HAVE_GETTIMEOFDAY +#include +#endif + +#ifdef _WIN32 +#include +#endif + +//------------------------------------------------------------------------ +// GooTimer +//------------------------------------------------------------------------ + +class GooTimer { +public: + + // Create a new timer. + GooTimer(); + + void start(); + void stop(); + double getElapsed(); + +private: +#ifdef HAVE_GETTIMEOFDAY + struct timeval start_time; + struct timeval end_time; +#elif defined(_WIN32) + LARGE_INTEGER start_time; + LARGE_INTEGER end_time; +#endif + GBool active; +}; + +#endif diff --git a/goo/ImgWriter.cc b/goo/ImgWriter.cc new file mode 100644 index 0000000..a30d26d --- /dev/null +++ b/goo/ImgWriter.cc @@ -0,0 +1,15 @@ +//======================================================================== +// +// ImgWriter.cpp +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Albert Astals Cid +// +//======================================================================== + +#include "ImgWriter.h" + +ImgWriter::~ImgWriter() +{ +} diff --git a/goo/ImgWriter.h b/goo/ImgWriter.h new file mode 100644 index 0000000..185c230 --- /dev/null +++ b/goo/ImgWriter.h @@ -0,0 +1,33 @@ +//======================================================================== +// +// ImgWriter.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2009, 2011 Albert Astals Cid +// Copyright (C) 2010 Adrian Johnson +// Copyright (C) 2010 Brian Cameron +// Copyright (C) 2011 Thomas Freitag +// +//======================================================================== + +#ifndef IMGWRITER_H +#define IMGWRITER_H + +#include + +class ImgWriter +{ + public: + virtual ~ImgWriter(); + virtual bool init(FILE *f, int width, int height, int hDPI, int vDPI) = 0; + + virtual bool writePointers(unsigned char **rowPointers, int rowCount) = 0; + virtual bool writeRow(unsigned char **row) = 0; + + virtual bool close() = 0; + virtual bool supportCMYK() { return false; } +}; + +#endif diff --git a/goo/JpegWriter.cc b/goo/JpegWriter.cc new file mode 100644 index 0000000..2fe3d32 --- /dev/null +++ b/goo/JpegWriter.cc @@ -0,0 +1,147 @@ +//======================================================================== +// +// JpegWriter.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010, 2012 Adrian Johnson +// Copyright (C) 2010 Harry Roberts +// Copyright (C) 2011 Thomas Freitag +// +//======================================================================== + +#include "JpegWriter.h" + +#ifdef ENABLE_LIBJPEG + +#include "poppler/Error.h" + +void outputMessage(j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + // Create the message + (*cinfo->err->format_message) (cinfo, buffer); + + // Send it to poppler's error handler + error(errInternal, -1, "{0:s}", buffer); +} + +JpegWriter::JpegWriter(int q, bool p, J_COLOR_SPACE cm) +: progressive(p), quality(q), colorMode(cm) +{ +} + +JpegWriter::JpegWriter(J_COLOR_SPACE cm) +: progressive(false), quality(-1), colorMode(cm) +{ +} + +JpegWriter::~JpegWriter() +{ + // cleanup + jpeg_destroy_compress(&cinfo); +} + +bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI) +{ + // Setup error handler + cinfo.err = jpeg_std_error(&jerr); + jerr.output_message = &outputMessage; + + // Initialize libjpeg + jpeg_create_compress(&cinfo); + + // Set colorspace and initialise defaults + cinfo.in_color_space = colorMode; /* colorspace of input image */ + jpeg_set_defaults(&cinfo); + + // Set destination file + jpeg_stdio_dest(&cinfo, f); + + // Set libjpeg configuration + cinfo.image_width = width; + cinfo.image_height = height; + cinfo.density_unit = 1; // dots per inch + cinfo.X_density = hDPI; + cinfo.Y_density = vDPI; + /* # of color components per pixel */ + switch (colorMode) { + case JCS_GRAYSCALE: + cinfo.input_components = 1; + break; + case JCS_RGB: + cinfo.input_components = 3; + break; + case JCS_CMYK: + cinfo.input_components = 4; + break; + default: + return false; + } + if (cinfo.in_color_space == JCS_CMYK) { + jpeg_set_colorspace(&cinfo, JCS_YCCK); + cinfo.write_JFIF_header = TRUE; + } + + // Set quality + if( quality >= 0 && quality <= 100 ) { + jpeg_set_quality(&cinfo, quality, true); + } + + // Use progressive mode + if( progressive) { + jpeg_simple_progression(&cinfo); + } + + // Get ready for data + jpeg_start_compress(&cinfo, TRUE); + + return true; +} + +bool JpegWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + if (colorMode == JCS_CMYK) { + for (int y = 0; y < rowCount; y++) { + unsigned char *row = rowPointers[y]; + for (unsigned int x = 0; x < cinfo.image_width; x++) { + for (int n = 0; n < 4; n++) { + *row = 0xff - *row; + row++; + } + } + } + } + // Write all rows to the file + jpeg_write_scanlines(&cinfo, rowPointers, rowCount); + + return true; +} + +bool JpegWriter::writeRow(unsigned char **rowPointer) +{ + if (colorMode == JCS_CMYK) { + unsigned char *row = rowPointer[0]; + for (unsigned int x = 0; x < cinfo.image_width; x++) { + for (int n = 0; n < 4; n++) { + *row = 0xff - *row; + row++; + } + } + } + // Write the row to the file + jpeg_write_scanlines(&cinfo, rowPointer, 1); + + return true; +} + +bool JpegWriter::close() +{ + jpeg_finish_compress(&cinfo); + + return true; +} + +#endif diff --git a/goo/JpegWriter.h b/goo/JpegWriter.h new file mode 100644 index 0000000..d076224 --- /dev/null +++ b/goo/JpegWriter.h @@ -0,0 +1,56 @@ +//======================================================================== +// +// JpegWriter.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010 Adrian Johnson +// Copyright (C) 2010 Jürg Billeter +// Copyright (C) 2010 Harry Roberts +// Copyright (C) 2010 Brian Cameron +// Copyright (C) 2011 Albert Astals Cid +// Copyright (C) 2011 Thomas Freitag +// +//======================================================================== + +#ifndef JPEGWRITER_H +#define JPEGWRITER_H + +#include "poppler-config.h" + +#ifdef ENABLE_LIBJPEG + +#include +#include "ImgWriter.h" + +extern "C" { +#include +} + +class JpegWriter : public ImgWriter +{ + public: + JpegWriter(int quality, bool progressive, J_COLOR_SPACE colorMode = JCS_RGB); + JpegWriter(J_COLOR_SPACE colorMode = JCS_RGB); + ~JpegWriter(); + + bool init(FILE *f, int width, int height, int hDPI, int vDPI); + + bool writePointers(unsigned char **rowPointers, int rowCount); + bool writeRow(unsigned char **row); + + bool close(); + bool supportCMYK() { return colorMode == JCS_CMYK; } + + private: + bool progressive; + int quality; + J_COLOR_SPACE colorMode; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; +}; + +#endif + +#endif diff --git a/goo/Makefile.am b/goo/Makefile.am new file mode 100644 index 0000000..f4f9730 --- /dev/null +++ b/goo/Makefile.am @@ -0,0 +1,62 @@ +noinst_LTLIBRARIES = libgoo.la + +if ENABLE_XPDF_HEADERS + +poppler_goo_includedir = $(includedir)/poppler/goo +poppler_goo_include_HEADERS = \ + GooHash.h \ + GooList.h \ + GooTimer.h \ + GooMutex.h \ + GooString.h \ + gtypes.h \ + gmem.h \ + gfile.h \ + FixedPoint.h \ + PNGWriter.h \ + JpegWriter.h \ + TiffWriter.h \ + ImgWriter.h \ + GooLikely.h \ + gstrtod.h + +endif + +if BUILD_LIBJPEG +libjpeg_includes = $(LIBJPEG_CFLAGS) +endif + +if BUILD_LIBTIFF +libtiff_includes = $(LIBTIFF_CFLAGS) +endif + +if BUILD_LIBOPENJPEG +libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS) +endif + +if BUILD_LIBPNG +libpng_includes = $(LIBPNG_CFLAGS) +endif + +INCLUDES = \ + -I$(top_srcdir) \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) + +libgoo_la_SOURCES = \ + gfile.cc \ + gmempp.cc \ + GooHash.cc \ + GooList.cc \ + GooTimer.cc \ + GooString.cc \ + gmem.cc \ + FixedPoint.cc \ + PNGWriter.cc \ + JpegWriter.cc \ + TiffWriter.cc \ + ImgWriter.cc \ + gtypes_p.h \ + gstrtod.cc diff --git a/goo/Makefile.in b/goo/Makefile.in new file mode 100644 index 0000000..4e52ade --- /dev/null +++ b/goo/Makefile.in @@ -0,0 +1,737 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = goo +DIST_COMMON = $(am__poppler_goo_include_HEADERS_DIST) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libgoo_la_LIBADD = +am_libgoo_la_OBJECTS = gfile.lo gmempp.lo GooHash.lo GooList.lo \ + GooTimer.lo GooString.lo gmem.lo FixedPoint.lo PNGWriter.lo \ + JpegWriter.lo TiffWriter.lo ImgWriter.lo gstrtod.lo +libgoo_la_OBJECTS = $(am_libgoo_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgoo_la_SOURCES) +DIST_SOURCES = $(libgoo_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__poppler_goo_include_HEADERS_DIST = GooHash.h GooList.h GooTimer.h \ + GooMutex.h GooString.h gtypes.h gmem.h gfile.h FixedPoint.h \ + PNGWriter.h JpegWriter.h TiffWriter.h ImgWriter.h GooLikely.h \ + gstrtod.h +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(poppler_goo_includedir)" +HEADERS = $(poppler_goo_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +noinst_LTLIBRARIES = libgoo.la +@ENABLE_XPDF_HEADERS_TRUE@poppler_goo_includedir = $(includedir)/poppler/goo +@ENABLE_XPDF_HEADERS_TRUE@poppler_goo_include_HEADERS = \ +@ENABLE_XPDF_HEADERS_TRUE@ GooHash.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GooList.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GooTimer.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GooMutex.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GooString.h \ +@ENABLE_XPDF_HEADERS_TRUE@ gtypes.h \ +@ENABLE_XPDF_HEADERS_TRUE@ gmem.h \ +@ENABLE_XPDF_HEADERS_TRUE@ gfile.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FixedPoint.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PNGWriter.h \ +@ENABLE_XPDF_HEADERS_TRUE@ JpegWriter.h \ +@ENABLE_XPDF_HEADERS_TRUE@ TiffWriter.h \ +@ENABLE_XPDF_HEADERS_TRUE@ ImgWriter.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GooLikely.h \ +@ENABLE_XPDF_HEADERS_TRUE@ gstrtod.h + +@BUILD_LIBJPEG_TRUE@libjpeg_includes = $(LIBJPEG_CFLAGS) +@BUILD_LIBTIFF_TRUE@libtiff_includes = $(LIBTIFF_CFLAGS) +@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_includes = $(LIBOPENJPEG_CFLAGS) +@BUILD_LIBPNG_TRUE@libpng_includes = $(LIBPNG_CFLAGS) +INCLUDES = \ + -I$(top_srcdir) \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) + +libgoo_la_SOURCES = \ + gfile.cc \ + gmempp.cc \ + GooHash.cc \ + GooList.cc \ + GooTimer.cc \ + GooString.cc \ + gmem.cc \ + FixedPoint.cc \ + PNGWriter.cc \ + JpegWriter.cc \ + TiffWriter.cc \ + ImgWriter.cc \ + gtypes_p.h \ + gstrtod.cc + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign goo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign goo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgoo.la: $(libgoo_la_OBJECTS) $(libgoo_la_DEPENDENCIES) $(EXTRA_libgoo_la_DEPENDENCIES) + $(AM_V_CXXLD)$(CXXLINK) $(libgoo_la_OBJECTS) $(libgoo_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FixedPoint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooHash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooList.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooString.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GooTimer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImgWriter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JpegWriter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PNGWriter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TiffWriter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmempp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstrtod.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-poppler_goo_includeHEADERS: $(poppler_goo_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_goo_include_HEADERS)'; test -n "$(poppler_goo_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_goo_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_goo_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_goo_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_goo_includedir)" || exit $$?; \ + done + +uninstall-poppler_goo_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_goo_include_HEADERS)'; test -n "$(poppler_goo_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_goo_includedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(poppler_goo_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-poppler_goo_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-poppler_goo_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-poppler_goo_includeHEADERS \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-poppler_goo_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/goo/PNGWriter.cc b/goo/PNGWriter.cc new file mode 100644 index 0000000..fe8b79e --- /dev/null +++ b/goo/PNGWriter.cc @@ -0,0 +1,176 @@ +//======================================================================== +// +// PNGWriter.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Warren Toomey +// Copyright (C) 2009 Shen Liang +// Copyright (C) 2009, 2011 Albert Astals Cid +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010, 2011 Adrian Johnson +// Copyright (C) 2011 Thomas Klausner +// +//======================================================================== + +#include "PNGWriter.h" + +#ifdef ENABLE_LIBPNG + +#include +#include +#include + +#include "poppler/Error.h" +#include "goo/gmem.h" + +PNGWriter::PNGWriter(Format formatA) : format(formatA) +{ + icc_data = NULL; + icc_data_size = 0; + icc_name = NULL; + sRGB_profile = false; +} + +PNGWriter::~PNGWriter() +{ + /* cleanup heap allocation */ + png_destroy_write_struct(&png_ptr, &info_ptr); + if (icc_data) { + gfree(icc_data); + free(icc_name); + } +} + +void PNGWriter::setICCProfile(const char *name, unsigned char *data, int size) +{ + icc_data = (unsigned char *)gmalloc(size); + memcpy(icc_data, data, size); + icc_data_size = size; + icc_name = strdup(name); +} + +void PNGWriter::setSRGBProfile() +{ + sRGB_profile = true; +} + +bool PNGWriter::init(FILE *f, int width, int height, int hDPI, int vDPI) +{ + /* libpng changed the png_set_iCCP() prototype in 1.5.0 */ +#if PNG_LIBPNG_VER < 10500 + png_charp icc_data_ptr = (png_charp)icc_data; +#else + png_const_bytep icc_data_ptr = (png_const_bytep)icc_data; +#endif + + /* initialize stuff */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) { + error(errInternal, -1, "png_create_write_struct failed"); + return false; + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + error(errInternal, -1, "png_create_info_struct failed"); + return false; + } + + if (setjmp(png_jmpbuf(png_ptr))) { + error(errInternal, -1, "png_jmpbuf failed"); + return false; + } + + /* write header */ + png_init_io(png_ptr, f); + if (setjmp(png_jmpbuf(png_ptr))) { + error(errInternal, -1, "Error during writing header"); + return false; + } + + // Set up the type of PNG image and the compression level + png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); + + // Silence silly gcc + png_byte bit_depth = -1; + png_byte color_type = -1; + switch (format) { + case RGB: + bit_depth = 8; + color_type = PNG_COLOR_TYPE_RGB; + break; + case RGBA: + bit_depth = 8; + color_type = PNG_COLOR_TYPE_RGB_ALPHA; + break; + case GRAY: + bit_depth = 8; + color_type = PNG_COLOR_TYPE_GRAY; + break; + case MONOCHROME: + bit_depth = 1; + color_type = PNG_COLOR_TYPE_GRAY; + break; + } + png_byte interlace_type = PNG_INTERLACE_NONE; + + png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + png_set_pHYs(png_ptr, info_ptr, hDPI/0.0254, vDPI/0.0254, PNG_RESOLUTION_METER); + + if (icc_data) + png_set_iCCP(png_ptr, info_ptr, icc_name, PNG_COMPRESSION_TYPE_BASE, icc_data_ptr, icc_data_size); + else if (sRGB_profile) + png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_RELATIVE); + + png_write_info(png_ptr, info_ptr); + if (setjmp(png_jmpbuf(png_ptr))) { + error(errInternal, -1, "error during writing png info bytes"); + return false; + } + + // pack 1 pixel/byte rows into 8 pixels/byte + if (format == MONOCHROME) + png_set_packing(png_ptr); + + return true; +} + +bool PNGWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + png_write_image(png_ptr, rowPointers); + /* write bytes */ + if (setjmp(png_jmpbuf(png_ptr))) { + error(errInternal, -1, "Error during writing bytes"); + return false; + } + + return true; +} + +bool PNGWriter::writeRow(unsigned char **row) +{ + // Write the row to the file + png_write_rows(png_ptr, row, 1); + if (setjmp(png_jmpbuf(png_ptr))) { + error(errInternal, -1, "error during png row write"); + return false; + } + + return true; +} + +bool PNGWriter::close() +{ + /* end write */ + png_write_end(png_ptr, info_ptr); + if (setjmp(png_jmpbuf(png_ptr))) { + error(errInternal, -1, "Error during end of write"); + return false; + } + + return true; +} + +#endif diff --git a/goo/PNGWriter.h b/goo/PNGWriter.h new file mode 100644 index 0000000..9e412b4 --- /dev/null +++ b/goo/PNGWriter.h @@ -0,0 +1,63 @@ +//======================================================================== +// +// PNGWriter.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Warren Toomey +// Copyright (C) 2009 Shen Liang +// Copyright (C) 2009, 2011 Albert Astals Cid +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010, 2011 Adrian Johnson +// +//======================================================================== + +#ifndef PNGWRITER_H +#define PNGWRITER_H + +#include "poppler-config.h" + +#ifdef ENABLE_LIBPNG + +#include +#include +#include "ImgWriter.h" + +class PNGWriter : public ImgWriter +{ + public: + + /* RGB - 3 bytes/pixel + * RGBA - 4 bytes/pixel + * GRAY - 1 byte/pixel + * MONOCHROME - 1 byte/pixel. PNGWriter will bitpack to 8 pixels/byte + */ + enum Format { RGB, RGBA, GRAY, MONOCHROME }; + + PNGWriter(Format format = RGB); + ~PNGWriter(); + + void setICCProfile(const char *name, unsigned char *data, int size); + void setSRGBProfile(); + + + bool init(FILE *f, int width, int height, int hDPI, int vDPI); + + bool writePointers(unsigned char **rowPointers, int rowCount); + bool writeRow(unsigned char **row); + + bool close(); + + private: + Format format; + png_structp png_ptr; + png_infop info_ptr; + unsigned char *icc_data; + int icc_data_size; + char *icc_name; + bool sRGB_profile; +}; + +#endif + +#endif diff --git a/goo/TiffWriter.cc b/goo/TiffWriter.cc new file mode 100644 index 0000000..f63b245 --- /dev/null +++ b/goo/TiffWriter.cc @@ -0,0 +1,202 @@ +//======================================================================== +// +// TiffWriter.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2010 William Bader +// +//======================================================================== + +#include "TiffWriter.h" + +#if ENABLE_LIBTIFF + +#include + +TiffWriter::~TiffWriter() +{ + // no cleanup needed +} + +TiffWriter::TiffWriter() +{ + f = NULL; + numRows = 0; + curRow = 0; + compressionString = NULL; + splashMode = splashModeRGB8; +} + +// Set the compression type + +void TiffWriter::setCompressionString(const char *compressionStringArg) +{ + compressionString = compressionStringArg; +} + +// Set the bitmap mode + +void TiffWriter::setSplashMode(SplashColorMode splashModeArg) +{ + splashMode = splashModeArg; +} + +// Write a TIFF file. + +bool TiffWriter::init(FILE *openedFile, int width, int height, int hDPI, int vDPI) +{ + unsigned int compression; + uint16 photometric; + uint32 rowsperstrip = (uint32) -1; + int bitspersample; + uint16 samplesperpixel; + const struct compression_name_tag { + const char *compressionName; // name of the compression option from the command line + unsigned int compressionCode; // internal libtiff code + const char *compressionDescription; // descriptive name + } compressionList[] = { + { "none", COMPRESSION_NONE, "no compression" }, + { "ccittrle", COMPRESSION_CCITTRLE, "CCITT modified Huffman RLE" }, + { "ccittfax3", COMPRESSION_CCITTFAX3,"CCITT Group 3 fax encoding" }, + { "ccittt4", COMPRESSION_CCITT_T4, "CCITT T.4 (TIFF 6 name)" }, + { "ccittfax4", COMPRESSION_CCITTFAX4, "CCITT Group 4 fax encoding" }, + { "ccittt6", COMPRESSION_CCITT_T6, "CCITT T.6 (TIFF 6 name)" }, + { "lzw", COMPRESSION_LZW, "Lempel-Ziv & Welch" }, + { "ojpeg", COMPRESSION_OJPEG, "!6.0 JPEG" }, + { "jpeg", COMPRESSION_JPEG, "%JPEG DCT compression" }, + { "next", COMPRESSION_NEXT, "NeXT 2-bit RLE" }, + { "packbits", COMPRESSION_PACKBITS, "Macintosh RLE" }, + { "ccittrlew", COMPRESSION_CCITTRLEW, "CCITT modified Huffman RLE w/ word alignment" }, + { "deflate", COMPRESSION_DEFLATE, "Deflate compression" }, + { "adeflate", COMPRESSION_ADOBE_DEFLATE, "Deflate compression, as recognized by Adobe" }, + { "dcs", COMPRESSION_DCS, "Kodak DCS encoding" }, + { "jbig", COMPRESSION_JBIG, "ISO JBIG" }, + { "jp2000", COMPRESSION_JP2000, "Leadtools JPEG2000" }, + { NULL, 0, NULL } + }; + + // Initialize + + f = NULL; + curRow = 0; + + // Store the number of rows + + numRows = height; + + // Set the compression + + compression = COMPRESSION_NONE; + + if (compressionString == NULL || strcmp(compressionString, "") == 0) { + compression = COMPRESSION_NONE; + } else { + int i; + for (i = 0; compressionList[i].compressionName != NULL; i++) { + if (strcmp(compressionString, compressionList[i].compressionName) == 0) { + compression = compressionList[i].compressionCode; + break; + } + } + if (compressionList[i].compressionName == NULL) { + fprintf(stderr, "TiffWriter: Unknown compression type '%.10s', using 'none'.\n", compressionString); + fprintf(stderr, "Known compression types (the tiff library might not support every type)\n"); + for (i = 0; compressionList[i].compressionName != NULL; i++) { + fprintf(stderr, "%10s %s\n", compressionList[i].compressionName, compressionList[i].compressionDescription); + } + } + } + + // Set bits per sample, samples per pixel, and photometric type from the splash mode + + bitspersample = (splashMode == splashModeMono1? 1: 8); + + switch (splashMode) { + + case splashModeMono1: + case splashModeMono8: + samplesperpixel = 1; + photometric = PHOTOMETRIC_MINISBLACK; + break; + + case splashModeRGB8: + case splashModeBGR8: + samplesperpixel = 3; + photometric = PHOTOMETRIC_RGB; + break; + + default: + fprintf(stderr, "TiffWriter: Mode %d not supported\n", splashMode); + return false; + } + + // Open the file + + if (openedFile == NULL) { + fprintf(stderr, "TiffWriter: No output file given.\n"); + return false; + } + + f = TIFFFdOpen(fileno(openedFile), "-", "w"); + + if (!f) { + return false; + } + + // Set TIFF tags + + TIFFSetField(f, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField(f, TIFFTAG_IMAGELENGTH, height); + TIFFSetField(f, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(f, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); + TIFFSetField(f, TIFFTAG_BITSPERSAMPLE, bitspersample); + TIFFSetField(f, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(f, TIFFTAG_PHOTOMETRIC, photometric); + TIFFSetField(f, TIFFTAG_COMPRESSION, (uint16) compression); + TIFFSetField(f, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(f, rowsperstrip)); + TIFFSetField(f, TIFFTAG_XRESOLUTION, (double) hDPI); + TIFFSetField(f, TIFFTAG_YRESOLUTION, (double) vDPI); + TIFFSetField(f, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); + + return true; +} + +bool TiffWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + // Write all rows to the file + + for (int row = 0; row < rowCount; row++) { + if (TIFFWriteScanline(f, rowPointers[row], row, 0) < 0) { + fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", row); + return false; + } + } + + return true; +} + +bool TiffWriter::writeRow(unsigned char **rowData) +{ + // Add a single row + + if (TIFFWriteScanline(f, *rowData, curRow, 0) < 0) { + fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", curRow); + return false; + } + + curRow++; + + return true; +} + +bool TiffWriter::close() +{ + // Close the file + + TIFFClose(f); + + return true; +} + +#endif diff --git a/goo/TiffWriter.h b/goo/TiffWriter.h new file mode 100644 index 0000000..1f4b5eb --- /dev/null +++ b/goo/TiffWriter.h @@ -0,0 +1,54 @@ +//======================================================================== +// +// TiffWriter.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2010 William Bader +// Copyright (C) 2011 Albert Astals Cid +// +//======================================================================== + +#ifndef TIFFWRITER_H +#define TIFFWRITER_H + +#include "poppler-config.h" + +#ifdef ENABLE_LIBTIFF + +#include +#include "ImgWriter.h" +#include "splash/SplashTypes.h" + +extern "C" { +#include "tiffio.h" +} + +class TiffWriter : public ImgWriter +{ + public: + TiffWriter(); + ~TiffWriter(); + + void setCompressionString(const char *compressionStringArg); + void setSplashMode(SplashColorMode splashModeArg); + + bool init(FILE *openedFile, int width, int height, int hDPI, int vDPI); + + bool writePointers(unsigned char **rowPointers, int rowCount); + bool writeRow(unsigned char **rowData); + + bool close(); + + private: + TIFF *f; // LibTiff file context + int numRows; // number of rows in the image + int curRow; // number of rows written + const char *compressionString; // compression type + SplashColorMode splashMode; // format of image data + +}; + +#endif + +#endif diff --git a/goo/gfile.cc b/goo/gfile.cc new file mode 100644 index 0000000..7522424 --- /dev/null +++ b/goo/gfile.cc @@ -0,0 +1,827 @@ +//======================================================================== +// +// gfile.cc +// +// Miscellaneous file and directory name manipulation. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2008 Adam Batkin +// Copyright (C) 2008, 2010 Hib Eris +// Copyright (C) 2009 Albert Astals Cid +// Copyright (C) 2009 Kovid Goyal +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef _WIN32 +# include +#else +# if defined(MACOS) +# include +# elif !defined(ACORN) +# include +# include +# include +# endif +# include +# include +# include +# if !defined(VMS) && !defined(ACORN) && !defined(MACOS) +# include +# endif +# if defined(VMS) && (__DECCXX_VER < 50200000) +# include +# endif +#endif // _WIN32 +#include "GooString.h" +#include "gfile.h" + +// Some systems don't define this, so just make it something reasonably +// large. +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +//------------------------------------------------------------------------ + +GooString *getHomeDir() { +#ifdef VMS + //---------- VMS ---------- + return new GooString("SYS$LOGIN:"); + +#elif defined(__EMX__) || defined(_WIN32) + //---------- OS/2+EMX and Win32 ---------- + char *s; + GooString *ret; + + if ((s = getenv("HOME"))) + ret = new GooString(s); + else + ret = new GooString("."); + return ret; + +#elif defined(ACORN) + //---------- RISCOS ---------- + return new GooString("@"); + +#elif defined(MACOS) + //---------- MacOS ---------- + return new GooString(":"); + +#else + //---------- Unix ---------- + char *s; + struct passwd *pw; + GooString *ret; + + if ((s = getenv("HOME"))) { + ret = new GooString(s); + } else { + if ((s = getenv("USER"))) + pw = getpwnam(s); + else + pw = getpwuid(getuid()); + if (pw) + ret = new GooString(pw->pw_dir); + else + ret = new GooString("."); + } + return ret; +#endif +} + +GooString *getCurrentDir() { + char buf[PATH_MAX+1]; + +#if defined(__EMX__) + if (_getcwd2(buf, sizeof(buf))) +#elif defined(_WIN32) + if (GetCurrentDirectory(sizeof(buf), buf)) +#elif defined(ACORN) + if (strcpy(buf, "@")) +#elif defined(MACOS) + if (strcpy(buf, ":")) +#else + if (getcwd(buf, sizeof(buf))) +#endif + return new GooString(buf); + return new GooString(); +} + +GooString *appendToPath(GooString *path, const char *fileName) { +#if defined(VMS) + //---------- VMS ---------- + //~ this should handle everything necessary for file + //~ requesters, but it's certainly not complete + char *p0, *p1, *p2; + char *q1; + + p0 = path->getCString(); + p1 = p0 + path->getLength() - 1; + if (!strcmp(fileName, "-")) { + if (*p1 == ']') { + for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ; + if (*p2 == '[') + ++p2; + path->del(p2 - p0, p1 - p2); + } else if (*p1 == ':') { + path->append("[-]"); + } else { + path->clear(); + path->append("[-]"); + } + } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) { + if (*p1 == ']') { + path->insert(p1 - p0, '.'); + path->insert(p1 - p0 + 1, fileName, q1 - fileName); + } else if (*p1 == ':') { + path->append('['); + path->append(']'); + path->append(fileName, q1 - fileName); + } else { + path->clear(); + path->append(fileName, q1 - fileName); + } + } else { + if (*p1 != ']' && *p1 != ':') + path->clear(); + path->append(fileName); + } + return path; + +#elif defined(_WIN32) + //---------- Win32 ---------- + GooString *tmp; + char buf[256]; + char *fp; + + tmp = new GooString(path); + tmp->append('/'); + tmp->append(fileName); + GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp); + delete tmp; + path->clear(); + path->append(buf); + return path; + +#elif defined(ACORN) + //---------- RISCOS ---------- + char *p; + int i; + + path->append("."); + i = path->getLength(); + path->append(fileName); + for (p = path->getCString() + i; *p; ++p) { + if (*p == '/') { + *p = '.'; + } else if (*p == '.') { + *p = '/'; + } + } + return path; + +#elif defined(MACOS) + //---------- MacOS ---------- + char *p; + int i; + + path->append(":"); + i = path->getLength(); + path->append(fileName); + for (p = path->getCString() + i; *p; ++p) { + if (*p == '/') { + *p = ':'; + } else if (*p == '.') { + *p = ':'; + } + } + return path; + +#elif defined(__EMX__) + //---------- OS/2+EMX ---------- + int i; + + // appending "." does nothing + if (!strcmp(fileName, ".")) + return path; + + // appending ".." goes up one directory + if (!strcmp(fileName, "..")) { + for (i = path->getLength() - 2; i >= 0; --i) { + if (path->getChar(i) == '/' || path->getChar(i) == '\\' || + path->getChar(i) == ':') + break; + } + if (i <= 0) { + if (path->getChar(0) == '/' || path->getChar(0) == '\\') { + path->del(1, path->getLength() - 1); + } else if (path->getLength() >= 2 && path->getChar(1) == ':') { + path->del(2, path->getLength() - 2); + } else { + path->clear(); + path->append(".."); + } + } else { + if (path->getChar(i-1) == ':') + ++i; + path->del(i, path->getLength() - i); + } + return path; + } + + // otherwise, append "/" and new path component + if (path->getLength() > 0 && + path->getChar(path->getLength() - 1) != '/' && + path->getChar(path->getLength() - 1) != '\\') + path->append('/'); + path->append(fileName); + return path; + +#else + //---------- Unix ---------- + int i; + + // appending "." does nothing + if (!strcmp(fileName, ".")) + return path; + + // appending ".." goes up one directory + if (!strcmp(fileName, "..")) { + for (i = path->getLength() - 2; i >= 0; --i) { + if (path->getChar(i) == '/') + break; + } + if (i <= 0) { + if (path->getChar(0) == '/') { + path->del(1, path->getLength() - 1); + } else { + path->clear(); + path->append(".."); + } + } else { + path->del(i, path->getLength() - i); + } + return path; + } + + // otherwise, append "/" and new path component + if (path->getLength() > 0 && + path->getChar(path->getLength() - 1) != '/') + path->append('/'); + path->append(fileName); + return path; +#endif +} + +GooString *grabPath(char *fileName) { +#ifdef VMS + //---------- VMS ---------- + char *p; + + if ((p = strrchr(fileName, ']'))) + return new GooString(fileName, p + 1 - fileName); + if ((p = strrchr(fileName, ':'))) + return new GooString(fileName, p + 1 - fileName); + return new GooString(); + +#elif defined(__EMX__) || defined(_WIN32) + //---------- OS/2+EMX and Win32 ---------- + char *p; + + if ((p = strrchr(fileName, '/'))) + return new GooString(fileName, p - fileName); + if ((p = strrchr(fileName, '\\'))) + return new GooString(fileName, p - fileName); + if ((p = strrchr(fileName, ':'))) + return new GooString(fileName, p + 1 - fileName); + return new GooString(); + +#elif defined(ACORN) + //---------- RISCOS ---------- + char *p; + + if ((p = strrchr(fileName, '.'))) + return new GooString(fileName, p - fileName); + return new GooString(); + +#elif defined(MACOS) + //---------- MacOS ---------- + char *p; + + if ((p = strrchr(fileName, ':'))) + return new GooString(fileName, p - fileName); + return new GooString(); + +#else + //---------- Unix ---------- + char *p; + + if ((p = strrchr(fileName, '/'))) + return new GooString(fileName, p - fileName); + return new GooString(); +#endif +} + +GBool isAbsolutePath(char *path) { +#ifdef VMS + //---------- VMS ---------- + return strchr(path, ':') || + (path[0] == '[' && path[1] != '.' && path[1] != '-'); + +#elif defined(__EMX__) || defined(_WIN32) + //---------- OS/2+EMX and Win32 ---------- + return path[0] == '/' || path[0] == '\\' || path[1] == ':'; + +#elif defined(ACORN) + //---------- RISCOS ---------- + return path[0] == '$'; + +#elif defined(MACOS) + //---------- MacOS ---------- + return path[0] != ':'; + +#else + //---------- Unix ---------- + return path[0] == '/'; +#endif +} + +GooString *makePathAbsolute(GooString *path) { +#ifdef VMS + //---------- VMS ---------- + char buf[PATH_MAX+1]; + + if (!isAbsolutePath(path->getCString())) { + if (getcwd(buf, sizeof(buf))) { + path->insert(0, buf); + } + } + return path; + +#elif defined(_WIN32) + //---------- Win32 ---------- + char buf[MAX_PATH]; + char *fp; + + buf[0] = '\0'; + if (!GetFullPathName(path->getCString(), MAX_PATH, buf, &fp)) { + path->clear(); + return path; + } + path->clear(); + path->append(buf); + return path; + +#elif defined(ACORN) + //---------- RISCOS ---------- + path->insert(0, '@'); + return path; + +#elif defined(MACOS) + //---------- MacOS ---------- + path->del(0, 1); + return path; + +#else + //---------- Unix and OS/2+EMX ---------- + struct passwd *pw; + char buf[PATH_MAX+1]; + GooString *s; + char *p1, *p2; + int n; + + if (path->getChar(0) == '~') { + if (path->getChar(1) == '/' || +#ifdef __EMX__ + path->getChar(1) == '\\' || +#endif + path->getLength() == 1) { + path->del(0, 1); + s = getHomeDir(); + path->insert(0, s); + delete s; + } else { + p1 = path->getCString() + 1; +#ifdef __EMX__ + for (p2 = p1; *p2 && *p2 != '/' && *p2 != '\\'; ++p2) ; +#else + for (p2 = p1; *p2 && *p2 != '/'; ++p2) ; +#endif + if ((n = p2 - p1) > PATH_MAX) + n = PATH_MAX; + strncpy(buf, p1, n); + buf[n] = '\0'; + if ((pw = getpwnam(buf))) { + path->del(0, p2 - p1 + 1); + path->insert(0, pw->pw_dir); + } + } + } else if (!isAbsolutePath(path->getCString())) { + if (getcwd(buf, sizeof(buf))) { +#ifndef __EMX__ + path->insert(0, '/'); +#endif + path->insert(0, buf); + } + } + return path; +#endif +} + +time_t getModTime(char *fileName) { +#ifdef _WIN32 + //~ should implement this, but it's (currently) only used in xpdf + return 0; +#else + struct stat statBuf; + + if (stat(fileName, &statBuf)) { + return 0; + } + return statBuf.st_mtime; +#endif +} + +GBool openTempFile(GooString **name, FILE **f, const char *mode) { +#if defined(_WIN32) + //---------- Win32 ---------- + char *tempDir; + GooString *s, *s2; + char buf[32]; + FILE *f2; + int t, i; + + // this has the standard race condition problem, but I haven't found + // a better way to generate temp file names with extensions on + // Windows + if ((tempDir = getenv("TEMP"))) { + s = new GooString(tempDir); + s->append('\\'); + } else { + s = new GooString(); + } + s->appendf("x_{0:d}_{1:d}_", + (int)GetCurrentProcessId(), (int)GetCurrentThreadId()); + t = (int)time(NULL); + for (i = 0; i < 1000; ++i) { + s2 = s->copy()->appendf("{0:d}", t + i); + if (!(f2 = fopen(s2->getCString(), "r"))) { + if (!(f2 = fopen(s2->getCString(), mode))) { + delete s2; + delete s; + return gFalse; + } + *name = s2; + *f = f2; + delete s; + return gTrue; + } + fclose(f2); + delete s2; + } + delete s; + return gFalse; +#elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS) + //---------- non-Unix ---------- + char *s; + + // There is a security hole here: an attacker can create a symlink + // with this file name after the tmpnam call and before the fopen + // call. I will happily accept fixes to this function for non-Unix + // OSs. + if (!(s = tmpnam(NULL))) { + return gFalse; + } + *name = new GooString(s); + if (!(*f = fopen((*name)->getCString(), mode))) { + delete (*name); + *name = NULL; + return gFalse; + } + return gTrue; +#else + //---------- Unix ---------- + char *s; + int fd; + +#if HAVE_MKSTEMP + if ((s = getenv("TMPDIR"))) { + *name = new GooString(s); + } else { + *name = new GooString("/tmp"); + } + (*name)->append("/XXXXXX"); + fd = mkstemp((*name)->getCString()); +#else // HAVE_MKSTEMP + if (!(s = tmpnam(NULL))) { + return gFalse; + } + *name = new GooString(s); + fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); +#endif // HAVE_MKSTEMP + if (fd < 0 || !(*f = fdopen(fd, mode))) { + delete *name; + *name = NULL; + return gFalse; + } + return gTrue; +#endif +} + +GBool executeCommand(char *cmd) { +#ifdef VMS + return system(cmd) ? gTrue : gFalse; +#else + return system(cmd) ? gFalse : gTrue; +#endif +} + +#ifdef WIN32 +GooString *fileNameToUTF8(char *path) { + GooString *s; + char *p; + + s = new GooString(); + for (p = path; *p; ++p) { + if (*p & 0x80) { + s->append((char)(0xc0 | ((*p >> 6) & 0x03))); + s->append((char)(0x80 | (*p & 0x3f))); + } else { + s->append(*p); + } + } + return s; +} + +GooString *fileNameToUTF8(wchar_t *path) { + GooString *s; + wchar_t *p; + + s = new GooString(); + for (p = path; *p; ++p) { + if (*p < 0x80) { + s->append((char)*p); + } else if (*p < 0x800) { + s->append((char)(0xc0 | ((*p >> 6) & 0x1f))); + s->append((char)(0x80 | (*p & 0x3f))); + } else { + s->append((char)(0xe0 | ((*p >> 12) & 0x0f))); + s->append((char)(0x80 | ((*p >> 6) & 0x3f))); + s->append((char)(0x80 | (*p & 0x3f))); + } + } + return s; +} +#endif + +FILE *openFile(const char *path, const char *mode) { +#ifdef WIN32 + OSVERSIONINFO version; + wchar_t wPath[_MAX_PATH + 1]; + char nPath[_MAX_PATH + 1]; + wchar_t wMode[8]; + const char *p; + int i; + + // NB: _wfopen is only available in NT + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + for (p = path, i = 0; *p && i < _MAX_PATH; ++i) { + if ((p[0] & 0xe0) == 0xc0 && + p[1] && (p[1] & 0xc0) == 0x80) { + wPath[i] = (wchar_t)(((p[0] & 0x1f) << 6) | + (p[1] & 0x3f)); + p += 2; + } else if ((p[0] & 0xf0) == 0xe0 && + p[1] && (p[1] & 0xc0) == 0x80 && + p[2] && (p[2] & 0xc0) == 0x80) { + wPath[i] = (wchar_t)(((p[0] & 0x0f) << 12) | + ((p[1] & 0x3f) << 6) | + (p[2] & 0x3f)); + p += 3; + } else { + wPath[i] = (wchar_t)(p[0] & 0xff); + p += 1; + } + } + wPath[i] = (wchar_t)0; + for (i = 0; mode[i] && i < sizeof(mode) - 1; ++i) { + wMode[i] = (wchar_t)(mode[i] & 0xff); + } + wMode[i] = (wchar_t)0; + return _wfopen(wPath, wMode); + } else { + for (p = path, i = 0; *p && i < _MAX_PATH; ++i) { + if ((p[0] & 0xe0) == 0xc0 && + p[1] && (p[1] & 0xc0) == 0x80) { + nPath[i] = (char)(((p[0] & 0x1f) << 6) | + (p[1] & 0x3f)); + p += 2; + } else if ((p[0] & 0xf0) == 0xe0 && + p[1] && (p[1] & 0xc0) == 0x80 && + p[2] && (p[2] & 0xc0) == 0x80) { + nPath[i] = (char)(((p[1] & 0x3f) << 6) | + (p[2] & 0x3f)); + p += 3; + } else { + nPath[i] = p[0]; + p += 1; + } + } + nPath[i] = '\0'; + return fopen(nPath, mode); + } +#else + return fopen(path, mode); +#endif +} + +char *getLine(char *buf, int size, FILE *f) { + int c, i; + + i = 0; + while (i < size - 1) { + if ((c = fgetc(f)) == EOF) { + break; + } + buf[i++] = (char)c; + if (c == '\x0a') { + break; + } + if (c == '\x0d') { + c = fgetc(f); + if (c == '\x0a' && i < size - 1) { + buf[i++] = (char)c; + } else if (c != EOF) { + ungetc(c, f); + } + break; + } + } + buf[i] = '\0'; + if (i == 0) { + return NULL; + } + return buf; +} + +//------------------------------------------------------------------------ +// GDir and GDirEntry +//------------------------------------------------------------------------ + +GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) { +#ifdef VMS + char *p; +#elif defined(_WIN32) + DWORD fa; +#elif defined(ACORN) +#else + struct stat st; +#endif + + name = new GooString(nameA); + dir = gFalse; + fullPath = new GooString(dirPath); + appendToPath(fullPath, nameA); + if (doStat) { +#ifdef VMS + if (!strcmp(nameA, "-") || + ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5))) + dir = gTrue; +#elif defined(ACORN) +#else +#ifdef _WIN32 + fa = GetFileAttributes(fullPath->getCString()); + dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY)); +#else + if (stat(fullPath->getCString(), &st) == 0) + dir = S_ISDIR(st.st_mode); +#endif +#endif + } +} + +GDirEntry::~GDirEntry() { + delete fullPath; + delete name; +} + +GDir::GDir(char *name, GBool doStatA) { + path = new GooString(name); + doStat = doStatA; +#if defined(_WIN32) + GooString *tmp; + + tmp = path->copy(); + tmp->append("/*.*"); + hnd = FindFirstFile(tmp->getCString(), &ffd); + delete tmp; +#elif defined(ACORN) +#elif defined(MACOS) +#else + dir = opendir(name); +#ifdef VMS + needParent = strchr(name, '[') != NULL; +#endif +#endif +} + +GDir::~GDir() { + delete path; +#if defined(_WIN32) + if (hnd != INVALID_HANDLE_VALUE) { + FindClose(hnd); + hnd = INVALID_HANDLE_VALUE; + } +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) + closedir(dir); +#endif +} + +GDirEntry *GDir::getNextEntry() { + GDirEntry *e; + +#if defined(_WIN32) + if (hnd != INVALID_HANDLE_VALUE) { + e = new GDirEntry(path->getCString(), ffd.cFileName, doStat); + if (!FindNextFile(hnd, &ffd)) { + FindClose(hnd); + hnd = INVALID_HANDLE_VALUE; + } + } else { + e = NULL; + } +#elif defined(ACORN) +#elif defined(MACOS) +#elif defined(VMS) + struct dirent *ent; + e = NULL; + if (dir) { + if (needParent) { + e = new GDirEntry(path->getCString(), "-", doStat); + needParent = gFalse; + return e; + } + ent = readdir(dir); + if (ent) { + e = new GDirEntry(path->getCString(), ent->d_name, doStat); + } + } +#else + struct dirent *ent; + e = NULL; + if (dir) { + do { + ent = readdir(dir); + } + while (ent && (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))); + if (ent) { + e = new GDirEntry(path->getCString(), ent->d_name, doStat); + } + } +#endif + + return e; +} + +void GDir::rewind() { +#ifdef _WIN32 + GooString *tmp; + + if (hnd != INVALID_HANDLE_VALUE) + FindClose(hnd); + tmp = path->copy(); + tmp->append("/*.*"); + hnd = FindFirstFile(tmp->getCString(), &ffd); + delete tmp; +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) + rewinddir(dir); +#ifdef VMS + needParent = strchr(path->getCString(), '[') != NULL; +#endif +#endif +} diff --git a/goo/gfile.h b/goo/gfile.h new file mode 100644 index 0000000..46b8958 --- /dev/null +++ b/goo/gfile.h @@ -0,0 +1,172 @@ +//======================================================================== +// +// gfile.h +// +// Miscellaneous file and directory name manipulation. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2009, 2011 Albert Astals Cid +// Copyright (C) 2009 Kovid Goyal +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GFILE_H +#define GFILE_H + +#include "poppler-config.h" +#include +#include +#include +extern "C" { +#if defined(_WIN32) +# include +# ifdef FPTEX +# include +# else +# include +# endif +#elif defined(ACORN) +#elif defined(MACOS) +# include +#else +# include +# include +# ifdef VMS +# include "vms_dirent.h" +# elif HAVE_DIRENT_H +# include +# define NAMLEN(d) strlen((d)->d_name) +# else +# define dirent direct +# define NAMLEN(d) (d)->d_namlen +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +# endif +#endif +} +#include "gtypes.h" + +class GooString; + +//------------------------------------------------------------------------ + +// Get home directory path. +extern GooString *getHomeDir(); + +// Get current directory. +extern GooString *getCurrentDir(); + +// Append a file name to a path string. may be an empty +// string, denoting the current directory). Returns . +extern GooString *appendToPath(GooString *path, const char *fileName); + +// Grab the path from the front of the file name. If there is no +// directory component in , returns an empty string. +extern GooString *grabPath(char *fileName); + +// Is this an absolute path or file name? +extern GBool isAbsolutePath(char *path); + +// Make this path absolute by prepending current directory (if path is +// relative) or prepending user's directory (if path starts with '~'). +extern GooString *makePathAbsolute(GooString *path); + +// Get the modification time for . Returns 0 if there is an +// error. +extern time_t getModTime(char *fileName); + +// Create a temporary file and open it for writing. If is not +// NULL, it will be used as the file name extension. Returns both the +// name and the file pointer. For security reasons, all writing +// should be done to the returned file pointer; the file may be +// reopened later for reading, but not for writing. The string +// should be "w" or "wb". Returns true on success. +extern GBool openTempFile(GooString **name, FILE **f, const char *mode); + +// Execute . Returns true on success. +extern GBool executeCommand(char *cmd); + +#ifdef WIN32 +// Convert a file name from Latin-1 to UTF-8. +extern GooString *fileNameToUTF8(char *path); + +// Convert a file name from UCS-2 to UTF-8. +extern GooString *fileNameToUTF8(wchar_t *path); +#endif + +// Open a file. On Windows, this converts the path from UTF-8 to +// UCS-2 and calls _wfopen (if available). On other OSes, this simply +// calls fopen. +extern FILE *openFile(const char *path, const char *mode); + +// Just like fgets, but handles Unix, Mac, and/or DOS end-of-line +// conventions. +extern char *getLine(char *buf, int size, FILE *f); + +//------------------------------------------------------------------------ +// GDir and GDirEntry +//------------------------------------------------------------------------ + +class GDirEntry { +public: + + GDirEntry(char *dirPath, char *nameA, GBool doStat); + ~GDirEntry(); + GooString *getName() { return name; } + GooString *getFullPath() { return fullPath; } + GBool isDir() { return dir; } + +private: + + GooString *name; // dir/file name + GooString *fullPath; + GBool dir; // is it a directory? +}; + +class GDir { +public: + + GDir(char *name, GBool doStatA = gTrue); + ~GDir(); + GDirEntry *getNextEntry(); + void rewind(); + +private: + + GooString *path; // directory path + GBool doStat; // call stat() for each entry? +#if defined(_WIN32) + WIN32_FIND_DATA ffd; + HANDLE hnd; +#elif defined(ACORN) +#elif defined(MACOS) +#else + DIR *dir; // the DIR structure from opendir() +#ifdef VMS + GBool needParent; // need to return an entry for [-] +#endif +#endif +}; + +#endif diff --git a/goo/gmem.cc b/goo/gmem.cc new file mode 100644 index 0000000..768b283 --- /dev/null +++ b/goo/gmem.cc @@ -0,0 +1,346 @@ +/* + * gmem.c + * + * Memory routines with out-of-memory checking. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Takashi Iwai +// Copyright (C) 2007-2010 Albert Astals Cid +// Copyright (C) 2008 Jonathan Kew +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include +#include +#include +#include +#include +#include +#include "gmem.h" + +#ifdef DEBUG_MEM + +typedef struct _GMemHdr { + unsigned int magic; + int size; + int index; + struct _GMemHdr *next, *prev; +} GMemHdr; + +#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7) +#define gMemTrlSize (sizeof(long)) + +#define gMemMagic 0xabcd9999 + +#if gmemTrlSize==8 +#define gMemDeadVal 0xdeadbeefdeadbeefUL +#else +#define gMemDeadVal 0xdeadbeefUL +#endif + +/* round data size so trailer will be aligned */ +#define gMemDataSize(size) \ + ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize) + +static GMemHdr *gMemHead = NULL; +static GMemHdr *gMemTail = NULL; + +static int gMemIndex = 0; +static int gMemAlloc = 0; +static int gMemInUse = 0; + +#endif /* DEBUG_MEM */ + +inline static void *gmalloc(size_t size, bool checkoverflow) { +#ifdef DEBUG_MEM + int size1; + char *mem; + GMemHdr *hdr; + void *data; + unsigned long *trl, *p; + + if (size < 0) { + fprintf(stderr, "Invalid memory allocation size\n"); + if (checkoverflow) return NULL; + else exit(1); + } + if (size == 0) { + return NULL; + } + size1 = gMemDataSize(size); + if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) { + fprintf(stderr, "Out of memory\n"); + if (checkoverflow) return NULL; + else exit(1); + } + hdr = (GMemHdr *)mem; + data = (void *)(mem + gMemHdrSize); + trl = (unsigned long *)(mem + gMemHdrSize + size1); + hdr->magic = gMemMagic; + hdr->size = size; + hdr->index = gMemIndex++; + if (gMemTail) { + gMemTail->next = hdr; + hdr->prev = gMemTail; + gMemTail = hdr; + } else { + hdr->prev = NULL; + gMemHead = gMemTail = hdr; + } + hdr->next = NULL; + ++gMemAlloc; + gMemInUse += size; + for (p = (unsigned long *)data; p <= trl; ++p) { + *p = gMemDeadVal; + } + return data; +#else + void *p; + + if (size < 0) { + fprintf(stderr, "Invalid memory allocation size\n"); + if (checkoverflow) return NULL; + else exit(1); + } + if (size == 0) { + return NULL; + } + if (!(p = malloc(size))) { + fprintf(stderr, "Out of memory\n"); + if (checkoverflow) return NULL; + else exit(1); + } + return p; +#endif +} + +void *gmalloc(size_t size) { + return gmalloc(size, false); +} + +void *gmalloc_checkoverflow(size_t size) { + return gmalloc(size, true); +} + +inline static void *grealloc(void *p, size_t size, bool checkoverflow) { +#ifdef DEBUG_MEM + GMemHdr *hdr; + void *q; + int oldSize; + + if (size < 0) { + fprintf(stderr, "Invalid memory allocation size\n"); + if (checkoverflow) return NULL; + else exit(1); + } + if (size == 0) { + if (p) { + gfree(p); + } + return NULL; + } + if (p) { + hdr = (GMemHdr *)((char *)p - gMemHdrSize); + oldSize = hdr->size; + q = gmalloc(size, checkoverflow); + memcpy(q, p, size < oldSize ? size : oldSize); + gfree(p); + } else { + q = gmalloc(size, checkoverflow); + } + return q; +#else + void *q; + + if (size < 0) { + fprintf(stderr, "Invalid memory allocation size\n"); + if (checkoverflow) return NULL; + else exit(1); + } + if (size == 0) { + if (p) { + free(p); + } + return NULL; + } + if (p) { + q = realloc(p, size); + } else { + q = malloc(size); + } + if (!q) { + fprintf(stderr, "Out of memory\n"); + if (checkoverflow) return NULL; + else exit(1); + } + return q; +#endif +} + +void *grealloc(void *p, size_t size) { + return grealloc(p, size, false); +} + +void *grealloc_checkoverflow(void *p, size_t size) { + return grealloc(p, size, true); +} + +inline static void *gmallocn(int nObjs, int objSize, bool checkoverflow) { + int n; + + if (nObjs == 0) { + return NULL; + } + n = nObjs * objSize; + if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) { + fprintf(stderr, "Bogus memory allocation size\n"); + if (checkoverflow) return NULL; + else exit(1); + } + return gmalloc(n, checkoverflow); +} + +void *gmallocn(int nObjs, int objSize) { + return gmallocn(nObjs, objSize, false); +} + +void *gmallocn_checkoverflow(int nObjs, int objSize) { + return gmallocn(nObjs, objSize, true); +} + +inline static void *gmallocn3(int a, int b, int c, bool checkoverflow) { + int n = a * b; + if (b <= 0 || a < 0 || a >= INT_MAX / b) { + fprintf(stderr, "Bogus memory allocation size\n"); + if (checkoverflow) return NULL; + else exit(1); + } + return gmallocn(n, c, checkoverflow); +} + +void *gmallocn3(int a, int b, int c) { + return gmallocn3(a, b, c, false); +} + +void *gmallocn3_checkoverflow(int a, int b, int c) { + return gmallocn3(a, b, c, true); +} + +inline static void *greallocn(void *p, int nObjs, int objSize, bool checkoverflow) { + int n; + + if (nObjs == 0) { + if (p) { + gfree(p); + } + return NULL; + } + n = nObjs * objSize; + if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) { + fprintf(stderr, "Bogus memory allocation size\n"); + if (checkoverflow) { + gfree(p); + return NULL; + } else { + exit(1); + } + } + return grealloc(p, n, checkoverflow); +} + +void *greallocn(void *p, int nObjs, int objSize) { + return greallocn(p, nObjs, objSize, false); +} + +void *greallocn_checkoverflow(void *p, int nObjs, int objSize) { + return greallocn(p, nObjs, objSize, true); +} + +void gfree(void *p) { +#ifdef DEBUG_MEM + int size; + GMemHdr *hdr; + unsigned long *trl, *clr; + + if (p) { + hdr = (GMemHdr *)((char *)p - gMemHdrSize); + if (hdr->magic == gMemMagic && + ((hdr->prev == NULL) == (hdr == gMemHead)) && + ((hdr->next == NULL) == (hdr == gMemTail))) { + if (hdr->prev) { + hdr->prev->next = hdr->next; + } else { + gMemHead = hdr->next; + } + if (hdr->next) { + hdr->next->prev = hdr->prev; + } else { + gMemTail = hdr->prev; + } + --gMemAlloc; + gMemInUse -= hdr->size; + size = gMemDataSize(hdr->size); + trl = (unsigned long *)((char *)hdr + gMemHdrSize + size); + if (*trl != gMemDeadVal) { + fprintf(stderr, "Overwrite past end of block %d at address %p\n", + hdr->index, p); + } + for (clr = (unsigned long *)hdr; clr <= trl; ++clr) { + *clr = gMemDeadVal; + } + free(hdr); + } else { + fprintf(stderr, "Attempted to free bad address %p\n", p); + } + } +#else + if (p) { + free(p); + } +#endif +} + +#ifdef DEBUG_MEM +void gMemReport(FILE *f) { + GMemHdr *p; + + fprintf(f, "%d memory allocations in all\n", gMemIndex); + if (gMemAlloc > 0) { + fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc); + fprintf(f, " index size\n"); + fprintf(f, "-------- --------\n"); + for (p = gMemHead; p; p = p->next) { + fprintf(f, "%8d %8d\n", p->index, p->size); + } + } else { + fprintf(f, "No memory blocks left allocated\n"); + } +} +#endif + +char *copyString(const char *s) { + char *s1; + + s1 = (char *)gmalloc(strlen(s) + 1); + strcpy(s1, s); + return s1; +} + +char *gstrndup(const char *s, size_t n) { + char *s1 = (char*)gmalloc(n + 1); /* cannot return NULL for size > 0 */ + s1[n] = '\0'; + memcpy(s1, s, n); + return s1; +} diff --git a/goo/gmem.h b/goo/gmem.h new file mode 100644 index 0000000..898f339 --- /dev/null +++ b/goo/gmem.h @@ -0,0 +1,92 @@ +/* + * gmem.h + * + * Memory routines with out-of-memory checking. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Takashi Iwai +// Copyright (C) 2007-2010 Albert Astals Cid +// Copyright (C) 2008 Jonathan Kew +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GMEM_H +#define GMEM_H + +#include +#include "poppler-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Same as malloc, but prints error message and exits if malloc() + * returns NULL. + */ +extern void *gmalloc(size_t size); +extern void *gmalloc_checkoverflow(size_t size); + +/* + * Same as realloc, but prints error message and exits if realloc() + * returns NULL. If

is NULL, calls malloc instead of realloc(). + */ +extern void *grealloc(void *p, size_t size); +extern void *grealloc_checkoverflow(size_t size); + +/* + * These are similar to gmalloc and grealloc, but take an object count + * and size. The result is similar to allocating nObjs * objSize + * bytes, but there is an additional error check that the total size + * doesn't overflow an int. + * The gmallocn_checkoverflow variant returns NULL instead of exiting + * the application if a overflow is detected + */ +extern void *gmallocn(int nObjs, int objSize); +extern void *gmallocn_checkoverflow(int nObjs, int objSize); +extern void *gmallocn3(int a, int b, int c); +extern void *gmallocn3_checkoverflow(int a, int b, int c); +extern void *greallocn(void *p, int nObjs, int objSize); +extern void *greallocn_checkoverflow(void *p, int nObjs, int objSize); + +/* + * Same as free, but checks for and ignores NULL pointers. + */ +extern void gfree(void *p); + +#ifdef DEBUG_MEM +/* + * Report on unfreed memory. + */ +extern void gMemReport(FILE *f); +#else +#define gMemReport(f) +#endif + +/* + * Allocate memory and copy a string into it. + */ +extern char *copyString(const char *s); + +/* + * Allocate memory and copy a limited-length string to it. + */ +extern char *gstrndup(const char *s, size_t n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/goo/gmempp.cc b/goo/gmempp.cc new file mode 100644 index 0000000..a70338c --- /dev/null +++ b/goo/gmempp.cc @@ -0,0 +1,32 @@ +//======================================================================== +// +// gmempp.cc +// +// Use gmalloc/gfree for C++ new/delete operators. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include +#include "gmem.h" + +#ifdef DEBUG_MEM + +void *operator new(size_t size) { + return gmalloc((int)size); +} + +void *operator new[](size_t size) { + return gmalloc((int)size); +} + +void operator delete(void *p) { + gfree(p); +} + +void operator delete[](void *p) { + gfree(p); +} + +#endif diff --git a/goo/gstrtod.cc b/goo/gstrtod.cc new file mode 100644 index 0000000..cd1d5b5 --- /dev/null +++ b/goo/gstrtod.cc @@ -0,0 +1,147 @@ +/* This file is part of Libspectre. + * + * Copyright (C) 2007, 2012 Albert Astals Cid + * Copyright (C) 2007 Carlos Garcia Campos + * + * Libspectre is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * Libspectre is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* This function comes from spectre-utils from libspectre */ + +#include "gstrtod.h" + +#include +#include +#include +#include + +#define ascii_isspace(c) \ + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') +#define ascii_isdigit(c) \ + (c >= '0' && c <= '9') + +double gatof(const char *nptr) +{ + return gstrtod(nptr, NULL); +} + +double gstrtod(const char *nptr, char **endptr) +{ + char *fail_pos; + double val; + struct lconv *locale_data; + const char *decimal_point; + int decimal_point_len; + const char *p, *decimal_point_pos; + const char *end = NULL; /* Silence gcc */ + int strtod_errno; + + fail_pos = NULL; + + locale_data = localeconv (); + decimal_point = locale_data->decimal_point; + decimal_point_len = strlen (decimal_point); + + decimal_point_pos = NULL; + end = NULL; + + if (decimal_point[0] != '.' || decimal_point[1] != 0) { + p = nptr; + /* Skip leading space */ + while (ascii_isspace (*p)) + p++; + + /* Skip leading optional sign */ + if (*p == '+' || *p == '-') + p++; + + if (ascii_isdigit (*p) || *p == '.') { + while (ascii_isdigit (*p)) + p++; + + if (*p == '.') + decimal_point_pos = p++; + + while (ascii_isdigit (*p)) + p++; + + if (*p == 'e' || *p == 'E') + p++; + if (*p == '+' || *p == '-') + p++; + while (ascii_isdigit (*p)) + p++; + + end = p; + } + /* For the other cases, we need not convert the decimal point */ + } + + if (decimal_point_pos) { + char *copy, *c; + + /* We need to convert the '.' to the locale specific decimal point */ + copy = (char *) malloc (end - nptr + 1 + decimal_point_len); + + c = copy; + memcpy (c, nptr, decimal_point_pos - nptr); + c += decimal_point_pos - nptr; + memcpy (c, decimal_point, decimal_point_len); + c += decimal_point_len; + memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1)); + c += end - (decimal_point_pos + 1); + *c = 0; + + errno = 0; + val = strtod (copy, &fail_pos); + strtod_errno = errno; + + if (fail_pos) { + if (fail_pos - copy > decimal_point_pos - nptr) + fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1); + else + fail_pos = (char *)nptr + (fail_pos - copy); + } + + free (copy); + } else if (end) { + char *copy; + + copy = (char *) malloc (end - (char *)nptr + 1); + memcpy (copy, nptr, end - nptr); + *(copy + (end - (char *)nptr)) = 0; + + errno = 0; + val = strtod (copy, &fail_pos); + strtod_errno = errno; + + if (fail_pos) { + fail_pos = (char *)nptr + (fail_pos - copy); + } + + free (copy); + } else { + errno = 0; + val = strtod (nptr, &fail_pos); + strtod_errno = errno; + } + + if (endptr) + *endptr = fail_pos; + + errno = strtod_errno; + + return val; +} diff --git a/goo/gstrtod.h b/goo/gstrtod.h new file mode 100644 index 0000000..e8abdad --- /dev/null +++ b/goo/gstrtod.h @@ -0,0 +1,43 @@ +/* This file is part of Libspectre. + * + * Copyright (C) 2007 Albert Astals Cid + * Copyright (C) 2007 Carlos Garcia Campos + * + * Libspectre is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * Libspectre is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* This function comes from spectre-utils from libspectre */ + +#ifndef GSTRTOD_H +#define GSTRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* This function behaves like the standard atof()/(strtod() function + * does in the C locale. It does this without actually changing + * the current locale, since that would not be thread-safe. + * A limitation of the implementation is that this function + * will still accept localized versions of infinities and NANs. + */ +double gatof(const char *nptr); +double gstrtod(const char *nptr, char **endptr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/goo/gtypes.h b/goo/gtypes.h new file mode 100644 index 0000000..b7a2dd2 --- /dev/null +++ b/goo/gtypes.h @@ -0,0 +1,48 @@ +/* + * gtypes.h + * + * Some useful simple types. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Patrick Spendrin +// Copyright (C) 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GTYPES_H +#define GTYPES_H + +/* + * These have stupid names to avoid conflicts with some (but not all) + * C++ compilers which define them. + */ +typedef bool GBool; +#define gTrue true +#define gFalse false + +#ifdef _MSC_VER +#pragma warning(disable: 4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */ +#endif + +/* + * These have stupid names to avoid conflicts with , + * which on various systems defines some random subset of these. + */ +typedef unsigned char Guchar; +typedef unsigned short Gushort; +typedef unsigned int Guint; +typedef unsigned long Gulong; + +#endif diff --git a/goo/gtypes_p.h b/goo/gtypes_p.h new file mode 100644 index 0000000..cc4866e --- /dev/null +++ b/goo/gtypes_p.h @@ -0,0 +1,30 @@ +/* + * gtypes_p.h + * + * Some useful simple types. + * + * Copyright (C) 2011 Adrian Johnson + */ + +#ifndef GTYPES_P_H +#define GTYPES_P_H + +#include "config.h" + +/* + * Define precise integer types. + */ +#if HAVE_STDINT_H +#include +#elif _MSC_VER +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#endif + +#endif diff --git a/gtk-doc.make b/gtk-doc.make new file mode 100644 index 0000000..9841de4 --- /dev/null +++ b/gtk-doc.make @@ -0,0 +1,256 @@ +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = $(LIBTOOL) --mode=execute +else +GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +SETUP_FILES = \ + $(content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +EXTRA_DIST = \ + $(HTML_IMAGES) \ + $(SETUP_FILES) + +DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) + +if ENABLE_GTK_DOC +if GTK_DOC_BUILD_HTML +HTML_BUILD_STAMP=html-build.stamp +else +HTML_BUILD_STAMP= +endif +if GTK_DOC_BUILD_PDF +PDF_BUILD_STAMP=pdf-build.stamp +else +PDF_BUILD_STAMP= +endif + +all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +else +all-local: +endif + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +setup-build.stamp: + -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + echo ' DOC Preparing build'; \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ + done; \ + fi; \ + fi + @touch setup-build.stamp + + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo ' DOC Scanning header files' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + echo " DOC Introspecting gobjects"; \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + @touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### xml #### + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) + @echo ' DOC Building XML' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + @touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building HTML' + @rm -rf html + @mkdir html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + @echo ' DOC Fixing cross-references' + @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + @touch html-build.stamp + +#### pdf #### + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building PDF' + @rm -f $(DOC_MODULE).pdf + @mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ + fi + +maintainer-clean-local: clean + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + @mkdir $(distdir)/html + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libpoppler-cpp.manifest b/libpoppler-cpp.manifest new file mode 100644 index 0000000..81ace0c --- /dev/null +++ b/libpoppler-cpp.manifest @@ -0,0 +1,6 @@ + + + + + + diff --git a/libpoppler-glib.manifest b/libpoppler-glib.manifest new file mode 100644 index 0000000..81ace0c --- /dev/null +++ b/libpoppler-glib.manifest @@ -0,0 +1,6 @@ + + + + + + diff --git a/libpoppler.manifest b/libpoppler.manifest new file mode 100644 index 0000000..81ace0c --- /dev/null +++ b/libpoppler.manifest @@ -0,0 +1,6 @@ + + + + + + diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 0000000..c2852d8 --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1ubuntu1" +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/m4/acx_pthread.m4 b/m4/acx_pthread.m4 new file mode 100644 index 0000000..7ac8ffd --- /dev/null +++ b/m4/acx_pthread.m4 @@ -0,0 +1,280 @@ +##### http://autoconf-archive.cryp.to/acx_pthread.html +# +# SYNOPSIS +# +# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. +# It sets the PTHREAD_LIBS output variable to the threads library and +# linker flags, and the PTHREAD_CFLAGS output variable to any special +# C compiler flags that are needed. (The user can also force certain +# compiler flags/libs to be tested by setting these environment +# variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). +# (This is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these +# flags, but also link it with them as well. e.g. you should link +# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +# $LIBS +# +# If you are only building threads programs, you may wish to use +# these variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads +# library is found, and ACTION-IF-NOT-FOUND is a list of commands to +# run it if it is not found. If ACTION-IF-FOUND is not specified, the +# default action will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or +# if you have any other suggestions or comments. This macro was based +# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) +# (with help from M. Frigo), as well as ac_pthread and hb_pthread +# macros posted by Alejandro Forero Cuervo to the autoconf macro +# repository. We are also grateful for the helpful feedback of +# numerous users. +# +# LAST MODIFICATION +# +# 2006-05-29 +# +# COPYLEFT +# +# Copyright (c) 2006 Steven G. Johnson +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/m4/define-dir.m4 b/m4/define-dir.m4 new file mode 100644 index 0000000..5e8c5ae --- /dev/null +++ b/m4/define-dir.m4 @@ -0,0 +1,34 @@ +dnl @synopsis AC_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION]) +dnl +dnl This macro sets VARNAME to the expansion of the DIR variable, +dnl taking care of fixing up ${prefix} and such. +dnl +dnl VARNAME is then offered as both an output variable and a C +dnl preprocessor symbol. +dnl +dnl Example: +dnl +dnl AC_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.]) +dnl +dnl @category Misc +dnl @author Stepan Kasal +dnl @author Andreas Schwab +dnl @author Guido Draheim +dnl @author Alexandre Oliva +dnl @version 2005-07-29 +dnl @license AllPermissive + +AC_DEFUN([AC_DEFINE_DIR], [ + prefix_NONE= + exec_prefix_NONE= + test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix + test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix +dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn +dnl refers to ${prefix}. Thus we have to use `eval' twice. + eval ac_define_dir="\"[$]$2\"" + eval ac_define_dir="\"$ac_define_dir\"" + AC_SUBST($1, "$ac_define_dir") + AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3]) + test "$prefix_NONE" && prefix=NONE + test "$exec_prefix_NONE" && exec_prefix=NONE +]) diff --git a/m4/gtk-doc.m4 b/m4/gtk-doc.m4 new file mode 100644 index 0000000..0ada151 --- /dev/null +++ b/m4/gtk-doc.m4 @@ -0,0 +1,67 @@ +dnl -*- mode: autoconf -*- + +# serial 1 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + + dnl check for tools we added during development + AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) + AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) + AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) + + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + if test x$enable_gtk_doc = xyes; then + ifelse([$1],[], + [PKG_CHECK_EXISTS([gtk-doc],, + AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], + [PKG_CHECK_EXISTS([gtk-doc >= $1],, + AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,) + fi + fi + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + dnl enable/disable output formats + AC_ARG_ENABLE([gtk-doc-html], + AS_HELP_STRING([--enable-gtk-doc-html], + [build documentation in html format [[default=yes]]]),, + [enable_gtk_doc_html=yes]) + AC_ARG_ENABLE([gtk-doc-pdf], + AS_HELP_STRING([--enable-gtk-doc-pdf], + [build documentation in pdf format [[default=no]]]),, + [enable_gtk_doc_pdf=no]) + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) + AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) +]) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..b2156eb --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,180 @@ +# iconv.m4 serial AM6 (gettext-0.17) +dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ + dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + AC_TRY_RUN([ +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + LIBS="$am_save_LIBS" + ]) + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, + [Define if you have the iconv() function and it works.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/introspection.m4 b/m4/introspection.m4 new file mode 100644 index 0000000..589721c --- /dev/null +++ b/m4/introspection.m4 @@ -0,0 +1,94 @@ +dnl -*- mode: autoconf -*- +dnl Copyright 2009 Johan Dahlin +dnl +dnl This file is free software; the author(s) gives unlimited +dnl permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl + +# serial 1 + +m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], +[ + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([LT_INIT],[$0])dnl setup libtool first + + dnl enable/disable introspection + m4_if([$2], [require], + [dnl + enable_introspection=yes + ],[dnl + AC_ARG_ENABLE(introspection, + AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]], + [Enable introspection for this build]),, + [enable_introspection=auto]) + ])dnl + + AC_MSG_CHECKING([for gobject-introspection]) + + dnl presence/version checking + AS_CASE([$enable_introspection], + [no], [dnl + found_introspection="no (disabled, use --enable-introspection to enable)" + ],dnl + [yes],[dnl + PKG_CHECK_EXISTS([gobject-introspection-1.0],, + AC_MSG_ERROR([gobject-introspection-1.0 is not installed])) + PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], + found_introspection=yes, + AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME])) + ],dnl + [auto],[dnl + PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) + ],dnl + [dnl + AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) + ])dnl + + AC_MSG_RESULT([$found_introspection]) + + INTROSPECTION_SCANNER= + INTROSPECTION_COMPILER= + INTROSPECTION_GENERATE= + INTROSPECTION_GIRDIR= + INTROSPECTION_TYPELIBDIR= + if test "x$found_introspection" = "xyes"; then + INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` + INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` + INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` + INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` + INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" + INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` + INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` + INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection + fi + AC_SUBST(INTROSPECTION_SCANNER) + AC_SUBST(INTROSPECTION_COMPILER) + AC_SUBST(INTROSPECTION_GENERATE) + AC_SUBST(INTROSPECTION_GIRDIR) + AC_SUBST(INTROSPECTION_TYPELIBDIR) + AC_SUBST(INTROSPECTION_CFLAGS) + AC_SUBST(INTROSPECTION_LIBS) + AC_SUBST(INTROSPECTION_MAKEFILE) + + AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") +]) + + +dnl Usage: +dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version]) + +AC_DEFUN([GOBJECT_INTROSPECTION_CHECK], +[ + _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1]) +]) + +dnl Usage: +dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version]) + + +AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], +[ + _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) +]) diff --git a/m4/libjpeg.m4 b/m4/libjpeg.m4 new file mode 100644 index 0000000..d384343 --- /dev/null +++ b/m4/libjpeg.m4 @@ -0,0 +1,114 @@ +dnl Based on Xpdf configure.in and evince configure.ac +dnl Based on kde acinclude.m4.in, LGPL Licensed + +AC_DEFUN([AC_FIND_FILE], +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +AC_DEFUN([KDE_FIND_JPEG_HELPER], +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif +], +[jpeg_CreateDecompress();], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + enable_libjpeg=yes + LIBJPEG_LIBS="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi +]) + + +AC_DEFUN([POPPLER_FIND_JPEG], +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG_LIBS= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +ac_save_CPPFLAGS="$CPPFLAGS" +ac_save_CFLAGS="$CFLAGS" +CPPFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_CHECK_HEADER([jpeglib.h], [jpeg_incdir=yes], [jpeg_incdir=NO]) +CPPFLAGS="$ac_save_CPPFLAGS" +CFLAGS="$ac_save_CFLAGS" +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG_LIBS" ; then + AC_DEFINE_UNQUOTED(ENABLE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG_LIBS" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + enable_libjpeg=no + LIBJPEG_LIBS= +fi + +AC_SUBST(LIBJPEG_LIBS) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..828104c --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,8001 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..5d9acd8 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..07a8602 --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c573da9 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/missing b/missing new file mode 100755 index 0000000..86a8fc3 --- /dev/null +++ b/missing @@ -0,0 +1,331 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2012-01-06.13; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/packaging/poppler-0.12.4-annot-appearance.patch b/packaging/poppler-0.12.4-annot-appearance.patch new file mode 100644 index 0000000..2d5323d --- /dev/null +++ b/packaging/poppler-0.12.4-annot-appearance.patch @@ -0,0 +1,14 @@ +--- poppler-0.12.4/poppler/Annot.cc 2010-01-17 01:06:58.000000000 +0100 ++++ poppler-0.12.4/poppler/Annot.cc 2010-03-04 12:50:56.000000000 +0100 +@@ -3173,7 +3173,10 @@ void AnnotWidget::generateFieldAppearanc + obj1.free(); + + // get the default appearance string +- if (Form::fieldLookup(field, "DA", &obj1)->isNull()) { ++ if (Form::fieldLookup(annot, "DA", &obj1)->isNull()) { ++ obj1.free(); ++ } ++ if (!obj1.isString() && Form::fieldLookup(field, "DA", &obj1)->isNull()) { + obj1.free(); + acroForm->lookup("DA", &obj1); + } diff --git a/packaging/poppler-0.20.1-empty-password.patch b/packaging/poppler-0.20.1-empty-password.patch new file mode 100644 index 0000000..26eb892 --- /dev/null +++ b/packaging/poppler-0.20.1-empty-password.patch @@ -0,0 +1,27 @@ +commit a53e0641365608f832b455404f1ee584d278e0c4 +Author: Albert Astals Cid +Date: Sun Aug 5 15:07:16 2012 +0200 + + If NULL, NULL fails as password try EMPTY, EMPTY before failing + + Reviewed by Jose Aliste + Bug #3498 + +diff --git a/poppler/SecurityHandler.cc b/poppler/SecurityHandler.cc +index 00c4ae1..a48449a 100644 +--- a/poppler/SecurityHandler.cc ++++ b/poppler/SecurityHandler.cc +@@ -105,7 +105,12 @@ GBool SecurityHandler::checkEncryption(GooString *ownerPassword, + } + } + if (!ok) { +- error(errCommandLine, -1, "Incorrect password"); ++ if (!ownerPassword && !userPassword) { ++ GooString dummy; ++ return checkEncryption(&dummy, &dummy); ++ } else { ++ error(errCommandLine, -1, "Incorrect password"); ++ } + } + return ok; + } diff --git a/packaging/poppler-0.20.2-ps-conversion.patch b/packaging/poppler-0.20.2-ps-conversion.patch new file mode 100644 index 0000000..0b52ff2 --- /dev/null +++ b/packaging/poppler-0.20.2-ps-conversion.patch @@ -0,0 +1,37 @@ +commit ef7c2418e12d3e6a79f1d89a0051b005fadbc344 +Author: Thomas Freitag +Date: Sat Jul 21 00:01:49 2012 +0200 + + Fix conversion to ps when having multiple strips + + Bug 51982 + +diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc +index 540f74b..a01a4b3 100644 +--- a/poppler/PSOutputDev.cc ++++ b/poppler/PSOutputDev.cc +@@ -3049,7 +3049,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, + double m0, m1, m2, m3, m4, m5; + int nStripes, stripeH, stripeY; + int c, w, h, x, y, comp, i; +- int numComps; ++ int numComps, initialNumComps; + #endif + char hexBuf[32*2 + 2]; // 32 values X 2 chars/value + line ending + null + Guchar digit; +@@ -3132,6 +3132,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, + stripeH = (sliceH + nStripes - 1) / nStripes; + + // render the stripes ++ initialNumComps = numComps; + for (stripeY = sliceY; stripeY < sliceH; stripeY += stripeH) { + + // rasterize a stripe +@@ -3151,6 +3152,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, + + // draw the rasterized image + bitmap = splashOut->getBitmap(); ++ numComps = initialNumComps; + w = bitmap->getWidth(); + h = bitmap->getHeight(); + writePS("gsave\n"); diff --git a/packaging/poppler-0.20.2-scale-init.patch b/packaging/poppler-0.20.2-scale-init.patch new file mode 100644 index 0000000..39bdfe4 --- /dev/null +++ b/packaging/poppler-0.20.2-scale-init.patch @@ -0,0 +1,45 @@ +commit dcbc923bd3592a81876f84005fbaddcea18641cc +Author: Thomas Freitag +Date: Sun Jul 22 18:40:46 2012 +0200 + + Make sure xScale and yScale are always initialized + + Bug #52215 + +diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc +index a01a4b3..e15c2e9 100644 +--- a/poppler/PSOutputDev.cc ++++ b/poppler/PSOutputDev.cc +@@ -3521,6 +3521,7 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { + saveState(NULL); + } + ++ xScale = yScale = 1; + switch (mode) { + + case psModePSOrigPageSizes: +@@ -3631,8 +3632,6 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { + } else { + yScale = xScale; + } +- } else { +- xScale = yScale = 1; + } + // deal with odd bounding boxes or clipping + if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) { +@@ -3694,7 +3693,6 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { + if (tx != 0 || ty != 0) { + writePSFmt("{0:.6g} {1:.6g} translate\n", tx, ty); + } +- xScale = yScale = 1; + break; + + case psModeForm: +@@ -3702,7 +3700,6 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { + writePS("begin xpdf begin\n"); + writePS("pdfStartPage\n"); + tx = ty = 0; +- xScale = yScale = 1; + rotate = 0; + break; + } diff --git a/packaging/poppler.spec b/packaging/poppler.spec new file mode 100644 index 0000000..04e6f74 --- /dev/null +++ b/packaging/poppler.spec @@ -0,0 +1,1643 @@ +# +# spec file for package poppler +# +# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# + +%define _unpackaged_files_terminate_build 0 + +Name: poppler +Version: 0.20.4 +Release: 8 +# Actual version of poppler-data: +%define poppler_data_version 0.2.1 +%define poppler_soname 25 +%define poppler_cpp_soname 0 +%define poppler_glib_soname 8 +%define poppler_qt4_soname 4 +%define poppler_api 0.18 +%define poppler_apipkg 0_18 +Url: http://poppler.freedesktop.org/ +Summary: PDF Rendering Library +License: GPL-2.0+ +Group: System/Libraries +Source: %{name}-%{version}.tar.gz + +BuildRequires: gcc-c++ +#BuildRequires: gobject-introspection-devel +BuildRequires: libjpeg-turbo-devel +BuildRequires: libtiff-devel +BuildRequires: curl-devel +#BuildRequires: libqt4-devel +#BuildRequires: openjpeg-devel +#BuildRequires: update-desktop-files +BuildRequires: zlib-devel +BuildRequires: pkgconfig(cairo) >= 1.10.0 +BuildRequires: pkgconfig(cairo-ft) >= 1.10.0 +BuildRequires: pkgconfig(cairo-pdf) +BuildRequires: pkgconfig(cairo-ps) +BuildRequires: pkgconfig(cairo-svg) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(freetype2) +#BuildRequires: pkgconfig(gobject-2.0) >= 2.18 +BuildRequires: pkgconfig(lcms2) +BuildRequires: pkgconfig(libpng) +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +%package -n libpoppler%{poppler_soname} +Summary: PDF Rendering Library +License: GPL-2.0 +Group: System/Libraries +#Recommends: poppler-data >= %{poppler_data_version} +Provides: poppler = %{version} +Obsoletes: poppler < %{version} + +%description -n libpoppler%{poppler_soname} +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +%package -n libpoppler-cpp%{poppler_cpp_soname} +Summary: PDF Rendering Library +License: GPL-2.0+ +Group: System/Libraries +Requires: libpoppler%{poppler_soname} >= %{version} +Provides: poppler-cpp = %{version} +Obsoletes: poppler-cpp < %{version} + +%description -n libpoppler-cpp%{poppler_cpp_soname} +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +%package -n libpoppler-glib%{poppler_glib_soname} +Summary: PDF Rendering Library - GLib Wrapper +License: GPL-2.0+ +Group: System/Libraries +Requires: libpoppler%{poppler_soname} >= %{version} +Provides: poppler-glib = %{version} +Obsoletes: poppler-glib < %{version} + +%description -n libpoppler-glib%{poppler_glib_soname} +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +#%package -n typelib-1_0-Poppler-%{poppler_apipkg} +#Summary: PDF Rendering Library - Introspection bindings +#License: GPL-2.0+ +#Group: System/Libraries + +#%description -n typelib-1_0-Poppler-%{poppler_apipkg} +#Poppler is a PDF rendering library, forked from the xpdf PDF viewer +#developed by Derek Noonburg of Glyph and Cog, LLC. +# +#This package provides the GObject Introspection bindings for Poppler. + +#%package -n libpoppler-qt4-%{poppler_qt4_soname} +#Summary: PDF Rendering Library - Qt4 Wrapper +#License: GPL-2.0+ +#Group: System/Libraries +#Requires: libpoppler%{poppler_soname} >= %{version} +# Last appeared in OpenSUSE 10.3: +#Provides: poppler-qt4 = %{version} +#Obsoletes: poppler-qt4 < %{version} + +#%description -n libpoppler-qt4-%{poppler_qt4_soname} +#Poppler is a PDF rendering library, forked from the xpdf PDF viewer +#developed by Derek Noonburg of Glyph and Cog, LLC. + +%package tools +Summary: PDF Rendering Library Tools +License: GPL-2.0 +Group: Productivity/Publishing/PDF +Requires: libpoppler%{poppler_soname} >= %{version} +# last version in openSUSE 11.1/SLE11 +Provides: poppler-tools = %{version} +Provides: xpdf-tools = 3.02 +Obsoletes: xpdf-tools < 3.02 +Provides: pdftools_any + +%description tools +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +%package -n libpoppler-devel +Summary: PDF rendering library +License: GPL-2.0 +Group: Development/Libraries/C and C++ +Requires: libpoppler%{poppler_soname} = %{version} +Requires: libstdc++-devel +# Last appeared in OpenSUSE 10.3: +Provides: poppler-devel = %{version} +Obsoletes: poppler-devel < %{version} + +%description -n libpoppler-devel +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +%package -n libpoppler-glib-devel +Summary: PDF rendering library - GLib Wrapper +License: GPL-2.0 +Group: Development/Libraries/C and C++ +Requires: libpoppler-glib%{poppler_glib_soname} = %{version} +#Requires: typelib-1_0-Poppler-%{poppler_apipkg} = %{version} +# Last appeared in OpenSUSE 10.3: +Provides: poppler-devel:%{_libdir}/libpoppler-glib.so +# Last appeared in 11.4 +Provides: libpoppler-doc = %{version} +Obsoletes: libpoppler-doc < %{version} +# Last appeared in OpenSUSE 10.3: +Provides: poppler-doc = %{version} +Obsoletes: poppler-doc < %{version} + +%description -n libpoppler-glib-devel +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +%package -n libpoppler-cpp-devel +Summary: PDF rendering library - CPP Wrapper +License: GPL-2.0 +Group: Development/Libraries/C and C++ +Requires: libpoppler-cpp%{poppler_cpp_soname} = %{version} + + +Provides: poppler-cpp-devel = %{version} +Obsoletes: poppler-cpp-devel < %{version} + + + + +%description -n libpoppler-cpp-devel +Poppler is a PDF rendering library, forked from the xpdf PDF viewer +developed by Derek Noonburg of Glyph and Cog, LLC. + +#%package -n libpoppler-qt4-devel +#Summary: PDF rendering library - Qt4 Wrapper +#License: GPL-2.0+ +#Group: Development/Libraries/C and C++ +#Requires: libpoppler-devel = %{version} +#Requires: libpoppler-qt4-%{poppler_qt4_soname} = %{version} +#Requires: libqt4-devel +# Last appeared in OpenSUSE 10.3: +#Provides: poppler-devel:%{_libdir}/libpoppler-qt4.so + +#%description -n libpoppler-qt4-devel +#Poppler is a PDF rendering library, forked from the xpdf PDF viewer +#developed by Derek Noonburg of Glyph and Cog, LLC. + +%prep +%setup -q + +%build +#%define PREFIX /usr +#%define DATAROOTDIR /usr/share +#%define SYSCONFDIR /opt/etc +#%define LOCALSTATEDIR /opt/var + +#--prefix=%{PREFIX} --localstatedir=%{LOCALSTATEDIR} --sysconfdir=%{SYSCONFDIR} --datarootdir=%{DATAROOTDIR} \ + +%configure \ + --prefix=/usr --localstatedir=/opt/var --sysconfdir=/opt/etc --datarootdir=/usr/share \ + --enable-shared \ + --enable-libjpeg --disable-libopenjpeg --enable-libtiff \ + --enable-largefile \ + --enable-zlib --enable-libcurl \ + --enable-libpng \ + --enable-cairo-output \ + --enable-splash-output \ + --enable-poppler-glib \ + --enable-introspection=auto \ + --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf \ + --disable-poppler-qt4 --enable-poppler-cpp \ + --disable-gtk-test \ + --enable-xpdf-headers \ + --enable-compile-warnings=yes \ + --enable-cms --without-x --with-font-configuration=fontconfig + +make %{?_smp_mflags} + +%install +rm -rf %{buildroot} +%makeinstall +rm %{buildroot}%{_libdir}/*.la +mkdir -p %{buildroot}/usr/share/license +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler%{poppler_soname} +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-cpp%{poppler_cpp_soname} +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-glib%{poppler_glib_soname} +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-cpp-devel +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name}-tools +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-devel +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/libpoppler-glib-devel + +%post -n libpoppler%{poppler_soname} +/sbin/ldconfig + +%post -n libpoppler-glib%{poppler_glib_soname} +/sbin/ldconfig + +#%post -n libpoppler-qt4-%{poppler_qt4_soname} -p /sbin/ldconfig + +%postun -n libpoppler%{poppler_soname} +/sbin/ldconfig + +%postun -n libpoppler-glib%{poppler_glib_soname} +/sbin/ldconfig + +%post -n libpoppler-cpp%{poppler_cpp_soname} +/sbin/ldconfig + +%postun -n libpoppler-cpp%{poppler_cpp_soname} +/sbin/ldconfig + +#%postun -n libpoppler-qt4-%{poppler_qt4_soname} -p /sbin/ldconfig + +#%files -n libpoppler-qt4-%{poppler_qt4_soname} +#%defattr (-, root, root) +#%{_libdir}/libpoppler-qt4.so.%{poppler_qt4_soname}* + +#%files -n libpoppler-qt4-devel +#%defattr (-, root, root) +#%dir %{_includedir}/poppler +#%{_includedir}/poppler/qt4 +#%{_libdir}/libpoppler-qt4.so +#%{_libdir}/pkgconfig/poppler-qt4.pc + +%files -n libpoppler%{poppler_soname} +%manifest libpoppler.manifest +%defattr (-, root, root) +#%doc AUTHORS COPYING ChangeLog NEWS README README-XPDF TODO +/usr/share/license/libpoppler%{poppler_soname} +%{_libdir}/libpoppler.so.%{poppler_soname}* + +%files -n libpoppler-glib%{poppler_glib_soname} +%manifest libpoppler-glib.manifest +%defattr (-, root, root) +/usr/share/license/libpoppler-glib%{poppler_glib_soname} +%{_libdir}/libpoppler-glib.so.%{poppler_glib_soname}* + +#%files -n typelib-1_0-Poppler-%{poppler_apipkg} +#%defattr (-, root, root) +#%{_libdir}/girepository-1.0/Poppler-%{poppler_api}.typelib + +%files tools +%manifest poppler-tools.manifest +%defattr (-, root, root) +/usr/share/license/%{name}-tools +#%doc COPYING +%{_bindir}/pdfdetach +%{_bindir}/pdffonts +%{_bindir}/pdfimages +%{_bindir}/pdfinfo +%{_bindir}/pdfseparate +%{_bindir}/pdftocairo +%{_bindir}/pdftohtml +%{_bindir}/pdftoppm +%{_bindir}/pdftops +%{_bindir}/pdftotext +%{_bindir}/pdfunite +#%doc %{_mandir}/man1/*.* + +%files -n libpoppler-cpp%{poppler_cpp_soname} +%manifest libpoppler-cpp.manifest +%defattr(-, root, root) +/usr/share/license/libpoppler-cpp%{poppler_cpp_soname} +%{_libdir}/libpoppler-cpp.so.%{poppler_cpp_soname}* + +%files -n libpoppler-devel +%defattr (-, root, root) +%{_includedir}/poppler/*.h +%{_includedir}/poppler/fofi/*.h +%{_includedir}/poppler/goo/*.h +%{_includedir}/poppler/splash/*.h +%exclude %{_includedir}/poppler/cpp +%exclude %{_includedir}/poppler/glib +%{_libdir}/libpoppler.so +%{_libdir}/libpoppler.a +%exclude %{_libdir}/libpoppler-cpp.so +%{_libdir}/pkgconfig/poppler.pc +%{_libdir}/pkgconfig/poppler-cairo.pc +%exclude %{_libdir}/pkgconfig/poppler-cpp.pc +%{_libdir}/pkgconfig/poppler-splash.pc +/usr/share/license/libpoppler-devel + +%files -n libpoppler-glib-devel +%defattr (-, root, root) +%{_includedir}/poppler/glib +%{_libdir}/libpoppler-glib.so +%{_libdir}/pkgconfig/poppler-glib.pc +/usr/share/license/libpoppler-glib-devel +%files -n libpoppler-cpp-devel +%defattr (-, root, root) +%{_includedir}/poppler/cpp +%{_libdir}/libpoppler-cpp.so +%{_libdir}/pkgconfig/poppler-cpp.pc +/usr/share/license/libpoppler-cpp-devel + +#%{_datadir}/gir-1.0/Poppler-%{poppler_api}.gir +#%doc %{_datadir}/gtk-doc/html/poppler/ + +%changelog +* Mon May 14 2012 vuntz@opensuse.org +- Change pkgconfig(lcms) to pkgconfig(lcms2) since poppler 0.20 now + supports lcms2. +* Thu May 10 2012 badshah400@gmail.com +- Update to version 0.20.0: + + Core: + - Merge Xpdf 3.03 + - Annotation improvements + - CairoOutputDev: + . Fix regression caused by mesh gradients + . Use correct userfont font bbox (fdo#48399) + . Fix paintTransparencyGroup when both mask and fill opacity + are required (fdo#48453) + . Ensure 0 width lines with stroke_adjust are aligned + . Only align stroke coords for horizontal and vertical lines + (fdo#48318) + . Fix stroke pattern with transparency group (fdo#48468) + . Update cairo mesh pattern to 1.12 api + . Fix some transparency issues (fdo#47739) + . Fix regression in some shadings + . Avoid setting huge clip area when printing (fdo#44002) + . Fix test for rotation (fdo#14619) + . Don't read inline image streams twice (fdo#45668) + . Set mask matrix before drawing an image with a mask + (fdo#40828) + - SplashOutputDev: + . Implement Overprint + . Fix slow rendering of pdf with a lot of image masks in + pattern colorspace + . Fix rendering of knockout groups (fdo#12185) + . Fix cmyk transfer bug (fdo#49341) + - PSOutputDev: Implement Overprint + - TextOutputDev: Don't add newline to last line extracted by + TextSelectionDumper (fdo#45955) + - Add support for lcms2 + - More compatible file writing + - CJK font improvements + - ttc<->ttf fallback is expected for CJK font list in for + Windows (fdo#48046) + - Improve font matching for non embedded fonts + - Fix typos glyph names in truetype 'post' table standard mac + ordering + - Fix page labels to not have a null character at the end + - Fix logic error in Rendition parsing code (fdo#47063) + - Minor API changes to SplashOutputDev (fdo#46622) + - Expand glyph name ligatures such as "ff", "ffi" etc to + normal form (fdo#7002) + - Use an Identity CharCodeToUnicode for Adobe-Identity and + Adobe-UCS collections (fdo#35468) + - Update glyph names to Unicode values mapping (fdo#13131) + - Only use Hints table when there are no parse errors + (fdo#46459) + - Fix crash in JBIG2Stream decoding + - Fix crashes in broken documents + - Expose POPPLER_VERSION in poppler-config.h + - Reconstruct xref table if xref needed but missing + (fdo#40719) + - Fix getFullyQualifiedName with unicode field names + (fdo#49256) + - Bring back the Outputdev::begin/endMarkedContent virtuals + + Qt4: + - Annotations can now be modified/added/removed + - Form support improvements + - Support for LinkMovie object (fdo#40561) + - Support for Media Rendition + - Add the option of PSConverter creating EPS + - Convert propertly unicode encoded field qualified names + + Glib: + - Add poppler_fonts_iter_get_encoding + - Add poppler_fonts_iter_get_substitute_name + - Demo improvements + - Update gtk-doc makefile and m4 file + - Fix typos in documentation + - glib: Use delete[] to free array allocated with new[] + (fdo#48447) + + Utils: + - pdftohtml: + . Fix crash when the destination file does not exist + . Add producer and version to xml output + . Fix the mask inversion for PNG + . Extract mask images even if they are not JPEG (fdo#47186) + . Flip images if they need to (fdo#32340) + . Add possibilty of controlling word breaks percentage + (fdo#47022) + . Output images in -xml mode if no -i option is specified + . Get rid of static data members; merge duplicated jpeg + dumping code + . Be more consistent generating the outlines + . Generate outlines in pdftohtml in -xml mode (fdo#56993) + . Combine UTF16 surrogate pairs (fdo#46521) + - pdffonts: + . List the encoding of each font. (fdo#46888) + . Add -subst option to list the substitute font name and + filename + - pdfinfo: + . Report page rotation + . Decode utf-16 surrogate pairs + - pdftotext: Add missing section heading to man page + - pdftops: Fix -passfonts regression. (fdo#46744) + - pdftoppm: Allow one of -scale-to-[xy] = -1 to mean the + aspect ratio is to be preserved (fdo#43393) + - pdftocairo: Allow one of -scale-to-[xy] = -1 to mean the + aspect ratio is to be preserved + - pdfseparate: Produce PDF/X conformant pdf pages if the + original PDF was PDF/X conformant + - pdfimages: Add -list option to list all images (fdo#46066) + - Improve various manpages + + Build system: + - autotools: + . Do not append "-ansi" to CXXFLAG, if "-std=XXX" is already + specified. + . Do not clear FREETYPE_CFLAGS, FREETYPE_LIBS before + PKG_CHECK_MODULES() + . Copying graphics library CFLAGS to cpp frontend Makefile.am + . Print the cairo version required if not found (fdo#44619) + . Print the glib version required if not found + . Use pkgconfig to check for libopenjpeg (fdo#21789) + . Replace openjpeg compile test with a version test + - Minor cmake fixes + - Add a configuration option for the test data dir +- Updated sonames for shared libraries in keeping with upstream + package changes: poppler_soname is now 25, poppler_qt4_soname is + now 4. +* Sun Mar 4 2012 asterios.dramis@gmail.com +- Enabled build requirement for openjpeg. +* Thu Feb 16 2012 vuntz@opensuse.org +- Update to version 0.18.4: + + core: + - CairoOutputDev: + . Restore temporary clip used in CairoOutputDev::fill when + painting a mask + . Ensure paintTransparencyGroup uses same ctm as + beginTransparencyGroup (fdo#29968). + . Use fabs when comparing the transformed line width + (fdo#43441). + . Remove unused variable in CairoFontEngine.cc (fdo#45442). + - SplashOutputDev: Do not use 50Kb of stack in + SplashXPath::addCurve (fdo#44905). + - JpegWriter: set image parameters after jpeg_set_defaults() + (fdo#45224). + - OpenJPEG decoder: Set + OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG if you have it + (fdo#43414). + - Lexer: convert integer to real when overflow occurs + (fdo#45605). + + glib: + - Various minor introspection and documentation improvements + (fdo#44790). + - Fix return values (fdo#45440, fdo#45441). + - gtk-doc improvements (fdo#45549). + - Introspection improvements (fdo#45455). + + qt4: + - remove non-existing 'qt' include dirs + + utils: + - HtmlOutputDev: + . Proper unicode support when dumping PDF outline + (fdo#45572). + . Fix leaks (fdo#45805). + . Close li tags in generated outlines (fdo#45807). + - man pages: fix minor issues with hypens and %% + + build system: + - automake: Link to lcms if needed + - automake: Fix build for builddir != srcdir (fdo#45434). + - automake: Improve moc detection when cross compiling + - Fix build with latest mingw-w64 headers (fdo#45407). +* Mon Jan 16 2012 vuntz@opensuse.org +- Update to version 0.18.3: + + core: + - Do not fail if we are trying to save a file with Encrypt that + has not been modified (kde#288045) + - Include .otf fonts when finding substitute fonts (fdo#44412) + - Fix stack overflow in PDFDoc::markObject() (fdo#44660) + - Include strings.h as we use memcpy (fdo#43558) + + utils: + - pdfunite: Properly initialize globalParams (fdo#44659) + - pdfseparate: Properly initialize globalParams + - Fix iniliazialization of GooString arguments + + build system: + - autoconf: Check for cairo-ft and other cairo backends + (fdo#43969) +- Add explicit pkgconfig() BuildRequires, following upstream + changes, for: cairo-ft, cairo-pdf, cairo-ps, cairo-svg. +* Mon Jan 9 2012 vuntz@opensuse.org +- Split typelib file into typelib-1_0-Poppler-0_18 subpackage. +- Add typelib-1_0-Poppler-0_18 Requires to libpoppler-glib-devel + subpackage. +* Wed Jan 4 2012 vuntz@opensuse.org +- Update to version 0.18.2: + + core: + - Fix leak in GooString when resizing to a smaller string + - Fix crash if failing to parse the colorspace (fdo#42793) + - Make GfxColorSpace::parse accept dicts + + qt4: + - Use PDFDoc(wchar_t *, ...) on Windows (fdo#35378) + - Add missing include + - Minor fixes in documentation + + utils: + - pdftocairo: Fix crash when rendering only odd/even pages in a + printing format + + build system: + - Fix pkg-config files +* Tue Nov 15 2011 vuntz@opensuse.org +- Update to version 0.18.1: + + core: + - PSOutputDev: + . Output PS that does not confuse libspectre + . Fix tiling pattern fill matrix (fdo#41374) + . Emit non repeating patterns just once + . Fix uncolored tiling patterns (fdo#41462) + - CairoOutputDev: + . Fix crash when using poppler_page_get_image() + . Fix various setSoftMask bugs (fdo#41005) + + utils: + - pdftocairo: + . Flush/close files one we are done using them + . Compile on Windows + + build system: + - CMake: + . Fix typo in option description + . Correctly include fontconfig include dir + - Remove poppler-cairo dependency from poppler-glib pkg-config + file + + qt4: + - Minor fixes in documentation +- Bump poppler_soname to 19, following library soversion change. +* Tue Sep 27 2011 vuntz@opensuse.org +- Update to version 0.18.0: + + core: + - Fix small memory leak when dealing with marked content + - Remove DCTStream::getRawStream since Stream::getNextStream + does the same + + utils: + - Rename pdfmerge to pdfunite + - Rename pdfextract to pdfseparate + - pdfseparate: Complain if %%d is not present and it should + - Add pdfseparate and pdfunite man pages + + build system: + - Minor cleanup in regarding removed qt code +- Bump poppler_soname to 18, following upstream soversion change. +* Fri Sep 16 2011 vuntz@opensuse.org +- Update to version 0.17.4: + + core: + - SplashOutputDev: Compile when defining USE_FIXEDPOINT + - PNGWriter: Compile with libpng >= 1.5.0 +- Bump poppler_api define since the typelib file is now versioned + 0.18. +* Sat Sep 10 2011 vuntz@opensuse.org +- Update to version 0.17.3: + + core: + - PSOutputDev: + . Use Patterns for tiling fill when PS level >= 2 + . Avoid using /PatternType if only one instance of the + pattern is used + . Add poppler version as comment in the file + - CairoOutputDev: + . Set mime data for soft masked images (fdo#40192) + . Assume printer pixel size is 1/600" when stroking 0 width + lines (fdo#39067) + . Use cairo_show_text_glyphs() when printing + . Fix stroke patterns (fdo#11719) + . Fix unique id mime data + . Fix stroking of very thin lines + . Align strokes when Stroke Adjust is true and line + width <= 1 (fdo#4536) + - TextOutputDev: Add TextFontInfo::matches() + - Improve PNGWriter + - Rework writing of PDF files + + utils: + - Introduce pdftocairo: utility for creating + png/jpeg/ps/eps/pdf/svg using CairoOutputDev + - Introduce pdfextract: utility to extract PDF pages + - Introduce pdfmerge: utility to merge PDF files + - Fix compilation warning + - pdftohtml: Support text rotation (fdo#38586) + - Update SEE ALSO section of man pages + + glib: + - Add poppler_page_get_text_attributes() + - Add text attributes information to text demo + + qt4: + - Add a way to get the fully qualified name of a FormField + - Minor documentation improvements +- Changes from version 0.17.2: + + core: + - EmbeddedFile improvements + - Don't gmalloc(-1) upon ftell failure + - Fix missing content in some pages (fdo#39637) + - Improve selection of CJK fonts (fdo#36474) + - SplashOutputDev: + . Implement overprint + . Render dots for 0 length dashed lines (fdo#34150) + . Fix bad memory access when not using antialias (fdo#37189) + - PSOutputDev: + . Make level2sep and level3sep write cmyk instead of rgb + . Make level1sep, level2sep and level3sep write gray instead + of rgb for gray images + - Fix numerical overflow in libopenjpeg JPXStream (fdo#39361) + - Fix crash on truncated JPEG/DCT stream (fdo#36693) + - Make sure the dict is a page dict (fdo#35925, fdo#39072) + - Fix calculation of startXRefPos + - Handle missing startxref properly (fdo#38209) + - Parse the "Medium" modifier when asking fontconfig for a font + - Header cleanup + - Include cleanup + - Define cleanup + + glib: + - Add missing permissions flags to PopplerPermissions + - Add missing permission flags to info demo + - Update gtk-doc.make + - Add poppler_document_get_n_attachments() + + utils: + - pdftohtml: + . Fix encoding of PDF document metadata (fdo#37900) + . Fix vertical spacing issues (fdo#38019) + - pdftotext: Fix -htmlmeta to correctly output U+2019 in PDF + metadata (fdo#37900) + - pdftoppm: Implement overprint + + qt4: + - Rework EmbeddedFile internals + - Fix possible crash in test +- Changes from version 0.17.1: + + core: + - Rework the way form fields tree is built + - Cleanup unused parameters/variables + + glib: + - Add JavaScript actions + - demo: Show javascript actions in actions view + + qt4: + - tests: Turn some assignments to bool into QVERIFY checks +- Changes from version 0.17.0: + + core: + - Splash: + . Implement tiling patterns + . Support slight hinting + . Radial shading improvements + . General speed improvements + - Arthur: Add Hinting API + - Cairo: + . Implement Type 4,5,6,7 shadings using cairo mesh gradients + . Use the new cairo unique id to set the surface id when + printing + - PS: + . Add PS level1 non standard binary output option + . Allow setting the rasterization resolution + - Form support improvements + - Annotation support improvements + - General speed improvements + - Add support for handling ViewerPreferences + - Remove abiword output device + + utils: + - pdftoppm: + . Add -singlefile option (fdo#32025) + . Add TIFF output format support (fdo#32027) + - pdftops: + . Add PS level1 non standard binary output option + . Allow setting the rasterization resolution + - pdftoabw has been removed + + glib: + - Add poppler_form_field_get_action() (fdo#33174) + - Remove GDK API + - Remove test-poppler-glib + - demo: + . Add a tooltip with current selected character in text demo + . Show the activation action of form fields if there's one + + cpp: + - Add TIFF output possibility + - Add PNM output possibility + + qt4: + - Support slight hinting + - Form support improvements + + qt3: + - The Qt3 frontend has been removed + + tests: + - Merge splash and cairo tests into a single gtk-test tool +- Drop poppler-pdftoabw-overflow.patch: the abiword output device + got removed. +- Drop poppler-0.16.5-disable-demo.patch: we don't need it anymore, + as we won't build the test program anyway. +- Bump the soname macros to follow upstream soversion changes. +- Add libtiff-devel BuildRequires: new dependency. +- Remove unneeded gtk-doc, gtk2-devel and libxml2-devel + BuildRequires (GTK+ is only needed for a test tool). +- Remove pkg-config BuildRequires: by depending on glib, we know it + will be there. +- Remove qt3-devel BuildReqiures: the Qt3 frontend has been + removed. +- Move to pkgconfig()-style BuildRequires: + + Old ones: liblcms-devel, libpng-devel. + + New ones: lcms, libpng. +- Add pkgconfig() BuildRequires that were brought in by gtk2-devel + before: cairo, fontconfig, freetype2, gobject-2.0. +- Remove cairo-devel and libjpeg-devel Requires from + libpoppler-devel: those are not needed. +- Remove libpoppler-devel, cairo-devel, glib2-devel and gtk2-devel + Requires from libpoppler-glib-devel: the right Requires will + automatically be added the pkgconfig() way. +- Drop libpoppler-qt and libpoppler-qt3-devel subpackages as the + Qt3 frontend has been removed. +- Merge libpoppler-doc subpackage with libpoppler-glib-devel, as + the documentation is only for the glib API. Add appropriate + Provides/Obsoletes, and move the Provides/Obsoletes that + libpoppler-doc had too. +- Remove call to autoreconf: it was only needed for one of the + patches. +- Pass --disable-gtk-test: don't bother building the GTK+ test + program. +* Fri Aug 12 2011 dmueller@suse.de +- remove requires on libdrm-devel +* Fri May 20 2011 idonmez@novell.com +- Add poppler-0.16.5-disable-demo.patch: disable glib demo, its + using deprecated GTK+ functions +* Mon May 2 2011 vuntz@opensuse.org +- Update to version 0.16.5: + + core: + - Fix a memleak in AnnotScreen::initialize + - Properly initialize pageObjectNum to 0 (fdo#35925) + + utils: + - pdftotext: bbox coordinates are relative to MediaBox size, + not CropBox size + + cpp: + - Fix page_transition::operator= +- Changes from version 0.16.4: + + core: + - Small improvements in Annot parsing + + glib: + - Add g_return macros to make sure index is correct in form + field choice methods + - Fix a crash when a choice form field has no items selected in + glib-demo + + utils: + - Small fixes to the pdftohtml manpage + - Fix copyright years + + qt4: + - Fix caption of push button fields +- Changes from version 0.16.3: + + core: + - Increase precision in PS output device + - Workaround bug when converting pdf to ps with level1 + (fdo#31926) + - Fix crash in Splash output device in some broken pdf + - Fix infinite loop in some broken files + - Fix rendering of some substituted fonts (fdo#34522) + - Do not ask Freetype for 0x0 fonts in Splash output device + (fdo#34602) + - Don't assume y1 > y3 for points of a highlight annotation + (bgo#643028) + - Handle fontCIDType2OT when creating freetype font in Cairo + output device (bgo#643273) + - Fix crash in some pdf that use ICC color space (fdo#34357) + + glib: + - Don't use an uninitialized local variable in demo + - Add some introspection markers + + qt4: + - Fix crash regression in unicodeToQString (again) + + utils: + - pdftotext: Do not crash when using -bbox +- Ship COPYING in poppler-tools subpackage. Fixes bnc#678887. +- Update poppler_soname as the soname has changed again. +* Wed Feb 23 2011 fcrozat@novell.com +- Update to version 0.16.2: + + Core: + - Fix text extraction for some files + + qt4: + - Fix crash regression in unicodeToQString +- Changes from version 0.16.1: + + Core: + - Fix colorspace issues in the Cairo backend (fdo#32746) + - Remove declaration of function without implementation + - Do not crash in case jpeg_create_decompress fails (fdo#32890) + - Fix variable access mismatch (fdo#33063) + - Fix converting some pdf to ps with -level1sep (fdo#32365) + - Fix line selection, dont check y for Line selections + - Include zlib header in PNGWriter.cc + - Fix memleaks + + glib: + - Use NULL instead of FALSE for functions returning a pointer + - Fix memory leak in poppler_page_get_text_layout() for pages + with no text + + qt4: + - Fix unicodeToQString() to correctly decode the Unicode + sequence +- Changes from version 0.16.0: + + core: + - Improve the correctness of radial shadings (fdo#32349) + - Adapt the zlib-based FlateStream code to API changes + (fdo#32065) + - Make PreScanOutputDev be less agressive when deciding to + rasterize (fdo#30107) + - Fix some warnings in newer gcc in Splash backend + - Fix the preliminary bbox/clip calculation in Splash backend + - Use A1 instead of A8 for imagemask in the Cairo backend + + utils: + - Do not return 99 (or 1) with -h, -v and -printenc (fdo#32149) + + build system: + - Add more warning flags to the default gcc builds + - Enable GObject introspection support in the cmake build system +- Changes from version 0.15.3: + + core: + - Improve rendering of radial shadings + - Open a broken file (fdo#31861) + - Correct parsing of linearization table (fdo#31627) + - Find fonts inside patterns (fdo#31948) + - Use a std::vector instead of a var-length-array of + chars + - Fix crashes in broken files + - Use sets instead of arrays for looking for duplicate fonts + + cpp: + - Include correction + + utils: + - pdffonts: Remove duplicated code +- Changes from version 0.15.2: + + core: + - Improve shadings and antialias in the Splash backend + (fdo#30436) + - Linearization improvements + - Small improvements to the Arthur backend + - Fix calculation of the size of some pages (fdo#30784) + - Fix crashes in broken documents + + qt4: + - Add Page::renderToPainter() method + - Add setDebugErrorFunction() method + + cpp: + - Add the hability to render pages to an image + + utils: + - Add -p flag to pdfimages +- Changes from version 0.15.1: + + core: + - Consider render value when colorizing text (fdo#2807) + - Improve rendering of Shading Type 6 and 7 + - Improve dict lookup speed for big dicts + - Fix multiple crashes in malformed PDF files + - Fix memory leak in in malformed PDF files + - Fix memory leak in the Catalog names + - Fix uninitialized uses on DCTScanInfo + - Fix a crash when drawing square/circle annots without a + border (fdo#30580) + - Only clip boxes to mediabox if we are at the page level + (fdo#30784) + - Do not omit the notdef glyph in the Splash backend + - Fix a crash when redering documents with invalid type 3 + fonts in the Cairo backend + - Form improvements + - Add a method to get the PDF file identifier + + glib: + - Add more printing options to the API + - Add a method to get the PDF file identifier + - Add accessor for all PopplerDocument properties + - Form improvements + - Documentation improvements + - Improvements to the demo + + qt4: + - Add a callback to know which page has been printed + - Add a method to get the PDF file identifier + - Optimize GooString to QString conversion + - Update Doxyfile (enables .qch file for assistant) + + utils: + - pdftohtml: Add -s option to generate a single HTML page + - pdftotext: Add -bbox option + + cpp: + - Add the possibility of loading a document from raw data + - Add a method to get the PDF file identifier + - Improve Unicode to ustring conversion + - Documentation improvements + - Update Doxyfile +- Changes from version 0.15.0: + + core: + - Remove exception support + - Improve creation of Annotations + - Fix failure to parse PDF with damaged internal structure. + (fdo#29189, fdo#3870) + - Add a way to access the raw text of a page + - Speed improvements when reading multiple characters from a + given Stream + - Speed improvements in the Splash backend + - Speed improvement in gray color space calculations + - Speed improvement in ICC color space calculations + - Speed improvement when reading some fonts + - Make GBool a bool instead of an int + + glib: + - Add GObject introspection support + - Improve creation of Annotations + - Add a way to get the coordinates of each character of a page + - Add a way to get the page label + - Documentation improvements + - Support password protected documents in the demo + - Support for selection in the demo + - Support for adding annotationss in the demo + + qt4: + - Add a way to access the raw text of a page + - Recognize "Print" as named action + - Documentation improvements + + build system: + - Improvements when build the glib frontend with CMake + + utils: + - pdftohtml: Use splash instead of external gs invocation to + render the background + - pdftohtml: Let the user specify the resolution of the + background. (fdo#29551) + + cpp: + - Add a way to access the raw text of a page +- Changes from version 0.14.3: + + core: + - Tell Windows we are writing/reading binary data from + stdout/stdio (fdo#29329) + - Fix crash when parsing some Movie elements (kde#249586) +- Bump soname for glib / cpp / qt / qt4 libraries +- Add gobject-introspection-devel BuildRequires to enable + introspection support. +* Thu Nov 11 2010 coolo@novell.com +- own parent directories for poppler-qt +* Sat Oct 9 2010 vuntz@opensuse.org +- Update to version 0.14.4: + + core: + - Set initial state of optional content groups based on + BaseState field + - Fix multiple crashes in malformed PDF files + - Fix memory leak in in malformed PDF files + - Fix memory leak in the Catalog names + - Fix uninitialized uses on DCTScanInfo + - Fix a crash when drawing square/circle annots without a + border (fdo#30580) + + glib: + - Fix layers array generation when it contains multiple arrays + - Fix a crash when building layer actions (fdo#30106) +* Sat Sep 11 2010 vuntz@opensuse.org +- Update to version 0.14.3: + + core: + - Tell Windows we are writing/reading binary data from + stdout/stdio (bgo#29329) + - Fix crash when parsing some Movie elements (kde#249586) +* Thu Aug 19 2010 vuntz@opensuse.org +- Update to version 0.14.2: + + core: + - Fix rendering of some documents involving tilingPatternFill + in the cairo output device + - Improve rendering of some annotations + - Handle ColorTransform in DCT streams when using libjpeg + (fdo#28873) + - Fix crash in the ps output device in some files (kde#246269) + - Fix crash in some malformed files (fdo#28842) + + build system: + - Improve build on windows + - Add uninstalled .pc file support when using autoconf + + glib: + - Fix a crash when a layer doesn't have a name (fdo#28842) + + utils: + - Fix padding of names in pdftoppm +- Bump poppler_soname from 6 to 7. +* Thu Jul 15 2010 dimstar@opensuse.org +- Update to version 0.14.1: + + Core: + - fdo#26759: Add ObjectStream caching, makes opening some files + ten times faster + - fdo#28480: Fix crash when writing to negative coordinates + - Check objects are the type we want them to be when parsing + GfxICCBasedColorSpace + - Optimize Splash::compositeBackground + - Optimize color space calculations by using sqrt instead of + pow 0.5 + - Fix crash in JBIG2Stream with malformed documents + + build system: + - Make sure we ship two needed cmake files + - Do not distribute glib/poppler-features.h and + poppler/poppler-config.h + - Improve compilation with Sun Studio + - Fix linking of the cpp frontend when using autotools + + glib: + - fdo#28588: Fix links/annots area for some documents + - fdo#27927: Fix poppler_page_find_tex() when called more than + once + + utils: + - Add -cropbox to pdftoppm manual +* Thu May 20 2010 coolo@novell.com +- fix last change +* Mon May 17 2010 coolo@novell.com +- Split out qt bindings in a spec file, to speed up build. +* Thu Dec 24 2009 vuntz@opensuse.org +- Update to version 0.12.3: + + core: + - Be more lenient with /Decode key on images. fdo#17439 + - Correctly initialize fileName in LinkGoToR. fdo#25221 + - Improve the reconstruction of the XRef for broken files + - [Cairo backend] Do not crash on malformed files. fdo#24575 + - Accept Fontname if FontName is not present. kde#217013 + - Make PSOutputDev code a bit more resilient + - Fix writing of null objects. fdo#25465 + - [Cairo backend] Fix crash in some documents. bgo#603934 + - Correctly initialize profileCommands in Gfx constructor + + build system: + - Check for openjpeg in the C++ part as it uses bool in the + header. fdo#25103 +* Fri Dec 18 2009 jengelh@medozas.de +- Package documentation as noarch +* Sat Dec 5 2009 vuntz@opensuse.org +- Update to version 0.12.2: + + core: + - Fix a memory leak when converting to PostScript + - Fix crash when reading a font fails. fdo#24525 + - Make the ICC cache per page instead of global. fdo#24686 + - Do not accept negative interval lengths in the page labels + tree. fdo#24721 + - Do not crash on files Aspect of Movie objects are reals + instead of integers. fdo#24733 + - Do not render patterns when using CairoImageOutputDev + - Allow Transitions dictionary to be a Ref + - Do not crash if jpeg_start_decompress fails. kde#214317 + + glib: + - Fix CVE-2009-3607 + + qt4: + - Use '.' in the annotations XML instead of the decimal + separator of the current locale +- Drop poppler-CVE-2009-3607.patch: fixed upstream. +- Remove poppler_spec-prepare.sh, and instead integrate its code in + pre_checkin.sh. +* Fri Nov 13 2009 vuntz@opensuse.org +- Update to version 0.12.1: + + core: + - Fix compilation on some compilers + - Only initialize the font list once in Windows32/MSVC + - Do not crash on fonts without CharCodeToUnicode. fdo#24036 + - Fix regression due to not setting LC_NUMERIC anymore + - Improve realibility for Streams with broken Length. fdo#6841 + - Write the Info into the trailer dict if there is one. + fdo#24091 + - Do not crash when saving files that come from a stream + without name. fdo#24090 + - Improve relability of the save function + - Fix the Length value if it was wrong when saving + - Fix includes for those using internal headers + - Rework how hinting is used in the splash backend. It is + disabled by default now + - fix constructor of DCTStream when using internal decoder + - Security fixes based xpdf 3.02pl4 + + qt4: + - Add the possibility of setting wheter to use or not font + hinting + - Add a way for converters to return more exact errors they had + when converting + - Check the document is not locked when converting to PS + + build system: + - Compile on Cygwin + - Use _WIN32 instead of WIN32. Bug #24259 + - Add the possibility to pass LIB_SUFFIX when using CMake +- Drop poppler-change-hinting-flags.patch: fixed upstream. +- Drop poppler-CVE-2009-3608.patch: fixed upstream. +- Update description of the packages to be less verbose without + being less informative. +- Fix self-obsoletion rpmlint warnings: when we provide a version + of a package, don't obsolete <= this version, but <. +* Tue Oct 27 2009 bili@novell.com +- Help Vincent submit these patches. +- Add poppler-CVE-2009-3607.patch: fix an integer overflow, + bnc#546393, swampid#27127. +- Add poppler-CVE-2009-3608.patch: fix an integer overflow, + bnc#543090, swampid#27127. +- Add poppler-pdftoabw-overflow.patch to fix string overflows in + pdftoabw, bnc#537171, swampid#27127. +* Thu Oct 1 2009 wstephenson@suse.de +- Add patch to disable autohinting in the Splash backend, except + when the bytecode interpreter is enabled, for consistency with + other backends and better results +* Wed Sep 9 2009 vuntz@opensuse.org +- Update to version 0.12.0: + + core: + - Fix printf format security warnings + - Improve rendering of radial shadings. fdo#20238 + - Better fallback when there's a font type mismatch. fdo#17252 + - Do not crash on attachments without data stream. fdo#10386 + - Fix infinite loop in JBIG2Decoder. fdo#23025 + + build system: + - Minimizes pkg-config dependencies for Qt frontends + - Add automake 1.11 support + - Use the newest automake found and not the oldest + - Support AM_SILENT_RULES when using automake 1.11 + + utils: + - Add common options to pdftoabw +* Tue Aug 25 2009 vuntz@novell.com +- Update to version 0.11.3: + + core: + - Optimization in the Cairo renderer for some fonts + - Do not apply masks when fill color space mode is csPattern in + the Cairo renderer. fdo#22216 + - Check for overflow when parsing integers. fdo#23078 + - Do not save the font file twice for FreeType fonts in the + Cairo renderer. fdo#20491 + - Use current fill_opacity when drawing images in the Cairo renderer + - Fix alpha rendering in some files in the Splash renderer. + fdo#22143, fdo#22152 + - Implement tiling patterns in the Cairo renderer + - When converting a cm matrix to PS write 4 significant digits + for numbers < 1 not 4 decimals. fdo#23332 + - Fix changing of locale, now poppler no longer changes LC_NUMERIC to "C" + - Return PDF version as two integers instead of as a double + + Qt4: + - Addition of the Color Management API + - Small fix to documentation + - Fix backwards text search + + utils: + - Add the -png flag to pdftoppm to output to PNG +* Mon Aug 3 2009 vuntz@novell.com +- Update to version 0.11.2: + + core: + - Make DecryptStream return sane values for getPos(). fdo#19706 + - Fix bug when printing pdf with multiple page sizes in duplex + mode + - Initilize AnnotColot properly when the Array is not correct + - Fix crash on some files with forms. fdo#22485 + - Fix crash in files with invalid embedded files. fdo#22551 + - Improve FileSpec attribute parsing + - Cairo output device improvements. fdo#10942, fdo#18017, + fdo#14160 + - Implement blend modes in cairo backend + - Handle fontType1COT fonts in CairoFontEngine + - Fix generation of PS for some files. fdo#18908 + - Don't use byte_lookup table when color space doesn't support + getLine methods. fdo#11027 + - Fix rendering of PDF files with malformed patterns. fdo#22835 + - Add the possibility of disabling font substitution in + pdftops. fdo#23030 + - Fix some radio buttons not being detected as such + + glib: + - Improvements to the demo + + Qt4: + - Improvements to the demo + + build system: + - Use gtkbuilder rather than libglade for some tests + + utils: + - Fix bug with noCrop parameter in pdftops +* Tue Jul 28 2009 coolo@novell.com +- disable build of gtk-doc subpackage, the auto* macros are broken + (may be fixed in next beta) +* Tue Jul 28 2009 coolo@novell.com +- update to version 0.11.1: + core: + * Support colorizing text in pattern colorspace. Bug #19670 and #19994 + * Add the possibility of forcing no hinting of fonts in the Splash backend + * Support multiple page sizes when converting to PS. Bug #19777 + * Also tokens with leading 00 when parsing the char to unicode map. Bug #22025 + * Improvements of rendering speed in documents using PS transformations a lot. Bug #21562 + * More work on Annotations support + * Use Interpolate flag to decide whether applying image interpolation during rendering. Bug #9860 + * Handle Streams in CMap definitions. Bug #22334 + * Fix pdftops crash on file from KDE bug #174899 + * Fix PS generation in some files. Bug #20420 + * Do not create the GfxColorTransform if the lcms could not be created. Bug #20108 + * Give an error when using level1sep in pdftops without having CMYK support. Bug #22026 + * Kill support for specifying extension in openTmpFile. Bug #21713 + glib: + * Add poppler_annot_markup_has_popup() + * Hyphenate UTF-8 and UTF-16BE. Bug #21953 + * Use g_strerror instead of strerror. Bug #22095 + * Fix a crash when a destination points to an invalid page + * Improvements to the demo + Qt4: + * Add LinkDestination::destinationName() + * Do not try to resolve named destinations for GoTo links pointing to external documents + * Add Page::thumbnail() +* Thu May 21 2009 pgajdos@suse.cz +- added GlobalParams::forceNoFTAutoHinting() + - no-hinting.patch + + force-no-hinting.patch +- this patch was upstreamed and should appear in next release +* Sun May 17 2009 vuntz@novell.com +- Update to version 0.11.0: + + core: + - Add initial support for color management + - Remove case-insensitive matching of filenames in PDFDoc + constructor + - Fix extraction of some ActualText content + - More work on Annotations support + - Improve font rendering in Cairo output device + - Fix bug in cairo backend with nested masks + - Fix cairo luminosity smask rendering + - Add optionally text support to Cairo output device + - Add the possibility of setting the datadir on runtime + - Return an error code instead of a boolean when saving + - Make the font scanner more versatile + - Small opimization in documents that use PostScriptFunction + transforms + - Minor optimization to Stream handling + - Fix some compile warnings + + glib: + - Optional content support + - More work on Annotations support + - Improvements to the demo + - Documentation improvements + - Fix build when compiling with GTK_DISABLE_SINGLE_INCLUDES + + Qt4: + - Support URI actions for Table Of Contents items + - Documentation improvements + - Improvements to the demo + - Add a FontIterator for iterating through the fonts of the + document + + utils: + - Allow the use of cropbox in pdftoppm + - Make pdftohtml output png images when the image stream is not + a jpeg + - Make pdftotext accept cropping options like pdftoppm + - Support rendering non-square pixels in pdftoppm + + build system: + - Require Cairo 1.8.4 for the Cairo output device + - Require CMake 2.6 when using the CMake build system + - Optionally require libpng for pdftohtml + - Optionally require libcms for color management +- Add liblcms-devel and libpng-devel BuildRequires. +- Rename libpoppler4 to libpoppler5. +* Fri Apr 17 2009 vuntz@novell.com +- Update to version 0.10.6: + + core: + - Fix problems that happen when parsing broken JBIG2 files. + CVE-2009-0799, CVE-2009-0800, CVE-2009-1179, CVE-2009-1180, + CVE-2009-1181, CVE-2009-1182, CVE-2009-1183, CVE-2009-1187, + CVE-2009-1188 + - Fix parsing of incorrect border arrays. fdo#19761 + - Fix clip test for fonts. fdo#20950 + - Fix getGlyphAdvance to behave correctly on font size changes. + fdo#20769 + - Misc build fixes + + build system: + - Fix the Qt4 version we need +* Mon Mar 30 2009 pgajdos@suse.cz +- poppler tools now provides and obsoletes xpdf-tools +* Tue Mar 24 2009 pgajdos@suse.cz +- disable hinting -- patch moved from xpdf splash copy to + poppler's splash, reason: + xpdf is going to use splash from poppler instead of own and + unmaintained copy of splash. Without it, the xpdf rendering + of pdf is very poor, when pdf font is small (e. g. document + was zoomed out). + * no-hinting.patch +* Sun Mar 15 2009 vuntz@novell.com +- Update to version 0.10.5: + + core: + - Read the UF entry if present and prefer it over F in Filespec + dictionary + - Fix typo that was making CairoOutputDev crash on some files. + fdo#17337 + - Make JBIG2Stream more robust to corrupt input data + - Do not blindly follow loops parsing OutlineItem. fdo#18364 + - Set up the error manager before calling + jpeg_create_decompress. fdo#20484 + - Check there is an optional content config before using it. + fdo#20587 + - Fix rendering of some PDF with OpenType fonts. fdo#20605 + + build system: + - Yet more support for build on windows + - Use AC_CHECK_HEADER to find headers. fdo#20538 + - Check for pkgconfig before using it + - General autotools improvements +* Wed Feb 25 2009 vuntz@novell.com +- Remove autoreconf & libtool workaround: we have no reason to call + autoreconf. +- Remove -fno-strict-aliasing from CXXFLAGS: it's not needed for + the build. +- Remove -fstack-protector: it's a default flag now. +- Remove QTINC and QTLIB definition: it's not needed for the build. +* Mon Feb 23 2009 dmueller@suse.de +- use the distro provided libtool +* Wed Feb 11 2009 vuntz@novell.com +- Update to version 0.10.4: + + core: + - Fix a memory leak when asking for a document-level JS + - Do not crash in some PDF we do not parse correctly. + (fdo#19702) + - Fix crash on unexepcted form Opt value. (fdo#19790) + + utils: + - Fix pdfimages to extract i color components per pixel jpeg + images. (fdo#19789) +* Thu Feb 5 2009 vuntz@novell.com +- Update to version 0.10.3: + + core: + - Fix a crash on documents with malformed outline. fdo#19024 + - Fix leak on AnnotScreen destructor. fdo#19095 + - Fix wrong PS generation when a large image is in Patterns. + fdo#18908 + - Remove BaseFile.h it was never used. fdo#19298 + - Improve document saving + - Fix PS generation of PDF with malformed font Length2 + definition + - Fix a leak while parsing annotations + - Fix rendering of some checkboxes + + Qt4: + - Fix positioning of Form rects on PDF with cropbox + - Fix positioning of Annotation rects on PDF with cropbox. + fdo#18558. + - Small documentation improvements + - Make Document::fonts() work when called more than once. + fdo#19405 + + build system: + - CMake: look harder for openjpeg + - CMake: update the poppler core headers installation + - Autotools: do not install Function.cc as it's not a header + + Qt: + - Fix deserialization of links right coordinate +- Changes from version 0.10.2: + + core: + - Fix a crash when selecting text in word mode + - Fix a crash in some malformed documents (second argument of + opMarkPoint is not a dictionary) + - Ensure cairo font matrix is invertable. Fixes fdo#18254 and + fdo#18429 + - Fix a memory leak (fdo#18924) + + Qt4: + - Fix deserization of links right coordinate + + misc: + - Fix build on Solaris 10 + Sun Studio 12 + - Compile with -pedantic +* Mon Nov 24 2008 sbrabec@suse.cz +- Updated to version 0.10.1: + * Improvements in Optional Content support + * Small fixes in ActualText and Form support + * Fixed memory leaks and crashes + * Invalid rendering fixes + * Do not try to save documents that have Encryption + * Fix rendering regression on some fonts + * Documentation improvements + * Improve memory usage of the cairo renderer + * Initial JavaScript support + * Added a JPEG2000 decoder + * Emulate Adobe Reader behaviour on documents with duplicate keys + in Dictionaries + * Annotation improvements + * Add the possibility of extracting embedded fonts + * Added -listenc to pdfinfo and pdftotext +* Fri Sep 12 2008 maw@suse.de +- Update to version 0.8.7: + + Call error() when font loading fails + + Be less strict parsing TTF tables (bfo#16940) + + Fix crash due to uninitialized variable + + Fix regression in Form rendering + + Fix memory leak in the cairo backend + + Qt 4 frontend: + * Make the paper color setting working as it should + * Make sure to use the correct page width/height for form + widgets coordinates. +* Thu Aug 14 2008 sbrabec@suse.cz +- Updated to version 0.8.5: + * Use a single global FT_Library in CairoOutputDev. + * Do not limit CharCodeToUnicodeString to 8 characters + * crash, bug and leak fixes + * pdftohtml improvements +* Thu Jul 31 2008 dmueller@suse.de +- don't do poppler-devel rename for older distros +* Wed Jul 2 2008 maw@suse.de +- Add poppler-pagewidgets-null.patch (bnc#404955 and + CVE-2008-2950). +* Wed Jun 4 2008 sbrabec@suse.cz +- Updated to version 0.8.2: + * Add missing return in Object.h (fixes regression in 0.8.1) +- Backported annotation crash fixes from upstream (bnc#396634). +* Mon May 19 2008 maw@suse.de +- Provide pdftools_any in the -tools subpackage (bnc#378434). +* Mon May 12 2008 sbrabec@suse.cz +- Check for optional content before using it (bnc#389090, + fdo#15899). +* Tue Apr 29 2008 sbrabec@suse.cz +- Updated to version 0.8.1: + * Do not call FT_Done_Face on a live cairo_font_face_t as it + might cause crashes + * Do not take into account Colorspace resource subdictionary for + image XObjects + * Downsample 16 bit per component images to 8 bit per component + so they render + * Link to pthread when the system needs it +* Sat Apr 19 2008 schwab@suse.de +- Work around broken qt check. +* Fri Apr 11 2008 dmueller@suse.de +- remove obsoletes for older distros - it is just asking + for trouble for buildservice users +* Thu Apr 3 2008 sbrabec@suse.cz +- Updated to version 0.8.0: + * Public api changes + * Many bug fixes + * Better error handling + * Check the document stream is seekable when opening it + * Improve font matching not forcing default values onto + Fontconfig + * Add preliminary annotations support in the glib frontend + * Initial Movie support in the core + * Make GDK dependency optional in glib bindings + * Really distribute CMake files as optional build tool + * Initial Optional Content support in core and in the Qt4 + frontend + * Saving support + * Partial annotation support + * Forms improvements + * Add support for ActualText entries + * Display characters outside of unicode BMP with TT font + * CJK rendering fixes + * Implement Adobe Glyph Naming convention for fonts + * CMake as optional build tool + * Better font scaling for non embedded fonts + * Preserve PDF page labels when we output as postscript +* Thu Jan 31 2008 maw@suse.de +- Update to version 0.6.4: + Qt4 frontend: + * Fix crash on links that point to a non existant page + * Make Document::renderHints return the correct render hints + * Fix infinite loop when parsing LineAnnotation + core: + * Fix crash in the Splash renderer when T3 fonts are badly defined + * Draw underlined Links correctly + utils: + * Fix two use after free bugs in HtmlOutputDev.cc + build system: + * Fix build on mingw32 + tests: + * Distribute the glade file of pdf-inspector. +* Fri Jan 25 2008 maw@suse.de +- Update to version 0.6.3: + + core: + * Fix CVE-2007-4352, CVE-2007-5392 and CVE-2007-5393 + * Fix a crash on documents with wrong CCITTFaxStream + * Fix a crash in the Cairo renderer with invalid embedded fonts + * Fix a crash with invalid TrueType fonts + * Check if font is inside the clip area before rendering + it to a temporary bitmap in the Splash renderer. Fixes crashes + on incorrect documents + * Do not use exit(1) on DCTStream errors + * Detect form fields at any depth level + * Do not generate appearance stream for radio buttons that are + not active + * mingw fixes + * Fix crash in extra debug code + + glib frontend: + * Make sure passwords are passed correctly to poppler core + + Qt frontend: + * Improved documentation + * Fix crash on documents that specify an empty date + + Misc build improvements +- Remove xpdf2-CVE-2007-4352.diff, xpdf2-CVE-2007-5392.diff, + and xpdf2-CVE-2007-5393.diff, all of which have been upstreamed. +* Fri Jan 25 2008 stbinner@suse.de +- fix build on 10.2 +* Mon Nov 5 2007 maw@suse.de +- Add xpdf2-CVE-2007-4352.diff, xpdf2-CVE-2007-5392.diff, + and xpdf2-CVE-2007-5393.diff (#335637, CVE-2007-4352, + CVE-2007-5392, and CVE-2007-5393). +* Wed Oct 31 2007 sbrabec@suse.cz +- Provide and obsolete poppler-doc (#338021). +* Tue Oct 23 2007 sbrabec@suse.cz +- Use split-provides. Obsoleting something another package provides + creates a conflict between them. +* Tue Oct 23 2007 jpr@suse.de +- Updated to version 0.6.1: + * Fix printing with different x and y scale + * Fix crash when Form Fields array contains references to non + existent objects + * Fix crash in CairoOutputDev::drawMaskedImage() + * Fix embedded file description not working on some cases + * Fix printing issue with qt4 + * Avoid double free with qt4 + * Fix memory leak when dealing with embedded files in qt4 + * Fix build with --disable-cairo-output for glib + * Do not return unknown field type for signature form fields for + glib + * Support automake-1.10 + * More compatible sh code in qt.m4 + * Fix build on Sun Studio compiler +- For libpoppler-qt3-devel, libpoppler-qt4-devel and + libpoppler-glib-devel require libpoppler-devel not poppler-devel since + for obsoletion reasons that is provided by those packages (#335567) +-Add gnome-common to the build requires to remove configure errors +* Thu Oct 11 2007 sbrabec@suse.cz +- Use less strict dependencies for shared libraries. +- poppler devel package names prepended by "lib". +- poppler-qt-devel renamed to libpoppler-qt3-devel +- Fixed poppler_spec-prepare.sh to not alter %%changes. +* Mon Oct 8 2007 sbrabec@suse.cz +- Updated to version 0.6: + * CairoOutputDev fixes + * Allow pdftoppm to read/write from stdin/stdout + * API work on Qt4 frontend + * Fix pdfimages produces inverted image for black & white image + * Fix error on the NFKC text matching routine + * Add support for word and line selections + * Do not enforce %%%%EOF at the end of file + * Pad zeroes instead of aborting when rendering 1-bit images + and the stream is too short + * Update glib bindings documentation + * Merge xpdf 3.02 changes + * Qt4 frontend is not marked anymore as unstable + * Support for Sound objects + * Support for Opening/Closing page actions + * Support for page duration + * Improve PS Tokenizer performance thanks + * Various speed ups + * Beginning of Interactive Form support + * xpdfrc is no longer used for anything + * Add AbiWord output device and pdftoabw program + * Fix security issue MOAB-06-01-2007 + * Lots of bugs fixed +- Rename packages according to shared library naming policy. +- Make devel packages binding specific to deliver correct + dependencies (#249436). +* Sat Mar 10 2007 dmueller@suse.de +- remove now broken .la files from devel package + to fix build of all depending packages +* Mon Mar 5 2007 sbrabec@suse.cz +- Fixed devel dependencies (#249436). +- Removed some devel dependencies to force less to install. +* Mon Feb 5 2007 werner@suse.de +- Simplify usage of class UGooString +* Fri Jan 19 2007 maw@suse.de +- Add poppler-PageTree-depth-CVE-2007-0104.patch, fixing an + infinite loop in page tree (#233133 and CVE-2007-0104). +* Mon Jan 15 2007 dmueller@suse.de +- don't build static libs +* Fri Jan 12 2007 dmueller@suse.de +- fix pedantic warnings in qt4 headers +* Tue Jan 2 2007 sbrabec@suse.cz +- Fixed qt detection (#229896). +- Fixed dependencies. +- Reverted poppler-qt3 back to poppler-qt (#229896). +* Fri Dec 29 2006 james@usr-local-bin.org +- New subpackage: poppler-qt4 +- Rename poppler-qt to be poppler-qt3 +* Sat Dec 23 2006 james@usr-local-bin.org +- Add wildcard to use QT3 and QT4 bindings +* Tue Dec 19 2006 sbrabec@suse.cz +- Spec file cleanup. +- Splitted poppler-doc from poppler. +* Thu Oct 26 2006 jhargadon@suse.de +- added --sysconfdir=/etc option to ./configure in the specfile + as another part of the fix for bug #201739 +* Wed Oct 4 2006 jhargadon@suse.de +- moved man pages to the poppler-tools subpackage [#201739] +* Wed Sep 27 2006 jhargadon@suse.de +- update to version 0.5.4 +- Automatically read in CJK encoding files if they're installed +- Speed ups +- Patch from Dom Lachowicz to let the utils take input on stdin +- many bug fixes +* Mon Sep 4 2006 sbrabec@suse.cz +- Define conflict poppler-tools x xpdf-tools (#201739#c4). +* Thu Aug 31 2006 sbrabec@suse.cz +- Created poppler-tools providing xpdf-tools (#201739). +- Enabled parallel build. +* Fri Jul 7 2006 aj@suse.de +- Add back missing headers. +* Thu Jul 6 2006 gekker@suse.de +- Update to version 0.5.3 +- Remove upstreamed patches +* Tue Jun 13 2006 gekker@suse.de +- Fix evince crasher when selecting text (#152780) +* Thu Mar 23 2006 sbrabec@suse.cz +- Display CJK with cairo correctly (Mandriva patch, #160230). +- Fixed devel dependencies. +* Tue Feb 7 2006 sbrabec@suse.cz +- Fixed SplashXPathScanner heap overflow (#141242, CVE-2006-0301). +* Wed Jan 25 2006 mls@suse.de +- converted neededforbuild to BuildRequires +* Tue Jan 17 2006 nadvornik@suse.cz +- updated to 0.4.4 +- security patches merged upstream +* Mon Jan 16 2006 meissner@suse.de +- added -fno-strict-aliasing. +* Mon Jan 16 2006 meissner@suse.de +- use -fstack-protector. +* Wed Jan 11 2006 sbrabec@suse.cz +- Removed libpixman from neededforbuild. +* Thu Dec 15 2005 sbrabec@suse.cz +- Fixed more xpdf overflows and signed integer multiplications + (Chris Evans, Martin Pitt, #137156). +* Wed Dec 7 2005 sbrabec@suse.cz +- Xpdf heap owerflow fixes (#137156, CAN-2005-3191, CAN-2005-3192, + CAN-2005-3193). +* Mon Oct 24 2005 stbinner@suse.de +- remove remaining extra qualifications +* Tue Oct 18 2005 dmueller@suse.de +- fix extra qualifications in installed headers +* Fri Sep 2 2005 gekker@suse.de +- Update to version 0.4.2 +- Fixes to work with new cairo version +- Required by evince update for GNOME 2.12 +* Thu Aug 18 2005 gekker@suse.de +- Update to version 0.4.0 +- Remove uptreamed patchs +* Thu Jul 21 2005 gekker@suse.de +- Update to version 0.3.3 +* Mon Jun 27 2005 meissner@suse.de +- supply format attributes. +* Wed Jun 1 2005 sbrabec@suse.cz +- Fixed pkgconfig file. +* Tue May 24 2005 sbrabec@suse.cz +- Updated to version 0.3.2. +* Mon May 23 2005 sbrabec@suse.cz +- Split poppler-glib to subpackage. +* Sun May 22 2005 aj@suse.de +- Fix build with GCC4. +* Mon May 9 2005 sbrabec@suse.cz +- New SuSE package, version 0.3.1. diff --git a/poppler-cairo-uninstalled.pc.in b/poppler-cairo-uninstalled.pc.in new file mode 100644 index 0000000..2458eb2 --- /dev/null +++ b/poppler-cairo-uninstalled.pc.in @@ -0,0 +1,6 @@ +Name: poppler-cairo +Description: Cairo backend for Poppler PDF rendering library - uninstalled +Version: @VERSION@ +Requires: poppler = @VERSION@ cairo >= @CAIRO_VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/poppler/libpoppler-cairo.la diff --git a/poppler-cairo.pc.cmake b/poppler-cairo.pc.cmake new file mode 100644 index 0000000..b32f118 --- /dev/null +++ b/poppler-cairo.pc.cmake @@ -0,0 +1,9 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler-cairo +Description: Cairo backend for Poppler PDF rendering library +Version: @POPPLER_VERSION@ +Requires: poppler = @POPPLER_VERSION@ cairo >= @CAIRO_VERSION@ diff --git a/poppler-cairo.pc.in b/poppler-cairo.pc.in new file mode 100644 index 0000000..367a5b6 --- /dev/null +++ b/poppler-cairo.pc.in @@ -0,0 +1,9 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler-cairo +Description: Cairo backend for Poppler PDF rendering library +Version: @VERSION@ +Requires: poppler = @VERSION@ cairo >= @CAIRO_VERSION@ diff --git a/poppler-cpp-uninstalled.pc.in b/poppler-cpp-uninstalled.pc.in new file mode 100644 index 0000000..af3640e --- /dev/null +++ b/poppler-cpp-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: poppler-cpp +Description: cpp backend for Poppler PDF rendering library - uninstalled +Version: @VERSION@ +Requires: poppler = @VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/cpp/libpoppler-cpp.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/cpp diff --git a/poppler-cpp.pc.cmake b/poppler-cpp.pc.cmake new file mode 100644 index 0000000..3f56b3d --- /dev/null +++ b/poppler-cpp.pc.cmake @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler-cpp +Description: cpp backend for Poppler PDF rendering library +Version: @POPPLER_VERSION@ +Requires: @PC_REQUIRES@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-cpp +Cflags: -I${includedir}/poppler/cpp diff --git a/poppler-cpp.pc.in b/poppler-cpp.pc.in new file mode 100644 index 0000000..a7e97c2 --- /dev/null +++ b/poppler-cpp.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler-cpp +Description: cpp backend for Poppler PDF rendering library +Version: @VERSION@ +Requires: @PC_REQUIRES@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-cpp +Cflags: -I${includedir}/poppler/cpp diff --git a/poppler-glib-uninstalled.pc.in b/poppler-glib-uninstalled.pc.in new file mode 100644 index 0000000..5fcb6f2 --- /dev/null +++ b/poppler-glib-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: poppler-glib +Description: GLib wrapper for poppler - uninstalled +Version: @VERSION@ +Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/glib/libpoppler-glib.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/glib diff --git a/poppler-glib.pc.cmake b/poppler-glib.pc.cmake new file mode 100644 index 0000000..e15e669 --- /dev/null +++ b/poppler-glib.pc.cmake @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler-glib +Description: GLib wrapper for poppler +Version: @POPPLER_VERSION@ +Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-glib +Cflags: -I${includedir}/poppler/glib diff --git a/poppler-glib.pc.in b/poppler-glib.pc.in new file mode 100644 index 0000000..9ba8978 --- /dev/null +++ b/poppler-glib.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler-glib +Description: GLib wrapper for poppler +Version: @VERSION@ +Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-glib +Cflags: -I${includedir}/poppler/glib diff --git a/poppler-qt4-uninstalled.pc.in b/poppler-qt4-uninstalled.pc.in new file mode 100644 index 0000000..3a336c6 --- /dev/null +++ b/poppler-qt4-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: poppler-qt4 +Description: Qt4 bindings for poppler - uninstalled +Version: @VERSION@ +Requires: poppler = @VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/qt4/src/libpoppler-qt4.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/qt4/src diff --git a/poppler-qt4.pc.cmake b/poppler-qt4.pc.cmake new file mode 100644 index 0000000..b17fd5d --- /dev/null +++ b/poppler-qt4.pc.cmake @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler-qt4 +Description: Qt4 bindings for poppler +Version: @POPPLER_VERSION@ +Requires: @PC_REQUIRES@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-qt4 +Cflags: -I${includedir}/poppler/qt4 diff --git a/poppler-qt4.pc.in b/poppler-qt4.pc.in new file mode 100644 index 0000000..306ae46 --- /dev/null +++ b/poppler-qt4.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler-qt4 +Description: Qt4 bindings for poppler +Version: @VERSION@ +Requires: @PC_REQUIRES@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-qt4 +Cflags: -I${includedir}/poppler/qt4 diff --git a/poppler-splash-uninstalled.pc.in b/poppler-splash-uninstalled.pc.in new file mode 100644 index 0000000..436ecdb --- /dev/null +++ b/poppler-splash-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: poppler-splash +Description: Splash backend for Poppler PDF rendering library - uninstalled +Version: @VERSION@ +Requires: poppler = @VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/splash/libsplash.la + diff --git a/poppler-splash.pc.cmake b/poppler-splash.pc.cmake new file mode 100644 index 0000000..cb95b3d --- /dev/null +++ b/poppler-splash.pc.cmake @@ -0,0 +1,9 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler-splash +Description: Splash backend for Poppler PDF rendering library +Version: @POPPLER_VERSION@ +Requires: poppler = @POPPLER_VERSION@ diff --git a/poppler-splash.pc.in b/poppler-splash.pc.in new file mode 100644 index 0000000..cf3491f --- /dev/null +++ b/poppler-splash.pc.in @@ -0,0 +1,9 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler-splash +Description: Splash backend for Poppler PDF rendering library +Version: @VERSION@ +Requires: poppler = @VERSION@ diff --git a/poppler-tools.manifest b/poppler-tools.manifest new file mode 100644 index 0000000..dacbf7f --- /dev/null +++ b/poppler-tools.manifest @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/poppler-uninstalled.pc.in b/poppler-uninstalled.pc.in new file mode 100644 index 0000000..6076e80 --- /dev/null +++ b/poppler-uninstalled.pc.in @@ -0,0 +1,6 @@ +Name: poppler +Description: PDF rendering library - uninstalled +Version: @VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/poppler/libpoppler.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/poppler diff --git a/poppler.pc.cmake b/poppler.pc.cmake new file mode 100644 index 0000000..f1aebed --- /dev/null +++ b/poppler.pc.cmake @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler +Description: PDF rendering library +Version: @POPPLER_VERSION@ + +Libs: -L${libdir} -lpoppler +Cflags: -I${includedir}/poppler diff --git a/poppler.pc.in b/poppler.pc.in new file mode 100644 index 0000000..8605b28 --- /dev/null +++ b/poppler.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler +Description: PDF rendering library +Version: @VERSION@ + +Libs: -L${libdir} -lpoppler +Cflags: -I${includedir}/poppler diff --git a/poppler/Annot.cc b/poppler/Annot.cc new file mode 100644 index 0000000..aa8b9a8 --- /dev/null +++ b/poppler/Annot.cc @@ -0,0 +1,6582 @@ +//======================================================================== +// +// Annot.cc +// +// Copyright 2000-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Scott Turner +// Copyright (C) 2007, 2008 Julien Rebetez +// Copyright (C) 2007-2012 Albert Astals Cid +// Copyright (C) 2007-2011 Carlos Garcia Campos +// Copyright (C) 2007, 2008 Iñigo Martínez +// Copyright (C) 2007 Jeff Muizelaar +// Copyright (C) 2008, 2011 Pino Toscano +// Copyright (C) 2008 Michael Vrable +// Copyright (C) 2008 Hugo Mercier +// Copyright (C) 2009 Ilya Gorenbein +// Copyright (C) 2011 José Aliste +// Copyright (C) 2012 Fabio D'Urso +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "goo/gmem.h" +#include "goo/gstrtod.h" +#include "GooList.h" +#include "Error.h" +#include "Object.h" +#include "Catalog.h" +#include "Gfx.h" +#include "Lexer.h" +#include "PDFDoc.h" +#include "Page.h" +#include "Annot.h" +#include "GfxFont.h" +#include "CharCodeToUnicode.h" +#include "PDFDocEncoding.h" +#include "Form.h" +#include "Error.h" +#include "XRef.h" +#include "Movie.h" +#include "OptionalContent.h" +#include "Sound.h" +#include "FileSpec.h" +#include "DateInfo.h" +#include "Link.h" +#include + +#define fieldFlagReadOnly 0x00000001 +#define fieldFlagRequired 0x00000002 +#define fieldFlagNoExport 0x00000004 +#define fieldFlagMultiline 0x00001000 +#define fieldFlagPassword 0x00002000 +#define fieldFlagNoToggleToOff 0x00004000 +#define fieldFlagRadio 0x00008000 +#define fieldFlagPushbutton 0x00010000 +#define fieldFlagCombo 0x00020000 +#define fieldFlagEdit 0x00040000 +#define fieldFlagSort 0x00080000 +#define fieldFlagFileSelect 0x00100000 +#define fieldFlagMultiSelect 0x00200000 +#define fieldFlagDoNotSpellCheck 0x00400000 +#define fieldFlagDoNotScroll 0x00800000 +#define fieldFlagComb 0x01000000 +#define fieldFlagRichText 0x02000000 +#define fieldFlagRadiosInUnison 0x02000000 +#define fieldFlagCommitOnSelChange 0x04000000 + +#define fieldQuadLeft 0 +#define fieldQuadCenter 1 +#define fieldQuadRight 2 + +// distance of Bezier control point from center for circle approximation +// = (4 * (sqrt(2) - 1) / 3) * r +#define bezierCircle 0.55228475 + +AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) { + if (string != NULL) { + if (!string->cmp("Square")) { + return annotLineEndingSquare; + } else if (!string->cmp("Circle")) { + return annotLineEndingCircle; + } else if (!string->cmp("Diamond")) { + return annotLineEndingDiamond; + } else if (!string->cmp("OpenArrow")) { + return annotLineEndingOpenArrow; + } else if (!string->cmp("ClosedArrow")) { + return annotLineEndingClosedArrow; + } else if (!string->cmp("Butt")) { + return annotLineEndingButt; + } else if (!string->cmp("ROpenArrow")) { + return annotLineEndingROpenArrow; + } else if (!string->cmp("RClosedArrow")) { + return annotLineEndingRClosedArrow; + } else if (!string->cmp("Slash")) { + return annotLineEndingSlash; + } else { + return annotLineEndingNone; + } + } else { + return annotLineEndingNone; + } +} + +const char* convertAnnotLineEndingStyle(AnnotLineEndingStyle style) { + switch (style) { + case annotLineEndingSquare: + return "Square"; + case annotLineEndingCircle: + return "Circle"; + case annotLineEndingDiamond: + return "Diamond"; + case annotLineEndingOpenArrow: + return "OpenArrow"; + case annotLineEndingClosedArrow: + return "ClosedArrow"; + case annotLineEndingButt: + return "Butt"; + case annotLineEndingROpenArrow: + return "ROpenArrow"; + case annotLineEndingRClosedArrow: + return "RClosedArrow"; + case annotLineEndingSlash: + return "Slash"; + default: + return "None"; + } +} + +static AnnotExternalDataType parseAnnotExternalData(Dict* dict) { + Object obj1; + AnnotExternalDataType type; + + if (dict->lookup("Subtype", &obj1)->isName()) { + const char *typeName = obj1.getName(); + + if (!strcmp(typeName, "Markup3D")) { + type = annotExternalDataMarkup3D; + } else { + type = annotExternalDataMarkupUnknown; + } + } else { + type = annotExternalDataMarkupUnknown; + } + obj1.free(); + + return type; +} + +PDFRectangle *parseDiffRectangle(Array *array, PDFRectangle *rect) { + PDFRectangle *newRect = NULL; + if (array->getLength() == 4) { + // deltas + Object obj1; + double dx1 = (array->get(0, &obj1)->isNum() ? obj1.getNum() : 0); + obj1.free(); + double dy1 = (array->get(1, &obj1)->isNum() ? obj1.getNum() : 0); + obj1.free(); + double dx2 = (array->get(2, &obj1)->isNum() ? obj1.getNum() : 0); + obj1.free(); + double dy2 = (array->get(3, &obj1)->isNum() ? obj1.getNum() : 0); + obj1.free(); + + // checking that the numbers are valid (i.e. >= 0), + // and that applying the differences still give us a valid rect + if (dx1 >= 0 && dy1 >= 0 && dx2 >= 0 && dy2 + && (rect->x2 - rect->x1 - dx1 - dx2) >= 0 + && (rect->y2 - rect->y1 - dy1 - dy2) >= 0) { + newRect = new PDFRectangle(); + newRect->x1 = rect->x1 + dx1; + newRect->y1 = rect->y1 + dy1; + newRect->x2 = rect->x2 - dx2; + newRect->y2 = rect->y2 - dy2; + } + } + return newRect; +} + +//------------------------------------------------------------------------ +// AnnotBorderEffect +//------------------------------------------------------------------------ + +AnnotBorderEffect::AnnotBorderEffect(Dict *dict) { + Object obj1; + + if (dict->lookup("S", &obj1)->isName()) { + const char *effectName = obj1.getName(); + + if (!strcmp(effectName, "C")) + effectType = borderEffectCloudy; + else + effectType = borderEffectNoEffect; + } else { + effectType = borderEffectNoEffect; + } + obj1.free(); + + if ((dict->lookup("I", &obj1)->isNum()) && effectType == borderEffectCloudy) { + intensity = obj1.getNum(); + } else { + intensity = 0; + } + obj1.free(); +} + +//------------------------------------------------------------------------ +// AnnotPath +//------------------------------------------------------------------------ + +AnnotPath::AnnotPath() { + coords = NULL; + coordsLength = 0; +} + +AnnotPath::AnnotPath(Array *array) { + coords = NULL; + coordsLength = 0; + parsePathArray(array); +} + +AnnotPath::AnnotPath(AnnotCoord **coords, int coordsLength) { + this->coords = coords; + this->coordsLength = coordsLength; +} + +AnnotPath::~AnnotPath() { + if (coords) { + for (int i = 0; i < coordsLength; ++i) + delete coords[i]; + gfree(coords); + } +} + +double AnnotPath::getX(int coord) const { + if (coord >= 0 && coord < coordsLength) + return coords[coord]->getX(); + return 0; +} + +double AnnotPath::getY(int coord) const { + if (coord >= 0 && coord < coordsLength) + return coords[coord]->getY(); + return 0; +} + +AnnotCoord *AnnotPath::getCoord(int coord) const { + if (coord >= 0 && coord < coordsLength) + return coords[coord]; + return NULL; +} + +void AnnotPath::parsePathArray(Array *array) { + int tempLength; + AnnotCoord **tempCoords; + GBool correct = gTrue; + + if (array->getLength() % 2) { + error(errSyntaxError, -1, "Bad Annot Path"); + return; + } + + tempLength = array->getLength() / 2; + tempCoords = (AnnotCoord **) gmallocn (tempLength, sizeof(AnnotCoord *)); + memset(tempCoords, 0, tempLength * sizeof(AnnotCoord *)); + for (int i = 0; i < tempLength && correct; i++) { + Object obj1; + double x = 0, y = 0; + + if (array->get(i * 2, &obj1)->isNum()) { + x = obj1.getNum(); + } else { + correct = gFalse; + } + obj1.free(); + + if (array->get((i * 2) + 1, &obj1)->isNum()) { + y = obj1.getNum(); + } else { + correct = gFalse; + } + obj1.free(); + + if (!correct) { + for (int j = i - 1; j >= 0; j--) + delete tempCoords[j]; + gfree (tempCoords); + return; + } + + tempCoords[i] = new AnnotCoord(x, y); + } + + coords = tempCoords; + coordsLength = tempLength; +} + +//------------------------------------------------------------------------ +// AnnotCalloutLine +//------------------------------------------------------------------------ + +AnnotCalloutLine::AnnotCalloutLine(double x1, double y1, double x2, double y2) + : coord1(x1, y1), coord2(x2, y2) { +} + +//------------------------------------------------------------------------ +// AnnotCalloutMultiLine +//------------------------------------------------------------------------ + +AnnotCalloutMultiLine::AnnotCalloutMultiLine(double x1, double y1, double x2, + double y2, double x3, double y3) + : AnnotCalloutLine(x1, y1, x2, y2), coord3(x3, y3) { +} + +//------------------------------------------------------------------------ +// AnnotQuadrilateral +//------------------------------------------------------------------------ + +AnnotQuadrilaterals::AnnotQuadrilaterals(Array *array, PDFRectangle *rect) { + int arrayLength = array->getLength(); + GBool correct = gTrue; + int quadsLength = 0; + AnnotQuadrilateral **quads; + double quadArray[8]; + + // default values + quadrilaterals = NULL; + quadrilateralsLength = 0; + + if ((arrayLength % 8) == 0) { + int i; + + quadsLength = arrayLength / 8; + quads = (AnnotQuadrilateral **) gmallocn + ((quadsLength), sizeof(AnnotQuadrilateral *)); + memset(quads, 0, quadsLength * sizeof(AnnotQuadrilateral *)); + + for (i = 0; i < quadsLength; i++) { + for (int j = 0; j < 8; j++) { + Object obj; + if (array->get(i * 8 + j, &obj)->isNum()) { + quadArray[j] = obj.getNum(); + } else { + correct = gFalse; + obj.free(); + error (errSyntaxError, -1, "Invalid QuadPoint in annot"); + break; + } + obj.free(); + } + + if (!correct) + break; + + quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1], + quadArray[2], quadArray[3], + quadArray[4], quadArray[5], + quadArray[6], quadArray[7]); + } + + if (correct) { + quadrilateralsLength = quadsLength; + quadrilaterals = quads; + } else { + for (int j = 0; j < i; j++) + delete quads[j]; + gfree (quads); + } + } +} + +AnnotQuadrilaterals::AnnotQuadrilaterals(AnnotQuadrilaterals::AnnotQuadrilateral **quads, int quadsLength) { + quadrilaterals = quads; + quadrilateralsLength = quadsLength; +} + +AnnotQuadrilaterals::~AnnotQuadrilaterals() { + if (quadrilaterals) { + for(int i = 0; i < quadrilateralsLength; i++) + delete quadrilaterals[i]; + + gfree (quadrilaterals); + } +} + +double AnnotQuadrilaterals::getX1(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord1.getX(); + return 0; +} + +double AnnotQuadrilaterals::getY1(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord1.getY(); + return 0; +} + +double AnnotQuadrilaterals::getX2(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord2.getX(); + return 0; +} + +double AnnotQuadrilaterals::getY2(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord2.getY(); + return 0; +} + +double AnnotQuadrilaterals::getX3(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord3.getX(); + return 0; +} + +double AnnotQuadrilaterals::getY3(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord3.getY(); + return 0; +} + +double AnnotQuadrilaterals::getX4(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord4.getX(); + return 0; +} + +double AnnotQuadrilaterals::getY4(int quadrilateral) { + if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) + return quadrilaterals[quadrilateral]->coord4.getY(); + return 0; +} + +AnnotQuadrilaterals::AnnotQuadrilateral::AnnotQuadrilateral(double x1, double y1, + double x2, double y2, double x3, double y3, double x4, double y4) + : coord1(x1, y1), coord2(x2, y2), coord3(x3, y3), coord4(x4, y4) { +} + +//------------------------------------------------------------------------ +// AnnotBorder +//------------------------------------------------------------------------ +AnnotBorder::AnnotBorder() { + type = typeUnknown; + width = 1; + dashLength = 0; + dash = NULL; + style = borderSolid; +} + +GBool AnnotBorder::parseDashArray(Object *dashObj) { + GBool correct = gTrue; + int tempLength = dashObj->arrayGetLength(); + double *tempDash = (double *) gmallocn (tempLength, sizeof (double)); + + // TODO: check not all zero (Line Dash Pattern Page 217 PDF 8.1) + for (int i = 0; i < tempLength && i < DASH_LIMIT && correct; i++) { + Object obj1; + + if (dashObj->arrayGet(i, &obj1)->isNum()) { + tempDash[i] = obj1.getNum(); + + correct = tempDash[i] >= 0; + obj1.free(); + } + } + + if (correct) { + dashLength = tempLength; + dash = tempDash; + style = borderDashed; + } else { + gfree (tempDash); + } + + return correct; +} + +AnnotBorder::~AnnotBorder() { + if (dash) + gfree (dash); +} + +//------------------------------------------------------------------------ +// AnnotBorderArray +//------------------------------------------------------------------------ + +AnnotBorderArray::AnnotBorderArray() { + type = typeArray; + horizontalCorner = 0; + verticalCorner = 0; +} + +AnnotBorderArray::AnnotBorderArray(Array *array) { + Object obj1; + int arrayLength = array->getLength(); + + GBool correct = gTrue; + if (arrayLength == 3 || arrayLength == 4) { + // implementation note 81 in Appendix H. + + if (array->get(0, &obj1)->isNum()) + horizontalCorner = obj1.getNum(); + else + correct = gFalse; + obj1.free(); + + if (array->get(1, &obj1)->isNum()) + verticalCorner = obj1.getNum(); + else + correct = gFalse; + obj1.free(); + + if (array->get(2, &obj1)->isNum()) + width = obj1.getNum(); + else + correct = gFalse; + obj1.free(); + + if (arrayLength == 4) { + if (array->get(3, &obj1)->isArray()) + correct = parseDashArray(&obj1); + else + correct = gFalse; + obj1.free(); + } + } else { + correct = gFalse; + } + + if (!correct) { + width = 0; + } +} + +void AnnotBorderArray::writeToObject(XRef *xref, Object *obj1) const { + Object obj2; + + obj1->initArray(xref); + obj1->arrayAdd(obj2.initReal( horizontalCorner )); + obj1->arrayAdd(obj2.initReal( verticalCorner )); + obj1->arrayAdd(obj2.initReal( width )); + // TODO: Dash array +} + +//------------------------------------------------------------------------ +// AnnotBorderBS +//------------------------------------------------------------------------ + +AnnotBorderBS::AnnotBorderBS() { + type = typeBS; +} + +AnnotBorderBS::AnnotBorderBS(Dict *dict) { + Object obj1, obj2; + + // acroread 8 seems to need both W and S entries for + // any border to be drawn, even though the spec + // doesn't claim anything of that sort. We follow + // that behaviour by veryifying both entries exist + // otherwise we set the borderWidth to 0 + // --jrmuizel + dict->lookup("W", &obj1); + dict->lookup("S", &obj2); + if (obj1.isNum() && obj2.isName()) { + const char *styleName = obj2.getName(); + + width = obj1.getNum(); + + if (!strcmp(styleName, "S")) { + style = borderSolid; + } else if (!strcmp(styleName, "D")) { + style = borderDashed; + } else if (!strcmp(styleName, "B")) { + style = borderBeveled; + } else if (!strcmp(styleName, "I")) { + style = borderInset; + } else if (!strcmp(styleName, "U")) { + style = borderUnderlined; + } else { + style = borderSolid; + } + } else { + width = 0; + } + obj2.free(); + obj1.free(); + + if (style == borderDashed) { + if (dict->lookup("D", &obj1)->isArray()) + parseDashArray(&obj1); + obj1.free(); + + if (!dash) { + dashLength = 1; + dash = (double *) gmallocn (dashLength, sizeof (double)); + dash[0] = 3; + } + } +} + +//------------------------------------------------------------------------ +// AnnotColor +//------------------------------------------------------------------------ + +AnnotColor::AnnotColor() { + length = 0; +} + +AnnotColor::AnnotColor(double gray) { + length = 1; + + values[0] = gray; +} + +AnnotColor::AnnotColor(double r, double g, double b) { + length = 3; + + values[0] = r; + values[1] = g; + values[2] = b; +} + +AnnotColor::AnnotColor(double c, double m, double y, double k) { + length = 4; + + values[0] = c; + values[1] = m; + values[2] = y; + values[3] = k; +} + +// If is +1, color is brightened; +// if is -1, color is darkened; +// otherwise color is not modified. +AnnotColor::AnnotColor(Array *array, int adjust) { + int i; + + length = array->getLength(); + if (length > 4) + length = 4; + + for (i = 0; i < length; i++) { + Object obj1; + + if (array->get(i, &obj1)->isNum()) { + values[i] = obj1.getNum(); + + if (values[i] < 0 || values[i] > 1) + values[i] = 0; + } else { + values[i] = 0; + } + obj1.free(); + } + + if (adjust != 0) + adjustColor(adjust); +} + +void AnnotColor::adjustColor(int adjust) { + int i; + + if (length == 4) { + adjust = -adjust; + } + if (adjust > 0) { + for (i = 0; i < length; ++i) { + values[i] = 0.5 * values[i] + 0.5; + } + } else if (adjust < 0) { + for (i = 0; i < length; ++i) { + values[i] = 0.5 * values[i]; + } + } +} + +void AnnotColor::writeToObject(XRef *xref, Object *obj1) const { + Object obj2; + int i; + + if (length == 0) { + obj1->initNull(); // Transparent (no color) + } else { + obj1->initArray(xref); + for (i = 0; i < length; ++i) + obj1->arrayAdd( obj2.initReal( values[i] ) ); + } +} + +//------------------------------------------------------------------------ +// AnnotIconFit +//------------------------------------------------------------------------ + +AnnotIconFit::AnnotIconFit(Dict* dict) { + Object obj1; + + if (dict->lookup("SW", &obj1)->isName()) { + const char *scaleName = obj1.getName(); + + if(!strcmp(scaleName, "B")) { + scaleWhen = scaleBigger; + } else if(!strcmp(scaleName, "S")) { + scaleWhen = scaleSmaller; + } else if(!strcmp(scaleName, "N")) { + scaleWhen = scaleNever; + } else { + scaleWhen = scaleAlways; + } + } else { + scaleWhen = scaleAlways; + } + obj1.free(); + + if (dict->lookup("S", &obj1)->isName()) { + const char *scaleName = obj1.getName(); + + if(!strcmp(scaleName, "A")) { + scale = scaleAnamorphic; + } else { + scale = scaleProportional; + } + } else { + scale = scaleProportional; + } + obj1.free(); + + if (dict->lookup("A", &obj1)->isArray() && obj1.arrayGetLength() == 2) { + Object obj2; + (obj1.arrayGet(0, &obj2)->isNum() ? left = obj2.getNum() : left = 0); + obj2.free(); + (obj1.arrayGet(1, &obj2)->isNum() ? bottom = obj2.getNum() : bottom = 0); + obj2.free(); + + if (left < 0 || left > 1) + left = 0.5; + + if (bottom < 0 || bottom > 1) + bottom = 0.5; + + } else { + left = bottom = 0.5; + } + obj1.free(); + + if (dict->lookup("FB", &obj1)->isBool()) { + fullyBounds = obj1.getBool(); + } else { + fullyBounds = gFalse; + } + obj1.free(); +} + +//------------------------------------------------------------------------ +// AnnotAppearance +//------------------------------------------------------------------------ + +AnnotAppearance::AnnotAppearance(PDFDoc *docA, Object *dict) { + assert(dict->isDict()); + doc = docA; + xref = docA->getXRef(); + dict->copy(&appearDict); +} + +AnnotAppearance::~AnnotAppearance() { + appearDict.free(); +} + +void AnnotAppearance::getAppearanceStream(AnnotAppearance::AnnotAppearanceType type, const char *state, Object *dest) { + Object apData, stream; + apData.initNull(); + + // Obtain dictionary or stream associated to appearance type + if (type == appearRollover) { + appearDict.dictLookupNF("R", &apData); + } else if (type == appearDown) { + appearDict.dictLookupNF("D", &apData); + } + if (apData.isNull()) { // Normal appearance, also used as fallback + appearDict.dictLookupNF("N", &apData); + } + + // Search state if it's a subdictionary + if (apData.isDict() && state) { + Object obj1; + apData.dictLookupNF(state, &obj1); + apData.free(); + obj1.copy(&apData); + obj1.free(); + } + + dest->initNull(); + // Sanity check on the value we are about to return: it must be a ref to stream + if (apData.isRef()) { + apData.fetch(xref, &stream); + if (stream.isStream()) { + apData.copy(dest); + } else { + error(errSyntaxWarning, -1, "AP points to a non-stream object"); + } + stream.free(); + } + apData.free(); +} + +GooString * AnnotAppearance::getStateKey(int i) { + Object obj1; + GooString * res = NULL; + appearDict.dictLookupNF("N", &obj1); + if (obj1.isDict()) { + res = new GooString(obj1.dictGetKey(i)); + } + obj1.free(); + return res; +} + +int AnnotAppearance::getNumStates() { + Object obj1; + int res = 0; + appearDict.dictLookupNF("N", &obj1); + if (obj1.isDict()) { + res = obj1.dictGetLength(); + } + obj1.free(); + return res; +} + +// Test if stateObj (a Ref or a Dict) points to the specified stream +GBool AnnotAppearance::referencesStream(Object *stateObj, Ref refToStream) { + if (stateObj->isRef()) { + Ref r = stateObj->getRef(); + if (r.num == refToStream.num && r.gen == refToStream.gen) { + return gTrue; + } + } else if (stateObj->isDict()) { // Test each value + const int size = stateObj->dictGetLength(); + for (int i = 0; i < size; ++i) { + Object obj1; + stateObj->dictGetValNF(i, &obj1); + if (obj1.isRef()) { + Ref r = obj1.getRef(); + if (r.num == refToStream.num && r.gen == refToStream.gen) { + return gTrue; + } + } + obj1.free(); + } + } + return gFalse; // Not found +} + +// Test if this AnnotAppearance references the specified stream +GBool AnnotAppearance::referencesStream(Ref refToStream) { + Object obj1; + GBool found; + + // Scan each state's ref/subdictionary + appearDict.dictLookupNF("N", &obj1); + found = referencesStream(&obj1, refToStream); + obj1.free(); + if (found) + return gTrue; + + appearDict.dictLookupNF("R", &obj1); + found = referencesStream(&obj1, refToStream); + obj1.free(); + if (found) + return gTrue; + + appearDict.dictLookupNF("D", &obj1); + found = referencesStream(&obj1, refToStream); + obj1.free(); + return found; +} + +// If this is the only annotation in the document that references the +// specified appearance stream, remove the appearance stream +void AnnotAppearance::removeStream(Ref refToStream) { + const int lastpage = doc->getNumPages(); + for (int pg = 1; pg <= lastpage; ++pg) { // Scan all annotations in the document + Page *page = doc->getPage(pg); + if (!page) { + error(errSyntaxError, -1, "Failed check for shared annotation stream at page {0:d}", pg); + continue; + } + Annots *annots = page->getAnnots(); + for (int i = 0; i < annots->getNumAnnots(); ++i) { + AnnotAppearance *annotAp = annots->getAnnot(i)->getAppearStreams(); + if (annotAp && annotAp != this && annotAp->referencesStream(refToStream)) { + return; // Another annotation points to the stream -> Don't delete it + } + } + } + + // TODO: stream resources (e.g. font), AP name tree + xref->removeIndirectObject(refToStream); +} + +// Removes stream if obj is a Ref, or removes pointed streams if obj is a Dict +void AnnotAppearance::removeStateStreams(Object *obj1) { + if (obj1->isRef()) { + removeStream(obj1->getRef()); + } else if (obj1->isDict()) { + const int size = obj1->dictGetLength(); + for (int i = 0; i < size; ++i) { + Object obj2; + obj1->dictGetValNF(i, &obj2); + if (obj2.isRef()) { + removeStream(obj2.getRef()); + } + obj2.free(); + } + } +} + +void AnnotAppearance::removeAllStreams() { + Object obj1; + appearDict.dictLookupNF("N", &obj1); + removeStateStreams(&obj1); + obj1.free(); + appearDict.dictLookupNF("R", &obj1); + removeStateStreams(&obj1); + obj1.free(); + appearDict.dictLookupNF("D", &obj1); + removeStateStreams(&obj1); + obj1.free(); +} + +//------------------------------------------------------------------------ +// AnnotAppearanceCharacs +//------------------------------------------------------------------------ + +AnnotAppearanceCharacs::AnnotAppearanceCharacs(Dict *dict) { + Object obj1; + + if (dict->lookup("R", &obj1)->isInt()) { + rotation = obj1.getInt(); + } else { + rotation = 0; + } + obj1.free(); + + if (dict->lookup("BC", &obj1)->isArray()) { + borderColor = new AnnotColor(obj1.getArray()); + } else { + borderColor = NULL; + } + obj1.free(); + + if (dict->lookup("BG", &obj1)->isArray()) { + backColor = new AnnotColor(obj1.getArray()); + } else { + backColor = NULL; + } + obj1.free(); + + if (dict->lookup("CA", &obj1)->isString()) { + normalCaption = new GooString(obj1.getString()); + } else { + normalCaption = NULL; + } + obj1.free(); + + if (dict->lookup("RC", &obj1)->isString()) { + rolloverCaption = new GooString(obj1.getString()); + } else { + rolloverCaption = NULL; + } + obj1.free(); + + if (dict->lookup("AC", &obj1)->isString()) { + alternateCaption = new GooString(obj1.getString()); + } else { + alternateCaption = NULL; + } + obj1.free(); + + if (dict->lookup("IF", &obj1)->isDict()) { + iconFit = new AnnotIconFit(obj1.getDict()); + } else { + iconFit = NULL; + } + obj1.free(); + + if (dict->lookup("TP", &obj1)->isInt()) { + position = (AnnotAppearanceCharacsTextPos) obj1.getInt(); + } else { + position = captionNoIcon; + } + obj1.free(); +} + +AnnotAppearanceCharacs::~AnnotAppearanceCharacs() { + if (borderColor) + delete borderColor; + + if (backColor) + delete backColor; + + if (normalCaption) + delete normalCaption; + + if (rolloverCaption) + delete rolloverCaption; + + if (alternateCaption) + delete alternateCaption; + + if (iconFit) + delete iconFit; +} + +//------------------------------------------------------------------------ +// AnnotAppearanceBBox +//------------------------------------------------------------------------ + +AnnotAppearanceBBox::AnnotAppearanceBBox(PDFRectangle *rect) { + origX = rect->x1; + origY = rect->y1; + borderWidth = 0; + + // Initially set the same size as rect + minX = 0; + minY = 0; + maxX = rect->x2 - rect->x1; + maxY = rect->y2 - rect->y1; +} + +void AnnotAppearanceBBox::extendTo(double x, double y) { + if (x < minX) { + minX = x; + } else if (x > maxX) { + maxX = x; + } + if (y < minY) { + minY = y; + } else if (y > maxY) { + maxY = y; + } +} + +void AnnotAppearanceBBox::getBBoxRect(double bbox[4]) const { + Object obj2; + bbox[0] = minX - borderWidth; + bbox[1] = minY - borderWidth; + bbox[2] = maxX + borderWidth; + bbox[3] = maxY + borderWidth; +} + +double AnnotAppearanceBBox::getPageXMin() const { + return origX + minX - borderWidth; +} + +double AnnotAppearanceBBox::getPageYMin() const { + return origY + minY - borderWidth; +} + +double AnnotAppearanceBBox::getPageXMax() const { + return origX + maxX + borderWidth; +} + +double AnnotAppearanceBBox::getPageYMax() const { + return origY + maxY + borderWidth; +} + +//------------------------------------------------------------------------ +// Annot +//------------------------------------------------------------------------ + +Annot::Annot(PDFDoc *docA, PDFRectangle *rectA) { + Object obj1; + + refCnt = 1; + flags = flagUnknown; + type = typeUnknown; + + obj1.initArray (docA->getXRef()); + Object obj2; + obj1.arrayAdd (obj2.initReal (rectA->x1)); + obj1.arrayAdd (obj2.initReal (rectA->y1)); + obj1.arrayAdd (obj2.initReal (rectA->x2)); + obj1.arrayAdd (obj2.initReal (rectA->y2)); + obj2.free (); + + annotObj.initDict (docA->getXRef()); + annotObj.dictSet ("Type", obj2.initName ("Annot")); + annotObj.dictSet ("Rect", &obj1); + // obj1 is owned by the dict + + ref = docA->getXRef()->addIndirectObject (&annotObj); + + initialize (docA, annotObj.getDict()); +} + +Annot::Annot(PDFDoc *docA, Dict *dict) { + refCnt = 1; + hasRef = false; + flags = flagUnknown; + type = typeUnknown; + annotObj.initDict (dict); + initialize (docA, dict); +} + +Annot::Annot(PDFDoc *docA, Dict *dict, Object *obj) { + refCnt = 1; + if (obj->isRef()) { + hasRef = gTrue; + ref = obj->getRef(); + } else { + hasRef = gFalse; + } + flags = flagUnknown; + type = typeUnknown; + annotObj.initDict (dict); + initialize (docA, dict); +} + +void Annot::initialize(PDFDoc *docA, Dict *dict) { + Object apObj, asObj, obj1, obj2; + + ok = gTrue; + doc = docA; + xref = doc->getXRef(); + appearStreams = NULL; + appearBBox = NULL; + appearState = NULL; + appearBuf = NULL; + fontSize = 0; + + appearance.initNull(); + + //----- parse the rectangle + rect = new PDFRectangle(); + if (dict->lookup("Rect", &obj1)->isArray() && obj1.arrayGetLength() == 4) { + Object obj2; + (obj1.arrayGet(0, &obj2)->isNum() ? rect->x1 = obj2.getNum() : rect->x1 = 0); + obj2.free(); + (obj1.arrayGet(1, &obj2)->isNum() ? rect->y1 = obj2.getNum() : rect->y1 = 0); + obj2.free(); + (obj1.arrayGet(2, &obj2)->isNum() ? rect->x2 = obj2.getNum() : rect->x2 = 1); + obj2.free(); + (obj1.arrayGet(3, &obj2)->isNum() ? rect->y2 = obj2.getNum() : rect->y2 = 1); + obj2.free(); + + if (rect->x1 > rect->x2) { + double t = rect->x1; + rect->x1 = rect->x2; + rect->x2 = t; + } + + if (rect->y1 > rect->y2) { + double t = rect->y1; + rect->y1 = rect->y2; + rect->y2 = t; + } + } else { + rect->x1 = rect->y1 = 0; + rect->x2 = rect->y2 = 1; + error(errSyntaxError, -1, "Bad bounding box for annotation"); + ok = gFalse; + } + obj1.free(); + + if (dict->lookup("Contents", &obj1)->isString()) { + contents = obj1.getString()->copy(); + } else { + contents = NULL; + } + obj1.free(); + + if (dict->lookupNF("P", &obj1)->isRef()) { + Ref ref = obj1.getRef(); + + page = doc->getCatalog()->findPage (ref.num, ref.gen); + } else { + page = 0; + } + obj1.free(); + + if (dict->lookup("NM", &obj1)->isString()) { + name = obj1.getString()->copy(); + } else { + name = NULL; + } + obj1.free(); + + if (dict->lookup("M", &obj1)->isString()) { + modified = obj1.getString()->copy(); + } else { + modified = NULL; + } + obj1.free(); + + //----- get the flags + if (dict->lookup("F", &obj1)->isInt()) { + flags |= obj1.getInt(); + } else { + flags = flagUnknown; + } + obj1.free(); + + //----- get the annotation appearance dictionary + dict->lookup("AP", &apObj); + if (apObj.isDict()) { + appearStreams = new AnnotAppearance(doc, &apObj); + } + apObj.free(); + + //----- get the appearance state + dict->lookup("AS", &asObj); + if (asObj.isName()) { + appearState = new GooString(asObj.getName()); + } else if (appearStreams && appearStreams->getNumStates() != 0) { + error (errSyntaxError, -1, "Invalid or missing AS value in annotation containing one or more appearance subdictionaries"); + // AS value is required in this case, but if the + // N dictionary contains only one entry + // take it as default appearance. + if (appearStreams->getNumStates() == 1) { + appearState = appearStreams->getStateKey(0); + } + } + if (!appearState) { + appearState = new GooString("Off"); + } + asObj.free(); + + //----- get the annotation appearance + if (appearStreams) { + appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString(), &appearance); + } + + //----- parse the border style + if (dict->lookup("BS", &obj1)->isDict()) { + border = new AnnotBorderBS(obj1.getDict()); + } else { + obj1.free(); + + if (dict->lookup("Border", &obj1)->isArray()) + border = new AnnotBorderArray(obj1.getArray()); + else + // Adobe draws no border at all if the last element is of + // the wrong type. + border = NULL; + } + obj1.free(); + + if (dict->lookup("C", &obj1)->isArray()) { + color = new AnnotColor(obj1.getArray()); + } else { + color = NULL; + } + obj1.free(); + + if (dict->lookup("StructParent", &obj1)->isInt()) { + treeKey = obj1.getInt(); + } else { + treeKey = 0; + } + obj1.free(); + + dict->lookupNF("OC", &oc); +} + +void Annot::getRect(double *x1, double *y1, double *x2, double *y2) const { + *x1 = rect->x1; + *y1 = rect->y1; + *x2 = rect->x2; + *y2 = rect->y2; +} + +void Annot::setRect(PDFRectangle *rect) { + setRect(rect->x1, rect->y1, rect->x2, rect->y2); +} + +void Annot::setRect(double x1, double y1, double x2, double y2) { + Object obj1, obj2; + + if (x1 < x2) { + rect->x1 = x1; + rect->x2 = x2; + } else { + rect->x1 = x2; + rect->x2 = x1; + } + + if (y1 < y2) { + rect->y1 = y1; + rect->y2 = y2; + } else { + rect->y1 = y2; + rect->y2 = y1; + } + + obj1.initArray (xref); + obj1.arrayAdd (obj2.initReal (rect->x1)); + obj1.arrayAdd (obj2.initReal (rect->y1)); + obj1.arrayAdd (obj2.initReal (rect->x2)); + obj1.arrayAdd (obj2.initReal (rect->y2)); + + update("Rect", &obj1); +} + +GBool Annot::inRect(double x, double y) const { + return rect->contains(x, y); +} + +void Annot::update(const char *key, Object *value) { + /* Set M to current time, unless we are updating M itself */ + if (strcmp(key, "M") != 0) { + delete modified; + modified = timeToDateString(NULL); + + Object obj1; + obj1.initString (modified->copy()); + annotObj.dictSet("M", &obj1); + } + + annotObj.dictSet(const_cast(key), value); + + xref->setModifiedObject(&annotObj, ref); +} + +void Annot::setContents(GooString *new_content) { + delete contents; + + if (new_content) { + contents = new GooString(new_content); + //append the unicode marker if needed + if (!contents->hasUnicodeMarker()) { + contents->insert(0, 0xff); + contents->insert(0, 0xfe); + } + } else { + contents = new GooString(); + } + + Object obj1; + obj1.initString(contents->copy()); + update ("Contents", &obj1); +} + +void Annot::setName(GooString *new_name) { + delete name; + + if (new_name) { + name = new GooString(new_name); + } else { + name = new GooString(); + } + + Object obj1; + obj1.initString(name->copy()); + update ("NM", &obj1); +} + +void Annot::setModified(GooString *new_modified) { + delete modified; + + if (new_modified) + modified = new GooString(new_modified); + else + modified = new GooString(); + + Object obj1; + obj1.initString(modified->copy()); + update ("M", &obj1); +} + +void Annot::setFlags(Guint new_flags) { + Object obj1; + flags = new_flags; + obj1.initInt(flags); + update ("F", &obj1); +} + +void Annot::setBorder(AnnotBorderArray *new_border) { + delete border; + + if (new_border) { + Object obj1; + new_border->writeToObject(xref, &obj1); + update ("Border", &obj1); + border = new_border; + } else { + border = NULL; + } +} + +void Annot::setColor(AnnotColor *new_color) { + delete color; + + if (new_color) { + Object obj1; + new_color->writeToObject(xref, &obj1); + update ("C", &obj1); + color = new_color; + } else { + color = NULL; + } +} + +void Annot::setPage(Ref *pageRef, int pageIndex) +{ + Object obj1; + + obj1.initRef(pageRef->num, pageRef->gen); + update("P", &obj1); + page = pageIndex; +} + +void Annot::setAppearanceState(const char *state) { + if (!state) + return; + + delete appearState; + appearState = new GooString(state); + + delete appearBBox; + appearBBox = NULL; + + Object obj1; + obj1.initName(state); + update ("AS", &obj1); + + // The appearance state determines the current appearance stream + appearance.free(); + if (appearStreams) { + appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString(), &appearance); + } else { + appearance.initNull(); + } +} + +void Annot::invalidateAppearance() { + if (appearStreams) { // Remove existing appearance streams + appearStreams->removeAllStreams(); + } + delete appearStreams; + appearStreams = NULL; + + setAppearanceState("Off"); // Default appearance state + + Object obj1; + obj1.initNull(); + update ("AP", &obj1); // Remove AP + update ("AS", &obj1); // Remove AS +} + +double Annot::getXMin() { + return rect->x1; +} + +double Annot::getYMin() { + return rect->y1; +} + +void Annot::readArrayNum(Object *pdfArray, int key, double *value) { + Object valueObject; + + pdfArray->arrayGet(key, &valueObject); + if (valueObject.isNum()) { + *value = valueObject.getNum(); + } else { + *value = 0; + ok = gFalse; + } + valueObject.free(); +} + +void Annot::incRefCnt() { + refCnt++; +} + +void Annot::decRefCnt() { + if (--refCnt == 0) + delete this; +} + +Annot::~Annot() { + annotObj.free(); + + delete rect; + + if (contents) + delete contents; + + if (name) + delete name; + + if (modified) + delete modified; + + delete appearStreams; + delete appearBBox; + appearance.free(); + + if (appearState) + delete appearState; + + if (border) + delete border; + + if (color) + delete color; + + oc.free(); +} + +void Annot::setColor(AnnotColor *color, GBool fill) { + const double *values = color->getValues(); + + switch (color->getSpace()) { + case AnnotColor::colorCMYK: + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n", + values[0], values[1], values[2], values[3], + fill ? 'k' : 'K'); + break; + case AnnotColor::colorRGB: + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:s}\n", + values[0], values[1], values[2], + fill ? "rg" : "RG"); + break; + case AnnotColor::colorGray: + appearBuf->appendf("{0:.2f} {1:c}\n", + values[0], + fill ? 'g' : 'G'); + break; + case AnnotColor::colorTransparent: + default: + break; + } +} + +// Draw an (approximate) circle of radius centered at (, ). +// If is true, the circle is filled; otherwise it is stroked. +void Annot::drawCircle(double cx, double cy, double r, GBool fill) { + appearBuf->appendf("{0:.2f} {1:.2f} m\n", + cx + r, cy); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + r, cy + bezierCircle * r, + cx + bezierCircle * r, cy + r, + cx, cy + r); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - bezierCircle * r, cy + r, + cx - r, cy + bezierCircle * r, + cx - r, cy); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - r, cy - bezierCircle * r, + cx - bezierCircle * r, cy - r, + cx, cy - r); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + bezierCircle * r, cy - r, + cx + r, cy - bezierCircle * r, + cx + r, cy); + appearBuf->append(fill ? "f\n" : "s\n"); +} + +// Draw the top-left half of an (approximate) circle of radius +// centered at (, ). +void Annot::drawCircleTopLeft(double cx, double cy, double r) { + double r2; + + r2 = r / sqrt(2.0); + appearBuf->appendf("{0:.2f} {1:.2f} m\n", + cx + r2, cy + r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + (1 - bezierCircle) * r2, + cy + (1 + bezierCircle) * r2, + cx - (1 - bezierCircle) * r2, + cy + (1 + bezierCircle) * r2, + cx - r2, + cy + r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - (1 + bezierCircle) * r2, + cy + (1 - bezierCircle) * r2, + cx - (1 + bezierCircle) * r2, + cy - (1 - bezierCircle) * r2, + cx - r2, + cy - r2); + appearBuf->append("S\n"); +} + +// Draw the bottom-right half of an (approximate) circle of radius +// centered at (, ). +void Annot::drawCircleBottomRight(double cx, double cy, double r) { + double r2; + + r2 = r / sqrt(2.0); + appearBuf->appendf("{0:.2f} {1:.2f} m\n", + cx - r2, cy - r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - (1 - bezierCircle) * r2, + cy - (1 + bezierCircle) * r2, + cx + (1 - bezierCircle) * r2, + cy - (1 + bezierCircle) * r2, + cx + r2, + cy - r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + (1 + bezierCircle) * r2, + cy - (1 - bezierCircle) * r2, + cx + (1 + bezierCircle) * r2, + cy + (1 - bezierCircle) * r2, + cx + r2, + cy + r2); + appearBuf->append("S\n"); +} + +void Annot::createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream) { + Object obj1, obj2; + Object appearDict; + + appearDict.initDict(xref); + appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); + appearDict.dictSet("Subtype", obj1.initName("Form")); + obj1.initArray(xref); + obj1.arrayAdd(obj2.initReal(bbox[0])); + obj1.arrayAdd(obj2.initReal(bbox[1])); + obj1.arrayAdd(obj2.initReal(bbox[2])); + obj1.arrayAdd(obj2.initReal(bbox[3])); + appearDict.dictSet("BBox", &obj1); + if (transparencyGroup) { + Object transDict; + transDict.initDict(xref); + transDict.dictSet("S", obj1.initName("Transparency")); + appearDict.dictSet("Group", &transDict); + } + if (resDict) + appearDict.dictSet("Resources", resDict); + + MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0, + appearBuf->getLength(), &appearDict); + mStream->setNeedFree(gTrue); + aStream->initStream(mStream); +} + +void Annot::createResourcesDict(const char *formName, Object *formStream, + const char *stateName, + double opacity, const char *blendMode, + Object *resDict) { + Object gsDict, stateDict, formDict, obj1; + + gsDict.initDict(xref); + if (opacity != 1) { + gsDict.dictSet("CA", obj1.initReal(opacity)); + gsDict.dictSet("ca", obj1.initReal(opacity)); + } + if (blendMode) + gsDict.dictSet("BM", obj1.initName(blendMode)); + stateDict.initDict(xref); + stateDict.dictSet(stateName, &gsDict); + formDict.initDict(xref); + formDict.dictSet(formName, formStream); + + resDict->initDict(xref); + resDict->dictSet("ExtGState", &stateDict); + resDict->dictSet("XObject", &formDict); +} + +Object *Annot::getAppearanceResDict(Object *dest) { + Object obj1, obj2; + + dest->initNull(); // Default value + + // Fetch appearance's resource dict (if any) + appearance.fetch(xref, &obj1); + if (obj1.isStream()) { + obj1.streamGetDict()->lookup("Resources", &obj2); + if (obj2.isDict()) { + obj2.copy(dest); + } + obj2.free(); + } + obj1.free(); + + return dest; +} + +GBool Annot::isVisible(GBool printing) { + // check the flags + if ((flags & flagHidden) || + (printing && !(flags & flagPrint)) || + (!printing && (flags & flagNoView))) { + return gFalse; + } + + // check the OC + OCGs *optContentConfig = doc->getCatalog()->getOptContentConfig(); + if (optContentConfig) { + if (! optContentConfig->optContentIsVisible(&oc)) + return gFalse; + } + + return gTrue; +} + +void Annot::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotPopup +//------------------------------------------------------------------------ + +AnnotPopup::AnnotPopup(PDFDoc *docA, PDFRectangle *rect) : + Annot(docA, rect) { + Object obj1; + + type = typePopup; + + annotObj.dictSet ("Subtype", obj1.initName ("Popup")); + initialize (docA, annotObj.getDict()); +} + +AnnotPopup::AnnotPopup(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + type = typePopup; + initialize(docA, dict); +} + +AnnotPopup::~AnnotPopup() { + parent.free(); +} + +void AnnotPopup::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + if (!dict->lookupNF("Parent", &parent)->isRef()) { + parent.initNull(); + } + + if (dict->lookup("Open", &obj1)->isBool()) { + open = obj1.getBool(); + } else { + open = gFalse; + } + obj1.free(); +} + +void AnnotPopup::setParent(Object *parentA) { + parentA->copy(&parent); + update ("Parent", &parent); +} + +void AnnotPopup::setParent(Annot *parentA) { + Ref parentRef = parentA->getRef(); + parent.initRef(parentRef.num, parentRef.gen); + update ("Parent", &parent); +} + +void AnnotPopup::setOpen(GBool openA) { + Object obj1; + + open = openA; + obj1.initBool(open); + update ("Open", &obj1); +} + +//------------------------------------------------------------------------ +// AnnotMarkup +//------------------------------------------------------------------------ +AnnotMarkup::AnnotMarkup(PDFDoc *docA, PDFRectangle *rect) : + Annot(docA, rect) { + initialize(docA, annotObj.getDict(), &annotObj); +} + +AnnotMarkup::AnnotMarkup(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + initialize(docA, dict, obj); +} + +AnnotMarkup::~AnnotMarkup() { + if (label) + delete label; + + if (popup) + delete popup; + + if (date) + delete date; + + if (subject) + delete subject; +} + +void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) { + Object obj1, obj2; + + if (dict->lookup("T", &obj1)->isString()) { + label = obj1.getString()->copy(); + } else { + label = NULL; + } + obj1.free(); + + if (dict->lookup("Popup", &obj1)->isDict() && dict->lookupNF("Popup", &obj2)->isRef()) { + popup = new AnnotPopup(docA, obj1.getDict(), &obj2); + } else { + popup = NULL; + } + obj1.free(); + + if (dict->lookup("CA", &obj1)->isNum()) { + opacity = obj1.getNum(); + } else { + opacity = 1.0; + } + obj1.free(); + + if (dict->lookup("CreationDate", &obj1)->isString()) { + date = obj1.getString()->copy(); + } else { + date = NULL; + } + obj1.free(); + + if (dict->lookupNF("IRT", &obj1)->isRef()) { + inReplyTo = obj1.getRef(); + } else { + inReplyTo.num = 0; + inReplyTo.gen = 0; + } + obj1.free(); + + if (dict->lookup("Subj", &obj1)->isString()) { + subject = obj1.getString()->copy(); + } else { + subject = NULL; + } + obj1.free(); + + if (dict->lookup("RT", &obj1)->isName()) { + const char *replyName = obj1.getName(); + + if (!strcmp(replyName, "R")) { + replyTo = replyTypeR; + } else if (!strcmp(replyName, "Group")) { + replyTo = replyTypeGroup; + } else { + replyTo = replyTypeR; + } + } else { + replyTo = replyTypeR; + } + obj1.free(); + + if (dict->lookup("ExData", &obj1)->isDict()) { + exData = parseAnnotExternalData(obj1.getDict()); + } else { + exData = annotExternalDataMarkupUnknown; + } + obj1.free(); +} + +void AnnotMarkup::setLabel(GooString *new_label) { + delete label; + + if (new_label) { + label = new GooString(new_label); + //append the unicode marker if needed + if (!label->hasUnicodeMarker()) { + label->insert(0, 0xff); + label->insert(0, 0xfe); + } + } else { + label = new GooString(); + } + + Object obj1; + obj1.initString(label->copy()); + update ("T", &obj1); +} + +void AnnotMarkup::setPopup(AnnotPopup *new_popup) { + delete popup; + + if (new_popup) { + Object obj1; + Ref popupRef = new_popup->getRef(); + + obj1.initRef (popupRef.num, popupRef.gen); + update ("Popup", &obj1); + + new_popup->setParent(this); + popup = new_popup; + } else { + popup = NULL; + } +} + +void AnnotMarkup::setOpacity(double opacityA) { + Object obj1; + + opacity = opacityA; + obj1.initReal(opacity); + update ("CA", &obj1); +} + +void AnnotMarkup::setDate(GooString *new_date) { + delete date; + + if (new_date) + date = new GooString(new_date); + else + date = new GooString(); + + Object obj1; + obj1.initString(date->copy()); + update ("CreationDate", &obj1); +} + +//------------------------------------------------------------------------ +// AnnotText +//------------------------------------------------------------------------ + +AnnotText::AnnotText(PDFDoc *docA, PDFRectangle *rect) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeText; + flags |= flagNoZoom | flagNoRotate; + + annotObj.dictSet ("Subtype", obj1.initName ("Text")); + initialize (docA, annotObj.getDict()); +} + +AnnotText::AnnotText(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + + type = typeText; + flags |= flagNoZoom | flagNoRotate; + initialize (docA, dict); +} + +AnnotText::~AnnotText() { + delete icon; +} + +void AnnotText::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + if (dict->lookup("Open", &obj1)->isBool()) + open = obj1.getBool(); + else + open = gFalse; + obj1.free(); + + if (dict->lookup("Name", &obj1)->isName()) { + icon = new GooString(obj1.getName()); + } else { + icon = new GooString("Note"); + } + obj1.free(); + + if (dict->lookup("StateModel", &obj1)->isString()) { + Object obj2; + GooString *modelName = obj1.getString(); + + if (dict->lookup("State", &obj2)->isString()) { + GooString *stateName = obj2.getString(); + + if (!stateName->cmp("Marked")) { + state = stateMarked; + } else if (!stateName->cmp("Unmarked")) { + state = stateUnmarked; + } else if (!stateName->cmp("Accepted")) { + state = stateAccepted; + } else if (!stateName->cmp("Rejected")) { + state = stateRejected; + } else if (!stateName->cmp("Cancelled")) { + state = stateCancelled; + } else if (!stateName->cmp("Completed")) { + state = stateCompleted; + } else if (!stateName->cmp("None")) { + state = stateNone; + } else { + state = stateUnknown; + } + } else { + state = stateUnknown; + } + obj2.free(); + + if (!modelName->cmp("Marked")) { + switch (state) { + case stateUnknown: + state = stateMarked; + break; + case stateAccepted: + case stateRejected: + case stateCancelled: + case stateCompleted: + case stateNone: + state = stateUnknown; + break; + default: + break; + } + } else if (!modelName->cmp("Review")) { + switch (state) { + case stateUnknown: + state = stateNone; + break; + case stateMarked: + case stateUnmarked: + state = stateUnknown; + break; + default: + break; + } + } else { + state = stateUnknown; + } + } else { + state = stateUnknown; + } + obj1.free(); +} + +void AnnotText::setOpen(GBool openA) { + Object obj1; + + open = openA; + obj1.initBool(open); + update ("Open", &obj1); +} + +void AnnotText::setIcon(GooString *new_icon) { + if (new_icon && icon->cmp(new_icon) == 0) + return; + + delete icon; + + if (new_icon) { + icon = new GooString (new_icon); + } else { + icon = new GooString("Note"); + } + + Object obj1; + obj1.initName (icon->getCString()); + update("Name", &obj1); +} + +#define ANNOT_TEXT_AP_NOTE \ + "3.602 24 m 20.398 24 l 22.387 24 24 22.387 24 20.398 c 24 3.602 l 24\n" \ + "1.613 22.387 0 20.398 0 c 3.602 0 l 1.613 0 0 1.613 0 3.602 c 0 20.398\n" \ + "l 0 22.387 1.613 24 3.602 24 c h\n" \ + "3.602 24 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 9 18 m 4 18 l 4 7 4 4 6 3 c 20 3 l 18 4 18 7 18 18 c 17 18 l S\n" \ + "1.5 w\n" \ + "0 j\n" \ + "10 16 m 14 21 l S\n" \ + "1.85625 w\n" \ + "1 j\n" \ + "15.07 20.523 m 15.07 19.672 14.379 18.977 13.523 18.977 c 12.672 18.977\n" \ + "11.977 19.672 11.977 20.523 c 11.977 21.379 12.672 22.07 13.523 22.07 c\n" \ + "14.379 22.07 15.07 21.379 15.07 20.523 c h\n" \ + "15.07 20.523 m S\n" \ + "1 w\n" \ + "0 j\n" \ + "6.5 13.5 m 15.5 13.5 l S\n" \ + "6.5 10.5 m 13.5 10.5 l S\n" \ + "6.801 7.5 m 15.5 7.5 l S\n" \ + "0.729412 0.741176 0.713725 RG 2 w\n" \ + "1 j\n" \ + "9 19 m 4 19 l 4 8 4 5 6 4 c 20 4 l 18 5 18 8 18 19 c 17 19 l S\n" \ + "1.5 w\n" \ + "0 j\n" \ + "10 17 m 14 22 l S\n" \ + "1.85625 w\n" \ + "1 j\n" \ + "15.07 21.523 m 15.07 20.672 14.379 19.977 13.523 19.977 c 12.672 19.977\n" \ + "11.977 20.672 11.977 21.523 c 11.977 22.379 12.672 23.07 13.523 23.07 c\n" \ + "14.379 23.07 15.07 22.379 15.07 21.523 c h\n" \ + "15.07 21.523 m S\n" \ + "1 w\n" \ + "0 j\n" \ + "6.5 14.5 m 15.5 14.5 l S\n" \ + "6.5 11.5 m 13.5 11.5 l S\n" \ + "6.801 8.5 m 15.5 8.5 l S\n" + +#define ANNOT_TEXT_AP_COMMENT \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "0 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 8 20 m 16 20 l 18.363 20 20 18.215 20 16 c 20 13 l 20 10.785 18.363 9\n" \ + "16 9 c 13 9 l 8 3 l 8 9 l 8 9 l 5.637 9 4 10.785 4 13 c 4 16 l 4 18.215\n" \ + "5.637 20 8 20 c h\n" \ + "8 20 m S\n" \ + "0.729412 0.741176 0.713725 RG 8 21 m 16 21 l 18.363 21 20 19.215 20 17\n" \ + "c 20 14 l 20 11.785 18.363 10\n" \ + "16 10 c 13 10 l 8 4 l 8 10 l 8 10 l 5.637 10 4 11.785 4 14 c 4 17 l 4\n" \ + "19.215 5.637 21 8 21 c h\n" \ + "8 21 m S\n" + +#define ANNOT_TEXT_AP_KEY \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "0 j\n" \ + "[] 0.0 d\n" \ + "4 M 11.895 18.754 m 13.926 20.625 17.09 20.496 18.961 18.465 c 20.832\n" \ + "16.434 20.699 13.27 18.668 11.398 c 17.164 10.016 15.043 9.746 13.281\n" \ + "10.516 c 12.473 9.324 l 11.281 10.078 l 9.547 8.664 l 9.008 6.496 l\n" \ + "7.059 6.059 l 6.34 4.121 l 5.543 3.668 l 3.375 4.207 l 2.938 6.156 l\n" \ + "10.57 13.457 l 9.949 15.277 10.391 17.367 11.895 18.754 c h\n" \ + "11.895 18.754 m S\n" \ + "1.5 w\n" \ + "16.059 15.586 m 16.523 15.078 17.316 15.043 17.824 15.512 c 18.332\n" \ + "15.98 18.363 16.77 17.895 17.277 c 17.43 17.785 16.637 17.816 16.129\n" \ + "17.352 c 15.621 16.883 15.59 16.094 16.059 15.586 c h\n" \ + "16.059 15.586 m S\n" \ + "0.729412 0.741176 0.713725 RG 2 w\n" \ + "11.895 19.754 m 13.926 21.625 17.09 21.496 18.961 19.465 c 20.832\n" \ + "17.434 20.699 14.27 18.668 12.398 c 17.164 11.016 15.043 10.746 13.281\n" \ + "11.516 c 12.473 10.324 l 11.281 11.078 l 9.547 9.664 l 9.008 7.496 l\n" \ + "7.059 7.059 l 6.34 5.121 l 5.543 4.668 l 3.375 5.207 l 2.938 7.156 l\n" \ + "10.57 14.457 l 9.949 16.277 10.391 18.367 11.895 19.754 c h\n" \ + "11.895 19.754 m S\n" \ + "1.5 w\n" \ + "16.059 16.586 m 16.523 16.078 17.316 16.043 17.824 16.512 c 18.332\n" \ + "16.98 18.363 17.77 17.895 18.277 c 17.43 18.785 16.637 18.816 16.129\n" \ + "18.352 c 15.621 17.883 15.59 17.094 16.059 16.586 c h\n" \ + "16.059 16.586 m S\n" + +#define ANNOT_TEXT_AP_HELP \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2.5 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 8.289 16.488 m 8.824 17.828 10.043 18.773 11.473 18.965 c 12.902 19.156\n" \ + "14.328 18.559 15.195 17.406 c 16.062 16.254 16.242 14.723 15.664 13.398\n" \ + "c S\n" \ + "0 j\n" \ + "12 8 m 12 12 16 11 16 15 c S\n" \ + "1.539286 w\n" \ + "1 j\n" \ + "q 1 0 0 -0.999991 0 24 cm\n" \ + "12.684 20.891 m 12.473 21.258 12.004 21.395 11.629 21.196 c 11.254\n" \ + "20.992 11.105 20.531 11.297 20.149 c 11.488 19.77 11.945 19.61 12.332\n" \ + "19.789 c 12.719 19.969 12.891 20.426 12.719 20.817 c S Q\n" \ + "0.729412 0.741176 0.713725 RG 2.5 w\n" \ + "8.289 17.488 m 9.109 19.539 11.438 20.535 13.488 19.711 c 15.539 18.891\n" \ + "16.535 16.562 15.711 14.512 c 15.699 14.473 15.684 14.438 15.664 14.398\n" \ + "c S\n" \ + "0 j\n" \ + "12 9 m 12 13 16 12 16 16 c S\n" \ + "1.539286 w\n" \ + "1 j\n" \ + "q 1 0 0 -0.999991 0 24 cm\n" \ + "12.684 19.891 m 12.473 20.258 12.004 20.395 11.629 20.195 c 11.254\n" \ + "19.992 11.105 19.531 11.297 19.149 c 11.488 18.77 11.945 18.61 12.332\n" \ + "18.789 c 12.719 18.969 12.891 19.426 12.719 19.817 c S Q\n" + +#define ANNOT_TEXT_AP_NEW_PARAGRAPH \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 4 w\n" \ + "0 J\n" \ + "2 j\n" \ + "[] 0.0 d\n" \ + "4 M q 1 0 0 -1 0 24 cm\n" \ + "9.211 11.988 m 8.449 12.07 7.711 11.707 7.305 11.059 c 6.898 10.41\n" \ + "6.898 9.59 7.305 8.941 c 7.711 8.293 8.449 7.93 9.211 8.012 c S Q\n" \ + "1.004413 w\n" \ + "1 J\n" \ + "1 j\n" \ + "q 1 0 0 -0.991232 0 24 cm\n" \ + "18.07 11.511 m 15.113 10.014 l 12.199 11.602 l 12.711 8.323 l 10.301\n" \ + "6.045 l 13.574 5.517 l 14.996 2.522 l 16.512 5.474 l 19.801 5.899 l\n" \ + "17.461 8.252 l 18.07 11.511 l h\n" \ + "18.07 11.511 m S Q\n" \ + "2 w\n" \ + "0 j\n" \ + "11 17 m 10 17 l 10 3 l S\n" \ + "14 3 m 14 13 l S\n" \ + "0.729412 0.741176 0.713725 RG 4 w\n" \ + "0 J\n" \ + "2 j\n" \ + "q 1 0 0 -1 0 24 cm\n" \ + "9.211 10.988 m 8.109 11.105 7.125 10.309 7.012 9.211 c 6.895 8.109\n" \ + "7.691 7.125 8.789 7.012 c 8.93 6.996 9.07 6.996 9.211 7.012 c S Q\n" \ + "1.004413 w\n" \ + "1 J\n" \ + "1 j\n" \ + "q 1 0 0 -0.991232 0 24 cm\n" \ + "18.07 10.502 m 15.113 9.005 l 12.199 10.593 l 12.711 7.314 l 10.301\n" \ + "5.036 l 13.574 4.508 l 14.996 1.513 l 16.512 4.465 l 19.801 4.891 l\n" \ + "17.461 7.243 l 18.07 10.502 l h\n" \ + "18.07 10.502 m S Q\n" \ + "2 w\n" \ + "0 j\n" \ + "11 18 m 10 18 l 10 4 l S\n" \ + "14 4 m 14 14 l S\n" + +#define ANNOT_TEXT_AP_PARAGRAPH \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 15 3 m 15 18 l 11 18 l 11 3 l S\n" \ + "4 w\n" \ + "q 1 0 0 -1 0 24 cm\n" \ + "9.777 10.988 m 8.746 10.871 7.973 9.988 8 8.949 c 8.027 7.91 8.844\n" \ + "7.066 9.879 7.004 c S Q\n" \ + "0.729412 0.741176 0.713725 RG 2 w\n" \ + "15 4 m 15 19 l 11 19 l 11 4 l S\n" \ + "4 w\n" \ + "q 1 0 0 -1 0 24 cm\n" \ + "9.777 9.988 m 8.746 9.871 7.973 8.988 8 7.949 c 8.027 6.91 8.844 6.066\n" \ + "9.879 6.004 c S Q\n" + +#define ANNOT_TEXT_AP_INSERT \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "0 j\n" \ + "[] 0.0 d\n" \ + "4 M 12 18.012 m 20 18 l S\n" \ + "9 10 m 17 10 l S\n" \ + "12 14.012 m 20 14 l S\n" \ + "12 6.012 m 20 6.012 l S\n" \ + "4 12 m 6 10 l 4 8 l S\n" \ + "4 12 m 4 8 l S\n" \ + "0.729412 0.741176 0.713725 RG 12 19.012 m 20 19 l S\n" \ + "9 11 m 17 11 l S\n" \ + "12 15.012 m 20 15 l S\n" \ + "12 7.012 m 20 7.012 l S\n" \ + "4 13 m 6 11 l 4 9 l S\n" \ + "4 13 m 4 9 l S\n" + +#define ANNOT_TEXT_AP_CROSS \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2.5 w\n" \ + "1 J\n" \ + "0 j\n" \ + "[] 0.0 d\n" \ + "4 M 18 5 m 6 17 l S\n" \ + "6 5 m 18 17 l S\n" \ + "0.729412 0.741176 0.713725 RG 18 6 m 6 18 l S\n" \ + "6 6 m 18 18 l S\n" + +#define ANNOT_TEXT_AP_CIRCLE \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2.5 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 19.5 11.5 m 19.5 7.359 16.141 4 12 4 c 7.859 4 4.5 7.359 4.5 11.5 c 4.5\n" \ + "15.641 7.859 19 12 19 c 16.141 19 19.5 15.641 19.5 11.5 c h\n" \ + "19.5 11.5 m S\n" \ + "0.729412 0.741176 0.713725 RG 19.5 12.5 m 19.5 8.359 16.141 5 12 5 c\n" \ + "7.859 5 4.5 8.359 4.5 12.5 c 4.5\n" \ + "16.641 7.859 20 12 20 c 16.141 20 19.5 16.641 19.5 12.5 c h\n" \ + "19.5 12.5 m S\n" + +void AnnotText::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + ca = opacity; + + appearBuf = new GooString (); + + appearBuf->append ("q\n"); + if (color) + setColor(color, gTrue); + else + appearBuf->append ("1 1 1 rg\n"); + if (!icon->cmp("Note")) + appearBuf->append (ANNOT_TEXT_AP_NOTE); + else if (!icon->cmp("Comment")) + appearBuf->append (ANNOT_TEXT_AP_COMMENT); + else if (!icon->cmp("Key")) + appearBuf->append (ANNOT_TEXT_AP_KEY); + else if (!icon->cmp("Help")) + appearBuf->append (ANNOT_TEXT_AP_HELP); + else if (!icon->cmp("NewParagraph")) + appearBuf->append (ANNOT_TEXT_AP_NEW_PARAGRAPH); + else if (!icon->cmp("Paragraph")) + appearBuf->append (ANNOT_TEXT_AP_PARAGRAPH); + else if (!icon->cmp("Insert")) + appearBuf->append (ANNOT_TEXT_AP_INSERT); + else if (!icon->cmp("Cross")) + appearBuf->append (ANNOT_TEXT_AP_CROSS); + else if (!icon->cmp("Circle")) + appearBuf->append (ANNOT_TEXT_AP_CIRCLE); + appearBuf->append ("Q\n"); + + // Force 24x24 rectangle + PDFRectangle fixedRect(rect->x1, rect->y1, rect->x1 + 24, rect->y1 + 24); + appearBBox = new AnnotAppearanceBBox(&fixedRect); + double bbox[4]; + appearBBox->getBBoxRect(bbox); + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; + + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + } + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotLink +//------------------------------------------------------------------------ +AnnotLink::AnnotLink(PDFDoc *docA, PDFRectangle *rect) : + Annot(docA, rect) { + Object obj1; + + type = typeLink; + annotObj.dictSet ("Subtype", obj1.initName ("Link")); + initialize (docA, annotObj.getDict()); +} + +AnnotLink::AnnotLink(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + + type = typeLink; + initialize (docA, dict); +} + +AnnotLink::~AnnotLink() { + delete action; + /* + if (uriAction) + delete uriAction; + */ + if (quadrilaterals) + delete quadrilaterals; +} + +void AnnotLink::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + action = NULL; + + // look for destination + if (!dict->lookup("Dest", &obj1)->isNull()) { + action = LinkAction::parseDest(&obj1); + // look for action + } else { + obj1.free(); + if (dict->lookup("A", &obj1)->isDict()) { + action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()); + } + } + obj1.free(); + + if (dict->lookup("H", &obj1)->isName()) { + const char *effect = obj1.getName(); + + if (!strcmp(effect, "N")) { + linkEffect = effectNone; + } else if (!strcmp(effect, "I")) { + linkEffect = effectInvert; + } else if (!strcmp(effect, "O")) { + linkEffect = effectOutline; + } else if (!strcmp(effect, "P")) { + linkEffect = effectPush; + } else { + linkEffect = effectInvert; + } + } else { + linkEffect = effectInvert; + } + obj1.free(); + /* + if (dict->lookup("PA", &obj1)->isDict()) { + uriAction = NULL; + } else { + uriAction = NULL; + } + obj1.free(); + */ + if (dict->lookup("QuadPoints", &obj1)->isArray()) { + quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); + } else { + quadrilaterals = NULL; + } + obj1.free(); +} + +void AnnotLink::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, border, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotFreeText +//------------------------------------------------------------------------ +AnnotFreeText::AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeFreeText; + + annotObj.dictSet ("Subtype", obj1.initName ("FreeText")); + + Object obj2; + obj2.initString (da->copy()); + annotObj.dictSet("DA", &obj2); + + initialize (docA, annotObj.getDict()); +} + +AnnotFreeText::AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeFreeText; + initialize(docA, dict); +} + +AnnotFreeText::~AnnotFreeText() { + delete appearanceString; + + if (styleString) + delete styleString; + + if (calloutLine) + delete calloutLine; + + if (borderEffect) + delete borderEffect; + + if (rectangle) + delete rectangle; +} + +void AnnotFreeText::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + if (dict->lookup("DA", &obj1)->isString()) { + appearanceString = obj1.getString()->copy(); + } else { + appearanceString = new GooString(); + error(errSyntaxError, -1, "Bad appearance for annotation"); + ok = gFalse; + } + obj1.free(); + + if (dict->lookup("Q", &obj1)->isInt()) { + quadding = (AnnotFreeTextQuadding) obj1.getInt(); + } else { + quadding = quaddingLeftJustified; + } + obj1.free(); + + if (dict->lookup("DS", &obj1)->isString()) { + styleString = obj1.getString()->copy(); + } else { + styleString = NULL; + } + obj1.free(); + + if (dict->lookup("CL", &obj1)->isArray() && obj1.arrayGetLength() >= 4) { + double x1, y1, x2, y2; + Object obj2; + + (obj1.arrayGet(0, &obj2)->isNum() ? x1 = obj2.getNum() : x1 = 0); + obj2.free(); + (obj1.arrayGet(1, &obj2)->isNum() ? y1 = obj2.getNum() : y1 = 0); + obj2.free(); + (obj1.arrayGet(2, &obj2)->isNum() ? x2 = obj2.getNum() : x2 = 0); + obj2.free(); + (obj1.arrayGet(3, &obj2)->isNum() ? y2 = obj2.getNum() : y2 = 0); + obj2.free(); + + if (obj1.arrayGetLength() == 6) { + double x3, y3; + (obj1.arrayGet(4, &obj2)->isNum() ? x3 = obj2.getNum() : x3 = 0); + obj2.free(); + (obj1.arrayGet(5, &obj2)->isNum() ? y3 = obj2.getNum() : y3 = 0); + obj2.free(); + calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3); + } else { + calloutLine = new AnnotCalloutLine(x1, y1, x2, y2); + } + } else { + calloutLine = NULL; + } + obj1.free(); + + if (dict->lookup("IT", &obj1)->isName()) { + const char *intentName = obj1.getName(); + + if (!strcmp(intentName, "FreeText")) { + intent = intentFreeText; + } else if (!strcmp(intentName, "FreeTextCallout")) { + intent = intentFreeTextCallout; + } else if (!strcmp(intentName, "FreeTextTypeWriter")) { + intent = intentFreeTextTypeWriter; + } else { + intent = intentFreeText; + } + } else { + intent = intentFreeText; + } + obj1.free(); + + if (dict->lookup("BE", &obj1)->isDict()) { + borderEffect = new AnnotBorderEffect(obj1.getDict()); + } else { + borderEffect = NULL; + } + obj1.free(); + + if (dict->lookup("RD", &obj1)->isArray()) { + rectangle = parseDiffRectangle(obj1.getArray(), rect); + } else { + rectangle = NULL; + } + obj1.free(); + + if (dict->lookup("LE", &obj1)->isName()) { + GooString styleName(obj1.getName()); + endStyle = parseAnnotLineEndingStyle(&styleName); + } else { + endStyle = annotLineEndingNone; + } + obj1.free(); +} + +void AnnotFreeText::setAppearanceString(GooString *new_string) { + delete appearanceString; + + if (new_string) { + appearanceString = new GooString(new_string); + } else { + appearanceString = new GooString(); + } + + Object obj1; + obj1.initString(appearanceString->copy()); + update ("DA", &obj1); +} + +void AnnotFreeText::setQuadding(AnnotFreeTextQuadding new_quadding) { + Object obj1; + quadding = new_quadding; + obj1.initInt((int)quadding); + update ("Q", &obj1); +} + +void AnnotFreeText::setStyleString(GooString *new_string) { + delete styleString; + + if (new_string) { + styleString = new GooString(new_string); + //append the unicode marker if needed + if (!styleString->hasUnicodeMarker()) { + styleString->insert(0, 0xff); + styleString->insert(0, 0xfe); + } + } else { + styleString = new GooString(); + } + + Object obj1; + obj1.initString(styleString->copy()); + update ("DS", &obj1); +} + +void AnnotFreeText::setCalloutLine(AnnotCalloutLine *line) { + delete calloutLine; + + Object obj1; + if (line == NULL) { + obj1.initNull(); + calloutLine = NULL; + } else { + double x1 = line->getX1(), y1 = line->getY1(); + double x2 = line->getX2(), y2 = line->getY2(); + Object obj2; + obj1.initArray(xref); + obj1.arrayAdd( obj2.initReal(x1) ); + obj1.arrayAdd( obj2.initReal(y1) ); + obj1.arrayAdd( obj2.initReal(x2) ); + obj1.arrayAdd( obj2.initReal(y2) ); + + AnnotCalloutMultiLine *mline = dynamic_cast(line); + if (mline) { + double x3 = mline->getX3(), y3 = mline->getY3(); + obj1.arrayAdd( obj2.initReal(x3) ); + obj1.arrayAdd( obj2.initReal(y3) ); + calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3); + } else { + calloutLine = new AnnotCalloutLine(x1, y1, x2, y2); + } + } + + update("CL", &obj1); +} + +void AnnotFreeText::setIntent(AnnotFreeTextIntent new_intent) { + Object obj1; + + intent = new_intent; + if (new_intent == intentFreeText) + obj1.initName("FreeText"); + else if (new_intent == intentFreeTextCallout) + obj1.initName("FreeTextCallout"); + else // intentFreeTextTypeWriter + obj1.initName("FreeTextTypeWriter"); + update ("IT", &obj1); +} + +static GfxFont * createAnnotDrawFont(XRef * xref, Object *fontResDict) +{ + Ref dummyRef = { -1, -1 }; + + Object baseFontObj, subtypeObj, encodingObj; + baseFontObj.initName("Helvetica"); + subtypeObj.initName("Type0"); + encodingObj.initName("WinAnsiEncoding"); + + Object fontDictObj; + Dict *fontDict = new Dict(xref); + fontDict->decRef(); + fontDict->add(copyString("BaseFont"), &baseFontObj); + fontDict->add(copyString("Subtype"), &subtypeObj); + fontDict->add(copyString("Encoding"), &encodingObj); + fontDictObj.initDict(fontDict); + + Object fontsDictObj; + Dict *fontsDict = new Dict(xref); + fontsDict->decRef(); + fontsDict->add(copyString("AnnotDrawFont"), &fontDictObj); + fontsDictObj.initDict(fontsDict); + + Dict *dict = new Dict(xref); + dict->add(copyString("Font"), &fontsDictObj); + + fontResDict->initDict(dict); + return GfxFont::makeFont(xref, "AnnotDrawFont", dummyRef, fontDict); +} + +void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor) { + fontsize = -1; + fontcolor = NULL; + if (da) { + GooList * daToks = new GooList(); + int j, i = 0; + + // Tokenize + while (i < da->getLength()) { + while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { + ++i; + } + if (i < da->getLength()) { + for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j) { + } + daToks->append(new GooString(da, i, j - i)); + i = j; + } + } + + // Scan backwards: we are looking for the last set value + for (i = daToks->getLength()-1; i >= 0; --i) { + if (fontsize == -1) { + if (!((GooString *)daToks->get(i))->cmp("Tf") && i >= 2) { + // TODO: Font name + fontsize = gatof(( (GooString *)daToks->get(i-1) )->getCString()); + } + } + if (fontcolor == NULL) { + if (!((GooString *)daToks->get(i))->cmp("g") && i >= 1) { + fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-1) )->getCString())); + } else if (!((GooString *)daToks->get(i))->cmp("rg") && i >= 3) { + fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-3) )->getCString()), + gatof(( (GooString *)daToks->get(i-2) )->getCString()), + gatof(( (GooString *)daToks->get(i-1) )->getCString())); + } else if (!((GooString *)daToks->get(i))->cmp("k") && i >= 4) { + fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-4) )->getCString()), + gatof(( (GooString *)daToks->get(i-3) )->getCString()), + gatof(( (GooString *)daToks->get(i-2) )->getCString()), + gatof(( (GooString *)daToks->get(i-1) )->getCString())); + } + } + } + deleteGooList(daToks, GooString); + } +} + +void AnnotFreeText::generateFreeTextAppearance() +{ + double borderWidth, ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + + if (border) { + int i, dashLength; + double *dash; + borderWidth = border->getWidth(); + + switch (border->getStyle()) { + case AnnotBorder::borderDashed: + appearBuf->append("["); + dashLength = border->getDashLength(); + dash = border->getDash(); + for (i = 0; i < dashLength; ++i) + appearBuf->appendf(" {0:.2f}", dash[i]); + appearBuf->append(" ] 0 d\n"); + break; + default: + appearBuf->append("[] 0 d\n"); + break; + } + appearBuf->appendf("{0:.2f} w\n", borderWidth); + } else { + borderWidth = 0; // No border + } + + // Box size + const double width = rect->x2 - rect->x1; + const double height = rect->y2 - rect->y1; + + // Parse some properties from the appearance string + double fontsize; + AnnotColor *fontcolor; + parseAppearanceString(appearanceString, fontsize, fontcolor); + // Default values + if (fontsize <= 0) + fontsize = 10; + if (fontcolor == NULL) + fontcolor = new AnnotColor(0, 0, 0); // Black + + // Draw box + GBool doFill = (color && color->getSpace() != AnnotColor::colorTransparent); + GBool doStroke = (borderWidth != 0); + if (doFill || doStroke) { + if (doStroke) { + setColor(fontcolor, gFalse); // Border color: same as font color + } + appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re\n", borderWidth/2, width-borderWidth, height-borderWidth); + if (doFill) { + setColor(color, gTrue); + appearBuf->append(doStroke ? "B\n" : "f\n"); + } else { + appearBuf->append("S\n"); + } + } + + // Setup text clipping + const double textmargin = borderWidth * 2; + const double textwidth = width - 2*textmargin; + appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", textmargin, textwidth, height - 2*textmargin); + + Object fontResDict; + GfxFont *font = createAnnotDrawFont(xref, &fontResDict); + + // Set font state + setColor(fontcolor, gTrue); + appearBuf->appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - fontsize * font->getDescent()); + appearBuf->appendf ("/AnnotDrawFont {0:.2f} Tf\n", fontsize); + + int i = 0; + double xposPrev = 0; + while (i < contents->getLength()) { + GooString out; + double linewidth, xpos; + layoutText(contents, &out, &i, font, &linewidth, textwidth/fontsize, NULL, gFalse); + linewidth *= fontsize; + switch (quadding) { + case quaddingCentered: + xpos = (textwidth - linewidth) / 2; + break; + case quaddingRightJustified: + xpos = textwidth - linewidth; + break; + default: // quaddingLeftJustified: + xpos = 0; + break; + } + appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize); + writeString(&out, appearBuf); + appearBuf->append("Tj\n"); + xposPrev = xpos; + } + + font->decRefCnt(); + delete fontcolor; + appearBuf->append ("ET Q\n"); + + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = rect->x2 - rect->x1; + bbox[3] = rect->y2 - rect->y1; + + if (ca == 1) { + createForm(bbox, gFalse, &fontResDict, &appearance); + } else { + Object aStream, resDict; + + createForm(bbox, gTrue, &fontResDict, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; +} + +void AnnotFreeText::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + generateFreeTextAppearance(); + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +// Before retrieving the res dict, regenerate the appearance stream if needed, +// because AnnotFreeText::draw needs to store font info in the res dict +Object *AnnotFreeText::getAppearanceResDict(Object *dest) { + if (appearance.isNull()) { + generateFreeTextAppearance(); + } + return Annot::getAppearanceResDict(dest); +} + +//------------------------------------------------------------------------ +// AnnotLine +//------------------------------------------------------------------------ + +AnnotLine::AnnotLine(PDFDoc *docA, PDFRectangle *rect, PDFRectangle *lRect) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeLine; + annotObj.dictSet ("Subtype", obj1.initName ("Line")); + + Object obj2, obj3; + obj2.initArray (doc->getXRef()); + obj2.arrayAdd (obj3.initReal (lRect->x1)); + obj2.arrayAdd (obj3.initReal (lRect->y1)); + obj2.arrayAdd (obj3.initReal (lRect->x2)); + obj2.arrayAdd (obj3.initReal (lRect->y2)); + annotObj.dictSet ("L", &obj2); + + initialize (docA, annotObj.getDict()); +} + +AnnotLine::AnnotLine(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeLine; + initialize(docA, dict); +} + +AnnotLine::~AnnotLine() { + delete coord1; + delete coord2; + + if (interiorColor) + delete interiorColor; + + if (measure) + delete measure; +} + +void AnnotLine::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + if (dict->lookup("L", &obj1)->isArray() && obj1.arrayGetLength() == 4) { + Object obj2; + double x1, y1, x2, y2; + + (obj1.arrayGet(0, &obj2)->isNum() ? x1 = obj2.getNum() : x1 = 0); + obj2.free(); + (obj1.arrayGet(1, &obj2)->isNum() ? y1 = obj2.getNum() : y1 = 0); + obj2.free(); + (obj1.arrayGet(2, &obj2)->isNum() ? x2 = obj2.getNum() : x2 = 0); + obj2.free(); + (obj1.arrayGet(3, &obj2)->isNum() ? y2 = obj2.getNum() : y2 = 0); + obj2.free(); + + coord1 = new AnnotCoord(x1, y1); + coord2 = new AnnotCoord(x2, y2); + } else { + coord1 = new AnnotCoord(); + coord2 = new AnnotCoord(); + } + obj1.free(); + + if (dict->lookup("LE", &obj1)->isArray() && obj1.arrayGetLength() == 2) { + Object obj2; + + if(obj1.arrayGet(0, &obj2)->isString()) + startStyle = parseAnnotLineEndingStyle(obj2.getString()); + else + startStyle = annotLineEndingNone; + obj2.free(); + + if(obj1.arrayGet(1, &obj2)->isString()) + endStyle = parseAnnotLineEndingStyle(obj2.getString()); + else + endStyle = annotLineEndingNone; + obj2.free(); + + } else { + startStyle = endStyle = annotLineEndingNone; + } + obj1.free(); + + if (dict->lookup("IC", &obj1)->isArray()) { + interiorColor = new AnnotColor(obj1.getArray()); + } else { + interiorColor = NULL; + } + obj1.free(); + + if (dict->lookup("LL", &obj1)->isNum()) { + leaderLineLength = obj1.getNum(); + } else { + leaderLineLength = 0; + } + obj1.free(); + + if (dict->lookup("LLE", &obj1)->isNum()) { + leaderLineExtension = obj1.getNum(); + + if (leaderLineExtension < 0) + leaderLineExtension = 0; + } else { + leaderLineExtension = 0; + } + obj1.free(); + + if (dict->lookup("Cap", &obj1)->isBool()) { + caption = obj1.getBool(); + } else { + caption = gFalse; + } + obj1.free(); + + if (dict->lookup("IT", &obj1)->isName()) { + const char *intentName = obj1.getName(); + + if(!strcmp(intentName, "LineArrow")) { + intent = intentLineArrow; + } else if(!strcmp(intentName, "LineDimension")) { + intent = intentLineDimension; + } else { + intent = intentLineArrow; + } + } else { + intent = intentLineArrow; + } + obj1.free(); + + if (dict->lookup("LLO", &obj1)->isNum()) { + leaderLineOffset = obj1.getNum(); + + if (leaderLineOffset < 0) + leaderLineOffset = 0; + } else { + leaderLineOffset = 0; + } + obj1.free(); + + if (dict->lookup("CP", &obj1)->isName()) { + const char *captionName = obj1.getName(); + + if(!strcmp(captionName, "Inline")) { + captionPos = captionPosInline; + } else if(!strcmp(captionName, "Top")) { + captionPos = captionPosTop; + } else { + captionPos = captionPosInline; + } + } else { + captionPos = captionPosInline; + } + obj1.free(); + + if (dict->lookup("Measure", &obj1)->isDict()) { + measure = NULL; + } else { + measure = NULL; + } + obj1.free(); + + if ((dict->lookup("CO", &obj1)->isArray()) && (obj1.arrayGetLength() == 2)) { + Object obj2; + + (obj1.arrayGet(0, &obj2)->isNum() ? captionTextHorizontal = obj2.getNum() : + captionTextHorizontal = 0); + obj2.free(); + (obj1.arrayGet(1, &obj2)->isNum() ? captionTextVertical = obj2.getNum() : + captionTextVertical = 0); + obj2.free(); + } else { + captionTextHorizontal = captionTextVertical = 0; + } + obj1.free(); +} + +void AnnotLine::setVertices(double x1, double y1, double x2, double y2) { + Object obj1, obj2; + + delete coord1; + coord1 = new AnnotCoord(x1, y1); + delete coord2; + coord2 = new AnnotCoord(x2, y2); + + obj1.initArray(xref); + obj1.arrayAdd( obj2.initReal(x1) ); + obj1.arrayAdd( obj2.initReal(y1) ); + obj1.arrayAdd( obj2.initReal(x2) ); + obj1.arrayAdd( obj2.initReal(y2) ); + + update("L", &obj1); +} + +void AnnotLine::setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end) { + Object obj1, obj2; + + startStyle = start; + endStyle = end; + + obj1.initArray(xref); + obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( startStyle )) ); + obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( endStyle )) ); + + update("LE", &obj1); +} + +void AnnotLine::setInteriorColor(AnnotColor *new_color) { + delete interiorColor; + + if (new_color) { + Object obj1; + new_color->writeToObject(xref, &obj1); + update ("IC", &obj1); + interiorColor = new_color; + } else { + interiorColor = NULL; + } +} + +void AnnotLine::setLeaderLineLength(double len) { + Object obj1; + + leaderLineLength = len; + obj1.initReal(len); + update ("LL", &obj1); +} + +void AnnotLine::setLeaderLineExtension(double len) { + Object obj1; + + leaderLineExtension = len; + obj1.initReal(len); + update ("LLE", &obj1); + + // LL is required if LLE is present + obj1.initReal(leaderLineLength); + update ("LL", &obj1); +} + +void AnnotLine::setCaption(bool new_cap) { + Object obj1; + + caption = new_cap; + obj1.initBool(new_cap); + update ("Cap", &obj1); +} + +void AnnotLine::setIntent(AnnotLineIntent new_intent) { + Object obj1; + + intent = new_intent; + if (new_intent == intentLineArrow) + obj1.initName("LineArrow"); + else // intentLineDimension + obj1.initName("LineDimension"); + update ("IT", &obj1); +} + +void AnnotLine::generateLineAppearance() +{ + double borderWidth, ca = opacity; + + appearBBox = new AnnotAppearanceBBox(rect); + appearBuf = new GooString (); + appearBuf->append ("q\n"); + if (color) { + setColor(color, gFalse); + } + + if (border) { + int i, dashLength; + double *dash; + + switch (border->getStyle()) { + case AnnotBorder::borderDashed: + appearBuf->append("["); + dashLength = border->getDashLength(); + dash = border->getDash(); + for (i = 0; i < dashLength; ++i) + appearBuf->appendf(" {0:.2f}", dash[i]); + appearBuf->append(" ] 0 d\n"); + break; + default: + appearBuf->append("[] 0 d\n"); + break; + } + borderWidth = border->getWidth(); + appearBuf->appendf("{0:.2f} w\n", borderWidth); + appearBBox->setBorderWidth(borderWidth); + } else { + borderWidth = 0; + } + + const double x1 = coord1->getX(); + const double y1 = coord1->getY(); + const double x2 = coord2->getX(); + const double y2 = coord2->getY(); + + // Main segment length + const double main_len = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); + + // Main segment becomes positive x direction, coord1 becomes (0,0) + Matrix matr; + const double angle = atan2(y2 - y1, x2 - x1); + matr.m[0] = matr.m[3] = cos(angle); + matr.m[1] = sin(angle); + matr.m[2] = -matr.m[1]; + matr.m[4] = x1-rect->x1; + matr.m[5] = y1-rect->y1; + + double tx, ty, captionwidth = 0, captionheight = 0; + AnnotLineCaptionPos actualCaptionPos = captionPos; + const double fontsize = 9; + const double captionhmargin = 2; // Left and right margin (inline caption only) + const double captionmaxwidth = main_len - 2 * captionhmargin; + + Object fontResDict; + GfxFont *font; + + // Calculate caption width and height + if (caption) { + font = createAnnotDrawFont(xref, &fontResDict); + int lines = 0; + int i = 0; + while (i < contents->getLength()) { + GooString out; + double linewidth; + layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse); + linewidth *= fontsize; + if (linewidth > captionwidth) { + captionwidth = linewidth; + } + ++lines; + } + captionheight = lines * fontsize; + // If text is longer than available space, turn into captionPosTop + if (captionwidth > captionmaxwidth) { + actualCaptionPos = captionPosTop; + } + } else { + fontResDict.initNull(); + font = NULL; + } + + // Draw main segment + matr.transform (0, leaderLineLength, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty); + appearBBox->extendTo (tx, ty); + + if (captionwidth != 0 && actualCaptionPos == captionPosInline) { // Break in the middle + matr.transform ((main_len-captionwidth)/2 - captionhmargin, leaderLineLength, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty); + + matr.transform ((main_len+captionwidth)/2 + captionhmargin, leaderLineLength, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty); + } + + matr.transform (main_len, leaderLineLength, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty); + appearBBox->extendTo (tx, ty); + + // TODO: Line endings + + // Draw caption text + if (caption) { + double tlx = (main_len - captionwidth) / 2, tly; // Top-left coords + if (actualCaptionPos == captionPosInline) { + tly = leaderLineLength + captionheight / 2; + } else { + tly = leaderLineLength + captionheight + 2*borderWidth; + } + + tlx += captionTextHorizontal; + tly += captionTextVertical; + + // Adjust bounding box + matr.transform (tlx, tly-captionheight, &tx, &ty); + appearBBox->extendTo (tx, ty); + matr.transform (tlx+captionwidth, tly-captionheight, &tx, &ty); + appearBBox->extendTo (tx, ty); + matr.transform (tlx+captionwidth, tly, &tx, &ty); + appearBBox->extendTo (tx, ty); + matr.transform (tlx, tly, &tx, &ty); + appearBBox->extendTo (tx, ty); + + // Setup text state (reusing transformed top-left coord) + appearBuf->appendf ("0 g BT /AnnotDrawFont {0:.2f} Tf\n", fontsize); // Font color: black + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} Tm\n", + matr.m[0], matr.m[1], matr.m[2], matr.m[3], tx, ty); + appearBuf->appendf ("0 {0:.2f} Td\n", -fontsize * font->getDescent()); + // Draw text + int i = 0; + double xposPrev = 0; + while (i < contents->getLength()) { + GooString out; + double linewidth, xpos; + layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse); + linewidth *= fontsize; + xpos = (captionwidth - linewidth) / 2; + appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize); + writeString(&out, appearBuf); + appearBuf->append ("Tj\n"); + xposPrev = xpos; + } + appearBuf->append ("ET\n"); + font->decRefCnt(); + } + + // Draw leader lines + double ll_len = fabs(leaderLineLength) + leaderLineExtension; + double sign = leaderLineLength >= 0 ? 1 : -1; + if (ll_len != 0) { + matr.transform (0, 0, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty); + appearBBox->extendTo (tx, ty); + matr.transform (0, sign*ll_len, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty); + appearBBox->extendTo (tx, ty); + + matr.transform (main_len, 0, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", tx, ty); + appearBBox->extendTo (tx, ty); + matr.transform (main_len, sign*ll_len, &tx, &ty); + appearBuf->appendf ("{0:.2f} {1:.2f} l S\n", tx, ty); + appearBBox->extendTo (tx, ty); + } + + appearBuf->append ("Q\n"); + + double bbox[4]; + appearBBox->getBBoxRect(bbox); + if (ca == 1) { + createForm(bbox, gFalse, &fontResDict, &appearance); + } else { + Object aStream, resDict; + + createForm(bbox, gTrue, &fontResDict, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; +} + +void AnnotLine::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + generateLineAppearance(); + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + } + obj.free(); +} + +// Before retrieving the res dict, regenerate the appearance stream if needed, +// because AnnotLine::draw may need to store font info in the res dict +Object *AnnotLine::getAppearanceResDict(Object *dest) { + if (appearance.isNull()) { + generateLineAppearance(); + } + return Annot::getAppearanceResDict(dest); +} + +//------------------------------------------------------------------------ +// AnnotTextMarkup +//------------------------------------------------------------------------ +AnnotTextMarkup::AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType, + AnnotQuadrilaterals *quadPoints) : + AnnotMarkup(docA, rect) { + Object obj1; + + switch (subType) { + case typeHighlight: + annotObj.dictSet ("Subtype", obj1.initName ("Highlight")); + break; + case typeUnderline: + annotObj.dictSet ("Subtype", obj1.initName ("Underline")); + break; + case typeSquiggly: + annotObj.dictSet ("Subtype", obj1.initName ("Squiggly")); + break; + case typeStrikeOut: + annotObj.dictSet ("Subtype", obj1.initName ("StrikeOut")); + break; + default: + assert (0 && "Invalid subtype for AnnotTextMarkup\n"); + } + + Object obj2; + obj2.initArray (doc->getXRef()); + + for (int i = 0; i < quadPoints->getQuadrilateralsLength(); ++i) { + Object obj3; + + obj2.arrayAdd (obj3.initReal (quadPoints->getX1(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY1(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getX2(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY2(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getX3(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY3(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getX4(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY4(i))); + } + + annotObj.dictSet ("QuadPoints", &obj2); + + initialize(docA, annotObj.getDict()); +} + +AnnotTextMarkup::AnnotTextMarkup(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + // the real type will be read in initialize() + type = typeHighlight; + initialize(docA, dict); +} + +void AnnotTextMarkup::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + if (dict->lookup("Subtype", &obj1)->isName()) { + GooString typeName(obj1.getName()); + if (!typeName.cmp("Highlight")) { + type = typeHighlight; + } else if (!typeName.cmp("Underline")) { + type = typeUnderline; + } else if (!typeName.cmp("Squiggly")) { + type = typeSquiggly; + } else if (!typeName.cmp("StrikeOut")) { + type = typeStrikeOut; + } + } + obj1.free(); + + if(dict->lookup("QuadPoints", &obj1)->isArray()) { + quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); + } else { + error(errSyntaxError, -1, "Bad Annot Text Markup QuadPoints"); + quadrilaterals = NULL; + ok = gFalse; + } + obj1.free(); +} + +AnnotTextMarkup::~AnnotTextMarkup() { + if(quadrilaterals) { + delete quadrilaterals; + } +} + +void AnnotTextMarkup::setType(AnnotSubtype new_type) { + Object obj1; + + switch (new_type) { + case typeHighlight: + obj1.initName("Highlight"); + break; + case typeUnderline: + obj1.initName("Underline"); + break; + case typeSquiggly: + obj1.initName("Squiggly"); + break; + case typeStrikeOut: + obj1.initName("StrikeOut"); + break; + default: + assert(!"Invalid subtype"); + } + + type = new_type; + update("Subtype", &obj1); +} + +void AnnotTextMarkup::setQuadrilaterals(AnnotQuadrilaterals *quadPoints) { + Object obj1, obj2; + obj1.initArray (xref); + + for (int i = 0; i < quadPoints->getQuadrilateralsLength(); ++i) { + obj1.arrayAdd (obj2.initReal (quadPoints->getX1(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getY1(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getX2(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getY2(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getX3(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getY3(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getX4(i))); + obj1.arrayAdd (obj2.initReal (quadPoints->getY4(i))); + } + + quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); + + annotObj.dictSet ("QuadPoints", &obj1); +} + +void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + int i; + Object obj1, obj2; + + if (!isVisible (printing)) + return; + + if (appearance.isNull() || type == typeHighlight) { + GBool blendMultiply = gTrue; + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + + /* Adjust BBox */ + delete appearBBox; + appearBBox = new AnnotAppearanceBBox(rect); + for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { + appearBBox->extendTo (quadrilaterals->getX1(i) - rect->x1, quadrilaterals->getY1(i) - rect->y1); + appearBBox->extendTo (quadrilaterals->getX2(i) - rect->x1, quadrilaterals->getY2(i) - rect->y1); + appearBBox->extendTo (quadrilaterals->getX3(i) - rect->x1, quadrilaterals->getY3(i) - rect->y1); + appearBBox->extendTo (quadrilaterals->getX4(i) - rect->x1, quadrilaterals->getY4(i) - rect->y1); + } + + switch (type) { + case typeUnderline: + if (color) { + setColor(color, gFalse); + } + appearBuf->append ("[] 0 d 1 w\n"); + + for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { + double x1, x2, y3; + + x1 = quadrilaterals->getX1(i); + x2 = quadrilaterals->getX2(i); + y3 = quadrilaterals->getY3(i); + + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y3); + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y3); + appearBuf->append ("S\n"); + } + break; + case typeStrikeOut: + if (color) { + setColor(color, gFalse); + } + blendMultiply = gFalse; + appearBuf->append ("[] 0 d 1 w\n"); + + for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { + double x1, y1, x2, y3; + double h2; + + x1 = quadrilaterals->getX1(i); + y1 = quadrilaterals->getY1(i); + x2 = quadrilaterals->getX2(i); + y3 = quadrilaterals->getY3(i); + h2 = (y1 - y3) / 2.0; + + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y3+h2); + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y3+h2); + appearBuf->append ("S\n"); + } + break; + case typeSquiggly: + if (color) { + setColor(color, gFalse); + } + appearBuf->append ("[] 0 d 1 w\n"); + + for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { + double x1, y1, x2, y3; + double h6; + + x1 = quadrilaterals->getX1(i); + y1 = quadrilaterals->getY1(i); + x2 = quadrilaterals->getX2(i); + y3 = quadrilaterals->getY3(i); + h6 = (y1 - y3) / 6.0; + + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y3+h6); + bool down = false; + do { + down = !down; // Zigzag line + x1 += 2; + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x1, y3 + (down ? 0 : h6)); + } while (x1 < x2); + appearBuf->append ("S\n"); + } + break; + default: + case typeHighlight: + appearance.free(); + + if (color) + setColor(color, gTrue); + + double biggestBorder = 0; + for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { + double x1, y1, x2, y2, x3, y3, x4, y4; + double h4; + + x1 = quadrilaterals->getX1(i); + y1 = quadrilaterals->getY1(i); + x2 = quadrilaterals->getX2(i); + y2 = quadrilaterals->getY2(i); + x3 = quadrilaterals->getX3(i); + y3 = quadrilaterals->getY3(i); + x4 = quadrilaterals->getX4(i); + y4 = quadrilaterals->getY4(i); + h4 = fabs(y1 - y3) / 4.0; + + if (h4 > biggestBorder) { + biggestBorder = h4; + } + + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x3, y3); + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + x3 - h4, y3 + h4, x1 - h4, y1 - h4, x1, y1); + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x2, y2); + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + x2 + h4, y2 - h4, x4 + h4, y4 + h4, x4, y4); + appearBuf->append ("f\n"); + } + appearBBox->setBorderWidth(biggestBorder); + break; + } + appearBuf->append ("Q\n"); + + Object aStream, resDict; + double bbox[4]; + bbox[0] = appearBBox->getPageXMin(); + bbox[1] = appearBBox->getPageYMin(); + bbox[2] = appearBBox->getPageXMax(); + bbox[3] = appearBBox->getPageYMax(); + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", 1, blendMultiply ? "Multiply" : NULL, &resDict); + if (ca == 1) { + createForm(bbox, gFalse, &resDict, &appearance); + } else { + createForm(bbox, gTrue, &resDict, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + } + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotWidget +//------------------------------------------------------------------------ + +AnnotWidget::AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + type = typeWidget; + field = NULL; + initialize(docA, dict); +} + +AnnotWidget::AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj, FormField *fieldA) : + Annot(docA, dict, obj) { + type = typeWidget; + field = fieldA; + initialize(docA, dict); +} + +AnnotWidget::~AnnotWidget() { + if (appearCharacs) + delete appearCharacs; + + if (action) + delete action; + + if (additionActions) + delete additionActions; + + if (parent) + delete parent; +} + +void AnnotWidget::initialize(PDFDoc *docA, Dict *dict) { + Object obj1; + + form = doc->getCatalog()->getForm(); + + if(dict->lookup("H", &obj1)->isName()) { + const char *modeName = obj1.getName(); + + if(!strcmp(modeName, "N")) { + mode = highlightModeNone; + } else if(!strcmp(modeName, "O")) { + mode = highlightModeOutline; + } else if(!strcmp(modeName, "P") || !strcmp(modeName, "T")) { + mode = highlightModePush; + } else { + mode = highlightModeInvert; + } + } else { + mode = highlightModeInvert; + } + obj1.free(); + + if(dict->lookup("MK", &obj1)->isDict()) { + appearCharacs = new AnnotAppearanceCharacs(obj1.getDict()); + } else { + appearCharacs = NULL; + } + obj1.free(); + + action = NULL; + if(dict->lookup("A", &obj1)->isDict()) { + action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()); + } + obj1.free(); + + if(dict->lookup("AA", &obj1)->isDict()) { + additionActions = NULL; + } else { + additionActions = NULL; + } + obj1.free(); + + if(dict->lookup("Parent", &obj1)->isDict()) { + parent = NULL; + } else { + parent = NULL; + } + obj1.free(); +} + +// Grand unified handler for preparing text strings to be drawn into form +// fields. Takes as input a text string (in PDFDocEncoding or UTF-16). +// Converts some or all of this string to the appropriate encoding for the +// specified font, and computes the width of the text. Can optionally stop +// converting when a specified width has been reached, to perform line-breaking +// for multi-line fields. +// +// Parameters: +// text: input text string to convert +// outBuf: buffer for writing re-encoded string +// i: index at which to start converting; will be updated to point just after +// last character processed +// font: the font which will be used for display +// width: computed width (unscaled by font size) will be stored here +// widthLimit: if non-zero, stop converting to keep width under this value +// (should be scaled down by font size) +// charCount: count of number of characters will be stored here +// noReencode: if set, do not try to translate the character encoding +// (useful for Zapf Dingbats or other unusual encodings) +// can only be used with simple fonts, not CID-keyed fonts +// +// TODO: Handle surrogate pairs in UTF-16. +// Should be able to generate output for any CID-keyed font. +// Doesn't handle vertical fonts--should it? +void Annot::layoutText(GooString *text, GooString *outBuf, int *i, + GfxFont *font, double *width, double widthLimit, + int *charCount, GBool noReencode) +{ + CharCode c; + Unicode uChar, *uAux; + double w = 0.0; + int uLen, n; + double dx, dy, ox, oy; + GBool unicode = text->hasUnicodeMarker(); + GBool spacePrev; // previous character was a space + + // State for backtracking when more text has been processed than fits within + // widthLimit. We track for both input (text) and output (outBuf) the offset + // to the first character to discard. + // + // We keep track of several points: + // 1 - end of previous completed word which fits + // 2 - previous character which fit + int last_i1, last_i2, last_o1, last_o2; + + if (unicode && text->getLength() % 2 != 0) { + error(errSyntaxError, -1, "AnnotWidget::layoutText, bad unicode string"); + return; + } + + // skip Unicode marker on string if needed + if (unicode && *i == 0) + *i = 2; + + // Start decoding and copying characters, until either: + // we reach the end of the string + // we reach the maximum width + // we reach a newline character + // As we copy characters, keep track of the last full word to fit, so that we + // can backtrack if we exceed the maximum width. + last_i1 = last_i2 = *i; + last_o1 = last_o2 = 0; + spacePrev = gFalse; + outBuf->clear(); + + while (*i < text->getLength()) { + last_i2 = *i; + last_o2 = outBuf->getLength(); + + if (unicode) { + uChar = (unsigned char)(text->getChar(*i)) << 8; + uChar += (unsigned char)(text->getChar(*i + 1)); + *i += 2; + } else { + if (noReencode) + uChar = text->getChar(*i) & 0xff; + else + uChar = pdfDocEncoding[text->getChar(*i) & 0xff]; + *i += 1; + } + + // Explicit line break? + if (uChar == '\r' || uChar == '\n') { + // Treat a sequence as a single line break + if (uChar == '\r' && *i < text->getLength()) { + if (unicode && text->getChar(*i) == '\0' + && text->getChar(*i + 1) == '\n') + *i += 2; + else if (!unicode && text->getChar(*i) == '\n') + *i += 1; + } + + break; + } + + if (noReencode) { + outBuf->append(uChar); + } else { + CharCodeToUnicode *ccToUnicode = font->getToUnicode(); + if (!ccToUnicode) { + // This assumes an identity CMap. + outBuf->append((uChar >> 8) & 0xff); + outBuf->append(uChar & 0xff); + } else if (ccToUnicode->mapToCharCode(&uChar, &c, 1)) { + ccToUnicode->decRefCnt(); + if (font->isCIDFont()) { + // TODO: This assumes an identity CMap. It should be extended to + // handle the general case. + outBuf->append((c >> 8) & 0xff); + outBuf->append(c & 0xff); + } else { + // 8-bit font + outBuf->append(c); + } + } else { + ccToUnicode->decRefCnt(); + fprintf(stderr, + "warning: layoutText: cannot convert U+%04X\n", uChar); + } + } + + // If we see a space, then we have a linebreak opportunity. + if (uChar == ' ') { + last_i1 = *i; + if (!spacePrev) + last_o1 = last_o2; + spacePrev = gTrue; + } else { + spacePrev = gFalse; + } + + // Compute width of character just output + if (outBuf->getLength() > last_o2) { + dx = 0.0; + font->getNextChar(outBuf->getCString() + last_o2, + outBuf->getLength() - last_o2, + &c, &uAux, &uLen, &dx, &dy, &ox, &oy); + w += dx; + } + + // Current line over-full now? + if (widthLimit > 0.0 && w > widthLimit) { + if (last_o1 > 0) { + // Back up to the previous word which fit, if there was a previous + // word. + *i = last_i1; + outBuf->del(last_o1, outBuf->getLength() - last_o1); + } else if (last_o2 > 0) { + // Otherwise, back up to the previous character (in the only word on + // this line) + *i = last_i2; + outBuf->del(last_o2, outBuf->getLength() - last_o2); + } else { + // Otherwise, we were trying to fit the first character; include it + // anyway even if it overflows the space--no updates to make. + } + break; + } + } + + // If splitting input into lines because we reached the width limit, then + // consume any remaining trailing spaces that would go on this line from the + // input. If in doing so we reach a newline, consume that also. This code + // won't run if we stopped at a newline above, since in that case w <= + // widthLimit still. + if (widthLimit > 0.0 && w > widthLimit) { + if (unicode) { + while (*i < text->getLength() + && text->getChar(*i) == '\0' && text->getChar(*i + 1) == ' ') + *i += 2; + if (*i < text->getLength() + && text->getChar(*i) == '\0' && text->getChar(*i + 1) == '\r') + *i += 2; + if (*i < text->getLength() + && text->getChar(*i) == '\0' && text->getChar(*i + 1) == '\n') + *i += 2; + } else { + while (*i < text->getLength() && text->getChar(*i) == ' ') + *i += 1; + if (*i < text->getLength() && text->getChar(*i) == '\r') + *i += 1; + if (*i < text->getLength() && text->getChar(*i) == '\n') + *i += 1; + } + } + + // Compute the actual width and character count of the final string, based on + // breakpoint, if this information is requested by the caller. + if (width != NULL || charCount != NULL) { + char *s = outBuf->getCString(); + int len = outBuf->getLength(); + + if (width != NULL) + *width = 0.0; + if (charCount != NULL) + *charCount = 0; + + while (len > 0) { + dx = 0.0; + n = font->getNextChar(s, len, &c, &uAux, &uLen, &dx, &dy, &ox, &oy); + + if (n == 0) { + break; + } + + if (width != NULL) + *width += dx; + if (charCount != NULL) + *charCount += 1; + + s += n; + len -= n; + } + } +} + +// Copy the given string to appearBuf, adding parentheses around it and +// escaping characters as appropriate. +void Annot::writeString(GooString *str, GooString *appearBuf) +{ + char c; + int i; + + appearBuf->append('('); + + for (i = 0; i < str->getLength(); ++i) { + c = str->getChar(i); + if (c == '(' || c == ')' || c == '\\') { + appearBuf->append('\\'); + appearBuf->append(c); + } else if (c < 0x20) { + appearBuf->appendf("\\{0:03o}", (unsigned char)c); + } else { + appearBuf->append(c); + } + } + + appearBuf->append(')'); +} + +// Draw the variable text or caption for a field. +void AnnotWidget::drawText(GooString *text, GooString *da, GfxResources *resources, + GBool multiline, int comb, int quadding, + GBool txField, GBool forceZapfDingbats, + GBool password) { + GooList *daToks; + GooString *tok, *convertedText; + GfxFont *font; + double dx, dy; + double fontSize, fontSize2, borderWidth, x, xPrev, y, w, wMax; + int tfPos, tmPos, i, j; + int rot; + GBool freeText = gFalse; // true if text should be freed before return + GBool freeFont = gFalse; + + //~ if there is no MK entry, this should use the existing content stream, + //~ and only replace the marked content portion of it + //~ (this is only relevant for Tx fields) + + // parse the default appearance string + tfPos = tmPos = -1; + if (da) { + daToks = new GooList(); + i = 0; + while (i < da->getLength()) { + while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { + ++i; + } + if (i < da->getLength()) { + for (j = i + 1; + j < da->getLength() && !Lexer::isSpace(da->getChar(j)); + ++j) ; + daToks->append(new GooString(da, i, j - i)); + i = j; + } + } + for (i = 2; i < daToks->getLength(); ++i) { + if (i >= 2 && !((GooString *)daToks->get(i))->cmp("Tf")) { + tfPos = i - 2; + } else if (i >= 6 && !((GooString *)daToks->get(i))->cmp("Tm")) { + tmPos = i - 6; + } + } + } else { + daToks = NULL; + } + + // force ZapfDingbats + if (forceZapfDingbats) { + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos); + if (tok->cmp("/ZaDb")) { + tok->clear(); + tok->append("/ZaDb"); + } + } + } + // get the font and font size + font = NULL; + fontSize = 0; + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos); + if (tok->getLength() >= 1 && tok->getChar(0) == '/') { + if (!resources || !(font = resources->lookupFont(tok->getCString() + 1))) { + if (forceZapfDingbats) { + // We are forcing ZaDb but the font does not exist + // so create a fake one + Ref r; // dummy Ref, it's not used at all in this codepath + r.num = -1; + r.gen = -1; + Dict *d = new Dict(xref); + font = new Gfx8BitFont(xref, "ZaDb", r, new GooString("ZapfDingbats"), fontType1, r, d); + delete d; + freeFont = gTrue; + addDingbatsResource = gTrue; + } else { + error(errSyntaxError, -1, "Unknown font in field's DA string"); + } + } + } else { + error(errSyntaxError, -1, "Invalid font name in 'Tf' operator in field's DA string"); + } + tok = (GooString *)daToks->get(tfPos + 1); + fontSize = gatof(tok->getCString()); + } else { + error(errSyntaxError, -1, "Missing 'Tf' operator in field's DA string"); + } + if (!font) { + if (daToks) { + deleteGooList(daToks, GooString); + } + return; + } + + // get the border width + borderWidth = border ? border->getWidth() : 0; + + // for a password field, replace all characters with asterisks + if (password) { + int len; + if (text->hasUnicodeMarker()) + len = (text->getLength() - 2) / 2; + else + len = text->getLength(); + + text = new GooString; + for (i = 0; i < len; ++i) + text->append('*'); + freeText = gTrue; + } + + convertedText = new GooString; + + // setup + if (txField) { + appearBuf->append("/Tx BMC\n"); + } + appearBuf->append("q\n"); + rot = appearCharacs ? appearCharacs->getRotation() : 0; + switch (rot) { + case 90: + appearBuf->appendf("0 1 -1 0 {0:.2f} 0 cm\n", rect->x2 - rect->x1); + dx = rect->y2 - rect->y1; + dy = rect->x2 - rect->x1; + break; + case 180: + appearBuf->appendf("-1 0 0 -1 {0:.2f} {1:.2f} cm\n", + rect->x2 - rect->x1, rect->y2 - rect->y1); + dx = rect->x2 - rect->y2; + dy = rect->y2 - rect->y1; + break; + case 270: + appearBuf->appendf("0 -1 1 0 0 {0:.2f} cm\n", rect->y2 - rect->y1); + dx = rect->y2 - rect->y1; + dy = rect->x2 - rect->x1; + break; + default: // assume rot == 0 + dx = rect->x2 - rect->x1; + dy = rect->y2 - rect->y1; + break; + } + appearBuf->append("BT\n"); + // multi-line text + if (multiline) { + // note: the comb flag is ignored in multiline mode + + wMax = dx - 2 * borderWidth - 4; + + // compute font autosize + if (fontSize == 0) { + for (fontSize = 20; fontSize > 1; --fontSize) { + y = dy - 3; + i = 0; + while (i < text->getLength()) { + layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL, + forceZapfDingbats); + y -= fontSize; + } + // approximate the descender for the last line + if (y >= 0.33 * fontSize) { + break; + } + } + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + // starting y coordinate + // (note: each line of text starts with a Td operator that moves + // down a line) + y = dy - 3; + + // set the font matrix + if (tmPos >= 0) { + tok = (GooString *)daToks->get(tmPos + 4); + tok->clear(); + tok->append('0'); + tok = (GooString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (i = 0; i < daToks->getLength(); ++i) { + appearBuf->append((GooString *)daToks->get(i))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 0 {0:.2f} Tm\n", y); + } + + // write a series of lines of text + i = 0; + xPrev = 0; + while (i < text->getLength()) { + layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL, + forceZapfDingbats); + w *= fontSize; + + // compute text start position + switch (quadding) { + case quaddingLeftJustified: + default: + x = borderWidth + 2; + break; + case quaddingCentered: + x = (dx - w) / 2; + break; + case quaddingRightJustified: + x = dx - borderWidth - 2 - w; + break; + } + + // draw the line + appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize); + writeString(convertedText, appearBuf); + appearBuf->append(" Tj\n"); + + // next line + xPrev = x; + } + + // single-line text + } else { + //~ replace newlines with spaces? - what does Acrobat do? + + // comb formatting + if (comb > 0) { + int charCount; + + // compute comb spacing + w = (dx - 2 * borderWidth) / comb; + + // compute font autosize + if (fontSize == 0) { + fontSize = dy - 2 * borderWidth; + if (w < fontSize) { + fontSize = w; + } + fontSize = floor(fontSize); + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + i = 0; + layoutText(text, convertedText, &i, font, NULL, 0.0, &charCount, + forceZapfDingbats); + if (charCount > comb) + charCount = comb; + + // compute starting text cell + switch (quadding) { + case quaddingLeftJustified: + default: + x = borderWidth; + break; + case quaddingCentered: + x = borderWidth + (comb - charCount) / 2 * w; + break; + case quaddingRightJustified: + x = borderWidth + (comb - charCount) * w; + break; + } + y = 0.5 * dy - 0.4 * fontSize; + + // set the font matrix + if (tmPos >= 0) { + tok = (GooString *)daToks->get(tmPos + 4); + tok->clear(); + tok->appendf("{0:.2f}", x); + tok = (GooString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (i = 0; i < daToks->getLength(); ++i) { + appearBuf->append((GooString *)daToks->get(i))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); + } + + // write the text string + char *s = convertedText->getCString(); + int len = convertedText->getLength(); + i = 0; + xPrev = w; // so that first character is placed properly + while (i < comb && len > 0) { + CharCode code; + Unicode *uAux; + int uLen, n; + double dx, dy, ox, oy; + + dx = 0.0; + n = font->getNextChar(s, len, &code, &uAux, &uLen, &dx, &dy, &ox, &oy); + dx *= fontSize; + + // center each character within its cell, by advancing the text + // position the appropriate amount relative to the start of the + // previous character + x = 0.5 * (w - dx); + appearBuf->appendf("{0:.2f} 0 Td\n", x - xPrev + w); + + GooString *charBuf = new GooString(s, n); + writeString(charBuf, appearBuf); + appearBuf->append(" Tj\n"); + delete charBuf; + + i++; + s += n; + len -= n; + xPrev = x; + } + + // regular (non-comb) formatting + } else { + i = 0; + layoutText(text, convertedText, &i, font, &w, 0.0, NULL, + forceZapfDingbats); + + // compute font autosize + if (fontSize == 0) { + fontSize = dy - 2 * borderWidth; + fontSize2 = (dx - 4 - 2 * borderWidth) / w; + if (fontSize2 < fontSize) { + fontSize = fontSize2; + } + fontSize = floor(fontSize); + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + // compute text start position + w *= fontSize; + switch (quadding) { + case quaddingLeftJustified: + default: + x = borderWidth + 2; + break; + case quaddingCentered: + x = (dx - w) / 2; + break; + case quaddingRightJustified: + x = dx - borderWidth - 2 - w; + break; + } + y = 0.5 * dy - 0.4 * fontSize; + + // set the font matrix + if (tmPos >= 0) { + tok = (GooString *)daToks->get(tmPos + 4); + tok->clear(); + tok->appendf("{0:.2f}", x); + tok = (GooString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (i = 0; i < daToks->getLength(); ++i) { + appearBuf->append((GooString *)daToks->get(i))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); + } + + // write the text string + writeString(convertedText, appearBuf); + appearBuf->append(" Tj\n"); + } + } + // cleanup + appearBuf->append("ET\n"); + appearBuf->append("Q\n"); + if (txField) { + appearBuf->append("EMC\n"); + } + if (daToks) { + deleteGooList(daToks, GooString); + } + if (freeText) { + delete text; + } + delete convertedText; + if (freeFont) { + font->decRefCnt(); + } +} + +// Draw the variable text or caption for a field. +void AnnotWidget::drawListBox(FormFieldChoice *fieldChoice, + GooString *da, GfxResources *resources, int quadding) { + GooList *daToks; + GooString *tok, *convertedText; + GfxFont *font; + double fontSize, fontSize2, borderWidth, x, y, w, wMax; + int tfPos, tmPos, i, j; + + //~ if there is no MK entry, this should use the existing content stream, + //~ and only replace the marked content portion of it + //~ (this is only relevant for Tx fields) + + // parse the default appearance string + tfPos = tmPos = -1; + if (da) { + daToks = new GooList(); + i = 0; + while (i < da->getLength()) { + while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { + ++i; + } + if (i < da->getLength()) { + for (j = i + 1; + j < da->getLength() && !Lexer::isSpace(da->getChar(j)); + ++j) ; + daToks->append(new GooString(da, i, j - i)); + i = j; + } + } + for (i = 2; i < daToks->getLength(); ++i) { + if (i >= 2 && !((GooString *)daToks->get(i))->cmp("Tf")) { + tfPos = i - 2; + } else if (i >= 6 && !((GooString *)daToks->get(i))->cmp("Tm")) { + tmPos = i - 6; + } + } + } else { + daToks = NULL; + } + + // get the font and font size + font = NULL; + fontSize = 0; + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos); + if (tok->getLength() >= 1 && tok->getChar(0) == '/') { + if (!resources || !(font = resources->lookupFont(tok->getCString() + 1))) { + error(errSyntaxError, -1, "Unknown font in field's DA string"); + } + } else { + error(errSyntaxError, -1, "Invalid font name in 'Tf' operator in field's DA string"); + } + tok = (GooString *)daToks->get(tfPos + 1); + fontSize = gatof(tok->getCString()); + } else { + error(errSyntaxError, -1, "Missing 'Tf' operator in field's DA string"); + } + if (!font) { + if (daToks) { + deleteGooList(daToks, GooString); + } + return; + } + + convertedText = new GooString; + + // get the border width + borderWidth = border ? border->getWidth() : 0; + + // compute font autosize + if (fontSize == 0) { + wMax = 0; + for (i = 0; i < fieldChoice->getNumChoices(); ++i) { + j = 0; + if (fieldChoice->getChoice(i) == NULL) { + error(errSyntaxError, -1, "Invalid annotation listbox"); + if (daToks) { + deleteGooList(daToks, GooString); + } + delete convertedText; + return; + } + layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse); + if (w > wMax) { + wMax = w; + } + } + fontSize = rect->y2 - rect->y1 - 2 * borderWidth; + fontSize2 = (rect->x2 - rect->x1 - 4 - 2 * borderWidth) / wMax; + if (fontSize2 < fontSize) { + fontSize = fontSize2; + } + fontSize = floor(fontSize); + if (tfPos >= 0) { + tok = (GooString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + // draw the text + y = rect->y2 - rect->y1 - 1.1 * fontSize; + for (i = fieldChoice->getTopIndex(); i < fieldChoice->getNumChoices(); ++i) { + // setup + appearBuf->append("q\n"); + + // draw the background if selected + if (fieldChoice->isSelected(i)) { + appearBuf->append("0 g f\n"); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re f\n", + borderWidth, + y - 0.2 * fontSize, + rect->x2 - rect->x1 - 2 * borderWidth, + 1.1 * fontSize); + } + + // setup + appearBuf->append("BT\n"); + + // compute text width and start position + j = 0; + layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse); + w *= fontSize; + switch (quadding) { + case quaddingLeftJustified: + default: + x = borderWidth + 2; + break; + case quaddingCentered: + x = (rect->x2 - rect->x1 - w) / 2; + break; + case quaddingRightJustified: + x = rect->x2 - rect->x1 - borderWidth - 2 - w; + break; + } + + // set the font matrix + if (tmPos >= 0) { + tok = (GooString *)daToks->get(tmPos + 4); + tok->clear(); + tok->appendf("{0:.2f}", x); + tok = (GooString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (j = 0; j < daToks->getLength(); ++j) { + appearBuf->append((GooString *)daToks->get(j))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); + } + + // change the text color if selected + if (fieldChoice->isSelected(i)) { + appearBuf->append("1 g\n"); + } + + // write the text string + writeString(convertedText, appearBuf); + appearBuf->append(" Tj\n"); + + // cleanup + appearBuf->append("ET\n"); + appearBuf->append("Q\n"); + + // next line + y -= 1.1 * fontSize; + } + + if (daToks) { + deleteGooList(daToks, GooString); + } + + delete convertedText; +} + +void AnnotWidget::drawBorder() { + int dashLength; + double *dash; + AnnotColor adjustedColor; + double w = border->getWidth(); + + AnnotColor *aColor = appearCharacs->getBorderColor(); + if (!aColor) + aColor = appearCharacs->getBackColor(); + if (!aColor) + return; + + double dx = rect->x2 - rect->x1; + double dy = rect->y2 - rect->y1; + + // radio buttons with no caption have a round border + GBool hasCaption = appearCharacs->getNormalCaption() != NULL; + if (field->getType() == formButton && + static_cast(field)->getButtonType() == formButtonRadio && !hasCaption) { + double r = 0.5 * (dx < dy ? dx : dy); + switch (border->getStyle()) { + case AnnotBorder::borderDashed: + appearBuf->append("["); + dashLength = border->getDashLength(); + dash = border->getDash(); + for (int i = 0; i < dashLength; ++i) { + appearBuf->appendf(" {0:.2f}", dash[i]); + } + appearBuf->append("] 0 d\n"); + // fall through to the solid case + case AnnotBorder::borderSolid: + case AnnotBorder::borderUnderlined: + appearBuf->appendf("{0:.2f} w\n", w); + setColor(aColor, gFalse); + drawCircle(0.5 * dx, 0.5 * dy, r - 0.5 * w, gFalse); + break; + case AnnotBorder::borderBeveled: + case AnnotBorder::borderInset: + appearBuf->appendf("{0:.2f} w\n", 0.5 * w); + setColor(aColor, gFalse); + drawCircle(0.5 * dx, 0.5 * dy, r - 0.25 * w, gFalse); + adjustedColor = AnnotColor(*aColor); + adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1); + setColor(&adjustedColor, gFalse); + drawCircleTopLeft(0.5 * dx, 0.5 * dy, r - 0.75 * w); + adjustedColor = AnnotColor(*aColor); + adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1); + setColor(&adjustedColor, gFalse); + drawCircleBottomRight(0.5 * dx, 0.5 * dy, r - 0.75 * w); + break; + } + } else { + switch (border->getStyle()) { + case AnnotBorder::borderDashed: + appearBuf->append("["); + dashLength = border->getDashLength(); + dash = border->getDash(); + for (int i = 0; i < dashLength; ++i) { + appearBuf->appendf(" {0:.2f}", dash[i]); + } + appearBuf->append("] 0 d\n"); + // fall through to the solid case + case AnnotBorder::borderSolid: + appearBuf->appendf("{0:.2f} w\n", w); + setColor(aColor, gFalse); + appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re s\n", + 0.5 * w, dx - w, dy - w); + break; + case AnnotBorder::borderBeveled: + case AnnotBorder::borderInset: + adjustedColor = AnnotColor(*aColor); + adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? 1 : -1); + setColor(&adjustedColor, gTrue); + appearBuf->append("0 0 m\n"); + appearBuf->appendf("0 {0:.2f} l\n", dy); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", w, dy - w); + appearBuf->appendf("{0:.2f} {0:.2f} l\n", w); + appearBuf->append("f\n"); + adjustedColor = AnnotColor(*aColor); + adjustedColor.adjustColor(border->getStyle() == AnnotBorder::borderBeveled ? -1 : 1); + setColor(&adjustedColor, gTrue); + appearBuf->append("0 0 m\n"); + appearBuf->appendf("{0:.2f} 0 l\n", dx); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, w); + appearBuf->appendf("{0:.2f} {0:.2f} l\n", w); + appearBuf->append("f\n"); + break; + case AnnotBorder::borderUnderlined: + appearBuf->appendf("{0:.2f} w\n", w); + setColor(aColor, gFalse); + appearBuf->appendf("0 0 m {0:.2f} 0 l s\n", dx); + break; + } + + // clip to the inside of the border + appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", + w, dx - 2 * w, dy - 2 * w); + } +} + +void AnnotWidget::drawFormFieldButton(GfxResources *resources, GooString *da) { + GooString *caption = NULL; + if (appearCharacs) + caption = appearCharacs->getNormalCaption(); + + switch (static_cast(field)->getButtonType()) { + case formButtonRadio: { + //~ Acrobat doesn't draw a caption if there is no AP dict (?) + if (appearState && appearState->cmp("Off") != 0) { + if (caption) { + drawText(caption, da, resources, gFalse, 0, fieldQuadCenter, + gFalse, gTrue); + } else if (appearCharacs) { + AnnotColor *aColor = appearCharacs->getBorderColor(); + if (aColor) { + double dx = rect->x2 - rect->x1; + double dy = rect->y2 - rect->y1; + setColor(aColor, gTrue); + drawCircle(0.5 * dx, 0.5 * dy, 0.2 * (dx < dy ? dx : dy), gTrue); + } + } + } + } + break; + case formButtonPush: + if (caption) + drawText(caption, da, resources, gFalse, 0, fieldQuadCenter, gFalse, gFalse); + break; + case formButtonCheck: + if (appearState && appearState->cmp("Off") != 0) { + if (!caption) { + GooString checkMark("3"); + drawText(&checkMark, da, resources, gFalse, 0, fieldQuadCenter, gFalse, gTrue); + } else { + drawText(caption, da, resources, gFalse, 0, fieldQuadCenter, gFalse, gTrue); + } + } + break; + } +} + +void AnnotWidget::drawFormFieldText(GfxResources *resources, GooString *da) { + VariableTextQuadding quadding; + GooString *contents; + FormFieldText *fieldText = static_cast(field); + + contents = fieldText->getContent(); + if (contents) { + quadding = field->hasTextQuadding() ? field->getTextQuadding() : form->getTextQuadding(); + + int comb = 0; + if (fieldText->isComb()) + comb = fieldText->getMaxLen(); + + drawText(contents, da, resources, + fieldText->isMultiline(), comb, quadding, gTrue, gFalse, fieldText->isPassword()); + } +} + +void AnnotWidget::drawFormFieldChoice(GfxResources *resources, GooString *da) { + GooString *selected; + VariableTextQuadding quadding; + FormFieldChoice *fieldChoice = static_cast(field); + + quadding = field->hasTextQuadding() ? field->getTextQuadding() : form->getTextQuadding(); + + if (fieldChoice->isCombo()) { + selected = fieldChoice->getSelectedChoice(); + if (selected) { + drawText(selected, da, resources, gFalse, 0, quadding, gTrue, gFalse); + //~ Acrobat draws a popup icon on the right side + } + // list box + } else { + drawListBox(fieldChoice, da, resources, quadding); + } +} + +void AnnotWidget::generateFieldAppearance() { + Object appearDict, obj1, obj2; + GfxResources *resources; + MemStream *appearStream; + GooString *da; + + appearBuf = new GooString (); + + // draw the background + if (appearCharacs) { + AnnotColor *aColor = appearCharacs->getBackColor(); + if (aColor) { + setColor(aColor, gTrue); + appearBuf->appendf("0 0 {0:.2f} {1:.2f} re f\n", + rect->x2 - rect->x1, rect->y2 - rect->y1); + } + } + + // draw the border + if (appearCharacs && border && border->getWidth() > 0) + drawBorder(); + + da = field->getDefaultAppearance(); + if (!da) + da = form->getDefaultAppearance(); + + resources = form->getDefaultResources(); + + // draw the field contents + switch (field->getType()) { + case formButton: + drawFormFieldButton(resources, da); + break; + case formText: + drawFormFieldText(resources, da); + break; + case formChoice: + drawFormFieldChoice(resources, da); + break; + case formSignature: + //~unimp + break; + case formUndef: + default: + error(errSyntaxError, -1, "Unknown field type"); + } + + // build the appearance stream dictionary + appearDict.initDict(xref); + appearDict.dictAdd(copyString("Length"), + obj1.initInt(appearBuf->getLength())); + appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form")); + obj1.initArray(xref); + obj1.arrayAdd(obj2.initReal(0)); + obj1.arrayAdd(obj2.initReal(0)); + obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1)); + obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1)); + appearDict.dictAdd(copyString("BBox"), &obj1); + + // set the resource dictionary + Object *resDict = form->getDefaultResourcesObj(); + if (resDict->isDict()) { + appearDict.dictAdd(copyString("Resources"), resDict->copy(&obj1)); + } + + // build the appearance stream + appearStream = new MemStream(strdup(appearBuf->getCString()), 0, + appearBuf->getLength(), &appearDict); + appearance.free(); + appearance.initStream(appearStream); + delete appearBuf; + + appearStream->setNeedFree(gTrue); +} + + +void AnnotWidget::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + addDingbatsResource = gFalse; + + // Only construct the appearance stream when + // - annot doesn't have an AP or + // - it's a field containing text (text and choices) and + // - NeedAppearances is true or + // - widget has been modified or + if (field) { + if (appearance.isNull() || (form && form->getNeedAppearances()) || + ((field->getType() == formText || field->getType() == formChoice) && + field->isModified())) + generateFieldAppearance(); + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + if (addDingbatsResource) { + // We are forcing ZaDb but the font does not exist + // so create a fake one + Object baseFontObj, subtypeObj; + baseFontObj.initName("ZapfDingbats"); + subtypeObj.initName("Type1"); + + Object fontDictObj; + Dict *fontDict = new Dict(xref); + fontDict->decRef(); + fontDict->add(copyString("BaseFont"), &baseFontObj); + fontDict->add(copyString("Subtype"), &subtypeObj); + fontDictObj.initDict(fontDict); + + Object fontsDictObj; + Dict *fontsDict = new Dict(xref); + fontsDict->decRef(); + fontsDict->add(copyString("ZaDb"), &fontDictObj); + fontsDictObj.initDict(fontsDict); + + Dict *dict = new Dict(xref); + dict->add(copyString("Font"), &fontsDictObj); + gfx->pushResources(dict); + delete dict; + } + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + if (addDingbatsResource) { + gfx->popResources(); + } + obj.free(); +} + + +//------------------------------------------------------------------------ +// AnnotMovie +//------------------------------------------------------------------------ +AnnotMovie::AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA) : + Annot(docA, rect) { + Object obj1; + + type = typeMovie; + annotObj.dictSet ("Subtype", obj1.initName ("Movie")); + + movie = movieA->copy(); + // TODO: create movie dict from movieA + + initialize(docA, annotObj.getDict()); +} + +AnnotMovie::AnnotMovie(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + type = typeMovie; + initialize(docA, dict); +} + +AnnotMovie::~AnnotMovie() { + if (title) + delete title; + delete movie; +} + +void AnnotMovie::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("T", &obj1)->isString()) { + title = obj1.getString()->copy(); + } else { + title = NULL; + } + obj1.free(); + + Object movieDict; + if (dict->lookup("Movie", &movieDict)->isDict()) { + Object obj2; + dict->lookup("A", &obj2); + if (obj2.isDict()) + movie = new Movie (&movieDict, &obj2); + else + movie = new Movie (&movieDict); + if (!movie->isOk()) { + delete movie; + movie = NULL; + ok = gFalse; + } + obj2.free(); + } else { + error(errSyntaxError, -1, "Bad Annot Movie"); + movie = NULL; + ok = gFalse; + } + movieDict.free(); +} + +void AnnotMovie::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + if (appearance.isNull() && movie->getShowPoster()) { + int width, height; + Object poster; + movie->getPoster(&poster); + movie->getAspect(&width, &height); + + if (width != -1 && height != -1 && !poster.isNone()) { + MemStream *mStream; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + appearBuf->appendf ("{0:d} 0 0 {1:d} 0 0 cm\n", width, height); + appearBuf->append ("/MImg Do\n"); + appearBuf->append ("Q\n"); + + Object imgDict; + imgDict.initDict(xref); + imgDict.dictSet ("MImg", &poster); + + Object resDict; + resDict.initDict(xref); + resDict.dictSet ("XObject", &imgDict); + + Object formDict, obj1, obj2; + formDict.initDict(xref); + formDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); + formDict.dictSet("Subtype", obj1.initName("Form")); + formDict.dictSet("Name", obj1.initName("FRM")); + obj1.initArray(xref); + obj1.arrayAdd(obj2.initInt(0)); + obj1.arrayAdd(obj2.initInt(0)); + obj1.arrayAdd(obj2.initInt(width)); + obj1.arrayAdd(obj2.initInt(height)); + formDict.dictSet("BBox", &obj1); + obj1.initArray(xref); + obj1.arrayAdd(obj2.initInt(1)); + obj1.arrayAdd(obj2.initInt(0)); + obj1.arrayAdd(obj2.initInt(0)); + obj1.arrayAdd(obj2.initInt(1)); + obj1.arrayAdd(obj2.initInt(-width / 2)); + obj1.arrayAdd(obj2.initInt(-height / 2)); + formDict.dictSet("Matrix", &obj1); + formDict.dictSet("Resources", &resDict); + + Object aStream; + mStream = new MemStream(copyString(appearBuf->getCString()), 0, + appearBuf->getLength(), &formDict); + mStream->setNeedFree(gTrue); + aStream.initStream(mStream); + delete appearBuf; + + Object objDict; + objDict.initDict(xref); + objDict.dictSet ("FRM", &aStream); + + resDict.initDict(xref); + resDict.dictSet ("XObject", &objDict); + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height); + appearBuf->append ("q\n"); + appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height); + appearBuf->appendf ("1 0 0 1 {0:d} {1:d} cm\n", width / 2, height / 2); + appearBuf->append ("/FRM Do\n"); + appearBuf->append ("Q\n"); + appearBuf->append ("Q\n"); + + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = width; + bbox[3] = height; + createForm(bbox, gFalse, &resDict, &appearance); + delete appearBuf; + } + poster.free(); + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotScreen +//------------------------------------------------------------------------ +AnnotScreen::AnnotScreen(PDFDoc *docA, PDFRectangle *rect) : + Annot(docA, rect) { + Object obj1; + + type = typeScreen; + + annotObj.dictSet ("Subtype", obj1.initName ("Screen")); + initialize(docA, annotObj.getDict()); +} + +AnnotScreen::AnnotScreen(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + type = typeScreen; + initialize(docA, dict); +} + +AnnotScreen::~AnnotScreen() { + if (title) + delete title; + if (appearCharacs) + delete appearCharacs; + if (action) + delete action; + + additionAction.free(); +} + +void AnnotScreen::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + title = NULL; + if (dict->lookup("T", &obj1)->isString()) { + title = obj1.getString()->copy(); + } + obj1.free(); + + action = NULL; + if (dict->lookup("A", &obj1)->isDict()) { + action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()); + if (action->getKind() == actionRendition && page == 0) { + error (errSyntaxError, -1, "Invalid Rendition action: associated screen annotation without P"); + delete action; + action = NULL; + ok = gFalse; + } + } + obj1.free(); + + dict->lookup("AA", &additionAction); + + appearCharacs = NULL; + if(dict->lookup("MK", &obj1)->isDict()) { + appearCharacs = new AnnotAppearanceCharacs(obj1.getDict()); + } + obj1.free(); + +} + +//------------------------------------------------------------------------ +// AnnotStamp +//------------------------------------------------------------------------ +AnnotStamp::AnnotStamp(PDFDoc *docA, PDFRectangle *rect) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeStamp; + annotObj.dictSet ("Subtype", obj1.initName ("Stamp")); + initialize(docA, annotObj.getDict()); +} + +AnnotStamp::AnnotStamp(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeStamp; + initialize(docA, dict); +} + +AnnotStamp::~AnnotStamp() { + delete icon; +} + +void AnnotStamp::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("Name", &obj1)->isName()) { + icon = new GooString(obj1.getName()); + } else { + icon = new GooString("Draft"); + } + obj1.free(); + +} + +void AnnotStamp::setIcon(GooString *new_icon) { + delete icon; + + if (new_icon) { + icon = new GooString (new_icon); + } else { + icon = new GooString(); + } + + Object obj1; + obj1.initName (icon->getCString()); + update("Name", &obj1); +} + +//------------------------------------------------------------------------ +// AnnotGeometry +//------------------------------------------------------------------------ +AnnotGeometry::AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType) : + AnnotMarkup(docA, rect) { + Object obj1; + + switch (subType) { + case typeSquare: + annotObj.dictSet ("Subtype", obj1.initName ("Square")); + break; + case typeCircle: + annotObj.dictSet ("Subtype", obj1.initName ("Circle")); + break; + default: + assert (0 && "Invalid subtype for AnnotGeometry\n"); + } + + initialize(docA, annotObj.getDict()); +} + +AnnotGeometry::AnnotGeometry(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + // the real type will be read in initialize() + type = typeSquare; + initialize(docA, dict); +} + +AnnotGeometry::~AnnotGeometry() { + delete interiorColor; + delete borderEffect; + delete geometryRect; +} + +void AnnotGeometry::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("Subtype", &obj1)->isName()) { + GooString typeName(obj1.getName()); + if (!typeName.cmp("Square")) { + type = typeSquare; + } else if (!typeName.cmp("Circle")) { + type = typeCircle; + } + } + obj1.free(); + + if (dict->lookup("IC", &obj1)->isArray()) { + interiorColor = new AnnotColor(obj1.getArray()); + } else { + interiorColor = NULL; + } + obj1.free(); + + if (dict->lookup("BE", &obj1)->isDict()) { + borderEffect = new AnnotBorderEffect(obj1.getDict()); + } else { + borderEffect = NULL; + } + obj1.free(); + + geometryRect = NULL; + if (dict->lookup("RD", &obj1)->isArray()) { + geometryRect = parseDiffRectangle(obj1.getArray(), rect); + } + obj1.free(); + +} + +void AnnotGeometry::setType(AnnotSubtype new_type) { + Object obj1; + + switch (new_type) { + case typeSquare: + obj1.initName("Square"); + break; + case typeCircle: + obj1.initName("Circle"); + break; + default: + assert(!"Invalid subtype"); + } + + type = new_type; + update("Subtype", &obj1); +} + +void AnnotGeometry::setInteriorColor(AnnotColor *new_color) { + delete interiorColor; + + if (new_color) { + Object obj1; + new_color->writeToObject(xref, &obj1); + update ("IC", &obj1); + interiorColor = new_color; + } else { + interiorColor = NULL; + } +} + +void AnnotGeometry::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + if (color) + setColor(color, gFalse); + + if (border) { + int i, dashLength; + double *dash; + double borderWidth = border->getWidth(); + + switch (border->getStyle()) { + case AnnotBorder::borderDashed: + appearBuf->append("["); + dashLength = border->getDashLength(); + dash = border->getDash(); + for (i = 0; i < dashLength; ++i) + appearBuf->appendf(" {0:.2f}", dash[i]); + appearBuf->append(" ] 0 d\n"); + break; + default: + appearBuf->append("[] 0 d\n"); + break; + } + appearBuf->appendf("{0:.2f} w\n", borderWidth); + + if (interiorColor) + setColor(interiorColor, gTrue); + + if (type == typeSquare) { + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re\n", + borderWidth / 2.0, borderWidth / 2.0, + (rect->x2 - rect->x1) - borderWidth, + (rect->y2 - rect->y1) - borderWidth); + } else { + double width, height; + double b; + double x1, y1, x2, y2, x3, y3; + + width = rect->x2 - rect->x1; + height = rect->y2 - rect->y1; + b = borderWidth / 2.0; + + x1 = b; + y1 = height / 2.0; + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x1, y1); + + y1 += height / 4.0; + x2 = width / 4.0; + y2 = height - b; + x3 = width / 2.0; + y3 = y2; + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + x1, y1, x2, y2, x3, y3); + x2 = width - b; + y2 = y1; + x1 = x3 + (width / 4.0); + y1 = y3; + x3 = x2; + y3 = height / 2.0; + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + x1, y1, x2, y2, x3, y3); + + x2 = x1; + y2 = b; + x1 = x3; + y1 = height / 4.0; + x3 = width / 2.0; + y3 = b; + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + x1, y1, x2, y2, x3, y3); + + x2 = b; + y2 = y1; + x1 = width / 4.0; + y1 = b; + x3 = b; + y3 = height / 2.0; + appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + x1, y1, x2, y2, x3, y3); + + } + + if (interiorColor && interiorColor->getSpace() != AnnotColor::colorTransparent) + appearBuf->append ("b\n"); + else + appearBuf->append ("S\n"); + } + appearBuf->append ("Q\n"); + + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = rect->x2 - rect->x1; + bbox[3] = rect->y2 - rect->y1; + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream; + + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + Object resDict; + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotPolygon +//------------------------------------------------------------------------ +AnnotPolygon::AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType, AnnotPath *path) : + AnnotMarkup(docA, rect) { + Object obj1; + + switch (subType) { + case typePolygon: + annotObj.dictSet ("Subtype", obj1.initName ("Polygon")); + break; + case typePolyLine: + annotObj.dictSet ("Subtype", obj1.initName ("PolyLine")); + break; + default: + assert (0 && "Invalid subtype for AnnotGeometry\n"); + } + + Object obj2; + obj2.initArray (doc->getXRef()); + + for (int i = 0; i < path->getCoordsLength(); ++i) { + Object obj3; + + obj2.arrayAdd (obj3.initReal (path->getX(i))); + obj2.arrayAdd (obj3.initReal (path->getY(i))); + } + + annotObj.dictSet ("Vertices", &obj2); + + initialize(docA, annotObj.getDict()); +} + +AnnotPolygon::AnnotPolygon(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + // the real type will be read in initialize() + type = typePolygon; + initialize(docA, dict); +} + +AnnotPolygon::~AnnotPolygon() { + delete vertices; + + if (interiorColor) + delete interiorColor; + + if (borderEffect) + delete borderEffect; +} + +void AnnotPolygon::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("Subtype", &obj1)->isName()) { + GooString typeName(obj1.getName()); + if (!typeName.cmp("Polygon")) { + type = typePolygon; + } else if (!typeName.cmp("PolyLine")) { + type = typePolyLine; + } + } + obj1.free(); + + if (dict->lookup("Vertices", &obj1)->isArray()) { + vertices = new AnnotPath(obj1.getArray()); + } else { + vertices = new AnnotPath(); + error(errSyntaxError, -1, "Bad Annot Polygon Vertices"); + ok = gFalse; + } + obj1.free(); + + if (dict->lookup("LE", &obj1)->isArray() && obj1.arrayGetLength() == 2) { + Object obj2; + + if(obj1.arrayGet(0, &obj2)->isString()) + startStyle = parseAnnotLineEndingStyle(obj2.getString()); + else + startStyle = annotLineEndingNone; + obj2.free(); + + if(obj1.arrayGet(1, &obj2)->isString()) + endStyle = parseAnnotLineEndingStyle(obj2.getString()); + else + endStyle = annotLineEndingNone; + obj2.free(); + + } else { + startStyle = endStyle = annotLineEndingNone; + } + obj1.free(); + + if (dict->lookup("IC", &obj1)->isArray()) { + interiorColor = new AnnotColor(obj1.getArray()); + } else { + interiorColor = NULL; + } + obj1.free(); + + if (dict->lookup("BE", &obj1)->isDict()) { + borderEffect = new AnnotBorderEffect(obj1.getDict()); + } else { + borderEffect = NULL; + } + obj1.free(); + + if (dict->lookup("IT", &obj1)->isName()) { + const char *intentName = obj1.getName(); + + if(!strcmp(intentName, "PolygonCloud")) { + intent = polygonCloud; + } else if(!strcmp(intentName, "PolyLineDimension")) { + intent = polylineDimension; + } else { + intent = polygonDimension; + } + } else { + intent = polygonCloud; + } + obj1.free(); +} + +void AnnotPolygon::setType(AnnotSubtype new_type) { + Object obj1; + + switch (new_type) { + case typePolygon: + obj1.initName("Polygon"); + break; + case typePolyLine: + obj1.initName("PolyLine"); + break; + default: + assert(!"Invalid subtype"); + } + + type = new_type; + update("Subtype", &obj1); +} + +void AnnotPolygon::setVertices(AnnotPath *path) { + Object obj1, obj2; + delete vertices; + + obj1.initArray(xref); + + for (int i = 0; i < path->getCoordsLength(); i++) { + obj1.arrayAdd (obj2.initReal (path->getX(i))); + obj1.arrayAdd (obj2.initReal (path->getY(i))); + } + + vertices = new AnnotPath(obj1.getArray()); + + update("Vertices", &obj1); +} + +void AnnotPolygon::setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end) { + Object obj1, obj2; + + startStyle = start; + endStyle = end; + + obj1.initArray(xref); + obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( startStyle )) ); + obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( endStyle )) ); + + update("LE", &obj1); +} + +void AnnotPolygon::setInteriorColor(AnnotColor *new_color) { + delete interiorColor; + + if (new_color) { + Object obj1; + new_color->writeToObject(xref, &obj1); + update ("IC", &obj1); + interiorColor = new_color; + } else { + interiorColor = NULL; + } +} + +void AnnotPolygon::setIntent(AnnotPolygonIntent new_intent) { + Object obj1; + + intent = new_intent; + if (new_intent == polygonCloud) + obj1.initName("PolygonCloud"); + else if (new_intent == polylineDimension) + obj1.initName("PolyLineDimension"); + else // polygonDimension + obj1.initName("PolygonDimension"); + update ("IT", &obj1); +} + +void AnnotPolygon::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + appearBBox = new AnnotAppearanceBBox(rect); + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + + if (color) { + setColor(color, gFalse); + } + + if (border) { + int i, dashLength; + double *dash; + + switch (border->getStyle()) { + case AnnotBorder::borderDashed: + appearBuf->append("["); + dashLength = border->getDashLength(); + dash = border->getDash(); + for (i = 0; i < dashLength; ++i) + appearBuf->appendf(" {0:.2f}", dash[i]); + appearBuf->append(" ] 0 d\n"); + break; + default: + appearBuf->append("[] 0 d\n"); + break; + } + appearBuf->appendf("{0:.2f} w\n", border->getWidth()); + appearBBox->setBorderWidth(border->getWidth()); + } + + if (interiorColor) { + setColor(interiorColor, gTrue); + } + + if (vertices->getCoordsLength() != 0) { + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", vertices->getX(0) - rect->x1, vertices->getY(0) - rect->y1); + appearBBox->extendTo (vertices->getX(0) - rect->x1, vertices->getY(0) - rect->y1); + + for (int i = 1; i < vertices->getCoordsLength(); ++i) { + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", vertices->getX(i) - rect->x1, vertices->getY(i) - rect->y1); + appearBBox->extendTo (vertices->getX(i) - rect->x1, vertices->getY(i) - rect->y1); + } + + if (type == typePolygon) { + if (interiorColor && interiorColor->getSpace() != AnnotColor::colorTransparent) { + appearBuf->append ("b\n"); + } else { + appearBuf->append ("s\n"); + } + } else { + appearBuf->append ("S\n"); + } + } + + appearBuf->append ("Q\n"); + + double bbox[4]; + appearBBox->getBBoxRect(bbox); + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; + + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + } + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotCaret +//------------------------------------------------------------------------ +AnnotCaret::AnnotCaret(PDFDoc *docA, PDFRectangle *rect) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeCaret; + + annotObj.dictSet ("Subtype", obj1.initName ("Caret")); + initialize(docA, annotObj.getDict()); +} + +AnnotCaret::AnnotCaret(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeCaret; + initialize(docA, dict); +} + +AnnotCaret::~AnnotCaret() { + delete caretRect; +} + +void AnnotCaret::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + symbol = symbolNone; + if (dict->lookup("Sy", &obj1)->isName()) { + GooString typeName(obj1.getName()); + if (!typeName.cmp("P")) { + symbol = symbolP; + } else if (!typeName.cmp("None")) { + symbol = symbolNone; + } + } + obj1.free(); + + if (dict->lookup("RD", &obj1)->isArray()) { + caretRect = parseDiffRectangle(obj1.getArray(), rect); + } else { + caretRect = NULL; + } + obj1.free(); + +} + +void AnnotCaret::setSymbol(AnnotCaretSymbol new_symbol) { + Object obj1; + obj1.initName( new_symbol == symbolP ? "P" : "None" ); + symbol = new_symbol; + update("Sy", &obj1); +} + +//------------------------------------------------------------------------ +// AnnotInk +//------------------------------------------------------------------------ +AnnotInk::AnnotInk(PDFDoc *docA, PDFRectangle *rect, AnnotPath **paths, int n_paths) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeInk; + + annotObj.dictSet ("Subtype", obj1.initName ("Ink")); + + Object obj2; + obj2.initArray (doc->getXRef()); + writeInkList(paths, n_paths, obj2.getArray()); + + annotObj.dictSet ("InkList", &obj2); + + initialize(docA, annotObj.getDict()); +} + +AnnotInk::AnnotInk(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeInk; + initialize(docA, dict); +} + +AnnotInk::~AnnotInk() { + freeInkList(); +} + +void AnnotInk::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("InkList", &obj1)->isArray()) { + parseInkList(obj1.getArray()); + } else { + inkListLength = 0; + inkList = NULL; + error(errSyntaxError, -1, "Bad Annot Ink List"); + ok = gFalse; + } + obj1.free(); +} + +void AnnotInk::writeInkList(AnnotPath **paths, int n_paths, Array *dest_array) { + Object obj1, obj2; + for (int i = 0; i < n_paths; ++i) { + AnnotPath *path = paths[i]; + obj1.initArray (xref); + for (int j = 0; j < path->getCoordsLength(); ++j) { + obj1.arrayAdd (obj2.initReal (path->getX(j))); + obj1.arrayAdd (obj2.initReal (path->getY(j))); + } + dest_array->add (&obj1); + } +} + +void AnnotInk::parseInkList(Array *array) { + inkListLength = array->getLength(); + inkList = (AnnotPath **) gmallocn ((inkListLength), sizeof(AnnotPath *)); + memset(inkList, 0, inkListLength * sizeof(AnnotPath *)); + for (int i = 0; i < inkListLength; i++) { + Object obj2; + if (array->get(i, &obj2)->isArray()) + inkList[i] = new AnnotPath(obj2.getArray()); + obj2.free(); + } +} + +void AnnotInk::freeInkList() { + if (inkList) { + for (int i = 0; i < inkListLength; ++i) + delete inkList[i]; + gfree(inkList); + } +} + +void AnnotInk::setInkList(AnnotPath **paths, int n_paths) { + Object obj1; + + freeInkList(); + + obj1.initArray (xref); + writeInkList(paths, n_paths, obj1.getArray()); + + parseInkList(obj1.getArray()); + annotObj.dictSet ("InkList", &obj1); +} + +void AnnotInk::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + appearBBox = new AnnotAppearanceBBox(rect); + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + + if (color) { + setColor(color, gFalse); + } + + if (border) { + appearBuf->appendf("{0:.2f} w\n", border->getWidth()); + appearBBox->setBorderWidth(border->getWidth()); + } + + for (int i = 0; i < inkListLength; ++i) { + const AnnotPath * path = inkList[i]; + if (path->getCoordsLength() != 0) { + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", path->getX(0) - rect->x1, path->getY(0) - rect->y1); + appearBBox->extendTo (path->getX(0) - rect->x1, path->getY(0) - rect->y1); + + for (int j = 1; j < path->getCoordsLength(); ++j) { + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", path->getX(j) - rect->x1, path->getY(j) - rect->y1); + appearBBox->extendTo (path->getX(j) - rect->x1, path->getY(j) - rect->y1); + } + + appearBuf->append ("S\n"); + } + } + + appearBuf->append ("Q\n"); + + double bbox[4]; + appearBBox->getBBoxRect(bbox); + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; + + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2); + } + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotFileAttachment +//------------------------------------------------------------------------ +AnnotFileAttachment::AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeFileAttachment; + + annotObj.dictSet ("Subtype", obj1.initName ("FileAttachment")); + + Object obj2; + obj2.initString(filename->copy()); + annotObj.dictSet ("FS", &obj2); + + initialize(docA, annotObj.getDict()); +} + +AnnotFileAttachment::AnnotFileAttachment(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeFileAttachment; + initialize(docA, dict); +} + +AnnotFileAttachment::~AnnotFileAttachment() { + file.free(); + + if (name) + delete name; +} + +void AnnotFileAttachment::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("FS", &obj1)->isDict() || dict->lookup("FS", &obj1)->isString()) { + obj1.copy(&file); + } else { + error(errSyntaxError, -1, "Bad Annot File Attachment"); + ok = gFalse; + } + obj1.free(); + + if (dict->lookup("Name", &obj1)->isName()) { + name = new GooString(obj1.getName()); + } else { + name = new GooString("PushPin"); + } + obj1.free(); +} + +#define ANNOT_FILE_ATTACHMENT_AP_PUSHPIN \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 5 4 m 6 5 l S\n" \ + "2 w\n" \ + "11 14 m 9 12 l 6 12 l 13 5 l 13 8 l 15 10 l 18 11 l 20 11 l 12 19 l 12\n" \ + "17 l 11 14 l h\n" \ + "11 14 m S\n" \ + "3 w\n" \ + "6 5 m 9 8 l S\n" \ + "0.729412 0.741176 0.713725 RG 2 w\n" \ + "5 5 m 6 6 l S\n" \ + "2 w\n" \ + "11 15 m 9 13 l 6 13 l 13 6 l 13 9 l 15 11 l 18 12 l 20 12 l 12 20 l 12\n" \ + "18 l 11 15 l h\n" \ + "11 15 m S\n" \ + "3 w\n" \ + "6 6 m 9 9 l S\n" + +#define ANNOT_FILE_ATTACHMENT_AP_PAPERCLIP \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 16.645 12.035 m 12.418 7.707 l 10.902 6.559 6.402 11.203 8.09 12.562 c\n" \ + "14.133 18.578 l 14.949 19.387 16.867 19.184 17.539 18.465 c 20.551\n" \ + "15.23 l 21.191 14.66 21.336 12.887 20.426 12.102 c 13.18 4.824 l 12.18\n" \ + "3.82 6.25 2.566 4.324 4.461 c 3 6.395 3.383 11.438 4.711 12.801 c 9.648\n" \ + "17.887 l S\n" \ + "0.729412 0.741176 0.713725 RG 16.645 13.035 m 12.418 8.707 l\n" \ + "10.902 7.559 6.402 12.203 8.09 13.562 c\n" \ + "14.133 19.578 l 14.949 20.387 16.867 20.184 17.539 19.465 c 20.551\n" \ + "16.23 l 21.191 15.66 21.336 13.887 20.426 13.102 c 13.18 5.824 l 12.18\n" \ + "4.82 6.25 3.566 4.324 5.461 c 3 7.395 3.383 12.438 4.711 13.801 c 9.648\n" \ + "18.887 l S\n" + +#define ANNOT_FILE_ATTACHMENT_AP_GRAPH \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 1 w\n" \ + "1 J\n" \ + "0 j\n" \ + "[] 0.0 d\n" \ + "4 M 18.5 15.5 m 18.5 13.086 l 16.086 15.5 l 18.5 15.5 l h\n" \ + "18.5 15.5 m S\n" \ + "7 7 m 10 11 l 13 9 l 18 15 l S\n" \ + "0.729412 0.741176 0.713725 RG 7 8 m 10 12 l 13 10 l 18 16 l S\n" \ + "18.5 16.5 m 18.5 14.086 l 16.086 16.5 l 18.5 16.5 l h\n" \ + "18.5 16.5 m S\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 j\n" \ + "3 19 m 3 3 l 21 3 l S\n" \ + "0.729412 0.741176 0.713725 RG 3 20 m 3 4 l 21 4 l S\n" + +#define ANNOT_FILE_ATTACHMENT_AP_TAG \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 0.999781 w\n" \ + "1 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M q 1 0 0 -1 0 24 cm\n" \ + "8.492 8.707 m 8.492 9.535 7.82 10.207 6.992 10.207 c 6.164 10.207 5.492\n" \ + "9.535 5.492 8.707 c 5.492 7.879 6.164 7.207 6.992 7.207 c 7.82 7.207\n" \ + "8.492 7.879 8.492 8.707 c h\n" \ + "8.492 8.707 m S Q\n" \ + "2 w\n" \ + "20.078 11.414 m 20.891 10.602 20.785 9.293 20.078 8.586 c 14.422 2.93 l\n" \ + "13.715 2.223 12.301 2.223 11.594 2.93 c 3.816 10.707 l 3.109 11.414\n" \ + "2.402 17.781 3.816 19.195 c 5.23 20.609 11.594 19.902 12.301 19.195 c\n" \ + "20.078 11.414 l h\n" \ + "20.078 11.414 m S\n" \ + "0.729412 0.741176 0.713725 RG 20.078 12.414 m\n" \ + "20.891 11.605 20.785 10.293 20.078 9.586 c 14.422 3.93 l\n" \ + "13.715 3.223 12.301 3.223 11.594 3.93 c 3.816 11.707 l 3.109 12.414\n" \ + "2.402 18.781 3.816 20.195 c 5.23 21.609 11.594 20.902 12.301 20.195 c\n" \ + "20.078 12.414 l h\n" \ + "20.078 12.414 m S\n" \ + "0.533333 0.541176 0.521569 RG 1 w\n" \ + "0 j\n" \ + "11.949 13.184 m 16.191 8.941 l S\n" \ + "0.729412 0.741176 0.713725 RG 11.949 14.184 m 16.191 9.941 l S\n" \ + "0.533333 0.541176 0.521569 RG 14.07 6.82 m 9.828 11.062 l S\n" \ + "0.729412 0.741176 0.713725 RG 14.07 7.82 m 9.828 12.062 l S\n" \ + "0.533333 0.541176 0.521569 RG 6.93 15.141 m 8 20 14.27 20.5 16 20.5 c\n" \ + "18.094 20.504 19.5 20 19.5 18 c 19.5 16.699 20.91 16.418 22.5 16.5 c S\n" \ + "0.729412 0.741176 0.713725 RG 0.999781 w\n" \ + "1 j\n" \ + "q 1 0 0 -1 0 24 cm\n" \ + "8.492 7.707 m 8.492 8.535 7.82 9.207 6.992 9.207 c 6.164 9.207 5.492\n" \ + "8.535 5.492 7.707 c 5.492 6.879 6.164 6.207 6.992 6.207 c 7.82 6.207\n" \ + "8.492 6.879 8.492 7.707 c h\n" \ + "8.492 7.707 m S Q\n" \ + "1 w\n" \ + "0 j\n" \ + "6.93 16.141 m 8 21 14.27 21.5 16 21.5 c 18.094 21.504 19.5 21 19.5 19 c\n" \ + "19.5 17.699 20.91 17.418 22.5 17.5 c S\n" + +void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + ca = opacity; + + appearBuf = new GooString (); + + appearBuf->append ("q\n"); + if (color) + setColor(color, gTrue); + else + appearBuf->append ("1 1 1 rg\n"); + if (!name->cmp("PushPin")) + appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_PUSHPIN); + else if (!name->cmp("Paperclip")) + appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_PAPERCLIP); + else if (!name->cmp("Graph")) + appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_GRAPH); + else if (!name->cmp("Tag")) + appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_TAG); + appearBuf->append ("Q\n"); + + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = bbox[3] = 24; + if (ca == 1) { + createForm (bbox, gFalse, NULL, &appearance); + } else { + Object aStream; + + createForm (bbox, gTrue, NULL, &aStream); + delete appearBuf; + + Object resDict; + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, border, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotSound +//------------------------------------------------------------------------ +AnnotSound::AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeSound; + + annotObj.dictSet ("Subtype", obj1.initName ("Sound")); + + Object obj2; + Stream *str = soundA->getStream(); + obj2.initStream (str); + str->incRef(); //FIXME: initStream should do this? + annotObj.dictSet ("Sound", &obj2); + + initialize(docA, annotObj.getDict()); +} + +AnnotSound::AnnotSound(PDFDoc *docA, Dict *dict, Object *obj) : + AnnotMarkup(docA, dict, obj) { + type = typeSound; + initialize(docA, dict); +} + +AnnotSound::~AnnotSound() { + delete sound; + + delete name; +} + +void AnnotSound::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + sound = Sound::parseSound(dict->lookup("Sound", &obj1)); + if (!sound) { + error(errSyntaxError, -1, "Bad Annot Sound"); + ok = gFalse; + } + obj1.free(); + + if (dict->lookup("Name", &obj1)->isName()) { + name = new GooString(obj1.getName()); + } else { + name = new GooString("Speaker"); + } + obj1.free(); +} + +#define ANNOT_SOUND_AP_SPEAKER \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "0 J\n" \ + "1 j\n" \ + "[] 0.0 d\n" \ + "4 M 4 14 m 4.086 8.043 l 7 8 l 11 4 l 11 18 l 7 14 l 4 14 l h\n" \ + "4 14 m S\n" \ + "1 w\n" \ + "1 J\n" \ + "0 j\n" \ + "13.699 15.398 m 14.699 13.398 14.699 9.398 13.699 7.398 c S\n" \ + "18.199 19.398 m 21.199 17.398 21.199 5.398 18.199 3.398 c S\n" \ + "16 17.398 m 18 16.398 18 7.398 16 5.398 c S\n" \ + "0.729412 0.741176 0.713725 RG 2 w\n" \ + "0 J\n" \ + "1 j\n" \ + "4 15 m 4.086 9.043 l 7 9 l 11 5 l 11 19 l 7 15 l 4 15 l h\n" \ + "4 15 m S\n" \ + "1 w\n" \ + "1 J\n" \ + "0 j\n" \ + "13.699 16 m 14.699 14 14.699 10 13.699 8 c S\n" \ + "18.199 20 m 21.199 18 21.199 6 18.199 4 c S\n" \ + "16 18 m 18 17 18 8 16 6 c S\n" + +#define ANNOT_SOUND_AP_MIC \ + "4.301 23 m 19.699 23 l 21.523 23 23 21.523 23 19.699 c 23 4.301 l 23\n" \ + "2.477 21.523 1 19.699 1 c 4.301 1 l 2.477 1 1 2.477 1 4.301 c 1 19.699\n" \ + "l 1 21.523 2.477 23 4.301 23 c h\n" \ + "4.301 23 m f\n" \ + "0.533333 0.541176 0.521569 RG 2 w\n" \ + "1 J\n" \ + "0 j\n" \ + "[] 0.0 d\n" \ + "4 M 12 20 m 12 20 l 13.656 20 15 18.656 15 17 c 15 13 l 15 11.344 13.656 10\n" \ + "12 10 c 12 10 l 10.344 10 9 11.344 9 13 c 9 17 l 9 18.656 10.344 20 12\n" \ + "20 c h\n" \ + "12 20 m S\n" \ + "1 w\n" \ + "17.5 14.5 m 17.5 11.973 l 17.5 8.941 15.047 6.5 12 6.5 c 8.953 6.5 6.5\n" \ + "8.941 6.5 11.973 c 6.5 14.5 l S\n" \ + "2 w\n" \ + "0 J\n" \ + "12 6.52 m 12 3 l S\n" \ + "1 J\n" \ + "8 3 m 16 3 l S\n" \ + "0.729412 0.741176 0.713725 RG 12 21 m 12 21 l 13.656 21 15 19.656 15 18 c\n" \ + "15 14 l 15 12.344 13.656 11 12 11 c 12 11 l 10.344 11 9 12.344 9 14 c\n" \ + "9 18 l 9 19.656 10.344 21 12 21 c h\n" \ + "12 21 m S\n" \ + "1 w\n" \ + "17.5 15.5 m 17.5 12.973 l 17.5 9.941 15.047 7.5 12 7.5 c 8.953 7.5 6.5\n" \ + "9.941 6.5 12.973 c 6.5 15.5 l S\n" \ + "2 w\n" \ + "0 J\n" \ + "12 7.52 m 12 4 l S\n" \ + "1 J\n" \ + "8 4 m 16 4 l S\n" + +void AnnotSound::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + if (appearance.isNull()) { + ca = opacity; + + appearBuf = new GooString (); + + appearBuf->append ("q\n"); + if (color) + setColor(color, gTrue); + else + appearBuf->append ("1 1 1 rg\n"); + if (!name->cmp("Speaker")) + appearBuf->append (ANNOT_SOUND_AP_SPEAKER); + else if (!name->cmp("Mic")) + appearBuf->append (ANNOT_SOUND_AP_MIC); + appearBuf->append ("Q\n"); + + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = bbox[3] = 24; + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; + + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } + delete appearBuf; + } + + // draw the appearance stream + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, border, color, + rect->x1, rect->y1, rect->x2, rect->y2); + obj.free(); +} + +//------------------------------------------------------------------------ +// Annot3D +//------------------------------------------------------------------------ +Annot3D::Annot3D(PDFDoc *docA, PDFRectangle *rect) : + Annot(docA, rect) { + Object obj1; + + type = type3D; + + annotObj.dictSet ("Subtype", obj1.initName ("3D")); + + initialize(docA, annotObj.getDict()); +} + +Annot3D::Annot3D(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + type = type3D; + initialize(docA, dict); +} + +Annot3D::~Annot3D() { + if (activation) + delete activation; +} + +void Annot3D::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("3DA", &obj1)->isDict()) { + activation = new Activation(obj1.getDict()); + } else { + activation = NULL; + } + obj1.free(); +} + +Annot3D::Activation::Activation(Dict *dict) { + Object obj1; + + if (dict->lookup("A", &obj1)->isName()) { + const char *name = obj1.getName(); + + if(!strcmp(name, "PO")) { + aTrigger = aTriggerPageOpened; + } else if(!strcmp(name, "PV")) { + aTrigger = aTriggerPageVisible; + } else if(!strcmp(name, "XA")) { + aTrigger = aTriggerUserAction; + } else { + aTrigger = aTriggerUnknown; + } + } else { + aTrigger = aTriggerUnknown; + } + obj1.free(); + + if(dict->lookup("AIS", &obj1)->isName()) { + const char *name = obj1.getName(); + + if(!strcmp(name, "I")) { + aState = aStateEnabled; + } else if(!strcmp(name, "L")) { + aState = aStateDisabled; + } else { + aState = aStateUnknown; + } + } else { + aState = aStateUnknown; + } + obj1.free(); + + if(dict->lookup("D", &obj1)->isName()) { + const char *name = obj1.getName(); + + if(!strcmp(name, "PC")) { + dTrigger = dTriggerPageClosed; + } else if(!strcmp(name, "PI")) { + dTrigger = dTriggerPageInvisible; + } else if(!strcmp(name, "XD")) { + dTrigger = dTriggerUserAction; + } else { + dTrigger = dTriggerUnknown; + } + } else { + dTrigger = dTriggerUnknown; + } + obj1.free(); + + if(dict->lookup("DIS", &obj1)->isName()) { + const char *name = obj1.getName(); + + if(!strcmp(name, "U")) { + dState = dStateUninstantiaded; + } else if(!strcmp(name, "I")) { + dState = dStateInstantiated; + } else if(!strcmp(name, "L")) { + dState = dStateLive; + } else { + dState = dStateUnknown; + } + } else { + dState = dStateUnknown; + } + obj1.free(); + + if (dict->lookup("TB", &obj1)->isBool()) { + displayToolbar = obj1.getBool(); + } else { + displayToolbar = gTrue; + } + obj1.free(); + + if (dict->lookup("NP", &obj1)->isBool()) { + displayNavigation = obj1.getBool(); + } else { + displayNavigation = gFalse; + } + obj1.free(); +} + +//------------------------------------------------------------------------ +// Annots +//------------------------------------------------------------------------ + +Annots::Annots(PDFDoc *docA, Object *annotsObj) { + Annot *annot; + Object obj1; + int i; + + doc = docA; + annots = NULL; + size = 0; + nAnnots = 0; + + if (annotsObj->isArray()) { + for (i = 0; i < annotsObj->arrayGetLength(); ++i) { + //get the Ref to this annot and pass it to Annot constructor + //this way, it'll be possible for the annot to retrieve the corresponding + //form widget + Object obj2; + if (annotsObj->arrayGet(i, &obj1)->isDict()) { + annotsObj->arrayGetNF(i, &obj2); + annot = createAnnot (obj1.getDict(), &obj2); + if (annot) { + if (annot->isOk()) { + appendAnnot(annot); + } + annot->decRefCnt(); + } + } + obj2.free(); + obj1.free(); + } + } +} + +void Annots::appendAnnot(Annot *annot) { + if (annot && annot->isOk()) { + if (nAnnots >= size) { + size += 16; + annots = (Annot **)greallocn(annots, size, sizeof(Annot *)); + } + annots[nAnnots++] = annot; + annot->incRefCnt(); + } +} + +GBool Annots::removeAnnot(Annot *annot) { + int idx = -1; + // Search annot and determine its index + for (int i = 0; idx == -1 && i < nAnnots; i++) { + if (annots[i] == annot) { + idx = i; + } + } + if (idx == -1) { + return gFalse; + } else { + --nAnnots; + memmove( annots + idx, annots + idx + 1, sizeof(annots[0]) * (nAnnots - idx) ); + annot->decRefCnt(); + return gTrue; + } +} + +Annot *Annots::createAnnot(Dict* dict, Object *obj) { + Annot *annot = NULL; + Object obj1; + + if (dict->lookup("Subtype", &obj1)->isName()) { + const char *typeName = obj1.getName(); + + if (!strcmp(typeName, "Text")) { + annot = new AnnotText(doc, dict, obj); + } else if (!strcmp(typeName, "Link")) { + annot = new AnnotLink(doc, dict, obj); + } else if (!strcmp(typeName, "FreeText")) { + annot = new AnnotFreeText(doc, dict, obj); + } else if (!strcmp(typeName, "Line")) { + annot = new AnnotLine(doc, dict, obj); + } else if (!strcmp(typeName, "Square")) { + annot = new AnnotGeometry(doc, dict, obj); + } else if (!strcmp(typeName, "Circle")) { + annot = new AnnotGeometry(doc, dict, obj); + } else if (!strcmp(typeName, "Polygon")) { + annot = new AnnotPolygon(doc, dict, obj); + } else if (!strcmp(typeName, "PolyLine")) { + annot = new AnnotPolygon(doc, dict, obj); + } else if (!strcmp(typeName, "Highlight")) { + annot = new AnnotTextMarkup(doc, dict, obj); + } else if (!strcmp(typeName, "Underline")) { + annot = new AnnotTextMarkup(doc, dict, obj); + } else if (!strcmp(typeName, "Squiggly")) { + annot = new AnnotTextMarkup(doc, dict, obj); + } else if (!strcmp(typeName, "StrikeOut")) { + annot = new AnnotTextMarkup(doc, dict, obj); + } else if (!strcmp(typeName, "Stamp")) { + annot = new AnnotStamp(doc, dict, obj); + } else if (!strcmp(typeName, "Caret")) { + annot = new AnnotCaret(doc, dict, obj); + } else if (!strcmp(typeName, "Ink")) { + annot = new AnnotInk(doc, dict, obj); + } else if (!strcmp(typeName, "FileAttachment")) { + annot = new AnnotFileAttachment(doc, dict, obj); + } else if (!strcmp(typeName, "Sound")) { + annot = new AnnotSound(doc, dict, obj); + } else if(!strcmp(typeName, "Movie")) { + annot = new AnnotMovie(doc, dict, obj); + } else if(!strcmp(typeName, "Widget")) { + // Find the annot in forms + if (obj->isRef()) { + Form *form = doc->getCatalog()->getForm(); + if (form) { + FormWidget *widget = form->findWidgetByRef(obj->getRef()); + if (widget) { + annot = widget->getWidgetAnnotation(); + annot->incRefCnt(); + } + } + } + if (!annot) + annot = new AnnotWidget(doc, dict, obj); + } else if(!strcmp(typeName, "Screen")) { + annot = new AnnotScreen(doc, dict, obj); + } else if(!strcmp(typeName, "PrinterMark")) { + annot = new Annot(doc, dict, obj); + } else if (!strcmp(typeName, "TrapNet")) { + annot = new Annot(doc, dict, obj); + } else if (!strcmp(typeName, "Watermark")) { + annot = new Annot(doc, dict, obj); + } else if (!strcmp(typeName, "3D")) { + annot = new Annot3D(doc, dict, obj); + } else if (!strcmp(typeName, "Popup")) { + /* Popup annots are already handled by markup annots + * Here we only care about popup annots without a + * markup annotation associated + */ + Object obj2; + + if (dict->lookup("Parent", &obj2)->isNull()) + annot = new AnnotPopup(doc, dict, obj); + else + annot = NULL; + + obj2.free(); + } else { + annot = new Annot(doc, dict, obj); + } + } + obj1.free(); + + return annot; +} + +Annot *Annots::findAnnot(Ref *ref) { + int i; + + for (i = 0; i < nAnnots; ++i) { + if (annots[i]->match(ref)) { + return annots[i]; + } + } + return NULL; +} + + +Annots::~Annots() { + int i; + + for (i = 0; i < nAnnots; ++i) { + annots[i]->decRefCnt(); + } + gfree(annots); +} diff --git a/poppler/Annot.h b/poppler/Annot.h new file mode 100644 index 0000000..04a1301 --- /dev/null +++ b/poppler/Annot.h @@ -0,0 +1,1389 @@ +//======================================================================== +// +// Annot.h +// +// Copyright 2000-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Scott Turner +// Copyright (C) 2007, 2008 Julien Rebetez +// Copyright (C) 2007-2011 Carlos Garcia Campos +// Copyright (C) 2007, 2008 Iñigo Martínez +// Copyright (C) 2008 Michael Vrable +// Copyright (C) 2008 Hugo Mercier +// Copyright (C) 2008 Pino Toscano +// Copyright (C) 2008 Tomas Are Haavet +// Copyright (C) 2009-2011 Albert Astals Cid +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef ANNOT_H +#define ANNOT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class XRef; +class Gfx; +class CharCodeToUnicode; +class GfxFont; +class GfxResources; +class PDFDoc; +class Form; +class FormWidget; +class FormField; +class FormFieldChoice; +class PDFRectangle; +class Movie; +class LinkAction; +class Sound; + +enum AnnotLineEndingStyle { + annotLineEndingSquare, // Square + annotLineEndingCircle, // Circle + annotLineEndingDiamond, // Diamond + annotLineEndingOpenArrow, // OpenArrow + annotLineEndingClosedArrow, // ClosedArrow + annotLineEndingNone, // None + annotLineEndingButt, // Butt + annotLineEndingROpenArrow, // ROpenArrow + annotLineEndingRClosedArrow, // RClosedArrow + annotLineEndingSlash // Slash +}; + +enum AnnotExternalDataType { + annotExternalDataMarkupUnknown, + annotExternalDataMarkup3D // Markup3D +}; + +//------------------------------------------------------------------------ +// AnnotCoord +//------------------------------------------------------------------------ + +class AnnotCoord { +public: + + AnnotCoord() : x(0), y(0) { } + AnnotCoord(double _x, double _y) : x(_x), y(_y) { } + + double getX() const { return x; } + double getY() const { return y; } + +protected: + + double x, y; +}; + +//------------------------------------------------------------------------ +// AnnotPath +//------------------------------------------------------------------------ + +class AnnotPath { +public: + AnnotPath(); + AnnotPath(Array *array); + AnnotPath(AnnotCoord **coords, int coordLength); + ~AnnotPath(); + + double getX(int coord) const; + double getY(int coord) const; + AnnotCoord *getCoord(int coord) const; + int getCoordsLength() const { return coordsLength; } +protected: + AnnotCoord **coords; + int coordsLength; + + void parsePathArray(Array *array); +}; + +//------------------------------------------------------------------------ +// AnnotCalloutLine +//------------------------------------------------------------------------ + +class AnnotCalloutLine { +public: + + AnnotCalloutLine(double x1, double y1, double x2, double y2); + virtual ~AnnotCalloutLine() { } + + double getX1() const { return coord1.getX(); } + double getY1() const { return coord1.getY(); } + double getX2() const { return coord2.getX(); } + double getY2() const { return coord2.getY(); } + +protected: + + AnnotCoord coord1, coord2; +}; + +//------------------------------------------------------------------------ +// AnnotCalloutMultiLine +//------------------------------------------------------------------------ + +class AnnotCalloutMultiLine: public AnnotCalloutLine { +public: + + AnnotCalloutMultiLine(double x1, double y1, double x2, double y2, + double x3, double y3); + + double getX3() const { return coord3.getX(); } + double getY3() const { return coord3.getY(); } + +protected: + + AnnotCoord coord3; +}; + +//------------------------------------------------------------------------ +// AnnotBorderEffect +//------------------------------------------------------------------------ + +class AnnotBorderEffect { +public: + + enum AnnotBorderEffectType { + borderEffectNoEffect, // S + borderEffectCloudy // C + }; + + AnnotBorderEffect(Dict *dict); + + AnnotBorderEffectType getEffectType() const { return effectType; } + double getIntensity() const { return intensity; } + +private: + + AnnotBorderEffectType effectType; // S (Default S) + double intensity; // I (Default 0) +}; + +//------------------------------------------------------------------------ +// AnnotQuadrilateral +//------------------------------------------------------------------------ + +class AnnotQuadrilaterals { +public: + class AnnotQuadrilateral { + public: + AnnotQuadrilateral(double x1, double y1, double x2, double y2, double x3, + double y3, double x4, double y4); + + AnnotCoord coord1, coord2, coord3, coord4; + }; + + AnnotQuadrilaterals(Array *array, PDFRectangle *rect); + AnnotQuadrilaterals(AnnotQuadrilateral **quads, int quadsLength); + ~AnnotQuadrilaterals(); + + double getX1(int quadrilateral); + double getY1(int quadrilateral); + double getX2(int quadrilateral); + double getY2(int quadrilateral); + double getX3(int quadrilateral); + double getY3(int quadrilateral); + double getX4(int quadrilateral); + double getY4(int quadrilateral); + int getQuadrilateralsLength() const { return quadrilateralsLength; } +protected: + + AnnotQuadrilateral** quadrilaterals; + int quadrilateralsLength; +}; + +//------------------------------------------------------------------------ +// AnnotBorder +//------------------------------------------------------------------------ + +class AnnotBorder { +public: + enum AnnotBorderType { + typeUnknown, + typeArray, + typeBS + }; + + enum AnnotBorderStyle { + borderSolid, // Solid + borderDashed, // Dashed + borderBeveled, // Beveled + borderInset, // Inset + borderUnderlined // Underlined + }; + + AnnotBorder(); + virtual ~AnnotBorder(); + + virtual void setWidth(double new_width) { width = new_width; } + + virtual AnnotBorderType getType() const { return type; } + virtual double getWidth() const { return width; } + virtual int getDashLength() const { return dashLength; } + virtual double *getDash() const { return dash; } + virtual AnnotBorderStyle getStyle() const { return style; } + +protected: + GBool parseDashArray(Object *dashObj); + + AnnotBorderType type; + double width; + static const int DASH_LIMIT = 10; // implementation note 82 in Appendix H. + int dashLength; + double *dash; + AnnotBorderStyle style; +}; + +//------------------------------------------------------------------------ +// AnnotBorderArray +//------------------------------------------------------------------------ + +class AnnotBorderArray: public AnnotBorder { +public: + AnnotBorderArray(); + AnnotBorderArray(Array *array); + + void writeToObject(XRef *xref, Object *dest) const; + + void setHorizontalCorner(double hc) { horizontalCorner = hc; } + void setVerticalCorner(double vc) { verticalCorner = vc; } + + double getHorizontalCorner() const { return horizontalCorner; } + double getVerticalCorner() const { return verticalCorner; } + +protected: + double horizontalCorner; // (Default 0) + double verticalCorner; // (Default 0) + // double width; // (Default 1) (inherited from AnnotBorder) +}; + +//------------------------------------------------------------------------ +// AnnotBorderBS +//------------------------------------------------------------------------ + +class AnnotBorderBS: public AnnotBorder { +public: + + AnnotBorderBS(); + AnnotBorderBS(Dict *dict); + +private: + // double width; // W (Default 1) (inherited from AnnotBorder) + // AnnotBorderStyle style; // S (Default S) (inherited from AnnotBorder) + // double *dash; // D (Default [3]) (inherited from AnnotBorder) +}; + +//------------------------------------------------------------------------ +// AnnotColor +//------------------------------------------------------------------------ + +class AnnotColor { +public: + + enum AnnotColorSpace { + colorTransparent = 0, + colorGray = 1, + colorRGB = 3, + colorCMYK = 4 + }; + + AnnotColor(); + AnnotColor(double gray); + AnnotColor(double r, double g, double b); + AnnotColor(double c, double m, double y, double k); + AnnotColor(Array *array, int adjust = 0); + + void adjustColor(int adjust); + + AnnotColorSpace getSpace() const { return (AnnotColorSpace) length; } + const double *getValues() const { return values; } + + void writeToObject(XRef *xref, Object *dest) const; + +private: + + double values[4]; + int length; +}; + +//------------------------------------------------------------------------ +// AnnotIconFit +//------------------------------------------------------------------------ + +class AnnotIconFit { +public: + + enum AnnotIconFitScaleWhen { + scaleAlways, // A + scaleBigger, // B + scaleSmaller, // S + scaleNever // N + }; + + enum AnnotIconFitScale { + scaleAnamorphic, // A + scaleProportional // P + }; + + AnnotIconFit(Dict *dict); + + AnnotIconFitScaleWhen getScaleWhen() { return scaleWhen; } + AnnotIconFitScale getScale() { return scale; } + double getLeft() { return left; } + double getBottom() { return bottom; } + bool getFullyBounds() { return fullyBounds; } + +protected: + + AnnotIconFitScaleWhen scaleWhen; // SW (Default A) + AnnotIconFitScale scale; // S (Default P) + double left; // A (Default [0.5 0.5] + double bottom; // Only if scale is P + bool fullyBounds; // FB (Default false) +}; + +//------------------------------------------------------------------------ +// AnnotAppearance +//------------------------------------------------------------------------ + +class AnnotAppearance { +public: + + enum AnnotAppearanceType { + appearNormal, + appearRollover, + appearDown + }; + + AnnotAppearance(PDFDoc *docA, Object *dict); + ~AnnotAppearance(); + + // State is ignored if no subdictionary is present + void getAppearanceStream(AnnotAppearanceType type, const char *state, Object *dest); + + // Access keys in normal appearance subdictionary (N) + GooString * getStateKey(int i); + int getNumStates(); + + // Removes all associated streams in the xref table. Caller is required to + // reset parent annotation's AP and AS after this call. + void removeAllStreams(); + + // Test if this AnnotAppearance references the specified stream + GBool referencesStream(Ref targetStreamRef); + +private: + static GBool referencesStream(Object *stateObj, Ref targetStreamRef); + void removeStream(Ref refToStream); + void removeStateStreams(Object *state); + +protected: + PDFDoc *doc; + XRef *xref; // the xref table for this PDF file + Object appearDict; // Annotation's AP +}; + +//------------------------------------------------------------------------ +// AnnotAppearanceCharacs +//------------------------------------------------------------------------ + +class AnnotAppearanceCharacs { +public: + + enum AnnotAppearanceCharacsTextPos { + captionNoIcon, // 0 + captionNoCaption, // 1 + captionBelow, // 2 + captionAbove, // 3 + captionRight, // 4 + captionLeft, // 5 + captionOverlaid // 6 + }; + + AnnotAppearanceCharacs(Dict *dict); + ~AnnotAppearanceCharacs(); + + int getRotation() { return rotation; } + AnnotColor *getBorderColor() { return borderColor; } + AnnotColor *getBackColor() { return backColor; } + GooString *getNormalCaption() { return normalCaption; } + GooString *getRolloverCaption() { return rolloverCaption; } + GooString *getAlternateCaption() { return alternateCaption; } + AnnotIconFit *getIconFit() { return iconFit; } + AnnotAppearanceCharacsTextPos getPosition() { return position; } + +protected: + + int rotation; // R (Default 0) + AnnotColor *borderColor; // BC + AnnotColor *backColor; // BG + GooString *normalCaption; // CA + GooString *rolloverCaption; // RC + GooString *alternateCaption; // AC + // I + // RI + // IX + AnnotIconFit *iconFit; // IF + AnnotAppearanceCharacsTextPos position; // TP (Default 0) +}; + +//------------------------------------------------------------------------ +// AnnotAppearanceBBox +//------------------------------------------------------------------------ + +class AnnotAppearanceBBox +{ +public: + AnnotAppearanceBBox(PDFRectangle *init); + + void setBorderWidth(double w) { borderWidth = w; } + + // The following functions operate on coords relative to [origX origY] + void extendTo(double x, double y); + void getBBoxRect(double bbox[4]) const; + + // Get boundaries in page coordinates + double getPageXMin() const; + double getPageYMin() const; + double getPageXMax() const; + double getPageYMax() const; + +private: + double origX, origY, borderWidth; + double minX, minY, maxX, maxY; +}; + +//------------------------------------------------------------------------ +// Annot +//------------------------------------------------------------------------ + +class Annot { +public: + enum AnnotFlag { + flagUnknown = 0x0000, + flagInvisible = 0x0001, + flagHidden = 0x0002, + flagPrint = 0x0004, + flagNoZoom = 0x0008, + flagNoRotate = 0x0010, + flagNoView = 0x0020, + flagReadOnly = 0x0040, + flagLocked = 0x0080, + flagToggleNoView = 0x0100, + flagLockedContents = 0x0200 + }; + + enum AnnotSubtype { + typeUnknown, // 0 + typeText, // Text 1 + typeLink, // Link 2 + typeFreeText, // FreeText 3 + typeLine, // Line 4 + typeSquare, // Square 5 + typeCircle, // Circle 6 + typePolygon, // Polygon 7 + typePolyLine, // PolyLine 8 + typeHighlight, // Highlight 9 + typeUnderline, // Underline 10 + typeSquiggly, // Squiggly 11 + typeStrikeOut, // StrikeOut 12 + typeStamp, // Stamp 13 + typeCaret, // Caret 14 + typeInk, // Ink 15 + typePopup, // Popup 16 + typeFileAttachment, // FileAttachment 17 + typeSound, // Sound 18 + typeMovie, // Movie 19 + typeWidget, // Widget 20 + typeScreen, // Screen 21 + typePrinterMark, // PrinterMark 22 + typeTrapNet, // TrapNet 23 + typeWatermark, // Watermark 24 + type3D // 3D 25 + }; + + Annot(PDFDoc *docA, PDFRectangle *rectA); + Annot(PDFDoc *docA, Dict *dict); + Annot(PDFDoc *docA, Dict *dict, Object *obj); + GBool isOk() { return ok; } + + void incRefCnt(); + void decRefCnt(); + + virtual void draw(Gfx *gfx, GBool printing); + // Get the resource dict of the appearance stream + virtual Object *getAppearanceResDict(Object *dest); + + GBool match(Ref *refA) + { return ref.num == refA->num && ref.gen == refA->gen; } + + double getXMin(); + double getYMin(); + + double getFontSize() { return fontSize; } + + void setRect(PDFRectangle *rect); + void setRect(double x1, double y1, double x2, double y2); + + // Sets the annot contents to new_content + // new_content should never be NULL + void setContents(GooString *new_content); + void setName(GooString *new_name); + void setModified(GooString *new_date); + void setFlags(Guint new_flags); + + void setBorder(AnnotBorderArray *new_border); // Takes ownership + + // The annotation takes the ownership of + // new_color. + void setColor(AnnotColor *new_color); + + void setPage(Ref *pageRef, int pageIndex); + + void setAppearanceState(const char *state); + + // Delete appearance streams and reset appearance state + void invalidateAppearance(); + + // getters + PDFDoc *getDoc() const { return doc; } + XRef *getXRef() const { return xref; } + GBool getHasRef() const { return hasRef; } + Ref getRef() const { return ref; } + AnnotSubtype getType() const { return type; } + PDFRectangle *getRect() const { return rect; } + void getRect(double *x1, double *y1, double *x2, double *y2) const; + GooString *getContents() const { return contents; } + int getPageNum() const { return page; } + GooString *getName() const { return name; } + GooString *getModified() const { return modified; } + Guint getFlags() const { return flags; } + AnnotAppearance *getAppearStreams() const { return appearStreams; } + GooString *getAppearState() const { return appearState; } + AnnotBorder *getBorder() const { return border; } + AnnotColor *getColor() const { return color; } + int getTreeKey() const { return treeKey; } + + int getId() { return ref.num; } + + // Check if point is inside the annot rectangle. + GBool inRect(double x, double y) const; + +private: + void readArrayNum(Object *pdfArray, int key, double *value); + // write vStr[i:j[ in appearBuf + + void initialize (PDFDoc *docA, Dict *dict); + + +protected: + virtual ~Annot(); + void setColor(AnnotColor *color, GBool fill); + void drawCircle(double cx, double cy, double r, GBool fill); + void drawCircleTopLeft(double cx, double cy, double r); + void drawCircleBottomRight(double cx, double cy, double r); + void layoutText(GooString *text, GooString *outBuf, int *i, GfxFont *font, + double *width, double widthLimit, int *charCount, + GBool noReencode); + void writeString(GooString *str, GooString *appearBuf); + void createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream); + void createResourcesDict(const char *formName, Object *formStream, const char *stateName, + double opacity, const char *blendMode, Object *resDict); + GBool isVisible(GBool printing); + + // Updates the field key of the annotation dictionary + // and sets M to the current time + void update(const char *key, Object *value); + + int refCnt; + + Object annotObj; + + // required data + AnnotSubtype type; // Annotation type + PDFRectangle *rect; // Rect + + // optional data + GooString *contents; // Contents + int page; // P + GooString *name; // NM + GooString *modified; // M + Guint flags; // F (must be a 32 bit unsigned int) + AnnotAppearance *appearStreams; // AP + Object appearance; // a reference to the Form XObject stream + // for the normal appearance + AnnotAppearanceBBox *appearBBox; // BBox of generated appearance + GooString *appearState; // AS + int treeKey; // Struct Parent; + Object oc; // OC + + PDFDoc *doc; + XRef *xref; // the xref table for this PDF file + Ref ref; // object ref identifying this annotation + GooString *appearBuf; + AnnotBorder *border; // Border, BS + AnnotColor *color; // C + double fontSize; + GBool ok; + + bool hasRef; +}; + +//------------------------------------------------------------------------ +// AnnotPopup +//------------------------------------------------------------------------ + +class AnnotPopup: public Annot { +public: + AnnotPopup(PDFDoc *docA, PDFRectangle *rect); + AnnotPopup(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotPopup(); + + Object *getParent(Object *obj) { return parent.fetch (xref, obj); } + Object *getParentNF(Object *obj) { return &parent; } + void setParent(Object *parentA); + void setParent(Annot *parentA); + GBool getOpen() const { return open; } + void setOpen(GBool openA); + +protected: + void initialize(PDFDoc *docA, Dict *dict); + + Object parent; // Parent + GBool open; // Open +}; + +//------------------------------------------------------------------------ +// AnnotMarkup +//------------------------------------------------------------------------ + +class AnnotMarkup: public Annot { +public: + enum AnnotMarkupReplyType { + replyTypeR, // R + replyTypeGroup // Group + }; + + AnnotMarkup(PDFDoc *docA, PDFRectangle *rect); + AnnotMarkup(PDFDoc *docA, Dict *dict, Object *obj); + virtual ~AnnotMarkup(); + + // getters + GooString *getLabel() const { return label; } + AnnotPopup *getPopup() const { return popup; } + double getOpacity() const { return opacity; } + // getRC + GooString *getDate() const { return date; } + int getInReplyToID() const { return inReplyTo.num; } + GooString *getSubject() const { return subject; } + AnnotMarkupReplyType getReplyTo() const { return replyTo; } + AnnotExternalDataType getExData() const { return exData; } + + // The annotation takes the ownership of new_popup + void setPopup(AnnotPopup *new_popup); + void setLabel(GooString *new_label); + void setOpacity(double opacityA); + void setDate(GooString *new_date); + +protected: + GooString *label; // T (Default autor) + AnnotPopup *popup; // Popup + double opacity; // CA (Default 1.0) + // RC + GooString *date; // CreationDate + Ref inReplyTo; // IRT + GooString *subject; // Subj + AnnotMarkupReplyType replyTo; // RT (Default R) + // this object is overrided by the custom intent fields defined in some + // annotation types. + //GooString *intent; // IT + AnnotExternalDataType exData; // ExData + +private: + void initialize(PDFDoc *docA, Dict *dict, Object *obj); +}; + +//------------------------------------------------------------------------ +// AnnotText +//------------------------------------------------------------------------ + +class AnnotText: public AnnotMarkup { +public: + enum AnnotTextState { + stateUnknown, + // Marked state model + stateMarked, // Marked + stateUnmarked, // Unmarked + // Review state model + stateAccepted, // Accepted + stateRejected, // Rejected + stateCancelled, // Cancelled + stateCompleted, // Completed + stateNone // None + }; + + AnnotText(PDFDoc *docA, PDFRectangle *rect); + AnnotText(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotText(); + + virtual void draw(Gfx *gfx, GBool printing); + + // getters + GBool getOpen() const { return open; } + GooString *getIcon() const { return icon; } + AnnotTextState getState() const { return state; } + + void setOpen(GBool openA); + void setIcon(GooString *new_icon); + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + GBool open; // Open (Default false) + GooString *icon; // Name (Default Note) + AnnotTextState state; // State (Default Umarked if + // StateModel Marked + // None if StareModel Review) +}; + +//------------------------------------------------------------------------ +// AnnotMovie +//------------------------------------------------------------------------ + + + +class AnnotMovie: public Annot { + public: + AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA); + AnnotMovie(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotMovie(); + + virtual void draw(Gfx *gfx, GBool printing); + + GooString* getTitle() { return title; } + Movie* getMovie() { return movie; } + + private: + void initialize(PDFDoc *docA, Dict *dict); + + GooString* title; // T + Movie* movie; // Movie + A +}; + + +//------------------------------------------------------------------------ +// AnnotScreen +//------------------------------------------------------------------------ + +class AnnotScreen: public Annot { + public: + + AnnotScreen(PDFDoc *docA, PDFRectangle *rect); + AnnotScreen(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotScreen(); + + GooString* getTitle() { return title; } + + AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } + LinkAction* getAction() { return action; } + Object* getAdditionActions() { return &additionAction; } + + private: + void initialize(PDFDoc *docA, Dict *dict); + + + GooString* title; // T + + AnnotAppearanceCharacs* appearCharacs; // MK + + LinkAction *action; // A + Object additionAction; // AA +}; + +//------------------------------------------------------------------------ +// AnnotLink +//------------------------------------------------------------------------ + +class AnnotLink: public Annot { +public: + + enum AnnotLinkEffect { + effectNone, // N + effectInvert, // I + effectOutline, // O + effectPush // P + }; + + AnnotLink(PDFDoc *docA, PDFRectangle *rect); + AnnotLink(PDFDoc *docA, Dict *dict, Object *obj); + virtual ~AnnotLink(); + + virtual void draw(Gfx *gfx, GBool printing); + + // getters + LinkAction *getAction() const { return action; } + AnnotLinkEffect getLinkEffect() const { return linkEffect; } + Dict *getUriAction() const { return uriAction; } + AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; } + +protected: + + void initialize(PDFDoc *docA, Dict *dict); + + LinkAction *action; // A, Dest + AnnotLinkEffect linkEffect; // H (Default I) + Dict *uriAction; // PA + + AnnotQuadrilaterals *quadrilaterals; // QuadPoints +}; + +//------------------------------------------------------------------------ +// AnnotFreeText +//------------------------------------------------------------------------ + +class AnnotFreeText: public AnnotMarkup { +public: + + enum AnnotFreeTextQuadding { + quaddingLeftJustified, // 0 + quaddingCentered, // 1 + quaddingRightJustified // 2 + }; + + enum AnnotFreeTextIntent { + intentFreeText, // FreeText + intentFreeTextCallout, // FreeTextCallout + intentFreeTextTypeWriter // FreeTextTypeWriter + }; + + AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da); + AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotFreeText(); + + virtual void draw(Gfx *gfx, GBool printing); + virtual Object *getAppearanceResDict(Object *dest); + + void setAppearanceString(GooString *new_string); + void setQuadding(AnnotFreeTextQuadding new_quadding); + void setStyleString(GooString *new_string); + void setCalloutLine(AnnotCalloutLine *line); + void setIntent(AnnotFreeTextIntent new_intent); + + // getters + GooString *getAppearanceString() const { return appearanceString; } + AnnotFreeTextQuadding getQuadding() const { return quadding; } + // return rc + GooString *getStyleString() const { return styleString; } + AnnotCalloutLine *getCalloutLine() const { return calloutLine; } + AnnotFreeTextIntent getIntent() const { return intent; } + AnnotBorderEffect *getBorderEffect() const { return borderEffect; } + PDFRectangle *getRectangle() const { return rectangle; } + AnnotLineEndingStyle getEndStyle() const { return endStyle; } + +protected: + + void initialize(PDFDoc *docA, Dict *dict); + static void parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor); + void generateFreeTextAppearance(); + + // required + GooString *appearanceString; // DA + + // optional + AnnotFreeTextQuadding quadding; // Q (Default 0) + // RC + GooString *styleString; // DS + AnnotCalloutLine *calloutLine; // CL + AnnotFreeTextIntent intent; // IT + AnnotBorderEffect *borderEffect; // BE + PDFRectangle *rectangle; // RD + // inherited from Annot + // AnnotBorderBS border; // BS + AnnotLineEndingStyle endStyle; // LE (Default None) +}; + +//------------------------------------------------------------------------ +// AnnotLine +//------------------------------------------------------------------------ + +class AnnotLine: public AnnotMarkup { +public: + + enum AnnotLineIntent { + intentLineArrow, // LineArrow + intentLineDimension // LineDimension + }; + + enum AnnotLineCaptionPos { + captionPosInline, // Inline + captionPosTop // Top + }; + + AnnotLine(PDFDoc *docA, PDFRectangle *rect, PDFRectangle *lRect); + AnnotLine(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotLine(); + + virtual void draw(Gfx *gfx, GBool printing); + virtual Object *getAppearanceResDict(Object *dest); + + void setVertices(double x1, double y1, double x2, double y2); + void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end); + void setInteriorColor(AnnotColor *new_color); + void setLeaderLineLength(double len); + void setLeaderLineExtension(double len); + void setCaption(bool new_cap); + void setIntent(AnnotLineIntent new_intent); + + // getters + AnnotLineEndingStyle getStartStyle() const { return startStyle; } + AnnotLineEndingStyle getEndStyle() const { return endStyle; } + AnnotColor *getInteriorColor() const { return interiorColor; } + double getLeaderLineLength() const { return leaderLineLength; } + double getLeaderLineExtension() const { return leaderLineExtension; } + bool getCaption() const { return caption; } + AnnotLineIntent getIntent() const { return intent; } + double getLeaderLineOffset() const { return leaderLineOffset; } + AnnotLineCaptionPos getCaptionPos() const { return captionPos; } + Dict *getMeasure() const { return measure; } + double getCaptionTextHorizontal() const { return captionTextHorizontal; } + double getCaptionTextVertical() const { return captionTextVertical; } + double getX1() const { return coord1->getX(); } + double getY1() const { return coord1->getY(); } + double getX2() const { return coord2->getX(); } + double getY2() const { return coord2->getY(); } + +protected: + + void initialize(PDFDoc *docA, Dict *dict); + void generateLineAppearance(); + + // required + AnnotCoord *coord1, *coord2; + + // optional + // inherited from Annot + // AnnotBorderBS border; // BS + AnnotLineEndingStyle startStyle; // LE (Default [/None /None]) + AnnotLineEndingStyle endStyle; // + AnnotColor *interiorColor; // IC + double leaderLineLength; // LL (Default 0) + double leaderLineExtension; // LLE (Default 0) + bool caption; // Cap (Default false) + AnnotLineIntent intent; // IT + double leaderLineOffset; // LLO + AnnotLineCaptionPos captionPos; // CP (Default Inline) + Dict *measure; // Measure + double captionTextHorizontal; // CO (Default [0, 0]) + double captionTextVertical; // +}; + +//------------------------------------------------------------------------ +// AnnotTextMarkup +//------------------------------------------------------------------------ + +class AnnotTextMarkup: public AnnotMarkup { +public: + + AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType, + AnnotQuadrilaterals *quadPoints); + AnnotTextMarkup(PDFDoc *docA, Dict *dict, Object *obj); + virtual ~AnnotTextMarkup(); + + virtual void draw(Gfx *gfx, GBool printing); + + // typeHighlight, typeUnderline, typeSquiggly or typeStrikeOut + void setType(AnnotSubtype new_type); + + void setQuadrilaterals(AnnotQuadrilaterals *quadPoints); + + AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; } + +protected: + + void initialize(PDFDoc *docA, Dict *dict); + + AnnotQuadrilaterals *quadrilaterals; // QuadPoints +}; + +//------------------------------------------------------------------------ +// AnnotStamp +//------------------------------------------------------------------------ + +class AnnotStamp: public AnnotMarkup { +public: + + AnnotStamp(PDFDoc *docA, PDFRectangle *rect); + AnnotStamp(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotStamp(); + + void setIcon(GooString *new_icon); + + // getters + GooString *getIcon() const { return icon; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + GooString *icon; // Name (Default Draft) +}; + +//------------------------------------------------------------------------ +// AnnotGeometry +//------------------------------------------------------------------------ + +class AnnotGeometry: public AnnotMarkup { +public: + + AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType); + AnnotGeometry(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotGeometry(); + + virtual void draw(Gfx *gfx, GBool printing); + + void setType(AnnotSubtype new_type); // typeSquare or typeCircle + void setInteriorColor(AnnotColor *new_color); + + // getters + AnnotColor *getInteriorColor() const { return interiorColor; } + AnnotBorderEffect *getBorderEffect() const { return borderEffect; } + PDFRectangle *getGeometryRect() const { return geometryRect; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + AnnotColor *interiorColor; // IC + AnnotBorderEffect *borderEffect; // BE + PDFRectangle *geometryRect; // RD (combined with Rect) +}; + +//------------------------------------------------------------------------ +// AnnotPolygon +//------------------------------------------------------------------------ + +class AnnotPolygon: public AnnotMarkup { +public: + + enum AnnotPolygonIntent { + polygonCloud, // PolygonCloud + polylineDimension, // PolyLineDimension + polygonDimension // PolygonDimension + }; + + AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType, AnnotPath *path); + AnnotPolygon(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotPolygon(); + + virtual void draw(Gfx *gfx, GBool printing); + + void setType(AnnotSubtype new_type); // typePolygon or typePolyLine + void setVertices(AnnotPath *path); + void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end); + void setInteriorColor(AnnotColor *new_color); + void setIntent(AnnotPolygonIntent new_intent); + + // getters + AnnotPath *getVertices() const { return vertices; } + AnnotLineEndingStyle getStartStyle() const { return startStyle; } + AnnotLineEndingStyle getEndStyle() const { return endStyle; } + AnnotColor *getInteriorColor() const { return interiorColor; } + AnnotBorderEffect *getBorderEffect() const { return borderEffect; } + AnnotPolygonIntent getIntent() const { return intent; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + // required + AnnotPath *vertices; // Vertices + + // optional + AnnotLineEndingStyle startStyle; // LE (Default [/None /None]) + AnnotLineEndingStyle endStyle; // + // inherited from Annot + // AnnotBorderBS border; // BS + AnnotColor *interiorColor; // IC + AnnotBorderEffect *borderEffect; // BE + AnnotPolygonIntent intent; // IT + // Measure +}; + +//------------------------------------------------------------------------ +// AnnotCaret +//------------------------------------------------------------------------ + +class AnnotCaret: public AnnotMarkup { +public: + + enum AnnotCaretSymbol { + symbolNone, // None + symbolP // P + }; + + AnnotCaret(PDFDoc *docA, PDFRectangle *rect); + AnnotCaret(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotCaret(); + + void setSymbol(AnnotCaretSymbol new_symbol); + + // getters + AnnotCaretSymbol getSymbol() const { return symbol; } + PDFRectangle *getCaretRect() const { return caretRect; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + AnnotCaretSymbol symbol; // Sy (Default None) + PDFRectangle *caretRect; // RD (combined with Rect) +}; + +//------------------------------------------------------------------------ +// AnnotInk +//------------------------------------------------------------------------ + +class AnnotInk: public AnnotMarkup { +public: + + AnnotInk(PDFDoc *docA, PDFRectangle *rect, AnnotPath **paths, int n_paths); + AnnotInk(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotInk(); + + virtual void draw(Gfx *gfx, GBool printing); + + void setInkList(AnnotPath **paths, int n_paths); + + // getters + AnnotPath **getInkList() const { return inkList; } + int getInkListLength() const { return inkListLength; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + void writeInkList(AnnotPath **paths, int n_paths, Array *dest_array); + void parseInkList(Array *src_array); + void freeInkList(); + + // required + AnnotPath **inkList; // InkList + int inkListLength; + + // optional + // inherited from Annot + // AnnotBorderBS border; // BS +}; + +//------------------------------------------------------------------------ +// AnnotFileAttachment +//------------------------------------------------------------------------ + +class AnnotFileAttachment: public AnnotMarkup { +public: + + AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename); + AnnotFileAttachment(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotFileAttachment(); + + virtual void draw(Gfx *gfx, GBool printing); + + // getters + Object *getFile() { return &file; } + GooString *getName() const { return name; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + // required + Object file; // FS + + // optional + GooString *name; // Name +}; + +//------------------------------------------------------------------------ +// AnnotSound +//------------------------------------------------------------------------ + +class AnnotSound: public AnnotMarkup { +public: + + AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA); + AnnotSound(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotSound(); + + virtual void draw(Gfx *gfx, GBool printing); + + // getters + Sound *getSound() { return sound; } + GooString *getName() const { return name; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + // required + Sound *sound; // Sound + + // optional + GooString *name; // Name +}; + +//------------------------------------------------------------------------ +// AnnotWidget +//------------------------------------------------------------------------ + +class AnnotWidget: public Annot { +public: + + enum AnnotWidgetHighlightMode { + highlightModeNone, // N + highlightModeInvert, // I + highlightModeOutline, // O + highlightModePush // P,T + }; + + AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj); + AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj, FormField *fieldA); + virtual ~AnnotWidget(); + + virtual void draw(Gfx *gfx, GBool printing); + + void drawBorder(); + void drawFormFieldButton(GfxResources *resources, GooString *da); + void drawFormFieldText(GfxResources *resources, GooString *da); + void drawFormFieldChoice(GfxResources *resources, GooString *da); + void generateFieldAppearance (); + + AnnotWidgetHighlightMode getMode() { return mode; } + AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } + LinkAction *getAction() { return action; } + Dict *getAdditionActions() { return additionActions; } + Dict *getParent() { return parent; } + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + void drawText(GooString *text, GooString *da, GfxResources *resources, + GBool multiline, int comb, int quadding, + GBool txField, GBool forceZapfDingbats, + GBool password=false); + void drawListBox(FormFieldChoice *fieldChoice, + GooString *da, GfxResources *resources, int quadding); + + Form *form; + FormField *field; // FormField object for this annotation + AnnotWidgetHighlightMode mode; // H (Default I) + AnnotAppearanceCharacs *appearCharacs; // MK + LinkAction *action; // A + Dict *additionActions; // AA + // inherited from Annot + // AnnotBorderBS border; // BS + Dict *parent; // Parent + GBool addDingbatsResource; +}; + +//------------------------------------------------------------------------ +// Annot3D +//------------------------------------------------------------------------ + +class Annot3D: public Annot { + class Activation { + public: + enum ActivationATrigger { + aTriggerUnknown, + aTriggerPageOpened, // PO + aTriggerPageVisible, // PV + aTriggerUserAction // XA + }; + + enum ActivationAState { + aStateUnknown, + aStateEnabled, // I + aStateDisabled // L + }; + + enum ActivationDTrigger { + dTriggerUnknown, + dTriggerPageClosed, // PC + dTriggerPageInvisible, // PI + dTriggerUserAction // XD + }; + + enum ActivationDState { + dStateUnknown, + dStateUninstantiaded, // U + dStateInstantiated, // I + dStateLive // L + }; + + Activation(Dict *dict); + private: + + ActivationATrigger aTrigger; // A (Default XA) + ActivationAState aState; // AIS (Default L) + ActivationDTrigger dTrigger; // D (Default PI) + ActivationDState dState; // DIS (Default U) + GBool displayToolbar; // TB (Default true) + GBool displayNavigation; // NP (Default false); + }; +public: + + Annot3D(PDFDoc *docA, PDFRectangle *rect); + Annot3D(PDFDoc *docA, Dict *dict, Object *obj); + ~Annot3D(); + + // getters + +private: + + void initialize(PDFDoc *docA, Dict *dict); + + Activation *activation; // 3DA +}; + +//------------------------------------------------------------------------ +// Annots +//------------------------------------------------------------------------ + +class Annots { +public: + + // Build a list of Annot objects. + Annots(PDFDoc *docA, Object *annotsObj); + + ~Annots(); + + // Iterate through list of annotations. + int getNumAnnots() { return nAnnots; } + Annot *getAnnot(int i) { return annots[i]; } + void appendAnnot(Annot *annot); + GBool removeAnnot(Annot *annot); + +private: + Annot* createAnnot(Dict* dict, Object *obj); + Annot *findAnnot(Ref *ref); + + PDFDoc *doc; + Annot **annots; + int nAnnots; + int size; +}; + +#endif diff --git a/poppler/Array.cc b/poppler/Array.cc new file mode 100644 index 0000000..cb22432 --- /dev/null +++ b/poppler/Array.cc @@ -0,0 +1,115 @@ +//======================================================================== +// +// Array.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "Object.h" +#include "Array.h" + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +Array::Array(XRef *xrefA) { + xref = xrefA; + elems = NULL; + size = length = 0; + ref = 1; +} + +Array::~Array() { + int i; + + for (i = 0; i < length; ++i) + elems[i].free(); + gfree(elems); +} + +void Array::add(Object *elem) { + if (length == size) { + if (length == 0) { + size = 8; + } else { + size *= 2; + } + elems = (Object *)greallocn(elems, size, sizeof(Object)); + } + elems[length] = *elem; + ++length; +} + +void Array::remove(int i) { + if (i < 0 || i >= length) { +#ifdef DEBUG_MEM + abort(); +#else + return; +#endif + } + --length; + memmove( elems + i, elems + i + 1, sizeof(elems[0]) * (length - i) ); +} + +Object *Array::get(int i, Object *obj) { + if (i < 0 || i >= length) { +#ifdef DEBUG_MEM + abort(); +#else + return obj->initNull(); +#endif + } + return elems[i].fetch(xref, obj); +} + +Object *Array::getNF(int i, Object *obj) { + if (i < 0 || i >= length) { +#ifdef DEBUG_MEM + abort(); +#else + return obj->initNull(); +#endif + } + return elems[i].copy(obj); +} + +GBool Array::getString(int i, GooString *string) +{ + Object obj; + + if (getNF(i, &obj)->isString()) { + string->clear(); + string->append(obj.getString()); + obj.free(); + return gTrue; + } else { + obj.free(); + return gFalse; + } +} diff --git a/poppler/Array.h b/poppler/Array.h new file mode 100644 index 0000000..666a409 --- /dev/null +++ b/poppler/Array.h @@ -0,0 +1,75 @@ +//======================================================================== +// +// Array.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef ARRAY_H +#define ARRAY_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class XRef; + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +class Array { +public: + + // Constructor. + Array(XRef *xrefA); + + // Destructor. + ~Array(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get number of elements. + int getLength() { return length; } + + // Add an element. + void add(Object *elem); + + // Remove an element by position + void remove(int i); + + // Accessors. + Object *get(int i, Object *obj); + Object *getNF(int i, Object *obj); + GBool getString(int i, GooString *string); + +private: + + XRef *xref; // the xref table for this PDF file + Object *elems; // array of elements + int size; // size of array + int length; // number of elements in array + int ref; // reference count +}; + +#endif diff --git a/poppler/ArthurOutputDev.cc b/poppler/ArthurOutputDev.cc new file mode 100644 index 0000000..a1cb89d --- /dev/null +++ b/poppler/ArthurOutputDev.cc @@ -0,0 +1,815 @@ +//======================================================================== +// +// ArthurOutputDev.cc +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Brad Hards +// Copyright (C) 2005-2009, 2011, 2012 Albert Astals Cid +// Copyright (C) 2008, 2010 Pino Toscano +// Copyright (C) 2009, 2011 Carlos Garcia Campos +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2010 Matthias Fauconneau +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include + +#include "goo/gfile.h" +#include "GlobalParams.h" +#include "Error.h" +#include "Object.h" +#include "GfxState.h" +#include "GfxFont.h" +#include "Link.h" +#include "FontEncodingTables.h" +#include +#include "ArthurOutputDev.h" + +#include +#include +//------------------------------------------------------------------------ + +#ifdef HAVE_SPLASH +#include "splash/SplashFontFileID.h" +#include "splash/SplashFontFile.h" +#include "splash/SplashFontEngine.h" +#include "splash/SplashFont.h" +#include "splash/SplashMath.h" +#include "splash/SplashPath.h" +#include "splash/SplashGlyphBitmap.h" +//------------------------------------------------------------------------ +// SplashOutFontFileID +//------------------------------------------------------------------------ + +class SplashOutFontFileID: public SplashFontFileID { +public: + + SplashOutFontFileID(Ref *rA) { r = *rA; } + + ~SplashOutFontFileID() {} + + GBool matches(SplashFontFileID *id) { + return ((SplashOutFontFileID *)id)->r.num == r.num && + ((SplashOutFontFileID *)id)->r.gen == r.gen; + } + +private: + + Ref r; +}; + +#endif + +//------------------------------------------------------------------------ +// ArthurOutputDev +//------------------------------------------------------------------------ + +ArthurOutputDev::ArthurOutputDev(QPainter *painter): + m_painter(painter), + m_fontHinting(NoHinting) +{ + m_currentBrush = QBrush(Qt::SolidPattern); + m_fontEngine = 0; + m_font = 0; +} + +ArthurOutputDev::~ArthurOutputDev() +{ +#ifdef HAVE_SPLASH + delete m_fontEngine; +#endif +} + +void ArthurOutputDev::startDoc(XRef *xrefA) { + xref = xrefA; +#ifdef HAVE_SPLASH + delete m_fontEngine; + + const bool isHintingEnabled = m_fontHinting != NoHinting; + const bool isSlightHinting = m_fontHinting == SlightHinting; + + m_fontEngine = new SplashFontEngine( +#if HAVE_T1LIB_H + globalParams->getEnableT1lib(), +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + globalParams->getEnableFreeType(), + isHintingEnabled, + isSlightHinting, +#endif + m_painter->testRenderHint(QPainter::TextAntialiasing)); +#endif +} + +void ArthurOutputDev::startPage(int pageNum, GfxState *state) +{ + // fill page with white background. + int w = static_cast(state->getPageWidth()); + int h = static_cast(state->getPageHeight()); + QColor fillColour(Qt::white); + QBrush fill(fillColour); + m_painter->save(); + m_painter->setPen(fillColour); + m_painter->setBrush(fill); + m_painter->drawRect(0, 0, w, h); + m_painter->restore(); +} + +void ArthurOutputDev::endPage() { +} + +void ArthurOutputDev::saveState(GfxState *state) +{ + m_painter->save(); +} + +void ArthurOutputDev::restoreState(GfxState *state) +{ + m_painter->restore(); +} + +void ArthurOutputDev::updateAll(GfxState *state) +{ + OutputDev::updateAll(state); + m_needFontUpdate = gTrue; +} + +// This looks wrong - why aren't adjusting the matrix? +void ArthurOutputDev::updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, + double m31, double m32) +{ + updateLineDash(state); + updateLineJoin(state); + updateLineCap(state); + updateLineWidth(state); +} + +void ArthurOutputDev::updateLineDash(GfxState *state) +{ + double *dashPattern; + int dashLength; + double dashStart; + state->getLineDash(&dashPattern, &dashLength, &dashStart); + QVector pattern(dashLength); + for (int i = 0; i < dashLength; ++i) { + pattern[i] = dashPattern[i]; + } + m_currentPen.setDashPattern(pattern); + m_currentPen.setDashOffset(dashStart); + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateFlatness(GfxState *state) +{ + // qDebug() << "updateFlatness"; +} + +void ArthurOutputDev::updateLineJoin(GfxState *state) +{ + switch (state->getLineJoin()) { + case 0: + m_currentPen.setJoinStyle(Qt::MiterJoin); + break; + case 1: + m_currentPen.setJoinStyle(Qt::RoundJoin); + break; + case 2: + m_currentPen.setJoinStyle(Qt::BevelJoin); + break; + } + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateLineCap(GfxState *state) +{ + switch (state->getLineCap()) { + case 0: + m_currentPen.setCapStyle(Qt::FlatCap); + break; + case 1: + m_currentPen.setCapStyle(Qt::RoundCap); + break; + case 2: + m_currentPen.setCapStyle(Qt::SquareCap); + break; + } + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateMiterLimit(GfxState *state) +{ + m_currentPen.setMiterLimit(state->getMiterLimit()); + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateLineWidth(GfxState *state) +{ + m_currentPen.setWidthF(state->getLineWidth()); + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateFillColor(GfxState *state) +{ + GfxRGB rgb; + QColor brushColour = m_currentBrush.color(); + state->getFillRGB(&rgb); + brushColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), brushColour.alphaF()); + m_currentBrush.setColor(brushColour); +} + +void ArthurOutputDev::updateStrokeColor(GfxState *state) +{ + GfxRGB rgb; + QColor penColour = m_currentPen.color(); + state->getStrokeRGB(&rgb); + penColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), penColour.alphaF()); + m_currentPen.setColor(penColour); + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateFillOpacity(GfxState *state) +{ + QColor brushColour= m_currentBrush.color(); + brushColour.setAlphaF(state->getFillOpacity()); + m_currentBrush.setColor(brushColour); +} + +void ArthurOutputDev::updateStrokeOpacity(GfxState *state) +{ + QColor penColour= m_currentPen.color(); + penColour.setAlphaF(state->getStrokeOpacity()); + m_currentPen.setColor(penColour); + m_painter->setPen(m_currentPen); +} + +void ArthurOutputDev::updateFont(GfxState *state) +{ +#ifdef HAVE_SPLASH + GfxFont *gfxFont; + GfxFontLoc *fontLoc; + GfxFontType fontType; + SplashOutFontFileID *id; + SplashFontFile *fontFile; + SplashFontSrc *fontsrc = NULL; + FoFiTrueType *ff; + Object refObj, strObj; + GooString *fileName; + char *tmpBuf; + int tmpBufLen; + int *codeToGID; + double *textMat; + double m11, m12, m21, m22, fontSize; + SplashCoord mat[4]; + int n; + int faceIndex = 0; + SplashCoord matrix[6]; + + m_needFontUpdate = false; + m_font = NULL; + fileName = NULL; + tmpBuf = NULL; + fontLoc = NULL; + + if (!(gfxFont = state->getFont())) { + goto err1; + } + fontType = gfxFont->getType(); + if (fontType == fontType3) { + goto err1; + } + + // check the font file cache + id = new SplashOutFontFileID(gfxFont->getID()); + if ((fontFile = m_fontEngine->getFontFile(id))) { + delete id; + + } else { + + if (!(fontLoc = gfxFont->locateFont(xref, gFalse))) { + error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + + // embedded font + if (fontLoc->locType == gfxFontLocEmbedded) { + // if there is an embedded font, read it to memory + tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen); + if (! tmpBuf) + goto err2; + + // external font + } else { // gfxFontLocExternal + fileName = fontLoc->path; + fontType = fontLoc->fontType; + } + + fontsrc = new SplashFontSrc; + if (fileName) + fontsrc->setFile(fileName, gFalse); + else + fontsrc->setBuf(tmpBuf, tmpBufLen, gTrue); + + // load the font file + switch (fontType) { + case fontType1: + if (!(fontFile = m_fontEngine->loadType1Font( + id, + fontsrc, + (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontType1C: + if (!(fontFile = m_fontEngine->loadType1CFont( + id, + fontsrc, + (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontType1COT: + if (!(fontFile = m_fontEngine->loadOpenTypeT1CFont( + id, + fontsrc, + (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontTrueType: + case fontTrueTypeOT: + if (fileName) + ff = FoFiTrueType::load(fileName->getCString()); + else + ff = FoFiTrueType::make(tmpBuf, tmpBufLen); + if (ff) { + codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff); + n = 256; + delete ff; + } else { + codeToGID = NULL; + n = 0; + } + if (!(fontFile = m_fontEngine->loadTrueTypeFont( + id, + fontsrc, + codeToGID, n))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType0: + case fontCIDType0C: + if (!(fontFile = m_fontEngine->loadCIDFont( + id, + fontsrc))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType0COT: + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + codeToGID = (int *)gmallocn(n, sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(int)); + } else { + codeToGID = NULL; + n = 0; + } + if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont( + id, + fontsrc, + codeToGID, n))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType2: + case fontCIDType2OT: + codeToGID = NULL; + n = 0; + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (n) { + codeToGID = (int *)gmallocn(n, sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(Gushort)); + } + } else { + if (fileName) + ff = FoFiTrueType::load(fileName->getCString()); + else + ff = FoFiTrueType::make(tmpBuf, tmpBufLen); + if (! ff) + goto err2; + codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n); + delete ff; + } + if (!(fontFile = m_fontEngine->loadTrueTypeFont( + id, + fontsrc, + codeToGID, n, faceIndex))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + default: + // this shouldn't happen + goto err2; + } + } + + // get the font matrix + textMat = state->getTextMat(); + fontSize = state->getFontSize(); + m11 = textMat[0] * fontSize * state->getHorizScaling(); + m12 = textMat[1] * fontSize * state->getHorizScaling(); + m21 = textMat[2] * fontSize; + m22 = textMat[3] * fontSize; + + { + QMatrix painterMatrix = m_painter->worldMatrix(); + matrix[0] = painterMatrix.m11(); + matrix[1] = painterMatrix.m12(); + matrix[2] = painterMatrix.m21(); + matrix[3] = painterMatrix.m22(); + matrix[4] = painterMatrix.dx(); + matrix[5] = painterMatrix.dy(); + } + + // create the scaled font + mat[0] = m11; mat[1] = -m12; + mat[2] = m21; mat[3] = -m22; + m_font = m_fontEngine->getFont(fontFile, mat, matrix); + + delete fontLoc; + if (fontsrc && !fontsrc->isFile) + fontsrc->unref(); + return; + + err2: + delete id; + delete fontLoc; + err1: + if (fontsrc && !fontsrc->isFile) + fontsrc->unref(); + return; +#endif +} + +static QPainterPath convertPath(GfxState *state, GfxPath *path, Qt::FillRule fillRule) +{ + GfxSubpath *subpath; + double x1, y1, x2, y2, x3, y3; + int i, j; + + QPainterPath qPath; + qPath.setFillRule(fillRule); + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + if (subpath->getNumPoints() > 0) { + state->transform(subpath->getX(0), subpath->getY(0), &x1, &y1); + qPath.moveTo(x1, y1); + j = 1; + while (j < subpath->getNumPoints()) { + if (subpath->getCurve(j)) { + state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1); + state->transform(subpath->getX(j+1), subpath->getY(j+1), &x2, &y2); + state->transform(subpath->getX(j+2), subpath->getY(j+2), &x3, &y3); + qPath.cubicTo( x1, y1, x2, y2, x3, y3); + j += 3; + } else { + state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1); + qPath.lineTo(x1, y1); + ++j; + } + } + if (subpath->isClosed()) { + qPath.closeSubpath(); + } + } + } + return qPath; +} + +void ArthurOutputDev::stroke(GfxState *state) +{ + m_painter->strokePath( convertPath( state, state->getPath(), Qt::OddEvenFill ), m_currentPen ); +} + +void ArthurOutputDev::fill(GfxState *state) +{ + m_painter->fillPath( convertPath( state, state->getPath(), Qt::WindingFill ), m_currentBrush ); +} + +void ArthurOutputDev::eoFill(GfxState *state) +{ + m_painter->fillPath( convertPath( state, state->getPath(), Qt::OddEvenFill ), m_currentBrush ); +} + +void ArthurOutputDev::clip(GfxState *state) +{ + m_painter->setClipPath(convertPath( state, state->getPath(), Qt::WindingFill ) ); +} + +void ArthurOutputDev::eoClip(GfxState *state) +{ + m_painter->setClipPath(convertPath( state, state->getPath(), Qt::OddEvenFill ) ); +} + +void ArthurOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) { +#ifdef HAVE_SPLASH + double x1, y1; + double x2, y2; +// SplashPath *path; + int render; + + if (m_needFontUpdate) { + updateFont(state); + } + if (!m_font) { + return; + } + + // check for invisible text -- this is used by Acrobat Capture + render = state->getRender(); + if (render == 3) { + return; + } + + x -= originX; + y -= originY; + + // fill + if (!(render & 1)) { + SplashPath * fontPath; + fontPath = m_font->getGlyphPath(code); + if (fontPath) { + QPainterPath qPath; + qPath.setFillRule(Qt::WindingFill); + for (int i = 0; i < fontPath->length; ++i) { + if (fontPath->flags[i] & splashPathFirst) { + state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); + qPath.moveTo(x1,y1); + } else if (fontPath->flags[i] & splashPathCurve) { + state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); + state->transform(fontPath->pts[i+1].x+x, -fontPath->pts[i+1].y+y, &x2, &y2); + qPath.quadTo(x1,y1,x2,y2); + ++i; + } + // FIXME fix this + // else if (fontPath->flags[i] & splashPathArcCW) { + // qDebug() << "Need to implement arc"; + // } + else { + state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); + qPath.lineTo(x1,y1); + } + if (fontPath->flags[i] & splashPathLast) { + qPath.closeSubpath(); + } + } + GfxRGB rgb; + QColor brushColour = m_currentBrush.color(); + state->getFillRGB(&rgb); + brushColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getFillOpacity()); + m_painter->setBrush(brushColour); + QColor penColour = m_currentPen.color(); + state->getStrokeRGB(&rgb); + penColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getStrokeOpacity()); + m_painter->setPen(penColour); + m_painter->drawPath( qPath ); + delete fontPath; + } + } + + // stroke + if ((render & 3) == 1 || (render & 3) == 2) { + qDebug() << "no stroke"; + /* + if ((path = m_font->getGlyphPath(code))) { + path->offset((SplashCoord)x1, (SplashCoord)y1); + splash->stroke(path); + delete path; + } + */ + } + + // clip + if (render & 4) { + qDebug() << "no clip"; + /* + path = m_font->getGlyphPath(code); + path->offset((SplashCoord)x1, (SplashCoord)y1); + if (textClipPath) { + textClipPath->append(path); + delete path; + } else { + textClipPath = path; + } + */ + } +#endif +} + +GBool ArthurOutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) +{ + return gFalse; +} + +void ArthurOutputDev::endType3Char(GfxState *state) +{ +} + +void ArthurOutputDev::type3D0(GfxState *state, double wx, double wy) +{ +} + +void ArthurOutputDev::type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury) +{ +} + +void ArthurOutputDev::endTextObject(GfxState *state) +{ +} + + +void ArthurOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) +{ + qDebug() << "drawImageMask"; +#if 0 + unsigned char *buffer; + unsigned char *dest; + cairo_surface_t *image; + cairo_pattern_t *pattern; + int x, y; + ImageStream *imgStr; + Guchar *pix; + double *ctm; + cairo_matrix_t matrix; + int invert_bit; + int row_stride; + + row_stride = (width + 3) & ~3; + buffer = (unsigned char *) malloc (height * row_stride); + if (buffer == NULL) { + error(-1, "Unable to allocate memory for image."); + return; + } + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, 1, 1); + imgStr->reset(); + + invert_bit = invert ? 1 : 0; + + for (y = 0; y < height; y++) { + pix = imgStr->getLine(); + dest = buffer + y * row_stride; + for (x = 0; x < width; x++) { + + if (pix[x] ^ invert_bit) + *dest++ = 0; + else + *dest++ = 255; + } + } + + image = cairo_image_surface_create_for_data (buffer, CAIRO_FORMAT_A8, + width, height, row_stride); + if (image == NULL) + return; + pattern = cairo_pattern_create_for_surface (image); + if (pattern == NULL) + return; + + ctm = state->getCTM(); + LOG (printf ("drawImageMask %dx%d, matrix: %f, %f, %f, %f, %f, %f\n", + width, height, ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5])); + matrix.xx = ctm[0] / width; + matrix.xy = -ctm[2] / height; + matrix.yx = ctm[1] / width; + matrix.yy = -ctm[3] / height; + matrix.x0 = ctm[2] + ctm[4]; + matrix.y0 = ctm[3] + ctm[5]; + cairo_matrix_invert (&matrix); + cairo_pattern_set_matrix (pattern, &matrix); + + cairo_pattern_set_filter (pattern, CAIRO_FILTER_BEST); + /* FIXME: Doesn't the image mask support any colorspace? */ + cairo_set_source_rgb (cairo, fill_color.r, fill_color.g, fill_color.b); + cairo_mask (cairo, pattern); + + cairo_pattern_destroy (pattern); + cairo_surface_destroy (image); + free (buffer); + imgStr->close (); + delete imgStr; +#endif +} + +//TODO: lots more work here. +void ArthurOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) +{ + unsigned int *data; + unsigned int *line; + int x, y; + ImageStream *imgStr; + Guchar *pix; + int i; + double *ctm; + QMatrix matrix; + QImage image; + int stride; + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + + image = QImage(width, height, QImage::Format_ARGB32); + data = (unsigned int *)image.bits(); + stride = image.bytesPerLine()/4; + for (y = 0; y < height; y++) { + pix = imgStr->getLine(); + line = data+y*stride; + colorMap->getRGBLine(pix, line, width); + + if (maskColors) { + for (x = 0; x < width; x++) { + for (i = 0; i < colorMap->getNumPixelComps(); ++i) { + if (pix[i] < maskColors[2*i] * 255|| + pix[i] > maskColors[2*i+1] * 255) { + *line = *line | 0xff000000; + break; + } + } + pix += colorMap->getNumPixelComps(); + line++; + } + } else { + for (x = 0; x < width; x++) { *line = *line | 0xff000000; line++; } + } + } + + ctm = state->getCTM(); + matrix.setMatrix(ctm[0] / width, ctm[1] / width, -ctm[2] / height, -ctm[3] / height, ctm[2] + ctm[4], ctm[3] + ctm[5]); + + m_painter->setMatrix(matrix, true); + m_painter->drawImage( QPoint(0,0), image ); + delete imgStr; + +} diff --git a/poppler/ArthurOutputDev.h b/poppler/ArthurOutputDev.h new file mode 100644 index 0000000..ed631a0 --- /dev/null +++ b/poppler/ArthurOutputDev.h @@ -0,0 +1,169 @@ +//======================================================================== +// +// ArthurOutputDev.h +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Brad Hards +// Copyright (C) 2005 Albert Astals Cid +// Copyright (C) 2009, 2011 Carlos Garcia Campos +// Copyright (C) 2010 Pino Toscano +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef ARTHUROUTPUTDEV_H +#define ARTHUROUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "OutputDev.h" +#include "GfxState.h" + +#include + +class GfxState; +class GfxPath; +class Gfx8BitFont; +struct GfxRGB; + +class SplashFont; +class SplashFontEngine; +struct SplashGlyphBitmap; + +//------------------------------------------------------------------------ +// ArthurOutputDev - Qt 4 QPainter renderer +//------------------------------------------------------------------------ + +class ArthurOutputDev: public OutputDev { +public: + /** + * Describes how fonts are distorted (aka hinted) to fit the pixel grid. + * More hinting means sharper edges and less adherence to the true letter shapes. + */ + enum FontHinting { + NoHinting = 0, ///< Font shapes are left unchanged + SlightHinting, ///< Font shapes are distorted vertically only + FullHinting ///< Font shapes are distorted horizontally and vertically + }; + + // Constructor. + ArthurOutputDev(QPainter *painter ); + + // Destructor. + virtual ~ArthurOutputDev(); + + void setFontHinting(FontHinting hinting) { m_fontHinting = hinting; } + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- save/restore graphics state + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateFillOpacity(GfxState *state); + virtual void updateStrokeOpacity(GfxState *state); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + + //----- path clipping + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + + //----- text drawing + // virtual void drawString(GfxState *state, GooString *s); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + virtual void endTextObject(GfxState *state); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + + //----- Type 3 font operators + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury); + + //----- special access + + // Called to indicate that a new PDF document has been loaded. + void startDoc(XRef *xrefA); + + GBool isReverseVideo() { return gFalse; } + +private: + QPainter *m_painter; + FontHinting m_fontHinting; + QFont m_currentFont; + QPen m_currentPen; + QBrush m_currentBrush; + GBool m_needFontUpdate; // set when the font needs to be updated + SplashFontEngine *m_fontEngine; + SplashFont *m_font; // current font + XRef *xref; // xref table for current document +}; + +#endif diff --git a/poppler/BuiltinFont.cc b/poppler/BuiltinFont.cc new file mode 100644 index 0000000..20a297d --- /dev/null +++ b/poppler/BuiltinFont.cc @@ -0,0 +1,65 @@ +//======================================================================== +// +// BuiltinFont.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "FontEncodingTables.h" +#include "BuiltinFont.h" + +//------------------------------------------------------------------------ + +BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) { + int i, h; + + size = sizeA; + tab = (BuiltinFontWidth **)gmallocn(size, sizeof(BuiltinFontWidth *)); + for (i = 0; i < size; ++i) { + tab[i] = NULL; + } + for (i = 0; i < sizeA; ++i) { + h = hash(widths[i].name); + widths[i].next = tab[h]; + tab[h] = &widths[i]; + } +} + +BuiltinFontWidths::~BuiltinFontWidths() { + gfree(tab); +} + +GBool BuiltinFontWidths::getWidth(const char *name, Gushort *width) { + int h; + BuiltinFontWidth *p; + + h = hash(name); + for (p = tab[h]; p; p = p->next) { + if (!strcmp(p->name, name)) { + *width = p->width; + return gTrue; + } + } + return gFalse; +} + +int BuiltinFontWidths::hash(const char *name) { + const char *p; + unsigned int h; + + h = 0; + for (p = name; *p; ++p) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} diff --git a/poppler/BuiltinFont.h b/poppler/BuiltinFont.h new file mode 100644 index 0000000..bbdd055 --- /dev/null +++ b/poppler/BuiltinFont.h @@ -0,0 +1,55 @@ +//======================================================================== +// +// BuiltinFont.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef BUILTINFONT_H +#define BUILTINFONT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +struct BuiltinFont; +class BuiltinFontWidths; + +//------------------------------------------------------------------------ + +struct BuiltinFont { + const char *name; + const char **defaultBaseEnc; + short ascent; + short descent; + short bbox[4]; + BuiltinFontWidths *widths; +}; + +//------------------------------------------------------------------------ + +struct BuiltinFontWidth { + const char *name; + Gushort width; + BuiltinFontWidth *next; +}; + +class BuiltinFontWidths { +public: + + BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA); + ~BuiltinFontWidths(); + GBool getWidth(const char *name, Gushort *width); + +private: + + int hash(const char *name); + + BuiltinFontWidth **tab; + int size; +}; + +#endif diff --git a/poppler/BuiltinFontTables.cc b/poppler/BuiltinFontTables.cc new file mode 100644 index 0000000..5115b7b --- /dev/null +++ b/poppler/BuiltinFontTables.cc @@ -0,0 +1,4284 @@ +//======================================================================== +// +// BuiltinFontTables.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include +#include +#include "FontEncodingTables.h" +#include "BuiltinFontTables.h" + +static BuiltinFontWidth courierWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "L", 600, NULL }, + { "backslash", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "equal", 600, NULL }, + { "question", 600, NULL }, + { "X", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "hyphen", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "five", 600, NULL }, + { "nine", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "zero", 600, NULL }, + { "multiply", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Racute", 600, NULL }, + { "Ograve", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "scedilla", 600, NULL }, + { "Oacute", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "ampersand", 600, NULL }, + { "Iacute", 600, NULL }, + { "lacute", 600, NULL }, + { "igrave", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "iacute", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "seven", 600, NULL }, + { "Amacron", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "braceright", 600, NULL }, + { "icircumflex", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth courierBoldWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth courierBoldObliqueWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth courierObliqueWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth helveticaWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 278, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 556, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 299, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 222, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 556, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 556, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 500, NULL }, + { "d", 556, NULL }, + { "e", 556, NULL }, + { "f", 278, NULL }, + { "g", 556, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 222, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 222, NULL }, + { "k", 500, NULL }, + { "l", 222, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 556, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 333, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 500, NULL }, + { "OE", 1000, NULL }, + { "t", 278, NULL }, + { "divide", 584, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 355, NULL }, + { "gcommaaccent", 556, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 500, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 556, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 500, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 222, NULL }, + { "quotedblleft", 333, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 191, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 556, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 278, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 222, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 556, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 556, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 1015, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 556, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 334, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 500, NULL }, + { "ccedilla", 500, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 500, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 556, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 453, NULL }, + { "Aring", 667, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 537, NULL }, + { "dcaron", 643, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 556, NULL }, + { "oacute", 556, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 317, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 278, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 667, NULL }, + { "igrave", 278, NULL }, + { "lacute", 222, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 222, NULL }, + { "lcommaaccent", 222, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 556, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 333, NULL }, + { "ncaron", 556, NULL }, + { "florin", 556, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 667, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 500, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 334, NULL }, + { "quotedblright", 333, NULL }, + { "amacron", 556, NULL }, + { "sacute", 500, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 260, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 278, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 260, NULL }, + { "quoteleft", 222, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth helveticaBoldWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 333, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 611, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 611, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 400, NULL }, + { "A", 722, NULL }, + { "B", 722, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 556, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 611, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 611, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 611, NULL }, + { "c", 556, NULL }, + { "d", 611, NULL }, + { "e", 556, NULL }, + { "f", 333, NULL }, + { "g", 611, NULL }, + { "bullet", 350, NULL }, + { "h", 611, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 278, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 889, NULL }, + { "n", 611, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 611, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 611, NULL }, + { "q", 611, NULL }, + { "uhungarumlaut", 611, NULL }, + { "r", 389, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 556, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 584, NULL }, + { "u", 611, NULL }, + { "Ccaron", 722, NULL }, + { "v", 556, NULL }, + { "w", 778, NULL }, + { "x", 556, NULL }, + { "y", 556, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 474, NULL }, + { "gcommaaccent", 611, NULL }, + { "mu", 611, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 556, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 611, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 611, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 556, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 238, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 611, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 611, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 278, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 611, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 611, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 611, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 611, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 556, NULL }, + { "tilde", 333, NULL }, + { "dbldaggerumlaut", 556, NULL }, + { "at", 975, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 611, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 611, NULL }, + { "braceleft", 389, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 556, NULL }, + { "ccedilla", 556, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 611, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 556, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 611, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 611, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 556, NULL }, + { "dcaron", 743, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 611, NULL }, + { "oacute", 611, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 389, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 584, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 611, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 722, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 611, NULL }, + { "quotesinglbase", 278, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 611, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 611, NULL }, + { "florin", 556, NULL }, + { "yacute", 556, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 611, NULL }, + { "fl", 611, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 722, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 556, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 389, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 556, NULL }, + { "sacute", 556, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 280, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 280, NULL }, + { "quoteleft", 278, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth helveticaBoldObliqueWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 333, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 611, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 611, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 400, NULL }, + { "A", 722, NULL }, + { "B", 722, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 556, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 611, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 611, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 611, NULL }, + { "c", 556, NULL }, + { "d", 611, NULL }, + { "e", 556, NULL }, + { "f", 333, NULL }, + { "g", 611, NULL }, + { "bullet", 350, NULL }, + { "h", 611, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 278, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 889, NULL }, + { "n", 611, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 611, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 611, NULL }, + { "q", 611, NULL }, + { "uhungarumlaut", 611, NULL }, + { "r", 389, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 556, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 584, NULL }, + { "u", 611, NULL }, + { "Ccaron", 722, NULL }, + { "v", 556, NULL }, + { "w", 778, NULL }, + { "x", 556, NULL }, + { "y", 556, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 474, NULL }, + { "gcommaaccent", 611, NULL }, + { "mu", 611, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 556, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 611, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 611, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 556, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 238, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 611, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 611, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 278, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 611, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 611, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 611, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 611, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 556, NULL }, + { "tilde", 333, NULL }, + { "at", 975, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 611, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 611, NULL }, + { "braceleft", 389, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 556, NULL }, + { "ccedilla", 556, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 611, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 556, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 611, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 611, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 556, NULL }, + { "dcaron", 743, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 611, NULL }, + { "oacute", 611, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 389, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 584, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 611, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 722, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 611, NULL }, + { "quotesinglbase", 278, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 611, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 611, NULL }, + { "florin", 556, NULL }, + { "yacute", 556, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 611, NULL }, + { "fl", 611, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 722, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 556, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 389, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 556, NULL }, + { "sacute", 556, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 280, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 280, NULL }, + { "quoteleft", 278, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth helveticaObliqueWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 278, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 556, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 299, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 222, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 556, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 556, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 500, NULL }, + { "d", 556, NULL }, + { "e", 556, NULL }, + { "f", 278, NULL }, + { "g", 556, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 222, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 222, NULL }, + { "k", 500, NULL }, + { "l", 222, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 556, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 333, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 500, NULL }, + { "OE", 1000, NULL }, + { "t", 278, NULL }, + { "divide", 584, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 355, NULL }, + { "gcommaaccent", 556, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 500, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 556, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 500, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 222, NULL }, + { "quotedblleft", 333, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 191, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 556, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 278, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 222, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 556, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 556, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 1015, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 556, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 334, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 500, NULL }, + { "ccedilla", 500, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 500, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 556, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 453, NULL }, + { "Aring", 667, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 537, NULL }, + { "dcaron", 643, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 556, NULL }, + { "oacute", 556, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 317, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 278, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 667, NULL }, + { "igrave", 278, NULL }, + { "lacute", 222, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 222, NULL }, + { "lcommaaccent", 222, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 556, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 333, NULL }, + { "ncaron", 556, NULL }, + { "florin", 556, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 667, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 500, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 334, NULL }, + { "quotedblright", 333, NULL }, + { "amacron", 556, NULL }, + { "sacute", 500, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 260, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 278, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 260, NULL }, + { "quoteleft", 222, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth symbolWidthsTab[] = { + { "bracketleftex", 384, NULL }, + { "alpha", 631, NULL }, + { "union", 768, NULL }, + { "infinity", 713, NULL }, + { "comma", 250, NULL }, + { "copyrightsans", 790, NULL }, + { "plusminus", 549, NULL }, + { "arrowup", 603, NULL }, + { "apple", 790, NULL }, + { "parenleftbt", 384, NULL }, + { "notelement", 713, NULL }, + { "colon", 278, NULL }, + { "beta", 549, NULL }, + { "braceleftbt", 494, NULL }, + { "Lambda", 686, NULL }, + { "Phi", 763, NULL }, + { "minus", 549, NULL }, + { "space", 250, NULL }, + { "Sigma", 592, NULL }, + { "approxequal", 549, NULL }, + { "minute", 247, NULL }, + { "circleplus", 768, NULL }, + { "Omicron", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lambda", 549, NULL }, + { "phi", 521, NULL }, + { "aleph", 823, NULL }, + { "Tau", 611, NULL }, + { "spade", 753, NULL }, + { "logicaland", 603, NULL }, + { "sigma", 603, NULL }, + { "propersuperset", 713, NULL }, + { "omicron", 549, NULL }, + { "question", 444, NULL }, + { "equal", 549, NULL }, + { "Epsilon", 611, NULL }, + { "emptyset", 823, NULL }, + { "diamond", 753, NULL }, + { "four", 500, NULL }, + { "Mu", 889, NULL }, + { "parenlefttp", 384, NULL }, + { "club", 753, NULL }, + { "bullet", 460, NULL }, + { "Omega", 768, NULL }, + { "tau", 439, NULL }, + { "Upsilon", 690, NULL }, + { "bracelefttp", 494, NULL }, + { "heart", 753, NULL }, + { "divide", 549, NULL }, + { "epsilon", 439, NULL }, + { "logicalor", 603, NULL }, + { "parenleftex", 384, NULL }, + { "greaterequal", 549, NULL }, + { "mu", 576, NULL }, + { "Nu", 722, NULL }, + { "therefore", 863, NULL }, + { "notsubset", 713, NULL }, + { "omega", 686, NULL }, + { "semicolon", 278, NULL }, + { "element", 713, NULL }, + { "upsilon", 576, NULL }, + { "existential", 549, NULL }, + { "integralbt", 686, NULL }, + { "lessequal", 549, NULL }, + { "phi1", 603, NULL }, + { "lozenge", 494, NULL }, + { "trademarkserif", 890, NULL }, + { "parenright", 333, NULL }, + { "reflexsuperset", 713, NULL }, + { "sigma1", 439, NULL }, + { "nu", 521, NULL }, + { "Gamma", 603, NULL }, + { "angleright", 329, NULL }, + { "ellipsis", 1000, NULL }, + { "Rho", 556, NULL }, + { "parenrightbt", 384, NULL }, + { "radicalex", 500, NULL }, + { "eight", 500, NULL }, + { "angleleft", 329, NULL }, + { "arrowdbldown", 603, NULL }, + { "congruent", 549, NULL }, + { "Theta", 741, NULL }, + { "intersection", 768, NULL }, + { "Pi", 768, NULL }, + { "slash", 278, NULL }, + { "registerserif", 790, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "gamma", 411, NULL }, + { "bracketleft", 333, NULL }, + { "rho", 549, NULL }, + { "circlemultiply", 768, NULL }, + { "Chi", 722, NULL }, + { "theta", 521, NULL }, + { "pi", 549, NULL }, + { "integraltp", 686, NULL }, + { "Eta", 722, NULL }, + { "product", 823, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "propersubset", 713, NULL }, + { "bracketrightbt", 384, NULL }, + { "trademarksans", 786, NULL }, + { "dotmath", 250, NULL }, + { "integralex", 686, NULL }, + { "chi", 549, NULL }, + { "parenrighttp", 384, NULL }, + { "eta", 603, NULL }, + { "underscore", 500, NULL }, + { "Euro", 750, NULL }, + { "multiply", 549, NULL }, + { "zero", 500, NULL }, + { "partialdiff", 494, NULL }, + { "angle", 768, NULL }, + { "arrowdblleft", 987, NULL }, + { "braceleft", 480, NULL }, + { "parenrightex", 384, NULL }, + { "Rfraktur", 795, NULL }, + { "Zeta", 611, NULL }, + { "braceex", 494, NULL }, + { "arrowdblup", 603, NULL }, + { "arrowdown", 603, NULL }, + { "Ifraktur", 686, NULL }, + { "degree", 400, NULL }, + { "Iota", 333, NULL }, + { "perpendicular", 658, NULL }, + { "radical", 549, NULL }, + { "asteriskmath", 500, NULL }, + { "percent", 833, NULL }, + { "zeta", 494, NULL }, + { "six", 500, NULL }, + { "two", 500, NULL }, + { "weierstrass", 987, NULL }, + { "summation", 713, NULL }, + { "bracketrighttp", 384, NULL }, + { "carriagereturn", 658, NULL }, + { "suchthat", 439, NULL }, + { "arrowvertex", 603, NULL }, + { "Delta", 612, NULL }, + { "iota", 329, NULL }, + { "arrowhorizex", 1000, NULL }, + { "bracketrightex", 384, NULL }, + { "bracketright", 333, NULL }, + { "ampersand", 778, NULL }, + { "plus", 549, NULL }, + { "proportional", 713, NULL }, + { "delta", 494, NULL }, + { "copyrightserif", 790, NULL }, + { "bracerightmid", 494, NULL }, + { "arrowleft", 987, NULL }, + { "second", 411, NULL }, + { "arrowdblboth", 1042, NULL }, + { "florin", 500, NULL }, + { "Psi", 795, NULL }, + { "bracerightbt", 494, NULL }, + { "bracketleftbt", 384, NULL }, + { "seven", 500, NULL }, + { "braceleftmid", 494, NULL }, + { "notequal", 549, NULL }, + { "psi", 686, NULL }, + { "equivalence", 549, NULL }, + { "universal", 713, NULL }, + { "arrowdblright", 987, NULL }, + { "braceright", 480, NULL }, + { "reflexsubset", 713, NULL }, + { "Xi", 645, NULL }, + { "theta1", 631, NULL }, + { "logicalnot", 713, NULL }, + { "Kappa", 722, NULL }, + { "similar", 549, NULL }, + { "bar", 200, NULL }, + { "fraction", 167, NULL }, + { "less", 549, NULL }, + { "registersans", 790, NULL }, + { "omega1", 713, NULL }, + { "exclam", 333, NULL }, + { "Upsilon1", 620, NULL }, + { "bracerighttp", 494, NULL }, + { "xi", 493, NULL }, + { "period", 250, NULL }, + { "Alpha", 722, NULL }, + { "arrowright", 987, NULL }, + { "greater", 549, NULL }, + { "bracketlefttp", 384, NULL }, + { "kappa", 549, NULL }, + { "gradient", 713, NULL }, + { "integral", 274, NULL }, + { "arrowboth", 1042, NULL }, + { "Beta", 667, NULL } +}; + +static BuiltinFontWidth timesBoldWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 444, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 667, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 570, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 520, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 667, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 570, NULL }, + { "Iogonek", 389, NULL }, + { "zacute", 444, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 394, NULL }, + { "A", 722, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 750, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 778, NULL }, + { "I", 389, NULL }, + { "J", 500, NULL }, + { "K", 778, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 667, NULL }, + { "periodcentered", 250, NULL }, + { "M", 944, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 667, NULL }, + { "O", 778, NULL }, + { "P", 611, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 667, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 722, NULL }, + { "W", 1000, NULL }, + { "X", 722, NULL }, + { "question", 500, NULL }, + { "equal", 570, NULL }, + { "Y", 722, NULL }, + { "Z", 667, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 444, NULL }, + { "d", 556, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 500, NULL }, + { "j", 333, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 300, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 444, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 570, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 444, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 389, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 555, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 667, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 278, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 747, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 389, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 722, NULL }, + { "umacron", 556, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 722, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 667, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 930, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 570, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 394, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 444, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 444, NULL }, + { "Tcaron", 667, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 747, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 1000, NULL }, + { "six", 500, NULL }, + { "paragraph", 540, NULL }, + { "dcaron", 672, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 389, NULL }, + { "Lacute", 667, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 667, NULL }, + { "tcaron", 416, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 581, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 389, NULL }, + { "ampersand", 833, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 570, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 722, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 556, NULL }, + { "florin", 500, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 389, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 556, NULL }, + { "Amacron", 722, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 330, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 389, NULL }, + { "rcommaaccent", 444, NULL }, + { "Zdotaccent", 667, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 394, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 570, NULL }, + { "zdotaccent", 444, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 220, NULL }, + { "fraction", 167, NULL }, + { "less", 570, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 778, NULL }, + { "greater", 570, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 220, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth timesBoldItalicWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 570, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 570, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 606, NULL }, + { "Iogonek", 389, NULL }, + { "zacute", 389, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 382, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 667, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 750, NULL }, + { "F", 667, NULL }, + { "G", 722, NULL }, + { "H", 778, NULL }, + { "I", 389, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 250, NULL }, + { "M", 889, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 722, NULL }, + { "P", 611, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 667, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 667, NULL }, + { "W", 889, NULL }, + { "X", 667, NULL }, + { "question", 500, NULL }, + { "equal", 570, NULL }, + { "Y", 611, NULL }, + { "Z", 611, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 500, NULL }, + { "l", 278, NULL }, + { "m", 778, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 266, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 389, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 944, NULL }, + { "t", 278, NULL }, + { "divide", 570, NULL }, + { "u", 556, NULL }, + { "Ccaron", 667, NULL }, + { "v", 444, NULL }, + { "w", 667, NULL }, + { "x", 500, NULL }, + { "y", 444, NULL }, + { "z", 389, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 389, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 555, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 576, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 944, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 278, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 389, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 747, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 389, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 611, NULL }, + { "umacron", 556, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 722, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 444, NULL }, + { "tilde", 333, NULL }, + { "at", 832, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 570, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 667, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 348, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 389, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 747, NULL }, + { "radical", 549, NULL }, + { "Aring", 667, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 500, NULL }, + { "dcaron", 608, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 389, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 366, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 570, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 389, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 570, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 611, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 556, NULL }, + { "florin", 500, NULL }, + { "yacute", 444, NULL }, + { "Rcommaaccent", 667, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 389, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 667, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 300, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 389, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 348, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 606, NULL }, + { "zdotaccent", 389, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 220, NULL }, + { "fraction", 167, NULL }, + { "less", 570, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 389, NULL }, + { "period", 250, NULL }, + { "Rcaron", 667, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 570, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 220, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth timesItalicWidthsTab[] = { + { "Ntilde", 667, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 444, NULL }, + { "Ncommaaccent", 667, NULL }, + { "Zacute", 556, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 675, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 541, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 500, NULL }, + { "Aogonek", 611, NULL }, + { "ncommaaccent", 500, NULL }, + { "minus", 675, NULL }, + { "Iogonek", 333, NULL }, + { "zacute", 389, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 889, NULL }, + { "Agrave", 611, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 300, NULL }, + { "A", 611, NULL }, + { "B", 611, NULL }, + { "C", 667, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 611, NULL }, + { "onequarter", 750, NULL }, + { "F", 611, NULL }, + { "G", 722, NULL }, + { "H", 722, NULL }, + { "I", 333, NULL }, + { "J", 444, NULL }, + { "K", 667, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 250, NULL }, + { "M", 833, NULL }, + { "N", 667, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 556, NULL }, + { "O", 722, NULL }, + { "P", 611, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 611, NULL }, + { "Aacute", 611, NULL }, + { "caron", 333, NULL }, + { "S", 500, NULL }, + { "T", 556, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 611, NULL }, + { "W", 833, NULL }, + { "X", 611, NULL }, + { "question", 500, NULL }, + { "equal", 675, NULL }, + { "Y", 556, NULL }, + { "Z", 556, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 278, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 500, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 444, NULL }, + { "l", 278, NULL }, + { "m", 722, NULL }, + { "n", 500, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 276, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 500, NULL }, + { "r", 389, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 944, NULL }, + { "t", 278, NULL }, + { "divide", 675, NULL }, + { "u", 500, NULL }, + { "Ccaron", 667, NULL }, + { "v", 444, NULL }, + { "w", 667, NULL }, + { "x", 444, NULL }, + { "y", 444, NULL }, + { "z", 389, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 333, NULL }, + { "Nacute", 667, NULL }, + { "quotedbl", 420, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 500, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 500, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 611, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 980, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 500, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 611, NULL }, + { "ellipsis", 889, NULL }, + { "scaron", 389, NULL }, + { "AE", 889, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 556, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 214, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 389, NULL }, + { "endash", 500, NULL }, + { "oe", 667, NULL }, + { "Abreve", 611, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 611, NULL }, + { "copyright", 760, NULL }, + { "Egrave", 611, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 611, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 333, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 500, NULL }, + { "bracketleft", 389, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 556, NULL }, + { "umacron", 500, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 611, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 667, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 500, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 500, NULL }, + { "Zcaron", 556, NULL }, + { "Scommaaccent", 500, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 444, NULL }, + { "tilde", 333, NULL }, + { "at", 920, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 675, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 500, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 611, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 500, NULL }, + { "braceleft", 400, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 389, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 556, NULL }, + { "Eogonek", 611, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 760, NULL }, + { "radical", 453, NULL }, + { "Aring", 611, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 523, NULL }, + { "dcaron", 544, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 333, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 300, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 422, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 500, NULL }, + { "bracketright", 389, NULL }, + { "Iacute", 333, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 667, NULL }, + { "plus", 675, NULL }, + { "uring", 500, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 556, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 556, NULL }, + { "ncaron", 500, NULL }, + { "florin", 500, NULL }, + { "yacute", 444, NULL }, + { "Rcommaaccent", 611, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 611, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 333, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 611, NULL }, + { "seven", 500, NULL }, + { "Sacute", 500, NULL }, + { "ordmasculine", 310, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 333, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 556, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 611, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 400, NULL }, + { "quotedblright", 556, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 675, NULL }, + { "zdotaccent", 389, NULL }, + { "Atilde", 611, NULL }, + { "breve", 333, NULL }, + { "bar", 275, NULL }, + { "fraction", 167, NULL }, + { "less", 675, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 611, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 675, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 275, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 611, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth timesRomanWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 564, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 541, NULL }, + { "colon", 278, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 500, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 500, NULL }, + { "minus", 564, NULL }, + { "Iogonek", 333, NULL }, + { "zacute", 444, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 444, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 344, NULL }, + { "A", 722, NULL }, + { "B", 667, NULL }, + { "C", 667, NULL }, + { "aogonek", 444, NULL }, + { "D", 722, NULL }, + { "E", 611, NULL }, + { "onequarter", 750, NULL }, + { "F", 556, NULL }, + { "G", 722, NULL }, + { "H", 722, NULL }, + { "I", 333, NULL }, + { "J", 389, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 250, NULL }, + { "M", 889, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 722, NULL }, + { "P", 556, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 667, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 444, NULL }, + { "V", 722, NULL }, + { "W", 944, NULL }, + { "X", 722, NULL }, + { "question", 444, NULL }, + { "equal", 564, NULL }, + { "Y", 722, NULL }, + { "Z", 611, NULL }, + { "four", 500, NULL }, + { "a", 444, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 500, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 500, NULL }, + { "l", 278, NULL }, + { "m", 778, NULL }, + { "n", 500, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 276, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 500, NULL }, + { "r", 333, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 444, NULL }, + { "s", 389, NULL }, + { "OE", 889, NULL }, + { "t", 278, NULL }, + { "divide", 564, NULL }, + { "u", 500, NULL }, + { "Ccaron", 667, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 444, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 333, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 408, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 500, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 611, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 980, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 500, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 611, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 889, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 444, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 180, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 760, NULL }, + { "Egrave", 611, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 611, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 333, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 500, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 722, NULL }, + { "umacron", 500, NULL }, + { "abreve", 444, NULL }, + { "Eacute", 611, NULL }, + { "adieresis", 444, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 667, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 500, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 500, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 921, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 564, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 667, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 500, NULL }, + { "braceleft", 480, NULL }, + { "Thorn", 556, NULL }, + { "zcaron", 444, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 611, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 760, NULL }, + { "radical", 453, NULL }, + { "Aring", 722, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 453, NULL }, + { "dcaron", 588, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 333, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 326, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 444, NULL }, + { "grave", 333, NULL }, + { "uogonek", 500, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 333, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 564, NULL }, + { "uring", 500, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 722, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 444, NULL }, + { "ncaron", 500, NULL }, + { "florin", 500, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 667, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 333, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 722, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 310, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 333, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 444, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 611, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 480, NULL }, + { "quotedblright", 444, NULL }, + { "amacron", 444, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 564, NULL }, + { "zdotaccent", 444, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 200, NULL }, + { "fraction", 167, NULL }, + { "less", 564, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 667, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 564, NULL }, + { "atilde", 444, NULL }, + { "brokenbar", 200, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 611, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth zapfDingbatsWidthsTab[] = { + { "a81", 438, NULL }, + { "a82", 138, NULL }, + { "a83", 277, NULL }, + { "a84", 415, NULL }, + { "a85", 509, NULL }, + { "a86", 410, NULL }, + { "a87", 234, NULL }, + { "a88", 234, NULL }, + { "a89", 390, NULL }, + { "a140", 788, NULL }, + { "a141", 788, NULL }, + { "a142", 788, NULL }, + { "a143", 788, NULL }, + { "a144", 788, NULL }, + { "a145", 788, NULL }, + { "a146", 788, NULL }, + { "a147", 788, NULL }, + { "a148", 788, NULL }, + { "a149", 788, NULL }, + { "a90", 390, NULL }, + { "a91", 276, NULL }, + { "a92", 276, NULL }, + { "space", 278, NULL }, + { "a93", 317, NULL }, + { "a94", 317, NULL }, + { "a95", 334, NULL }, + { "a96", 334, NULL }, + { "a97", 392, NULL }, + { "a98", 392, NULL }, + { "a99", 668, NULL }, + { "a150", 788, NULL }, + { "a151", 788, NULL }, + { "a152", 788, NULL }, + { "a153", 788, NULL }, + { "a154", 788, NULL }, + { "a155", 788, NULL }, + { "a156", 788, NULL }, + { "a157", 788, NULL }, + { "a158", 788, NULL }, + { "a159", 788, NULL }, + { "a160", 894, NULL }, + { "a161", 838, NULL }, + { "a162", 924, NULL }, + { "a163", 1016, NULL }, + { "a164", 458, NULL }, + { "a165", 924, NULL }, + { "a166", 918, NULL }, + { "a167", 927, NULL }, + { "a168", 928, NULL }, + { "a169", 928, NULL }, + { "a170", 834, NULL }, + { "a171", 873, NULL }, + { "a172", 828, NULL }, + { "a173", 924, NULL }, + { "a174", 917, NULL }, + { "a175", 930, NULL }, + { "a176", 931, NULL }, + { "a177", 463, NULL }, + { "a178", 883, NULL }, + { "a179", 836, NULL }, + { "a180", 867, NULL }, + { "a181", 696, NULL }, + { "a182", 874, NULL }, + { "a183", 760, NULL }, + { "a184", 946, NULL }, + { "a185", 865, NULL }, + { "a186", 967, NULL }, + { "a187", 831, NULL }, + { "a188", 873, NULL }, + { "a189", 927, NULL }, + { "a1", 974, NULL }, + { "a2", 961, NULL }, + { "a3", 980, NULL }, + { "a4", 719, NULL }, + { "a5", 789, NULL }, + { "a6", 494, NULL }, + { "a7", 552, NULL }, + { "a8", 537, NULL }, + { "a9", 577, NULL }, + { "a190", 970, NULL }, + { "a191", 918, NULL }, + { "a192", 748, NULL }, + { "a193", 836, NULL }, + { "a194", 771, NULL }, + { "a195", 888, NULL }, + { "a196", 748, NULL }, + { "a197", 771, NULL }, + { "a198", 888, NULL }, + { "a199", 867, NULL }, + { "a10", 692, NULL }, + { "a11", 960, NULL }, + { "a12", 939, NULL }, + { "a13", 549, NULL }, + { "a14", 855, NULL }, + { "a15", 911, NULL }, + { "a16", 933, NULL }, + { "a17", 945, NULL }, + { "a18", 974, NULL }, + { "a19", 755, NULL }, + { "a20", 846, NULL }, + { "a21", 762, NULL }, + { "a22", 761, NULL }, + { "a23", 571, NULL }, + { "a24", 677, NULL }, + { "a25", 763, NULL }, + { "a26", 760, NULL }, + { "a27", 759, NULL }, + { "a28", 754, NULL }, + { "a29", 786, NULL }, + { "a30", 788, NULL }, + { "a31", 788, NULL }, + { "a32", 790, NULL }, + { "a33", 793, NULL }, + { "a34", 794, NULL }, + { "a35", 816, NULL }, + { "a36", 823, NULL }, + { "a37", 789, NULL }, + { "a38", 841, NULL }, + { "a39", 823, NULL }, + { "a40", 833, NULL }, + { "a41", 816, NULL }, + { "a42", 831, NULL }, + { "a43", 923, NULL }, + { "a44", 744, NULL }, + { "a45", 723, NULL }, + { "a46", 749, NULL }, + { "a47", 790, NULL }, + { "a48", 792, NULL }, + { "a49", 695, NULL }, + { "a100", 668, NULL }, + { "a101", 732, NULL }, + { "a102", 544, NULL }, + { "a103", 544, NULL }, + { "a104", 910, NULL }, + { "a105", 911, NULL }, + { "a106", 667, NULL }, + { "a107", 760, NULL }, + { "a108", 760, NULL }, + { "a109", 626, NULL }, + { "a50", 776, NULL }, + { "a51", 768, NULL }, + { "a52", 792, NULL }, + { "a53", 759, NULL }, + { "a54", 707, NULL }, + { "a55", 708, NULL }, + { "a56", 682, NULL }, + { "a57", 701, NULL }, + { "a58", 826, NULL }, + { "a59", 815, NULL }, + { "a110", 694, NULL }, + { "a111", 595, NULL }, + { "a112", 776, NULL }, + { "a117", 690, NULL }, + { "a118", 791, NULL }, + { "a119", 790, NULL }, + { "a60", 789, NULL }, + { "a61", 789, NULL }, + { "a62", 707, NULL }, + { "a63", 687, NULL }, + { "a64", 696, NULL }, + { "a65", 689, NULL }, + { "a66", 786, NULL }, + { "a67", 787, NULL }, + { "a68", 713, NULL }, + { "a69", 791, NULL }, + { "a200", 696, NULL }, + { "a201", 874, NULL }, + { "a120", 788, NULL }, + { "a121", 788, NULL }, + { "a202", 974, NULL }, + { "a122", 788, NULL }, + { "a203", 762, NULL }, + { "a123", 788, NULL }, + { "a204", 759, NULL }, + { "a124", 788, NULL }, + { "a205", 509, NULL }, + { "a125", 788, NULL }, + { "a206", 410, NULL }, + { "a126", 788, NULL }, + { "a127", 788, NULL }, + { "a128", 788, NULL }, + { "a129", 788, NULL }, + { "a70", 785, NULL }, + { "a71", 791, NULL }, + { "a72", 873, NULL }, + { "a73", 761, NULL }, + { "a74", 762, NULL }, + { "a75", 759, NULL }, + { "a76", 892, NULL }, + { "a77", 892, NULL }, + { "a78", 788, NULL }, + { "a79", 784, NULL }, + { "a130", 788, NULL }, + { "a131", 788, NULL }, + { "a132", 788, NULL }, + { "a133", 788, NULL }, + { "a134", 788, NULL }, + { "a135", 788, NULL }, + { "a136", 788, NULL }, + { "a137", 788, NULL }, + { "a138", 788, NULL }, + { "a139", 788, NULL } +}; + +BuiltinFont builtinFonts[] = { + { "Courier", standardEncoding, 629, -157, { -23, -250, 715, 805}, NULL }, + { "Courier-Bold", standardEncoding, 629, -157, {-113, -250, 749, 801}, NULL }, + { "Courier-BoldOblique", standardEncoding, 629, -157, { -57, -250, 869, 801}, NULL }, + { "Courier-Oblique", standardEncoding, 629, -157, { -27, -250, 849, 805}, NULL }, + { "Helvetica", standardEncoding, 718, -207, {-166, -225, 1000, 931}, NULL }, + { "Helvetica-Bold", standardEncoding, 718, -207, {-170, -228, 1003, 962}, NULL }, + { "Helvetica-BoldOblique", standardEncoding, 718, -207, {-174, -228, 1114, 962}, NULL }, + { "Helvetica-Oblique", standardEncoding, 718, -207, {-170, -225, 1116, 931}, NULL }, + { "Symbol", symbolEncoding, 1010, -293, {-180, -293, 1090, 1010}, NULL }, + { "Times-Bold", standardEncoding, 683, -217, {-168, -218, 1000, 935}, NULL }, + { "Times-BoldItalic", standardEncoding, 683, -217, {-200, -218, 996, 921}, NULL }, + { "Times-Italic", standardEncoding, 683, -217, {-169, -217, 1010, 883}, NULL }, + { "Times-Roman", standardEncoding, 683, -217, {-168, -218, 1000, 898}, NULL }, + { "ZapfDingbats", zapfDingbatsEncoding, 820, -143, { -1, -143, 981, 820}, NULL } +}; + +BuiltinFont *builtinFontSubst[] = { + &builtinFonts[0], + &builtinFonts[3], + &builtinFonts[1], + &builtinFonts[2], + &builtinFonts[4], + &builtinFonts[7], + &builtinFonts[5], + &builtinFonts[6], + &builtinFonts[12], + &builtinFonts[11], + &builtinFonts[9], + &builtinFonts[10] +}; + +void initBuiltinFontTables() { + builtinFonts[0].widths = new BuiltinFontWidths(courierWidthsTab, 315); + builtinFonts[1].widths = new BuiltinFontWidths(courierBoldWidthsTab, 315); + builtinFonts[2].widths = new BuiltinFontWidths(courierBoldObliqueWidthsTab, 315); + builtinFonts[3].widths = new BuiltinFontWidths(courierObliqueWidthsTab, 315); + builtinFonts[4].widths = new BuiltinFontWidths(helveticaWidthsTab, 315); + builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 316); + builtinFonts[6].widths = new BuiltinFontWidths(helveticaBoldObliqueWidthsTab, 315); + builtinFonts[7].widths = new BuiltinFontWidths(helveticaObliqueWidthsTab, 315); + builtinFonts[8].widths = new BuiltinFontWidths(symbolWidthsTab, 190); + builtinFonts[9].widths = new BuiltinFontWidths(timesBoldWidthsTab, 315); + builtinFonts[10].widths = new BuiltinFontWidths(timesBoldItalicWidthsTab, 315); + builtinFonts[11].widths = new BuiltinFontWidths(timesItalicWidthsTab, 315); + builtinFonts[12].widths = new BuiltinFontWidths(timesRomanWidthsTab, 315); + builtinFonts[13].widths = new BuiltinFontWidths(zapfDingbatsWidthsTab, 202); +} + +void freeBuiltinFontTables() { + int i; + + for (i = 0; i < 14; ++i) { + delete builtinFonts[i].widths; + } +} diff --git a/poppler/BuiltinFontTables.h b/poppler/BuiltinFontTables.h new file mode 100644 index 0000000..eb45549 --- /dev/null +++ b/poppler/BuiltinFontTables.h @@ -0,0 +1,23 @@ +//======================================================================== +// +// BuiltinFontTables.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef BUILTINFONTTABLES_H +#define BUILTINFONTTABLES_H + +#include "BuiltinFont.h" + +#define nBuiltinFonts 14 +#define nBuiltinFontSubsts 12 + +extern BuiltinFont builtinFonts[nBuiltinFonts]; +extern BuiltinFont *builtinFontSubst[nBuiltinFontSubsts]; + +extern void initBuiltinFontTables(); +extern void freeBuiltinFontTables(); + +#endif diff --git a/poppler/CMap.cc b/poppler/CMap.cc new file mode 100644 index 0000000..13f293a --- /dev/null +++ b/poppler/CMap.cc @@ -0,0 +1,597 @@ +//======================================================================== +// +// CMap.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Koji Otani +// Copyright (C) 2008, 2009 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "goo/GooString.h" +#include "Error.h" +#include "GlobalParams.h" +#include "PSTokenizer.h" +#include "CMap.h" +#include "Object.h" + +//------------------------------------------------------------------------ + +struct CMapVectorEntry { + GBool isVector; + union { + CMapVectorEntry *vector; + CID cid; + }; +}; + +//------------------------------------------------------------------------ + +static int getCharFromFile(void *data) { + return fgetc((FILE *)data); +} + +static int getCharFromStream(void *data) { + return ((Stream *)data)->getChar(); +} + +//------------------------------------------------------------------------ + +CMap *CMap::parse(CMapCache *cache, GooString *collectionA, Object *obj) { + CMap *cMap; + GooString *cMapNameA; + + if (obj->isName()) { + cMapNameA = new GooString(obj->getName()); + if (!(cMap = globalParams->getCMap(collectionA, cMapNameA))) { + error(errSyntaxError, -1, + "Unknown CMap '{0:t}' for character collection '{1:t}'", + cMapNameA, collectionA); + } + delete cMapNameA; + } else if (obj->isStream()) { + if (!(cMap = CMap::parse(NULL, collectionA, obj->getStream()))) { + error(errSyntaxError, -1, "Invalid CMap in Type 0 font"); + } + } else { + error(errSyntaxError, -1, "Invalid Encoding in Type 0 font"); + return NULL; + } + return cMap; +} + +CMap *CMap::parse(CMapCache *cache, GooString *collectionA, + GooString *cMapNameA) { + FILE *f; + CMap *cMap; + + if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) { + + // Check for an identity CMap. + if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) { + return new CMap(collectionA->copy(), cMapNameA->copy(), 0); + } + if (!cMapNameA->cmp("Identity-V")) { + return new CMap(collectionA->copy(), cMapNameA->copy(), 1); + } + + error(errSyntaxError, -1, + "Couldn't find '{0:t}' CMap file for '{1:t}' collection", + cMapNameA, collectionA); + return NULL; + } + + cMap = new CMap(collectionA->copy(), cMapNameA->copy()); + cMap->parse2(cache, &getCharFromFile, f); + + fclose(f); + + return cMap; +} + +CMap *CMap::parse(CMapCache *cache, GooString *collectionA, Stream *str) { + Object obj1; + CMap *cMap; + + cMap = new CMap(collectionA->copy(), NULL); + + if (!str->getDict()->lookup("UseCMap", &obj1)->isNull()) { + cMap->useCMap(cache, &obj1); + } + obj1.free(); + + str->reset(); + cMap->parse2(cache, &getCharFromStream, str); + str->close(); + return cMap; +} + +CMap *CMap::parse(CMapCache *cache, GooString *collectionA, + GooString *cMapNameA, Stream *stream) { + FILE *f = NULL; + CMap *cmap; + PSTokenizer *pst; + char tok1[256], tok2[256], tok3[256]; + int n1, n2, n3; + Guint start, end, code; + + if (stream) { + stream->reset(); + pst = new PSTokenizer(&getCharFromStream, stream); + } else { + if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) { + + // Check for an identity CMap. + if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) { + return new CMap(collectionA->copy(), cMapNameA->copy(), 0); + } + if (!cMapNameA->cmp("Identity-V")) { + return new CMap(collectionA->copy(), cMapNameA->copy(), 1); + } + + error(errSyntaxError, -1, "Couldn't find '{0:t}' CMap file for '{1:t}' collection", + cMapNameA, collectionA); + return NULL; + } + pst = new PSTokenizer(&getCharFromFile, f); + } + + cmap = new CMap(collectionA->copy(), cMapNameA->copy()); + + pst->getToken(tok1, sizeof(tok1), &n1); + while (pst->getToken(tok2, sizeof(tok2), &n2)) { + if (!strcmp(tok2, "usecmap")) { + if (tok1[0] == '/') { + cmap->useCMap(cache, tok1 + 1); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok1, "/WMode")) { + cmap->wMode = atoi(tok2); + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincidchar")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcidchar")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcidchar")) { + error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + n1 >= 4 && (n1 & 1) == 0)) { + error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap"); + continue; + } + tok1[n1 - 1] = '\0'; + if (sscanf(tok1 + 1, "%x", &code) != 1) { + error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap"); + continue; + } + n1 = (n1 - 2) / 2; + cmap->addCIDs(code, code, n1, (CID)atoi(tok2)); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincidrange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcidrange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcidrange") || + !pst->getToken(tok3, sizeof(tok3), &n3) || + !strcmp(tok3, "endcidrange")) { + error(errSyntaxError, -1, "Illegal entry in cidrange block in CMap"); + break; + } + if (tok1[0] == '<' && tok2[0] == '<' && + n1 == n2 && n1 >= 4 && (n1 & 1) == 0) { + tok1[n1 - 1] = tok2[n1 - 1] = '\0'; + sscanf(tok1 + 1, "%x", &start); + sscanf(tok2 + 1, "%x", &end); + n1 = (n1 - 2) / 2; + cmap->addCIDs(start, end, n1, (CID)atoi(tok3)); + } + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else { + strcpy(tok1, tok2); + } + } + delete pst; + + if (f) { + fclose(f); + } + + return cmap; +} + +void CMap::parse2(CMapCache *cache, int (*getCharFunc)(void *), void *data) { + PSTokenizer *pst; + char tok1[256], tok2[256], tok3[256]; + int n1, n2, n3; + Guint start, end, code; + + pst = new PSTokenizer(getCharFunc, data); + pst->getToken(tok1, sizeof(tok1), &n1); + while (pst->getToken(tok2, sizeof(tok2), &n2)) { + if (!strcmp(tok2, "usecmap")) { + if (tok1[0] == '/') { + useCMap(cache, tok1 + 1); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok1, "/WMode")) { + wMode = atoi(tok2); + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincidchar")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcidchar")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcidchar")) { + error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + n1 >= 4 && (n1 & 1) == 0)) { + error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap"); + continue; + } + tok1[n1 - 1] = '\0'; + if (sscanf(tok1 + 1, "%x", &code) != 1) { + error(errSyntaxError, -1, "Illegal entry in cidchar block in CMap"); + continue; + } + n1 = (n1 - 2) / 2; + addCIDs(code, code, n1, (CID)atoi(tok2)); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincidrange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcidrange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcidrange") || + !pst->getToken(tok3, sizeof(tok3), &n3) || + !strcmp(tok3, "endcidrange")) { + error(errSyntaxError, -1, "Illegal entry in cidrange block in CMap"); + break; + } + if (tok1[0] == '<' && tok2[0] == '<' && + n1 == n2 && n1 >= 4 && (n1 & 1) == 0) { + tok1[n1 - 1] = tok2[n1 - 1] = '\0'; + sscanf(tok1 + 1, "%x", &start); + sscanf(tok2 + 1, "%x", &end); + n1 = (n1 - 2) / 2; + addCIDs(start, end, n1, (CID)atoi(tok3)); + } + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else { + strcpy(tok1, tok2); + } + } + delete pst; +} + +CMap::CMap(GooString *collectionA, GooString *cMapNameA) { + int i; + + collection = collectionA; + cMapName = cMapNameA; + isIdent = gFalse; + wMode = 0; + vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); + for (i = 0; i < 256; ++i) { + vector[i].isVector = gFalse; + vector[i].cid = 0; + } + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CMap::CMap(GooString *collectionA, GooString *cMapNameA, int wModeA) { + collection = collectionA; + cMapName = cMapNameA; + isIdent = gTrue; + wMode = wModeA; + vector = NULL; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +void CMap::useCMap(CMapCache *cache, char *useName) { + GooString *useNameStr; + CMap *subCMap; + + useNameStr = new GooString(useName); + // if cache is non-NULL, we already have a lock, and we can use + // CMapCache::getCMap() directly; otherwise, we need to use + // GlobalParams::getCMap() in order to acqure the lock need to use + // GlobalParams::getCMap + if (cache) { + subCMap = cache->getCMap(collection, useNameStr, NULL); + } else { + subCMap = globalParams->getCMap(collection, useNameStr); + } + delete useNameStr; + if (!subCMap) { + return; + } + isIdent = subCMap->isIdent; + if (subCMap->vector) { + copyVector(vector, subCMap->vector); + } + subCMap->decRefCnt(); +} + +void CMap::useCMap(CMapCache *cache, Object *obj) { + CMap *subCMap; + + subCMap = CMap::parse(cache, collection, obj); + if (!subCMap) { + return; + } + isIdent = subCMap->isIdent; + if (subCMap->vector) { + copyVector(vector, subCMap->vector); + } + subCMap->decRefCnt(); +} + +void CMap::copyVector(CMapVectorEntry *dest, CMapVectorEntry *src) { + int i, j; + + for (i = 0; i < 256; ++i) { + if (src[i].isVector) { + if (!dest[i].isVector) { + dest[i].isVector = gTrue; + dest[i].vector = + (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); + for (j = 0; j < 256; ++j) { + dest[i].vector[j].isVector = gFalse; + dest[i].vector[j].cid = 0; + } + } + copyVector(dest[i].vector, src[i].vector); + } else { + if (dest[i].isVector) { + error(errSyntaxError, -1, "Collision in usecmap"); + } else { + dest[i].cid = src[i].cid; + } + } + } +} + +void CMap::addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID) { + CMapVectorEntry *vec; + CID cid; + int byte; + Guint i, j; + + vec = vector; + for (i = nBytes - 1; i >= 1; --i) { + byte = (start >> (8 * i)) & 0xff; + if (!vec[byte].isVector) { + vec[byte].isVector = gTrue; + vec[byte].vector = + (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); + for (j = 0; j < 256; ++j) { + vec[byte].vector[j].isVector = gFalse; + vec[byte].vector[j].cid = 0; + } + } + vec = vec[byte].vector; + } + cid = firstCID; + for (byte = (int)(start & 0xff); byte <= (int)(end & 0xff); ++byte) { + if (vec[byte].isVector) { + error(errSyntaxError, -1, + "Invalid CID ({0:x} - {1:x} [{2:d} bytes]) in CMap", + start, end, nBytes); + } else { + vec[byte].cid = cid; + } + ++cid; + } +} + +CMap::~CMap() { + delete collection; + delete cMapName; + if (vector) { + freeCMapVector(vector); + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +void CMap::freeCMapVector(CMapVectorEntry *vec) { + int i; + + for (i = 0; i < 256; ++i) { + if (vec[i].isVector) { + freeCMapVector(vec[i].vector); + } + } + gfree(vec); +} + +void CMap::incRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + ++refCnt; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +void CMap::decRefCnt() { + GBool done; + +#if MULTITHREADED + gLockMutex(&mutex); +#endif + done = --refCnt == 0; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + if (done) { + delete this; + } +} + +GBool CMap::match(GooString *collectionA, GooString *cMapNameA) { + return !collection->cmp(collectionA) && !cMapName->cmp(cMapNameA); +} + +CID CMap::getCID(char *s, int len, CharCode *c, int *nUsed) { + CMapVectorEntry *vec; + CharCode cc; + int n, i; + + vec = vector; + cc = 0; + n = 0; + while (vec && n < len) { + i = s[n++] & 0xff; + cc = (cc << 8) | i; + if (!vec[i].isVector) { + *c = cc; + *nUsed = n; + return vec[i].cid; + } + vec = vec[i].vector; + } + if (isIdent && len >= 2) { + // identity CMap + *nUsed = 2; + *c = cc = ((s[0] & 0xff) << 8) + (s[1] & 0xff); + return cc; + } + *nUsed = 1; + *c = s[0] & 0xff; + return 0; +} + +void CMap::setReverseMapVector(Guint startCode, CMapVectorEntry *vec, + Guint *rmap, Guint rmapSize, Guint ncand) { + int i; + + if (vec == 0) return; + for (i = 0;i < 256;i++) { + if (vec[i].isVector) { + setReverseMapVector((startCode+i) << 8, + vec[i].vector,rmap,rmapSize,ncand); + } else { + Guint cid = vec[i].cid; + + if (cid < rmapSize) { + Guint cand; + + for (cand = 0;cand < ncand;cand++) { + Guint code = startCode+i; + Guint idx = cid*ncand+cand; + if (rmap[idx] == 0) { + rmap[idx] = code; + break; + } else if (rmap[idx] == code) { + break; + } + } + } + } + } +} + +void CMap::setReverseMap(Guint *rmap, Guint rmapSize, Guint ncand) { + setReverseMapVector(0,vector,rmap,rmapSize,ncand); +} + +//------------------------------------------------------------------------ + +CMapCache::CMapCache() { + int i; + + for (i = 0; i < cMapCacheSize; ++i) { + cache[i] = NULL; + } +} + +CMapCache::~CMapCache() { + int i; + + for (i = 0; i < cMapCacheSize; ++i) { + if (cache[i]) { + cache[i]->decRefCnt(); + } + } +} + +CMap *CMapCache::getCMap(GooString *collection, GooString *cMapName, Stream *stream) { + CMap *cmap; + int i, j; + + if (cache[0] && cache[0]->match(collection, cMapName)) { + cache[0]->incRefCnt(); + return cache[0]; + } + for (i = 1; i < cMapCacheSize; ++i) { + if (cache[i] && cache[i]->match(collection, cMapName)) { + cmap = cache[i]; + for (j = i; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = cmap; + cmap->incRefCnt(); + return cmap; + } + } + if ((cmap = CMap::parse(this, collection, cMapName, stream))) { + if (cache[cMapCacheSize - 1]) { + cache[cMapCacheSize - 1]->decRefCnt(); + } + for (j = cMapCacheSize - 1; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = cmap; + cmap->incRefCnt(); + return cmap; + } + return NULL; +} diff --git a/poppler/CMap.h b/poppler/CMap.h new file mode 100644 index 0000000..f4f5a91 --- /dev/null +++ b/poppler/CMap.h @@ -0,0 +1,145 @@ +//======================================================================== +// +// CMap.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Koji Otani +// Copyright (C) 2009 Albert Astals Cid +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef CMAP_H +#define CMAP_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "goo/gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "goo/GooMutex.h" +#endif + +class GooString; +class Object; +struct CMapVectorEntry; +class CMapCache; +class Stream; + +//------------------------------------------------------------------------ + +class CMap { +public: + + // Parse a CMap from , which can be a name or a stream. Sets + // the initial reference count to 1. Returns NULL on failure. + static CMap *parse(CMapCache *cache, GooString *collectionA, Object *obj); + + // Create the CMap specified by and . Sets + // the initial reference count to 1. Returns NULL on failure. + static CMap *parse(CMapCache *cache, GooString *collectionA, + GooString *cMapNameA); + + // Parse a CMap from . Sets the initial reference count to 1. + // Returns NULL on failure. + static CMap *parse(CMapCache *cache, GooString *collectionA, Stream *str); + + // Create the CMap specified by and . Sets + // the initial reference count to 1. + // Stream is a stream containing the CMap, can be NULL and + // this means the CMap will be searched in the CMap files + // Returns NULL on failure. + static CMap *parse(CMapCache *cache, GooString *collectionA, + GooString *cMapNameA, Stream *stream); + + ~CMap(); + + void incRefCnt(); + void decRefCnt(); + + // Return collection name (-). + GooString *getCollection() { return collection; } + + GooString *getCMapName() { return cMapName; } + + // Return true if this CMap matches the specified , and + // . + GBool match(GooString *collectionA, GooString *cMapNameA); + + // Return the CID corresponding to the character code starting at + // , which contains bytes. Sets * to the char code, and + // * to the number of bytes used by the char code. + CID getCID(char *s, int len, CharCode *c, int *nUsed); + + // Return the writing mode (0=horizontal, 1=vertical). + int getWMode() { return wMode; } + + void setReverseMap(Guint *rmap, Guint rmapSize, Guint ncand); + +private: + + void parse2(CMapCache *cache, int (*getCharFunc)(void *), void *data); + CMap(GooString *collectionA, GooString *cMapNameA); + CMap(GooString *collectionA, GooString *cMapNameA, int wModeA); + void useCMap(CMapCache *cache, char *useName); + void useCMap(CMapCache *cache, Object *obj); + void copyVector(CMapVectorEntry *dest, CMapVectorEntry *src); + void addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID); + void freeCMapVector(CMapVectorEntry *vec); + void setReverseMapVector(Guint startCode, CMapVectorEntry *vec, + Guint *rmap, Guint rmapSize, Guint ncand); + + GooString *collection; + GooString *cMapName; + GBool isIdent; // true if this CMap is an identity mapping, + // or is based on one (via usecmap) + int wMode; // writing mode (0=horizontal, 1=vertical) + CMapVectorEntry *vector; // vector for first byte (NULL for + // identity CMap) + int refCnt; +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ + +#define cMapCacheSize 4 + +class CMapCache { +public: + + CMapCache(); + ~CMapCache(); + + // Get the CMap for the specified character collection. + // Increments its reference count; there will be one reference for + // the cache plus one for the caller of this function. + // Stream is a stream containing the CMap, can be NULL and + // this means the CMap will be searched in the CMap files + // Returns NULL on failure. + CMap *getCMap(GooString *collection, GooString *cMapName, Stream *stream); + +private: + + CMap *cache[cMapCacheSize]; +}; + +#endif diff --git a/poppler/CachedFile.cc b/poppler/CachedFile.cc new file mode 100644 index 0000000..4c20dae --- /dev/null +++ b/poppler/CachedFile.cc @@ -0,0 +1,256 @@ +//======================================================================== +// +// CachedFile.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2009 Stefan Thomas +// Copyright 2010, 2011 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#include +#include "CachedFile.h" + +//------------------------------------------------------------------------ +// CachedFile +//------------------------------------------------------------------------ + +CachedFile::CachedFile(CachedFileLoader *cachedFileLoaderA, GooString *uriA) +{ + uri = uriA; + loader = cachedFileLoaderA; + + streamPos = 0; + chunks = new std::vector(); + length = 0; + + length = loader->init(uri, this); + refCnt = 1; + + if (length != ((size_t) -1)) { + chunks->resize(length/CachedFileChunkSize + 1); + } + else { + error(errInternal, -1, "Failed to initialize file cache for '{0:t}'.", uri); + chunks->resize(0); + } +} + +CachedFile::~CachedFile() +{ + delete uri; + delete loader; + delete chunks; +} + +void CachedFile::incRefCnt() { + refCnt++; +} + +void CachedFile::decRefCnt() { + if (--refCnt == 0) + delete this; +} + +long int CachedFile::tell() { + return streamPos; +} + +int CachedFile::seek(long int offset, int origin) +{ + if (origin == SEEK_SET) { + streamPos = offset; + } else if (origin == SEEK_CUR) { + streamPos += offset; + } else { + streamPos = length + offset; + } + + if (streamPos > length) { + streamPos = 0; + return 1; + } + + return 0; +} + +int CachedFile::cache(const std::vector &origRanges) +{ + std::vector loadChunks; + int numChunks = length/CachedFileChunkSize + 1; + std::vector chunkNeeded(numChunks); + int startChunk, endChunk; + std::vector chunk_ranges, all; + ByteRange range; + const std::vector *ranges = &origRanges; + + if (ranges->empty()) { + range.offset = 0; + range.length = length; + all.push_back(range); + ranges = &all; + } + + for (int i = 0; i < numChunks; ++i) + chunkNeeded[i] = false; + for (size_t i = 0; i < ranges->size(); i++) { + + if ((*ranges)[i].length == 0) continue; + if ((*ranges)[i].offset >= length) continue; + + size_t start = (*ranges)[i].offset; + size_t end = start + (*ranges)[i].length - 1; + if (end >= length) end = length - 1; + + startChunk = start / CachedFileChunkSize; + endChunk = end / CachedFileChunkSize; + for (int chunk = startChunk; chunk <= endChunk; chunk++) { + if ((*chunks)[chunk].state == chunkStateNew) { + chunkNeeded[chunk] = true; + } + } + } + + int chunk = 0; + while (chunk < numChunks) { + while (!chunkNeeded[chunk] && (++chunk != numChunks)) ; + if (chunk == numChunks) break; + startChunk = chunk; + loadChunks.push_back(chunk); + + while ((++chunk != numChunks) && chunkNeeded[chunk]) { + loadChunks.push_back(chunk); + } + endChunk = chunk - 1; + + range.offset = startChunk * CachedFileChunkSize; + range.length = (endChunk - startChunk + 1) * CachedFileChunkSize; + + chunk_ranges.push_back(range); + } + + if (chunk_ranges.size() > 0) { + CachedFileWriter writer = + CachedFileWriter(this, &loadChunks); + return loader->load(chunk_ranges, &writer); + } + + return 0; +} + +size_t CachedFile::read(void *ptr, size_t unitsize, size_t count) +{ + size_t bytes = unitsize*count; + if (length < (streamPos + bytes)) { + bytes = length - streamPos; + } + + if (bytes == 0) return 0; + + // Load data + if (cache(streamPos, bytes) != 0) return 0; + + // Copy data to buffer + size_t toCopy = bytes; + while (toCopy) { + int chunk = streamPos / CachedFileChunkSize; + int offset = streamPos % CachedFileChunkSize; + size_t len = CachedFileChunkSize-offset; + + if (len > toCopy) + len = toCopy; + + memcpy(ptr, (*chunks)[chunk].data + offset, len); + streamPos += len; + toCopy -= len; + ptr = (char*)ptr + len; + } + + return bytes; +} + +int CachedFile::cache(size_t offset, size_t length) +{ + std::vector r; + ByteRange range; + range.offset = offset; + range.length = length; + r.push_back(range); + return cache(r); +} + +//------------------------------------------------------------------------ +// CachedFileWriter +//------------------------------------------------------------------------ + +CachedFileWriter::CachedFileWriter(CachedFile *cachedFileA, std::vector *chunksA) +{ + cachedFile = cachedFileA; + chunks = chunksA; + + if (chunks) { + offset = 0; + it = (*chunks).begin(); + } +} + +CachedFileWriter::~CachedFileWriter() +{ +} + +size_t CachedFileWriter::write(const char *ptr, size_t size) +{ + const char *cp = ptr; + size_t len = size; + size_t nfree, ncopy; + size_t written = 0; + size_t chunk; + + if (!len) return 0; + + while (len) { + if (chunks) { + if (offset == CachedFileChunkSize) { + it++; + if (it == (*chunks).end()) return written; + offset = 0; + } + chunk = *it; + } else { + offset = cachedFile->length % CachedFileChunkSize; + chunk = cachedFile->length / CachedFileChunkSize; + } + + if (chunk >= cachedFile->chunks->size()) { + cachedFile->chunks->resize(chunk + 1); + } + + nfree = CachedFileChunkSize - offset; + ncopy = (len >= nfree) ? nfree : len; + memcpy(&((*cachedFile->chunks)[chunk].data[offset]), cp, ncopy); + len -= ncopy; + cp += ncopy; + offset += ncopy; + written += ncopy; + + if (!chunks) { + cachedFile->length += ncopy; + } + + if (offset == CachedFileChunkSize) { + (*cachedFile->chunks)[chunk].state = CachedFile::chunkStateLoaded; + } + } + + if ((chunk == (cachedFile->length / CachedFileChunkSize)) && + (offset == (cachedFile->length % CachedFileChunkSize))) { + (*cachedFile->chunks)[chunk].state = CachedFile::chunkStateLoaded; + } + + return written; +} + +//------------------------------------------------------------------------ + diff --git a/poppler/CachedFile.h b/poppler/CachedFile.h new file mode 100644 index 0000000..b99ea1e --- /dev/null +++ b/poppler/CachedFile.h @@ -0,0 +1,146 @@ +//======================================================================== +// +// CachedFile.h +// +// Caching files support. +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2009 Stefan Thomas +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef CACHEDFILE_H +#define CACHEDFILE_H + +#include "poppler-config.h" + +#include "goo/gtypes.h" +#include "Object.h" +#include "Stream.h" + +#include + +//------------------------------------------------------------------------ + +#define CachedFileChunkSize 8192 // This should be a multiple of cachedStreamBufSize + +class GooString; +class CachedFileLoader; + +//------------------------------------------------------------------------ +// CachedFile +// +// CachedFile gives FILE-like access to a document at a specified URI. +// In the constructor, you specify a CachedFileLoader that handles loading +// the data from the document. The CachedFile requests no more data then it +// needs from the CachedFileLoader. +//------------------------------------------------------------------------ + +class CachedFile { + +friend class CachedFileWriter; + +public: + + CachedFile(CachedFileLoader *cacheLoader, GooString *uri); + + Guint getLength() { return length; } + long int tell(); + int seek(long int offset, int origin); + size_t read(void * ptr, size_t unitsize, size_t count); + size_t write(const char *ptr, size_t size, size_t fromByte); + int cache(const std::vector &ranges); + + // Reference counting. + void incRefCnt(); + void decRefCnt(); + +private: + + ~CachedFile(); + + enum ChunkState { + chunkStateNew = 0, + chunkStateLoaded + }; + + typedef struct { + ChunkState state; + char data[CachedFileChunkSize]; + } Chunk; + + int cache(size_t offset, size_t length); + + CachedFileLoader *loader; + GooString *uri; + + size_t length; + size_t streamPos; + + std::vector *chunks; + + int refCnt; // reference count + +}; + +//------------------------------------------------------------------------ +// CachedFileWriter +// +// CachedFileWriter handles sequential writes to a CachedFile. +// On construction, you specify the CachedFile and the chunks of it to which data +// should be written. +//------------------------------------------------------------------------ + +class CachedFileWriter { + +public: + + // Construct a CachedFile Writer. + // The caller is responsible for deleting the cachedFile and chunksA. + CachedFileWriter(CachedFile *cachedFile, std::vector *chunksA); + + ~CachedFileWriter(); + + // Writes size bytes from ptr to cachedFile, returns number of bytes written. + size_t write(const char *ptr, size_t size); + +private: + + CachedFile *cachedFile; + std::vector *chunks; + std::vector::iterator it; + size_t offset; + +}; + +//------------------------------------------------------------------------ +// CachedFileLoader +// +// CachedFileLoader is an abstact class that specifies the interface for +// loadng data from an URI into a CachedFile. +//------------------------------------------------------------------------ + +class CachedFileLoader { + +public: + + virtual ~CachedFileLoader() {}; + + // Initializes the file load. + // Returns the length of the file. + // The caller is responsible for deleting uri and cachedFile. + virtual size_t init(GooString *uri, CachedFile *cachedFile) = 0; + + // Loads speficified byte ranges and passes it to the writer to store them. + // Returns 0 on success, Anything but 0 on failure. + // The caller is responsible for deleting the writer. + virtual int load(const std::vector &ranges, CachedFileWriter *writer) = 0; + +}; + +//------------------------------------------------------------------------ + +#endif diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc new file mode 100644 index 0000000..c4493e8 --- /dev/null +++ b/poppler/CairoFontEngine.cc @@ -0,0 +1,804 @@ +//======================================================================== +// +// CairoFontEngine.cc +// +// Copyright 2003 Glyph & Cog, LLC +// Copyright 2004 Red Hat, Inc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2007 Jeff Muizelaar +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2005 Martin Kretzschmar +// Copyright (C) 2005, 2009, 2012 Albert Astals Cid +// Copyright (C) 2006, 2007, 2010, 2011 Carlos Garcia Campos +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2008, 2009 Chris Wilson +// Copyright (C) 2008, 2012 Adrian Johnson +// Copyright (C) 2009 Darren Kenny +// Copyright (C) 2010 Suzuki Toshiya +// Copyright (C) 2010 Jan Kümmel +// Copyright (C) 2012 Hib Eris +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#include "config.h" +#include +#include "CairoFontEngine.h" +#include "CairoOutputDev.h" +#include "GlobalParams.h" +#include +#include +#include "goo/gfile.h" +#include "Error.h" +#include "XRef.h" +#include "Gfx.h" +#include "Page.h" + +#if HAVE_FCNTL_H && HAVE_SYS_MMAN_H && HAVE_SYS_STAT_H +#include +#include +#include +#define CAN_CHECK_OPEN_FACES 1 +#endif + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + + +//------------------------------------------------------------------------ +// CairoFont +//------------------------------------------------------------------------ + +CairoFont::CairoFont(Ref ref, + cairo_font_face_t *cairo_font_face, + int *codeToGID, + Guint codeToGIDLen, + GBool substitute, + GBool printing) : ref(ref), + cairo_font_face(cairo_font_face), + codeToGID(codeToGID), + codeToGIDLen(codeToGIDLen), + substitute(substitute), + printing(printing) { } + +CairoFont::~CairoFont() { + cairo_font_face_destroy (cairo_font_face); + gfree(codeToGID); +} + +GBool +CairoFont::matches(Ref &other, GBool printingA) { + return (other.num == ref.num && other.gen == ref.gen); +} + +cairo_font_face_t * +CairoFont::getFontFace(void) { + return cairo_font_face; +} + +unsigned long +CairoFont::getGlyph(CharCode code, + Unicode *u, int uLen) { + FT_UInt gid; + + if (codeToGID && code < codeToGIDLen) { + gid = (FT_UInt)codeToGID[code]; + } else { + gid = (FT_UInt)code; + } + return gid; +} + +double +CairoFont::getSubstitutionCorrection(GfxFont *gfxFont) +{ + double w1, w2; + CharCode code; + char *name; + + // for substituted fonts: adjust the font matrix -- compare the + // width of 'm' in the original font and the substituted font + if (isSubstitute() && !gfxFont->isCIDFont()) { + for (code = 0; code < 256; ++code) { + if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) && + name[0] == 'm' && name[1] == '\0') { + break; + } + } + if (code < 256) { + w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code); + { + cairo_matrix_t m; + cairo_matrix_init_identity(&m); + cairo_font_options_t *options = cairo_font_options_create(); + cairo_font_options_set_hint_style(options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics(options, CAIRO_HINT_METRICS_OFF); + cairo_scaled_font_t *scaled_font = cairo_scaled_font_create(cairo_font_face, &m, &m, options); + + cairo_text_extents_t extents; + cairo_scaled_font_text_extents(scaled_font, "m", &extents); + + cairo_scaled_font_destroy(scaled_font); + cairo_font_options_destroy(options); + w2 = extents.x_advance; + } + if (!gfxFont->isSymbolic()) { + // if real font is substantially narrower than substituted + // font, reduce the font size accordingly + if (w1 > 0.01 && w1 < 0.9 * w2) { + w1 /= w2; + return w1; + } + } + } + } + return 1.0; +} + +//------------------------------------------------------------------------ +// CairoFreeTypeFont +//------------------------------------------------------------------------ + +static cairo_user_data_key_t _ft_cairo_key; + +static void +_ft_done_face_uncached (void *closure) +{ + FT_Face face = (FT_Face) closure; + FT_Done_Face (face); +} + +static GBool +_ft_new_face_uncached (FT_Library lib, + const char *filename, + char *font_data, + int font_data_len, + FT_Face *face_out, + cairo_font_face_t **font_face_out) +{ + FT_Face face; + cairo_font_face_t *font_face; + + if (font_data == NULL) { + if (FT_New_Face (lib, filename, 0, &face)) + return gFalse; + } else { + if (FT_New_Memory_Face (lib, (unsigned char *)font_data, font_data_len, 0, &face)) + return gFalse; + } + + font_face = cairo_ft_font_face_create_for_ft_face (face, + FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP); + if (cairo_font_face_set_user_data (font_face, + &_ft_cairo_key, + face, + _ft_done_face_uncached)) + { + _ft_done_face_uncached (face); + cairo_font_face_destroy (font_face); + return gFalse; + } + + *face_out = face; + *font_face_out = font_face; + return gTrue; +} + +#if CAN_CHECK_OPEN_FACES +static struct _ft_face_data { + struct _ft_face_data *prev, *next, **head; + + int fd; + unsigned long hash; + size_t size; + unsigned char *bytes; + + FT_Library lib; + FT_Face face; + cairo_font_face_t *font_face; +} *_ft_open_faces; + +static unsigned long +_djb_hash (const unsigned char *bytes, size_t len) +{ + unsigned long hash = 5381; + while (len--) { + unsigned char c = *bytes++; + hash *= 33; + hash ^= c; + } + return hash; +} + +static GBool +_ft_face_data_equal (struct _ft_face_data *a, struct _ft_face_data *b) +{ + if (a->lib != b->lib) + return gFalse; + if (a->size != b->size) + return gFalse; + if (a->hash != b->hash) + return gFalse; + + return memcmp (a->bytes, b->bytes, a->size) == 0; +} + +static void +_ft_done_face (void *closure) +{ + struct _ft_face_data *data = (struct _ft_face_data *) closure; + + if (data->next) + data->next->prev = data->prev; + if (data->prev) + data->prev->next = data->next; + else + _ft_open_faces = data->next; + +#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4) + munmap ((char*)data->bytes, data->size); +#else + munmap (data->bytes, data->size); +#endif + close (data->fd); + + FT_Done_Face (data->face); + gfree (data); +} + +static GBool +_ft_new_face (FT_Library lib, + const char *filename, + char *font_data, + int font_data_len, + FT_Face *face_out, + cairo_font_face_t **font_face_out) +{ + struct _ft_face_data *l; + struct stat st; + struct _ft_face_data tmpl; + + tmpl.fd = -1; + + if (font_data == NULL) { + /* if we fail to mmap the file, just pass it to FreeType instead */ + tmpl.fd = open (filename, O_RDONLY); + if (tmpl.fd == -1) + return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out); + + if (fstat (tmpl.fd, &st) == -1) { + close (tmpl.fd); + return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out); + } + + tmpl.bytes = (unsigned char *) mmap (NULL, st.st_size, + PROT_READ, MAP_PRIVATE, + tmpl.fd, 0); + if (tmpl.bytes == MAP_FAILED) { + close (tmpl.fd); + return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out); + } + tmpl.size = st.st_size; + } else { + tmpl.bytes = (unsigned char*) font_data; + tmpl.size = font_data_len; + } + + /* check to see if this is a duplicate of any of the currently open fonts */ + tmpl.lib = lib; + tmpl.hash = _djb_hash (tmpl.bytes, tmpl.size); + + for (l = _ft_open_faces; l; l = l->next) { + if (_ft_face_data_equal (l, &tmpl)) { + if (tmpl.fd != -1) { +#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4) + munmap ((char*)tmpl.bytes, tmpl.size); +#else + munmap (tmpl.bytes, tmpl.size); +#endif + close (tmpl.fd); + } + *face_out = l->face; + *font_face_out = cairo_font_face_reference (l->font_face); + return gTrue; + } + } + + /* not a dup, open and insert into list */ + if (FT_New_Memory_Face (lib, + (FT_Byte *) tmpl.bytes, tmpl.size, + 0, &tmpl.face)) + { + if (tmpl.fd != -1) { +#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4) + munmap ((char*)tmpl.bytes, tmpl.size); +#else + munmap (tmpl.bytes, tmpl.size); +#endif + + close (tmpl.fd); + } + return gFalse; + } + + l = (struct _ft_face_data *) gmallocn (1, sizeof (struct _ft_face_data)); + *l = tmpl; + l->prev = NULL; + l->next = _ft_open_faces; + if (_ft_open_faces) + _ft_open_faces->prev = l; + _ft_open_faces = l; + + l->font_face = cairo_ft_font_face_create_for_ft_face (tmpl.face, + FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP); + if (cairo_font_face_set_user_data (l->font_face, + &_ft_cairo_key, + l, + _ft_done_face)) + { + cairo_font_face_destroy (l->font_face); + _ft_done_face (l); + return gFalse; + } + + *face_out = l->face; + *font_face_out = l->font_face; + return gTrue; +} +#else +#define _ft_new_face _ft_new_face_uncached +#endif + +CairoFreeTypeFont::CairoFreeTypeFont(Ref ref, + cairo_font_face_t *cairo_font_face, + int *codeToGID, + Guint codeToGIDLen, + GBool substitute) : CairoFont(ref, + cairo_font_face, + codeToGID, + codeToGIDLen, + substitute, + gTrue) { } + +CairoFreeTypeFont::~CairoFreeTypeFont() { } + +CairoFreeTypeFont *CairoFreeTypeFont::create(GfxFont *gfxFont, XRef *xref, + FT_Library lib, GBool useCIDs) { + Object refObj, strObj; + GooString *fileName; + char *fileNameC; + char *font_data; + int font_data_len; + int i, n; + GfxFontType fontType; + GfxFontLoc *fontLoc; + char **enc; + char *name; + FoFiTrueType *ff; + FoFiType1C *ff1c; + Ref ref; + FT_Face face; + cairo_font_face_t *font_face; + + int *codeToGID; + Guint codeToGIDLen; + + codeToGID = NULL; + codeToGIDLen = 0; + font_data = NULL; + font_data_len = 0; + fileName = NULL; + fileNameC = NULL; + + GBool substitute = gFalse; + + ref = *gfxFont->getID(); + fontType = gfxFont->getType(); + + if (!(fontLoc = gfxFont->locateFont(xref, gFalse))) { + error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + + // embedded font + if (fontLoc->locType == gfxFontLocEmbedded) { + font_data = gfxFont->readEmbFontFile(xref, &font_data_len); + if (NULL == font_data) + goto err2; + + // external font + } else { // gfxFontLocExternal + fileName = fontLoc->path; + fontType = fontLoc->fontType; + substitute = gTrue; + } + + if (fileName != NULL) { + fileNameC = fileName->getCString(); + } + + switch (fontType) { + case fontType1: + case fontType1C: + case fontType1COT: + if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) { + error(errSyntaxError, -1, "could not create type1 face"); + goto err2; + } + + enc = ((Gfx8BitFont *)gfxFont)->getEncoding(); + + codeToGID = (int *)gmallocn(256, sizeof(int)); + codeToGIDLen = 256; + for (i = 0; i < 256; ++i) { + codeToGID[i] = 0; + if ((name = enc[i])) { + codeToGID[i] = FT_Get_Name_Index(face, name); + } + } + break; + case fontCIDType2: + case fontCIDType2OT: + codeToGID = NULL; + n = 0; + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (n) { + codeToGID = (int *)gmallocn(n, sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(int)); + } + } else { + if (font_data != NULL) { + ff = FoFiTrueType::make(font_data, font_data_len); + } else { + ff = FoFiTrueType::load(fileNameC); + } + if (! ff) + goto err2; + codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n); + delete ff; + } + codeToGIDLen = n; + /* Fall through */ + case fontTrueType: + if (font_data != NULL) { + ff = FoFiTrueType::make(font_data, font_data_len); + } else { + ff = FoFiTrueType::load(fileNameC); + } + if (! ff) { + error(errSyntaxError, -1, "failed to load truetype font\n"); + goto err2; + } + /* This might be set already for the CIDType2 case */ + if (fontType == fontTrueType) { + codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff); + codeToGIDLen = 256; + } + delete ff; + if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) { + error(errSyntaxError, -1, "could not create truetype face\n"); + goto err2; + } + break; + + case fontCIDType0: + case fontCIDType0C: + + codeToGID = NULL; + codeToGIDLen = 0; + + if (!useCIDs) + { + if (font_data != NULL) { + ff1c = FoFiType1C::make(font_data, font_data_len); + } else { + ff1c = FoFiType1C::load(fileNameC); + } + if (ff1c) { + codeToGID = ff1c->getCIDToGIDMap((int *)&codeToGIDLen); + delete ff1c; + } + } + + if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) { + gfree(codeToGID); + codeToGID = NULL; + error(errSyntaxError, -1, "could not create cid face\n"); + goto err2; + } + break; + + default: + fprintf (stderr, "font type %d not handled\n", (int)fontType); + goto err2; + break; + } + + delete fontLoc; + return new CairoFreeTypeFont(ref, + font_face, + codeToGID, codeToGIDLen, + substitute); + + err2: + /* hmm? */ + delete fontLoc; + fprintf (stderr, "some font thing failed\n"); + return NULL; +} + +//------------------------------------------------------------------------ +// CairoType3Font +//------------------------------------------------------------------------ + +static const cairo_user_data_key_t type3_font_key = {0}; + +typedef struct _type3_font_info { + GfxFont *font; + PDFDoc *doc; + CairoFontEngine *fontEngine; + GBool printing; +} type3_font_info_t; + +static void +_free_type3_font_info(void *closure) +{ + type3_font_info_t *info = (type3_font_info_t *) closure; + + info->font->decRefCnt(); + free (info); +} + +static cairo_status_t +_init_type3_glyph (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *extents) +{ + type3_font_info_t *info; + GfxFont *font; + double *mat; + + info = (type3_font_info_t *) + cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &type3_font_key); + font = info->font; + mat = font->getFontBBox(); + extents->ascent = mat[3]; /* y2 */ + extents->descent = -mat[3]; /* -y1 */ + extents->height = extents->ascent + extents->descent; + extents->max_x_advance = mat[2] - mat[1]; /* x2 - x1 */ + extents->max_y_advance = 0; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_render_type3_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + Dict *charProcs; + Object charProc; + CairoOutputDev *output_dev; + cairo_matrix_t matrix, invert_y_axis; + double *mat; + double wx, wy; + PDFRectangle box; + type3_font_info_t *info; + GfxFont *font; + Dict *resDict; + Gfx *gfx; + + info = (type3_font_info_t *) + cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &type3_font_key); + + font = info->font; + resDict = ((Gfx8BitFont *)font)->getResources(); + charProcs = ((Gfx8BitFont *)(info->font))->getCharProcs(); + if (!charProcs) + return CAIRO_STATUS_USER_FONT_ERROR; + + if ((int)glyph >= charProcs->getLength()) + return CAIRO_STATUS_USER_FONT_ERROR; + + mat = font->getFontMatrix(); + matrix.xx = mat[0]; + matrix.yx = mat[1]; + matrix.xy = mat[2]; + matrix.yy = mat[3]; + matrix.x0 = mat[4]; + matrix.y0 = mat[5]; + cairo_matrix_init_scale (&invert_y_axis, 1, -1); + cairo_matrix_multiply (&matrix, &matrix, &invert_y_axis); + cairo_transform (cr, &matrix); + + output_dev = new CairoOutputDev(); + output_dev->setCairo(cr); + output_dev->setPrinting(info->printing); + + mat = font->getFontBBox(); + box.x1 = mat[0]; + box.y1 = mat[1]; + box.x2 = mat[2]; + box.y2 = mat[3]; + gfx = new Gfx(info->doc, output_dev, resDict, &box, NULL); + output_dev->startDoc(info->doc, info->fontEngine); + output_dev->startPage (1, gfx->getState()); + output_dev->setInType3Char(gTrue); + gfx->display(charProcs->getVal(glyph, &charProc)); + + output_dev->getType3GlyphWidth (&wx, &wy); + cairo_matrix_transform_distance (&matrix, &wx, &wy); + metrics->x_advance = wx; + metrics->y_advance = wy; + if (output_dev->hasType3GlyphBBox()) { + double *bbox = output_dev->getType3GlyphBBox(); + + cairo_matrix_transform_point (&matrix, &bbox[0], &bbox[1]); + cairo_matrix_transform_point (&matrix, &bbox[2], &bbox[3]); + metrics->x_bearing = bbox[0]; + metrics->y_bearing = bbox[1]; + metrics->width = bbox[2] - bbox[0]; + metrics->height = bbox[3] - bbox[1]; + } + + delete gfx; + delete output_dev; + charProc.free(); + + return CAIRO_STATUS_SUCCESS; +} + + +CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, PDFDoc *doc, + CairoFontEngine *fontEngine, + GBool printing) { + Object refObj, strObj; + type3_font_info_t *info; + cairo_font_face_t *font_face; + Ref ref; + int *codeToGID; + Guint codeToGIDLen; + int i, j; + char **enc; + Dict *charProcs; + char *name; + + charProcs = ((Gfx8BitFont *)gfxFont)->getCharProcs(); + info = (type3_font_info_t *) malloc(sizeof(*info)); + ref = *gfxFont->getID(); + font_face = cairo_user_font_face_create(); + cairo_user_font_face_set_init_func (font_face, _init_type3_glyph); + cairo_user_font_face_set_render_glyph_func (font_face, _render_type3_glyph); + gfxFont->incRefCnt(); + info->font = gfxFont; + info->doc = doc; + info->fontEngine = fontEngine; + info->printing = printing; + + cairo_font_face_set_user_data (font_face, &type3_font_key, (void *) info, _free_type3_font_info); + + enc = ((Gfx8BitFont *)gfxFont)->getEncoding(); + codeToGID = (int *)gmallocn(256, sizeof(int)); + codeToGIDLen = 256; + for (i = 0; i < 256; ++i) { + codeToGID[i] = 0; + if (charProcs && (name = enc[i])) { + for (j = 0; j < charProcs->getLength(); j++) { + if (strcmp(name, charProcs->getKey(j)) == 0) { + codeToGID[i] = j; + } + } + } + } + + return new CairoType3Font(ref, doc, font_face, codeToGID, codeToGIDLen, printing); +} + +CairoType3Font::CairoType3Font(Ref ref, + PDFDoc *doc, + cairo_font_face_t *cairo_font_face, + int *codeToGID, + Guint codeToGIDLen, + GBool printing) : CairoFont(ref, + cairo_font_face, + codeToGID, + codeToGIDLen, + gFalse, + printing), + doc(doc) { } + +CairoType3Font::~CairoType3Font() { } + +GBool +CairoType3Font::matches(Ref &other, GBool printingA) { + return (other.num == ref.num && other.gen == ref.gen && printing == printingA); +} + + +//------------------------------------------------------------------------ +// CairoFontEngine +//------------------------------------------------------------------------ + +CairoFontEngine::CairoFontEngine(FT_Library libA) { + int i; + + lib = libA; + for (i = 0; i < cairoFontCacheSize; ++i) { + fontCache[i] = NULL; + } + + FT_Int major, minor, patch; + // as of FT 2.1.8, CID fonts are indexed by CID instead of GID + FT_Library_Version(lib, &major, &minor, &patch); + useCIDs = major > 2 || + (major == 2 && (minor > 1 || (minor == 1 && patch > 7))); +} + +CairoFontEngine::~CairoFontEngine() { + int i; + + for (i = 0; i < cairoFontCacheSize; ++i) { + if (fontCache[i]) + delete fontCache[i]; + } +} + +CairoFont * +CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing) { + int i, j; + Ref ref; + CairoFont *font; + GfxFontType fontType; + + ref = *gfxFont->getID(); + + for (i = 0; i < cairoFontCacheSize; ++i) { + font = fontCache[i]; + if (font && font->matches(ref, printing)) { + for (j = i; j > 0; --j) { + fontCache[j] = fontCache[j-1]; + } + fontCache[0] = font; + return font; + } + } + + fontType = gfxFont->getType(); + if (fontType == fontType3) + font = CairoType3Font::create (gfxFont, doc, this, printing); + else + font = CairoFreeTypeFont::create (gfxFont, doc->getXRef(), lib, useCIDs); + + //XXX: if font is null should we still insert it into the cache? + if (fontCache[cairoFontCacheSize - 1]) { + delete fontCache[cairoFontCacheSize - 1]; + } + for (j = cairoFontCacheSize - 1; j > 0; --j) { + fontCache[j] = fontCache[j-1]; + } + fontCache[0] = font; + return font; +} diff --git a/poppler/CairoFontEngine.h b/poppler/CairoFontEngine.h new file mode 100644 index 0000000..6335348 --- /dev/null +++ b/poppler/CairoFontEngine.h @@ -0,0 +1,124 @@ +//======================================================================== +// +// CairoFontEngine.h +// +// Copyright 2003 Glyph & Cog, LLC +// Copyright 2004 Red Hat, Inc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2005 Albert Astals Cid +// Copyright (C) 2006, 2007 Jeff Muizelaar +// Copyright (C) 2006, 2010 Carlos Garcia Campos +// Copyright (C) 2008 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef CAIROFONTENGINE_H +#define CAIROFONTENGINE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include + +#include "GfxFont.h" +#include "PDFDoc.h" + +class CairoFontEngine; + +class CairoFont { +public: + CairoFont(Ref ref, + cairo_font_face_t *face, + int *codeToGID, + Guint codeToGIDLen, + GBool substitute, + GBool printing); + virtual ~CairoFont(); + + virtual GBool matches(Ref &other, GBool printing); + cairo_font_face_t *getFontFace(void); + unsigned long getGlyph(CharCode code, Unicode *u, int uLen); + double getSubstitutionCorrection(GfxFont *gfxFont); + + GBool isSubstitute() { return substitute; } +protected: + Ref ref; + cairo_font_face_t *cairo_font_face; + + int *codeToGID; + Guint codeToGIDLen; + + GBool substitute; + GBool printing; +}; + +//------------------------------------------------------------------------ + +class CairoFreeTypeFont : public CairoFont { +public: + static CairoFreeTypeFont *create(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs); + virtual ~CairoFreeTypeFont(); + +private: + CairoFreeTypeFont(Ref ref, cairo_font_face_t *cairo_font_face, + int *codeToGID, Guint codeToGIDLen, GBool substitute); +}; + +//------------------------------------------------------------------------ + +class CairoType3Font : public CairoFont { +public: + static CairoType3Font *create(GfxFont *gfxFont, PDFDoc *doc, + CairoFontEngine *fontEngine, + GBool printing); + virtual ~CairoType3Font(); + + virtual GBool matches(Ref &other, GBool printing); + +private: + CairoType3Font(Ref ref, PDFDoc *doc, + cairo_font_face_t *cairo_font_face, + int *codeToGID, Guint codeToGIDLen, + GBool printing); + PDFDoc *doc; +}; + +//------------------------------------------------------------------------ + +#define cairoFontCacheSize 64 + +//------------------------------------------------------------------------ +// CairoFontEngine +//------------------------------------------------------------------------ + +class CairoFontEngine { +public: + + // Create a font engine. + CairoFontEngine(FT_Library libA); + ~CairoFontEngine(); + + CairoFont *getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing); + +private: + CairoFont *fontCache[cairoFontCacheSize]; + FT_Library lib; + GBool useCIDs; +}; + +#endif diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc new file mode 100644 index 0000000..b70183e --- /dev/null +++ b/poppler/CairoOutputDev.cc @@ -0,0 +1,3121 @@ +//======================================================================== +// +// CairoOutputDev.cc +// +// Copyright 2003 Glyph & Cog, LLC +// Copyright 2004 Red Hat, Inc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2008 Jeff Muizelaar +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2005, 2009, 2012 Albert Astals Cid +// Copyright (C) 2005 Nickolay V. Shmyrev +// Copyright (C) 2006-2011 Carlos Garcia Campos +// Copyright (C) 2008 Carl Worth +// Copyright (C) 2008-2012 Adrian Johnson +// Copyright (C) 2008 Michael Vrable +// Copyright (C) 2008, 2009 Chris Wilson +// Copyright (C) 2008 Hib Eris +// Copyright (C) 2009, 2010 David Benjamin +// Copyright (C) 2011, 2012 Thomas Freitag +// Copyright (C) 2012 Patrick Pfeifer +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include + +#include "goo/gfile.h" +#include "goo/gtypes_p.h" +#include "GlobalParams.h" +#include "Error.h" +#include "Object.h" +#include "Gfx.h" +#include "GfxState.h" +#include "GfxFont.h" +#include "Page.h" +#include "Link.h" +#include "FontEncodingTables.h" +#include "PDFDocEncoding.h" +#include +#include +#include "CairoOutputDev.h" +#include "CairoFontEngine.h" +#include "CairoRescaleBox.h" +#include "UTF8.h" +//------------------------------------------------------------------------ + +// #define LOG_CAIRO + +#ifdef LOG_CAIRO +#define LOG(x) (x) +#else +#define LOG(x) +#endif + +static inline void printMatrix(cairo_matrix_t *matrix){ + printf("%f %f, %f %f (%f %f)\n", matrix->xx, matrix->yx, + matrix->xy, matrix->yy, + matrix->x0, matrix->y0); +} + + +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) + + +//------------------------------------------------------------------------ +// CairoImage +//------------------------------------------------------------------------ + +CairoImage::CairoImage (double x1, double y1, double x2, double y2) { + this->image = NULL; + this->x1 = x1; + this->y1 = y1; + this->x2 = x2; + this->y2 = y2; +} + +CairoImage::~CairoImage () { + if (image) + cairo_surface_destroy (image); +} + +void CairoImage::setImage (cairo_surface_t *image) { + if (this->image) + cairo_surface_destroy (this->image); + this->image = cairo_surface_reference (image); +} + +//------------------------------------------------------------------------ +// CairoOutputDev +//------------------------------------------------------------------------ + +// We cannot tie the lifetime of an FT_Library object to that of +// CairoOutputDev, since any FT_Faces created with it may end up with a +// reference by Cairo which can be held long after the CairoOutputDev is +// deleted. The simplest way to avoid problems is to never tear down the +// FT_Library instance; to avoid leaks, just use a single global instance +// initialized the first time it is needed. +FT_Library CairoOutputDev::ft_lib; +GBool CairoOutputDev::ft_lib_initialized = gFalse; + +CairoOutputDev::CairoOutputDev() { + doc = NULL; + + if (!ft_lib_initialized) { + FT_Init_FreeType(&ft_lib); + ft_lib_initialized = gTrue; + } + + fontEngine = NULL; + fontEngine_owner = gFalse; + glyphs = NULL; + fill_pattern = NULL; + fill_color.r = fill_color.g = fill_color.b = 0; + stroke_pattern = NULL; + stroke_color.r = stroke_color.g = stroke_color.b = 0; + stroke_opacity = 1.0; + fill_opacity = 1.0; + textClipPath = NULL; + strokePathClip = NULL; + cairo = NULL; + currentFont = NULL; + prescaleImages = gTrue; + printing = gTrue; + use_show_text_glyphs = gFalse; + inType3Char = gFalse; + t3_glyph_has_bbox = gFalse; + + groupColorSpaceStack = NULL; + maskStack = NULL; + group = NULL; + mask = NULL; + shape = NULL; + cairo_shape = NULL; + knockoutCount = 0; + + text = NULL; + actualText = NULL; + + // the SA parameter supposedly defaults to false, but Acrobat + // apparently hardwires it to true + stroke_adjust = globalParams->getStrokeAdjust(); + align_stroke_coords = gFalse; + adjusted_stroke_width = gFalse; +} + +CairoOutputDev::~CairoOutputDev() { + if (fontEngine_owner && fontEngine) { + delete fontEngine; + } + + if (cairo) + cairo_destroy (cairo); + cairo_pattern_destroy (stroke_pattern); + cairo_pattern_destroy (fill_pattern); + if (group) + cairo_pattern_destroy (group); + if (mask) + cairo_pattern_destroy (mask); + if (shape) + cairo_pattern_destroy (shape); + if (text) + text->decRefCnt(); + if (actualText) + delete actualText; +} + +void CairoOutputDev::setCairo(cairo_t *cairo) +{ + if (this->cairo != NULL) { + cairo_status_t status = cairo_status (this->cairo); + if (status) { + error(errInternal, -1, "cairo context error: {0:s}\n", cairo_status_to_string(status)); + } + cairo_destroy (this->cairo); + assert(!cairo_shape); + } + if (cairo != NULL) { + this->cairo = cairo_reference (cairo); + /* save the initial matrix so that we can use it for type3 fonts. */ + //XXX: is this sufficient? could we miss changes to the matrix somehow? + cairo_get_matrix(cairo, &orig_matrix); + } else { + this->cairo = NULL; + this->cairo_shape = NULL; + } +} + +void CairoOutputDev::setTextPage(TextPage *text) +{ + if (this->text) + this->text->decRefCnt(); + if (actualText) + delete actualText; + if (text) { + this->text = text; + this->text->incRefCnt(); + actualText = new ActualText(text); + } else { + this->text = NULL; + actualText = NULL; + } +} + +void CairoOutputDev::startDoc(PDFDoc *docA, + CairoFontEngine *parentFontEngine) { + doc = docA; + if (parentFontEngine) { + fontEngine = parentFontEngine; + } else { + if (fontEngine) { + delete fontEngine; + } + fontEngine = new CairoFontEngine(ft_lib); + fontEngine_owner = gTrue; + } +} + +void CairoOutputDev::startPage(int pageNum, GfxState *state) { + /* set up some per page defaults */ + cairo_pattern_destroy(fill_pattern); + cairo_pattern_destroy(stroke_pattern); + + fill_pattern = cairo_pattern_create_rgb(0., 0., 0.); + stroke_pattern = cairo_pattern_reference(fill_pattern); + + if (text) + text->startPage(state); +} + +void CairoOutputDev::endPage() { + if (text) { + text->endPage(); + text->coalesce(gTrue, 0, gFalse); + } +} + +void CairoOutputDev::saveState(GfxState *state) { + LOG(printf ("save\n")); + cairo_save (cairo); + if (cairo_shape) + cairo_save (cairo_shape); + + MaskStack *ms = new MaskStack; + ms->mask = cairo_pattern_reference(mask); + ms->mask_matrix = mask_matrix; + ms->next = maskStack; + maskStack = ms; +} + +void CairoOutputDev::restoreState(GfxState *state) { + LOG(printf ("restore\n")); + cairo_restore (cairo); + if (cairo_shape) + cairo_restore (cairo_shape); + + /* These aren't restored by cairo_restore() since we keep them in + * the output device. */ + updateFillColor(state); + updateStrokeColor(state); + updateFillOpacity(state); + updateStrokeOpacity(state); + updateBlendMode(state); + + MaskStack* ms = maskStack; + if (ms) { + if (mask) + cairo_pattern_destroy(mask); + mask = ms->mask; + mask_matrix = ms->mask_matrix; + maskStack = ms->next; + delete ms; + } +} + +void CairoOutputDev::updateAll(GfxState *state) { + updateLineDash(state); + updateLineJoin(state); + updateLineCap(state); + updateLineWidth(state); + updateFlatness(state); + updateMiterLimit(state); + updateFillColor(state); + updateStrokeColor(state); + updateFillOpacity(state); + updateStrokeOpacity(state); + updateBlendMode(state); + needFontUpdate = gTrue; + if (text) + text->updateFont(state); +} + +void CairoOutputDev::setDefaultCTM(double *ctm) { + cairo_matrix_t matrix; + matrix.xx = ctm[0]; + matrix.yx = ctm[1]; + matrix.xy = ctm[2]; + matrix.yy = ctm[3]; + matrix.x0 = ctm[4]; + matrix.y0 = ctm[5]; + + cairo_transform (cairo, &matrix); + if (cairo_shape) + cairo_transform (cairo_shape, &matrix); + + OutputDev::setDefaultCTM(ctm); +} + +void CairoOutputDev::updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, + double m31, double m32) { + cairo_matrix_t matrix, invert_matrix; + matrix.xx = m11; + matrix.yx = m12; + matrix.xy = m21; + matrix.yy = m22; + matrix.x0 = m31; + matrix.y0 = m32; + + /* Make sure the matrix is invertible before setting it. + * cairo will blow up if we give it a matrix that's not + * invertible, so we need to check before passing it + * to cairo_transform. Ignoring it is likely to give better + * results than not rendering anything at all. See #14398 + * + * Ideally, we could do the cairo_transform + * and then check if anything went wrong and fix it then + * instead of having to invert the matrix. */ + invert_matrix = matrix; + if (cairo_matrix_invert(&invert_matrix)) { + error(errSyntaxWarning, -1, "matrix not invertible\n"); + return; + } + + cairo_transform (cairo, &matrix); + if (cairo_shape) + cairo_transform (cairo_shape, &matrix); + updateLineDash(state); + updateLineJoin(state); + updateLineCap(state); + updateLineWidth(state); +} + +void CairoOutputDev::updateLineDash(GfxState *state) { + double *dashPattern; + int dashLength; + double dashStart; + + state->getLineDash(&dashPattern, &dashLength, &dashStart); + cairo_set_dash (cairo, dashPattern, dashLength, dashStart); + if (cairo_shape) + cairo_set_dash (cairo_shape, dashPattern, dashLength, dashStart); +} + +void CairoOutputDev::updateFlatness(GfxState *state) { + // cairo_set_tolerance (cairo, state->getFlatness()); +} + +void CairoOutputDev::updateLineJoin(GfxState *state) { + switch (state->getLineJoin()) { + case 0: + cairo_set_line_join (cairo, CAIRO_LINE_JOIN_MITER); + break; + case 1: + cairo_set_line_join (cairo, CAIRO_LINE_JOIN_ROUND); + break; + case 2: + cairo_set_line_join (cairo, CAIRO_LINE_JOIN_BEVEL); + break; + } + if (cairo_shape) + cairo_set_line_join (cairo_shape, cairo_get_line_join(cairo)); +} + +void CairoOutputDev::updateLineCap(GfxState *state) { + switch (state->getLineCap()) { + case 0: + cairo_set_line_cap (cairo, CAIRO_LINE_CAP_BUTT); + break; + case 1: + cairo_set_line_cap (cairo, CAIRO_LINE_CAP_ROUND); + break; + case 2: + cairo_set_line_cap (cairo, CAIRO_LINE_CAP_SQUARE); + break; + } + if (cairo_shape) + cairo_set_line_cap (cairo_shape, cairo_get_line_cap(cairo)); +} + +void CairoOutputDev::updateMiterLimit(GfxState *state) { + cairo_set_miter_limit (cairo, state->getMiterLimit()); + if (cairo_shape) + cairo_set_miter_limit (cairo_shape, state->getMiterLimit()); +} + +void CairoOutputDev::updateLineWidth(GfxState *state) { + LOG(printf ("line width: %f\n", state->getLineWidth())); + adjusted_stroke_width = gFalse; + double width = state->getLineWidth(); + if (stroke_adjust && !printing) { + double x, y; + x = y = width; + + /* find out line width in device units */ + cairo_user_to_device_distance(cairo, &x, &y); + if (fabs(x) <= 1.0 && fabs(y) <= 1.0) { + /* adjust width to at least one device pixel */ + x = y = 1.0; + cairo_device_to_user_distance(cairo, &x, &y); + width = MIN(fabs(x),fabs(y)); + adjusted_stroke_width = gTrue; + } + } else if (width == 0.0) { + /* Cairo does not support 0 line width == 1 device pixel. Find out + * how big pixels (device unit) are in the x and y + * directions. Choose the smaller of the two as our line width. + */ + double x = 1.0, y = 1.0; + if (printing) { + // assume printer pixel size is 1/600 inch + x = 72.0/600; + y = 72.0/600; + } + cairo_device_to_user_distance(cairo, &x, &y); + width = MIN(fabs(x),fabs(y)); + } + cairo_set_line_width (cairo, width); + if (cairo_shape) + cairo_set_line_width (cairo_shape, cairo_get_line_width (cairo)); +} + +void CairoOutputDev::updateFillColor(GfxState *state) { + GfxRGB color = fill_color; + + state->getFillRGB(&fill_color); + if (cairo_pattern_get_type (fill_pattern) != CAIRO_PATTERN_TYPE_SOLID || + color.r != fill_color.r || + color.g != fill_color.g || + color.b != fill_color.b) + { + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_rgba(colToDbl(fill_color.r), + colToDbl(fill_color.g), + colToDbl(fill_color.b), + fill_opacity); + + LOG(printf ("fill color: %d %d %d\n", + fill_color.r, fill_color.g, fill_color.b)); + } +} + +void CairoOutputDev::updateStrokeColor(GfxState *state) { + GfxRGB color = stroke_color; + + state->getStrokeRGB(&stroke_color); + if (cairo_pattern_get_type (fill_pattern) != CAIRO_PATTERN_TYPE_SOLID || + color.r != stroke_color.r || + color.g != stroke_color.g || + color.b != stroke_color.b) + { + cairo_pattern_destroy(stroke_pattern); + stroke_pattern = cairo_pattern_create_rgba(colToDbl(stroke_color.r), + colToDbl(stroke_color.g), + colToDbl(stroke_color.b), + stroke_opacity); + + LOG(printf ("stroke color: %d %d %d\n", + stroke_color.r, stroke_color.g, stroke_color.b)); + } +} + +void CairoOutputDev::updateFillOpacity(GfxState *state) { + double opacity = fill_opacity; + + fill_opacity = state->getFillOpacity(); + if (opacity != fill_opacity) { + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_rgba(colToDbl(fill_color.r), + colToDbl(fill_color.g), + colToDbl(fill_color.b), + fill_opacity); + + LOG(printf ("fill opacity: %f\n", fill_opacity)); + } +} + +void CairoOutputDev::updateStrokeOpacity(GfxState *state) { + double opacity = stroke_opacity; + + stroke_opacity = state->getStrokeOpacity(); + if (opacity != stroke_opacity) { + cairo_pattern_destroy(stroke_pattern); + stroke_pattern = cairo_pattern_create_rgba(colToDbl(stroke_color.r), + colToDbl(stroke_color.g), + colToDbl(stroke_color.b), + stroke_opacity); + + LOG(printf ("stroke opacity: %f\n", stroke_opacity)); + } +} + +void CairoOutputDev::updateFillColorStop(GfxState *state, double offset) { + state->getFillRGB(&fill_color); + + cairo_pattern_add_color_stop_rgba(fill_pattern, offset, + colToDbl(fill_color.r), + colToDbl(fill_color.g), + colToDbl(fill_color.b), + fill_opacity); + LOG(printf ("fill color stop: %f (%d, %d, %d)\n", + offset, fill_color.r, fill_color.g, fill_color.b)); +} + +void CairoOutputDev::updateBlendMode(GfxState *state) { + switch (state->getBlendMode()) { + default: + case gfxBlendNormal: + cairo_set_operator (cairo, CAIRO_OPERATOR_OVER); + break; + case gfxBlendMultiply: + cairo_set_operator (cairo, CAIRO_OPERATOR_MULTIPLY); + break; + case gfxBlendScreen: + cairo_set_operator (cairo, CAIRO_OPERATOR_SCREEN); + break; + case gfxBlendOverlay: + cairo_set_operator (cairo, CAIRO_OPERATOR_OVERLAY); + break; + case gfxBlendDarken: + cairo_set_operator (cairo, CAIRO_OPERATOR_DARKEN); + break; + case gfxBlendLighten: + cairo_set_operator (cairo, CAIRO_OPERATOR_LIGHTEN); + break; + case gfxBlendColorDodge: + cairo_set_operator (cairo, CAIRO_OPERATOR_COLOR_DODGE); + break; + case gfxBlendColorBurn: + cairo_set_operator (cairo, CAIRO_OPERATOR_COLOR_BURN); + break; + case gfxBlendHardLight: + cairo_set_operator (cairo, CAIRO_OPERATOR_HARD_LIGHT); + break; + case gfxBlendSoftLight: + cairo_set_operator (cairo, CAIRO_OPERATOR_SOFT_LIGHT); + break; + case gfxBlendDifference: + cairo_set_operator (cairo, CAIRO_OPERATOR_DIFFERENCE); + break; + case gfxBlendExclusion: + cairo_set_operator (cairo, CAIRO_OPERATOR_EXCLUSION); + break; + case gfxBlendHue: + cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_HUE); + break; + case gfxBlendSaturation: + cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_SATURATION); + break; + case gfxBlendColor: + cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_COLOR); + break; + case gfxBlendLuminosity: + cairo_set_operator (cairo, CAIRO_OPERATOR_HSL_LUMINOSITY); + break; + } + LOG(printf ("blend mode: %d\n", (int)state->getBlendMode())); +} + +void CairoOutputDev::updateFont(GfxState *state) { + cairo_font_face_t *font_face; + cairo_matrix_t matrix, invert_matrix; + + LOG(printf ("updateFont() font=%s\n", state->getFont()->getName()->getCString())); + + needFontUpdate = gFalse; + + //FIXME: use cairo font engine? + if (text) + text->updateFont(state); + + currentFont = fontEngine->getFont (state->getFont(), doc, printing); + + if (!currentFont) + return; + + font_face = currentFont->getFontFace(); + cairo_set_font_face (cairo, font_face); + + use_show_text_glyphs = state->getFont()->hasToUnicodeCMap() && + cairo_surface_has_show_text_glyphs (cairo_get_target (cairo)); + + double fontSize = state->getFontSize(); + double *m = state->getTextMat(); + /* NOTE: adjusting by a constant is hack. The correct solution + * is probably to use user-fonts and compute the scale on a per + * glyph basis instead of for the entire font */ + double w = currentFont->getSubstitutionCorrection(state->getFont()); + matrix.xx = m[0] * fontSize * state->getHorizScaling() * w; + matrix.yx = m[1] * fontSize * state->getHorizScaling() * w; + matrix.xy = -m[2] * fontSize; + matrix.yy = -m[3] * fontSize; + matrix.x0 = 0; + matrix.y0 = 0; + + LOG(printf ("font matrix: %f %f %f %f\n", matrix.xx, matrix.yx, matrix.xy, matrix.yy)); + + /* Make sure the font matrix is invertible before setting it. cairo + * will blow up if we give it a matrix that's not invertible, so we + * need to check before passing it to cairo_set_font_matrix. Ignoring it + * is likely to give better results than not rendering anything at + * all. See #18254. + */ + invert_matrix = matrix; + if (cairo_matrix_invert(&invert_matrix)) { + error(errSyntaxWarning, -1, "font matrix not invertible\n"); + return; + } + + cairo_set_font_matrix (cairo, &matrix); +} + +/* Tolerance in pixels for checking if strokes are horizontal or vertical + * lines in device space */ +#define STROKE_COORD_TOLERANCE 0.5 + +/* Align stroke coordinate i if the point is the start or end of a + * horizontal or vertical line */ +void CairoOutputDev::alignStrokeCoords(GfxSubpath *subpath, int i, double *x, double *y) +{ + double x1, y1, x2, y2; + GBool align = gFalse; + + x1 = subpath->getX(i); + y1 = subpath->getY(i); + cairo_user_to_device (cairo, &x1, &y1); + + // Does the current coord and prev coord form a horiz or vert line? + if (i > 0 && !subpath->getCurve(i - 1)) { + x2 = subpath->getX(i - 1); + y2 = subpath->getY(i - 1); + cairo_user_to_device (cairo, &x2, &y2); + if (fabs(x2 - x1) < STROKE_COORD_TOLERANCE || fabs(y2 - y1) < STROKE_COORD_TOLERANCE) + align = gTrue; + } + + // Does the current coord and next coord form a horiz or vert line? + if (i < subpath->getNumPoints() - 1 && !subpath->getCurve(i + 1)) { + x2 = subpath->getX(i + 1); + y2 = subpath->getY(i + 1); + cairo_user_to_device (cairo, &x2, &y2); + if (fabs(x2 - x1) < STROKE_COORD_TOLERANCE || fabs(y2 - y1) < STROKE_COORD_TOLERANCE) + align = gTrue; + } + + *x = subpath->getX(i); + *y = subpath->getY(i); + if (align) { + /* see http://www.cairographics.org/FAQ/#sharp_lines */ + cairo_user_to_device (cairo, x, y); + *x = floor(*x) + 0.5; + *y = floor(*y) + 0.5; + cairo_device_to_user (cairo, x, y); + } +} + +#undef STROKE_COORD_TOLERANCE + +void CairoOutputDev::doPath(cairo_t *cairo, GfxState *state, GfxPath *path) { + GfxSubpath *subpath; + int i, j; + double x, y; + cairo_new_path (cairo); + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + if (subpath->getNumPoints() > 0) { + if (align_stroke_coords) { + alignStrokeCoords(subpath, 0, &x, &y); + } else { + x = subpath->getX(0); + y = subpath->getY(0); + } + cairo_move_to (cairo, x, y); + j = 1; + while (j < subpath->getNumPoints()) { + if (subpath->getCurve(j)) { + if (align_stroke_coords) { + alignStrokeCoords(subpath, j + 2, &x, &y); + } else { + x = subpath->getX(j+2); + y = subpath->getY(j+2); + } + cairo_curve_to( cairo, + subpath->getX(j), subpath->getY(j), + subpath->getX(j+1), subpath->getY(j+1), + x, y); + + j += 3; + } else { + if (align_stroke_coords) { + alignStrokeCoords(subpath, j, &x, &y); + } else { + x = subpath->getX(j); + y = subpath->getY(j); + } + cairo_line_to (cairo, x, y); + ++j; + } + } + if (subpath->isClosed()) { + LOG (printf ("close\n")); + cairo_close_path (cairo); + } + } + } +} + +void CairoOutputDev::stroke(GfxState *state) { + if (inType3Char) { + GfxGray gray; + state->getFillGray(&gray); + if (colToDbl(gray) > 0.5) + return; + } + + if (adjusted_stroke_width) + align_stroke_coords = gTrue; + doPath (cairo, state, state->getPath()); + align_stroke_coords = gFalse; + cairo_set_source (cairo, stroke_pattern); + LOG(printf ("stroke\n")); + cairo_stroke (cairo); + if (cairo_shape) { + doPath (cairo_shape, state, state->getPath()); + cairo_stroke (cairo_shape); + } +} + +void CairoOutputDev::fill(GfxState *state) { + if (inType3Char) { + GfxGray gray; + state->getFillGray(&gray); + if (colToDbl(gray) > 0.5) + return; + } + + doPath (cairo, state, state->getPath()); + cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_WINDING); + cairo_set_source (cairo, fill_pattern); + LOG(printf ("fill\n")); + //XXX: how do we get the path + if (mask) { + cairo_save (cairo); + cairo_clip (cairo); + cairo_set_matrix (cairo, &mask_matrix); + cairo_mask (cairo, mask); + cairo_restore (cairo); + } else if (strokePathClip) { + fillToStrokePathClip(state); + } else { + cairo_fill (cairo); + } + if (cairo_shape) { + cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_WINDING); + doPath (cairo_shape, state, state->getPath()); + cairo_fill (cairo_shape); + } +} + +void CairoOutputDev::eoFill(GfxState *state) { + doPath (cairo, state, state->getPath()); + cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_EVEN_ODD); + cairo_set_source (cairo, fill_pattern); + LOG(printf ("fill-eo\n")); + cairo_fill (cairo); + + if (cairo_shape) { + cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_EVEN_ODD); + doPath (cairo_shape, state, state->getPath()); + cairo_fill (cairo_shape); + } + +} + +GBool CairoOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx1, Catalog *cat, Object *str, + double *pmat, int paintType, int /*tilingType*/, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) +{ + PDFRectangle box; + Gfx *gfx; + cairo_pattern_t *pattern; + cairo_surface_t *surface; + cairo_matrix_t matrix; + cairo_t *old_cairo; + double xMin, yMin, xMax, yMax; + double width, height; + int surface_width, surface_height; + StrokePathClip *strokePathTmp; + + width = bbox[2] - bbox[0]; + height = bbox[3] - bbox[1]; + + if (xStep != width || yStep != height) + return gFalse; + /* TODO: implement the other cases here too */ + + surface_width = (int) ceil (width); + surface_height = (int) ceil (height); + + surface = cairo_surface_create_similar (cairo_get_target (cairo), + CAIRO_CONTENT_COLOR_ALPHA, + surface_width, surface_height); + if (cairo_surface_status (surface)) + return gFalse; + + old_cairo = cairo; + cairo = cairo_create (surface); + cairo_surface_destroy (surface); + + box.x1 = bbox[0]; box.y1 = bbox[1]; + box.x2 = bbox[2]; box.y2 = bbox[3]; + strokePathTmp = strokePathClip; + strokePathClip = NULL; + gfx = new Gfx(doc, this, resDict, &box, NULL); + gfx->display(str); + delete gfx; + strokePathClip = strokePathTmp; + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cairo)); + cairo_destroy (cairo); + cairo = old_cairo; + if (cairo_pattern_status (pattern)) + return gFalse; + + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + cairo_rectangle (cairo, xMin, yMin, xMax - xMin, yMax - yMin); + + cairo_matrix_init_scale (&matrix, surface_width / width, surface_height / height); + cairo_pattern_set_matrix (pattern, &matrix); + + cairo_matrix_init (&matrix, mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + cairo_transform (cairo, &matrix); + cairo_set_source (cairo, pattern); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + if (strokePathClip) { + fillToStrokePathClip(state); + } else { + cairo_fill (cairo); + } + + cairo_pattern_destroy (pattern); + + return gTrue; +} + +GBool CairoOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax) { + double x0, y0, x1, y1; + double dx, dy; + + shading->getCoords(&x0, &y0, &x1, &y1); + dx = x1 - x0; + dy = y1 - y0; + + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_linear (x0 + tMin * dx, y0 + tMin * dy, + x0 + tMax * dx, y0 + tMax * dy); + if (!shading->getExtend0() && !shading->getExtend1()) + cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_NONE); + else + cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_PAD); + + LOG (printf ("axial-sh\n")); + + // TODO: use the actual stops in the shading in the case + // of linear interpolation (Type 2 Exponential functions with N=1) + return gFalse; +} + +GBool CairoOutputDev::axialShadedSupportExtend(GfxState *state, GfxAxialShading *shading) +{ + return (shading->getExtend0() == shading->getExtend1()); +} + +GBool CairoOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double sMin, double sMax) { + double x0, y0, r0, x1, y1, r1; + double dx, dy, dr; + + shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1); + dx = x1 - x0; + dy = y1 - y0; + dr = r1 - r0; + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_radial (x0 + sMin * dx, + y0 + sMin * dy, + r0 + sMin * dr, + x0 + sMax * dx, + y0 + sMax * dy, + r0 + sMax * dr); + if (shading->getExtend0() && shading->getExtend1()) + cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_PAD); + else + cairo_pattern_set_extend (fill_pattern, CAIRO_EXTEND_NONE); + + LOG (printf ("radial-sh\n")); + + return gFalse; +} + +GBool CairoOutputDev::radialShadedSupportExtend(GfxState *state, GfxRadialShading *shading) +{ + return (shading->getExtend0() == shading->getExtend1()); +} + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) +GBool CairoOutputDev::gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading) +{ + double x0, y0, x1, y1, x2, y2; + GfxColor color[3]; + int i, j; + GfxRGB rgb; + + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_mesh (); + + for (i = 0; i < shading->getNTriangles(); i++) { + shading->getTriangle(i, + &x0, &y0, &color[0], + &x1, &y1, &color[1], + &x2, &y2, &color[2]); + + cairo_mesh_pattern_begin_patch (fill_pattern); + + cairo_mesh_pattern_move_to (fill_pattern, x0, y0); + cairo_mesh_pattern_line_to (fill_pattern, x1, y1); + cairo_mesh_pattern_line_to (fill_pattern, x2, y2); + + for (j = 0; j < 3; j++) { + shading->getColorSpace()->getRGB(&color[j], &rgb); + cairo_mesh_pattern_set_corner_color_rgb (fill_pattern, j, + colToDbl(rgb.r), + colToDbl(rgb.g), + colToDbl(rgb.b)); + } + + cairo_mesh_pattern_end_patch (fill_pattern); + } + + double xMin, yMin, xMax, yMax; + // get the clip region bbox + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMin, yMax); + state->lineTo(xMax, yMax); + state->lineTo(xMax, yMin); + state->closePath(); + fill(state); + state->clearPath(); + + return gTrue; +} + +GBool CairoOutputDev::patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading) +{ + int i, j, k; + + cairo_pattern_destroy(fill_pattern); + fill_pattern = cairo_pattern_create_mesh (); + + for (i = 0; i < shading->getNPatches(); i++) { + GfxPatch *patch = shading->getPatch(i); + GfxColor color; + GfxRGB rgb; + + cairo_mesh_pattern_begin_patch (fill_pattern); + + cairo_mesh_pattern_move_to (fill_pattern, patch->x[0][0], patch->y[0][0]); + cairo_mesh_pattern_curve_to (fill_pattern, + patch->x[0][1], patch->y[0][1], + patch->x[0][2], patch->y[0][2], + patch->x[0][3], patch->y[0][3]); + + cairo_mesh_pattern_curve_to (fill_pattern, + patch->x[1][3], patch->y[1][3], + patch->x[2][3], patch->y[2][3], + patch->x[3][3], patch->y[3][3]); + + cairo_mesh_pattern_curve_to (fill_pattern, + patch->x[3][2], patch->y[3][2], + patch->x[3][1], patch->y[3][1], + patch->x[3][0], patch->y[3][0]); + + cairo_mesh_pattern_curve_to (fill_pattern, + patch->x[2][0], patch->y[2][0], + patch->x[1][0], patch->y[1][0], + patch->x[0][0], patch->y[0][0]); + + cairo_mesh_pattern_set_control_point (fill_pattern, 0, patch->x[1][1], patch->y[1][1]); + cairo_mesh_pattern_set_control_point (fill_pattern, 1, patch->x[1][2], patch->y[1][2]); + cairo_mesh_pattern_set_control_point (fill_pattern, 2, patch->x[2][2], patch->y[2][2]); + cairo_mesh_pattern_set_control_point (fill_pattern, 3, patch->x[2][1], patch->y[2][1]); + + for (j = 0; j < 4; j++) { + int u, v; + + switch (j) { + case 0: + u = 0; v = 0; + break; + case 1: + u = 0; v = 1; + break; + case 2: + u = 1; v = 1; + break; + case 3: + u = 1; v = 0; + break; + } + + if (shading->isParameterized()) { + shading->getParameterizedColor (patch->color[u][v].c[0], &color); + } else { + for (k = 0; k < shading->getColorSpace()->getNComps(); k++) { + // simply cast to the desired type; that's all what is needed. + color.c[k] = GfxColorComp (patch->color[u][v].c[k]); + } + } + + shading->getColorSpace()->getRGB(&color, &rgb); + cairo_mesh_pattern_set_corner_color_rgb (fill_pattern, j, + colToDbl(rgb.r), + colToDbl(rgb.g), + colToDbl(rgb.b)); + } + cairo_mesh_pattern_end_patch (fill_pattern); + } + + double xMin, yMin, xMax, yMax; + // get the clip region bbox + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMin, yMax); + state->lineTo(xMax, yMax); + state->lineTo(xMax, yMin); + state->closePath(); + fill(state); + state->clearPath(); + + return gTrue; +} +#endif /* CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) */ + +void CairoOutputDev::clip(GfxState *state) { + doPath (cairo, state, state->getPath()); + cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_WINDING); + cairo_clip (cairo); + LOG (printf ("clip\n")); + if (cairo_shape) { + doPath (cairo_shape, state, state->getPath()); + cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_WINDING); + cairo_clip (cairo_shape); + } +} + +void CairoOutputDev::eoClip(GfxState *state) { + doPath (cairo, state, state->getPath()); + cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_EVEN_ODD); + cairo_clip (cairo); + LOG (printf ("clip-eo\n")); + if (cairo_shape) { + doPath (cairo_shape, state, state->getPath()); + cairo_set_fill_rule (cairo_shape, CAIRO_FILL_RULE_EVEN_ODD); + cairo_clip (cairo_shape); + } + +} + +void CairoOutputDev::clipToStrokePath(GfxState *state) { + LOG(printf("clip-to-stroke-path\n")); + strokePathClip = (StrokePathClip*)gmalloc (sizeof(*strokePathClip)); + strokePathClip->path = state->getPath()->copy(); + cairo_get_matrix (cairo, &strokePathClip->ctm); + strokePathClip->line_width = cairo_get_line_width (cairo); + strokePathClip->dash_count = cairo_get_dash_count (cairo); + if (strokePathClip->dash_count) { + strokePathClip->dashes = (double*) gmallocn (sizeof(double), strokePathClip->dash_count); + cairo_get_dash (cairo, strokePathClip->dashes, &strokePathClip->dash_offset); + } else { + strokePathClip->dashes = NULL; + } + strokePathClip->cap = cairo_get_line_cap (cairo); + strokePathClip->join = cairo_get_line_join (cairo); + strokePathClip->miter = cairo_get_miter_limit (cairo); +} + +void CairoOutputDev::fillToStrokePathClip(GfxState *state) { + cairo_save (cairo); + + cairo_set_matrix (cairo, &strokePathClip->ctm); + cairo_set_line_width (cairo, strokePathClip->line_width); + strokePathClip->dash_count = cairo_get_dash_count (cairo); + cairo_set_dash (cairo, strokePathClip->dashes, strokePathClip->dash_count, strokePathClip->dash_offset); + cairo_set_line_cap (cairo, strokePathClip->cap); + cairo_set_line_join (cairo, strokePathClip->join); + cairo_set_miter_limit (cairo, strokePathClip->miter); + doPath (cairo, state, strokePathClip->path); + cairo_stroke (cairo); + + cairo_restore (cairo); + + delete strokePathClip->path; + if (strokePathClip->dashes) + gfree (strokePathClip->dashes); + gfree (strokePathClip); + strokePathClip = NULL; +} + +void CairoOutputDev::beginString(GfxState *state, GooString *s) +{ + int len = s->getLength(); + + if (needFontUpdate) + updateFont(state); + + if (!currentFont) + return; + + glyphs = (cairo_glyph_t *) gmallocn (len, sizeof (cairo_glyph_t)); + glyphCount = 0; + if (use_show_text_glyphs) { + clusters = (cairo_text_cluster_t *) gmallocn (len, sizeof (cairo_text_cluster_t)); + clusterCount = 0; + utf8Max = len*2; // start with twice the number of glyphs. we will realloc if we need more. + utf8 = (char *) gmalloc (utf8Max); + utf8Count = 0; + } +} + +void CairoOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) +{ + if (currentFont) { + glyphs[glyphCount].index = currentFont->getGlyph (code, u, uLen); + glyphs[glyphCount].x = x - originX; + glyphs[glyphCount].y = y - originY; + glyphCount++; + if (use_show_text_glyphs) { + if (utf8Max - utf8Count < uLen*6) { + // utf8 encoded characters can be up to 6 bytes + if (utf8Max > uLen*6) + utf8Max *= 2; + else + utf8Max += 2*uLen*6; + utf8 = (char *) grealloc (utf8, utf8Max); + } + clusters[clusterCount].num_bytes = 0; + for (int i = 0; i < uLen; i++) { + int size = mapUTF8 (u[i], utf8 + utf8Count, utf8Max - utf8Count); + utf8Count += size; + clusters[clusterCount].num_bytes += size; + } + clusters[clusterCount].num_glyphs = 1; + clusterCount++; + } + } + + if (!text) + return; + actualText->addChar (state, x, y, dx, dy, code, nBytes, u, uLen); +} + +void CairoOutputDev::endString(GfxState *state) +{ + int render; + + if (!currentFont) + return; + + // endString can be called without a corresponding beginString. If this + // happens glyphs will be null so don't draw anything, just return. + // XXX: OutputDevs should probably not have to deal with this... + if (!glyphs) + return; + + // ignore empty strings and invisible text -- this is used by + // Acrobat Capture + render = state->getRender(); + if (render == 3 || glyphCount == 0) { + gfree(glyphs); + glyphs = NULL; + return; + } + + if (!(render & 1)) { + LOG (printf ("fill string\n")); + cairo_set_source (cairo, fill_pattern); + if (use_show_text_glyphs) + cairo_show_text_glyphs (cairo, utf8, utf8Count, glyphs, glyphCount, clusters, clusterCount, (cairo_text_cluster_flags_t)0); + else + cairo_show_glyphs (cairo, glyphs, glyphCount); + if (cairo_shape) + cairo_show_glyphs (cairo_shape, glyphs, glyphCount); + } + + // stroke + if ((render & 3) == 1 || (render & 3) == 2) { + LOG (printf ("stroke string\n")); + cairo_set_source (cairo, stroke_pattern); + cairo_glyph_path (cairo, glyphs, glyphCount); + cairo_stroke (cairo); + if (cairo_shape) { + cairo_glyph_path (cairo_shape, glyphs, glyphCount); + cairo_stroke (cairo_shape); + } + } + + // clip + if ((render & 4)) { + LOG (printf ("clip string\n")); + // append the glyph path to textClipPath. + + // set textClipPath as the currentPath + if (textClipPath) { + cairo_append_path (cairo, textClipPath); + if (cairo_shape) { + cairo_append_path (cairo_shape, textClipPath); + } + cairo_path_destroy (textClipPath); + } + + // append the glyph path + cairo_glyph_path (cairo, glyphs, glyphCount); + + // move the path back into textClipPath + // and clear the current path + textClipPath = cairo_copy_path (cairo); + cairo_new_path (cairo); + if (cairo_shape) { + cairo_new_path (cairo_shape); + } + } + + gfree (glyphs); + glyphs = NULL; + if (use_show_text_glyphs) { + gfree (clusters); + clusters = NULL; + gfree (utf8); + utf8 = NULL; + } +} + + +GBool CairoOutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) { + + cairo_save (cairo); + double *ctm; + cairo_matrix_t matrix; + + ctm = state->getCTM(); + matrix.xx = ctm[0]; + matrix.yx = ctm[1]; + matrix.xy = ctm[2]; + matrix.yy = ctm[3]; + matrix.x0 = ctm[4]; + matrix.y0 = ctm[5]; + /* Restore the original matrix and then transform to matrix needed for the + * type3 font. This is ugly but seems to work. Perhaps there is a better way to do it?*/ + cairo_set_matrix(cairo, &orig_matrix); + cairo_transform(cairo, &matrix); + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_set_matrix(cairo_shape, &orig_matrix); + cairo_transform(cairo_shape, &matrix); + } + cairo_pattern_destroy(stroke_pattern); + cairo_pattern_reference(fill_pattern); + stroke_pattern = fill_pattern; + return gFalse; +} + +void CairoOutputDev::endType3Char(GfxState *state) { + cairo_restore (cairo); + if (cairo_shape) { + cairo_restore (cairo_shape); + } +} + +void CairoOutputDev::type3D0(GfxState *state, double wx, double wy) { + t3_glyph_wx = wx; + t3_glyph_wy = wy; +} + +void CairoOutputDev::type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury) { + t3_glyph_wx = wx; + t3_glyph_wy = wy; + t3_glyph_bbox[0] = llx; + t3_glyph_bbox[1] = lly; + t3_glyph_bbox[2] = urx; + t3_glyph_bbox[3] = ury; + t3_glyph_has_bbox = gTrue; +} + +void CairoOutputDev::beginTextObject(GfxState *state) { +} + +void CairoOutputDev::endTextObject(GfxState *state) { + if (textClipPath) { + // clip the accumulated text path + cairo_append_path (cairo, textClipPath); + cairo_clip (cairo); + if (cairo_shape) { + cairo_append_path (cairo_shape, textClipPath); + cairo_clip (cairo_shape); + } + cairo_path_destroy (textClipPath); + textClipPath = NULL; + } +} + +void CairoOutputDev::beginActualText(GfxState *state, GooString *text) +{ + if (this->text) + actualText->begin(state, text); +} + +void CairoOutputDev::endActualText(GfxState *state) +{ + if (text) + actualText->end(state); +} + +static inline int splashRound(SplashCoord x) { + return (int)floor(x + 0.5); +} + +static inline int splashCeil(SplashCoord x) { + return (int)ceil(x); +} + +static inline int splashFloor(SplashCoord x) { + return (int)floor(x); +} + +static +cairo_surface_t *cairo_surface_create_similar_clip (cairo_t *cairo, cairo_content_t content) +{ + double x1, y1, x2, y2; + int width, height; + cairo_clip_extents (cairo, &x1, &y1, &x2, &y2); + cairo_matrix_t matrix; + cairo_get_matrix (cairo, &matrix); + //cairo_matrix_transform_point(&matrix, &x1, &y1); + //cairo_matrix_transform_point(&matrix, &x2, &y2);*/ + cairo_user_to_device(cairo, &x1, &y1); + cairo_user_to_device(cairo, &x2, &y2); + width = splashCeil(x2) - splashFloor(x1); + //XXX: negative matrix + ////height = splashCeil(y2) - splashFloor(y1); + height = splashFloor(y1) - splashCeil(y2); + cairo_surface_t *target = cairo_get_target (cairo); + cairo_surface_t *result; + + result = cairo_surface_create_similar (target, content, width, height); + double x_offset, y_offset; + cairo_surface_get_device_offset(target, &x_offset, &y_offset); + cairo_surface_set_device_offset(result, x_offset, y_offset); + + + return result; +} + + + +void CairoOutputDev::beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/, + GfxColorSpace * blendingColorSpace, + GBool /*isolated*/, GBool knockout, + GBool forSoftMask) { + /* push color space */ + ColorSpaceStack* css = new ColorSpaceStack; + css->cs = blendingColorSpace; + css->knockout = knockout; + cairo_get_matrix(cairo, &css->group_matrix); + css->next = groupColorSpaceStack; + groupColorSpaceStack = css; + + LOG(printf ("begin transparency group. knockout: %s\n", knockout ? "yes":"no")); + + if (knockout) { + knockoutCount++; + if (!cairo_shape) { + /* create a surface for tracking the shape */ + cairo_surface_t *cairo_shape_surface = cairo_surface_create_similar_clip (cairo, CAIRO_CONTENT_ALPHA); + cairo_shape = cairo_create (cairo_shape_surface); + cairo_surface_destroy (cairo_shape_surface); + + /* the color doesn't matter as long as it is opaque */ + cairo_set_source_rgb (cairo_shape, 0, 0, 0); + cairo_matrix_t matrix; + cairo_get_matrix (cairo, &matrix); + //printMatrix(&matrix); + cairo_set_matrix (cairo_shape, &matrix); + } else { + cairo_reference (cairo_shape); + } + } + if (groupColorSpaceStack->next && groupColorSpaceStack->next->knockout) { + /* we need to track the shape */ + cairo_push_group (cairo_shape); + } + if (0 && forSoftMask) + cairo_push_group_with_content (cairo, CAIRO_CONTENT_ALPHA); + else + cairo_push_group (cairo); + + /* push_group has an implicit cairo_save() */ + if (knockout) { + /*XXX: let's hope this matches the semantics needed */ + cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); + } else { + cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); + } +} + +void CairoOutputDev::endTransparencyGroup(GfxState * /*state*/) { + if (group) + cairo_pattern_destroy(group); + group = cairo_pop_group (cairo); + + LOG(printf ("end transparency group\n")); + + if (groupColorSpaceStack->next && groupColorSpaceStack->next->knockout) { + if (shape) + cairo_pattern_destroy(shape); + shape = cairo_pop_group (cairo_shape); + } +} + +void CairoOutputDev::paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) { + LOG(printf ("paint transparency group\n")); + + cairo_save (cairo); + cairo_set_matrix (cairo, &groupColorSpaceStack->group_matrix); + cairo_set_source (cairo, group); + + if (!mask) { + //XXX: deal with mask && shape case + if (shape) { + cairo_save (cairo); + + /* OPERATOR_SOURCE w/ a mask is defined as (src IN mask) ADD (dest OUT mask) + * however our source has already been clipped to mask so we only need to + * do ADD and OUT */ + + /* clear the shape mask */ + cairo_set_source (cairo, shape); + cairo_set_operator (cairo, CAIRO_OPERATOR_DEST_OUT); + cairo_paint (cairo); + + cairo_set_operator (cairo, CAIRO_OPERATOR_ADD); + cairo_set_source (cairo, group); + cairo_paint (cairo); + + cairo_restore (cairo); + + cairo_pattern_destroy (shape); + shape = NULL; + } else { + cairo_paint_with_alpha (cairo, fill_opacity); + } + cairo_status_t status = cairo_status(cairo); + if (status) + printf("BAD status: %s\n", cairo_status_to_string(status)); + } else { + if (fill_opacity < 1.0) { + cairo_push_group(cairo); + } + cairo_save(cairo); + cairo_set_matrix(cairo, &mask_matrix); + cairo_mask(cairo, mask); + cairo_restore(cairo); + if (fill_opacity < 1.0) { + cairo_pop_group_to_source(cairo); + cairo_paint_with_alpha (cairo, fill_opacity); + } + cairo_pattern_destroy(mask); + mask = NULL; + } + + popTransparencyGroup(); + cairo_restore(cairo); +} + +static int luminocity(uint32_t x) +{ + int r = (x >> 16) & 0xff; + int g = (x >> 8) & 0xff; + int b = (x >> 0) & 0xff; + // an arbitrary integer approximation of .3*r + .59*g + .11*b + int y = (r*19661+g*38666+b*7209 + 32829)>>16; + return y; +} + + +/* XXX: do we need to deal with shape here? */ +void CairoOutputDev::setSoftMask(GfxState * state, double * bbox, GBool alpha, + Function * transferFunc, GfxColor * backdropColor) { + cairo_pattern_destroy(mask); + + LOG(printf ("set softMask\n")); + + if (alpha == false) { + /* We need to mask according to the luminocity of the group. + * So we paint the group to an image surface convert it to a luminocity map + * and then use that as the mask. */ + + /* Get clip extents in device space */ + double x1, y1, x2, y2, x_min, y_min, x_max, y_max; + cairo_clip_extents(cairo, &x1, &y1, &x2, &y2); + cairo_user_to_device(cairo, &x1, &y1); + cairo_user_to_device(cairo, &x2, &y2); + x_min = MIN(x1, x2); + y_min = MIN(y1, y2); + x_max = MAX(x1, x2); + y_max = MAX(y1, y2); + cairo_clip_extents(cairo, &x1, &y1, &x2, &y2); + cairo_user_to_device(cairo, &x1, &y2); + cairo_user_to_device(cairo, &x2, &y1); + x_min = MIN(x_min,MIN(x1, x2)); + y_min = MIN(y_min,MIN(y1, y2)); + x_max = MAX(x_max,MAX(x1, x2)); + y_max = MAX(y_max,MAX(y1, y2)); + + int width = (int)(ceil(x_max) - floor(x_min)); + int height = (int)(ceil(y_max) - floor(y_min)); + + /* Get group device offset */ + double x_offset, y_offset; + if (cairo_get_group_target(cairo) == cairo_get_target(cairo)) { + cairo_surface_get_device_offset(cairo_get_group_target(cairo), &x_offset, &y_offset); + } else { + cairo_surface_t *pats; + cairo_pattern_get_surface(group, &pats); + cairo_surface_get_device_offset(pats, &x_offset, &y_offset); + } + + /* Adjust extents by group offset */ + x_min += x_offset; + y_min += y_offset; + + cairo_surface_t *source = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_t *maskCtx = cairo_create(source); + + //XXX: hopefully this uses the correct color space */ + GfxRGB backdropColorRGB; + groupColorSpaceStack->cs->getRGB(backdropColor, &backdropColorRGB); + /* paint the backdrop */ + cairo_set_source_rgb(maskCtx, + colToDbl(backdropColorRGB.r), + colToDbl(backdropColorRGB.g), + colToDbl(backdropColorRGB.b)); + cairo_paint(maskCtx); + + /* Copy source ctm to mask ctm and translate origin so that the + * mask appears it the same location on the source surface. */ + cairo_matrix_t mat, tmat; + cairo_matrix_init_translate(&tmat, -x_min, -y_min); + cairo_get_matrix(cairo, &mat); + cairo_matrix_multiply(&mat, &mat, &tmat); + cairo_set_matrix(maskCtx, &mat); + + /* make the device offset of the new mask match that of the group */ + cairo_surface_set_device_offset(source, x_offset, y_offset); + + /* paint the group */ + cairo_set_source(maskCtx, group); + cairo_paint(maskCtx); + + /* XXX status = cairo_status(maskCtx); */ + cairo_destroy(maskCtx); + + /* convert to a luminocity map */ + uint32_t *source_data = (uint32_t*)cairo_image_surface_get_data(source); + /* get stride in units of 32 bits */ + int stride = cairo_image_surface_get_stride(source)/4; + for (int y=0; ytransform(&lum_in, &lum_out); + lum = (int)(lum_out * 255.0 + 0.5); + } + source_data[y*stride + x] = lum << 24; + } + } + cairo_surface_mark_dirty (source); + + /* setup the new mask pattern */ + mask = cairo_pattern_create_for_surface(source); + cairo_get_matrix(cairo, &mask_matrix); + + if (cairo_get_group_target(cairo) == cairo_get_target(cairo)) { + cairo_pattern_set_matrix(mask, &mat); + } else { + cairo_matrix_t patMatrix; + cairo_pattern_get_matrix(group, &patMatrix); + /* Apply x_min, y_min offset to it appears in the same location as source. */ + cairo_matrix_multiply(&patMatrix, &patMatrix, &tmat); + cairo_pattern_set_matrix(mask, &patMatrix); + } + + cairo_surface_destroy(source); + } else { + mask = cairo_pattern_reference(group); + cairo_get_matrix(cairo, &mask_matrix); + } + + popTransparencyGroup(); +} + +void CairoOutputDev::popTransparencyGroup() { + /* pop color space */ + ColorSpaceStack *css = groupColorSpaceStack; + if (css->knockout) { + knockoutCount--; + if (!knockoutCount) { + /* we don't need to track the shape anymore because + * we are not above any knockout groups */ + cairo_destroy(cairo_shape); + cairo_shape = NULL; + } + } + groupColorSpaceStack = css->next; + delete css; +} + + +void CairoOutputDev::clearSoftMask(GfxState * /*state*/) { + if (mask) + cairo_pattern_destroy(mask); + mask = NULL; +} + +/* Taken from cairo/doc/tutorial/src/singular.c */ +static void +get_singular_values (const cairo_matrix_t *matrix, + double *major, + double *minor) +{ + double xx = matrix->xx, xy = matrix->xy; + double yx = matrix->yx, yy = matrix->yy; + + double a = xx*xx+yx*yx; + double b = xy*xy+yy*yy; + double k = xx*xy+yx*yy; + + double f = (a+b) * .5; + double g = (a-b) * .5; + double delta = sqrt (g*g + k*k); + + if (major) + *major = sqrt (f + delta); + if (minor) + *minor = sqrt (f - delta); +} + +void CairoOutputDev::getScaledSize(int orig_width, + int orig_height, + int *scaledWidth, + int *scaledHeight) { + cairo_matrix_t matrix; + cairo_get_matrix(cairo, &matrix); + + double xScale; + double yScale; + if (orig_width > orig_height) + get_singular_values (&matrix, &xScale, &yScale); + else + get_singular_values (&matrix, &yScale, &xScale); + + int tx, tx2, ty, ty2; /* the integer co-oridinates of the resulting image */ + if (xScale >= 0) { + tx = splashRound(matrix.x0 - 0.01); + tx2 = splashRound(matrix.x0 + xScale + 0.01) - 1; + } else { + tx = splashRound(matrix.x0 + 0.01) - 1; + tx2 = splashRound(matrix.x0 + xScale - 0.01); + } + *scaledWidth = abs(tx2 - tx) + 1; + //scaledWidth = splashRound(fabs(xScale)); + if (*scaledWidth == 0) { + // technically, this should draw nothing, but it generally seems + // better to draw a one-pixel-wide stripe rather than throwing it + // away + *scaledWidth = 1; + } + if (yScale >= 0) { + ty = splashFloor(matrix.y0 + 0.01); + ty2 = splashCeil(matrix.y0 + yScale - 0.01); + } else { + ty = splashCeil(matrix.y0 - 0.01); + ty2 = splashFloor(matrix.y0 + yScale + 0.01); + } + *scaledHeight = abs(ty2 - ty); + if (*scaledHeight == 0) { + *scaledHeight = 1; + } +} + +cairo_surface_t *CairoOutputDev::downscaleSurface(cairo_surface_t *orig_surface) { + cairo_surface_t *dest_surface; + unsigned char *dest_buffer; + int dest_stride; + unsigned char *orig_buffer; + int orig_width, orig_height; + int orig_stride; + int scaledHeight; + int scaledWidth; + GBool res; + + if (printing) + return NULL; + + orig_width = cairo_image_surface_get_width (orig_surface); + orig_height = cairo_image_surface_get_height (orig_surface); + getScaledSize (orig_width, orig_height, &scaledWidth, &scaledHeight); + if (scaledWidth >= orig_width || scaledHeight >= orig_height) + return NULL; + + dest_surface = cairo_surface_create_similar (orig_surface, + cairo_surface_get_content (orig_surface), + scaledWidth, scaledHeight); + dest_buffer = cairo_image_surface_get_data (dest_surface); + dest_stride = cairo_image_surface_get_stride (dest_surface); + + orig_buffer = cairo_image_surface_get_data (orig_surface); + orig_stride = cairo_image_surface_get_stride (orig_surface); + + res = downscale_box_filter((uint32_t *)orig_buffer, + orig_stride, orig_width, orig_height, + scaledWidth, scaledHeight, 0, 0, + scaledWidth, scaledHeight, + (uint32_t *)dest_buffer, dest_stride); + if (!res) { + cairo_surface_destroy (dest_surface); + return NULL; + } + + return dest_surface; + +} + +cairo_filter_t +CairoOutputDev::getFilterForSurface(cairo_surface_t *image, + GBool interpolate) +{ + if (interpolate) + return CAIRO_FILTER_BILINEAR; + + int orig_width = cairo_image_surface_get_width (image); + int orig_height = cairo_image_surface_get_height (image); + if (orig_width == 0 || orig_height == 0) + return CAIRO_FILTER_NEAREST; + + int scaled_width, scaled_height; + getScaledSize (orig_width, orig_height, &scaled_width, &scaled_height); + + /* When scale factor is >= 400% we don't interpolate. See bugs #25268, #9860 */ + if (scaled_width / orig_width >= 4 || scaled_height / orig_height >= 4) + return CAIRO_FILTER_NEAREST; + + return CAIRO_FILTER_BILINEAR; +} + +void CairoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + + /* FIXME: Doesn't the image mask support any colorspace? */ + cairo_set_source (cairo, fill_pattern); + + /* work around a cairo bug when scaling 1x1 surfaces */ + if (width == 1 && height == 1) { + ImageStream *imgStr; + Guchar pix; + int invert_bit; + + imgStr = new ImageStream(str, width, 1, 1); + imgStr->reset(); + imgStr->getPixel(&pix); + imgStr->close(); + delete imgStr; + + invert_bit = invert ? 1 : 0; + if (pix ^ invert_bit) + return; + + cairo_save (cairo); + cairo_rectangle (cairo, 0., 0., width, height); + cairo_fill (cairo); + cairo_restore (cairo); + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_rectangle (cairo_shape, 0., 0., width, height); + cairo_fill (cairo_shape); + cairo_restore (cairo_shape); + } + return; + } + + /* shape is 1.0 for painted areas, 0.0 for unpainted ones */ + + cairo_matrix_t matrix; + cairo_get_matrix (cairo, &matrix); + //XXX: it is possible that we should only do sub pixel positioning if + // we are rendering fonts */ + if (!printing && prescaleImages + /* not rotated */ + && matrix.xy == 0 && matrix.yx == 0 + /* axes not flipped / not 180 deg rotated */ + && matrix.xx > 0 && (upsideDown() ? -1 : 1) * matrix.yy > 0) { + drawImageMaskPrescaled(state, ref, str, width, height, invert, interpolate, inlineImg); + } else { + drawImageMaskRegular(state, ref, str, width, height, invert, interpolate, inlineImg); + } + +} + +void CairoOutputDev::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix) { + + /* FIXME: Doesn't the image mask support any colorspace? */ + cairo_set_source (cairo, fill_pattern); + + /* work around a cairo bug when scaling 1x1 surfaces */ + if (width == 1 && height == 1) { + ImageStream *imgStr; + Guchar pix; + int invert_bit; + + imgStr = new ImageStream(str, width, 1, 1); + imgStr->reset(); + imgStr->getPixel(&pix); + imgStr->close(); + delete imgStr; + + invert_bit = invert ? 1 : 0; + if (pix ^ invert_bit) + return; + + cairo_save (cairo); + cairo_rectangle (cairo, 0., 0., width, height); + cairo_fill (cairo); + cairo_restore (cairo); + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_rectangle (cairo_shape, 0., 0., width, height); + cairo_fill (cairo_shape); + cairo_restore (cairo_shape); + } + return; + } + + cairo_push_group_with_content (cairo, CAIRO_CONTENT_ALPHA); + + /* shape is 1.0 for painted areas, 0.0 for unpainted ones */ + + cairo_matrix_t matrix; + cairo_get_matrix (cairo, &matrix); + //XXX: it is possible that we should only do sub pixel positioning if + // we are rendering fonts */ + if (!printing && prescaleImages && matrix.xy == 0.0 && matrix.yx == 0.0) { + drawImageMaskPrescaled(state, ref, str, width, height, invert, gFalse, inlineImg); + } else { + drawImageMaskRegular(state, ref, str, width, height, invert, gFalse, inlineImg); + } + + if (state->getFillColorSpace()->getMode() == csPattern) { + cairo_set_source_rgb (cairo, 1, 1, 1); + cairo_set_matrix (cairo, &mask_matrix); + cairo_mask (cairo, mask); + } + + if (mask) + cairo_pattern_destroy (mask); + mask = cairo_pop_group (cairo); + + saveState(state); + double bbox[4] = {0,0,1,1}; // dummy + beginTransparencyGroup(state, bbox, state->getFillColorSpace(), + gTrue, gFalse, gFalse); +} + +void CairoOutputDev::unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix) { + double bbox[4] = {0,0,1,1}; // dummy + + endTransparencyGroup(state); + restoreState(state); + paintTransparencyGroup(state, bbox); + clearSoftMask(state); +} + +void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + unsigned char *buffer; + unsigned char *dest; + cairo_surface_t *image; + cairo_pattern_t *pattern; + int x, y, i, bit; + ImageStream *imgStr; + Guchar *pix; + cairo_matrix_t matrix; + int invert_bit; + int row_stride; + cairo_filter_t filter; + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, 1, 1); + imgStr->reset(); + + image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height); + if (cairo_surface_status (image)) + goto cleanup; + + buffer = cairo_image_surface_get_data (image); + row_stride = cairo_image_surface_get_stride (image); + + invert_bit = invert ? 1 : 0; + + for (y = 0; y < height; y++) { + pix = imgStr->getLine(); + dest = buffer + y * row_stride; + i = 0; + bit = 0; + for (x = 0; x < width; x++) { + if (bit == 0) + dest[i] = 0; + if (!(pix[x] ^ invert_bit)) { +#ifdef WORDS_BIGENDIAN + dest[i] |= (1 << (7 - bit)); +#else + dest[i] |= (1 << bit); +#endif + } + bit++; + if (bit > 7) { + bit = 0; + i++; + } + } + } + + filter = getFilterForSurface (image, interpolate); + + cairo_surface_mark_dirty (image); + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + if (cairo_pattern_status (pattern)) + goto cleanup; + + LOG (printf ("drawImageMask %dx%d\n", width, height)); + + cairo_pattern_set_filter (pattern, filter); + + if (!printing) + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); + + cairo_matrix_init_translate (&matrix, 0, height); + cairo_matrix_scale (&matrix, width, -height); + cairo_pattern_set_matrix (pattern, &matrix); + if (cairo_pattern_status (pattern)) { + cairo_pattern_destroy (pattern); + goto cleanup; + } + + if (state->getFillColorSpace()->getMode() == csPattern) { + mask = cairo_pattern_reference (pattern); + cairo_get_matrix (cairo, &mask_matrix); + } else if (!printing) { + cairo_save (cairo); + cairo_rectangle (cairo, 0., 0., 1., 1.); + cairo_clip (cairo); + cairo_mask (cairo, pattern); + cairo_restore (cairo); + } else { + cairo_mask (cairo, pattern); + } + + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_set_source (cairo_shape, pattern); + if (!printing) { + cairo_rectangle (cairo_shape, 0., 0., 1., 1.); + cairo_fill (cairo_shape); + } else { + cairo_mask (cairo_shape, pattern); + } + cairo_restore (cairo_shape); + } + + cairo_pattern_destroy (pattern); + +cleanup: + imgStr->close(); + delete imgStr; +} + + +void CairoOutputDev::drawImageMaskPrescaled(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + unsigned char *buffer; + cairo_surface_t *image; + cairo_pattern_t *pattern; + ImageStream *imgStr; + Guchar *pix; + cairo_matrix_t matrix; + int invert_bit; + int row_stride; + + /* cairo does a very poor job of scaling down images so we scale them ourselves */ + + LOG (printf ("drawImageMaskPrescaled %dx%d\n", width, height)); + + /* this scaling code is adopted from the splash image scaling code */ + cairo_get_matrix(cairo, &matrix); +#if 0 + printf("[%f %f], [%f %f], %f %f\n", matrix.xx, matrix.xy, matrix.yx, matrix.yy, matrix.x0, matrix.y0); +#endif + /* this whole computation should be factored out */ + double xScale = matrix.xx; + double yScale = matrix.yy; + int tx, tx2, ty, ty2; /* the integer co-oridinates of the resulting image */ + int scaledHeight; + int scaledWidth; + if (xScale >= 0) { + tx = splashRound(matrix.x0 - 0.01); + tx2 = splashRound(matrix.x0 + xScale + 0.01) - 1; + } else { + tx = splashRound(matrix.x0 + 0.01) - 1; + tx2 = splashRound(matrix.x0 + xScale - 0.01); + } + scaledWidth = abs(tx2 - tx) + 1; + //scaledWidth = splashRound(fabs(xScale)); + if (scaledWidth == 0) { + // technically, this should draw nothing, but it generally seems + // better to draw a one-pixel-wide stripe rather than throwing it + // away + scaledWidth = 1; + } + if (yScale >= 0) { + ty = splashFloor(matrix.y0 + 0.01); + ty2 = splashCeil(matrix.y0 + yScale - 0.01); + } else { + ty = splashCeil(matrix.y0 - 0.01); + ty2 = splashFloor(matrix.y0 + yScale + 0.01); + } + scaledHeight = abs(ty2 - ty); + if (scaledHeight == 0) { + scaledHeight = 1; + } +#if 0 + printf("xscale: %g, yscale: %g\n", xScale, yScale); + printf("width: %d, height: %d\n", width, height); + printf("scaledWidth: %d, scaledHeight: %d\n", scaledWidth, scaledHeight); +#endif + + /* compute the required padding */ + /* Padding is used to preserve the aspect ratio. + We compute total_pad to make (height+total_pad)/scaledHeight as close to height/yScale as possible */ + int head_pad = 0; + int tail_pad = 0; + int total_pad = splashRound(height*(scaledHeight/fabs(yScale)) - height); + + /* compute the two pieces of padding */ + if (total_pad > 0) { + //XXX: i'm not positive fabs() is correct + float tail_error = fabs(matrix.y0 - ty); + float head_error = fabs(ty2 - (matrix.y0 + yScale)); + float tail_fraction = tail_error/(tail_error + head_error); + tail_pad = splashRound(total_pad*tail_fraction); + head_pad = total_pad - tail_pad; + } else { + tail_pad = 0; + head_pad = 0; + } + int origHeight = height; + height += tail_pad; + height += head_pad; +#if 0 + printf("head_pad: %d tail_pad: %d\n", head_pad, tail_pad); + printf("origHeight: %d height: %d\n", origHeight, height); + printf("ty: %d, ty2: %d\n", ty, ty2); +#endif + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, 1, 1); + imgStr->reset(); + + invert_bit = invert ? 1 : 0; + + image = cairo_image_surface_create (CAIRO_FORMAT_A8, scaledWidth, scaledHeight); + if (cairo_surface_status (image)) { + imgStr->close(); + delete imgStr; + return; + } + + buffer = cairo_image_surface_get_data (image); + row_stride = cairo_image_surface_get_stride (image); + + int yp = height / scaledHeight; + int yq = height % scaledHeight; + int xp = width / scaledWidth; + int xq = width % scaledWidth; + int yt = 0; + int origHeight_c = origHeight; + /* use MIN() because yp might be > origHeight because of padding */ + unsigned char *pixBuf = (unsigned char *)malloc(MIN(yp+1, origHeight)*width); + int lastYStep = 1; + int total = 0; + for (int y = 0; y < scaledHeight; y++) { + // y scale Bresenham + int yStep = yp; + yt += yq; + + if (yt >= scaledHeight) { + yt -= scaledHeight; + ++yStep; + } + + // read row (s) from image ignoring the padding as appropriate + { + int n = (yp > 0) ? yStep : lastYStep; + total += n; + if (n > 0) { + unsigned char *p = pixBuf; + int head_pad_count = head_pad; + int origHeight_count = origHeight; + int tail_pad_count = tail_pad; + for (int i=0; igetLine(); + for (int j=0; j 0 ? yStep : 1; + int origN = n; + + /* compute the size of padding and pixels that will be used for this row */ + int head_pad_size = MIN(n, head_pad); + n -= head_pad_size; + head_pad -= MIN(head_pad_size, yStep); + + int pix_size = MIN(n, origHeight); + n -= pix_size; + origHeight -= MIN(pix_size, yStep); + + int tail_pad_size = MIN(n, tail_pad); + n -= tail_pad_size; + tail_pad -= MIN(tail_pad_size, yStep); + if (n != 0) { + printf("n = %d (%d %d %d)\n", n, head_pad_size, pix_size, tail_pad_size); + assert(n == 0); + } + + for (int x = 0; x < scaledWidth; ++x) { + int xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + int m = xStep > 0 ? xStep : 1; + float pixAcc0 = 0; + /* could m * head_pad_size * tail_pad_size overflow? */ + if (invert_bit) { + pixAcc0 += m * head_pad_size * tail_pad_size * 255; + } else { + pixAcc0 += m * head_pad_size * tail_pad_size * 0; + } + /* Accumulate all of the source pixels for the destination pixel */ + for (int i = 0; i < pix_size; ++i) { + for (int j = 0; j< m; ++j) { + if (xSrc + i*width + j > MIN(yp + 1, origHeight_c)*width) { + printf("%d > %d (%d %d %d %d) (%d %d %d)\n", xSrc + i*width + j, MIN(yp + 1, origHeight_c)*width, xSrc, i , width, j, yp, origHeight_c, width); + printf("%d %d %d\n", head_pad_size, pix_size, tail_pad_size); + assert(0 && "bad access\n"); + } + pixAcc0 += pixBuf[xSrc + i*width + j]; + } + } + buffer[y * row_stride + x] = splashFloor(pixAcc0 / (origN*m)); + xSrc += xStep; + x1 += 1; + } + + } + free(pixBuf); + + cairo_surface_mark_dirty (image); + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + if (cairo_pattern_status (pattern)) { + imgStr->close(); + delete imgStr; + return; + } + + /* we should actually be using CAIRO_FILTER_NEAREST here. However, + * cairo doesn't yet do minifaction filtering causing scaled down + * images with CAIRO_FILTER_NEAREST to look really bad */ + cairo_pattern_set_filter (pattern, + interpolate ? CAIRO_FILTER_BEST : CAIRO_FILTER_FAST); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); + + if (state->getFillColorSpace()->getMode() == csPattern) { + cairo_matrix_init_translate (&matrix, 0, scaledHeight); + cairo_matrix_scale (&matrix, scaledWidth, -scaledHeight); + cairo_pattern_set_matrix (pattern, &matrix); + if (cairo_pattern_status (pattern)) { + cairo_pattern_destroy (pattern); + imgStr->close(); + delete imgStr; + return; + } + + mask = cairo_pattern_reference (pattern); + cairo_get_matrix (cairo, &mask_matrix); + } else { + cairo_save (cairo); + + /* modify our current transformation so that the prescaled image + * goes where it is supposed to */ + cairo_get_matrix(cairo, &matrix); + cairo_scale(cairo, 1.0/matrix.xx, 1.0/matrix.yy); + // get integer co-ords + cairo_translate (cairo, tx - matrix.x0, ty2 - matrix.y0); + if (yScale > 0) + cairo_scale(cairo, 1, -1); + + cairo_rectangle (cairo, 0., 0., scaledWidth, scaledHeight); + cairo_clip (cairo); + cairo_mask (cairo, pattern); + + //cairo_get_matrix(cairo, &matrix); + //printf("mask at: [%f %f], [%f %f], %f %f\n\n", matrix.xx, matrix.xy, matrix.yx, matrix.yy, matrix.x0, matrix.y0); + cairo_restore(cairo); + } + + if (cairo_shape) { + cairo_save (cairo_shape); + + /* modify our current transformation so that the prescaled image + * goes where it is supposed to */ + cairo_get_matrix(cairo_shape, &matrix); + cairo_scale(cairo_shape, 1.0/matrix.xx, 1.0/matrix.yy); + // get integer co-ords + cairo_translate (cairo_shape, tx - matrix.x0, ty2 - matrix.y0); + if (yScale > 0) + cairo_scale(cairo_shape, 1, -1); + + cairo_rectangle (cairo_shape, 0., 0., scaledWidth, scaledHeight); + cairo_fill (cairo_shape); + + cairo_restore(cairo_shape); + } + + cairo_pattern_destroy (pattern); + + imgStr->close(); + delete imgStr; +} + +void CairoOutputDev::drawMaskedImage(GfxState *state, Object *ref, + Stream *str, int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, int maskWidth, + int maskHeight, GBool maskInvert, + GBool maskInterpolate) +{ + ImageStream *maskImgStr, *imgStr; + int row_stride; + unsigned char *maskBuffer, *buffer; + unsigned char *maskDest; + unsigned int *dest; + cairo_surface_t *maskImage, *image; + cairo_pattern_t *maskPattern, *pattern; + cairo_matrix_t matrix; + cairo_matrix_t maskMatrix; + Guchar *pix; + int x, y; + int invert_bit; + cairo_filter_t filter; + cairo_filter_t maskFilter; + + maskImgStr = new ImageStream(maskStr, maskWidth, 1, 1); + maskImgStr->reset(); + + maskImage = cairo_image_surface_create (CAIRO_FORMAT_A8, maskWidth, maskHeight); + if (cairo_surface_status (maskImage)) { + maskImgStr->close(); + delete maskImgStr; + return; + } + + maskBuffer = cairo_image_surface_get_data (maskImage); + row_stride = cairo_image_surface_get_stride (maskImage); + + invert_bit = maskInvert ? 1 : 0; + + for (y = 0; y < maskHeight; y++) { + pix = maskImgStr->getLine(); + maskDest = maskBuffer + y * row_stride; + for (x = 0; x < maskWidth; x++) { + if (pix[x] ^ invert_bit) + *maskDest++ = 0; + else + *maskDest++ = 255; + } + } + + maskImgStr->close(); + delete maskImgStr; + + maskFilter = getFilterForSurface (maskImage, maskInterpolate); + + cairo_surface_mark_dirty (maskImage); + maskPattern = cairo_pattern_create_for_surface (maskImage); + cairo_surface_destroy (maskImage); + if (cairo_pattern_status (maskPattern)) + return; + +#if 0 + /* ICCBased color space doesn't do any color correction + * so check its underlying color space as well */ + int is_identity_transform; + is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB || + (colorMap->getColorSpace()->getMode() == csICCBased && + ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB); +#endif + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + if (cairo_surface_status (image)) + goto cleanup; + + buffer = cairo_image_surface_get_data (image); + row_stride = cairo_image_surface_get_stride (image); + for (y = 0; y < height; y++) { + dest = (unsigned int *) (buffer + y * row_stride); + pix = imgStr->getLine(); + colorMap->getRGBLine (pix, dest, width); + } + + filter = getFilterForSurface (image, interpolate); + + cairo_surface_mark_dirty (image); + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + if (cairo_pattern_status (pattern)) + goto cleanup; + + LOG (printf ("drawMaskedImage %dx%d\n", width, height)); + + cairo_pattern_set_filter (pattern, filter); + cairo_pattern_set_filter (maskPattern, maskFilter); + + if (!printing) { + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); + cairo_pattern_set_extend (maskPattern, CAIRO_EXTEND_PAD); + } + + cairo_matrix_init_translate (&matrix, 0, height); + cairo_matrix_scale (&matrix, width, -height); + cairo_pattern_set_matrix (pattern, &matrix); + if (cairo_pattern_status (pattern)) { + cairo_pattern_destroy (pattern); + cairo_pattern_destroy (maskPattern); + goto cleanup; + } + + cairo_matrix_init_translate (&maskMatrix, 0, maskHeight); + cairo_matrix_scale (&maskMatrix, maskWidth, -maskHeight); + cairo_pattern_set_matrix (maskPattern, &maskMatrix); + if (cairo_pattern_status (maskPattern)) { + cairo_pattern_destroy (maskPattern); + cairo_pattern_destroy (pattern); + goto cleanup; + } + + if (!printing) { + cairo_save (cairo); + cairo_set_source (cairo, pattern); + cairo_rectangle (cairo, 0., 0., 1., 1.); + cairo_clip (cairo); + cairo_mask (cairo, maskPattern); + cairo_restore (cairo); + } else { + cairo_set_source (cairo, pattern); + cairo_mask (cairo, maskPattern); + } + + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_set_source (cairo_shape, pattern); + if (!printing) { + cairo_rectangle (cairo_shape, 0., 0., 1., 1.); + cairo_fill (cairo_shape); + } else { + cairo_mask (cairo_shape, pattern); + } + cairo_restore (cairo_shape); + } + + cairo_pattern_destroy (maskPattern); + cairo_pattern_destroy (pattern); + +cleanup: + imgStr->close(); + delete imgStr; +} + + +//XXX: is this affect by AIS(alpha is shape)? +void CairoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate) +{ + ImageStream *maskImgStr, *imgStr; + int row_stride; + unsigned char *maskBuffer, *buffer; + unsigned char *maskDest; + unsigned int *dest; + cairo_surface_t *maskImage, *image; + cairo_pattern_t *maskPattern, *pattern; + cairo_matrix_t maskMatrix, matrix; + Guchar *pix; + int y; + cairo_filter_t filter; + cairo_filter_t maskFilter; + + maskImgStr = new ImageStream(maskStr, maskWidth, + maskColorMap->getNumPixelComps(), + maskColorMap->getBits()); + maskImgStr->reset(); + + maskImage = cairo_image_surface_create (CAIRO_FORMAT_A8, maskWidth, maskHeight); + if (cairo_surface_status (maskImage)) { + maskImgStr->close(); + delete maskImgStr; + return; + } + + maskBuffer = cairo_image_surface_get_data (maskImage); + row_stride = cairo_image_surface_get_stride (maskImage); + for (y = 0; y < maskHeight; y++) { + maskDest = (unsigned char *) (maskBuffer + y * row_stride); + pix = maskImgStr->getLine(); + maskColorMap->getGrayLine (pix, maskDest, maskWidth); + } + + maskImgStr->close(); + delete maskImgStr; + + maskFilter = getFilterForSurface (maskImage, maskInterpolate); + + cairo_surface_mark_dirty (maskImage); + maskPattern = cairo_pattern_create_for_surface (maskImage); + cairo_surface_destroy (maskImage); + if (cairo_pattern_status (maskPattern)) + return; + +#if 0 + /* ICCBased color space doesn't do any color correction + * so check its underlying color space as well */ + int is_identity_transform; + is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB || + (colorMap->getColorSpace()->getMode() == csICCBased && + ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB); +#endif + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + if (cairo_surface_status (image)) + goto cleanup; + + buffer = cairo_image_surface_get_data (image); + row_stride = cairo_image_surface_get_stride (image); + for (y = 0; y < height; y++) { + dest = (unsigned int *) (buffer + y * row_stride); + pix = imgStr->getLine(); + colorMap->getRGBLine (pix, dest, width); + } + + filter = getFilterForSurface (image, interpolate); + + cairo_surface_mark_dirty (image); + + setMimeData(str, ref, image); + + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + if (cairo_pattern_status (pattern)) + goto cleanup; + + LOG (printf ("drawSoftMaskedImage %dx%d\n", width, height)); + + cairo_pattern_set_filter (pattern, filter); + cairo_pattern_set_filter (maskPattern, maskFilter); + + if (!printing) { + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); + cairo_pattern_set_extend (maskPattern, CAIRO_EXTEND_PAD); + } + + cairo_matrix_init_translate (&matrix, 0, height); + cairo_matrix_scale (&matrix, width, -height); + cairo_pattern_set_matrix (pattern, &matrix); + if (cairo_pattern_status (pattern)) { + cairo_pattern_destroy (pattern); + cairo_pattern_destroy (maskPattern); + goto cleanup; + } + + cairo_matrix_init_translate (&maskMatrix, 0, maskHeight); + cairo_matrix_scale (&maskMatrix, maskWidth, -maskHeight); + cairo_pattern_set_matrix (maskPattern, &maskMatrix); + if (cairo_pattern_status (maskPattern)) { + cairo_pattern_destroy (maskPattern); + cairo_pattern_destroy (pattern); + goto cleanup; + } + + if (fill_opacity != 1.0) + cairo_push_group (cairo); + else + cairo_save (cairo); + + cairo_set_source (cairo, pattern); + if (!printing) { + cairo_rectangle (cairo, 0., 0., + MIN (width, maskWidth) / (double)width, + MIN (height, maskHeight) / (double)height); + cairo_clip (cairo); + } + cairo_mask (cairo, maskPattern); + + if (fill_opacity != 1.0) { + cairo_pop_group_to_source (cairo); + cairo_save (cairo); + if (!printing) { + cairo_rectangle (cairo, 0., 0., + MIN (width, maskWidth) / (double)width, + MIN (height, maskHeight) / (double)height); + cairo_clip (cairo); + } + cairo_paint_with_alpha (cairo, fill_opacity); + } + cairo_restore (cairo); + + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_set_source (cairo_shape, pattern); + if (!printing) { + cairo_rectangle (cairo_shape, 0., 0., + MIN (width, maskWidth) / (double)width, + MIN (height, maskHeight) / (double)height); + cairo_fill (cairo_shape); + } else { + cairo_mask (cairo_shape, pattern); + } + cairo_restore (cairo_shape); + } + + cairo_pattern_destroy (maskPattern); + cairo_pattern_destroy (pattern); + +cleanup: + imgStr->close(); + delete imgStr; +} + +GBool CairoOutputDev::getStreamData (Stream *str, char **buffer, int *length) +{ + int len, i; + char *strBuffer; + + len = 0; + str->close(); + str->reset(); + while (str->getChar() != EOF) len++; + if (len == 0) + return gFalse; + + strBuffer = (char *)gmalloc (len); + + str->close(); + str->reset(); + for (i = 0; i < len; ++i) + strBuffer[i] = str->getChar(); + + *buffer = strBuffer; + *length = len; + + return gTrue; +} + +void CairoOutputDev::setMimeData(Stream *str, Object *ref, cairo_surface_t *image) +{ + char *strBuffer; + int len; + Object obj; + + if (!printing || !(str->getKind() == strDCT || str->getKind() == strJPX)) + return; + + // colorspace in stream dict may be different from colorspace in jpx + // data + if (str->getKind() == strJPX) { + GBool hasColorSpace = !str->getDict()->lookup("ColorSpace", &obj)->isNull(); + obj.free(); + if (hasColorSpace) + return; + } + + if (getStreamData (str->getNextStream(), &strBuffer, &len)) { + cairo_status_t st; + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) + if (ref && ref->isRef()) { + Ref imgRef = ref->getRef(); + GooString *surfaceId = new GooString("poppler-surface-"); + surfaceId->appendf("{0:d}-{1:d}", imgRef.gen, imgRef.num); + char *idBuffer = copyString(surfaceId->getCString()); + st = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_UNIQUE_ID, + (const unsigned char *)idBuffer, + surfaceId->getLength(), + gfree, idBuffer); + if (st) + gfree(idBuffer); + delete surfaceId; + } +#endif + + st = cairo_surface_set_mime_data (image, + str->getKind() == strDCT ? + CAIRO_MIME_TYPE_JPEG : CAIRO_MIME_TYPE_JP2, + (const unsigned char *)strBuffer, len, + gfree, strBuffer); + if (st) + gfree (strBuffer); + } +} + +void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + int *maskColors, GBool inlineImg) +{ + cairo_surface_t *image; + cairo_pattern_t *pattern, *maskPattern; + ImageStream *imgStr; + cairo_matrix_t matrix; + unsigned char *buffer; + int stride, i; + GfxRGB *lookup = NULL; + cairo_filter_t filter = CAIRO_FILTER_BILINEAR; + + /* TODO: Do we want to cache these? */ + imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + +#if 0 + /* ICCBased color space doesn't do any color correction + * so check its underlying color space as well */ + int is_identity_transform; + is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB || + (colorMap->getColorSpace()->getMode() == csICCBased && + ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB); +#endif + + image = cairo_image_surface_create (maskColors ? + CAIRO_FORMAT_ARGB32 : + CAIRO_FORMAT_RGB24, + width, height); + if (cairo_surface_status (image)) + goto cleanup; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + if (colorMap->getNumPixelComps() == 1) { + int n; + Guchar pix; + + n = 1 << colorMap->getBits(); + lookup = (GfxRGB *)gmallocn(n, sizeof(GfxRGB)); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + + colorMap->getRGB(&pix, &lookup[i]); + } + } + + buffer = cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image); + for (int y = 0; y < height; y++) { + uint32_t *dest = (uint32_t *) (buffer + y * stride); + Guchar *pix = imgStr->getLine(); + + if (lookup) { + Guchar *p = pix; + GfxRGB rgb; + + for (i = 0; i < width; i++) { + rgb = lookup[*p]; + dest[i] = + ((int) colToByte(rgb.r) << 16) | + ((int) colToByte(rgb.g) << 8) | + ((int) colToByte(rgb.b) << 0); + p++; + } + } else { + colorMap->getRGBLine (pix, dest, width); + } + + if (maskColors) { + for (int x = 0; x < width; x++) { + bool is_opaque = false; + for (int i = 0; i < colorMap->getNumPixelComps(); ++i) { + if (pix[i] < maskColors[2*i] || + pix[i] > maskColors[2*i+1]) { + is_opaque = true; + break; + } + } + if (is_opaque) + *dest |= 0xff000000; + else + *dest = 0; + dest++; + pix += colorMap->getNumPixelComps(); + } + } + } + gfree(lookup); + + LOG (printf ("drawImage %dx%d\n", width, height)); + + cairo_surface_t *scaled_surface; + + scaled_surface = downscaleSurface (image); + if (scaled_surface) { + if (cairo_surface_status (scaled_surface)) + goto cleanup; + cairo_surface_destroy (image); + image = scaled_surface; + width = cairo_image_surface_get_width (image); + height = cairo_image_surface_get_height (image); + } else { + filter = getFilterForSurface (image, interpolate); + } + + cairo_surface_mark_dirty (image); + + if (!inlineImg) /* don't read stream twice if it is an inline image */ + setMimeData(str, ref, image); + + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + if (cairo_pattern_status (pattern)) + goto cleanup; + + cairo_pattern_set_filter (pattern, filter); + + if (!printing) + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); + + cairo_matrix_init_translate (&matrix, 0, height); + cairo_matrix_scale (&matrix, width, -height); + cairo_pattern_set_matrix (pattern, &matrix); + if (cairo_pattern_status (pattern)) { + cairo_pattern_destroy (pattern); + goto cleanup; + } + + if (!mask && fill_opacity != 1.0) { + maskPattern = cairo_pattern_create_rgba (1., 1., 1., fill_opacity); + } else if (mask) { + maskPattern = cairo_pattern_reference (mask); + } else { + maskPattern = NULL; + } + + cairo_save (cairo); + cairo_set_source (cairo, pattern); + if (!printing) + cairo_rectangle (cairo, 0., 0., 1., 1.); + if (maskPattern) { + if (!printing) + cairo_clip (cairo); + cairo_set_matrix (cairo, &mask_matrix); + cairo_mask (cairo, maskPattern); + } else { + if (printing) + cairo_paint (cairo); + else + cairo_fill (cairo); + } + cairo_restore (cairo); + + cairo_pattern_destroy (maskPattern); + + if (cairo_shape) { + cairo_save (cairo_shape); + cairo_set_source (cairo_shape, pattern); + if (printing) { + cairo_paint (cairo_shape); + } else { + cairo_rectangle (cairo_shape, 0., 0., 1., 1.); + cairo_fill (cairo_shape); + } + cairo_restore (cairo_shape); + } + + cairo_pattern_destroy (pattern); + +cleanup: + imgStr->close(); + delete imgStr; +} + + +//------------------------------------------------------------------------ +// ImageOutputDev +//------------------------------------------------------------------------ + +CairoImageOutputDev::CairoImageOutputDev() +{ + images = NULL; + numImages = 0; + size = 0; + imgDrawCbk = NULL; + imgDrawCbkData = NULL; +} + +CairoImageOutputDev::~CairoImageOutputDev() +{ + int i; + + for (i = 0; i < numImages; i++) + delete images[i]; + gfree (images); +} + +void CairoImageOutputDev::saveImage(CairoImage *image) +{ + if (numImages >= size) { + size += 16; + images = (CairoImage **) greallocn (images, size, sizeof (CairoImage *)); + } + images[numImages++] = image; +} + +void CairoImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) +{ + cairo_t *cr; + cairo_surface_t *surface; + double x1, y1, x2, y2; + double *ctm; + double mat[6]; + CairoImage *image; + + ctm = state->getCTM(); + + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + x1 = mat[4]; + y1 = mat[5]; + x2 = x1 + width; + y2 = y1 + height; + + image = new CairoImage (x1, y1, x2, y2); + saveImage (image); + + if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cr = cairo_create (surface); + setCairo (cr); + cairo_translate (cr, 0, height); + cairo_scale (cr, width, -height); + + CairoOutputDev::drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg); + image->setImage (surface); + + setCairo (NULL); + cairo_surface_destroy (surface); + cairo_destroy (cr); + } +} + +void CairoImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) +{ + cairo_t *cr; + cairo_surface_t *surface; + double x1, y1, x2, y2; + double *ctm; + double mat[6]; + CairoImage *image; + + ctm = state->getCTM(); + + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + x1 = mat[4]; + y1 = mat[5]; + x2 = x1 + width; + y2 = y1 + height; + + image = new CairoImage (x1, y1, x2, y2); + saveImage (image); + + if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cr = cairo_create (surface); + setCairo (cr); + cairo_translate (cr, 0, height); + cairo_scale (cr, width, -height); + + CairoOutputDev::drawImage(state, ref, str, width, height, colorMap, interpolate, maskColors, inlineImg); + image->setImage (surface); + + setCairo (NULL); + cairo_surface_destroy (surface); + cairo_destroy (cr); + } +} + +void CairoImageOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate) +{ + cairo_t *cr; + cairo_surface_t *surface; + double x1, y1, x2, y2; + double *ctm; + double mat[6]; + CairoImage *image; + + ctm = state->getCTM(); + + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + x1 = mat[4]; + y1 = mat[5]; + x2 = x1 + width; + y2 = y1 + height; + + image = new CairoImage (x1, y1, x2, y2); + saveImage (image); + + if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cr = cairo_create (surface); + setCairo (cr); + cairo_translate (cr, 0, height); + cairo_scale (cr, width, -height); + + CairoOutputDev::drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate); + image->setImage (surface); + + setCairo (NULL); + cairo_surface_destroy (surface); + cairo_destroy (cr); + } +} + +void CairoImageOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate) +{ + cairo_t *cr; + cairo_surface_t *surface; + double x1, y1, x2, y2; + double *ctm; + double mat[6]; + CairoImage *image; + + ctm = state->getCTM(); + + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + x1 = mat[4]; + y1 = mat[5]; + x2 = x1 + width; + y2 = y1 + height; + + image = new CairoImage (x1, y1, x2, y2); + saveImage (image); + + if (imgDrawCbk && imgDrawCbk (numImages - 1, imgDrawCbkData)) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cr = cairo_create (surface); + setCairo (cr); + cairo_translate (cr, 0, height); + cairo_scale (cr, width, -height); + + CairoOutputDev::drawMaskedImage(state, ref, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskInvert, maskInterpolate); + image->setImage (surface); + + setCairo (NULL); + cairo_surface_destroy (surface); + cairo_destroy (cr); + } +} diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h new file mode 100644 index 0000000..df76975 --- /dev/null +++ b/poppler/CairoOutputDev.h @@ -0,0 +1,498 @@ +//======================================================================== +// +// CairoOutputDev.h +// +// Copyright 2003 Glyph & Cog, LLC +// Copyright 2004 Red Hat, INC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2008 Jeff Muizelaar +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2005 Nickolay V. Shmyrev +// Copyright (C) 2006-2011 Carlos Garcia Campos +// Copyright (C) 2008, 2009, 2011, 2012 Adrian Johnson +// Copyright (C) 2008 Michael Vrable +// Copyright (C) 2010-2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef CAIROOUTPUTDEV_H +#define CAIROOUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include +#include "OutputDev.h" +#include "TextOutputDev.h" +#include "GfxState.h" + +class PDFDoc; +class GfxState; +class GfxPath; +class Gfx8BitFont; +struct GfxRGB; +class CairoFontEngine; +class CairoFont; + +//------------------------------------------------------------------------ + +//------------------------------------------------------------------------ +// CairoImage +//------------------------------------------------------------------------ +class CairoImage { +public: + // Constructor. + CairoImage (double x1, double y1, double x2, double y2); + + // Destructor. + ~CairoImage (); + + // Set the image cairo surface + void setImage (cairo_surface_t *image); + + // Get the image cairo surface + cairo_surface_t *getImage () const { return image; } + + // Get the image rectangle + void getRect (double *xa1, double *ya1, double *xa2, double *ya2) + { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; } + +private: + cairo_surface_t *image; // image cairo surface + double x1, y1; // upper left corner + double x2, y2; // lower right corner +}; + + +//------------------------------------------------------------------------ +// CairoOutputDev +//------------------------------------------------------------------------ + +class CairoOutputDev: public OutputDev { +public: + + // Constructor. + CairoOutputDev(); + + // Destructor. + virtual ~CairoOutputDev(); + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gTrue; } + + // Does this device use functionShadedFill(), axialShadedFill(), and + // radialShadedFill()? If this returns false, these shaded fills + // will be reduced to a series of other drawing operations. +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) + virtual GBool useShadedFills(int type) { return type <= 7; } +#else + virtual GBool useShadedFills(int type) { return type < 4; } +#endif + + // Does this device use FillColorStop()? + virtual GBool useFillColorStop() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- save/restore graphics state + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void setDefaultCTM(double *ctm); + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateFillOpacity(GfxState *state); + virtual void updateStrokeOpacity(GfxState *state); + virtual void updateFillColorStop(GfxState *state, double offset); + virtual void updateBlendMode(GfxState *state); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + virtual void clipToStrokePath(GfxState *state); + virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax); + virtual GBool axialShadedSupportExtend(GfxState *state, GfxAxialShading *shading); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double sMin, double sMax); + virtual GBool radialShadedSupportExtend(GfxState *state, GfxRadialShading *shading); +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) + virtual GBool gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading); + virtual GBool patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading); +#endif + + //----- path clipping + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + + //----- text drawing + void beginString(GfxState *state, GooString *s); + void endString(GfxState *state); + void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + void beginActualText(GfxState *state, GooString *text); + void endActualText(GfxState *state); + + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + virtual void beginTextObject(GfxState *state); + virtual GBool deviceHasTextClip(GfxState *state) { return textClipPath; } + virtual void endTextObject(GfxState *state); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, GBool interpolate, + GBool inlineImg); + virtual void setSoftMaskFromImageMask(GfxState *state, + Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix); + virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix); + void drawImageMaskPrescaled(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, GBool interpolate, + GBool inlineImg); + void drawImageMaskRegular(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, GBool interpolate, + GBool inlineImg); + + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate); + + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + + //----- transparency groups and soft masks + virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/, + GfxColorSpace * /*blendingColorSpace*/, + GBool /*isolated*/, GBool /*knockout*/, + GBool /*forSoftMask*/); + virtual void endTransparencyGroup(GfxState * /*state*/); + void popTransparencyGroup(); + virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/); + virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/, + Function * /*transferFunc*/, GfxColor * /*backdropColor*/); + virtual void clearSoftMask(GfxState * /*state*/); + + //----- Type 3 font operators + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury); + + //----- special access + + // Called to indicate that a new PDF document has been loaded. + void startDoc(PDFDoc *docA, CairoFontEngine *fontEngine = NULL); + + GBool isReverseVideo() { return gFalse; } + + void setCairo (cairo_t *cr); + void setTextPage (TextPage *text); + void setPrinting (GBool printing) { this->printing = printing; needFontUpdate = gTrue; } + + void setInType3Char(GBool inType3Char) { this->inType3Char = inType3Char; } + void getType3GlyphWidth (double *wx, double *wy) { *wx = t3_glyph_wx; *wy = t3_glyph_wy; } + GBool hasType3GlyphBBox () { return t3_glyph_has_bbox; } + double *getType3GlyphBBox () { return t3_glyph_bbox; } + +protected: + void doPath(cairo_t *cairo, GfxState *state, GfxPath *path); + cairo_surface_t *downscaleSurface(cairo_surface_t *orig_surface); + void getScaledSize(int orig_width, int orig_height, + int *scaledWidth, int *scaledHeight); + cairo_filter_t getFilterForSurface(cairo_surface_t *image, + GBool interpolate); + GBool getStreamData (Stream *str, char **buffer, int *length); + void setMimeData(Stream *str, Object *ref, cairo_surface_t *image); + void fillToStrokePathClip(GfxState *state); + void alignStrokeCoords(GfxSubpath *subpath, int i, double *x, double *y); + + GfxRGB fill_color, stroke_color; + cairo_pattern_t *fill_pattern, *stroke_pattern; + double fill_opacity; + double stroke_opacity; + GBool stroke_adjust; + GBool adjusted_stroke_width; + GBool align_stroke_coords; + CairoFont *currentFont; + + struct StrokePathClip { + GfxPath *path; + cairo_matrix_t ctm; + double line_width; + double *dashes; + int dash_count; + double dash_offset; + cairo_line_cap_t cap; + cairo_line_join_t join; + double miter; + } *strokePathClip; + + PDFDoc *doc; // the current document + + static FT_Library ft_lib; + static GBool ft_lib_initialized; + + CairoFontEngine *fontEngine; + GBool fontEngine_owner; + + cairo_t *cairo; + cairo_matrix_t orig_matrix; + GBool needFontUpdate; // set when the font needs to be updated + GBool printing; + GBool use_show_text_glyphs; + cairo_surface_t *surface; + cairo_glyph_t *glyphs; + int glyphCount; + cairo_text_cluster_t *clusters; + int clusterCount; + char *utf8; + int utf8Count; + int utf8Max; + cairo_path_t *textClipPath; + GBool inType3Char; // inside a Type 3 CharProc + double t3_glyph_wx, t3_glyph_wy; + GBool t3_glyph_has_bbox; + double t3_glyph_bbox[4]; + + GBool prescaleImages; + + TextPage *text; // text for the current page + ActualText *actualText; + + cairo_pattern_t *group; + cairo_pattern_t *shape; + cairo_pattern_t *mask; + cairo_matrix_t mask_matrix; + cairo_surface_t *cairo_shape_surface; + cairo_t *cairo_shape; + int knockoutCount; + struct ColorSpaceStack { + GBool knockout; + GfxColorSpace *cs; + cairo_matrix_t group_matrix; + struct ColorSpaceStack *next; + } * groupColorSpaceStack; + + struct MaskStack { + cairo_pattern_t *mask; + cairo_matrix_t mask_matrix; + struct MaskStack *next; + } *maskStack; + +}; + +//------------------------------------------------------------------------ +// CairoImageOutputDev +//------------------------------------------------------------------------ + +//XXX: this should ideally not inherit from CairoOutputDev but use it instead perhaps +class CairoImageOutputDev: public CairoOutputDev { +public: + + // Constructor. + CairoImageOutputDev(); + + // Destructor. + virtual ~CairoImageOutputDev(); + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gFalse; } + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gTrue; } + + // Does this device use functionShadedFill(), axialShadedFill(), and + // radialShadedFill()? If this returns false, these shaded fills + // will be reduced to a series of other drawing operations. +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) + virtual GBool useShadedFills(int type) { return type <= 7; } +#else + virtual GBool useShadedFills(int type) { return type < 4; } +#endif + + // Does this device use FillColorStop()? + virtual GBool useFillColorStop() { return gFalse; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + // Does this device need non-text content? + virtual GBool needNonText() { return gTrue; } + + //----- save/restore graphics state + virtual void saveState(GfxState *state) { } + virtual void restoreState(GfxState *state) { } + + //----- update graphics state + virtual void updateAll(GfxState *state) { } + virtual void setDefaultCTM(double *ctm) { } + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32) { } + virtual void updateLineDash(GfxState *state) { } + virtual void updateFlatness(GfxState *state) { } + virtual void updateLineJoin(GfxState *state) { } + virtual void updateLineCap(GfxState *state) { } + virtual void updateMiterLimit(GfxState *state) { } + virtual void updateLineWidth(GfxState *state) { } + virtual void updateFillColor(GfxState *state) { } + virtual void updateStrokeColor(GfxState *state) { } + virtual void updateFillOpacity(GfxState *state) { } + virtual void updateStrokeOpacity(GfxState *state) { } + virtual void updateBlendMode(GfxState *state) { } + + //----- update text state + virtual void updateFont(GfxState *state) { } + + //----- path painting + virtual void stroke(GfxState *state) { } + virtual void fill(GfxState *state) { } + virtual void eoFill(GfxState *state) { } + virtual void clipToStrokePath(GfxState *state) { } + virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) { return gTrue; } + virtual GBool axialShadedFill(GfxState *state, + GfxAxialShading *shading, + double tMin, double tMax) { return gTrue; } + virtual GBool radialShadedFill(GfxState *state, + GfxRadialShading *shading, + double sMin, double sMax) { return gTrue; } + + //----- path clipping + virtual void clip(GfxState *state) { } + virtual void eoClip(GfxState *state) { } + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + + //----- transparency groups and soft masks + virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/, + GfxColorSpace * /*blendingColorSpace*/, + GBool /*isolated*/, GBool /*knockout*/, + GBool /*forSoftMask*/) {} + virtual void endTransparencyGroup(GfxState * /*state*/) {} + virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {} + virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/, + Function * /*transferFunc*/, GfxColor * /*backdropColor*/) {} + virtual void clearSoftMask(GfxState * /*state*/) {} + + //----- Image list + // By default images are not rendred + void setImageDrawDecideCbk(GBool (*cbk)(int img_id, void *data), + void *data) { imgDrawCbk = cbk; imgDrawCbkData = data; } + // Iterate through list of images. + int getNumImages() const { return numImages; } + CairoImage *getImage(int i) const { return images[i]; } + +private: + void saveImage(CairoImage *image); + + CairoImage **images; + int numImages; + int size; + GBool (*imgDrawCbk)(int img_id, void *data); + void *imgDrawCbkData; +}; + +#endif diff --git a/poppler/CairoRescaleBox.cc b/poppler/CairoRescaleBox.cc new file mode 100644 index 0000000..68a0c4c --- /dev/null +++ b/poppler/CairoRescaleBox.cc @@ -0,0 +1,366 @@ +/* -*- Mode: c; c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t; -*- */ +/* + * Copyright © 2009 Mozilla Corporation + * + * 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, and that the name of Mozilla Corporation not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Mozilla Corporation makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT + * SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + * Author: Jeff Muizelaar, Mozilla Corp. + */ + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2012 Hib Eris +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + + +/* This implements a box filter that supports non-integer box sizes */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include "goo/gmem.h" +#include "goo/gtypes_p.h" +#include "CairoRescaleBox.h" + + +/* we work in fixed point where 1. == 1 << 24 */ +#define FIXED_SHIFT 24 + +static void downsample_row_box_filter ( + int start, int width, + uint32_t *src, uint32_t *dest, + int coverage[], int pixel_coverage) +{ + /* we need an array of the pixel contribution of each destination pixel on the boundaries. + * we invert the value to get the value on the other size of the box */ + /* + + value = a * contribution * 1/box_size + value += a * 1/box_size + value += a * 1/box_size + value += a * 1/box_size + value += a * (1 - contribution) * 1/box_size + a * (1/box_size - contribution * 1/box_size) + + box size is constant + + + value = a * contribtion_a * 1/box_size + b * contribution_b * 1/box_size + contribution_b = (1 - contribution_a) + = (1 - contribution_a_next) + */ + + /* box size = ceil(src_width/dest_width) */ + int x = 0; + + /* skip to start */ + /* XXX: it might be possible to do this directly instead of iteratively, however + * the iterative solution is simple */ + while (x < start) + { + int box = 1 << FIXED_SHIFT; + int start_coverage = coverage[x]; + box -= start_coverage; + src++; + while (box >= pixel_coverage) + { + src++; + box -= pixel_coverage; + } + x++; + } + + while (x < start + width) + { + uint32_t a = 0; + uint32_t r = 0; + uint32_t g = 0; + uint32_t b = 0; + int box = 1 << FIXED_SHIFT; + int start_coverage = coverage[x]; + + a = ((*src >> 24) & 0xff) * start_coverage; + r = ((*src >> 16) & 0xff) * start_coverage; + g = ((*src >> 8) & 0xff) * start_coverage; + b = ((*src >> 0) & 0xff) * start_coverage; + src++; + x++; + box -= start_coverage; + + while (box >= pixel_coverage) + { + a += ((*src >> 24) & 0xff) * pixel_coverage; + r += ((*src >> 16) & 0xff) * pixel_coverage; + g += ((*src >> 8) & 0xff) * pixel_coverage; + b += ((*src >> 0) & 0xff) * pixel_coverage; + src++; + + box -= pixel_coverage; + } + + /* multiply by whatever is leftover + * this ensures that we don't bias down. + * i.e. start_coverage + n*pixel_coverage + box == 1 << 24 */ + if (box > 0) + { + a += ((*src >> 24) & 0xff) * box; + r += ((*src >> 16) & 0xff) * box; + g += ((*src >> 8) & 0xff) * box; + b += ((*src >> 0) & 0xff) * box; + } + + a >>= FIXED_SHIFT; + r >>= FIXED_SHIFT; + g >>= FIXED_SHIFT; + b >>= FIXED_SHIFT; + + *dest = (a << 24) | (r << 16) | (g << 8) | b; + dest++; + } +} + +static void downsample_columns_box_filter ( + int n, + int start_coverage, + int pixel_coverage, + uint32_t *src, uint32_t *dest) +{ + int stride = n; + while (n--) { + uint32_t a = 0; + uint32_t r = 0; + uint32_t g = 0; + uint32_t b = 0; + uint32_t *column_src = src; + int box = 1 << FIXED_SHIFT; + + a = ((*column_src >> 24) & 0xff) * start_coverage; + r = ((*column_src >> 16) & 0xff) * start_coverage; + g = ((*column_src >> 8) & 0xff) * start_coverage; + b = ((*column_src >> 0) & 0xff) * start_coverage; + column_src += stride; + box -= start_coverage; + + while (box >= pixel_coverage) + { + a += ((*column_src >> 24) & 0xff) * pixel_coverage; + r += ((*column_src >> 16) & 0xff) * pixel_coverage; + g += ((*column_src >> 8) & 0xff) * pixel_coverage; + b += ((*column_src >> 0) & 0xff) * pixel_coverage; + column_src += stride; + box -= pixel_coverage; + } + + if (box > 0) { + a += ((*column_src >> 24) & 0xff) * box; + r += ((*column_src >> 16) & 0xff) * box; + g += ((*column_src >> 8) & 0xff) * box; + b += ((*column_src >> 0) & 0xff) * box; + } + + a >>= FIXED_SHIFT; + r >>= FIXED_SHIFT; + g >>= FIXED_SHIFT; + b >>= FIXED_SHIFT; + + *dest = (a << 24) | (r << 16) | (g << 8) | b; + dest++; + src++; + } +} + +static int compute_coverage (int coverage[], int src_length, int dest_length) +{ + int i; + /* num = src_length/dest_length + total = sum(pixel) / num + + pixel * 1/num == pixel * dest_length / src_length + */ + /* the average contribution of each source pixel */ + int ratio = ((1 << 24)*(long long int)dest_length)/src_length; + /* because ((1 << 24)*(long long int)dest_length) won't always be divisible by src_length + * we'll need someplace to put the other bits. + * + * We want to ensure a + n*ratio < 1<<24 + * + * 1<<24 + * */ + + double scale = (double)src_length/dest_length; + + /* for each destination pixel compute the coverage of the left most pixel included in the box */ + /* I have a proof of this, which this margin is too narrow to contain */ + for (i=0; i= i*scale + + floor((i+1)*scale) - ceil(i*scale) <= scale + + further since: floor((i+1)*scale) - ceil(i*scale) is an integer + + therefore: + floor((i+1)*scale) - ceil(i*scale) <= floor(scale) + */ + + if (left_fract == 0.) + count--; + + /* compute how much the right-most pixel contributes */ + overage = ratio*(right_fract); + + /* the remainder is the the amount that the left-most pixel + * contributes */ + coverage[i] = (1<<24) - (count * ratio + overage); + } + + return ratio; +} + +GBool downscale_box_filter(uint32_t *orig, int orig_stride, unsigned orig_width, unsigned orig_height, + signed scaled_width, signed scaled_height, + uint16_t start_column, uint16_t start_row, + uint16_t width, uint16_t height, + uint32_t *dest, int dst_stride) +{ + int pixel_coverage_x, pixel_coverage_y; + int dest_y; + int src_y = 0; + uint32_t *scanline = orig; + int *x_coverage = NULL; + int *y_coverage = NULL; + uint32_t *temp_buf = NULL; + GBool retval = gFalse; + + x_coverage = (int *)gmallocn3 (orig_width, 1, sizeof(int)); + y_coverage = (int *)gmallocn3 (orig_height, 1, sizeof(int)); + + /* we need to allocate enough room for ceil(src_height/dest_height)+1 + Example: + src_height = 140 + dest_height = 50 + src_height/dest_height = 2.8 + + |-------------| 2.8 pixels + |----|----|----|----| 4 pixels + need to sample 3 pixels + + |-------------| 2.8 pixels + |----|----|----|----| 4 pixels + need to sample 4 pixels + */ + + temp_buf = (uint32_t *)gmallocn3 ((orig_height + scaled_height-1)/scaled_height+1, scaled_width, sizeof(uint32_t)); + + if (!x_coverage || !y_coverage || !scanline || !temp_buf) + goto cleanup; + + pixel_coverage_x = compute_coverage (x_coverage, orig_width, scaled_width); + pixel_coverage_y = compute_coverage (y_coverage, orig_height, scaled_height); + + assert (width + start_column <= scaled_width); + + /* skip the rows at the beginning */ + for (dest_y = 0; dest_y < start_row; dest_y++) + { + int box = 1 << FIXED_SHIFT; + int start_coverage_y = y_coverage[dest_y]; + box -= start_coverage_y; + src_y++; + while (box >= pixel_coverage_y) + { + box -= pixel_coverage_y; + src_y++; + } + } + + for (; dest_y < start_row + height; dest_y++) + { + int columns = 0; + int box = 1 << FIXED_SHIFT; + int start_coverage_y = y_coverage[dest_y]; + + scanline = orig + src_y * orig_stride / 4; + downsample_row_box_filter (start_column, width, scanline, temp_buf + width * columns, x_coverage, pixel_coverage_x); + columns++; + src_y++; + box -= start_coverage_y; + + while (box >= pixel_coverage_y) + { + scanline = orig + src_y * orig_stride / 4; + downsample_row_box_filter (start_column, width, scanline, temp_buf + width * columns, x_coverage, pixel_coverage_x); + columns++; + src_y++; + box -= pixel_coverage_y; + } + + /* downsample any leftovers */ + if (box > 0) + { + scanline = orig + src_y * orig_stride / 4; + downsample_row_box_filter (start_column, width, scanline, temp_buf + width * columns, x_coverage, pixel_coverage_x); + columns++; + } + + /* now scale the rows we just downsampled in the y direction */ + downsample_columns_box_filter (width, start_coverage_y, pixel_coverage_y, temp_buf, dest); + dest += dst_stride / 4; + +// assert(width*columns <= ((orig_height + scaled_height-1)/scaled_height+1) * width); + } +// assert (src_y<=orig_height); + + retval = gTrue; + +cleanup: + free (x_coverage); + free (y_coverage); + free (temp_buf); + + return retval; +} diff --git a/poppler/CairoRescaleBox.h b/poppler/CairoRescaleBox.h new file mode 100644 index 0000000..5349c87 --- /dev/null +++ b/poppler/CairoRescaleBox.h @@ -0,0 +1,12 @@ +#ifndef CAIRO_RESCALE_BOX_H +#define CAIRO_RESCALE_BOX_H + +#include "goo/gtypes.h" + +GBool downscale_box_filter(unsigned int *orig, int orig_stride, unsigned orig_width, unsigned orig_height, + signed scaled_width, signed scaled_height, + unsigned short int start_column, unsigned short int start_row, + unsigned short int width, unsigned short int height, + unsigned int *dest, int dst_stride); + +#endif /* CAIRO_RESCALE_BOX_H */ diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc new file mode 100644 index 0000000..0f42356 --- /dev/null +++ b/poppler/Catalog.cc @@ -0,0 +1,966 @@ +//======================================================================== +// +// Catalog.cc +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2005-2012 Albert Astals Cid +// Copyright (C) 2005 Jeff Muizelaar +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2005 Marco Pesenti Gritti +// Copyright (C) 2005, 2006, 2008 Brad Hards +// Copyright (C) 2006, 2008, 2011 Carlos Garcia Campos +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2008, 2011 Pino Toscano +// Copyright (C) 2009 Ilya Gorenbein +// Copyright (C) 2010 Hib Eris +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "Object.h" +#include "PDFDoc.h" +#include "XRef.h" +#include "Array.h" +#include "Dict.h" +#include "Page.h" +#include "Error.h" +#include "Link.h" +#include "PageLabelInfo.h" +#include "Catalog.h" +#include "Form.h" +#include "OptionalContent.h" +#include "ViewerPreferences.h" +#include "FileSpec.h" + +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +Catalog::Catalog(PDFDoc *docA) { + Object catDict, pagesDict, pagesDictRef; + Object obj, obj2; + Object optContentProps; + + ok = gTrue; + doc = docA; + xref = doc->getXRef(); + pages = NULL; + pageRefs = NULL; + numPages = -1; + pagesSize = 0; + baseURI = NULL; + pageLabelInfo = NULL; + form = NULL; + optContent = NULL; + pageMode = pageModeNull; + pageLayout = pageLayoutNull; + destNameTree = NULL; + embeddedFileNameTree = NULL; + jsNameTree = NULL; + viewerPrefs = NULL; + + pagesList = NULL; + pagesRefList = NULL; + attrsList = NULL; + kidsIdxList = NULL; + lastCachedPage = 0; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + goto err1; + } + // get the AcroForm dictionary + catDict.dictLookup("AcroForm", &acroForm); + + // read base URI + if (catDict.dictLookup("URI", &obj)->isDict()) { + if (obj.dictLookup("Base", &obj2)->isString()) { + baseURI = obj2.getString()->copy(); + } + obj2.free(); + } + obj.free(); + + // get the Optional Content dictionary + if (catDict.dictLookup("OCProperties", &optContentProps)->isDict()) { + optContent = new OCGs(&optContentProps, xref); + if (!optContent->isOk ()) { + delete optContent; + optContent = NULL; + } + } + optContentProps.free(); + + // get the ViewerPreferences dictionary + catDict.dictLookup("ViewerPreferences", &viewerPreferences); + catDict.free(); + return; + + err1: + catDict.free(); + ok = gFalse; +} + +Catalog::~Catalog() { + delete kidsIdxList; + if (attrsList) { + std::vector::iterator it; + for (it = attrsList->begin() ; it < attrsList->end(); it++ ) { + delete *it; + } + delete attrsList; + } + delete pagesRefList; + if (pagesList) { + std::vector::iterator it; + for (it = pagesList->begin() ; it < pagesList->end(); it++ ) { + if (!(*it)->decRef()) { + delete *it; + } + } + delete pagesList; + } + if (pages) { + for (int i = 0; i < pagesSize; ++i) { + if (pages[i]) { + delete pages[i]; + } + } + gfree(pages); + gfree(pageRefs); + } + names.free(); + dests.free(); + delete destNameTree; + delete embeddedFileNameTree; + delete jsNameTree; + if (baseURI) { + delete baseURI; + } + delete pageLabelInfo; + delete form; + delete optContent; + delete viewerPrefs; + metadata.free(); + structTreeRoot.free(); + outline.free(); + acroForm.free(); + viewerPreferences.free(); +} + +GooString *Catalog::readMetadata() { + GooString *s; + Dict *dict; + Object obj; + + if (metadata.isNone()) { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Metadata", &metadata); + } else { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + metadata.initNull(); + } + catDict.free(); + } + + if (!metadata.isStream()) { + return NULL; + } + dict = metadata.streamGetDict(); + if (!dict->lookup("Subtype", &obj)->isName("XML")) { + error(errSyntaxWarning, -1, "Unknown Metadata type: '{0:s}'", + obj.isName() ? obj.getName() : "???"); + } + obj.free(); + s = new GooString(); + metadata.getStream()->fillGooString(s); + metadata.streamClose(); + return s; +} + +Page *Catalog::getPage(int i) +{ + if (i < 1) return NULL; + + if (i > lastCachedPage) { + if (cachePageTree(i) == gFalse) return NULL; + } + return pages[i-1]; +} + +Ref *Catalog::getPageRef(int i) +{ + if (i < 1) return NULL; + + if (i > lastCachedPage) { + if (cachePageTree(i) == gFalse) return NULL; + } + return &pageRefs[i-1]; +} + +GBool Catalog::cachePageTree(int page) +{ + Dict *pagesDict; + + if (pagesList == NULL) { + + Object catDict; + Ref pagesRef; + + xref->getCatalog(&catDict); + + if (catDict.isDict()) { + Object pagesDictRef; + if (catDict.dictLookupNF("Pages", &pagesDictRef)->isRef() && + pagesDictRef.getRefNum() >= 0 && + pagesDictRef.getRefNum() < xref->getNumObjects()) { + pagesRef = pagesDictRef.getRef(); + pagesDictRef.free(); + } else { + error(errSyntaxError, -1, "Catalog dictionary does not contain a valid \"Pages\" entry"); + pagesDictRef.free(); + catDict.free(); + return gFalse; + } + } else { + error(errSyntaxError, -1, "Could not find catalog dictionary"); + catDict.free(); + return gFalse; + } + + Object obj; + catDict.dictLookup("Pages", &obj); + catDict.free(); + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + if (obj.isDict()) { + obj.getDict()->incRef(); + pagesDict = obj.getDict(); + obj.free(); + } + else { + error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})", obj.getTypeName()); + obj.free(); + return gFalse; + } + + pagesSize = getNumPages(); + pages = (Page **)gmallocn(pagesSize, sizeof(Page *)); + pageRefs = (Ref *)gmallocn(pagesSize, sizeof(Ref)); + for (int i = 0; i < pagesSize; ++i) { + pages[i] = NULL; + pageRefs[i].num = -1; + pageRefs[i].gen = -1; + } + + pagesList = new std::vector(); + pagesList->push_back(pagesDict); + pagesRefList = new std::vector(); + pagesRefList->push_back(pagesRef); + attrsList = new std::vector(); + attrsList->push_back(new PageAttrs(NULL, pagesDict)); + kidsIdxList = new std::vector(); + kidsIdxList->push_back(0); + lastCachedPage = 0; + + } + + while(1) { + + if (page <= lastCachedPage) return gTrue; + + if (pagesList->empty()) return gFalse; + + pagesDict = pagesList->back(); + Object kids; + pagesDict->lookup("Kids", &kids); + if (!kids.isArray()) { + error(errSyntaxError, -1, "Kids object (page {0:d}) is wrong type ({1:s})", + lastCachedPage+1, kids.getTypeName()); + kids.free(); + return gFalse; + } + + int kidsIdx = kidsIdxList->back(); + if (kidsIdx >= kids.arrayGetLength()) { + if (!pagesList->back()->decRef()) { + delete pagesList->back(); + } + pagesList->pop_back(); + pagesRefList->pop_back(); + delete attrsList->back(); + attrsList->pop_back(); + kidsIdxList->pop_back(); + if (!kidsIdxList->empty()) kidsIdxList->back()++; + kids.free(); + continue; + } + + Object kidRef; + kids.arrayGetNF(kidsIdx, &kidRef); + if (!kidRef.isRef()) { + error(errSyntaxError, -1, "Kid object (page {0:d}) is not an indirect reference ({1:s})", + lastCachedPage+1, kidRef.getTypeName()); + kidRef.free(); + kids.free(); + return gFalse; + } + + GBool loop = gFalse;; + for (size_t i = 0; i < pagesRefList->size(); i++) { + if (((*pagesRefList)[i]).num == kidRef.getRefNum()) { + loop = gTrue; + break; + } + } + if (loop) { + error(errSyntaxError, -1, "Loop in Pages tree"); + kidRef.free(); + kids.free(); + kidsIdxList->back()++; + continue; + } + + Object kid; + kids.arrayGet(kidsIdx, &kid); + kids.free(); + if (kid.isDict("Page") || (kid.isDict() && !kid.getDict()->hasKey("Kids"))) { + PageAttrs *attrs = new PageAttrs(attrsList->back(), kid.getDict()); + Page *p = new Page(doc, lastCachedPage+1, kid.getDict(), + kidRef.getRef(), attrs, form); + if (!p->isOk()) { + error(errSyntaxError, -1, "Failed to create page (page {0:d})", lastCachedPage+1); + delete p; + kidRef.free(); + kid.free(); + return gFalse; + } + + if (lastCachedPage >= numPages) { + error(errSyntaxError, -1, "Page count in top-level pages object is incorrect"); + kidRef.free(); + kid.free(); + return gFalse; + } + + pages[lastCachedPage] = p; + pageRefs[lastCachedPage].num = kidRef.getRefNum(); + pageRefs[lastCachedPage].gen = kidRef.getRefGen(); + + lastCachedPage++; + kidsIdxList->back()++; + + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + } else if (kid.isDict()) { + attrsList->push_back(new PageAttrs(attrsList->back(), kid.getDict())); + pagesRefList->push_back(kidRef.getRef()); + kid.getDict()->incRef(); + pagesList->push_back(kid.getDict()); + kidsIdxList->push_back(0); + } else { + error(errSyntaxError, -1, "Kid object (page {0:d}) is wrong type ({1:s})", + lastCachedPage+1, kid.getTypeName()); + kidsIdxList->back()++; + } + kidRef.free(); + kid.free(); + + } + + return gFalse; +} + +int Catalog::findPage(int num, int gen) { + int i; + + for (i = 0; i < getNumPages(); ++i) { + Ref *ref = getPageRef(i+1); + if (ref != NULL && ref->num == num && ref->gen == gen) + return i + 1; + } + return 0; +} + +LinkDest *Catalog::findDest(GooString *name) { + LinkDest *dest; + Object obj1, obj2; + GBool found; + + // try named destination dictionary then name tree + found = gFalse; + if (getDests()->isDict()) { + if (!getDests()->dictLookup(name->getCString(), &obj1)->isNull()) + found = gTrue; + else + obj1.free(); + } + if (!found) { + if (getDestNameTree()->lookup(name, &obj1)) + found = gTrue; + else + obj1.free(); + } + if (!found) + return NULL; + + // construct LinkDest + dest = NULL; + if (obj1.isArray()) { + dest = new LinkDest(obj1.getArray()); + } else if (obj1.isDict()) { + if (obj1.dictLookup("D", &obj2)->isArray()) + dest = new LinkDest(obj2.getArray()); + else + error(errSyntaxWarning, -1, "Bad named destination value"); + obj2.free(); + } else { + error(errSyntaxWarning, -1, "Bad named destination value"); + } + obj1.free(); + if (dest && !dest->isOk()) { + delete dest; + dest = NULL; + } + + return dest; +} + +FileSpec *Catalog::embeddedFile(int i) +{ + Object efDict; + Object obj; + obj = getEmbeddedFileNameTree()->getValue(i); + FileSpec *embeddedFile = 0; + if (obj.isRef()) { + Object fsDict; + embeddedFile = new FileSpec(obj.fetch(xref, &fsDict)); + fsDict.free(); + } else if (obj.isDict()) { + embeddedFile = new FileSpec(&obj); + } else { + Object null; + embeddedFile = new FileSpec(&null); + } + return embeddedFile; +} + +GooString *Catalog::getJS(int i) +{ + Object obj; + // getJSNameTree()->getValue(i) returns a shallow copy of the object so we + // do not need to free it + getJSNameTree()->getValue(i).fetch(xref, &obj); + + if (!obj.isDict()) { + obj.free(); + return 0; + } + Object obj2; + if (!obj.dictLookup("S", &obj2)->isName()) { + obj2.free(); + obj.free(); + return 0; + } + if (strcmp(obj2.getName(), "JavaScript")) { + obj2.free(); + obj.free(); + return 0; + } + obj2.free(); + obj.dictLookup("JS", &obj2); + GooString *js = 0; + if (obj2.isString()) { + js = new GooString(obj2.getString()); + } + else if (obj2.isStream()) { + Stream *stream = obj2.getStream(); + js = new GooString(); + stream->fillGooString(js); + } + obj2.free(); + obj.free(); + return js; +} + +Catalog::PageMode Catalog::getPageMode() { + + if (pageMode == pageModeNull) { + + Object catDict, obj; + + pageMode = pageModeNone; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + catDict.free(); + return pageMode; + } + + if (catDict.dictLookup("PageMode", &obj)->isName()) { + if (obj.isName("UseNone")) + pageMode = pageModeNone; + else if (obj.isName("UseOutlines")) + pageMode = pageModeOutlines; + else if (obj.isName("UseThumbs")) + pageMode = pageModeThumbs; + else if (obj.isName("FullScreen")) + pageMode = pageModeFullScreen; + else if (obj.isName("UseOC")) + pageMode = pageModeOC; + else if (obj.isName("UseAttachments")) + pageMode = pageModeAttach; + } + obj.free(); + catDict.free(); + } + return pageMode; +} + +Catalog::PageLayout Catalog::getPageLayout() { + + if (pageLayout == pageLayoutNull) { + + Object catDict, obj; + + pageLayout = pageLayoutNone; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + catDict.free(); + return pageLayout; + } + + pageLayout = pageLayoutNone; + if (catDict.dictLookup("PageLayout", &obj)->isName()) { + if (obj.isName("SinglePage")) + pageLayout = pageLayoutSinglePage; + if (obj.isName("OneColumn")) + pageLayout = pageLayoutOneColumn; + if (obj.isName("TwoColumnLeft")) + pageLayout = pageLayoutTwoColumnLeft; + if (obj.isName("TwoColumnRight")) + pageLayout = pageLayoutTwoColumnRight; + if (obj.isName("TwoPageLeft")) + pageLayout = pageLayoutTwoPageLeft; + if (obj.isName("TwoPageRight")) + pageLayout = pageLayoutTwoPageRight; + } + obj.free(); + catDict.free(); + } + return pageLayout; +} + +NameTree::NameTree() +{ + size = 0; + length = 0; + entries = NULL; +} + +NameTree::~NameTree() +{ + int i; + + for (i = 0; i < length; i++) + delete entries[i]; + + gfree(entries); +} + +NameTree::Entry::Entry(Array *array, int index) { + if (!array->getString(index, &name) || !array->getNF(index + 1, &value)) { + Object aux; + array->get(index, &aux); + if (aux.isString() && array->getNF(index + 1, &value) ) + { + name.append(aux.getString()); + } + else + error(errSyntaxError, -1, "Invalid page tree"); + } +} + +NameTree::Entry::~Entry() { + value.free(); +} + +void NameTree::addEntry(Entry *entry) +{ + if (length == size) { + if (length == 0) { + size = 8; + } else { + size *= 2; + } + entries = (Entry **) grealloc (entries, sizeof (Entry *) * size); + } + + entries[length] = entry; + ++length; +} + +void NameTree::init(XRef *xrefA, Object *tree) { + xref = xrefA; + parse(tree); +} + +void NameTree::parse(Object *tree) { + Object names; + Object kids, kid; + int i; + + if (!tree->isDict()) + return; + + // leaf node + if (tree->dictLookup("Names", &names)->isArray()) { + for (i = 0; i < names.arrayGetLength(); i += 2) { + NameTree::Entry *entry; + + entry = new Entry(names.getArray(), i); + addEntry(entry); + } + } + names.free(); + + // root or intermediate node + if (tree->dictLookup("Kids", &kids)->isArray()) { + for (i = 0; i < kids.arrayGetLength(); ++i) { + if (kids.arrayGet(i, &kid)->isDict()) + parse(&kid); + kid.free(); + } + } + kids.free(); +} + +int NameTree::Entry::cmp(const void *voidKey, const void *voidEntry) +{ + GooString *key = (GooString *) voidKey; + Entry *entry = *(NameTree::Entry **) voidEntry; + + return key->cmp(&entry->name); +} + +GBool NameTree::lookup(GooString *name, Object *obj) +{ + Entry **entry; + + entry = (Entry **) bsearch(name, entries, + length, sizeof(Entry *), Entry::cmp); + if (entry != NULL) { + (*entry)->value.fetch(xref, obj); + return gTrue; + } else { + printf("failed to look up %s\n", name->getCString()); + obj->initNull(); + return gFalse; + } +} + +Object NameTree::getValue(int index) +{ + if (index < length) { + return entries[index]->value; + } else { + return Object(); + } +} + +GooString *NameTree::getName(int index) +{ + if (index < length) { + return &entries[index]->name; + } else { + return NULL; + } +} + +GBool Catalog::labelToIndex(GooString *label, int *index) +{ + char *end; + + PageLabelInfo *pli = getPageLabelInfo(); + if (pli != NULL) { + if (!pli->labelToIndex(label, index)) + return gFalse; + } else { + *index = strtol(label->getCString(), &end, 10) - 1; + if (*end != '\0') + return gFalse; + } + + if (*index < 0 || *index >= getNumPages()) + return gFalse; + + return gTrue; +} + +GBool Catalog::indexToLabel(int index, GooString *label) +{ + char buffer[32]; + + if (index < 0 || index >= getNumPages()) + return gFalse; + + PageLabelInfo *pli = getPageLabelInfo(); + if (pli != NULL) { + return pli->indexToLabel(index, label); + } else { + snprintf(buffer, sizeof (buffer), "%d", index + 1); + label->append(buffer); + return gTrue; + } +} + +int Catalog::getNumPages() +{ + if (numPages == -1) + { + Object catDict, pagesDict, obj; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + catDict.free(); + return 0; + } + catDict.dictLookup("Pages", &pagesDict); + catDict.free(); + + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + if (!pagesDict.isDict()) { + error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})", + pagesDict.getTypeName()); + pagesDict.free(); + return 0; + } + + pagesDict.dictLookup("Count", &obj); + // some PDF files actually use real numbers here ("/Count 9.0") + if (!obj.isNum()) { + error(errSyntaxError, -1, "Page count in top-level pages object is wrong type ({0:s})", + obj.getTypeName()); + numPages = 0; + } else { + numPages = (int)obj.getNum(); + } + + obj.free(); + pagesDict.free(); + } + + return numPages; +} + +PageLabelInfo *Catalog::getPageLabelInfo() +{ + if (!pageLabelInfo) { + Object catDict; + Object obj; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + catDict.free(); + return NULL; + } + + if (catDict.dictLookup("PageLabels", &obj)->isDict()) { + pageLabelInfo = new PageLabelInfo(&obj, getNumPages()); + } + obj.free(); + catDict.free(); + } + + return pageLabelInfo; +} + +Object *Catalog::getStructTreeRoot() +{ + if (structTreeRoot.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("StructTreeRoot", &structTreeRoot); + } else { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + structTreeRoot.initNull(); + } + catDict.free(); + } + + return &structTreeRoot; +} + +Object *Catalog::getOutline() +{ + if (outline.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Outlines", &outline); + } else { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + outline.initNull(); + } + catDict.free(); + } + + return &outline; +} + +Object *Catalog::getDests() +{ + if (dests.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Dests", &dests); + } else { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + dests.initNull(); + } + catDict.free(); + } + + return &dests; +} + +Form *Catalog::getForm() +{ + if (!form) { + if (acroForm.isDict()) { + form = new Form(doc, &acroForm); + // perform form-related loading after all widgets have been loaded + form->postWidgetsLoad(); + } + } + + return form; +} + +ViewerPreferences *Catalog::getViewerPreferences() +{ + if (!viewerPrefs) { + if (viewerPreferences.isDict()) { + viewerPrefs = new ViewerPreferences(viewerPreferences.getDict()); + } + } + + return viewerPrefs; +} + +Object *Catalog::getNames() +{ + if (names.isNone()) + { + Object catDict; + + xref->getCatalog(&catDict); + if (catDict.isDict()) { + catDict.dictLookup("Names", &names); + } else { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + names.initNull(); + } + catDict.free(); + } + + return &names; +} + +NameTree *Catalog::getDestNameTree() +{ + if (!destNameTree) { + + destNameTree = new NameTree(); + + if (getNames()->isDict()) { + Object obj; + + getNames()->dictLookup("Dests", &obj); + destNameTree->init(xref, &obj); + obj.free(); + } + + } + + return destNameTree; +} + +NameTree *Catalog::getEmbeddedFileNameTree() +{ + if (!embeddedFileNameTree) { + + embeddedFileNameTree = new NameTree(); + + if (getNames()->isDict()) { + Object obj; + + getNames()->dictLookup("EmbeddedFiles", &obj); + embeddedFileNameTree->init(xref, &obj); + obj.free(); + } + + } + + return embeddedFileNameTree; +} + +NameTree *Catalog::getJSNameTree() +{ + if (!jsNameTree) { + + jsNameTree = new NameTree(); + + if (getNames()->isDict()) { + Object obj; + + getNames()->dictLookup("JavaScript", &obj); + jsNameTree->init(xref, &obj); + obj.free(); + } + + } + + return jsNameTree; +} + diff --git a/poppler/Catalog.h b/poppler/Catalog.h new file mode 100644 index 0000000..cdb1f13 --- /dev/null +++ b/poppler/Catalog.h @@ -0,0 +1,229 @@ +//======================================================================== +// +// Catalog.h +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2005, 2007, 2009-2011 Albert Astals Cid +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2005, 2006, 2008 Brad Hards +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2008, 2011 Pino Toscano +// Copyright (C) 2010 Hib Eris +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef CATALOG_H +#define CATALOG_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +#include + +class PDFDoc; +class XRef; +class Object; +class Page; +class PageAttrs; +struct Ref; +class LinkDest; +class PageLabelInfo; +class Form; +class OCGs; +class ViewerPreferences; +class FileSpec; + +//------------------------------------------------------------------------ +// NameTree +//------------------------------------------------------------------------ + +class NameTree { +public: + NameTree(); + ~NameTree(); + void init(XRef *xref, Object *tree); + GBool lookup(GooString *name, Object *obj); + int numEntries() { return length; }; + // iterator accessor, note it returns a shallow copy, do not free the object + Object getValue(int i); + GooString *getName(int i); + +private: + struct Entry { + Entry(Array *array, int index); + ~Entry(); + GooString name; + Object value; + void free(); + static int cmp(const void *key, const void *entry); + }; + + void parse(Object *tree); + void addEntry(Entry *entry); + + XRef *xref; + Object *root; + Entry **entries; + int size, length; // size is the number of entries in + // the array of Entry* + // length is the number of real Entry +}; + +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +class Catalog { +public: + + // Constructor. + Catalog(PDFDoc *docA); + + // Destructor. + ~Catalog(); + + // Is catalog valid? + GBool isOk() { return ok; } + + // Get number of pages. + int getNumPages(); + + // Get a page. + Page *getPage(int i); + + // Get the reference for a page object. + Ref *getPageRef(int i); + + // Return base URI, or NULL if none. + GooString *getBaseURI() { return baseURI; } + + // Return the contents of the metadata stream, or NULL if there is + // no metadata. + GooString *readMetadata(); + + // Return the structure tree root object. + Object *getStructTreeRoot(); + + // Find a page, given its object ID. Returns page number, or 0 if + // not found. + int findPage(int num, int gen); + + // Find a named destination. Returns the link destination, or + // NULL if is not a destination. + LinkDest *findDest(GooString *name); + + Object *getDests(); + + // Get the number of embedded files + int numEmbeddedFiles() { return getEmbeddedFileNameTree()->numEntries(); } + + // Get the i'th file embedded (at the Document level) in the document + FileSpec *embeddedFile(int i); + + // Get the number of javascript scripts + int numJS() { return getJSNameTree()->numEntries(); } + + // Get the i'th JavaScript script (at the Document level) in the document + GooString *getJS(int i); + + // Convert between page indices and page labels. + GBool labelToIndex(GooString *label, int *index); + GBool indexToLabel(int index, GooString *label); + + Object *getOutline(); + + Object *getAcroForm() { return &acroForm; } + + OCGs *getOptContentConfig() { return optContent; } + + Form* getForm(); + + ViewerPreferences *getViewerPreferences(); + + enum PageMode { + pageModeNone, + pageModeOutlines, + pageModeThumbs, + pageModeFullScreen, + pageModeOC, + pageModeAttach, + pageModeNull + }; + enum PageLayout { + pageLayoutNone, + pageLayoutSinglePage, + pageLayoutOneColumn, + pageLayoutTwoColumnLeft, + pageLayoutTwoColumnRight, + pageLayoutTwoPageLeft, + pageLayoutTwoPageRight, + pageLayoutNull + }; + + // Returns the page mode. + PageMode getPageMode(); + PageLayout getPageLayout(); + +private: + + // Get page label info. + PageLabelInfo *getPageLabelInfo(); + + PDFDoc *doc; + XRef *xref; // the xref table for this PDF file + Page **pages; // array of pages + Ref *pageRefs; // object ID for each page + int lastCachedPage; + std::vector *pagesList; + std::vector *pagesRefList; + std::vector *attrsList; + std::vector *kidsIdxList; + Form *form; + ViewerPreferences *viewerPrefs; + int numPages; // number of pages + int pagesSize; // size of pages array + Object dests; // named destination dictionary + Object names; // named names dictionary + NameTree *destNameTree; // named destination name-tree + NameTree *embeddedFileNameTree; // embedded file name-tree + NameTree *jsNameTree; // Java Script name-tree + GooString *baseURI; // base URI for URI-type links + Object metadata; // metadata stream + Object structTreeRoot; // structure tree root dictionary + Object outline; // outline dictionary + Object acroForm; // AcroForm dictionary + Object viewerPreferences; // ViewerPreference dictionary + OCGs *optContent; // Optional Content groups + GBool ok; // true if catalog is valid + PageLabelInfo *pageLabelInfo; // info about page labels + PageMode pageMode; // page mode + PageLayout pageLayout; // page layout + + GBool cachePageTree(int page); // Cache first pages. + Object *findDestInTree(Object *tree, GooString *name, Object *obj); + + Object *getNames(); + NameTree *getDestNameTree(); + NameTree *getEmbeddedFileNameTree(); + NameTree *getJSNameTree(); + +}; + +#endif diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc new file mode 100644 index 0000000..d0e6c7f --- /dev/null +++ b/poppler/CharCodeToUnicode.cc @@ -0,0 +1,716 @@ +//======================================================================== +// +// CharCodeToUnicode.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2008-2010, 2012 Albert Astals Cid +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2008 Michael Vrable +// Copyright (C) 2008 Vasile Gaburici +// Copyright (C) 2010 William Bader +// Copyright (C) 2010 Jakub Wilk +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "goo/GooLikely.h" +#include "goo/GooString.h" +#include "Error.h" +#include "GlobalParams.h" +#include "PSTokenizer.h" +#include "CharCodeToUnicode.h" + +//------------------------------------------------------------------------ + +struct CharCodeToUnicodeString { + CharCode c; + Unicode *u; + int len; +}; + +//------------------------------------------------------------------------ + +static int getCharFromString(void *data) { + char *p; + int c; + + p = *(char **)data; + if (*p) { + c = *p++; + *(char **)data = p; + } else { + c = EOF; + } + return c; +} + +static int getCharFromFile(void *data) { + return fgetc((FILE *)data); +} + +//------------------------------------------------------------------------ + +static int hexCharVals[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 2x + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 3x + -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 4x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 5x + -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 6x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 7x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 8x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 9x + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Ax + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Bx + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Cx + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Dx + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Ex + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // Fx +}; + +// Parse a -byte hex string into *. Returns false on +// error. +static GBool parseHex(char *s, int len, Guint *val) { + int i, x; + + *val = 0; + for (i = 0; i < len; ++i) { + x = hexCharVals[s[i] & 0xff]; + if (x < 0) { + return gFalse; + } + *val = (*val << 4) + x; + } + return gTrue; +} + +//------------------------------------------------------------------------ + +CharCodeToUnicode *CharCodeToUnicode::makeIdentityMapping() { + CharCodeToUnicode *ctu = new CharCodeToUnicode(); + ctu->isIdentity = gTrue; + ctu->mapLen = 1; + ctu->map = (Unicode *)gmallocn(ctu->mapLen, sizeof(Unicode)); + return ctu; +} + +CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GooString *fileName, + GooString *collection) { + FILE *f; + Unicode *mapA; + CharCode size, mapLenA; + char buf[64]; + Unicode u; + CharCodeToUnicode *ctu; + + if (!(f = openFile(fileName->getCString(), "r"))) { + error(errIO, -1, "Couldn't open cidToUnicode file '{0:t}'", + fileName); + return NULL; + } + + size = 32768; + mapA = (Unicode *)gmallocn(size, sizeof(Unicode)); + mapLenA = 0; + + while (getLine(buf, sizeof(buf), f)) { + if (mapLenA == size) { + size *= 2; + mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode)); + } + if (sscanf(buf, "%x", &u) == 1) { + mapA[mapLenA] = u; + } else { + error(errSyntaxWarning, -1, "Bad line ({0:d}) in cidToUnicode file '{1:t}'", + (int)(mapLenA + 1), fileName); + mapA[mapLenA] = 0; + } + ++mapLenA; + } + fclose(f); + + ctu = new CharCodeToUnicode(collection->copy(), mapA, mapLenA, gTrue, + NULL, 0, 0); + gfree(mapA); + return ctu; +} + +CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode( + GooString *fileName) { + FILE *f; + Unicode *mapA; + CharCodeToUnicodeString *sMapA; + CharCode size, oldSize, len, sMapSizeA, sMapLenA; + char buf[256]; + char *tok; + Unicode u0; + int uBufSize = 8; + Unicode *uBuf = (Unicode *)gmallocn(uBufSize, sizeof(Unicode)); + CharCodeToUnicode *ctu; + int line, n, i; + char *tokptr; + + if (!(f = openFile(fileName->getCString(), "r"))) { + gfree(uBuf); + error(errIO, -1, "Couldn't open unicodeToUnicode file '{0:t}'", + fileName); + return NULL; + } + + size = 4096; + mapA = (Unicode *)gmallocn(size, sizeof(Unicode)); + memset(mapA, 0, size * sizeof(Unicode)); + len = 0; + sMapA = NULL; + sMapSizeA = sMapLenA = 0; + + line = 0; + while (getLine(buf, sizeof(buf), f)) { + ++line; + if (!(tok = strtok_r(buf, " \t\r\n", &tokptr)) || + !parseHex(tok, strlen(tok), &u0)) { + error(errSyntaxWarning, -1, "Bad line ({0:d}) in unicodeToUnicode file '{1:t}'", + line, fileName); + continue; + } + n = 0; + while ((tok = strtok_r(NULL, " \t\r\n", &tokptr))) { + if (n >= uBufSize) + { + uBufSize += 8; + uBuf = (Unicode *)greallocn(uBuf, uBufSize, sizeof(Unicode)); + } + if (!parseHex(tok, strlen(tok), &uBuf[n])) { + error(errSyntaxWarning, -1, "Bad line ({0:d}) in unicodeToUnicode file '{1:t}'", + line, fileName); + break; + } + ++n; + } + if (n < 1) { + error(errSyntaxWarning, -1, "Bad line ({0:d}) in unicodeToUnicode file '{1:t}'", + line, fileName); + continue; + } + if (u0 >= size) { + oldSize = size; + while (u0 >= size) { + size *= 2; + } + mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode)); + memset(mapA + oldSize, 0, (size - oldSize) * sizeof(Unicode)); + } + if (n == 1) { + mapA[u0] = uBuf[0]; + } else { + mapA[u0] = 0; + if (sMapLenA == sMapSizeA) { + sMapSizeA += 16; + sMapA = (CharCodeToUnicodeString *) + greallocn(sMapA, sMapSizeA, sizeof(CharCodeToUnicodeString)); + } + sMapA[sMapLenA].c = u0; + sMapA[sMapLenA].u = (Unicode*)gmallocn(n, sizeof(Unicode)); + for (i = 0; i < n; ++i) { + sMapA[sMapLenA].u[i] = uBuf[i]; + } + sMapA[sMapLenA].len = n; + ++sMapLenA; + } + if (u0 >= len) { + len = u0 + 1; + } + } + fclose(f); + + ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue, + sMapA, sMapLenA, sMapSizeA); + gfree(mapA); + gfree(uBuf); + return ctu; +} + +CharCodeToUnicode *CharCodeToUnicode::make8BitToUnicode(Unicode *toUnicode) { + return new CharCodeToUnicode(NULL, toUnicode, 256, gTrue, NULL, 0, 0); +} + +CharCodeToUnicode *CharCodeToUnicode::parseCMap(GooString *buf, int nBits) { + CharCodeToUnicode *ctu; + char *p; + + ctu = new CharCodeToUnicode(NULL); + p = buf->getCString(); + ctu->parseCMap1(&getCharFromString, &p, nBits); + return ctu; +} + +CharCodeToUnicode *CharCodeToUnicode::parseCMapFromFile(GooString *fileName, + int nBits) { + CharCodeToUnicode *ctu; + FILE *f; + + ctu = new CharCodeToUnicode(NULL); + if ((f = globalParams->findToUnicodeFile(fileName))) { + ctu->parseCMap1(&getCharFromFile, f, nBits); + fclose(f); + } else { + error(errSyntaxError, -1, "Couldn't find ToUnicode CMap file for '{0:t}'", + fileName); + } + return ctu; +} + +void CharCodeToUnicode::mergeCMap(GooString *buf, int nBits) { + char *p; + + p = buf->getCString(); + parseCMap1(&getCharFromString, &p, nBits); +} + +void CharCodeToUnicode::parseCMap1(int (*getCharFunc)(void *), void *data, + int nBits) { + PSTokenizer *pst; + char tok1[256], tok2[256], tok3[256]; + int n1, n2, n3; + CharCode i; + CharCode maxCode, code1, code2; + GooString *name; + FILE *f; + + maxCode = (nBits == 8) ? 0xff : (nBits == 16) ? 0xffff : 0xffffffff; + pst = new PSTokenizer(getCharFunc, data); + pst->getToken(tok1, sizeof(tok1), &n1); + while (pst->getToken(tok2, sizeof(tok2), &n2)) { + if (!strcmp(tok2, "usecmap")) { + if (tok1[0] == '/') { + name = new GooString(tok1 + 1); + if ((f = globalParams->findToUnicodeFile(name))) { + parseCMap1(&getCharFromFile, f, nBits); + fclose(f); + } else { + error(errSyntaxError, -1, "Couldn't find ToUnicode CMap file for '{0:t}'", + name); + } + delete name; + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "beginbfchar")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endbfchar")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endbfchar")) { + error(errSyntaxWarning, -1, "Illegal entry in bfchar block in ToUnicode CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + tok2[0] == '<' && tok2[n2 - 1] == '>')) { + error(errSyntaxWarning, -1, "Illegal entry in bfchar block in ToUnicode CMap"); + continue; + } + tok1[n1 - 1] = tok2[n2 - 1] = '\0'; + if (!parseHex(tok1 + 1, n1 - 2, &code1)) { + error(errSyntaxWarning, -1, "Illegal entry in bfchar block in ToUnicode CMap"); + continue; + } + if (code1 > maxCode) { + error(errSyntaxWarning, -1, + "Invalid entry in bfchar block in ToUnicode CMap"); + } + addMapping(code1, tok2 + 1, n2 - 2, 0); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "beginbfrange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endbfrange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endbfrange") || + !pst->getToken(tok3, sizeof(tok3), &n3) || + !strcmp(tok3, "endbfrange")) { + error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + tok2[0] == '<' && tok2[n2 - 1] == '>')) { + error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap"); + continue; + } + tok1[n1 - 1] = tok2[n2 - 1] = '\0'; + if (!parseHex(tok1 + 1, n1 - 2, &code1) || + !parseHex(tok2 + 1, n2 - 2, &code2)) { + error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap"); + continue; + } + if (code1 > maxCode || code2 > maxCode) { + error(errSyntaxWarning, -1, + "Invalid entry in bfrange block in ToUnicode CMap"); + if (code1 > maxCode) { + code1 = maxCode; + } + if (code2 > maxCode) { + code2 = maxCode; + } + } + if (!strcmp(tok3, "[")) { + i = 0; + while (pst->getToken(tok1, sizeof(tok1), &n1) && + code1 + i <= code2) { + if (!strcmp(tok1, "]")) { + break; + } + if (tok1[0] == '<' && tok1[n1 - 1] == '>') { + tok1[n1 - 1] = '\0'; + addMapping(code1 + i, tok1 + 1, n1 - 2, 0); + } else { + error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap"); + } + ++i; + } + } else if (tok3[0] == '<' && tok3[n3 - 1] == '>') { + tok3[n3 - 1] = '\0'; + for (i = 0; code1 <= code2; ++code1, ++i) { + addMapping(code1, tok3 + 1, n3 - 2, i); + } + + } else { + error(errSyntaxWarning, -1, "Illegal entry in bfrange block in ToUnicode CMap"); + } + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else { + strcpy(tok1, tok2); + } + } + delete pst; +} + +void CharCodeToUnicode::addMapping(CharCode code, char *uStr, int n, + int offset) { + CharCode oldLen, i; + Unicode u; + int j; + + if (code > 0xffffff) { + // This is an arbitrary limit to avoid integer overflow issues. + // (I've seen CMaps with mappings for .) + return; + } + if (code >= mapLen) { + oldLen = mapLen; + mapLen = mapLen ? 2 * mapLen : 256; + if (code >= mapLen) { + mapLen = (code + 256) & ~255; + } + if (unlikely(code >= mapLen)) { + error(errSyntaxWarning, -1, "Illegal code value in CharCodeToUnicode::addMapping"); + return; + } else { + map = (Unicode *)greallocn(map, mapLen, sizeof(Unicode)); + for (i = oldLen; i < mapLen; ++i) { + map[i] = 0; + } + } + } + if (n <= 4) { + if (!parseHex(uStr, n, &u)) { + error(errSyntaxWarning, -1, "Illegal entry in ToUnicode CMap"); + return; + } + map[code] = u + offset; + } else { + if (sMapLen >= sMapSize) { + sMapSize = sMapSize + 16; + sMap = (CharCodeToUnicodeString *) + greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); + } + map[code] = 0; + sMap[sMapLen].c = code; + sMap[sMapLen].len = n / 4; + sMap[sMapLen].u = (Unicode*)gmallocn(sMap[sMapLen].len, sizeof(Unicode)); + for (j = 0; j < sMap[sMapLen].len; ++j) { + if (!parseHex(uStr + j*4, 4, &sMap[sMapLen].u[j])) { + error(errSyntaxWarning, -1, "Illegal entry in ToUnicode CMap"); + return; + } + } + sMap[sMapLen].u[sMap[sMapLen].len - 1] += offset; + ++sMapLen; + } +} + +CharCodeToUnicode::CharCodeToUnicode() { + tag = NULL; + map = NULL; + mapLen = 0; + sMap = NULL; + sMapLen = sMapSize = 0; + refCnt = 1; + isIdentity = gFalse; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CharCodeToUnicode::CharCodeToUnicode(GooString *tagA) { + CharCode i; + + tag = tagA; + mapLen = 256; + map = (Unicode *)gmallocn(mapLen, sizeof(Unicode)); + for (i = 0; i < mapLen; ++i) { + map[i] = 0; + } + sMap = NULL; + sMapLen = sMapSize = 0; + refCnt = 1; + isIdentity = gFalse; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CharCodeToUnicode::CharCodeToUnicode(GooString *tagA, Unicode *mapA, + CharCode mapLenA, GBool copyMap, + CharCodeToUnicodeString *sMapA, + int sMapLenA, int sMapSizeA) { + tag = tagA; + mapLen = mapLenA; + if (copyMap) { + map = (Unicode *)gmallocn(mapLen, sizeof(Unicode)); + memcpy(map, mapA, mapLen * sizeof(Unicode)); + } else { + map = mapA; + } + sMap = sMapA; + sMapLen = sMapLenA; + sMapSize = sMapSizeA; + refCnt = 1; + isIdentity = gFalse; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CharCodeToUnicode::~CharCodeToUnicode() { + if (tag) { + delete tag; + } + gfree(map); + if (sMap) { + for (int i = 0; i < sMapLen; ++i) gfree(sMap[i].u); + gfree(sMap); + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +void CharCodeToUnicode::incRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + ++refCnt; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +void CharCodeToUnicode::decRefCnt() { + GBool done; + +#if MULTITHREADED + gLockMutex(&mutex); +#endif + done = --refCnt == 0; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + if (done) { + delete this; + } +} + +GBool CharCodeToUnicode::match(GooString *tagA) { + return tag && !tag->cmp(tagA); +} + +void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) { + int i, j; + + if (!map || isIdentity) { + return; + } + if (len == 1) { + map[c] = u[0]; + } else { + for (i = 0; i < sMapLen; ++i) { + if (sMap[i].c == c) { + gfree(sMap[i].u); + break; + } + } + if (i == sMapLen) { + if (sMapLen == sMapSize) { + sMapSize += 8; + sMap = (CharCodeToUnicodeString *) + greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); + } + ++sMapLen; + } + map[c] = 0; + sMap[i].c = c; + sMap[i].len = len; + sMap[i].u = (Unicode*)gmallocn(len, sizeof(Unicode)); + for (j = 0; j < len; ++j) { + sMap[i].u[j] = u[j]; + } + } +} + +int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode **u) { + int i; + + if (isIdentity) { + map[0] = (Unicode)c; + *u = map; + return 1; + } + if (c >= mapLen) { + return 0; + } + if (map[c]) { + *u = &map[c]; + return 1; + } + for (i = sMapLen - 1; i >= 0; --i) { // in reverse so CMap takes precedence + if (sMap[i].c == c) { + *u = sMap[i].u; + return sMap[i].len; + } + } + return 0; +} + +int CharCodeToUnicode::mapToCharCode(Unicode* u, CharCode *c, int usize) { + //look for charcode in map + if (usize == 1) { + if (isIdentity) { + *c = (CharCode) *u; + return 1; + } + for (CharCode i=0; idecRefCnt(); + } + } + gfree(cache); +} + +CharCodeToUnicode *CharCodeToUnicodeCache::getCharCodeToUnicode(GooString *tag) { + CharCodeToUnicode *ctu; + int i, j; + + if (cache[0] && cache[0]->match(tag)) { + cache[0]->incRefCnt(); + return cache[0]; + } + for (i = 1; i < size; ++i) { + if (cache[i] && cache[i]->match(tag)) { + ctu = cache[i]; + for (j = i; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = ctu; + ctu->incRefCnt(); + return ctu; + } + } + return NULL; +} + +void CharCodeToUnicodeCache::add(CharCodeToUnicode *ctu) { + int i; + + if (cache[size - 1]) { + cache[size - 1]->decRefCnt(); + } + for (i = size - 1; i >= 1; --i) { + cache[i] = cache[i - 1]; + } + cache[0] = ctu; + ctu->incRefCnt(); +} diff --git a/poppler/CharCodeToUnicode.h b/poppler/CharCodeToUnicode.h new file mode 100644 index 0000000..1672105 --- /dev/null +++ b/poppler/CharCodeToUnicode.h @@ -0,0 +1,146 @@ +//======================================================================== +// +// CharCodeToUnicode.h +// +// Mapping from character codes to Unicode. +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2008, 2011, 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef CHARCODETOUNICODE_H +#define CHARCODETOUNICODE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "CharTypes.h" +#include "goo/gtypes.h" + +#if MULTITHREADED +#include "goo/GooMutex.h" +#endif + +struct CharCodeToUnicodeString; +class GooString; + +//------------------------------------------------------------------------ + +class CharCodeToUnicode { +friend class UnicodeToCharCode; +public: + + // Create an identity mapping (Unicode = CharCode). + static CharCodeToUnicode *makeIdentityMapping(); + + // Read the CID-to-Unicode mapping for from the file + // specified by . Sets the initial reference count to 1. + // Returns NULL on failure. + static CharCodeToUnicode *parseCIDToUnicode(GooString *fileName, + GooString *collection); + + // Create a Unicode-to-Unicode mapping from the file specified by + // . Sets the initial reference count to 1. Returns NULL + // on failure. + static CharCodeToUnicode *parseUnicodeToUnicode(GooString *fileName); + + // Create the CharCode-to-Unicode mapping for an 8-bit font. + // is an array of 256 Unicode indexes. Sets the initial + // reference count to 1. + static CharCodeToUnicode *make8BitToUnicode(Unicode *toUnicode); + + // Parse a ToUnicode CMap for an 8- or 16-bit font. + static CharCodeToUnicode *parseCMap(GooString *buf, int nBits); + static CharCodeToUnicode *parseCMapFromFile(GooString *fileName, int nBits); + + // Parse a ToUnicode CMap for an 8- or 16-bit font, merging it into + // . + void mergeCMap(GooString *buf, int nBits); + + ~CharCodeToUnicode(); + + void incRefCnt(); + void decRefCnt(); + + // Return true if this mapping matches the specified . + GBool match(GooString *tagA); + + // Set the mapping for . + void setMapping(CharCode c, Unicode *u, int len); + + // Map a CharCode to Unicode. Returns a pointer in u to internal storage + // so never store the pointers it returns, just the data, otherwise + // your pointed values might get changed by future calls + int mapToUnicode(CharCode c, Unicode **u); + + // Map a Unicode to CharCode. + int mapToCharCode(Unicode* u, CharCode *c, int usize); + + // Return the mapping's length, i.e., one more than the max char + // code supported by the mapping. + CharCode getLength() { return mapLen; } + +private: + + void parseCMap1(int (*getCharFunc)(void *), void *data, int nBits); + void addMapping(CharCode code, char *uStr, int n, int offset); + CharCodeToUnicode(); + CharCodeToUnicode(GooString *tagA); + CharCodeToUnicode(GooString *tagA, Unicode *mapA, + CharCode mapLenA, GBool copyMap, + CharCodeToUnicodeString *sMapA, + int sMapLenA, int sMapSizeA); + + GooString *tag; + Unicode *map; + CharCode mapLen; + CharCodeToUnicodeString *sMap; + int sMapLen, sMapSize; + int refCnt; + GBool isIdentity; +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ + +class CharCodeToUnicodeCache { +public: + + CharCodeToUnicodeCache(int sizeA); + ~CharCodeToUnicodeCache(); + + // Get the CharCodeToUnicode object for . Increments its + // reference count; there will be one reference for the cache plus + // one for the caller of this function. Returns NULL on failure. + CharCodeToUnicode *getCharCodeToUnicode(GooString *tag); + + // Insert into the cache, in the most-recently-used position. + void add(CharCodeToUnicode *ctu); + +private: + + CharCodeToUnicode **cache; + int size; +}; + +#endif diff --git a/poppler/CharTypes.h b/poppler/CharTypes.h new file mode 100644 index 0000000..d0df630 --- /dev/null +++ b/poppler/CharTypes.h @@ -0,0 +1,24 @@ +//======================================================================== +// +// CharTypes.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef CHARTYPES_H +#define CHARTYPES_H + +// Unicode character. +typedef unsigned int Unicode; + +// Character ID for CID character collections. +typedef unsigned int CID; + +// This is large enough to hold any of the following: +// - 8-bit char code +// - 16-bit CID +// - Unicode +typedef unsigned int CharCode; + +#endif diff --git a/poppler/CompactFontTables.h b/poppler/CompactFontTables.h new file mode 100644 index 0000000..cfbfdaf --- /dev/null +++ b/poppler/CompactFontTables.h @@ -0,0 +1,480 @@ +//======================================================================== +// +// CompactFontTables.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2011 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef COMPACTFONTINFO_H +#define COMPACTFONTINFO_H + +#include "goo/gtypes.h" + +static char *type1CStdStrings[391] = { + ".notdef", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "endash", + "dagger", + "daggerdbl", + "periodcentered", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "questiondown", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "AE", + "ordfeminine", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "ae", + "dotlessi", + "lslash", + "oslash", + "oe", + "germandbls", + "onesuperior", + "logicalnot", + "mu", + "trademark", + "Eth", + "onehalf", + "plusminus", + "Thorn", + "onequarter", + "divide", + "brokenbar", + "degree", + "thorn", + "threequarters", + "twosuperior", + "registered", + "minus", + "eth", + "multiply", + "threesuperior", + "copyright", + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "ccedilla", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "otilde", + "scaron", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron", + "exclamsmall", + "Hungarumlautsmall", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "isuperior", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "rsuperior", + "ssuperior", + "tsuperior", + "ff", + "ffi", + "ffl", + "parenleftinferior", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "Dotaccentsmall", + "Macronsmall", + "figuredash", + "hypheninferior", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "zerosuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold" +}; + +static Gushort type1CISOAdobeCharset[229] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228 +}; + +static const Gushort type1CExpertCharset[166] = { + 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 +}; + +static Gushort type1CExpertSubsetCharset[87] = { + 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, + 15, 99, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, 300, 301, + 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, + 323, 324, 325, 326, 150, 164, 169, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 +}; + +#endif diff --git a/poppler/CurlCachedFile.cc b/poppler/CurlCachedFile.cc new file mode 100644 index 0000000..af4c2b6 --- /dev/null +++ b/poppler/CurlCachedFile.cc @@ -0,0 +1,99 @@ +//======================================================================== +// +// CurlCachedFile.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2009 Stefan Thomas +// Copyright 2010, 2011 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#include + +#include "CurlCachedFile.h" + +#include "goo/GooString.h" + +//------------------------------------------------------------------------ + +CurlCachedFileLoader::CurlCachedFileLoader() +{ + url = NULL; + cachedFile = NULL; + curl = NULL; +} + +CurlCachedFileLoader::~CurlCachedFileLoader() { + curl_easy_cleanup(curl); +} + +static size_t +noop_cb(char *ptr, size_t size, size_t nmemb, void *ptr2) +{ + return size*nmemb; +} + +size_t +CurlCachedFileLoader::init(GooString *urlA, CachedFile *cachedFileA) +{ + double contentLength = -1; + long code = 0; + size_t size; + + url = urlA; + cachedFile = cachedFileA; + curl = curl_easy_init(); + + curl_easy_setopt(curl, CURLOPT_URL, url->getCString()); + curl_easy_setopt(curl, CURLOPT_HEADER, 1); + curl_easy_setopt(curl, CURLOPT_NOBODY, 1); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &noop_cb); + curl_easy_perform(curl); + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code) { + curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &contentLength); + size = contentLength; + } else { + error(errInternal, -1, "Failed to get size of '{0:t}'.", url); + size = -1; + } + curl_easy_reset(curl); + + return size; +} + +static +size_t load_cb(const char *ptr, size_t size, size_t nmemb, void *data) +{ + CachedFileWriter *writer = (CachedFileWriter *) data; + return (writer->write) (ptr, size*nmemb); +} + +int CurlCachedFileLoader::load(const std::vector &ranges, CachedFileWriter *writer) +{ + CURLcode r = CURLE_OK; + size_t fromByte, toByte; + for (size_t i = 0; i < ranges.size(); i++) { + + fromByte = ranges[i].offset; + toByte = fromByte + ranges[i].length - 1; + GooString *range = GooString::format("{0:ud}-{1:ud}", fromByte, toByte); + + curl_easy_setopt(curl, CURLOPT_URL, url->getCString()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, load_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, writer); + curl_easy_setopt(curl, CURLOPT_RANGE, range->getCString()); + r = curl_easy_perform(curl); + curl_easy_reset(curl); + + delete range; + + if (r != CURLE_OK) break; + } + return r; +} + +//------------------------------------------------------------------------ + diff --git a/poppler/CurlCachedFile.h b/poppler/CurlCachedFile.h new file mode 100644 index 0000000..49882ab --- /dev/null +++ b/poppler/CurlCachedFile.h @@ -0,0 +1,40 @@ +//======================================================================== +// +// CurlCachedFile.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef CURLCACHELOADER_H +#define CURLCACHELOADER_H + +#include "poppler-config.h" +#include "CachedFile.h" + +#include + +//------------------------------------------------------------------------ + +class CurlCachedFileLoader : public CachedFileLoader { + +public: + + CurlCachedFileLoader(); + ~CurlCachedFileLoader(); + size_t init(GooString *url, CachedFile* cachedFile); + int load(const std::vector &ranges, CachedFileWriter *writer); + +private: + + GooString *url; + CachedFile *cachedFile; + CURL *curl; + +}; + +#endif + diff --git a/poppler/CurlPDFDocBuilder.cc b/poppler/CurlPDFDocBuilder.cc new file mode 100644 index 0000000..5b02b14 --- /dev/null +++ b/poppler/CurlPDFDocBuilder.cc @@ -0,0 +1,47 @@ +//======================================================================== +// +// CurlPDFDocBuilder.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#include + +#include "CurlPDFDocBuilder.h" + +#include "CachedFile.h" +#include "CurlCachedFile.h" + +//------------------------------------------------------------------------ +// CurlPDFDocBuilder +//------------------------------------------------------------------------ + +PDFDoc * +CurlPDFDocBuilder::buildPDFDoc(const GooString &uri, + GooString *ownerPassword, GooString *userPassword, void *guiDataA) +{ + Object obj; + + CachedFile *cachedFile = new CachedFile( + new CurlCachedFileLoader(), uri.copy()); + + obj.initNull(); + BaseStream *str = new CachedFileStream( + cachedFile, 0, gFalse, cachedFile->getLength(), &obj); + + return new PDFDoc(str, ownerPassword, userPassword, guiDataA); +} + +GBool CurlPDFDocBuilder::supports(const GooString &uri) +{ + if (uri.cmpN("http://", 7) == 0 || uri.cmpN("https://", 8) == 0) { + return gTrue; + } else { + return gFalse; + } +} + diff --git a/poppler/CurlPDFDocBuilder.h b/poppler/CurlPDFDocBuilder.h new file mode 100644 index 0000000..fb34862 --- /dev/null +++ b/poppler/CurlPDFDocBuilder.h @@ -0,0 +1,33 @@ +//======================================================================== +// +// CurlPDFDocBuilder.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef CURLPDFDOCBUILDER_H +#define CURLPDFDOCBUILDER_H + +#include "PDFDocBuilder.h" + +//------------------------------------------------------------------------ +// CurlPDFDocBuilder +// +// The CurlPDFDocBuilder implements a PDFDocBuilder for 'http(s)://'. +//------------------------------------------------------------------------ + +class CurlPDFDocBuilder : public PDFDocBuilder { + +public: + + PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); + GBool supports(const GooString &uri); + +}; + +#endif /* CURLPDFDOCBUILDER_H */ diff --git a/poppler/DCTStream.cc b/poppler/DCTStream.cc new file mode 100644 index 0000000..6302c8b --- /dev/null +++ b/poppler/DCTStream.cc @@ -0,0 +1,247 @@ +//======================================================================== +// +// DCTStream.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2005 Jeff Muizelaar +// Copyright 2005-2010, 2012 Albert Astals Cid +// Copyright 2009 Ryszard Trojnacki +// Copyright 2010 Carlos Garcia Campos +// Copyright 2011 Daiki Ueno +// Copyright 2011 Tomas Hoger +// Copyright 2012 Thomas Freitag +// +//======================================================================== + +#include "DCTStream.h" + +static void str_init_source(j_decompress_ptr cinfo) +{ +} + +static boolean str_fill_input_buffer(j_decompress_ptr cinfo) +{ + int c; + struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src; + if (src->index == 0) { + c = 0xFF; + src->index++; + } + else if (src->index == 1) { + c = 0xD8; + src->index++; + } + else c = src->str->getChar(); + if (c != EOF) + { + src->buffer = c; + src->pub.next_input_byte = &src->buffer; + src->pub.bytes_in_buffer = 1; + return TRUE; + } + else return FALSE; +} + +static void str_skip_input_data(j_decompress_ptr cinfo, long num_bytes) +{ + struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src; + if (num_bytes > 0) { + while (num_bytes > (long) src->pub.bytes_in_buffer) { + num_bytes -= (long) src->pub.bytes_in_buffer; + str_fill_input_buffer(cinfo); + } + src->pub.next_input_byte += (size_t) num_bytes; + src->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} + +static void str_term_source(j_decompress_ptr cinfo) +{ +} + +DCTStream::DCTStream(Stream *strA, int colorXformA) : + FilterStream(strA) { + colorXform = colorXformA; + init(); +} + +DCTStream::~DCTStream() { + jpeg_destroy_decompress(&cinfo); + delete str; +} + +static void exitErrorHandler(jpeg_common_struct *error) { + j_decompress_ptr cinfo = (j_decompress_ptr)error; + str_error_mgr * err = (struct str_error_mgr *)cinfo->err; + longjmp(err->setjmp_buffer, 1); +} + +void DCTStream::init() +{ + jpeg_std_error(&err.pub); + err.pub.error_exit = &exitErrorHandler; + src.pub.init_source = str_init_source; + src.pub.fill_input_buffer = str_fill_input_buffer; + src.pub.skip_input_data = str_skip_input_data; + src.pub.resync_to_restart = jpeg_resync_to_restart; + src.pub.term_source = str_term_source; + src.pub.bytes_in_buffer = 0; + src.pub.next_input_byte = NULL; + src.str = str; + src.index = 0; + current = NULL; + limit = NULL; + + cinfo.err = &err.pub; + if (!setjmp(err.setjmp_buffer)) { + jpeg_create_decompress(&cinfo); + cinfo.src = (jpeg_source_mgr *)&src; + } + row_buffer = NULL; +} + +void DCTStream::reset() { + int row_stride; + + str->reset(); + + if (row_buffer) + { + jpeg_destroy_decompress(&cinfo); + init(); + } + + // JPEG data has to start with 0xFF 0xD8 + // but some pdf like the one on + // https://bugs.freedesktop.org/show_bug.cgi?id=3299 + // does have some garbage before that this seeks for + // the start marker... + bool startFound = false; + int c = 0, c2 = 0; + while (!startFound) + { + if (!c) + { + c = str->getChar(); + if (c == -1) + { + error(errSyntaxError, -1, "Could not find start of jpeg data"); + return; + } + if (c != 0xFF) c = 0; + } + else + { + c2 = str->getChar(); + if (c2 != 0xD8) + { + c = 0; + c2 = 0; + } + else startFound = true; + } + } + + if (!setjmp(err.setjmp_buffer) && jpeg_read_header(&cinfo, TRUE) != JPEG_SUSPENDED) + { + // figure out color transform + if (colorXform == -1 && !cinfo.saw_Adobe_marker) { + if (cinfo.num_components == 3) { + if (cinfo.saw_JFIF_marker) { + colorXform = 1; + } else if (cinfo.cur_comp_info[0]->component_id == 82 && + cinfo.cur_comp_info[1]->component_id == 71 && + cinfo.cur_comp_info[2]->component_id == 66) { // ASCII "RGB" + colorXform = 0; + } else { + colorXform = 1; + } + } else { + colorXform = 0; + } + } else if (cinfo.saw_Adobe_marker) { + colorXform = cinfo.Adobe_transform; + } + + switch (cinfo.num_components) { + case 3: + cinfo.jpeg_color_space = colorXform ? JCS_YCbCr : JCS_RGB; + break; + case 4: + cinfo.jpeg_color_space = colorXform ? JCS_YCCK : JCS_CMYK; + break; + } + + jpeg_start_decompress(&cinfo); + + row_stride = cinfo.output_width * cinfo.output_components; + row_buffer = cinfo.mem->alloc_sarray((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + } +} + +// we can not go with inline since gcc +// refuses to inline because of setjmp +#define DO_GET_CHAR \ + if (current == limit) { \ + if (cinfo.output_scanline < cinfo.output_height) \ + { \ + if (!setjmp(err.setjmp_buffer)) \ + { \ + if (!jpeg_read_scanlines(&cinfo, row_buffer, 1)) c = EOF; \ + else { \ + current = &row_buffer[0][0]; \ + limit = &row_buffer[0][(cinfo.output_width - 1) * cinfo.output_components] + cinfo.output_components; \ + c = *current; \ + ++current; \ + } \ + } \ + else c = EOF; \ + } \ + else c = EOF; \ + } else { \ + c = *current; \ + ++current; \ + } \ + +int DCTStream::getChar() { + int c; + + DO_GET_CHAR + + return c; +} + +int DCTStream::getChars(int nChars, Guchar *buffer) { + int c; + for (int i = 0; i < nChars; ++i) { + DO_GET_CHAR + if (likely(c != EOF)) buffer[i] = c; + else return i; + } + return nChars; +} + +int DCTStream::lookChar() { + if (unlikely(current == NULL)) { + return EOF; + } + return *current; +} + +GooString *DCTStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< >> /DCTDecode filter\n"); + return s; +} + +GBool DCTStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} diff --git a/poppler/DCTStream.h b/poppler/DCTStream.h new file mode 100644 index 0000000..55bd985 --- /dev/null +++ b/poppler/DCTStream.h @@ -0,0 +1,87 @@ +//======================================================================== +// +// DCTStream.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2005 Jeff Muizelaar +// Copyright 2005 Martin Kretzschmar +// Copyright 2005-2007, 2009-2011 Albert Astals Cid +// Copyright 2010 Carlos Garcia Campos +// Copyright 2011 Daiki Ueno +// +//======================================================================== + +#ifndef DCTSTREAM_H +#define DCTSTREAM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "poppler-config.h" +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "Error.h" +#include "Object.h" +#include "Decrypt.h" +#include "Stream.h" + +extern "C" { +#include +} + +struct str_src_mgr { + struct jpeg_source_mgr pub; + JOCTET buffer; + Stream *str; + int index; +}; + +struct str_error_mgr { + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +class DCTStream: public FilterStream { +public: + + DCTStream(Stream *strA, int colorXformA); + virtual ~DCTStream(); + virtual StreamKind getKind() { return strDCT; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + void init(); + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + int colorXform; + JSAMPLE *current; + JSAMPLE *limit; + struct jpeg_decompress_struct cinfo; + struct str_error_mgr err; + struct str_src_mgr src; + JSAMPARRAY row_buffer; +}; + +#endif diff --git a/poppler/DateInfo.cc b/poppler/DateInfo.cc new file mode 100644 index 0000000..563204a --- /dev/null +++ b/poppler/DateInfo.cc @@ -0,0 +1,118 @@ +//======================================================================== +// +// DateInfo.cc +// +// Copyright (C) 2008 Albert Astals Cid +// Copyright (C) 2009 Carlos Garcia Campos +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +//======================================================================== +// +// Based on code from pdfinfo.cc +// +// Copyright 1998-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#include "DateInfo.h" + +#include +#include + +/* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */ +GBool parseDateString(const char *dateString, int *year, int *month, int *day, int *hour, int *minute, int *second, char *tz, int *tzHour, int *tzMinute) +{ + if ( dateString == NULL ) return gFalse; + if ( strlen(dateString) < 2 ) return gFalse; + + if ( dateString[0] == 'D' && dateString[1] == ':' ) + dateString += 2; + + *month = 1; + *day = 1; + *hour = 0; + *minute = 0; + *second = 0; + *tz = 0x00; + *tzHour = 0; + *tzMinute = 0; + + if ( sscanf( dateString, + "%4d%2d%2d%2d%2d%2d%c%2d%*c%2d", + year, month, day, hour, minute, second, + tz, tzHour, tzMinute ) > 0 ) { + /* Workaround for y2k bug in Distiller 3 stolen from gpdf, hoping that it won't + * be used after y2.2k */ + if ( *year < 1930 && strlen (dateString) > 14) + { + int century, years_since_1900; + if ( sscanf( dateString, + "%2d%3d%2d%2d%2d%2d%2d", + ¢ury, &years_since_1900, month, day, hour, minute, second) == 7 ) + { + *year = century * 100 + years_since_1900; + } + else + { + return gFalse; + } + } + + if (*year <= 0) return gFalse; + + return gTrue; + } + + return gFalse; +} + + +GooString *timeToDateString(time_t *timet) { + GooString *dateString; + char s[5]; + struct tm *gt; + size_t len; + time_t timep = timet ? *timet : time(NULL); + +#ifdef HAVE_GMTIME_R + struct tm t; + gt = gmtime_r (&timep, &t); +#else + gt = gmtime (&timep); +#endif + + dateString = new GooString ("D:"); + + /* Year YYYY */ + len = strftime (s, sizeof(s), "%Y", gt); + dateString->append (s, len); + + /* Month MM */ + len = strftime (s, sizeof(s), "%m", gt); + dateString->append (s, len); + + /* Day DD */ + len = strftime (s, sizeof(s), "%d", gt); + dateString->append (s, len); + + /* Hour HH */ + len = strftime (s, sizeof(s), "%H", gt); + dateString->append (s, len); + + /* Minute mm */ + len = strftime (s, sizeof(s), "%M", gt); + dateString->append (s, len); + + /* Second SS */ + len = strftime (s, sizeof(s), "%S", gt); + dateString->append (s, len); + + return dateString; +} + diff --git a/poppler/DateInfo.h b/poppler/DateInfo.h new file mode 100644 index 0000000..116350f --- /dev/null +++ b/poppler/DateInfo.h @@ -0,0 +1,35 @@ +//======================================================================== +// +// DateInfo.h +// +// Copyright (C) 2008 Albert Astals Cid +// Copyright (C) 2009 Carlos Garcia Campos +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +//======================================================================== +// +// Based on code from pdfinfo.cc +// +// Copyright 1998-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef DATE_INFO_H +#define DATE_INFO_H + +#include "goo/gtypes.h" +#include "goo/GooString.h" +#include + +GBool parseDateString(const char *string, int *year, int *month, int *day, int *hour, int *minute, int *second, char *tz, int *tzHour, int *tzMinute); + +/* Converts the time_t into a PDF Date format string. + * If timet is NULL, current time is used. + */ +GooString *timeToDateString(time_t *timet); + +#endif diff --git a/poppler/Decrypt.cc b/poppler/Decrypt.cc new file mode 100644 index 0000000..24af996 --- /dev/null +++ b/poppler/Decrypt.cc @@ -0,0 +1,1185 @@ +//======================================================================== +// +// Decrypt.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Julien Rebetez +// Copyright (C) 2008, 2010 Albert Astals Cid +// Copyright (C) 2009 Matthias Franz +// Copyright (C) 2009 David Benjamin +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "goo/gmem.h" +#include "Decrypt.h" +#include "Error.h" + +static void aesKeyExpansion(DecryptAESState *s, + Guchar *objKey, int objKeyLen); +static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last); +static void aes256KeyExpansion(DecryptAES256State *s, + Guchar *objKey, int objKeyLen); +static void aes256DecryptBlock(DecryptAES256State *s, Guchar *in, GBool last); +static void sha256(Guchar *msg, int msgLen, Guchar *hash); + +static const Guchar passwordPad[32] = { + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, + 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, + 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, + 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a +}; + +//------------------------------------------------------------------------ +// Decrypt +//------------------------------------------------------------------------ + +GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength, + GooString *ownerKey, GooString *userKey, + GooString *ownerEnc, GooString *userEnc, + int permissions, GooString *fileID, + GooString *ownerPassword, GooString *userPassword, + Guchar *fileKey, GBool encryptMetadata, + GBool *ownerPasswordOk) { + DecryptAES256State state; + Guchar test[127 + 56], test2[32]; + GooString *userPassword2; + Guchar fState[256]; + Guchar tmpKey[16]; + Guchar fx, fy; + int len, i, j; + + *ownerPasswordOk = gFalse; + + if (encRevision == 5) { + + // check the owner password + if (ownerPassword) { + //~ this is supposed to convert the password to UTF-8 using "SASLprep" + len = ownerPassword->getLength(); + if (len > 127) { + len = 127; + } + memcpy(test, ownerPassword->getCString(), len); + memcpy(test + len, ownerKey->getCString() + 32, 8); + memcpy(test + len + 8, userKey->getCString(), 48); + sha256(test, len + 56, test); + if (!memcmp(test, ownerKey->getCString(), 32)) { + + // compute the file key from the owner password + memcpy(test, ownerPassword->getCString(), len); + memcpy(test + len, ownerKey->getCString() + 40, 8); + memcpy(test + len + 8, userKey->getCString(), 48); + sha256(test, len + 56, test); + aes256KeyExpansion(&state, test, 32); + for (i = 0; i < 16; ++i) { + state.cbc[i] = 0; + } + aes256DecryptBlock(&state, (Guchar *)ownerEnc->getCString(), gFalse); + memcpy(fileKey, state.buf, 16); + aes256DecryptBlock(&state, (Guchar *)ownerEnc->getCString() + 16, + gFalse); + memcpy(fileKey + 16, state.buf, 16); + + *ownerPasswordOk = gTrue; + return gTrue; + } + } + + // check the user password + if (userPassword) { + //~ this is supposed to convert the password to UTF-8 using "SASLprep" + len = userPassword->getLength(); + if (len > 127) { + len = 127; + } + memcpy(test, userPassword->getCString(), len); + memcpy(test + len, userKey->getCString() + 32, 8); + sha256(test, len + 8, test); + if (!memcmp(test, userKey->getCString(), 32)) { + + // compute the file key from the user password + memcpy(test, userPassword->getCString(), len); + memcpy(test + len, userKey->getCString() + 40, 8); + sha256(test, len + 8, test); + aes256KeyExpansion(&state, test, 32); + for (i = 0; i < 16; ++i) { + state.cbc[i] = 0; + } + aes256DecryptBlock(&state, (Guchar *)userEnc->getCString(), gFalse); + memcpy(fileKey, state.buf, 16); + aes256DecryptBlock(&state, (Guchar *)userEnc->getCString() + 16, + gFalse); + memcpy(fileKey + 16, state.buf, 16); + + return gTrue; + } + } + + return gFalse; + } else { + + // try using the supplied owner password to generate the user password + if (ownerPassword) { + len = ownerPassword->getLength(); + if (len < 32) { + memcpy(test, ownerPassword->getCString(), len); + memcpy(test + len, passwordPad, 32 - len); + } else { + memcpy(test, ownerPassword->getCString(), 32); + } + md5(test, 32, test); + if (encRevision == 3) { + for (i = 0; i < 50; ++i) { + md5(test, keyLength, test); + } + } + if (encRevision == 2) { + rc4InitKey(test, keyLength, fState); + fx = fy = 0; + for (i = 0; i < 32; ++i) { + test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i)); + } + } else { + memcpy(test2, ownerKey->getCString(), 32); + for (i = 19; i >= 0; --i) { + for (j = 0; j < keyLength; ++j) { + tmpKey[j] = test[j] ^ i; + } + rc4InitKey(tmpKey, keyLength, fState); + fx = fy = 0; + for (j = 0; j < 32; ++j) { + test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]); + } + } + } + userPassword2 = new GooString((char *)test2, 32); + if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey, + permissions, fileID, userPassword2, fileKey, + encryptMetadata)) { + *ownerPasswordOk = gTrue; + delete userPassword2; + return gTrue; + } + delete userPassword2; + } + + // try using the supplied user password + return makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey, + permissions, fileID, userPassword, fileKey, + encryptMetadata); + } +} + +GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength, + GooString *ownerKey, GooString *userKey, + int permissions, GooString *fileID, + GooString *userPassword, Guchar *fileKey, + GBool encryptMetadata) { + Guchar *buf; + Guchar test[32]; + Guchar fState[256]; + Guchar tmpKey[16]; + Guchar fx, fy; + int len, i, j; + GBool ok; + + // generate file key + buf = (Guchar *)gmalloc(72 + fileID->getLength()); + if (userPassword) { + len = userPassword->getLength(); + if (len < 32) { + memcpy(buf, userPassword->getCString(), len); + memcpy(buf + len, passwordPad, 32 - len); + } else { + memcpy(buf, userPassword->getCString(), 32); + } + } else { + memcpy(buf, passwordPad, 32); + } + memcpy(buf + 32, ownerKey->getCString(), 32); + buf[64] = permissions & 0xff; + buf[65] = (permissions >> 8) & 0xff; + buf[66] = (permissions >> 16) & 0xff; + buf[67] = (permissions >> 24) & 0xff; + memcpy(buf + 68, fileID->getCString(), fileID->getLength()); + len = 68 + fileID->getLength(); + if (!encryptMetadata) { + buf[len++] = 0xff; + buf[len++] = 0xff; + buf[len++] = 0xff; + buf[len++] = 0xff; + } + md5(buf, len, fileKey); + if (encRevision == 3) { + for (i = 0; i < 50; ++i) { + md5(fileKey, keyLength, fileKey); + } + } + + // test user password + if (encRevision == 2) { + rc4InitKey(fileKey, keyLength, fState); + fx = fy = 0; + for (i = 0; i < 32; ++i) { + test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i)); + } + ok = memcmp(test, passwordPad, 32) == 0; + } else if (encRevision == 3) { + memcpy(test, userKey->getCString(), 32); + for (i = 19; i >= 0; --i) { + for (j = 0; j < keyLength; ++j) { + tmpKey[j] = fileKey[j] ^ i; + } + rc4InitKey(tmpKey, keyLength, fState); + fx = fy = 0; + for (j = 0; j < 32; ++j) { + test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]); + } + } + memcpy(buf, passwordPad, 32); + memcpy(buf + 32, fileID->getCString(), fileID->getLength()); + md5(buf, 32 + fileID->getLength(), buf); + ok = memcmp(test, buf, 16) == 0; + } else { + ok = gFalse; + } + + gfree(buf); + return ok; +} + +//------------------------------------------------------------------------ +// DecryptStream +//------------------------------------------------------------------------ + +DecryptStream::DecryptStream(Stream *strA, Guchar *fileKey, + CryptAlgorithm algoA, int keyLength, + int objNum, int objGen): + FilterStream(strA) +{ + int i; + + algo = algoA; + + // construct object key + for (i = 0; i < keyLength; ++i) { + objKey[i] = fileKey[i]; + } + switch (algo) { + case cryptRC4: + objKey[keyLength] = objNum & 0xff; + objKey[keyLength + 1] = (objNum >> 8) & 0xff; + objKey[keyLength + 2] = (objNum >> 16) & 0xff; + objKey[keyLength + 3] = objGen & 0xff; + objKey[keyLength + 4] = (objGen >> 8) & 0xff; + md5(objKey, keyLength + 5, objKey); + if ((objKeyLength = keyLength + 5) > 16) { + objKeyLength = 16; + } + break; + case cryptAES: + objKey[keyLength] = objNum & 0xff; + objKey[keyLength + 1] = (objNum >> 8) & 0xff; + objKey[keyLength + 2] = (objNum >> 16) & 0xff; + objKey[keyLength + 3] = objGen & 0xff; + objKey[keyLength + 4] = (objGen >> 8) & 0xff; + objKey[keyLength + 5] = 0x73; // 's' + objKey[keyLength + 6] = 0x41; // 'A' + objKey[keyLength + 7] = 0x6c; // 'l' + objKey[keyLength + 8] = 0x54; // 'T' + md5(objKey, keyLength + 9, objKey); + if ((objKeyLength = keyLength + 5) > 16) { + objKeyLength = 16; + } + break; + case cryptAES256: + objKeyLength = keyLength; + break; + } + + charactersRead = 0; +} + +DecryptStream::~DecryptStream() { + delete str; +} + +void DecryptStream::reset() { + int i; + + charactersRead = 0; + str->reset(); + switch (algo) { + case cryptRC4: + state.rc4.x = state.rc4.y = 0; + rc4InitKey(objKey, objKeyLength, state.rc4.state); + state.rc4.buf = EOF; + break; + case cryptAES: + aesKeyExpansion(&state.aes, objKey, objKeyLength); + for (i = 0; i < 16; ++i) { + state.aes.cbc[i] = str->getChar(); + } + state.aes.bufIdx = 16; + break; + case cryptAES256: + aes256KeyExpansion(&state.aes256, objKey, objKeyLength); + for (i = 0; i < 16; ++i) { + state.aes256.cbc[i] = str->getChar(); + } + state.aes256.bufIdx = 16; + break; + } +} + +int DecryptStream::getPos() { + return charactersRead; +} + +int DecryptStream::getChar() { + Guchar in[16]; + int c, i; + + c = EOF; // make gcc happy + switch (algo) { + case cryptRC4: + if (state.rc4.buf == EOF) { + c = str->getChar(); + if (c != EOF) { + state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x, + &state.rc4.y, (Guchar)c); + } + } + c = state.rc4.buf; + state.rc4.buf = EOF; + break; + case cryptAES: + if (state.aes.bufIdx == 16) { + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) == EOF) { + return EOF; + } + in[i] = (Guchar)c; + } + aesDecryptBlock(&state.aes, in, str->lookChar() == EOF); + } + if (state.aes.bufIdx == 16) { + c = EOF; + } else { + c = state.aes.buf[state.aes.bufIdx++]; + } + break; + case cryptAES256: + if (state.aes256.bufIdx == 16) { + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) == EOF) { + return EOF; + } + in[i] = (Guchar)c; + } + aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF); + } + if (state.aes256.bufIdx == 16) { + c = EOF; + } else { + c = state.aes256.buf[state.aes256.bufIdx++]; + } + break; + } + if (c != EOF) + charactersRead++; + return c; +} + +int DecryptStream::lookChar() { + Guchar in[16]; + int c, i; + + c = EOF; // make gcc happy + switch (algo) { + case cryptRC4: + if (state.rc4.buf == EOF) { + c = str->getChar(); + if (c != EOF) { + state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x, + &state.rc4.y, (Guchar)c); + } + } + c = state.rc4.buf; + break; + case cryptAES: + if (state.aes.bufIdx == 16) { + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) == EOF) { + return EOF; + } + in[i] = c; + } + aesDecryptBlock(&state.aes, in, str->lookChar() == EOF); + } + if (state.aes.bufIdx == 16) { + c = EOF; + } else { + c = state.aes.buf[state.aes.bufIdx]; + } + break; + case cryptAES256: + if (state.aes256.bufIdx == 16) { + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) == EOF) { + return EOF; + } + in[i] = c; + } + aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF); + } + if (state.aes256.bufIdx == 16) { + c = EOF; + } else { + c = state.aes256.buf[state.aes256.bufIdx]; + } + break; + } + return c; +} + +GBool DecryptStream::isBinary(GBool last) { + return str->isBinary(last); +} + +//------------------------------------------------------------------------ +// RC4-compatible decryption +//------------------------------------------------------------------------ + +void rc4InitKey(Guchar *key, int keyLen, Guchar *state) { + Guchar index1, index2; + Guchar t; + int i; + + for (i = 0; i < 256; ++i) + state[i] = i; + + if (unlikely(keyLen == 0)) + return; + + index1 = index2 = 0; + for (i = 0; i < 256; ++i) { + index2 = (key[index1] + state[i] + index2) % 256; + t = state[i]; + state[i] = state[index2]; + state[index2] = t; + index1 = (index1 + 1) % keyLen; + } +} + +Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) { + Guchar x1, y1, tx, ty; + + x1 = *x = (*x + 1) % 256; + y1 = *y = (state[*x] + *y) % 256; + tx = state[x1]; + ty = state[y1]; + state[x1] = ty; + state[y1] = tx; + return c ^ state[(tx + ty) % 256]; +} + +//------------------------------------------------------------------------ +// AES decryption +//------------------------------------------------------------------------ + +static const Guchar sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +static const Guchar invSbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; + +static const Guint rcon[11] = { + 0x00000000, // unused + 0x01000000, + 0x02000000, + 0x04000000, + 0x08000000, + 0x10000000, + 0x20000000, + 0x40000000, + 0x80000000, + 0x1b000000, + 0x36000000 +}; + +static inline Guint subWord(Guint x) { + return (sbox[x >> 24] << 24) + | (sbox[(x >> 16) & 0xff] << 16) + | (sbox[(x >> 8) & 0xff] << 8) + | sbox[x & 0xff]; +} + +static inline Guint rotWord(Guint x) { + return ((x << 8) & 0xffffffff) | (x >> 24); +} + +static inline void invSubBytes(Guchar *state) { + int i; + + for (i = 0; i < 16; ++i) { + state[i] = invSbox[state[i]]; + } +} + +static inline void invShiftRows(Guchar *state) { + Guchar t; + + t = state[7]; + state[7] = state[6]; + state[6] = state[5]; + state[5] = state[4]; + state[4] = t; + + t = state[8]; + state[8] = state[10]; + state[10] = t; + t = state[9]; + state[9] = state[11]; + state[11] = t; + + t = state[12]; + state[12] = state[13]; + state[13] = state[14]; + state[14] = state[15]; + state[15] = t; +} + +// {09} \cdot s +static inline Guchar mul09(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s ^ s8; +} + +// {0b} \cdot s +static inline Guchar mul0b(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s ^ s2 ^ s8; +} + +// {0d} \cdot s +static inline Guchar mul0d(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s ^ s4 ^ s8; +} + +// {0e} \cdot s +static inline Guchar mul0e(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s2 ^ s4 ^ s8; +} + +static inline void invMixColumns(Guchar *state) { + int c; + Guchar s0, s1, s2, s3; + + for (c = 0; c < 4; ++c) { + s0 = state[c]; + s1 = state[4+c]; + s2 = state[8+c]; + s3 = state[12+c]; + state[c] = mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3); + state[4+c] = mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3); + state[8+c] = mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3); + state[12+c] = mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3); + } +} + +static inline void invMixColumnsW(Guint *w) { + int c; + Guchar s0, s1, s2, s3; + + for (c = 0; c < 4; ++c) { + s0 = w[c] >> 24; + s1 = w[c] >> 16; + s2 = w[c] >> 8; + s3 = w[c]; + w[c] = ((mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3)) << 24) + | ((mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3)) << 16) + | ((mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3)) << 8) + | (mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3)); + } +} + +static inline void addRoundKey(Guchar *state, Guint *w) { + int c; + + for (c = 0; c < 4; ++c) { + state[c] ^= w[c] >> 24; + state[4+c] ^= w[c] >> 16; + state[8+c] ^= w[c] >> 8; + state[12+c] ^= w[c]; + } +} + +static void aesKeyExpansion(DecryptAESState *s, + Guchar *objKey, int /*objKeyLen*/) { + Guint temp; + int i, round; + + //~ this assumes objKeyLen == 16 + + for (i = 0; i < 4; ++i) { + s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) + + (objKey[4*i+2] << 8) + objKey[4*i+3]; + } + for (i = 4; i < 44; ++i) { + temp = s->w[i-1]; + if (!(i & 3)) { + temp = subWord(rotWord(temp)) ^ rcon[i/4]; + } + s->w[i] = s->w[i-4] ^ temp; + } + for (round = 1; round <= 9; ++round) { + invMixColumnsW(&s->w[round * 4]); + } +} + +static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last) { + int c, round, n, i; + + // initial state + for (c = 0; c < 4; ++c) { + s->state[c] = in[4*c]; + s->state[4+c] = in[4*c+1]; + s->state[8+c] = in[4*c+2]; + s->state[12+c] = in[4*c+3]; + } + + // round 0 + addRoundKey(s->state, &s->w[10 * 4]); + + // rounds 1-9 + for (round = 9; round >= 1; --round) { + invSubBytes(s->state); + invShiftRows(s->state); + invMixColumns(s->state); + addRoundKey(s->state, &s->w[round * 4]); + } + + // round 10 + invSubBytes(s->state); + invShiftRows(s->state); + addRoundKey(s->state, &s->w[0]); + + // CBC + for (c = 0; c < 4; ++c) { + s->buf[4*c] = s->state[c] ^ s->cbc[4*c]; + s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1]; + s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2]; + s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3]; + } + + // save the input block for the next CBC + for (i = 0; i < 16; ++i) { + s->cbc[i] = in[i]; + } + + // remove padding + s->bufIdx = 0; + if (last) { + n = s->buf[15]; + if (n < 1 || n > 16) { // this should never happen + n = 16; + } + for (i = 15; i >= n; --i) { + s->buf[i] = s->buf[i-n]; + } + s->bufIdx = n; + } +} + +//------------------------------------------------------------------------ +// AES-256 decryption +//------------------------------------------------------------------------ + +static void aes256KeyExpansion(DecryptAES256State *s, + Guchar *objKey, int objKeyLen) { + Guint temp; + int i, round; + + //~ this assumes objKeyLen == 32 + + for (i = 0; i < 8; ++i) { + s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) + + (objKey[4*i+2] << 8) + objKey[4*i+3]; + } + for (i = 8; i < 60; ++i) { + temp = s->w[i-1]; + if ((i & 7) == 0) { + temp = subWord(rotWord(temp)) ^ rcon[i/8]; + } else if ((i & 7) == 4) { + temp = subWord(temp); + } + s->w[i] = s->w[i-8] ^ temp; + } + for (round = 1; round <= 13; ++round) { + invMixColumnsW(&s->w[round * 4]); + } +} + +static void aes256DecryptBlock(DecryptAES256State *s, Guchar *in, GBool last) { + int c, round, n, i; + + // initial state + for (c = 0; c < 4; ++c) { + s->state[c] = in[4*c]; + s->state[4+c] = in[4*c+1]; + s->state[8+c] = in[4*c+2]; + s->state[12+c] = in[4*c+3]; + } + + // round 0 + addRoundKey(s->state, &s->w[14 * 4]); + + // rounds 13-1 + for (round = 13; round >= 1; --round) { + invSubBytes(s->state); + invShiftRows(s->state); + invMixColumns(s->state); + addRoundKey(s->state, &s->w[round * 4]); + } + + // round 14 + invSubBytes(s->state); + invShiftRows(s->state); + addRoundKey(s->state, &s->w[0]); + + // CBC + for (c = 0; c < 4; ++c) { + s->buf[4*c] = s->state[c] ^ s->cbc[4*c]; + s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1]; + s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2]; + s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3]; + } + + // save the input block for the next CBC + for (i = 0; i < 16; ++i) { + s->cbc[i] = in[i]; + } + + // remove padding + s->bufIdx = 0; + if (last) { + n = s->buf[15]; + if (n < 1 || n > 16) { // this should never happen + n = 16; + } + for (i = 15; i >= n; --i) { + s->buf[i] = s->buf[i-n]; + } + s->bufIdx = n; + if (n > 16) + { + error(errSyntaxError, -1, "Reducing bufIdx from {0:d} to 16 to not crash", n); + s->bufIdx = 16; + } + } +} + +//------------------------------------------------------------------------ +// MD5 message digest +//------------------------------------------------------------------------ + +// this works around a bug in older Sun compilers +static inline Gulong rotateLeft(Gulong x, int r) { + x &= 0xffffffff; + return ((x << r) | (x >> (32 - r))) & 0xffffffff; +} + +static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s); +} + +static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s); +} + +static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s); +} + +static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s); +} + +void md5(Guchar *msg, int msgLen, Guchar *digest) { + Gulong x[16]; + Gulong a, b, c, d, aa, bb, cc, dd; + int n64; + int i, j, k; + + // sanity check + if (msgLen < 0) { + return; + } + + // compute number of 64-byte blocks + // (length + pad byte (0x80) + 8 bytes for length) + n64 = (msgLen + 1 + 8 + 63) / 64; + + // initialize a, b, c, d + a = 0x67452301; + b = 0xefcdab89; + c = 0x98badcfe; + d = 0x10325476; + + // loop through blocks + k = 0; + for (i = 0; i < n64; ++i) { + + // grab a 64-byte block + for (j = 0; j < 16 && k < msgLen - 3; ++j, k += 4) + x[j] = (((((msg[k+3] << 8) + msg[k+2]) << 8) + msg[k+1]) << 8) + msg[k]; + if (i == n64 - 1) { + if (k == msgLen - 3) + x[j] = 0x80000000 + (((msg[k+2] << 8) + msg[k+1]) << 8) + msg[k]; + else if (k == msgLen - 2) + x[j] = 0x800000 + (msg[k+1] << 8) + msg[k]; + else if (k == msgLen - 1) + x[j] = 0x8000 + msg[k]; + else + x[j] = 0x80; + ++j; + while (j < 16) + x[j++] = 0; + x[14] = msgLen << 3; + } + + // save a, b, c, d + aa = a; + bb = b; + cc = c; + dd = d; + + // round 1 + a = md5Round1(a, b, c, d, x[0], 7, 0xd76aa478); + d = md5Round1(d, a, b, c, x[1], 12, 0xe8c7b756); + c = md5Round1(c, d, a, b, x[2], 17, 0x242070db); + b = md5Round1(b, c, d, a, x[3], 22, 0xc1bdceee); + a = md5Round1(a, b, c, d, x[4], 7, 0xf57c0faf); + d = md5Round1(d, a, b, c, x[5], 12, 0x4787c62a); + c = md5Round1(c, d, a, b, x[6], 17, 0xa8304613); + b = md5Round1(b, c, d, a, x[7], 22, 0xfd469501); + a = md5Round1(a, b, c, d, x[8], 7, 0x698098d8); + d = md5Round1(d, a, b, c, x[9], 12, 0x8b44f7af); + c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1); + b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be); + a = md5Round1(a, b, c, d, x[12], 7, 0x6b901122); + d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193); + c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e); + b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821); + + // round 2 + a = md5Round2(a, b, c, d, x[1], 5, 0xf61e2562); + d = md5Round2(d, a, b, c, x[6], 9, 0xc040b340); + c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51); + b = md5Round2(b, c, d, a, x[0], 20, 0xe9b6c7aa); + a = md5Round2(a, b, c, d, x[5], 5, 0xd62f105d); + d = md5Round2(d, a, b, c, x[10], 9, 0x02441453); + c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681); + b = md5Round2(b, c, d, a, x[4], 20, 0xe7d3fbc8); + a = md5Round2(a, b, c, d, x[9], 5, 0x21e1cde6); + d = md5Round2(d, a, b, c, x[14], 9, 0xc33707d6); + c = md5Round2(c, d, a, b, x[3], 14, 0xf4d50d87); + b = md5Round2(b, c, d, a, x[8], 20, 0x455a14ed); + a = md5Round2(a, b, c, d, x[13], 5, 0xa9e3e905); + d = md5Round2(d, a, b, c, x[2], 9, 0xfcefa3f8); + c = md5Round2(c, d, a, b, x[7], 14, 0x676f02d9); + b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a); + + // round 3 + a = md5Round3(a, b, c, d, x[5], 4, 0xfffa3942); + d = md5Round3(d, a, b, c, x[8], 11, 0x8771f681); + c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122); + b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c); + a = md5Round3(a, b, c, d, x[1], 4, 0xa4beea44); + d = md5Round3(d, a, b, c, x[4], 11, 0x4bdecfa9); + c = md5Round3(c, d, a, b, x[7], 16, 0xf6bb4b60); + b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70); + a = md5Round3(a, b, c, d, x[13], 4, 0x289b7ec6); + d = md5Round3(d, a, b, c, x[0], 11, 0xeaa127fa); + c = md5Round3(c, d, a, b, x[3], 16, 0xd4ef3085); + b = md5Round3(b, c, d, a, x[6], 23, 0x04881d05); + a = md5Round3(a, b, c, d, x[9], 4, 0xd9d4d039); + d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5); + c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8); + b = md5Round3(b, c, d, a, x[2], 23, 0xc4ac5665); + + // round 4 + a = md5Round4(a, b, c, d, x[0], 6, 0xf4292244); + d = md5Round4(d, a, b, c, x[7], 10, 0x432aff97); + c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7); + b = md5Round4(b, c, d, a, x[5], 21, 0xfc93a039); + a = md5Round4(a, b, c, d, x[12], 6, 0x655b59c3); + d = md5Round4(d, a, b, c, x[3], 10, 0x8f0ccc92); + c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d); + b = md5Round4(b, c, d, a, x[1], 21, 0x85845dd1); + a = md5Round4(a, b, c, d, x[8], 6, 0x6fa87e4f); + d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0); + c = md5Round4(c, d, a, b, x[6], 15, 0xa3014314); + b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1); + a = md5Round4(a, b, c, d, x[4], 6, 0xf7537e82); + d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235); + c = md5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb); + b = md5Round4(b, c, d, a, x[9], 21, 0xeb86d391); + + // increment a, b, c, d + a += aa; + b += bb; + c += cc; + d += dd; + } + + // break digest into bytes + digest[0] = (Guchar)(a & 0xff); + digest[1] = (Guchar)((a >>= 8) & 0xff); + digest[2] = (Guchar)((a >>= 8) & 0xff); + digest[3] = (Guchar)((a >>= 8) & 0xff); + digest[4] = (Guchar)(b & 0xff); + digest[5] = (Guchar)((b >>= 8) & 0xff); + digest[6] = (Guchar)((b >>= 8) & 0xff); + digest[7] = (Guchar)((b >>= 8) & 0xff); + digest[8] = (Guchar)(c & 0xff); + digest[9] = (Guchar)((c >>= 8) & 0xff); + digest[10] = (Guchar)((c >>= 8) & 0xff); + digest[11] = (Guchar)((c >>= 8) & 0xff); + digest[12] = (Guchar)(d & 0xff); + digest[13] = (Guchar)((d >>= 8) & 0xff); + digest[14] = (Guchar)((d >>= 8) & 0xff); + digest[15] = (Guchar)((d >>= 8) & 0xff); +} + +//------------------------------------------------------------------------ +// SHA-256 hash +//------------------------------------------------------------------------ + +static Guint sha256K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +static inline Guint rotr(Guint x, Guint n) { + return (x >> n) | (x << (32 - n)); +} + +static inline Guint sha256Ch(Guint x, Guint y, Guint z) { + return (x & y) ^ (~x & z); +} + +static inline Guint sha256Maj(Guint x, Guint y, Guint z) { + return (x & y) ^ (x & z) ^ (y & z); +} + +static inline Guint sha256Sigma0(Guint x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); +} + +static inline Guint sha256Sigma1(Guint x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); +} + +static inline Guint sha256sigma0(Guint x) { + return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3); +} + +static inline Guint sha256sigma1(Guint x) { + return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10); +} + +void sha256HashBlock(Guchar *blk, Guint *H) { + Guint W[64]; + Guint a, b, c, d, e, f, g, h; + Guint T1, T2; + Guint t; + + // 1. prepare the message schedule + for (t = 0; t < 16; ++t) { + W[t] = (blk[t*4] << 24) | + (blk[t*4 + 1] << 16) | + (blk[t*4 + 2] << 8) | + blk[t*4 + 3]; + } + for (t = 16; t < 64; ++t) { + W[t] = sha256sigma1(W[t-2]) + W[t-7] + sha256sigma0(W[t-15]) + W[t-16]; + } + + // 2. initialize the eight working variables + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + f = H[5]; + g = H[6]; + h = H[7]; + + // 3. + for (t = 0; t < 64; ++t) { + T1 = h + sha256Sigma1(e) + sha256Ch(e,f,g) + sha256K[t] + W[t]; + T2 = sha256Sigma0(a) + sha256Maj(a,b,c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + // 4. compute the intermediate hash value + H[0] += a; + H[1] += b; + H[2] += c; + H[3] += d; + H[4] += e; + H[5] += f; + H[6] += g; + H[7] += h; +} + +static void sha256(Guchar *msg, int msgLen, Guchar *hash) { + Guchar blk[64]; + Guint H[8]; + int blkLen, i; + + H[0] = 0x6a09e667; + H[1] = 0xbb67ae85; + H[2] = 0x3c6ef372; + H[3] = 0xa54ff53a; + H[4] = 0x510e527f; + H[5] = 0x9b05688c; + H[6] = 0x1f83d9ab; + H[7] = 0x5be0cd19; + + blkLen = 0; + for (i = 0; i + 64 <= msgLen; i += 64) { + sha256HashBlock(msg + i, H); + } + blkLen = msgLen - i; + if (blkLen > 0) { + memcpy(blk, msg + i, blkLen); + } + + // pad the message + blk[blkLen++] = 0x80; + if (blkLen > 56) { + while (blkLen < 64) { + blk[blkLen++] = 0; + } + sha256HashBlock(blk, H); + blkLen = 0; + } + while (blkLen < 56) { + blk[blkLen++] = 0; + } + blk[56] = 0; + blk[57] = 0; + blk[58] = 0; + blk[59] = 0; + blk[60] = (Guchar)(msgLen >> 21); + blk[61] = (Guchar)(msgLen >> 13); + blk[62] = (Guchar)(msgLen >> 5); + blk[63] = (Guchar)(msgLen << 3); + sha256HashBlock(blk, H); + + // copy the output into the buffer (convert words to bytes) + for (i = 0; i < 8; ++i) { + hash[i*4] = (Guchar)(H[i] >> 24); + hash[i*4 + 1] = (Guchar)(H[i] >> 16); + hash[i*4 + 2] = (Guchar)(H[i] >> 8); + hash[i*4 + 3] = (Guchar)H[i]; + } +} diff --git a/poppler/Decrypt.h b/poppler/Decrypt.h new file mode 100644 index 0000000..d947f41 --- /dev/null +++ b/poppler/Decrypt.h @@ -0,0 +1,126 @@ +//======================================================================== +// +// Decrypt.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Julien Rebetez +// Copyright (C) 2009 David Benjamin +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef DECRYPT_H +#define DECRYPT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "goo/GooString.h" +#include "Object.h" +#include "Stream.h" + +//------------------------------------------------------------------------ +// Decrypt +//------------------------------------------------------------------------ + +class Decrypt { +public: + + // Generate a file key. The buffer must have space for at + // least 16 bytes. Checks and then + // and returns true if either is correct. Sets if + // the owner password was correct. Either or both of the passwords + // may be NULL, which is treated as an empty string. + static GBool makeFileKey(int encVersion, int encRevision, int keyLength, + GooString *ownerKey, GooString *userKey, + GooString *ownerEnc, GooString *userEnc, + int permissions, GooString *fileID, + GooString *ownerPassword, GooString *userPassword, + Guchar *fileKey, GBool encryptMetadata, + GBool *ownerPasswordOk); + +private: + + static GBool makeFileKey2(int encVersion, int encRevision, int keyLength, + GooString *ownerKey, GooString *userKey, + int permissions, GooString *fileID, + GooString *userPassword, Guchar *fileKey, + GBool encryptMetadata); +}; + +//------------------------------------------------------------------------ +// DecryptStream +//------------------------------------------------------------------------ + +struct DecryptRC4State { + Guchar state[256]; + Guchar x, y; + int buf; +}; + +struct DecryptAESState { + Guint w[44]; + Guchar state[16]; + Guchar cbc[16]; + Guchar buf[16]; + int bufIdx; +}; + +struct DecryptAES256State { + Guint w[60]; + Guchar state[16]; + Guchar cbc[16]; + Guchar buf[16]; + int bufIdx; +}; + +class DecryptStream: public FilterStream { +public: + + DecryptStream(Stream *strA, Guchar *fileKey, + CryptAlgorithm algoA, int keyLength, + int objNum, int objGen); + virtual ~DecryptStream(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getPos(); + virtual GBool isBinary(GBool last); + virtual Stream *getUndecodedStream() { return this; } + +private: + + CryptAlgorithm algo; + int objKeyLength; + Guchar objKey[32]; + int charactersRead; // so that getPos() can be correct + + union { + DecryptRC4State rc4; + DecryptAESState aes; + DecryptAES256State aes256; + } state; +}; + +//------------------------------------------------------------------------ + +extern void rc4InitKey(Guchar *key, int keyLen, Guchar *state); +extern Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c); +extern void md5(Guchar *msg, int msgLen, Guchar *digest); + +#endif diff --git a/poppler/Dict.cc b/poppler/Dict.cc new file mode 100644 index 0000000..c4f667b --- /dev/null +++ b/poppler/Dict.cc @@ -0,0 +1,243 @@ +//======================================================================== +// +// Dict.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2007-2008 Julien Rebetez +// Copyright (C) 2008, 2010 Albert Astals Cid +// Copyright (C) 2010 Paweł Wiejacha +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "goo/gmem.h" +#include "Object.h" +#include "XRef.h" +#include "Dict.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +static const int SORT_LENGTH_LOWER_LIMIT = 32; + +static inline bool cmpDictEntries(const DictEntry &e1, const DictEntry &e2) +{ + return strcmp(e1.key, e2.key) < 0; +} + +static int binarySearch(const char *key, DictEntry *entries, int length) +{ + int first = 0; + int end = length - 1; + while (first <= end) { + const int middle = (first + end) / 2; + const int res = strcmp(key, entries[middle].key); + if (res == 0) { + return middle; + } else if (res < 0) { + end = middle - 1; + } else { + first = middle + 1; + } + } + return -1; +} + +Dict::Dict(XRef *xrefA) { + xref = xrefA; + entries = NULL; + size = length = 0; + ref = 1; + sorted = gFalse; +} + +Dict::Dict(Dict* dictA) { + xref = dictA->xref; + size = length = dictA->length; + ref = 1; + + sorted = dictA->sorted; + entries = (DictEntry *)gmallocn(size, sizeof(DictEntry)); + for (int i=0; ientries[i].key); + dictA->entries[i].val.copy(&entries[i].val); + } +} + +Dict::~Dict() { + int i; + + for (i = 0; i < length; ++i) { + gfree(entries[i].key); + entries[i].val.free(); + } + gfree(entries); +} + +void Dict::add(char *key, Object *val) { + if (sorted) { + // We use add on very few occasions so + // virtually this will never be hit + sorted = gFalse; + } + + if (length == size) { + if (length == 0) { + size = 8; + } else { + size *= 2; + } + entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry)); + } + entries[length].key = key; + entries[length].val = *val; + ++length; +} + +inline DictEntry *Dict::find(const char *key) { + if (!sorted && length >= SORT_LENGTH_LOWER_LIMIT) + { + sorted = gTrue; + std::sort(entries, entries+length, cmpDictEntries); + } + + if (sorted) { + const int pos = binarySearch(key, entries, length); + if (pos != -1) { + return &entries[pos]; + } + } else { + int i; + + for (i = length - 1; i >=0; --i) { + if (!strcmp(key, entries[i].key)) + return &entries[i]; + } + } + return NULL; +} + +GBool Dict::hasKey(const char *key) { + return find(key) != NULL; +} + +void Dict::remove(const char *key) { + if (sorted) { + const int pos = binarySearch(key, entries, length); + if (pos != -1) { + length -= 1; + if (pos != length) { + memmove(&entries[pos], &entries[pos + 1], (length - pos) * sizeof(DictEntry)); + } + } + } else { + int i; + bool found = false; + DictEntry tmp; + if(length == 0) return; + + for(i=0; iisNull()) { + remove(key); + return; + } + e = find (key); + if (e) { + e->val.free(); + e->val = *val; + } else { + add (copyString(key), val); + } +} + + +GBool Dict::is(const char *type) { + DictEntry *e; + + return (e = find("Type")) && e->val.isName(type); +} + +Object *Dict::lookup(const char *key, Object *obj, int recursion) { + DictEntry *e; + + return (e = find(key)) ? e->val.fetch(xref, obj, recursion) : obj->initNull(); +} + +Object *Dict::lookupNF(const char *key, Object *obj) { + DictEntry *e; + + return (e = find(key)) ? e->val.copy(obj) : obj->initNull(); +} + +GBool Dict::lookupInt(const char *key, const char *alt_key, int *value) +{ + Object obj1; + GBool success = gFalse; + + lookup ((char *) key, &obj1); + if (obj1.isNull () && alt_key != NULL) { + obj1.free (); + lookup ((char *) alt_key, &obj1); + } + if (obj1.isInt ()) { + *value = obj1.getInt (); + success = gTrue; + } + + obj1.free (); + + return success; +} + +char *Dict::getKey(int i) { + return entries[i].key; +} + +Object *Dict::getVal(int i, Object *obj) { + return entries[i].val.fetch(xref, obj); +} + +Object *Dict::getValNF(int i, Object *obj) { + return entries[i].val.copy(obj); +} diff --git a/poppler/Dict.h b/poppler/Dict.h new file mode 100644 index 0000000..897f221 --- /dev/null +++ b/poppler/Dict.h @@ -0,0 +1,105 @@ +//======================================================================== +// +// Dict.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2007-2008 Julien Rebetez +// Copyright (C) 2010 Albert Astals Cid +// Copyright (C) 2010 Paweł Wiejacha +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef DICT_H +#define DICT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +struct DictEntry { + char *key; + Object val; +}; + +class Dict { +public: + + // Constructor. + Dict(XRef *xrefA); + Dict(Dict* dictA); + + // Destructor. + ~Dict(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get number of entries. + int getLength() { return length; } + + // Add an entry. NB: does not copy key. + void add(char *key, Object *val); + + // Update the value of an existing entry, otherwise create it + void set(const char *key, Object *val); + // Remove an entry. This invalidate indexes + void remove(const char *key); + + // Check if dictionary is of specified type. + GBool is(const char *type); + + // Look up an entry and return the value. Returns a null object + // if is not in the dictionary. + Object *lookup(const char *key, Object *obj, int recursion = 0); + Object *lookupNF(const char *key, Object *obj); + GBool lookupInt(const char *key, const char *alt_key, int *value); + + // Iterative accessors. + char *getKey(int i); + Object *getVal(int i, Object *obj); + Object *getValNF(int i, Object *obj); + + // Set the xref pointer. This is only used in one special case: the + // trailer dictionary, which is read before the xref table is + // parsed. + void setXRef(XRef *xrefA) { xref = xrefA; } + + XRef *getXRef() { return xref; } + + GBool hasKey(const char *key); + +private: + + GBool sorted; + XRef *xref; // the xref table for this PDF file + DictEntry *entries; // array of entries + int size; // size of array + int length; // number of entries in dictionary + int ref; // reference count + + DictEntry *find(const char *key); +}; + +#endif diff --git a/poppler/Error.cc b/poppler/Error.cc new file mode 100644 index 0000000..9d044bc --- /dev/null +++ b/poppler/Error.cc @@ -0,0 +1,84 @@ +//======================================================================== +// +// Error.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2007 Jeff Muizelaar +// Copyright (C) 2005 Albert Astals Cid +// Copyright (C) 2007 Krzysztof Kowalczyk +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "GooString.h" +#include "GlobalParams.h" +#include "Error.h" + +static const char *errorCategoryNames[] = { + "Syntax Warning", + "Syntax Error", + "Config Error", + "Command Line Error", + "I/O Error", + "Permission Error", + "Unimplemented Feature", + "Internal Error" +}; + +static void (*errorCbk)(void *data, ErrorCategory category, + int pos, char *msg) = NULL; +static void *errorCbkData = NULL; + +void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, + int pos, char *msg), + void *data) { + errorCbk = cbk; + errorCbkData = data; +} + +void CDECL error(ErrorCategory category, int pos, const char *msg, ...) { + va_list args; + GooString *s; + + // NB: this can be called before the globalParams object is created + if (!errorCbk && globalParams && globalParams->getErrQuiet()) { + return; + } + va_start(args, msg); + s = GooString::formatv(msg, args); + va_end(args); + if (errorCbk) { + (*errorCbk)(errorCbkData, category, pos, s->getCString()); + } else { + if (pos >= 0) { + fprintf(stderr, "%s (%d): %s\n", + errorCategoryNames[category], pos, s->getCString()); + } else { + fprintf(stderr, "%s: %s\n", + errorCategoryNames[category], s->getCString()); + } + fflush(stderr); + } + delete s; +} diff --git a/poppler/Error.h b/poppler/Error.h new file mode 100644 index 0000000..d7a0991 --- /dev/null +++ b/poppler/Error.h @@ -0,0 +1,56 @@ +//======================================================================== +// +// Error.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2007 Jeff Muizelaar +// Copyright (C) 2005 Albert Astals Cid +// Copyright (C) 2005 Kristian Høgsberg +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef ERROR_H +#define ERROR_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "poppler-config.h" + +enum ErrorCategory { + errSyntaxWarning, // PDF syntax error which can be worked around; + // output will probably be correct + errSyntaxError, // PDF syntax error which can be worked around; + // output will probably be incorrect + errConfig, // error in Xpdf config info (xpdfrc file, etc.) + errCommandLine, // error in user-supplied parameters, action not + // allowed, etc. (only used by command-line tools) + errIO, // error in file I/O + errNotAllowed, // action not allowed by PDF permission bits + errUnimplemented, // unimplemented PDF feature - display will be + // incorrect + errInternal // internal error - malfunction within the Xpdf code +}; + +extern void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, + int pos, char *msg), + void *data); + +extern void CDECL error(ErrorCategory category, int pos, const char *msg, ...); + +#endif diff --git a/poppler/ErrorCodes.h b/poppler/ErrorCodes.h new file mode 100644 index 0000000..b28528d --- /dev/null +++ b/poppler/ErrorCodes.h @@ -0,0 +1,36 @@ +//======================================================================== +// +// ErrorCodes.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef ERRORCODES_H +#define ERRORCODES_H + +#define errNone 0 // no error + +#define errOpenFile 1 // couldn't open the PDF file + +#define errBadCatalog 2 // couldn't read the page catalog + +#define errDamaged 3 // PDF file was damaged and couldn't be + // repaired + +#define errEncrypted 4 // file was encrypted and password was + // incorrect or not supplied + +#define errHighlightFile 5 // nonexistent or invalid highlight file + +#define errBadPrinter 6 // invalid printer + +#define errPrinting 7 // error during printing + +#define errPermission 8 // PDF file doesn't allow that operation + +#define errBadPageNum 9 // invalid page number + +#define errFileIO 10 // file I/O error + +#endif diff --git a/poppler/FileSpec.cc b/poppler/FileSpec.cc new file mode 100644 index 0000000..1adcf5b --- /dev/null +++ b/poppler/FileSpec.cc @@ -0,0 +1,294 @@ +//======================================================================== +// +// FileSpec.cc +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008-2009 Carlos Garcia Campos +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +//======================================================================== +// +// Most of the code from Link.cc and PSOutputDev.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#include "FileSpec.h" + +EmbFile::EmbFile(Object *efStream) +{ + m_size = -1; + m_createDate = NULL; + m_modDate = NULL; + m_checksum = NULL; + m_mimetype = NULL; + + efStream->copy(&m_objStr); + + if (efStream->isStream()) { + // dataDict corresponds to Table 3.41 in the PDF1.6 spec. + Dict *dataDict = efStream->streamGetDict(); + + // subtype is normally the mimetype + Object subtypeName; + if (dataDict->lookup("Subtype", &subtypeName)->isName()) { + m_mimetype = new GooString(subtypeName.getName()); + } + subtypeName.free(); + + // paramDict corresponds to Table 3.42 in the PDF1.6 spec + Object paramDict; + if (dataDict->lookup("Params", ¶mDict)->isDict()) { + Object paramObj; + if (paramDict.dictLookup("ModDate", ¶mObj)->isString()) + m_modDate = new GooString(paramObj.getString()); + paramObj.free(); + + if (paramDict.dictLookup("CreationDate", ¶mObj)->isString()) + m_createDate = new GooString(paramObj.getString()); + paramObj.free(); + + if (paramDict.dictLookup("Size", ¶mObj)->isInt()) + m_size = paramObj.getInt(); + paramObj.free(); + + if (paramDict.dictLookup("CheckSum", ¶mObj)->isString()) + m_checksum = new GooString(paramObj.getString()); + paramObj.free(); + } + paramDict.free(); + } +} + +EmbFile::~EmbFile() +{ + delete m_createDate; + delete m_modDate; + delete m_checksum; + delete m_mimetype; + m_objStr.free(); +} + +GBool EmbFile::save(const char *path) { + FILE *f; + GBool ret; + + if (!(f = fopen(path, "wb"))) { + return gFalse; + } + ret = save2(f); + fclose(f); + return ret; +} + +GBool EmbFile::save2(FILE *f) { + int c; + + m_objStr.streamReset(); + while ((c = m_objStr.streamGetChar()) != EOF) { + fputc(c, f); + } + return gTrue; +} + +FileSpec::FileSpec(Object *fileSpecA) +{ + ok = gTrue; + fileName = NULL; + platformFileName = NULL; + embFile = NULL; + desc = NULL; + fileSpecA->copy(&fileSpec); + + Object obj1; + if (!getFileSpecName(fileSpecA, &obj1)) { + ok = gFalse; + obj1.free(); + error(errSyntaxError, -1, "Invalid FileSpec"); + return; + } + + fileName = obj1.getString()->copy(); + obj1.free(); + + if (fileSpec.isDict()) { + if (fileSpec.dictLookup("EF", &obj1)->isDict()) { + if (!obj1.dictLookupNF("F", &fileStream)->isRef()) { + ok = gFalse; + fileStream.free(); + error(errSyntaxError, -1, "Invalid FileSpec: Embedded file stream is not an indirect reference"); + obj1.free(); + return; + } + } + obj1.free(); + } + + if (fileSpec.dictLookup("Desc", &obj1)->isString()) + desc = obj1.getString()->copy(); + obj1.free(); +} + +FileSpec::~FileSpec() +{ + fileSpec.free(); + fileStream.free(); + delete fileName; + delete platformFileName; + delete embFile; + delete desc; +} + +EmbFile *FileSpec::getEmbeddedFile() +{ + if(!ok) + return NULL; + + if (embFile) + return embFile; + + Object obj1; + XRef *xref = fileSpec.getDict()->getXRef(); + embFile = new EmbFile(fileStream.fetch(xref, &obj1)); + obj1.free(); + + return embFile; +} + +GooString *FileSpec::getFileNameForPlatform() +{ + if (platformFileName) + return platformFileName; + + Object obj1; + if (getFileSpecNameForPlatform(&fileSpec, &obj1)) + platformFileName = obj1.getString()->copy(); + obj1.free(); + + return platformFileName; +} + +GBool getFileSpecName (Object *fileSpec, Object *fileName) +{ + if (fileSpec->isString()) { + fileSpec->copy(fileName); + return gTrue; + } + + if (fileSpec->isDict()) { + fileSpec->dictLookup("UF", fileName); + if (fileName->isString()) { + return gTrue; + } + fileName->free(); + fileSpec->dictLookup("F", fileName); + if (fileName->isString()) { + return gTrue; + } + fileName->free(); + fileSpec->dictLookup("DOS", fileName); + if (fileName->isString()) { + return gTrue; + } + fileName->free(); + fileSpec->dictLookup("Mac", fileName); + if (fileName->isString()) { + return gTrue; + } + fileName->free(); + fileSpec->dictLookup("Unix", fileName); + if (fileName->isString()) { + return gTrue; + } + fileName->free(); + } + return gFalse; +} + +GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName) +{ + if (fileSpec->isString()) { + fileSpec->copy(fileName); + return gTrue; + } + + if (fileSpec->isDict()) { + if (!fileSpec->dictLookup("UF", fileName)->isString ()) { + fileName->free(); + if (!fileSpec->dictLookup("F", fileName)->isString ()) { + fileName->free(); +#ifdef _WIN32 + char *platform = "DOS"; +#else + const char *platform = "Unix"; +#endif + if (!fileSpec->dictLookup(platform, fileName)->isString ()) { + fileName->free(); + error(errSyntaxError, -1, "Illegal file spec"); + return gFalse; + } + } + } + } else { + error(errSyntaxError, -1, "Illegal file spec"); + return gFalse; + } + + // system-dependent path manipulation +#ifdef _WIN32 + int i, j; + GooString *name = fileName->getString(); + // "//...." --> "\...." + // "/x/...." --> "x:\...." + // "/server/share/...." --> "\\server\share\...." + // convert escaped slashes to slashes and unescaped slashes to backslashes + i = 0; + if (name->getChar(0) == '/') { + if (name->getLength() >= 2 && name->getChar(1) == '/') { + name->del(0); + i = 0; + } else if (name->getLength() >= 2 && + ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') || + (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) && + (name->getLength() == 2 || name->getChar(2) == '/')) { + name->setChar(0, name->getChar(1)); + name->setChar(1, ':'); + i = 2; + } else { + for (j = 2; j < name->getLength(); ++j) { + if (name->getChar(j-1) != '\\' && + name->getChar(j) == '/') { + break; + } + } + if (j < name->getLength()) { + name->setChar(0, '\\'); + name->insert(0, '\\'); + i = 2; + } + } + } + for (; i < name->getLength(); ++i) { + if (name->getChar(i) == '/') { + name->setChar(i, '\\'); + } else if (name->getChar(i) == '\\' && + i+1 < name->getLength() && + name->getChar(i+1) == '/') { + name->del(i); + } + } +#endif /* _WIN32 */ + + return gTrue; +} diff --git a/poppler/FileSpec.h b/poppler/FileSpec.h new file mode 100644 index 0000000..9f2f6fc --- /dev/null +++ b/poppler/FileSpec.h @@ -0,0 +1,76 @@ +//======================================================================== +// +// FileSpec.h +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Carlos Garcia Campos +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef FILE_SPEC_H +#define FILE_SPEC_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class EmbFile { +public: + EmbFile(Object *efStream); + ~EmbFile(); + + int size() { return m_size; } + GooString *modDate() { return m_modDate; } + GooString *createDate() { return m_createDate; } + GooString *checksum() { return m_checksum; } + GooString *mimeType() { return m_mimetype; } + Stream *stream() { return isOk() ? m_objStr.getStream() : NULL; } + GBool isOk() { return m_objStr.isStream(); } + GBool save(const char *path); + +private: + GBool save2(FILE *f); + + int m_size; + GooString *m_createDate; + GooString *m_modDate; + GooString *m_checksum; + GooString *m_mimetype; + Object m_objStr; +}; + +class FileSpec { +public: + FileSpec(Object *fileSpec); + ~FileSpec(); + + GBool isOk() { return ok; } + + GooString *getFileName() const { return fileName; } + GooString *getFileNameForPlatform(); + GooString *getDescription() const { return desc; } + EmbFile *getEmbeddedFile(); + +private: + GBool ok; + + Object fileSpec; + + GooString *fileName; // F, UF, DOS, Mac, Unix + GooString *platformFileName; + Object fileStream; // Ref to F entry in UF + EmbFile *embFile; + GooString *desc; // Desc +}; + +GBool getFileSpecName (Object *fileSpec, Object *fileName); +GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName); + +#endif /* FILE_SPEC_H */ diff --git a/poppler/FlateStream.cc b/poppler/FlateStream.cc new file mode 100644 index 0000000..7990dad --- /dev/null +++ b/poppler/FlateStream.cc @@ -0,0 +1,128 @@ +//======================================================================== +// +// FlateStream.cc +// +// Copyright (C) 2005, Jeff Muizelaar +// Copyright (C) 2010, Albert Astals Cid +// +// This file is under the GPLv2 or later license +// +//======================================================================== +#include "FlateStream.h" +FlateStream::FlateStream(Stream *strA, int predictor, int columns, int colors, int bits) : + FilterStream(strA) +{ + if (predictor != 1) { + pred = new StreamPredictor(this, predictor, columns, colors, bits); + } else { + pred = NULL; + } + out_pos = 0; + memset(&d_stream, 0, sizeof(d_stream)); + inflateInit(&d_stream); +} + +FlateStream::~FlateStream() { + inflateEnd(&d_stream); + delete pred; + delete str; +} + +void FlateStream::reset() { + //FIXME: what are the semantics of reset? + //i.e. how much intialization has to happen in the constructor? + + /* reinitialize zlib */ + inflateEnd(&d_stream); + memset(&d_stream, 0, sizeof(d_stream)); + inflateInit(&d_stream); + + str->reset(); + d_stream.avail_in = 0; + status = Z_OK; + out_pos = 0; + out_buf_len = 0; +} + +int FlateStream::getRawChar() { + return doGetRawChar(); +} + +void FlateStream::getRawChars(int nChars, int *buffer) { + for (int i = 0; i < nChars; ++i) + buffer[i] = doGetRawChar(); +} + +int FlateStream::getChar() { + if (pred) + return pred->getChar(); + else + return getRawChar(); +} + +int FlateStream::lookChar() { + if (pred) + return pred->lookChar(); + + if (fill_buffer()) + return EOF; + + return out_buf[out_pos]; +} + +int FlateStream::fill_buffer() { + /* only fill the buffer if it has all been used */ + if (out_pos >= out_buf_len) { + /* check if the flatestream has been exhausted */ + if (status == Z_STREAM_END) { + return -1; + } + + /* set to the begining of out_buf */ + d_stream.avail_out = sizeof(out_buf); + d_stream.next_out = out_buf; + out_pos = 0; + + while (1) { + /* buffer is empty so we need to fill it */ + if (d_stream.avail_in == 0) { + int c; + /* read from the source stream */ + while (d_stream.avail_in < sizeof(in_buf) && (c = str->getChar()) != EOF) { + in_buf[d_stream.avail_in++] = c; + } + d_stream.next_in = in_buf; + } + + /* keep decompressing until we can't anymore */ + if (d_stream.avail_out == 0 || d_stream.avail_in == 0 || (status != Z_OK && status != Z_BUF_ERROR)) + break; + status = inflate(&d_stream, Z_SYNC_FLUSH); + } + + out_buf_len = sizeof(out_buf) - d_stream.avail_out; + if (status != Z_OK && status != Z_STREAM_END) + return -1; + if (!out_buf_len) + return -1; + } + + return 0; +} + +GooString *FlateStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 3 || pred) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< >> /FlateDecode filter\n"); + return s; +} + +GBool FlateStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} diff --git a/poppler/FlateStream.h b/poppler/FlateStream.h new file mode 100644 index 0000000..9e3835f --- /dev/null +++ b/poppler/FlateStream.h @@ -0,0 +1,77 @@ +//======================================================================== +// +// FlateStream.h +// +// Copyright (C) 2005, Jeff Muizelaar +// Copyright (C) 2010, 2011, Albert Astals Cid +// +// This file is under the GPLv2 or later license +// +//======================================================================== + +#ifndef FLATESTREAM_H +#define FLATESTREAM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "poppler-config.h" +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "Error.h" +#include "Object.h" +#include "Decrypt.h" +#include "Stream.h" + +extern "C" { +#include +} + +class FlateStream: public FilterStream { +public: + + FlateStream(Stream *strA, int predictor, int columns, int colors, int bits); + virtual ~FlateStream(); + virtual StreamKind getKind() { return strFlate; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual void getRawChars(int nChars, int *buffer); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + inline int doGetRawChar() { + if (fill_buffer()) + return EOF; + + return out_buf[out_pos++]; + } + + int fill_buffer(void); + z_stream d_stream; + StreamPredictor *pred; + int status; + /* in_buf currently needs to be 1 or we over read from EmbedStreams */ + unsigned char in_buf[1]; + unsigned char out_buf[4096]; + int out_pos; + int out_buf_len; +}; + +#endif diff --git a/poppler/FontEncodingTables.cc b/poppler/FontEncodingTables.cc new file mode 100644 index 0000000..6ebef78 --- /dev/null +++ b/poppler/FontEncodingTables.cc @@ -0,0 +1,1824 @@ +//======================================================================== +// +// FontEncodingTables.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include +#include +#include "FontEncodingTables.h" + +const char *macRomanEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + "Adieresis", + "Aring", + "Ccedilla", + "Eacute", + "Ntilde", + "Odieresis", + "Udieresis", + "aacute", + "agrave", + "acircumflex", + "adieresis", + "atilde", + "aring", + "ccedilla", + "eacute", + "egrave", + "ecircumflex", + "edieresis", + "iacute", + "igrave", + "icircumflex", + "idieresis", + "ntilde", + "oacute", + "ograve", + "ocircumflex", + "odieresis", + "otilde", + "uacute", + "ugrave", + "ucircumflex", + "udieresis", + "dagger", + "degree", + "cent", + "sterling", + "section", + "bullet", + "paragraph", + "germandbls", + "registered", + "copyright", + "trademark", + "acute", + "dieresis", + "notequal", + "AE", + "Oslash", + "infinity", + "plusminus", + "lessequal", + "greaterequal", + "yen", + "mu", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "ordfeminine", + "ordmasculine", + "Omega", + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + "radical", + "florin", + "approxequal", + "Delta", + "guillemotleft", + "guillemotright", + "ellipsis", + "space", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + "lozenge", + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + "apple", + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron" +}; + +const char *macExpertEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + "centoldstyle", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + NULL, + "threequartersemdash", + NULL, + "questionsmall", + NULL, + NULL, + NULL, + NULL, + "Ethsmall", + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hypheninferior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + "asuperior", + "centsuperior", + NULL, + NULL, + NULL, + NULL, + "Aacutesmall", + "Agravesmall", + "Acircumflexsmall", + "Adieresissmall", + "Atildesmall", + "Aringsmall", + "Ccedillasmall", + "Eacutesmall", + "Egravesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Iacutesmall", + "Igravesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ntildesmall", + "Oacutesmall", + "Ogravesmall", + "Ocircumflexsmall", + "Odieresissmall", + "Otildesmall", + "Uacutesmall", + "Ugravesmall", + "Ucircumflexsmall", + "Udieresissmall", + NULL, + "eightsuperior", + "fourinferior", + "threeinferior", + "sixinferior", + "eightinferior", + "seveninferior", + "Scaronsmall", + NULL, + "centinferior", + "twoinferior", + NULL, + "Dieresissmall", + NULL, + "Caronsmall", + "osuperior", + "fiveinferior", + NULL, + "commainferior", + "periodinferior", + "Yacutesmall", + NULL, + "dollarinferior", + NULL, + NULL, + "Thornsmall", + NULL, + "nineinferior", + "zeroinferior", + "Zcaronsmall", + "AEsmall", + "Oslashsmall", + "questiondownsmall", + "oneinferior", + "Lslashsmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Cedillasmall", + NULL, + NULL, + NULL, + NULL, + NULL, + "OEsmall", + "figuredash", + "hyphensuperior", + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + NULL, + "Ydieresissmall", + NULL, + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "ninesuperior", + "zerosuperior", + NULL, + "esuperior", + "rsuperior", + "tsuperior", + NULL, + NULL, + "isuperior", + "ssuperior", + "dsuperior", + NULL, + NULL, + NULL, + NULL, + NULL, + "lsuperior", + "Ogoneksmall", + "Brevesmall", + "Macronsmall", + "bsuperior", + "nsuperior", + "msuperior", + "commasuperior", + "periodsuperior", + "Dotaccentsmall", + "Ringsmall", + NULL, + NULL, + NULL, + NULL +}; + +const char *winAnsiEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "bullet", + "Euro", + "bullet", + "quotesinglbase", + "florin", + "quotedblbase", + "ellipsis", + "dagger", + "daggerdbl", + "circumflex", + "perthousand", + "Scaron", + "guilsinglleft", + "OE", + "bullet", + "Zcaron", + "bullet", + "bullet", + "quoteleft", + "quoteright", + "quotedblleft", + "quotedblright", + "bullet", + "endash", + "emdash", + "tilde", + "trademark", + "scaron", + "guilsinglright", + "oe", + "bullet", + "zcaron", + "Ydieresis", + "space", + "exclamdown", + "cent", + "sterling", + "currency", + "yen", + "brokenbar", + "section", + "dieresis", + "copyright", + "ordfeminine", + "guillemotleft", + "logicalnot", + "hyphen", + "registered", + "macron", + "degree", + "plusminus", + "twosuperior", + "threesuperior", + "acute", + "mu", + "paragraph", + "periodcentered", + "cedilla", + "onesuperior", + "ordmasculine", + "guillemotright", + "onequarter", + "onehalf", + "threequarters", + "questiondown", + "Agrave", + "Aacute", + "Acircumflex", + "Atilde", + "Adieresis", + "Aring", + "AE", + "Ccedilla", + "Egrave", + "Eacute", + "Ecircumflex", + "Edieresis", + "Igrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Eth", + "Ntilde", + "Ograve", + "Oacute", + "Ocircumflex", + "Otilde", + "Odieresis", + "multiply", + "Oslash", + "Ugrave", + "Uacute", + "Ucircumflex", + "Udieresis", + "Yacute", + "Thorn", + "germandbls", + "agrave", + "aacute", + "acircumflex", + "atilde", + "adieresis", + "aring", + "ae", + "ccedilla", + "egrave", + "eacute", + "ecircumflex", + "edieresis", + "igrave", + "iacute", + "icircumflex", + "idieresis", + "eth", + "ntilde", + "ograve", + "oacute", + "ocircumflex", + "otilde", + "odieresis", + "divide", + "oslash", + "ugrave", + "uacute", + "ucircumflex", + "udieresis", + "yacute", + "thorn", + "ydieresis" +}; + +const char *standardEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL +}; + +const char *expertEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall" +}; + +const char *symbolEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "universal", + "numbersign", + "existential", + "percent", + "ampersand", + "suchthat", + "parenleft", + "parenright", + "asteriskmath", + "plus", + "comma", + "minus", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "congruent", + "Alpha", + "Beta", + "Chi", + "Delta", + "Epsilon", + "Phi", + "Gamma", + "Eta", + "Iota", + "theta1", + "Kappa", + "Lambda", + "Mu", + "Nu", + "Omicron", + "Pi", + "Theta", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "sigma1", + "Omega", + "Xi", + "Psi", + "Zeta", + "bracketleft", + "therefore", + "bracketright", + "perpendicular", + "underscore", + "radicalex", + "alpha", + "beta", + "chi", + "delta", + "epsilon", + "phi", + "gamma", + "eta", + "iota", + "phi1", + "kappa", + "lambda", + "mu", + "nu", + "omicron", + "pi", + "theta", + "rho", + "sigma", + "tau", + "upsilon", + "omega1", + "omega", + "xi", + "psi", + "zeta", + "braceleft", + "bar", + "braceright", + "similar", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Upsilon1", + "minute", + "lessequal", + "fraction", + "infinity", + "florin", + "club", + "diamond", + "heart", + "spade", + "arrowboth", + "arrowleft", + "arrowup", + "arrowright", + "arrowdown", + "degree", + "plusminus", + "second", + "greaterequal", + "multiply", + "proportional", + "partialdiff", + "bullet", + "divide", + "notequal", + "equivalence", + "approxequal", + "ellipsis", + "arrowvertex", + "arrowhorizex", + "carriagereturn", + "aleph", + "Ifraktur", + "Rfraktur", + "weierstrass", + "circlemultiply", + "circleplus", + "emptyset", + "intersection", + "union", + "propersuperset", + "reflexsuperset", + "notsubset", + "propersubset", + "reflexsubset", + "element", + "notelement", + "angle", + "gradient", + "registerserif", + "copyrightserif", + "trademarkserif", + "product", + "radical", + "dotmath", + "logicalnot", + "logicaland", + "logicalor", + "arrowdblboth", + "arrowdblleft", + "arrowdblup", + "arrowdblright", + "arrowdbldown", + "lozenge", + "angleleft", + "registersans", + "copyrightsans", + "trademarksans", + "summation", + "parenlefttp", + "parenleftex", + "parenleftbt", + "bracketlefttp", + "bracketleftex", + "bracketleftbt", + "bracelefttp", + "braceleftmid", + "braceleftbt", + "braceex", + NULL, + "angleright", + "integral", + "integraltp", + "integralex", + "integralbt", + "parenrighttp", + "parenrightex", + "parenrightbt", + "bracketrighttp", + "bracketrightex", + "bracketrightbt", + "bracerighttp", + "bracerightmid", + "bracerightbt", + NULL +}; + +const char *zapfDingbatsEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "a1", + "a2", + "a202", + "a3", + "a4", + "a5", + "a119", + "a118", + "a117", + "a11", + "a12", + "a13", + "a14", + "a15", + "a16", + "a105", + "a17", + "a18", + "a19", + "a20", + "a21", + "a22", + "a23", + "a24", + "a25", + "a26", + "a27", + "a28", + "a6", + "a7", + "a8", + "a9", + "a10", + "a29", + "a30", + "a31", + "a32", + "a33", + "a34", + "a35", + "a36", + "a37", + "a38", + "a39", + "a40", + "a41", + "a42", + "a43", + "a44", + "a45", + "a46", + "a47", + "a48", + "a49", + "a50", + "a51", + "a52", + "a53", + "a54", + "a55", + "a56", + "a57", + "a58", + "a59", + "a60", + "a61", + "a62", + "a63", + "a64", + "a65", + "a66", + "a67", + "a68", + "a69", + "a70", + "a71", + "a72", + "a73", + "a74", + "a203", + "a75", + "a204", + "a76", + "a77", + "a78", + "a79", + "a81", + "a82", + "a83", + "a84", + "a97", + "a98", + "a99", + "a100", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "a101", + "a102", + "a103", + "a104", + "a106", + "a107", + "a108", + "a112", + "a111", + "a110", + "a109", + "a120", + "a121", + "a122", + "a123", + "a124", + "a125", + "a126", + "a127", + "a128", + "a129", + "a130", + "a131", + "a132", + "a133", + "a134", + "a135", + "a136", + "a137", + "a138", + "a139", + "a140", + "a141", + "a142", + "a143", + "a144", + "a145", + "a146", + "a147", + "a148", + "a149", + "a150", + "a151", + "a152", + "a153", + "a154", + "a155", + "a156", + "a157", + "a158", + "a159", + "a160", + "a161", + "a163", + "a164", + "a196", + "a165", + "a192", + "a166", + "a167", + "a168", + "a169", + "a170", + "a171", + "a172", + "a173", + "a162", + "a174", + "a175", + "a176", + "a177", + "a178", + "a179", + "a193", + "a180", + "a199", + "a181", + "a200", + "a182", + NULL, + "a201", + "a183", + "a184", + "a197", + "a185", + "a194", + "a198", + "a186", + "a195", + "a187", + "a188", + "a189", + "a190", + "a191", + NULL +}; diff --git a/poppler/FontEncodingTables.h b/poppler/FontEncodingTables.h new file mode 100644 index 0000000..a417b32 --- /dev/null +++ b/poppler/FontEncodingTables.h @@ -0,0 +1,20 @@ +//======================================================================== +// +// FontEncodingTables.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FONTENCODINGTABLES_H +#define FONTENCODINGTABLES_H + +extern const char *macRomanEncoding[]; +extern const char *macExpertEncoding[]; +extern const char *winAnsiEncoding[]; +extern const char *standardEncoding[]; +extern const char *expertEncoding[]; +extern const char *symbolEncoding[]; +extern const char *zapfDingbatsEncoding[]; + +#endif diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc new file mode 100644 index 0000000..35d5f5f --- /dev/null +++ b/poppler/FontInfo.cc @@ -0,0 +1,242 @@ +//======================================================================== +// +// FontInfo.cc +// +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2005-2008, 2010 Albert Astals Cid +// Copyright (C) 2005 Brad Hards +// Copyright (C) 2006 Kouhei Sutou +// Copyright (C) 2009 Pino Toscano +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010, 2012 Adrian Johnson +// Copyright (C) 2010 Thomas Freitag +// Copyright (C) 2011 Carlos Garcia Campos +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +//======================================================================== +// +// Based on code from pdffonts.cc +// +// Copyright 2001-2007 Glyph & Cog, LLC +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#include "GlobalParams.h" +#include "Error.h" +#include "Object.h" +#include "Dict.h" +#include "GfxFont.h" +#include "Annot.h" +#include "PDFDoc.h" +#include "FontInfo.h" + +FontInfoScanner::FontInfoScanner(PDFDoc *docA, int firstPage) { + doc = docA; + currentPage = firstPage + 1; +} + +FontInfoScanner::~FontInfoScanner() { +} + +GooList *FontInfoScanner::scan(int nPages) { + GooList *result; + Page *page; + Dict *resDict; + Annots *annots; + Object obj1; + int lastPage; + + if (currentPage > doc->getNumPages()) { + return NULL; + } + + result = new GooList(); + + lastPage = currentPage + nPages; + if (lastPage > doc->getNumPages() + 1) { + lastPage = doc->getNumPages() + 1; + } + + for (int pg = currentPage; pg < lastPage; ++pg) { + page = doc->getPage(pg); + if (!page) continue; + + if ((resDict = page->getResourceDict())) { + scanFonts(resDict, result); + } + annots = page->getAnnots(); + for (int i = 0; i < annots->getNumAnnots(); ++i) { + if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) { + scanFonts(obj1.getDict(), result); + } + obj1.free(); + } + } + + currentPage = lastPage; + + return result; +} + +void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) { + Object obj1, obj2, objDict, resObj; + Ref r; + GfxFontDict *gfxFontDict; + GfxFont *font; + int i; + + // scan the fonts in this resource dictionary + gfxFontDict = NULL; + resDict->lookupNF("Font", &obj1); + if (obj1.isRef()) { + obj1.fetch(doc->getXRef(), &obj2); + if (obj2.isDict()) { + r = obj1.getRef(); + gfxFontDict = new GfxFontDict(doc->getXRef(), &r, obj2.getDict()); + } + obj2.free(); + } else if (obj1.isDict()) { + gfxFontDict = new GfxFontDict(doc->getXRef(), NULL, obj1.getDict()); + } + if (gfxFontDict) { + for (i = 0; i < gfxFontDict->getNumFonts(); ++i) { + if ((font = gfxFontDict->getFont(i))) { + Ref fontRef = *font->getID(); + + // add this font to the list if not already found + if (fonts.find(fontRef.num) == fonts.end()) { + fontsList->append(new FontInfo(font, doc)); + fonts.insert(fontRef.num); + } + } + } + delete gfxFontDict; + } + obj1.free(); + + // recursively scan any resource dictionaries in objects in this + // resource dictionary + const char *resTypes[] = { "XObject", "Pattern" }; + for (Guint resType = 0; resType < sizeof(resTypes) / sizeof(resTypes[0]); ++resType) { + resDict->lookup(resTypes[resType], &objDict); + if (objDict.isDict()) { + for (i = 0; i < objDict.dictGetLength(); ++i) { + objDict.dictGetValNF(i, &obj1); + if (obj1.isRef()) { + // check for an already-seen object + const Ref r = obj1.getRef(); + if (visitedObjects.find(r.num) != visitedObjects.end()) { + obj1.free(); + continue; + } + + visitedObjects.insert(r.num); + } + + obj1.fetch(doc->getXRef(), &obj2); + + if (obj2.isStream()) { + obj2.streamGetDict()->lookup("Resources", &resObj); + if (resObj.isDict() && resObj.getDict() != resDict) { + scanFonts(resObj.getDict(), fontsList); + } + resObj.free(); + } + obj1.free(); + obj2.free(); + } + } + objDict.free(); + } +} + +FontInfo::FontInfo(GfxFont *font, PDFDoc *doc) { + GooString *origName; + Object fontObj, toUnicodeObj; + int i; + + fontRef = *font->getID(); + + // font name + origName = font->getName(); + if (origName != NULL) { + name = font->getName()->copy(); + } else { + name = NULL; + } + + // font type + type = (FontInfo::Type)font->getType(); + + // check for an embedded font + if (font->getType() == fontType3) { + emb = gTrue; + } else { + emb = font->getEmbeddedFontID(&embRef); + } + + file = NULL; + substituteName = NULL; + if (!emb) + { + SysFontType dummy; + int dummy2; + GooString substituteNameAux; + file = globalParams->findSystemFontFile(font, &dummy, &dummy2, &substituteNameAux); + if (substituteNameAux.getLength() > 0) + substituteName = substituteNameAux.copy(); + } + encoding = font->getEncodingName()->copy(); + + // look for a ToUnicode map + hasToUnicode = gFalse; + if (doc->getXRef()->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) { + hasToUnicode = fontObj.dictLookup("ToUnicode", &toUnicodeObj)->isStream(); + toUnicodeObj.free(); + } + fontObj.free(); + + // check for a font subset name: capital letters followed by a '+' + // sign + subset = gFalse; + if (name) { + for (i = 0; i < name->getLength(); ++i) { + if (name->getChar(i) < 'A' || name->getChar(i) > 'Z') { + break; + } + } + subset = i > 0 && i < name->getLength() && name->getChar(i) == '+'; + } +} + +FontInfo::FontInfo(FontInfo& f) { + name = f.name ? f.name->copy() : NULL; + file = f.file ? f.file->copy() : NULL; + encoding = f.encoding ? f.encoding->copy() : NULL; + substituteName = f.substituteName ? f.substituteName->copy() : NULL; + type = f.type; + emb = f.emb; + subset = f.subset; + hasToUnicode = f.hasToUnicode; + fontRef = f.fontRef; + embRef = f.embRef; +} + +FontInfo::~FontInfo() { + delete name; + delete file; + delete encoding; + if (substituteName) + delete substituteName; +} diff --git a/poppler/FontInfo.h b/poppler/FontInfo.h new file mode 100644 index 0000000..db90440 --- /dev/null +++ b/poppler/FontInfo.h @@ -0,0 +1,102 @@ +//======================================================================== +// +// FontInfo.h +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2005-2008, 2010, 2011 Albert Astals Cid +// Copyright (C) 2005 Brad Hards +// Copyright (C) 2009 Pino Toscano +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +//======================================================================== +// +// Based on code from pdffonts.cc +// +// Copyright 2001-2007 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FONT_INFO_H +#define FONT_INFO_H + +#include "Object.h" +#include "goo/gtypes.h" +#include "goo/GooList.h" + +class GfxFont; +class PDFDoc; + +class FontInfo { +public: + enum Type { + unknown, + Type1, + Type1C, + Type1COT, + Type3, + TrueType, + TrueTypeOT, + CIDType0, + CIDType0C, + CIDType0COT, + CIDTrueType, + CIDTrueTypeOT + }; + + // Constructor. + FontInfo(GfxFont *fontA, PDFDoc *doc); + // Copy constructor + FontInfo(FontInfo& f); + // Destructor. + ~FontInfo(); + + GooString *getName() { return name; }; + GooString *getSubstituteName() { return substituteName; }; + GooString *getFile() { return file; }; + GooString *getEncoding() { return encoding; }; + Type getType() { return type; }; + GBool getEmbedded() { return emb; }; + GBool getSubset() { return subset; }; + GBool getToUnicode() { return hasToUnicode; }; + Ref getRef() { return fontRef; }; + Ref getEmbRef() { return embRef; }; + +private: + GooString *name; + GooString *substituteName; + GooString *file; + GooString *encoding; + Type type; + GBool emb; + GBool subset; + GBool hasToUnicode; + Ref fontRef; + Ref embRef; +}; + +class FontInfoScanner { +public: + + // Constructor. + FontInfoScanner(PDFDoc *doc, int firstPage = 0); + // Destructor. + ~FontInfoScanner(); + + GooList *scan(int nPages); + +private: + + PDFDoc *doc; + int currentPage; + std::set fonts; + std::set visitedObjects; + + void scanFonts(Dict *resDict, GooList *fontsList); +}; + +#endif diff --git a/poppler/Form.cc b/poppler/Form.cc new file mode 100644 index 0000000..7d32ae0 --- /dev/null +++ b/poppler/Form.cc @@ -0,0 +1,1517 @@ +//======================================================================== +// +// Form.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2006-2008 Julien Rebetez +// Copyright 2007-2012 Albert Astals Cid +// Copyright 2007-2008, 2011 Carlos Garcia Campos +// Copyright 2007 Adrian Johnson +// Copyright 2007 Iñigo Martínez +// Copyright 2008, 2011 Pino Toscano +// Copyright 2008 Michael Vrable +// Copyright 2009 Matthias Drochner +// Copyright 2009 KDAB via Guillermo Amaral +// Copyright 2010, 2012 Mark Riedesel +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Gfx.h" +#include "Form.h" +#include "PDFDoc.h" +#include "XRef.h" +#include "PDFDocEncoding.h" +#include "Annot.h" +#include "Link.h" + +//return a newly allocated char* containing an UTF16BE string of size length +char* pdfDocEncodingToUTF16 (GooString* orig, int* length) +{ + //double size, a unicode char takes 2 char, add 2 for the unicode marker + *length = 2+2*orig->getLength(); + char *result = new char[(*length)]; + char *cstring = orig->getCString(); + //unicode marker + result[0] = 0xfe; + result[1] = 0xff; + //convert to utf16 + for(int i=2,j=0; i<(*length); i+=2,j++) { + Unicode u = pdfDocEncoding[(unsigned int)((unsigned char)cstring[j])]&0xffff; + result[i] = (u >> 8) & 0xff; + result[i+1] = u & 0xff; + } + return result; +} + +static GooString *convertToUtf16(GooString *pdfDocEncodingString) +{ + int tmp_length; + char* tmp_str = pdfDocEncodingToUTF16(pdfDocEncodingString, &tmp_length); + delete pdfDocEncodingString; + pdfDocEncodingString = new GooString(tmp_str, tmp_length); + delete [] tmp_str; + return pdfDocEncodingString; +} + + +FormWidget::FormWidget(PDFDoc *docA, Object *aobj, unsigned num, Ref aref, FormField *fieldA) +{ + ref = aref; + ID = 0; + childNum = num; + doc = docA; + xref = doc->getXRef(); + aobj->copy(&obj); + type = formUndef; + field = fieldA; + widget = NULL; +} + +FormWidget::~FormWidget() +{ + if (widget) + widget->decRefCnt(); + obj.free (); +} + +#ifdef DEBUG_FORMS +void FormWidget::print(int indent) { + printf ("%*s+ (%d %d): [widget]\n", indent, "", ref.num, ref.gen); +} +#endif + +void FormWidget::createWidgetAnnotation() { + if (widget) + return; + + Object obj1; + obj1.initRef(ref.num, ref.gen); + widget = new AnnotWidget(doc, obj.getDict(), &obj1, field); + obj1.free(); +} + +GBool FormWidget::inRect(double x, double y) const { + return widget ? widget->inRect(x, y) : gFalse; +} + +void FormWidget::getRect(double *x1, double *y1, double *x2, double *y2) const { + if (widget) + widget->getRect(x1, y1, x2, y2); +} + +double FormWidget::getFontSize() const { + return widget ? widget->getFontSize() : 0.; +} + +bool FormWidget::isReadOnly() const +{ + return field->isReadOnly(); +} + +GBool FormWidget::isModified() const { + return field->isModified(); +} + +int FormWidget::encodeID (unsigned pageNum, unsigned fieldNum) +{ + return (pageNum << 4*sizeof(unsigned)) + fieldNum; +} + +void FormWidget::decodeID (unsigned id, unsigned* pageNum, unsigned* fieldNum) +{ + *pageNum = id >> 4*sizeof(unsigned); + *fieldNum = (id << 4*sizeof(unsigned)) >> 4*sizeof(unsigned); +} + +GooString *FormWidget::getPartialName() const { + return field->getPartialName(); +} + +GooString *FormWidget::getAlternateUiName() const { + return field->getAlternateUiName(); +} + +GooString *FormWidget::getMappingName() const { + return field->getMappingName(); +} + +GooString *FormWidget::getFullyQualifiedName() { + return field->getFullyQualifiedName(); +} + +LinkAction *FormWidget::getActivationAction() { + return widget ? widget->getAction() : NULL; +} + +FormWidgetButton::FormWidgetButton (PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) : + FormWidget(docA, aobj, num, ref, p) +{ + type = formButton; + parent = static_cast(field); + onStr = NULL; + siblingsID = NULL; + numSiblingsID = 0; + + Object obj1, obj2; + + // Find the name of the ON state in the AP dictionnary + // The reference say the Off state, if it existe, _must_ be stored in the AP dict under the name /Off + // The "on" state may be stored under any other name + if (obj.dictLookup("AP", &obj1)->isDict()) { + if (obj1.dictLookup("N", &obj2)->isDict()) { + for (int i = 0; i < obj2.dictGetLength(); i++) { + char *key = obj2.dictGetKey(i); + if (strcmp (key, "Off") != 0) { + onStr = new GooString (key); + break; + } + } + } + obj2.free(); + } + obj1.free(); +} + +char *FormWidgetButton::getOnStr() { + if (onStr) + return onStr->getCString(); + + // 12.7.4.2.3 Check Boxes + // Yes should be used as the name for the on state + return parent->getButtonType() == formButtonCheck ? (char *)"Yes" : NULL; +} + +FormWidgetButton::~FormWidgetButton () +{ + if (siblingsID) + gfree(siblingsID); + delete onStr; +} + +FormButtonType FormWidgetButton::getButtonType () const +{ + return parent->getButtonType (); +} + +void FormWidgetButton::setAppearanceState(const char *state) { + if (!widget) + return; + widget->setAppearanceState(state); +} + +void FormWidgetButton::setState (GBool astate) +{ + //pushButtons don't have state + if (parent->getButtonType() == formButtonPush) + return; + + // Silently return if can't set ON state + if (astate && !onStr) + return; + + parent->setState(astate ? onStr->getCString() : (char *)"Off"); + // Parent will call setAppearanceState() +} + +GBool FormWidgetButton::getState () +{ + return onStr ? parent->getState(onStr->getCString()) : gFalse; +} + +void FormWidgetButton::setNumSiblingsID (int i) +{ + numSiblingsID = i; + siblingsID = (unsigned*)greallocn(siblingsID, numSiblingsID, sizeof(unsigned)); +} + + +FormWidgetText::FormWidgetText (PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) : + FormWidget(docA, aobj, num, ref, p) +{ + type = formText; + parent = static_cast(field); +} + +GooString* FormWidgetText::getContent () +{ + return parent->getContent(); +} + +GooString* FormWidgetText::getContentCopy () +{ + return parent->getContentCopy(); +} + +bool FormWidgetText::isMultiline () const +{ + return parent->isMultiline(); +} + +bool FormWidgetText::isPassword () const +{ + return parent->isPassword(); +} + +bool FormWidgetText::isFileSelect () const +{ + return parent->isFileSelect(); +} + +bool FormWidgetText::noSpellCheck () const +{ + return parent->noSpellCheck(); +} + +bool FormWidgetText::noScroll () const +{ + return parent->noScroll(); +} + +bool FormWidgetText::isComb () const +{ + return parent->isComb(); +} + +bool FormWidgetText::isRichText () const +{ + return parent->isRichText(); +} + +int FormWidgetText::getMaxLen () const +{ + return parent->getMaxLen (); +} + +void FormWidgetText::setContent(GooString* new_content) +{ + if (isReadOnly()) { + error(errInternal, -1, "FormWidgetText::setContentCopy called on a read only field\n"); + return; + } + + parent->setContentCopy(new_content); +} + +FormWidgetChoice::FormWidgetChoice(PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) : + FormWidget(docA, aobj, num, ref, p) +{ + type = formChoice; + parent = static_cast(field); +} + +FormWidgetChoice::~FormWidgetChoice() +{ +} + +bool FormWidgetChoice::_checkRange (int i) +{ + if (i < 0 || i >= parent->getNumChoices()) { + error(errInternal, -1, "FormWidgetChoice::_checkRange i out of range : {0:d}", i); + return false; + } + return true; +} + +void FormWidgetChoice::select (int i) +{ + if (isReadOnly()) { + error(errInternal, -1, "FormWidgetChoice::select called on a read only field\n"); + return; + } + if (!_checkRange(i)) return; + parent->select(i); +} + +void FormWidgetChoice::toggle (int i) +{ + if (isReadOnly()) { + error(errInternal, -1, "FormWidgetChoice::toggle called on a read only field\n"); + return; + } + if (!_checkRange(i)) return; + parent->toggle(i); +} + +void FormWidgetChoice::deselectAll () +{ + if (isReadOnly()) { + error(errInternal, -1, "FormWidgetChoice::deselectAll called on a read only field\n"); + return; + } + parent->deselectAll(); +} + +GooString* FormWidgetChoice::getEditChoice () +{ + if (!hasEdit()) { + error(errInternal, -1, "FormFieldChoice::getEditChoice called on a non-editable choice\n"); + return NULL; + } + return parent->getEditChoice(); +} + +bool FormWidgetChoice::isSelected (int i) +{ + if (!_checkRange(i)) return false; + return parent->isSelected(i); +} + +void FormWidgetChoice::setEditChoice (GooString* new_content) +{ + if (isReadOnly()) { + error(errInternal, -1, "FormWidgetText::setEditChoice called on a read only field\n"); + return; + } + if (!hasEdit()) { + error(errInternal, -1, "FormFieldChoice::setEditChoice : trying to edit an non-editable choice\n"); + return; + } + + parent->setEditChoice(new_content); +} + +int FormWidgetChoice::getNumChoices() +{ + return parent->getNumChoices(); +} + +GooString* FormWidgetChoice::getChoice(int i) +{ + return parent->getChoice(i); +} + +bool FormWidgetChoice::isCombo () const +{ + return parent->isCombo(); +} + +bool FormWidgetChoice::hasEdit () const +{ + return parent->hasEdit(); +} + +bool FormWidgetChoice::isMultiSelect () const +{ + return parent->isMultiSelect(); +} + +bool FormWidgetChoice::noSpellCheck () const +{ + return parent->noSpellCheck(); +} + +bool FormWidgetChoice::commitOnSelChange () const +{ + return parent->commitOnSelChange(); +} + +bool FormWidgetChoice::isListBox () const +{ + return parent->isListBox(); +} + +FormWidgetSignature::FormWidgetSignature(PDFDoc *docA, Object *aobj, unsigned num, Ref ref, FormField *p) : + FormWidget(docA, aobj, num, ref, p) +{ + type = formSignature; + parent = static_cast(field); +} + + +//======================================================================== +// FormField +//======================================================================== + +FormField::FormField(PDFDoc *docA, Object *aobj, const Ref& aref, FormField *parentA, std::set *usedParents, FormFieldType ty) +{ + doc = docA; + xref = doc->getXRef(); + aobj->copy(&obj); + Dict* dict = obj.getDict(); + ref.num = ref.gen = 0; + type = ty; + parent = parentA; + numChildren = 0; + children = NULL; + terminal = false; + widgets = NULL; + readOnly = false; + defaultAppearance = NULL; + fullyQualifiedName = NULL; + quadding = quaddingLeftJustified; + hasQuadding = gFalse; + modified = gFalse; + + ref = aref; + + Object obj1; + //childs + if (dict->lookup("Kids", &obj1)->isArray()) { + // Load children + for (int i = 0 ; i < obj1.arrayGetLength(); i++) { + Object childRef, childObj; + + if (!obj1.arrayGetNF(i, &childRef)->isRef()) { + error (errSyntaxError, -1, "Invalid form field renference"); + childRef.free(); + continue; + } + if (!obj1.arrayGet(i, &childObj)->isDict()) { + error (errSyntaxError, -1, "Form field child is not a dictionary"); + childObj.free(); + childRef.free(); + continue; + } + + const Ref ref = childRef.getRef(); + if (usedParents->find(ref.num) == usedParents->end()) { + Object obj2, obj3; + // Field child: it could be a form field or a widget or composed dict + if (childObj.dictLookupNF("Parent", &obj2)->isRef() || childObj.dictLookup("Parent", &obj3)->isDict()) { + // Child is a form field or composed dict + // We create the field, if it's composed + // it will create the widget as a child + std::set usedParentsAux = *usedParents; + usedParentsAux.insert(ref.num); + obj2.free(); + obj3.free(); + + if (terminal) { + error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n"); + continue; + } + + numChildren++; + children = (FormField**)greallocn(children, numChildren, sizeof(FormField*)); + children[numChildren - 1] = Form::createFieldFromDict(&childObj, doc, ref, this, &usedParentsAux); + } else if (childObj.dictLookup("Subtype", &obj2)->isName("Widget")) { + // Child is a widget annotation + if (!terminal && numChildren > 0) { + error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n"); + obj2.free(); + obj3.free(); + continue; + } + _createWidget(&childObj, ref); + } + obj2.free(); + obj3.free(); + } + childObj.free(); + childRef.free(); + } + } else { + // No children, if it's a composed dict, create the child widget + obj1.free(); + if (dict->lookup("Subtype", &obj1)->isName("Widget")) + _createWidget(&obj, ref); + } + obj1.free(); + + //flags + if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) { + int flags = obj1.getInt(); + if (flags & 0x1) { // 1 -> ReadOnly + readOnly = true; + } + if (flags & 0x2) { // 2 -> Required + //TODO + } + if (flags & 0x4) { // 3 -> NoExport + //TODO + } + } + obj1.free(); + + // Variable Text + if (Form::fieldLookup(dict, "DA", &obj1)->isString()) + defaultAppearance = obj1.getString()->copy(); + obj1.free(); + + if (Form::fieldLookup(dict, "Q", &obj1)->isInt()) { + quadding = static_cast(obj1.getInt()); + hasQuadding = gTrue; + } + obj1.free(); + + if (dict->lookup("T", &obj1)->isString()) { + partialName = obj1.getString()->copy(); + } else { + partialName = NULL; + } + obj1.free(); + + if (dict->lookup("TU", &obj1)->isString()) { + alternateUiName = obj1.getString()->copy(); + } else { + alternateUiName = NULL; + } + obj1.free(); + + if(dict->lookup("TM", &obj1)->isString()) { + mappingName = obj1.getString()->copy(); + } else { + mappingName = NULL; + } + obj1.free(); +} + +FormField::~FormField() +{ + if (!terminal) { + if(children) { + for (int i=0; iprint(indent + 4); + } else { + for (int i = 0; i < numChildren; i++) + children[i]->printTree(indent + 4); + } +} +#endif + +void FormField::fillChildrenSiblingsID() +{ + if (terminal) + return; + for (int i = 0; i < numChildren; i++) { + children[i]->fillChildrenSiblingsID(); + } +} + +void FormField::createWidgetAnnotations() { + if (terminal) { + for (int i = 0; i < numChildren; i++) + widgets[i]->createWidgetAnnotation(); + } else { + for (int i = 0; i < numChildren; i++) + children[i]->createWidgetAnnotations(); + } +} + +GBool FormField::isModified() const { + return modified ? gTrue : parent ? parent->isModified() : gFalse; +} + +void FormField::_createWidget (Object *obj, Ref aref) +{ + terminal = true; + numChildren++; + widgets = (FormWidget**)greallocn(widgets, numChildren, sizeof(FormWidget*)); + //ID = index in "widgets" table + switch (type) { + case formButton: + widgets[numChildren-1] = new FormWidgetButton(doc, obj, numChildren-1, aref, this); + break; + case formText: + widgets[numChildren-1] = new FormWidgetText(doc, obj, numChildren-1, aref, this); + break; + case formChoice: + widgets[numChildren-1] = new FormWidgetChoice(doc, obj, numChildren-1, aref, this); + break; + case formSignature: + widgets[numChildren-1] = new FormWidgetSignature(doc, obj, numChildren-1, aref, this); + break; + default: + error(errSyntaxWarning, -1, "SubType on non-terminal field, invalid document?"); + numChildren--; + terminal = false; + } +} + +FormWidget* FormField::findWidgetByRef (Ref aref) +{ + if (terminal) { + for(int i=0; igetRef().num == aref.num + && widgets[i]->getRef().gen == aref.gen) + return widgets[i]; + } + } else { + for(int i=0; ifindWidgetByRef(aref); + if(result) return result; + } + } + return NULL; +} + +GooString* FormField::getFullyQualifiedName() { + Object obj1, obj2; + Object parent; + GooString *parent_name; + GooString *full_name; + GBool unicode_encoded = gFalse; + + if (fullyQualifiedName) + return fullyQualifiedName; + + full_name = new GooString(); + + obj.copy(&obj1); + while (obj1.dictLookup("Parent", &parent)->isDict()) { + if (parent.dictLookup("T", &obj2)->isString()) { + parent_name = obj2.getString(); + + if (unicode_encoded) { + full_name->insert(0, "\0.", 2); // 2-byte unicode period + if (parent_name->hasUnicodeMarker()) { + full_name->insert(0, parent_name->getCString() + 2, parent_name->getLength() - 2); // Remove the unicode BOM + } else { + int tmp_length; + char* tmp_str = pdfDocEncodingToUTF16(parent_name, &tmp_length); + full_name->insert(0, tmp_str + 2, tmp_length - 2); // Remove the unicode BOM + delete [] tmp_str; + } + } else { + full_name->insert(0, '.'); // 1-byte ascii period + if (parent_name->hasUnicodeMarker()) { + unicode_encoded = gTrue; + full_name = convertToUtf16(full_name); + full_name->insert(0, parent_name->getCString() + 2, parent_name->getLength() - 2); // Remove the unicode BOM + } else { + full_name->insert(0, parent_name); + } + } + obj2.free(); + } + obj1.free(); + parent.copy(&obj1); + parent.free(); + } + obj1.free(); + parent.free(); + + if (partialName) { + if (unicode_encoded) { + if (partialName->hasUnicodeMarker()) { + full_name->append(partialName->getCString() + 2, partialName->getLength() - 2); // Remove the unicode BOM + } else { + int tmp_length; + char* tmp_str = pdfDocEncodingToUTF16(partialName, &tmp_length); + full_name->append(tmp_str + 2, tmp_length - 2); // Remove the unicode BOM + delete [] tmp_str; + } + } else { + if (partialName->hasUnicodeMarker()) { + unicode_encoded = gTrue; + full_name = convertToUtf16(full_name); + full_name->append(partialName->getCString() + 2, partialName->getLength() - 2); // Remove the unicode BOM + } else { + full_name->append(partialName); + } + } + } else { + int len = full_name->getLength(); + // Remove the last period + if (unicode_encoded) { + if (len > 1) { + full_name->del(len - 2, 2); + } + } else { + if (len > 0) { + full_name->del(len - 1, 1); + } + } + } + + if (unicode_encoded) { + full_name->insert(0, 0xff); + full_name->insert(0, 0xfe); + } + + fullyQualifiedName = full_name; + return fullyQualifiedName; +} + +//------------------------------------------------------------------------ +// FormFieldButton +//------------------------------------------------------------------------ +FormFieldButton::FormFieldButton(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set *usedParents) + : FormField(docA, aobj, ref, parent, usedParents, formButton) +{ + Dict* dict = obj.getDict(); + active_child = -1; + noAllOff = false; + appearanceState.initNull(); + + Object obj1; + btype = formButtonCheck; + if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) { + int flags = obj1.getInt(); + + if (flags & 0x10000) { // 17 -> push button + btype = formButtonPush; + } else if (flags & 0x8000) { // 16 -> radio button + btype = formButtonRadio; + if (flags & 0x4000) { // 15 -> noToggleToOff + noAllOff = true; + } + } + if (flags & 0x1000000) { // 26 -> radiosInUnison + error(errUnimplemented, -1, "FormFieldButton:: radiosInUnison flag unimplemented, please report a bug with a testcase\n"); + } + } + + if (btype != formButtonPush) { + // Even though V is inheritable we are interested in the value of this + // field, if not present it's probably because it's a button in a set. + dict->lookup("V", &appearanceState); + } +} + +#ifdef DEBUG_FORMS +static char *_getButtonType(FormButtonType type) +{ + switch (type) { + case formButtonPush: + return "push"; + case formButtonCheck: + return "check"; + case formButtonRadio: + return "radio"; + default: + break; + } + return "unknown"; +} + +void FormFieldButton::print(int indent) +{ + printf ("%*s- (%d %d): [%s] terminal: %s children: %d\n", indent, "", ref.num, ref.gen, + _getButtonType(btype), terminal ? "Yes" : "No", numChildren); +} +#endif + +void FormFieldButton::fillChildrenSiblingsID() +{ + if (!terminal) { + for(int i=0; ifillChildrenSiblingsID(); + } + } else { + for(int i=0; i(widgets[i]); + btn->setNumSiblingsID(numChildren-1); + for(int j=0, counter=0; jsetSiblingsID(counter, widgets[j]->getID()); + counter++; + } + } + } +} + +GBool FormFieldButton::setState(char *state) +{ + if (readOnly) { + error(errInternal, -1, "FormFieldButton::setState called on a readOnly field\n"); + return gFalse; + } + + // A check button could behave as a radio button + // when it's in a set of more than 1 buttons + if (btype != formButtonRadio && btype != formButtonCheck) + return gFalse; + + if (terminal && parent && parent->getType() == formButton && appearanceState.isNull()) { + // It's button in a set, set state on parent + if (static_cast(parent)->setState(state)) { + modified = gTrue; + return gTrue; + } + return gFalse; + } + + GBool isOn = strcmp(state, "Off") != 0; + + if (!isOn && noAllOff) + return gFalse; // Don't allow to set all radio to off + + char *current = getAppearanceState(); + GBool currentFound = gFalse, newFound = gFalse; + + for (int i = 0; i < numChildren; i++) { + FormWidgetButton *widget; + + // If radio button is a terminal field we want the widget at i, but + // if it's not terminal, the child widget is a composed dict, so + // we want the ony child widget of the children at i + if (terminal) + widget = static_cast(widgets[i]); + else + widget = static_cast(children[i]->getWidget(0)); + + if (!widget->getOnStr()) + continue; + + char *onStr = widget->getOnStr(); + if (current && strcmp(current, onStr) == 0) { + widget->setAppearanceState("Off"); + if (!isOn) + break; + currentFound = gTrue; + } + + if (isOn && strcmp(state, onStr) == 0) { + widget->setAppearanceState(state); + newFound = gTrue; + } + + if (currentFound && newFound) + break; + } + + updateState(state); + modified = gTrue; + + return gTrue; +} + +GBool FormFieldButton::getState(char *state) { + if (appearanceState.isName(state)) + return gTrue; + + return (parent && parent->getType() == formButton) ? static_cast(parent)->getState(state) : gFalse; +} + +void FormFieldButton::updateState(char *state) { + Object obj1; + + appearanceState.free(); + appearanceState.initName(state); + + appearanceState.copy(&obj1); + obj.getDict()->set("V", &obj1); + xref->setModifiedObject(&obj, ref); +} + +FormFieldButton::~FormFieldButton() +{ + appearanceState.free(); +} + +//------------------------------------------------------------------------ +// FormFieldText +//------------------------------------------------------------------------ +FormFieldText::FormFieldText(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set *usedParents) + : FormField(docA, aobj, ref, parent, usedParents, formText) +{ + Dict* dict = obj.getDict(); + Object obj1; + content = NULL; + multiline = password = fileSelect = doNotSpellCheck = doNotScroll = comb = richText = false; + maxLen = 0; + + if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) { + int flags = obj1.getInt(); + if (flags & 0x1000) // 13 -> Multiline + multiline = true; + if (flags & 0x2000) // 14 -> Password + password = true; + if (flags & 0x100000) // 21 -> FileSelect + fileSelect = true; + if (flags & 0x400000)// 23 -> DoNotSpellCheck + doNotSpellCheck = true; + if (flags & 0x800000) // 24 -> DoNotScroll + doNotScroll = true; + if (flags & 0x1000000) // 25 -> Comb + comb = true; + if (flags & 0x2000000)// 26 -> RichText + richText = true; + } + obj1.free(); + + if (Form::fieldLookup(dict, "MaxLen", &obj1)->isInt()) { + maxLen = obj1.getInt(); + } + obj1.free(); + + if (Form::fieldLookup(dict, "V", &obj1)->isString()) { + if (obj1.getString()->hasUnicodeMarker()) { + if (obj1.getString()->getLength() > 2) + content = obj1.getString()->copy(); + } else if (obj1.getString()->getLength() > 0) { + //non-unicode string -- assume pdfDocEncoding and try to convert to UTF16BE + int tmp_length; + char* tmp_str = pdfDocEncodingToUTF16(obj1.getString(), &tmp_length); + content = new GooString(tmp_str, tmp_length); + delete [] tmp_str; + } + } + obj1.free(); +} + +#ifdef DEBUG_FORMS +void FormFieldText::print(int indent) +{ + printf ("%*s- (%d %d): [text] terminal: %s children: %d\n", indent, "", ref.num, ref.gen, + terminal ? "Yes" : "No", numChildren); +} +#endif + +GooString* FormFieldText::getContentCopy () +{ + if (!content) return NULL; + return new GooString(content); +} + +void FormFieldText::setContentCopy (GooString* new_content) +{ + delete content; + content = NULL; + + if (new_content) { + content = new_content->copy(); + + //append the unicode marker if needed + if (!content->hasUnicodeMarker()) { + content->insert(0, 0xff); + content->insert(0, 0xfe); + } + } + + Object obj1; + obj1.initString(content ? content->copy() : new GooString("")); + obj.getDict()->set("V", &obj1); + xref->setModifiedObject(&obj, ref); + modified = gTrue; +} + +FormFieldText::~FormFieldText() +{ + delete content; +} + + +//------------------------------------------------------------------------ +// FormFieldChoice +//------------------------------------------------------------------------ +FormFieldChoice::FormFieldChoice(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set *usedParents) + : FormField(docA, aobj, ref, parent, usedParents, formChoice) +{ + numChoices = 0; + choices = NULL; + editedChoice = NULL; + topIdx = 0; + + Dict* dict = obj.getDict(); + Object obj1; + + combo = edit = multiselect = doNotSpellCheck = doCommitOnSelChange = false; + + if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) { + int flags = obj1.getInt(); + if (flags & 0x20000) // 18 -> Combo + combo = true; + if (flags & 0x40000) // 19 -> Edit + edit = true; + if (flags & 0x200000) // 22 -> MultiSelect + multiselect = true; + if (flags & 0x400000) // 23 -> DoNotSpellCheck + doNotSpellCheck = true; + if (flags & 0x4000000) // 27 -> CommitOnSelChange + doCommitOnSelChange = true; + } + obj1.free(); + + if (dict->lookup("TI", &obj1)->isInt()) + topIdx = obj1.getInt(); + obj1.free(); + + if (dict->lookup("Opt", &obj1)->isArray()) { + Object obj2; + + numChoices = obj1.arrayGetLength(); + choices = new ChoiceOpt[numChoices]; + memset(choices, 0, sizeof(ChoiceOpt) * numChoices); + + for (int i = 0; i < numChoices; i++) { + if (obj1.arrayGet(i, &obj2)->isString()) { + choices[i].optionName = obj2.getString()->copy(); + } else if (obj2.isArray()) { // [Export_value, Displayed_text] + Object obj3; + + if (obj2.arrayGetLength() < 2) { + error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- array's length < 2\n"); + continue; + } + if (obj2.arrayGet(0, &obj3)->isString()) + choices[i].exportVal = obj3.getString()->copy(); + else + error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- exported value not a string\n"); + obj3.free(); + + if (obj2.arrayGet(1, &obj3)->isString()) + choices[i].optionName = obj3.getString()->copy(); + else + error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- choice name not a string\n"); + obj3.free(); + } else { + error(errSyntaxError, -1, "FormWidgetChoice:: invalid {0:d} Opt entry\n", i); + } + obj2.free(); + } + } else { + //empty choice + } + obj1.free(); + + // find selected items and convert choice's human readable strings to UTF16 + if (Form::fieldLookup(dict, "V", &obj1)->isString()) { + for (int i = 0; i < numChoices; i++) { + if (!choices[i].optionName) + continue; + + if (choices[i].optionName->cmp(obj1.getString()) == 0) + choices[i].selected = true; + + if (!choices[i].optionName->hasUnicodeMarker()) { + int len; + char* buffer = pdfDocEncodingToUTF16(choices[i].optionName, &len); + choices[i].optionName->Set(buffer, len); + delete [] buffer; + } + } + } else if (obj1.isArray()) { + for (int i = 0; i < numChoices; i++) { + if (!choices[i].optionName) + continue; + + for (int j = 0; j < obj1.arrayGetLength(); j++) { + Object obj2; + + obj1.arrayGet(i, &obj2); + if (choices[i].optionName->cmp(obj2.getString()) == 0) { + choices[i].selected = true; + obj2.free(); + break; + } + obj2.free(); + } + + if (!choices[i].optionName->hasUnicodeMarker()) { + int len; + char* buffer = pdfDocEncodingToUTF16(choices[i].optionName, &len); + choices[i].optionName->Set(buffer, len); + delete [] buffer; + } + } + } + obj1.free(); +} + +FormFieldChoice::~FormFieldChoice() +{ + for (int i = 0; i < numChoices; i++) { + delete choices[i].exportVal; + delete choices[i].optionName; + } + delete [] choices; + delete editedChoice; +} + +#ifdef DEBUG_FORMS +void FormFieldChoice::print(int indent) +{ + printf ("%*s- (%d %d): [choice] terminal: %s children: %d\n", indent, "", ref.num, ref.gen, + terminal ? "Yes" : "No", numChildren); +} +#endif + +void FormFieldChoice::updateSelection() { + Object obj1; + + //this is an editable combo-box with user-entered text + if (edit && editedChoice) { + obj1.initString(editedChoice->copy()); + } else { + int numSelected = getNumSelected(); + if (numSelected == 0) { + obj1.initString(new GooString("")); + } else if (numSelected == 1) { + for (int i = 0; numChoices; i++) { + if (choices[i].optionName && choices[i].selected) { + obj1.initString(choices[i].optionName->copy()); + break; + } + } + } else { + obj1.initArray(xref); + for (int i = 0; i < numChoices; i++) { + if (choices[i].optionName && choices[i].selected) { + Object obj2; + obj2.initString(choices[i].optionName->copy()); + obj1.arrayAdd(&obj2); + } + } + } + } + + obj.getDict()->set("V", &obj1); + xref->setModifiedObject(&obj, ref); + modified = gTrue; +} + +void FormFieldChoice::unselectAll () +{ + for (int i = 0; i < numChoices; i++) { + choices[i].selected = false; + } +} + +void FormFieldChoice::deselectAll () { + unselectAll(); + updateSelection(); +} + +void FormFieldChoice::toggle (int i) +{ + choices[i].selected = !choices[i].selected; + updateSelection(); +} + +void FormFieldChoice::select (int i) +{ + if (!multiselect) + unselectAll(); + choices[i].selected = true; + updateSelection(); +} + +void FormFieldChoice::setEditChoice (GooString* new_content) +{ + delete editedChoice; + editedChoice = NULL; + + unselectAll(); + + if (new_content) { + editedChoice = new_content->copy(); + + //append the unicode marker if needed + if (!editedChoice->hasUnicodeMarker()) { + editedChoice->insert(0, 0xff); + editedChoice->insert(0, 0xfe); + } + } + updateSelection(); +} + +GooString* FormFieldChoice::getEditChoice () +{ + return editedChoice; +} + +int FormFieldChoice::getNumSelected () +{ + int cnt = 0; + for(int i=0; i *usedParents) + : FormField(docA, dict, ref, parent, usedParents, formSignature) +{ +} + +FormFieldSignature::~FormFieldSignature() +{ + +} + +#ifdef DEBUG_FORMS +void FormFieldSignature::print(int indent) +{ + printf ("%*s- (%d %d): [signature] terminal: %s children: %d\n", indent, "", ref.num, ref.gen, + terminal ? "Yes" : "No", numChildren); +} +#endif + +//------------------------------------------------------------------------ +// Form +//------------------------------------------------------------------------ + +Form::Form(PDFDoc *docA, Object* acroFormA) +{ + Object obj1; + + doc = docA; + xref = doc->getXRef(); + acroForm = acroFormA; + + size = 0; + numFields = 0; + rootFields = NULL; + quadding = quaddingLeftJustified; + defaultAppearance = NULL; + defaultResources = NULL; + + acroForm->dictLookup("NeedAppearances", &obj1); + needAppearances = (obj1.isBool() && obj1.getBool()); + obj1.free(); + + if (acroForm->dictLookup("DA", &obj1)->isString()) + defaultAppearance = obj1.getString()->copy(); + obj1.free(); + + if (acroForm->dictLookup("Q", &obj1)->isInt()) + quadding = static_cast(obj1.getInt()); + obj1.free(); + + acroForm->dictLookup("DR", &resDict); + if (resDict.isDict()) { + // At a minimum, this dictionary shall contain a Font entry + if (resDict.dictLookup("Font", &obj1)->isDict()) + defaultResources = new GfxResources(xref, resDict.getDict(), NULL); + obj1.free(); + } + if (!defaultResources) { + resDict.free(); + resDict.initNull(); + } + + acroForm->dictLookup("Fields", &obj1); + if (obj1.isArray()) { + Array *array = obj1.getArray(); + Object obj2; + + for(int i=0; igetLength(); i++) { + Object oref; + array->get(i, &obj2); + array->getNF(i, &oref); + if (!oref.isRef()) { + error(errSyntaxWarning, -1, "Direct object in rootFields"); + obj2.free(); + oref.free(); + continue; + } + + if (!obj2.isDict()) { + error(errSyntaxWarning, -1, "Reference in Fields array to an invalid or non existant object"); + obj2.free(); + oref.free(); + continue; + } + + if (numFields >= size) { + size += 16; + rootFields = (FormField**)greallocn(rootFields,size,sizeof(FormField*)); + } + + std::set usedParents; + rootFields[numFields++] = createFieldFromDict (&obj2, doc, oref.getRef(), NULL, &usedParents); + + obj2.free(); + oref.free(); + } + } else { + error(errSyntaxError, -1, "Can't get Fields array\n"); + } + obj1.free (); + +#ifdef DEBUG_FORMS + for (int i = 0; i < numFields; i++) + rootFields[i]->printTree(); +#endif +} + +Form::~Form() { + int i; + for(i = 0; i< numFields; ++i) + delete rootFields[i]; + gfree (rootFields); + delete defaultAppearance; + delete defaultResources; + resDict.free(); +} + +// Look up an inheritable field dictionary entry. +static Object *fieldLookup(Dict *field, const char *key, Object *obj, std::set *usedParents) { + Dict *dict; + Object parent; + + dict = field; + if (!dict->lookup(key, obj)->isNull()) { + return obj; + } + obj->free(); + dict->lookupNF("Parent", &parent); + if (parent.isRef()) { + const Ref ref = parent.getRef(); + if (usedParents->find(ref.num) == usedParents->end()) { + usedParents->insert(ref.num); + + Object obj2; + parent.fetch(dict->getXRef(), &obj2); + if (obj2.isDict()) { + fieldLookup(obj2.getDict(), key, obj, usedParents); + } else { + obj->initNull(); + } + obj2.free(); + } + } else if (parent.isDict()) { + fieldLookup(parent.getDict(), key, obj, usedParents); + } else { + obj->initNull(); + } + parent.free(); + return obj; +} + +Object *Form::fieldLookup(Dict *field, const char *key, Object *obj) { + std::set usedParents; + return ::fieldLookup(field, key, obj, &usedParents); +} + +FormField *Form::createFieldFromDict (Object* obj, PDFDoc *docA, const Ref& pref, FormField *parent, std::set *usedParents) +{ + Object obj2; + FormField *field; + + if (Form::fieldLookup(obj->getDict (), "FT", &obj2)->isName("Btn")) { + field = new FormFieldButton(docA, obj, pref, parent, usedParents); + } else if (obj2.isName("Tx")) { + field = new FormFieldText(docA, obj, pref, parent, usedParents); + } else if (obj2.isName("Ch")) { + field = new FormFieldChoice(docA, obj, pref, parent, usedParents); + } else if (obj2.isName("Sig")) { + field = new FormFieldSignature(docA, obj, pref, parent, usedParents); + } else { //we don't have an FT entry => non-terminal field + field = new FormField(docA, obj, pref, parent, usedParents); + } + obj2.free(); + + return field; +} + +void Form::postWidgetsLoad() +{ + // We create the widget annotations associated to + // every form widget here, because the AnnotWidget constructor + // needs the form object that gets from the catalog. When constructing + // a FormWidget the Catalog is still creating the form object + for (int i = 0; i < numFields; i++) { + rootFields[i]->fillChildrenSiblingsID(); + rootFields[i]->createWidgetAnnotations(); + } +} + +FormWidget* Form::findWidgetByRef (Ref aref) +{ + for(int i=0; ifindWidgetByRef(aref); + if(result) return result; + } + return NULL; +} + +//------------------------------------------------------------------------ +// FormPageWidgets +//------------------------------------------------------------------------ + +FormPageWidgets::FormPageWidgets (Annots *annots, unsigned int page, Form *form) +{ + numWidgets = 0; + widgets = NULL; + + if (annots && annots->getNumAnnots() > 0 && form) { + size = annots->getNumAnnots(); + widgets = (FormWidget**)greallocn(widgets, size, sizeof(FormWidget*)); + + /* For each entry in the page 'Annots' dict, try to find + a matching form field */ + for (int i = 0; i < size; ++i) { + Annot *annot = annots->getAnnot(i); + + if (annot->getType() != Annot::typeWidget) + continue; + + if (!annot->getHasRef()) { + /* Since all entry in a form field's kid dict needs to be + indirect references, if this annot isn't indirect, it isn't + related to a form field */ + continue; + } + + Ref r = annot->getRef(); + + /* Try to find a form field which either has this Annot in its Kids entry + or is merged with this Annot */ + FormWidget* tmp = form->findWidgetByRef(r); + if (tmp) { + // We've found a corresponding form field, link it + tmp->setID(FormWidget::encodeID(page, numWidgets)); + widgets[numWidgets++] = tmp; + } + } + } +} + +FormPageWidgets::~FormPageWidgets() +{ + gfree (widgets); +} diff --git a/poppler/Form.h b/poppler/Form.h new file mode 100644 index 0000000..fa3c718 --- /dev/null +++ b/poppler/Form.h @@ -0,0 +1,552 @@ +//======================================================================== +// +// Form.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2006 Julien Rebetez +// Copyright 2007, 2008, 2011 Carlos Garcia Campos +// Copyright 2007-2010 Albert Astals Cid +// Copyright 2010 Mark Riedesel +// Copyright 2011 Pino Toscano +// +//======================================================================== + +#ifndef FORM_H +#define FORM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +#include + +class GooString; +class Array; +class Dict; +class Annot; +class AnnotWidget; +class Annots; +class LinkAction; +class GfxResources; +class PDFDoc; + +enum FormFieldType { + formButton, + formText, + formChoice, + formSignature, + formUndef +}; + +enum FormButtonType { + formButtonCheck, + formButtonPush, + formButtonRadio +}; + +enum VariableTextQuadding { + quaddingLeftJustified, + quaddingCentered, + quaddingRightJustified +}; + +class Form; +class FormField; +class FormFieldButton; +class FormFieldText; +class FormFieldSignature; +class FormFieldChoice; + +//------------------------------------------------------------------------ +// FormWidget +// A FormWidget represents the graphical part of a field and is "attached" +// to a page. +//------------------------------------------------------------------------ + +class FormWidget { +public: + virtual ~FormWidget(); + + // Check if point is inside the field bounding rect + GBool inRect(double x, double y) const; + + // Get the field bounding rect + void getRect(double *x1, double *y1, double *x2, double *y2) const; + + unsigned getID () { return ID; } + void setID (unsigned int i) { ID=i; } + + FormField *getField () { return field; } + FormFieldType getType() { return type; } + + Object* getObj() { return &obj; } + Ref getRef() { return ref; } + + void setChildNum (unsigned i) { childNum = i; } + unsigned getChildNum () { return childNum; } + + double getFontSize() const; + + GooString *getPartialName() const; + GooString *getAlternateUiName() const; + GooString *getMappingName() const; + GooString *getFullyQualifiedName(); + + GBool isModified () const; + + bool isReadOnly() const; + + LinkAction *getActivationAction(); + + // return the unique ID corresponding to pageNum/fieldNum + static int encodeID (unsigned pageNum, unsigned fieldNum); + // decode id and retrieve pageNum and fieldNum + static void decodeID (unsigned id, unsigned* pageNum, unsigned* fieldNum); + + void createWidgetAnnotation(); + AnnotWidget *getWidgetAnnotation() const { return widget; } + +#ifdef DEBUG_FORMS + void print(int indent = 0); +#endif + +protected: + FormWidget(PDFDoc *docA, Object *aobj, unsigned num, Ref aref, FormField *fieldA); + + AnnotWidget *widget; + FormField* field; + FormFieldType type; + Object obj; + Ref ref; + PDFDoc *doc; + XRef *xref; + + //index of this field in the parent's child list + unsigned childNum; + + /* + Field ID is an (unsigned) integer, calculated as follow : + the first sizeof/2 bits are the field number, relative to the page + the last sizeof/2 bits are the page number + [page number | field number] + (encoding) id = (pageNum << 4*sizeof(unsigned)) + fieldNum; + (decoding) pageNum = id >> 4*sizeof(unsigned); fieldNum = (id << 4*sizeof(unsigned)) >> 4*sizeof(unsigned); + */ + unsigned ID; +}; + +//------------------------------------------------------------------------ +// FormWidgetButton +//------------------------------------------------------------------------ + +class FormWidgetButton: public FormWidget { +public: + FormWidgetButton(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p); + ~FormWidgetButton (); + + FormButtonType getButtonType() const; + + void setState (GBool state); + GBool getState (); + + char* getOnStr(); + void setAppearanceState(const char *state); + + void setNumSiblingsID (int i); + void setSiblingsID (int i, unsigned id) { siblingsID[i] = id; } + + //For radio buttons, return the IDs of the other radio buttons in the same group + unsigned* getSiblingsID () const { return siblingsID; } + int getNumSiblingsID () const { return numSiblingsID; } + +protected: + unsigned* siblingsID; // IDs of dependent buttons (each button of a radio field has all the others buttons + // of the same field in this array) + int numSiblingsID; + GooString *onStr; + FormFieldButton *parent; +}; + +//------------------------------------------------------------------------ +// FormWidgetText +//------------------------------------------------------------------------ + +class FormWidgetText: public FormWidget { +public: + FormWidgetText(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p); + //return the field's content (UTF16BE) + GooString* getContent() ; + //return a copy of the field's content (UTF16BE) + GooString* getContentCopy(); + + //except a UTF16BE string + void setContent(GooString* new_content); + + bool isMultiline () const; + bool isPassword () const; + bool isFileSelect () const; + bool noSpellCheck () const; + bool noScroll () const; + bool isComb () const; + bool isRichText () const; + int getMaxLen () const; +protected: + FormFieldText *parent; +}; + +//------------------------------------------------------------------------ +// FormWidgetChoice +//------------------------------------------------------------------------ + +class FormWidgetChoice: public FormWidget { +public: + FormWidgetChoice(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p); + ~FormWidgetChoice(); + + int getNumChoices(); + //return the display name of the i-th choice (UTF16BE) + GooString* getChoice(int i); + //select the i-th choice + void select (int i); + + //toggle selection of the i-th choice + void toggle (int i); + + //deselect everything + void deselectAll (); + + //except a UTF16BE string + //only work for editable combo box, set the user-entered text as the current choice + void setEditChoice(GooString* new_content); + + GooString* getEditChoice (); + + bool isSelected (int i); + + bool isCombo () const; + bool hasEdit () const; + bool isMultiSelect () const; + bool noSpellCheck () const; + bool commitOnSelChange () const; + bool isListBox () const; +protected: + bool _checkRange (int i); + FormFieldChoice *parent; +}; + +//------------------------------------------------------------------------ +// FormWidgetSignature +//------------------------------------------------------------------------ + +class FormWidgetSignature: public FormWidget { +public: + FormWidgetSignature(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p); +protected: + FormFieldSignature *parent; +}; + +//------------------------------------------------------------------------ +// FormField +// A FormField implements the logical side of a field and is "attached" to +// the Catalog. This is an internal class and client applications should +// only interact with FormWidgets. +//------------------------------------------------------------------------ + +class FormField { +public: + FormField(PDFDoc *docA, Object *aobj, const Ref& aref, FormField *parent, std::set *usedParents, FormFieldType t=formUndef); + + virtual ~FormField(); + + // Accessors. + FormFieldType getType() { return type; } + Object* getObj() { return &obj; } + Ref getRef() { return ref; } + + void setReadOnly (bool b) { readOnly = b; } + bool isReadOnly () const { return readOnly; } + + GBool isModified () const; + + GooString* getDefaultAppearance() const { return defaultAppearance; } + GBool hasTextQuadding() const { return hasQuadding; } + VariableTextQuadding getTextQuadding() const { return quadding; } + + GooString *getPartialName() const { return partialName; } + GooString *getAlternateUiName() const { return alternateUiName; } + GooString *getMappingName() const { return mappingName; } + GooString *getFullyQualifiedName(); + + FormWidget* findWidgetByRef (Ref aref); + FormWidget *getWidget(int i) { return terminal ? widgets[i] : NULL; } + + // only implemented in FormFieldButton + virtual void fillChildrenSiblingsID (); + + void createWidgetAnnotations(); + +#ifdef DEBUG_FORMS + void printTree(int indent = 0); + virtual void print(int indent = 0); +#endif + + + protected: + void _createWidget (Object *obj, Ref aref); + void createChildren(std::set *usedParents); + + FormFieldType type; // field type + Ref ref; + bool terminal; + Object obj; + PDFDoc *doc; + XRef *xref; + FormField **children; + FormField *parent; + int numChildren; + FormWidget **widgets; + bool readOnly; + GBool modified; + + GooString *partialName; // T field + GooString *alternateUiName; // TU field + GooString *mappingName; // TM field + GooString *fullyQualifiedName; + + // Variable Text + GooString *defaultAppearance; + GBool hasQuadding; + VariableTextQuadding quadding; + +private: + FormField() {} +}; + + +//------------------------------------------------------------------------ +// FormFieldButton +//------------------------------------------------------------------------ + +class FormFieldButton: public FormField { +public: + FormFieldButton(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set *usedParents); + + FormButtonType getButtonType () { return btype; } + + bool noToggleToOff () const { return noAllOff; } + + // returns gTrue if the state modification is accepted + GBool setState (char *state); + GBool getState(char *state); + + char *getAppearanceState() { return appearanceState.isName() ? appearanceState.getName() : NULL; } + + void fillChildrenSiblingsID (); + +#ifdef DEBUG_FORMS + void print(int indent = 0); +#endif + + virtual ~FormFieldButton(); +protected: + void updateState(char *state); + + FormButtonType btype; + int size; + int active_child; //only used for combo box + bool noAllOff; + Object appearanceState; // V +}; + +//------------------------------------------------------------------------ +// FormFieldText +//------------------------------------------------------------------------ + +class FormFieldText: public FormField { +public: + FormFieldText(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set *usedParents); + + GooString* getContent () { return content; } + GooString* getContentCopy (); + void setContentCopy (GooString* new_content); + virtual ~FormFieldText(); + + bool isMultiline () const { return multiline; } + bool isPassword () const { return password; } + bool isFileSelect () const { return fileSelect; } + bool noSpellCheck () const { return doNotSpellCheck; } + bool noScroll () const { return doNotScroll; } + bool isComb () const { return comb; } + bool isRichText () const { return richText; } + + int getMaxLen () const { return maxLen; } + +#ifdef DEBUG_FORMS + void print(int indent = 0); +#endif +protected: + GooString* content; + bool multiline; + bool password; + bool fileSelect; + bool doNotSpellCheck; + bool doNotScroll; + bool comb; + bool richText; + int maxLen; +}; + +//------------------------------------------------------------------------ +// FormFieldChoice +//------------------------------------------------------------------------ + +class FormFieldChoice: public FormField { +public: + FormFieldChoice(PDFDoc *docA, Object *aobj, const Ref& ref, FormField *parent, std::set *usedParents); + + virtual ~FormFieldChoice(); + + int getNumChoices() { return numChoices; } + GooString* getChoice(int i) { return choices ? choices[i].optionName : NULL; } + GooString* getExportVal (int i) { return choices ? choices[i].exportVal : NULL; } + // For multi-select choices it returns the first one + GooString* getSelectedChoice(); + + //select the i-th choice + void select (int i); + + //toggle selection of the i-th choice + void toggle (int i); + + //deselect everything + void deselectAll (); + + //only work for editable combo box, set the user-entered text as the current choice + void setEditChoice(GooString* new_content); + + GooString* getEditChoice (); + + bool isSelected (int i) { return choices[i].selected; } + + int getNumSelected (); + + bool isCombo () const { return combo; } + bool hasEdit () const { return edit; } + bool isMultiSelect () const { return multiselect; } + bool noSpellCheck () const { return doNotSpellCheck; } + bool commitOnSelChange () const { return doCommitOnSelChange; } + bool isListBox () const { return !combo; } + + int getTopIndex() const { return topIdx; } + +#ifdef DEBUG_FORMS + void print(int indent = 0); +#endif + +protected: + void unselectAll(); + void updateSelection(); + + bool combo; + bool edit; + bool multiselect; + bool doNotSpellCheck; + bool doCommitOnSelChange; + + struct ChoiceOpt { + GooString* exportVal; //the export value ("internal" name) + GooString* optionName; //displayed name + bool selected; //if this choice is selected + }; + + int numChoices; + ChoiceOpt* choices; + GooString* editedChoice; + int topIdx; // TI +}; + +//------------------------------------------------------------------------ +// FormFieldSignature +//------------------------------------------------------------------------ + +class FormFieldSignature: public FormField { +public: + FormFieldSignature(PDFDoc *docA, Object *dict, const Ref& ref, FormField *parent, std::set *usedParents); + + virtual ~FormFieldSignature(); + +#ifdef DEBUG_FORMS + void print(int indent = 0); +#endif +}; + +//------------------------------------------------------------------------ +// Form +// This class handle the document-wide part of Form (things in the acroForm +// Catalog entry). +//------------------------------------------------------------------------ + +class Form { +public: + Form(PDFDoc *docA, Object* acroForm); + + ~Form(); + + // Look up an inheritable field dictionary entry. + static Object *fieldLookup(Dict *field, const char *key, Object *obj); + + /* Creates a new Field of the type specified in obj's dict. + used in Form::Form and FormField::FormField */ + static FormField *createFieldFromDict (Object* obj, PDFDoc *docA, const Ref& aref, FormField *parent, std::set *usedParents); + + Object *getObj () const { return acroForm; } + GBool getNeedAppearances () const { return needAppearances; } + int getNumFields() const { return numFields; } + FormField* getRootField(int i) const { return rootFields[i]; } + GooString* getDefaultAppearance() const { return defaultAppearance; } + VariableTextQuadding getTextQuadding() const { return quadding; } + GfxResources* getDefaultResources() const { return defaultResources; } + Object* getDefaultResourcesObj() { return &resDict; } + + FormWidget* findWidgetByRef (Ref aref); + + void postWidgetsLoad(); +private: + FormField** rootFields; + int numFields; + int size; + PDFDoc *doc; + XRef* xref; + Object *acroForm; + GBool needAppearances; + GfxResources *defaultResources; + Object resDict; + + // Variable Text + GooString *defaultAppearance; + VariableTextQuadding quadding; +}; + +//------------------------------------------------------------------------ +// FormPageWidgets +//------------------------------------------------------------------------ + +class FormPageWidgets { +public: + FormPageWidgets (Annots* annots, unsigned int page, Form *form); + ~FormPageWidgets(); + + int getNumWidgets() const { return numWidgets; } + FormWidget* getWidget(int i) const { return widgets[i]; } + +private: + FormWidget** widgets; + int numWidgets; + int size; +}; + +#endif + diff --git a/poppler/Function.cc b/poppler/Function.cc new file mode 100644 index 0000000..2c3aa8a --- /dev/null +++ b/poppler/Function.cc @@ -0,0 +1,1724 @@ +//======================================================================== +// +// Function.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2008-2010 Albert Astals Cid +// Copyright (C) 2006 Jeff Muizelaar +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Andrea Canciani +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "goo/gmem.h" +#include "goo/gstrtod.h" +#include "Object.h" +#include "Dict.h" +#include "Stream.h" +#include "Error.h" +#include "Function.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +//------------------------------------------------------------------------ +// Function +//------------------------------------------------------------------------ + +Function::Function() { +} + +Function::~Function() { +} + +Function *Function::parse(Object *funcObj) { + std::set usedParents; + return parse(funcObj, &usedParents); +} + +Function *Function::parse(Object *funcObj, std::set *usedParents) { + Function *func; + Dict *dict; + int funcType; + Object obj1; + + if (funcObj->isStream()) { + dict = funcObj->streamGetDict(); + } else if (funcObj->isDict()) { + dict = funcObj->getDict(); + } else if (funcObj->isName("Identity")) { + return new IdentityFunction(); + } else { + error(errSyntaxError, -1, "Expected function dictionary or stream"); + return NULL; + } + + if (!dict->lookup("FunctionType", &obj1)->isInt()) { + error(errSyntaxError, -1, "Function type is missing or wrong type"); + obj1.free(); + return NULL; + } + funcType = obj1.getInt(); + obj1.free(); + + if (funcType == 0) { + func = new SampledFunction(funcObj, dict); + } else if (funcType == 2) { + func = new ExponentialFunction(funcObj, dict); + } else if (funcType == 3) { + func = new StitchingFunction(funcObj, dict, usedParents); + } else if (funcType == 4) { + func = new PostScriptFunction(funcObj, dict); + } else { + error(errSyntaxError, -1, "Unimplemented function type ({0:d})", funcType); + return NULL; + } + if (!func->isOk()) { + delete func; + return NULL; + } + + return func; +} + +GBool Function::init(Dict *dict) { + Object obj1, obj2; + int i; + + //----- Domain + if (!dict->lookup("Domain", &obj1)->isArray()) { + error(errSyntaxError, -1, "Function is missing domain"); + goto err2; + } + m = obj1.arrayGetLength() / 2; + if (m > funcMaxInputs) { + error(errSyntaxError, -1, "Functions with more than {0:d} inputs are unsupported", + funcMaxInputs); + goto err2; + } + for (i = 0; i < m; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function domain array"); + goto err1; + } + domain[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function domain array"); + goto err1; + } + domain[i][1] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + //----- Range + hasRange = gFalse; + n = 0; + if (dict->lookup("Range", &obj1)->isArray()) { + hasRange = gTrue; + n = obj1.arrayGetLength() / 2; + if (n > funcMaxOutputs) { + error(errSyntaxError, -1, "Functions with more than {0:d} outputs are unsupported", + funcMaxOutputs); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function range array"); + goto err1; + } + range[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function range array"); + goto err1; + } + range[i][1] = obj2.getNum(); + obj2.free(); + } + } + obj1.free(); + + return gTrue; + + err1: + obj2.free(); + err2: + obj1.free(); + return gFalse; +} + +//------------------------------------------------------------------------ +// IdentityFunction +//------------------------------------------------------------------------ + +IdentityFunction::IdentityFunction() { + int i; + + // fill these in with arbitrary values just in case they get used + // somewhere + m = funcMaxInputs; + n = funcMaxOutputs; + for (i = 0; i < funcMaxInputs; ++i) { + domain[i][0] = 0; + domain[i][1] = 1; + } + hasRange = gFalse; +} + +IdentityFunction::~IdentityFunction() { +} + +void IdentityFunction::transform(double *in, double *out) { + int i; + + for (i = 0; i < funcMaxOutputs; ++i) { + out[i] = in[i]; + } +} + +//------------------------------------------------------------------------ +// SampledFunction +//------------------------------------------------------------------------ + +SampledFunction::SampledFunction(Object *funcObj, Dict *dict) { + Stream *str; + int sampleBits; + double sampleMul; + Object obj1, obj2; + Guint buf, bitMask; + int bits; + Guint s; + double in[funcMaxInputs]; + int i, j, t, bit, idx; + + idxOffset = NULL; + samples = NULL; + sBuf = NULL; + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (!hasRange) { + error(errSyntaxError, -1, "Type 0 function is missing range"); + goto err1; + } + if (m > sampledFuncMaxInputs) { + error(errSyntaxError, -1, "Sampled functions with more than {0:d} inputs are unsupported", + sampledFuncMaxInputs); + goto err1; + } + + //----- buffer + sBuf = (double *)gmallocn(1 << m, sizeof(double)); + + //----- get the stream + if (!funcObj->isStream()) { + error(errSyntaxError, -1, "Type 0 function isn't a stream"); + goto err1; + } + str = funcObj->getStream(); + + //----- Size + if (!dict->lookup("Size", &obj1)->isArray() || + obj1.arrayGetLength() != m) { + error(errSyntaxError, -1, "Function has missing or invalid size array"); + goto err2; + } + for (i = 0; i < m; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isInt()) { + error(errSyntaxError, -1, "Illegal value in function size array"); + goto err3; + } + sampleSize[i] = obj2.getInt(); + if (sampleSize[i] <= 0) { + error(errSyntaxError, -1, "Illegal non-positive value in function size array"); + goto err3; + } + obj2.free(); + } + obj1.free(); + idxOffset = (int *)gmallocn(1 << m, sizeof(int)); + for (i = 0; i < (1<= 1; --j, t <<= 1) { + if (sampleSize[j] == 1) { + bit = 0; + } else { + bit = (t >> (m - 1)) & 1; + } + idx = (idx + bit) * sampleSize[j-1]; + } + if (sampleSize[0] == 1) { + bit = 0; + } else { + bit = (t >> (m - 1)) & 1; + } + idxOffset[i] = (idx + bit) * n; + } + + //----- BitsPerSample + if (!dict->lookup("BitsPerSample", &obj1)->isInt()) { + error(errSyntaxError, -1, "Function has missing or invalid BitsPerSample"); + goto err2; + } + sampleBits = obj1.getInt(); + sampleMul = 1.0 / (pow(2.0, (double)sampleBits) - 1); + obj1.free(); + + //----- Encode + if (dict->lookup("Encode", &obj1)->isArray() && + obj1.arrayGetLength() == 2*m) { + for (i = 0; i < m; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function encode array"); + goto err3; + } + encode[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function encode array"); + goto err3; + } + encode[i][1] = obj2.getNum(); + obj2.free(); + } + } else { + for (i = 0; i < m; ++i) { + encode[i][0] = 0; + encode[i][1] = sampleSize[i] - 1; + } + } + obj1.free(); + for (i = 0; i < m; ++i) { + inputMul[i] = (encode[i][1] - encode[i][0]) / + (domain[i][1] - domain[i][0]); + } + + //----- Decode + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() == 2*n) { + for (i = 0; i < n; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function decode array"); + goto err3; + } + decode[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function decode array"); + goto err3; + } + decode[i][1] = obj2.getNum(); + obj2.free(); + } + } else { + for (i = 0; i < n; ++i) { + decode[i][0] = range[i][0]; + decode[i][1] = range[i][1]; + } + } + obj1.free(); + + //----- samples + nSamples = n; + for (i = 0; i < m; ++i) + nSamples *= sampleSize[i]; + samples = (double *)gmallocn(nSamples, sizeof(double)); + buf = 0; + bits = 0; + bitMask = (1 << sampleBits) - 1; + str->reset(); + for (i = 0; i < nSamples; ++i) { + if (sampleBits == 8) { + s = str->getChar(); + } else if (sampleBits == 16) { + s = str->getChar(); + s = (s << 8) + str->getChar(); + } else if (sampleBits == 32) { + s = str->getChar(); + s = (s << 8) + str->getChar(); + s = (s << 8) + str->getChar(); + s = (s << 8) + str->getChar(); + } else { + while (bits < sampleBits) { + buf = (buf << 8) | (str->getChar() & 0xff); + bits += 8; + } + s = (buf >> (bits - sampleBits)) & bitMask; + bits -= sampleBits; + } + samples[i] = (double)s * sampleMul; + } + str->close(); + + // set up the cache + for (i = 0; i < m; ++i) { + in[i] = domain[i][0]; + cacheIn[i] = in[i] - 1; + } + transform(in, cacheOut); + + ok = gTrue; + return; + + err3: + obj2.free(); + err2: + obj1.free(); + err1: + return; +} + +SampledFunction::~SampledFunction() { + if (idxOffset) { + gfree(idxOffset); + } + if (samples) { + gfree(samples); + } + if (sBuf) { + gfree(sBuf); + } +} + +SampledFunction::SampledFunction(SampledFunction *func) { + memcpy(this, func, sizeof(SampledFunction)); + idxOffset = (int *)gmallocn(1 << m, sizeof(int)); + memcpy(idxOffset, func->idxOffset, (1 << m) * (int)sizeof(int)); + samples = (double *)gmallocn(nSamples, sizeof(double)); + memcpy(samples, func->samples, nSamples * sizeof(double)); + sBuf = (double *)gmallocn(1 << m, sizeof(double)); +} + +void SampledFunction::transform(double *in, double *out) { + double x; + int e[funcMaxInputs]; + double efrac0[funcMaxInputs]; + double efrac1[funcMaxInputs]; + int i, j, k, idx0, t; + + // check the cache + for (i = 0; i < m; ++i) { + if (in[i] != cacheIn[i]) { + break; + } + } + if (i == m) { + for (i = 0; i < n; ++i) { + out[i] = cacheOut[i]; + } + return; + } + + // map input values into sample array + for (i = 0; i < m; ++i) { + x = (in[i] - domain[i][0]) * inputMul[i] + encode[i][0]; + if (x < 0 || x != x) { // x!=x is a more portable version of isnan(x) + x = 0; + } else if (x > sampleSize[i] - 1) { + x = sampleSize[i] - 1; + } + e[i] = (int)x; + if (e[i] == sampleSize[i] - 1 && sampleSize[i] > 1) { + // this happens if in[i] = domain[i][1] + e[i] = sampleSize[i] - 2; + } + efrac1[i] = x - e[i]; + efrac0[i] = 1 - efrac1[i]; + } + + // compute index for the first sample to be used + idx0 = 0; + for (k = m - 1; k >= 1; --k) { + idx0 = (idx0 + e[k]) * sampleSize[k-1]; + } + idx0 = (idx0 + e[0]) * n; + + // for each output, do m-linear interpolation + for (i = 0; i < n; ++i) { + + // pull 2^m values out of the sample array + for (j = 0; j < (1<= 0 && idx < nSamples)) { + sBuf[j] = samples[idx]; + } else { + sBuf[j] = 0; // TODO Investigate if this is what Adobe does + } + } + + // do m sets of interpolations + for (j = 0, t = (1<>= 1) { + for (k = 0; k < t; k += 2) { + sBuf[k >> 1] = efrac0[j] * sBuf[k] + efrac1[j] * sBuf[k+1]; + } + } + + // map output value to range + out[i] = sBuf[0] * (decode[i][1] - decode[i][0]) + decode[i][0]; + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } + + // save current result in the cache + for (i = 0; i < m; ++i) { + cacheIn[i] = in[i]; + } + for (i = 0; i < n; ++i) { + cacheOut[i] = out[i]; + } +} + +//------------------------------------------------------------------------ +// ExponentialFunction +//------------------------------------------------------------------------ + +ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { + Object obj1, obj2; + int i; + + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (m != 1) { + error(errSyntaxError, -1, "Exponential function with more than one input"); + goto err1; + } + + //----- C0 + if (dict->lookup("C0", &obj1)->isArray()) { + if (hasRange && obj1.arrayGetLength() != n) { + error(errSyntaxError, -1, "Function's C0 array is wrong length"); + goto err2; + } + n = obj1.arrayGetLength(); + for (i = 0; i < n; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function C0 array"); + goto err3; + } + c0[i] = obj2.getNum(); + obj2.free(); + } + } else { + if (hasRange && n != 1) { + error(errSyntaxError, -1, "Function's C0 array is wrong length"); + goto err2; + } + n = 1; + c0[0] = 0; + } + obj1.free(); + + //----- C1 + if (dict->lookup("C1", &obj1)->isArray()) { + if (obj1.arrayGetLength() != n) { + error(errSyntaxError, -1, "Function's C1 array is wrong length"); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isNum()) { + error(errSyntaxError, -1, "Illegal value in function C1 array"); + goto err3; + } + c1[i] = obj2.getNum(); + obj2.free(); + } + } else { + if (n != 1) { + error(errSyntaxError, -1, "Function's C1 array is wrong length"); + goto err2; + } + c1[0] = 1; + } + obj1.free(); + + //----- N (exponent) + if (!dict->lookup("N", &obj1)->isNum()) { + error(errSyntaxError, -1, "Function has missing or invalid N"); + goto err2; + } + e = obj1.getNum(); + obj1.free(); + + isLinear = fabs(e-1.) < 1e-10; + ok = gTrue; + return; + + err3: + obj2.free(); + err2: + obj1.free(); + err1: + return; +} + +ExponentialFunction::~ExponentialFunction() { +} + +ExponentialFunction::ExponentialFunction(ExponentialFunction *func) { + memcpy(this, func, sizeof(ExponentialFunction)); +} + +void ExponentialFunction::transform(double *in, double *out) { + double x; + int i; + + if (in[0] < domain[0][0]) { + x = domain[0][0]; + } else if (in[0] > domain[0][1]) { + x = domain[0][1]; + } else { + x = in[0]; + } + for (i = 0; i < n; ++i) { + out[i] = c0[i] + (isLinear ? x : pow(x, e)) * (c1[i] - c0[i]); + if (hasRange) { + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } + } + return; +} + +//------------------------------------------------------------------------ +// StitchingFunction +//------------------------------------------------------------------------ + +StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict, std::set *usedParents) { + Object obj1, obj2; + int i; + + ok = gFalse; + funcs = NULL; + bounds = NULL; + encode = NULL; + scale = NULL; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (m != 1) { + error(errSyntaxError, -1, "Stitching function with more than one input"); + goto err1; + } + + //----- Functions + if (!dict->lookup("Functions", &obj1)->isArray()) { + error(errSyntaxError, -1, "Missing 'Functions' entry in stitching function"); + goto err1; + } + k = obj1.arrayGetLength(); + funcs = (Function **)gmallocn(k, sizeof(Function *)); + bounds = (double *)gmallocn(k + 1, sizeof(double)); + encode = (double *)gmallocn(2 * k, sizeof(double)); + scale = (double *)gmallocn(k, sizeof(double)); + for (i = 0; i < k; ++i) { + funcs[i] = NULL; + } + for (i = 0; i < k; ++i) { + std::set usedParentsAux = *usedParents; + obj1.arrayGetNF(i, &obj2); + if (obj2.isRef()) { + const Ref ref = obj2.getRef(); + if (usedParentsAux.find(ref.num) == usedParentsAux.end()) { + usedParentsAux.insert(ref.num); + obj2.free(); + obj1.arrayGet(i, &obj2); + } else { + goto err2; + } + } + if (!(funcs[i] = Function::parse(&obj2, &usedParentsAux))) { + goto err2; + } + if (funcs[i]->getInputSize() != 1 || + (i > 0 && funcs[i]->getOutputSize() != funcs[0]->getOutputSize())) { + error(errSyntaxError, -1, + "Incompatible subfunctions in stitching function"); + goto err2; + } + obj2.free(); + } + obj1.free(); + + //----- Bounds + if (!dict->lookup("Bounds", &obj1)->isArray() || + obj1.arrayGetLength() != k - 1) { + error(errSyntaxError, -1, "Missing or invalid 'Bounds' entry in stitching function"); + goto err1; + } + bounds[0] = domain[0][0]; + for (i = 1; i < k; ++i) { + if (!obj1.arrayGet(i - 1, &obj2)->isNum()) { + error(errSyntaxError, -1, "Invalid type in 'Bounds' array in stitching function"); + goto err2; + } + bounds[i] = obj2.getNum(); + obj2.free(); + } + bounds[k] = domain[0][1]; + obj1.free(); + + //----- Encode + if (!dict->lookup("Encode", &obj1)->isArray() || + obj1.arrayGetLength() != 2 * k) { + error(errSyntaxError, -1, "Missing or invalid 'Encode' entry in stitching function"); + goto err1; + } + for (i = 0; i < 2 * k; ++i) { + if (!obj1.arrayGet(i, &obj2)->isNum()) { + error(errSyntaxError, -1, "Invalid type in 'Encode' array in stitching function"); + goto err2; + } + encode[i] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + //----- pre-compute the scale factors + for (i = 0; i < k; ++i) { + if (bounds[i] == bounds[i+1]) { + // avoid a divide-by-zero -- in this situation, function i will + // never be used anyway + scale[i] = 0; + } else { + scale[i] = (encode[2*i+1] - encode[2*i]) / (bounds[i+1] - bounds[i]); + } + } + + n = funcs[0]->getOutputSize(); + ok = gTrue; + return; + + err2: + obj2.free(); + err1: + obj1.free(); +} + +StitchingFunction::StitchingFunction(StitchingFunction *func) { + int i; + + memcpy(this, func, sizeof(StitchingFunction)); + funcs = (Function **)gmallocn(k, sizeof(Function *)); + for (i = 0; i < k; ++i) { + funcs[i] = func->funcs[i]->copy(); + } + bounds = (double *)gmallocn(k + 1, sizeof(double)); + memcpy(bounds, func->bounds, (k + 1) * sizeof(double)); + encode = (double *)gmallocn(2 * k, sizeof(double)); + memcpy(encode, func->encode, 2 * k * sizeof(double)); + scale = (double *)gmallocn(k, sizeof(double)); + memcpy(scale, func->scale, k * sizeof(double)); + ok = gTrue; +} + +StitchingFunction::~StitchingFunction() { + int i; + + if (funcs) { + for (i = 0; i < k; ++i) { + if (funcs[i]) { + delete funcs[i]; + } + } + } + gfree(funcs); + gfree(bounds); + gfree(encode); + gfree(scale); +} + +void StitchingFunction::transform(double *in, double *out) { + double x; + int i; + + if (in[0] < domain[0][0]) { + x = domain[0][0]; + } else if (in[0] > domain[0][1]) { + x = domain[0][1]; + } else { + x = in[0]; + } + for (i = 0; i < k - 1; ++i) { + if (x < bounds[i+1]) { + break; + } + } + x = encode[2*i] + (x - bounds[i]) * scale[i]; + funcs[i]->transform(&x, out); +} + +//------------------------------------------------------------------------ +// PostScriptFunction +//------------------------------------------------------------------------ + +enum PSOp { + psOpAbs, + psOpAdd, + psOpAnd, + psOpAtan, + psOpBitshift, + psOpCeiling, + psOpCopy, + psOpCos, + psOpCvi, + psOpCvr, + psOpDiv, + psOpDup, + psOpEq, + psOpExch, + psOpExp, + psOpFalse, + psOpFloor, + psOpGe, + psOpGt, + psOpIdiv, + psOpIndex, + psOpLe, + psOpLn, + psOpLog, + psOpLt, + psOpMod, + psOpMul, + psOpNe, + psOpNeg, + psOpNot, + psOpOr, + psOpPop, + psOpRoll, + psOpRound, + psOpSin, + psOpSqrt, + psOpSub, + psOpTrue, + psOpTruncate, + psOpXor, + psOpIf, + psOpIfelse, + psOpReturn +}; + +// Note: 'if' and 'ifelse' are parsed separately. +// The rest are listed here in alphabetical order. +// The index in this table is equivalent to the entry in PSOp. +static const char *psOpNames[] = { + "abs", + "add", + "and", + "atan", + "bitshift", + "ceiling", + "copy", + "cos", + "cvi", + "cvr", + "div", + "dup", + "eq", + "exch", + "exp", + "false", + "floor", + "ge", + "gt", + "idiv", + "index", + "le", + "ln", + "log", + "lt", + "mod", + "mul", + "ne", + "neg", + "not", + "or", + "pop", + "roll", + "round", + "sin", + "sqrt", + "sub", + "true", + "truncate", + "xor" +}; + +#define nPSOps (sizeof(psOpNames) / sizeof(char *)) + +enum PSObjectType { + psBool, + psInt, + psReal, + psOperator, + psBlock +}; + +// In the code array, 'if'/'ifelse' operators take up three slots +// plus space for the code in the subclause(s). +// +// +---------------------------------+ +// | psOperator: psOpIf / psOpIfelse | +// +---------------------------------+ +// | psBlock: ptr= | +// +---------------------------------+ +// | psBlock: ptr= | +// +---------------------------------+ +// | if clause | +// | ... | +// | psOperator: psOpReturn | +// +---------------------------------+ +// | else clause | +// | ... | +// | psOperator: psOpReturn | +// +---------------------------------+ +// | ... | +// +// For 'if', pointer is present in the code stream but unused. + +struct PSObject { + PSObjectType type; + union { + GBool booln; // boolean (stack only) + int intg; // integer (stack and code) + double real; // real (stack and code) + PSOp op; // operator (code only) + int blk; // if/ifelse block pointer (code only) + }; +}; + +#define psStackSize 100 + +class PSStack { +public: + + PSStack() {sp = psStackSize; } + void clear() { sp = psStackSize; } + void pushBool(GBool booln) + { + if (checkOverflow()) { + stack[--sp].type = psBool; + stack[sp].booln = booln; + } + } + void pushInt(int intg) + { + if (checkOverflow()) { + stack[--sp].type = psInt; + stack[sp].intg = intg; + } + } + void pushReal(double real) + { + if (checkOverflow()) { + stack[--sp].type = psReal; + stack[sp].real = real; + } + } + GBool popBool() + { + if (checkUnderflow() && checkType(psBool, psBool)) { + return stack[sp++].booln; + } + return gFalse; + } + int popInt() + { + if (checkUnderflow() && checkType(psInt, psInt)) { + return stack[sp++].intg; + } + return 0; + } + double popNum() + { + double ret; + + if (checkUnderflow() && checkType(psInt, psReal)) { + ret = (stack[sp].type == psInt) ? (double)stack[sp].intg : stack[sp].real; + ++sp; + return ret; + } + return 0; + } + GBool empty() { return sp == psStackSize; } + GBool topIsInt() { return sp < psStackSize && stack[sp].type == psInt; } + GBool topTwoAreInts() + { return sp < psStackSize - 1 && + stack[sp].type == psInt && + stack[sp+1].type == psInt; } + GBool topIsReal() { return sp < psStackSize && stack[sp].type == psReal; } + GBool topTwoAreNums() + { return sp < psStackSize - 1 && + (stack[sp].type == psInt || stack[sp].type == psReal) && + (stack[sp+1].type == psInt || stack[sp+1].type == psReal); } + void copy(int n); + void roll(int n, int j); + void index(int i) + { + if (!checkOverflow()) { + return; + } + --sp; + if (sp + i + 1 >= psStackSize) { + error(errSyntaxError, -1, "Stack underflow in PostScript function"); + return; + } + stack[sp] = stack[sp + 1 + i]; + } + void pop() + { + if (!checkUnderflow()) { + return; + } + ++sp; + } + +private: + + GBool checkOverflow(int n = 1) + { + if (sp - n < 0) { + error(errSyntaxError, -1, "Stack overflow in PostScript function"); + return gFalse; + } + return gTrue; + } + GBool checkUnderflow() + { + if (sp == psStackSize) { + error(errSyntaxError, -1, "Stack underflow in PostScript function"); + return gFalse; + } + return gTrue; + } + GBool checkType(PSObjectType t1, PSObjectType t2) + { + if (stack[sp].type != t1 && stack[sp].type != t2) { + error(errSyntaxError, -1, "Type mismatch in PostScript function"); + return gFalse; + } + return gTrue; + } + PSObject stack[psStackSize]; + int sp; +}; + + +void PSStack::copy(int n) { + int i; + + if (sp + n > psStackSize) { + error(errSyntaxError, -1, "Stack underflow in PostScript function"); + return; + } + if (!checkOverflow(n)) { + return; + } + for (i = sp + n - 1; i >= sp; --i) { + stack[i - n] = stack[i]; + } + sp -= n; +} + +void PSStack::roll(int n, int j) { + PSObject obj; + int i, k; + + if (unlikely(n == 0)) { + return; + } + if (j >= 0) { + j %= n; + } else { + j = -j % n; + if (j != 0) { + j = n - j; + } + } + if (n <= 0 || j == 0 || n > psStackSize || sp + n > psStackSize) { + return; + } + if (j <= n / 2) { + for (i = 0; i < j; ++i) { + obj = stack[sp]; + for (k = sp; k < sp + n - 1; ++k) { + stack[k] = stack[k+1]; + } + stack[sp + n - 1] = obj; + } + } else { + j = n - j; + for (i = 0; i < j; ++i) { + obj = stack[sp + n - 1]; + for (k = sp + n - 1; k > sp; --k) { + stack[k] = stack[k-1]; + } + stack[sp] = obj; + } + } +} + +PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) { + Stream *str; + int codePtr; + GooString *tok; + double in[funcMaxInputs]; + int i; + + code = NULL; + codeString = NULL; + codeSize = 0; + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (!hasRange) { + error(errSyntaxError, -1, "Type 4 function is missing range"); + goto err1; + } + + //----- get the stream + if (!funcObj->isStream()) { + error(errSyntaxError, -1, "Type 4 function isn't a stream"); + goto err1; + } + str = funcObj->getStream(); + + //----- parse the function + codeString = new GooString(); + str->reset(); + if (!(tok = getToken(str)) || tok->cmp("{")) { + error(errSyntaxError, -1, "Expected '{' at start of PostScript function"); + if (tok) { + delete tok; + } + goto err1; + } + delete tok; + codePtr = 0; + if (!parseCode(str, &codePtr)) { + goto err2; + } + str->close(); + + //----- set up the cache + for (i = 0; i < m; ++i) { + in[i] = domain[i][0]; + cacheIn[i] = in[i] - 1; + } + transform(in, cacheOut); + + ok = gTrue; + + err2: + str->close(); + err1: + return; +} + +PostScriptFunction::PostScriptFunction(PostScriptFunction *func) { + memcpy(this, func, sizeof(PostScriptFunction)); + code = (PSObject *)gmallocn(codeSize, sizeof(PSObject)); + memcpy(code, func->code, codeSize * sizeof(PSObject)); + codeString = func->codeString->copy(); +} + +PostScriptFunction::~PostScriptFunction() { + gfree(code); + delete codeString; +} + +void PostScriptFunction::transform(double *in, double *out) { + PSStack stack; + int i; + + // check the cache + for (i = 0; i < m; ++i) { + if (in[i] != cacheIn[i]) { + break; + } + } + if (i == m) { + for (i = 0; i < n; ++i) { + out[i] = cacheOut[i]; + } + return; + } + + for (i = 0; i < m; ++i) { + //~ may need to check for integers here + stack.pushReal(in[i]); + } + exec(&stack, 0); + for (i = n - 1; i >= 0; --i) { + out[i] = stack.popNum(); + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } + stack.clear(); + + // if (!stack->empty()) { + // error(errSyntaxWarning, -1, + // "Extra values on stack at end of PostScript function"); + // } + + // save current result in the cache + for (i = 0; i < m; ++i) { + cacheIn[i] = in[i]; + } + for (i = 0; i < n; ++i) { + cacheOut[i] = out[i]; + } +} + +GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) { + GooString *tok; + char *p; + GBool isReal; + int opPtr, elsePtr; + int a, b, mid, cmp; + + while (1) { + if (!(tok = getToken(str))) { + error(errSyntaxError, -1, "Unexpected end of PostScript function stream"); + return gFalse; + } + p = tok->getCString(); + if (isdigit(*p) || *p == '.' || *p == '-') { + isReal = gFalse; + for (; *p; ++p) { + if (*p == '.') { + isReal = gTrue; + break; + } + } + resizeCode(*codePtr); + if (isReal) { + code[*codePtr].type = psReal; + code[*codePtr].real = gatof(tok->getCString()); + } else { + code[*codePtr].type = psInt; + code[*codePtr].intg = atoi(tok->getCString()); + } + ++*codePtr; + delete tok; + } else if (!tok->cmp("{")) { + delete tok; + opPtr = *codePtr; + *codePtr += 3; + resizeCode(opPtr + 2); + if (!parseCode(str, codePtr)) { + return gFalse; + } + if (!(tok = getToken(str))) { + error(errSyntaxError, -1, "Unexpected end of PostScript function stream"); + return gFalse; + } + if (!tok->cmp("{")) { + elsePtr = *codePtr; + if (!parseCode(str, codePtr)) { + return gFalse; + } + delete tok; + if (!(tok = getToken(str))) { + error(errSyntaxError, -1, "Unexpected end of PostScript function stream"); + return gFalse; + } + } else { + elsePtr = -1; + } + if (!tok->cmp("if")) { + if (elsePtr >= 0) { + error(errSyntaxError, -1, + "Got 'if' operator with two blocks in PostScript function"); + return gFalse; + } + code[opPtr].type = psOperator; + code[opPtr].op = psOpIf; + code[opPtr+2].type = psBlock; + code[opPtr+2].blk = *codePtr; + } else if (!tok->cmp("ifelse")) { + if (elsePtr < 0) { + error(errSyntaxError, -1, + "Got 'ifelse' operator with one block in PostScript function"); + return gFalse; + } + code[opPtr].type = psOperator; + code[opPtr].op = psOpIfelse; + code[opPtr+1].type = psBlock; + code[opPtr+1].blk = elsePtr; + code[opPtr+2].type = psBlock; + code[opPtr+2].blk = *codePtr; + } else { + error(errSyntaxError, -1, + "Expected if/ifelse operator in PostScript function"); + delete tok; + return gFalse; + } + delete tok; + } else if (!tok->cmp("}")) { + delete tok; + resizeCode(*codePtr); + code[*codePtr].type = psOperator; + code[*codePtr].op = psOpReturn; + ++*codePtr; + break; + } else { + a = -1; + b = nPSOps; + cmp = 0; // make gcc happy + // invariant: psOpNames[a] < tok < psOpNames[b] + while (b - a > 1) { + mid = (a + b) / 2; + cmp = tok->cmp(psOpNames[mid]); + if (cmp > 0) { + a = mid; + } else if (cmp < 0) { + b = mid; + } else { + a = b = mid; + } + } + if (cmp != 0) { + error(errSyntaxError, -1, + "Unknown operator '{0:t}' in PostScript function", + tok); + delete tok; + return gFalse; + } + delete tok; + resizeCode(*codePtr); + code[*codePtr].type = psOperator; + code[*codePtr].op = (PSOp)a; + ++*codePtr; + } + } + return gTrue; +} + +GooString *PostScriptFunction::getToken(Stream *str) { + GooString *s; + int c; + GBool comment; + + s = new GooString(); + comment = gFalse; + while (1) { + if ((c = str->getChar()) == EOF) { + break; + } + codeString->append(c); + if (comment) { + if (c == '\x0a' || c == '\x0d') { + comment = gFalse; + } + } else if (c == '%') { + comment = gTrue; + } else if (!isspace(c)) { + break; + } + } + if (c == '{' || c == '}') { + s->append((char)c); + } else if (isdigit(c) || c == '.' || c == '-') { + while (1) { + s->append((char)c); + c = str->lookChar(); + if (c == EOF || !(isdigit(c) || c == '.' || c == '-')) { + break; + } + str->getChar(); + codeString->append(c); + } + } else { + while (1) { + s->append((char)c); + c = str->lookChar(); + if (c == EOF || !isalnum(c)) { + break; + } + str->getChar(); + codeString->append(c); + } + } + return s; +} + +void PostScriptFunction::resizeCode(int newSize) { + if (newSize >= codeSize) { + codeSize += 64; + code = (PSObject *)greallocn(code, codeSize, sizeof(PSObject)); + } +} + +void PostScriptFunction::exec(PSStack *stack, int codePtr) { + int i1, i2; + double r1, r2, result; + GBool b1, b2; + + while (1) { + switch (code[codePtr].type) { + case psInt: + stack->pushInt(code[codePtr++].intg); + break; + case psReal: + stack->pushReal(code[codePtr++].real); + break; + case psOperator: + switch (code[codePtr++].op) { + case psOpAbs: + if (stack->topIsInt()) { + stack->pushInt(abs(stack->popInt())); + } else { + stack->pushReal(fabs(stack->popNum())); + } + break; + case psOpAdd: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 + i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 + r2); + } + break; + case psOpAnd: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 & i2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 && b2); + } + break; + case psOpAtan: + r2 = stack->popNum(); + r1 = stack->popNum(); + result = atan2(r1, r2) * 180.0 / M_PI; + if (result < 0) result += 360.0; + stack->pushReal(result); + break; + case psOpBitshift: + i2 = stack->popInt(); + i1 = stack->popInt(); + if (i2 > 0) { + stack->pushInt(i1 << i2); + } else if (i2 < 0) { + stack->pushInt((int)((Guint)i1 >> -i2)); + } else { + stack->pushInt(i1); + } + break; + case psOpCeiling: + if (!stack->topIsInt()) { + stack->pushReal(ceil(stack->popNum())); + } + break; + case psOpCopy: + stack->copy(stack->popInt()); + break; + case psOpCos: + stack->pushReal(cos(stack->popNum() * M_PI / 180.0)); + break; + case psOpCvi: + if (!stack->topIsInt()) { + stack->pushInt((int)stack->popNum()); + } + break; + case psOpCvr: + if (!stack->topIsReal()) { + stack->pushReal(stack->popNum()); + } + break; + case psOpDiv: + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 / r2); + break; + case psOpDup: + stack->copy(1); + break; + case psOpEq: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 == i2); + } else if (stack->topTwoAreNums()) { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 == r2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 == b2); + } + break; + case psOpExch: + stack->roll(2, 1); + break; + case psOpExp: + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(pow(r1, r2)); + break; + case psOpFalse: + stack->pushBool(gFalse); + break; + case psOpFloor: + if (!stack->topIsInt()) { + stack->pushReal(floor(stack->popNum())); + } + break; + case psOpGe: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 >= i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 >= r2); + } + break; + case psOpGt: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 > i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 > r2); + } + break; + case psOpIdiv: + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 / i2); + break; + case psOpIndex: + stack->index(stack->popInt()); + break; + case psOpLe: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 <= i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 <= r2); + } + break; + case psOpLn: + stack->pushReal(log(stack->popNum())); + break; + case psOpLog: + stack->pushReal(log10(stack->popNum())); + break; + case psOpLt: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 < i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 < r2); + } + break; + case psOpMod: + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 % i2); + break; + case psOpMul: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + //~ should check for out-of-range, and push a real instead + stack->pushInt(i1 * i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 * r2); + } + break; + case psOpNe: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 != i2); + } else if (stack->topTwoAreNums()) { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 != r2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 != b2); + } + break; + case psOpNeg: + if (stack->topIsInt()) { + stack->pushInt(-stack->popInt()); + } else { + stack->pushReal(-stack->popNum()); + } + break; + case psOpNot: + if (stack->topIsInt()) { + stack->pushInt(~stack->popInt()); + } else { + stack->pushBool(!stack->popBool()); + } + break; + case psOpOr: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 | i2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 || b2); + } + break; + case psOpPop: + stack->pop(); + break; + case psOpRoll: + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->roll(i1, i2); + break; + case psOpRound: + if (!stack->topIsInt()) { + r1 = stack->popNum(); + stack->pushReal((r1 >= 0) ? floor(r1 + 0.5) : ceil(r1 - 0.5)); + } + break; + case psOpSin: + stack->pushReal(sin(stack->popNum() * M_PI / 180.0)); + break; + case psOpSqrt: + stack->pushReal(sqrt(stack->popNum())); + break; + case psOpSub: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 - i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 - r2); + } + break; + case psOpTrue: + stack->pushBool(gTrue); + break; + case psOpTruncate: + if (!stack->topIsInt()) { + r1 = stack->popNum(); + stack->pushReal((r1 >= 0) ? floor(r1) : ceil(r1)); + } + break; + case psOpXor: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 ^ i2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 ^ b2); + } + break; + case psOpIf: + b1 = stack->popBool(); + if (b1) { + exec(stack, codePtr + 2); + } + codePtr = code[codePtr + 1].blk; + break; + case psOpIfelse: + b1 = stack->popBool(); + if (b1) { + exec(stack, codePtr + 2); + } else { + exec(stack, code[codePtr].blk); + } + codePtr = code[codePtr + 1].blk; + break; + case psOpReturn: + return; + } + break; + default: + error(errSyntaxError, -1, "Internal: bad object in PostScript function code"); + break; + } + } +} diff --git a/poppler/Function.h b/poppler/Function.h new file mode 100644 index 0000000..a456dfe --- /dev/null +++ b/poppler/Function.h @@ -0,0 +1,251 @@ +//======================================================================== +// +// Function.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009, 2010 Albert Astals Cid +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Andrea Canciani +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef FUNCTION_H +#define FUNCTION_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" +#include + +class Dict; +class Stream; +struct PSObject; +class PSStack; +class PopplerCache; + +//------------------------------------------------------------------------ +// Function +//------------------------------------------------------------------------ + +#define funcMaxInputs 32 +#define funcMaxOutputs 32 +#define sampledFuncMaxInputs 16 + +class Function { +public: + + Function(); + + virtual ~Function(); + + // Construct a function. Returns NULL if unsuccessful. + static Function *parse(Object *funcObj); + + // Initialize the entries common to all function types. + GBool init(Dict *dict); + + virtual Function *copy() = 0; + + // Return the function type: + // -1 : identity + // 0 : sampled + // 2 : exponential + // 3 : stitching + // 4 : PostScript + virtual int getType() = 0; + + // Return size of input and output tuples. + int getInputSize() { return m; } + int getOutputSize() { return n; } + + double getDomainMin(int i) { return domain[i][0]; } + double getDomainMax(int i) { return domain[i][1]; } + double getRangeMin(int i) { return range[i][0]; } + double getRangeMax(int i) { return range[i][1]; } + GBool getHasRange() { return hasRange; } + + // Transform an input tuple into an output tuple. + virtual void transform(double *in, double *out) = 0; + + virtual GBool isOk() = 0; + +protected: + static Function *parse(Object *funcObj, std::set *usedParents); + + int m, n; // size of input and output tuples + double // min and max values for function domain + domain[funcMaxInputs][2]; + double // min and max values for function range + range[funcMaxOutputs][2]; + GBool hasRange; // set if range is defined +}; + +//------------------------------------------------------------------------ +// IdentityFunction +//------------------------------------------------------------------------ + +class IdentityFunction: public Function { +public: + + IdentityFunction(); + virtual ~IdentityFunction(); + virtual Function *copy() { return new IdentityFunction(); } + virtual int getType() { return -1; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return gTrue; } + +private: +}; + +//------------------------------------------------------------------------ +// SampledFunction +//------------------------------------------------------------------------ + +class SampledFunction: public Function { +public: + + SampledFunction(Object *funcObj, Dict *dict); + virtual ~SampledFunction(); + virtual Function *copy() { return new SampledFunction(this); } + virtual int getType() { return 0; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + int getSampleSize(int i) { return sampleSize[i]; } + double getEncodeMin(int i) { return encode[i][0]; } + double getEncodeMax(int i) { return encode[i][1]; } + double getDecodeMin(int i) { return decode[i][0]; } + double getDecodeMax(int i) { return decode[i][1]; } + double *getSamples() { return samples; } + +private: + + SampledFunction(SampledFunction *func); + + int // number of samples for each domain element + sampleSize[funcMaxInputs]; + double // min and max values for domain encoder + encode[funcMaxInputs][2]; + double // min and max values for range decoder + decode[funcMaxOutputs][2]; + double // input multipliers + inputMul[funcMaxInputs]; + int *idxOffset; + double *samples; // the samples + int nSamples; // size of the samples array + double *sBuf; // buffer for the transform function + double cacheIn[funcMaxInputs]; + double cacheOut[funcMaxOutputs]; + GBool ok; +}; + +//------------------------------------------------------------------------ +// ExponentialFunction +//------------------------------------------------------------------------ + +class ExponentialFunction: public Function { +public: + + ExponentialFunction(Object *funcObj, Dict *dict); + virtual ~ExponentialFunction(); + virtual Function *copy() { return new ExponentialFunction(this); } + virtual int getType() { return 2; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + double *getC0() { return c0; } + double *getC1() { return c1; } + double getE() { return e; } + +private: + + ExponentialFunction(ExponentialFunction *func); + + double c0[funcMaxOutputs]; + double c1[funcMaxOutputs]; + double e; + bool isLinear; + GBool ok; +}; + +//------------------------------------------------------------------------ +// StitchingFunction +//------------------------------------------------------------------------ + +class StitchingFunction: public Function { +public: + + StitchingFunction(Object *funcObj, Dict *dict, std::set *usedParents); + virtual ~StitchingFunction(); + virtual Function *copy() { return new StitchingFunction(this); } + virtual int getType() { return 3; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + int getNumFuncs() { return k; } + Function *getFunc(int i) { return funcs[i]; } + double *getBounds() { return bounds; } + double *getEncode() { return encode; } + double *getScale() { return scale; } + +private: + + StitchingFunction(StitchingFunction *func); + + int k; + Function **funcs; + double *bounds; + double *encode; + double *scale; + GBool ok; +}; + +//------------------------------------------------------------------------ +// PostScriptFunction +//------------------------------------------------------------------------ + +class PostScriptFunction: public Function { +public: + + PostScriptFunction(Object *funcObj, Dict *dict); + virtual ~PostScriptFunction(); + virtual Function *copy() { return new PostScriptFunction(this); } + virtual int getType() { return 4; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + GooString *getCodeString() { return codeString; } + +private: + + PostScriptFunction(PostScriptFunction *func); + GBool parseCode(Stream *str, int *codePtr); + GooString *getToken(Stream *str); + void resizeCode(int newSize); + void exec(PSStack *stack, int codePtr); + + GooString *codeString; + PSObject *code; + int codeSize; + double cacheIn[funcMaxInputs]; + double cacheOut[funcMaxOutputs]; + GBool ok; +}; + +#endif diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc new file mode 100644 index 0000000..4e663b4 --- /dev/null +++ b/poppler/Gfx.cc @@ -0,0 +1,5372 @@ +//======================================================================== +// +// Gfx.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2005-2012 Albert Astals Cid +// Copyright (C) 2006 Thorkild Stray +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2006-2011 Carlos Garcia Campos +// Copyright (C) 2006, 2007 Jeff Muizelaar +// Copyright (C) 2007, 2008 Brad Hards +// Copyright (C) 2007, 2011 Adrian Johnson +// Copyright (C) 2007, 2008 Iñigo Martínez +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2007 Krzysztof Kowalczyk +// Copyright (C) 2008 Pino Toscano +// Copyright (C) 2008 Michael Vrable +// Copyright (C) 2008 Hib Eris +// Copyright (C) 2009 M Joonas Pihlaja +// Copyright (C) 2009-2012 Thomas Freitag +// Copyright (C) 2009 William Bader +// Copyright (C) 2009, 2010 David Benjamin +// Copyright (C) 2010 Nils Höglund +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Axel Strübing +// Copyright (C) 2012 Even Rouault +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "goo/gmem.h" +#include "goo/GooTimer.h" +#include "goo/GooHash.h" +#include "GlobalParams.h" +#include "CharTypes.h" +#include "Object.h" +#include "PDFDoc.h" +#include "Array.h" +#include "Dict.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "GfxFont.h" +#include "GfxState.h" +#include "OutputDev.h" +#include "Page.h" +#include "Annot.h" +#include "Error.h" +#include "Gfx.h" +#include "ProfileData.h" +#include "Catalog.h" +#include "OptionalContent.h" + +// the MSVC math.h doesn't define this +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +//------------------------------------------------------------------------ +// constants +//------------------------------------------------------------------------ + +// Max recursive depth for a function shading fill. +#define functionMaxDepth 6 + +// Max delta allowed in any color component for a function shading fill. +#define functionColorDelta (dblToCol(1 / 256.0)) + +// Max number of splits along the t axis for an axial shading fill. +#define axialMaxSplits 256 + +// Max delta allowed in any color component for an axial shading fill. +#define axialColorDelta (dblToCol(1 / 256.0)) + +// Max number of splits along the t axis for a radial shading fill. +#define radialMaxSplits 256 + +// Max delta allowed in any color component for a radial shading fill. +#define radialColorDelta (dblToCol(1 / 256.0)) + +// Max recursive depth for a Gouraud triangle shading fill. +// +// Triangles will be split at most gouraudMaxDepth times (each time into 4 +// smaller ones). That makes pow(4,gouraudMaxDepth) many triangles for +// every triangle. +#define gouraudMaxDepth 6 + +// Max delta allowed in any color component for a Gouraud triangle +// shading fill. +#define gouraudColorDelta (dblToCol(3. / 256.0)) + +// Gouraud triangle: if the three color parameters differ by at more than this percend of +// the total color parameter range, the triangle will be refined +#define gouraudParameterizedColorDelta 5e-3 + +// Max recursive depth for a patch mesh shading fill. +#define patchMaxDepth 6 + +// Max delta allowed in any color component for a patch mesh shading +// fill. +#define patchColorDelta (dblToCol((3. / 256.0))) + +//------------------------------------------------------------------------ +// Operator table +//------------------------------------------------------------------------ + +#ifdef _MSC_VER // this works around a bug in the VC7 compiler +# pragma optimize("",off) +#endif + +Operator Gfx::opTab[] = { + {"\"", 3, {tchkNum, tchkNum, tchkString}, + &Gfx::opMoveSetShowText}, + {"'", 1, {tchkString}, + &Gfx::opMoveShowText}, + {"B", 0, {tchkNone}, + &Gfx::opFillStroke}, + {"B*", 0, {tchkNone}, + &Gfx::opEOFillStroke}, + {"BDC", 2, {tchkName, tchkProps}, + &Gfx::opBeginMarkedContent}, + {"BI", 0, {tchkNone}, + &Gfx::opBeginImage}, + {"BMC", 1, {tchkName}, + &Gfx::opBeginMarkedContent}, + {"BT", 0, {tchkNone}, + &Gfx::opBeginText}, + {"BX", 0, {tchkNone}, + &Gfx::opBeginIgnoreUndef}, + {"CS", 1, {tchkName}, + &Gfx::opSetStrokeColorSpace}, + {"DP", 2, {tchkName, tchkProps}, + &Gfx::opMarkPoint}, + {"Do", 1, {tchkName}, + &Gfx::opXObject}, + {"EI", 0, {tchkNone}, + &Gfx::opEndImage}, + {"EMC", 0, {tchkNone}, + &Gfx::opEndMarkedContent}, + {"ET", 0, {tchkNone}, + &Gfx::opEndText}, + {"EX", 0, {tchkNone}, + &Gfx::opEndIgnoreUndef}, + {"F", 0, {tchkNone}, + &Gfx::opFill}, + {"G", 1, {tchkNum}, + &Gfx::opSetStrokeGray}, + {"ID", 0, {tchkNone}, + &Gfx::opImageData}, + {"J", 1, {tchkInt}, + &Gfx::opSetLineCap}, + {"K", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeCMYKColor}, + {"M", 1, {tchkNum}, + &Gfx::opSetMiterLimit}, + {"MP", 1, {tchkName}, + &Gfx::opMarkPoint}, + {"Q", 0, {tchkNone}, + &Gfx::opRestore}, + {"RG", 3, {tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeRGBColor}, + {"S", 0, {tchkNone}, + &Gfx::opStroke}, + {"SC", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeColor}, + {"SCN", -33, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN}, + &Gfx::opSetStrokeColorN}, + {"T*", 0, {tchkNone}, + &Gfx::opTextNextLine}, + {"TD", 2, {tchkNum, tchkNum}, + &Gfx::opTextMoveSet}, + {"TJ", 1, {tchkArray}, + &Gfx::opShowSpaceText}, + {"TL", 1, {tchkNum}, + &Gfx::opSetTextLeading}, + {"Tc", 1, {tchkNum}, + &Gfx::opSetCharSpacing}, + {"Td", 2, {tchkNum, tchkNum}, + &Gfx::opTextMove}, + {"Tf", 2, {tchkName, tchkNum}, + &Gfx::opSetFont}, + {"Tj", 1, {tchkString}, + &Gfx::opShowText}, + {"Tm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opSetTextMatrix}, + {"Tr", 1, {tchkInt}, + &Gfx::opSetTextRender}, + {"Ts", 1, {tchkNum}, + &Gfx::opSetTextRise}, + {"Tw", 1, {tchkNum}, + &Gfx::opSetWordSpacing}, + {"Tz", 1, {tchkNum}, + &Gfx::opSetHorizScaling}, + {"W", 0, {tchkNone}, + &Gfx::opClip}, + {"W*", 0, {tchkNone}, + &Gfx::opEOClip}, + {"b", 0, {tchkNone}, + &Gfx::opCloseFillStroke}, + {"b*", 0, {tchkNone}, + &Gfx::opCloseEOFillStroke}, + {"c", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opCurveTo}, + {"cm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opConcat}, + {"cs", 1, {tchkName}, + &Gfx::opSetFillColorSpace}, + {"d", 2, {tchkArray, tchkNum}, + &Gfx::opSetDash}, + {"d0", 2, {tchkNum, tchkNum}, + &Gfx::opSetCharWidth}, + {"d1", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opSetCacheDevice}, + {"f", 0, {tchkNone}, + &Gfx::opFill}, + {"f*", 0, {tchkNone}, + &Gfx::opEOFill}, + {"g", 1, {tchkNum}, + &Gfx::opSetFillGray}, + {"gs", 1, {tchkName}, + &Gfx::opSetExtGState}, + {"h", 0, {tchkNone}, + &Gfx::opClosePath}, + {"i", 1, {tchkNum}, + &Gfx::opSetFlat}, + {"j", 1, {tchkInt}, + &Gfx::opSetLineJoin}, + {"k", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillCMYKColor}, + {"l", 2, {tchkNum, tchkNum}, + &Gfx::opLineTo}, + {"m", 2, {tchkNum, tchkNum}, + &Gfx::opMoveTo}, + {"n", 0, {tchkNone}, + &Gfx::opEndPath}, + {"q", 0, {tchkNone}, + &Gfx::opSave}, + {"re", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opRectangle}, + {"rg", 3, {tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillRGBColor}, + {"ri", 1, {tchkName}, + &Gfx::opSetRenderingIntent}, + {"s", 0, {tchkNone}, + &Gfx::opCloseStroke}, + {"sc", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillColor}, + {"scn", -33, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN}, + &Gfx::opSetFillColorN}, + {"sh", 1, {tchkName}, + &Gfx::opShFill}, + {"v", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opCurveTo1}, + {"w", 1, {tchkNum}, + &Gfx::opSetLineWidth}, + {"y", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opCurveTo2}, +}; + +#ifdef _MSC_VER // this works around a bug in the VC7 compiler +# pragma optimize("",on) +#endif + +#define numOps (sizeof(opTab) / sizeof(Operator)) + +static inline GBool isSameGfxColor(const GfxColor &colorA, const GfxColor &colorB, Guint nComps, double delta) { + for (Guint k = 0; k < nComps; ++k) { + if (abs(colorA.c[k] - colorB.c[k]) > delta) { + return false; + } + } + return true; +} + +//------------------------------------------------------------------------ +// GfxResources +//------------------------------------------------------------------------ + +GfxResources::GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA) : + gStateCache(2, xref) { + Object obj1, obj2; + Ref r; + + if (resDict) { + + // build font dictionary + fonts = NULL; + resDict->lookupNF("Font", &obj1); + if (obj1.isRef()) { + obj1.fetch(xref, &obj2); + if (obj2.isDict()) { + r = obj1.getRef(); + fonts = new GfxFontDict(xref, &r, obj2.getDict()); + } + obj2.free(); + } else if (obj1.isDict()) { + fonts = new GfxFontDict(xref, NULL, obj1.getDict()); + } + obj1.free(); + + // get XObject dictionary + resDict->lookup("XObject", &xObjDict); + + // get color space dictionary + resDict->lookup("ColorSpace", &colorSpaceDict); + + // get pattern dictionary + resDict->lookup("Pattern", &patternDict); + + // get shading dictionary + resDict->lookup("Shading", &shadingDict); + + // get graphics state parameter dictionary + resDict->lookup("ExtGState", &gStateDict); + + // get properties dictionary + resDict->lookup("Properties", &propertiesDict); + + } else { + fonts = NULL; + xObjDict.initNull(); + colorSpaceDict.initNull(); + patternDict.initNull(); + shadingDict.initNull(); + gStateDict.initNull(); + propertiesDict.initNull(); + } + + next = nextA; +} + +GfxResources::~GfxResources() { + if (fonts) { + delete fonts; + } + xObjDict.free(); + colorSpaceDict.free(); + patternDict.free(); + shadingDict.free(); + gStateDict.free(); + propertiesDict.free(); +} + +GfxFont *GfxResources::lookupFont(char *name) { + GfxFont *font; + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->fonts) { + if ((font = resPtr->fonts->lookup(name))) + return font; + } + } + error(errSyntaxError, -1, "Unknown font tag '{0:s}'", name); + return NULL; +} + +GBool GfxResources::lookupXObject(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->xObjDict.isDict()) { + if (!resPtr->xObjDict.dictLookup(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(errSyntaxError, -1, "XObject '{0:s}' is unknown", name); + return gFalse; +} + +GBool GfxResources::lookupXObjectNF(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->xObjDict.isDict()) { + if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(errSyntaxError, -1, "XObject '{0:s}' is unknown", name); + return gFalse; +} + +GBool GfxResources::lookupMarkedContentNF(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->propertiesDict.isDict()) { + if (!resPtr->propertiesDict.dictLookupNF(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(errSyntaxError, -1, "Marked Content '{0:s}' is unknown", name); + return gFalse; +} + +void GfxResources::lookupColorSpace(const char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->colorSpaceDict.isDict()) { + if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) { + return; + } + obj->free(); + } + } + obj->initNull(); +} + +GfxPattern *GfxResources::lookupPattern(char *name, Gfx *gfx) { + GfxResources *resPtr; + GfxPattern *pattern; + Object obj; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->patternDict.isDict()) { + if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) { + pattern = GfxPattern::parse(&obj, gfx); + obj.free(); + return pattern; + } + obj.free(); + } + } + error(errSyntaxError, -1, "Unknown pattern '{0:s}'", name); + return NULL; +} + +GfxShading *GfxResources::lookupShading(char *name, Gfx *gfx) { + GfxResources *resPtr; + GfxShading *shading; + Object obj; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->shadingDict.isDict()) { + if (!resPtr->shadingDict.dictLookup(name, &obj)->isNull()) { + shading = GfxShading::parse(&obj, gfx); + obj.free(); + return shading; + } + obj.free(); + } + } + error(errSyntaxError, -1, "ExtGState '{0:s}' is unknown", name); + return NULL; +} + +GBool GfxResources::lookupGState(char *name, Object *obj) { + if (!lookupGStateNF(name, obj)) + return gFalse; + + if (!obj->isRef()) + return gTrue; + + const Ref ref = obj->getRef(); + if (!gStateCache.lookup(ref, obj)->isNull()) + return gTrue; + obj->free(); + + gStateCache.put(ref)->copy(obj); + return gTrue; +} + +GBool GfxResources::lookupGStateNF(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->gStateDict.isDict()) { + if (!resPtr->gStateDict.dictLookupNF(name, obj)->isNull()) { + return gTrue; + } + obj->free(); + } + } + error(errSyntaxError, -1, "ExtGState '{0:s}' is unknown", name); + return gFalse; +} + +//------------------------------------------------------------------------ +// Gfx +//------------------------------------------------------------------------ + +Gfx::Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict, + double hDPI, double vDPI, PDFRectangle *box, + PDFRectangle *cropBox, int rotate, + GBool (*abortCheckCbkA)(void *data), + void *abortCheckCbkDataA) +#ifdef USE_CMS + : iccColorSpaceCache(5) +#endif +{ + int i; + + doc = docA; + xref = doc->getXRef(); + catalog = doc->getCatalog(); + subPage = gFalse; + printCommands = globalParams->getPrintCommands(); + profileCommands = globalParams->getProfileCommands(); + mcStack = NULL; + parser = NULL; + + // start the resource stack + res = new GfxResources(xref, resDict, NULL); + + // initialize + out = outA; + state = new GfxState(hDPI, vDPI, box, rotate, out->upsideDown()); + stackHeight = 1; + pushStateGuard(); + fontChanged = gFalse; + clip = clipNone; + ignoreUndef = 0; + out->startPage(pageNum, state); + out->setDefaultCTM(state->getCTM()); + out->updateAll(state); + for (i = 0; i < 6; ++i) { + baseMatrix[i] = state->getCTM()[i]; + } + formDepth = 0; + textClipBBoxEmpty = gTrue; + ocState = gTrue; + parser = NULL; + abortCheckCbk = abortCheckCbkA; + abortCheckCbkData = abortCheckCbkDataA; + + // set crop box + if (cropBox) { + state->moveTo(cropBox->x1, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y2); + state->lineTo(cropBox->x1, cropBox->y2); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } +} + +Gfx::Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict, + PDFRectangle *box, PDFRectangle *cropBox, + GBool (*abortCheckCbkA)(void *data), + void *abortCheckCbkDataA) + #ifdef USE_CMS + : iccColorSpaceCache(5) +#endif +{ + int i; + + doc = docA; + xref = doc->getXRef(); + catalog = doc->getCatalog(); + subPage = gTrue; + printCommands = globalParams->getPrintCommands(); + profileCommands = globalParams->getProfileCommands(); + mcStack = NULL; + parser = NULL; + + // start the resource stack + res = new GfxResources(xref, resDict, NULL); + + // initialize + out = outA; + state = new GfxState(72, 72, box, 0, gFalse); + stackHeight = 1; + pushStateGuard(); + fontChanged = gFalse; + clip = clipNone; + ignoreUndef = 0; + for (i = 0; i < 6; ++i) { + baseMatrix[i] = state->getCTM()[i]; + } + formDepth = 0; + textClipBBoxEmpty = gTrue; + ocState = gTrue; + parser = NULL; + abortCheckCbk = abortCheckCbkA; + abortCheckCbkData = abortCheckCbkDataA; + + // set crop box + if (cropBox) { + state->moveTo(cropBox->x1, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y2); + state->lineTo(cropBox->x1, cropBox->y2); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } +} + +Gfx::~Gfx() { + while (stateGuards.size()) { + popStateGuard(); + } + if (!subPage) { + out->endPage(); + } + // There shouldn't be more saves, but pop them if there were any + while (state->hasSaves()) { + error(errSyntaxError, -1, "Found state under last state guard. Popping."); + restoreState(); + } + delete state; + while (res) { + popResources(); + } + while (mcStack) { + popMarkedContent(); + } +} + +void Gfx::display(Object *obj, GBool topLevel) { + Object obj2; + int i; + + if (obj->isArray()) { + for (i = 0; i < obj->arrayGetLength(); ++i) { + obj->arrayGet(i, &obj2); + if (!obj2.isStream()) { + error(errSyntaxError, -1, "Weird page contents"); + obj2.free(); + return; + } + obj2.free(); + } + } else if (!obj->isStream()) { + error(errSyntaxError, -1, "Weird page contents"); + return; + } + parser = new Parser(xref, new Lexer(xref, obj), gFalse); + go(topLevel); + delete parser; + parser = NULL; +} + +void Gfx::go(GBool topLevel) { + Object obj; + Object args[maxArgs]; + int numArgs, i; + int lastAbortCheck; + + // scan a sequence of objects + pushStateGuard(); + updateLevel = 1; // make sure even empty pages trigger a call to dump() + lastAbortCheck = 0; + numArgs = 0; + parser->getObj(&obj); + while (!obj.isEOF()) { + commandAborted = gFalse; + + // got a command - execute it + if (obj.isCmd()) { + if (printCommands) { + obj.print(stdout); + for (i = 0; i < numArgs; ++i) { + printf(" "); + args[i].print(stdout); + } + printf("\n"); + fflush(stdout); + } + GooTimer timer; + + // Run the operation + execOp(&obj, args, numArgs); + + // Update the profile information + if (profileCommands) { + GooHash *hash; + + hash = out->getProfileHash (); + if (hash) { + GooString *cmd_g; + ProfileData *data_p; + + cmd_g = new GooString (obj.getCmd()); + data_p = (ProfileData *)hash->lookup (cmd_g); + if (data_p == NULL) { + data_p = new ProfileData(); + hash->add (cmd_g, data_p); + } + + data_p->addElement(timer.getElapsed ()); + } + } + obj.free(); + for (i = 0; i < numArgs; ++i) + args[i].free(); + numArgs = 0; + + // periodically update display + if (++updateLevel >= 20000) { + out->dump(); + updateLevel = 0; + } + + // did the command throw an exception + if (commandAborted) { + // don't propogate; recursive drawing comes from Form XObjects which + // should probably be drawn in a separate context anyway for caching + commandAborted = gFalse; + break; + } + + // check for an abort + if (abortCheckCbk) { + if (updateLevel - lastAbortCheck > 10) { + if ((*abortCheckCbk)(abortCheckCbkData)) { + break; + } + lastAbortCheck = updateLevel; + } + } + + // got an argument - save it + } else if (numArgs < maxArgs) { + args[numArgs++] = obj; + + // too many arguments - something is wrong + } else { + error(errSyntaxError, getPos(), "Too many args in content stream"); + if (printCommands) { + printf("throwing away arg: "); + obj.print(stdout); + printf("\n"); + fflush(stdout); + } + obj.free(); + } + + // grab the next object + parser->getObj(&obj); + } + obj.free(); + + // args at end with no command + if (numArgs > 0) { + error(errSyntaxError, getPos(), "Leftover args in content stream"); + if (printCommands) { + printf("%d leftovers:", numArgs); + for (i = 0; i < numArgs; ++i) { + printf(" "); + args[i].print(stdout); + } + printf("\n"); + fflush(stdout); + } + for (i = 0; i < numArgs; ++i) + args[i].free(); + } + + popStateGuard(); + + // update display + if (topLevel && updateLevel > 0) { + out->dump(); + } +} + +void Gfx::execOp(Object *cmd, Object args[], int numArgs) { + Operator *op; + char *name; + Object *argPtr; + int i; + + // find operator + name = cmd->getCmd(); + if (!(op = findOp(name))) { + if (ignoreUndef == 0) + error(errSyntaxError, getPos(), "Unknown operator '{0:s}'", name); + return; + } + + // type check args + argPtr = args; + if (op->numArgs >= 0) { + if (numArgs < op->numArgs) { + error(errSyntaxError, getPos(), "Too few ({0:d}) args to '{1:s}' operator", numArgs, name); + commandAborted = gTrue; + return; + } + if (numArgs > op->numArgs) { +#if 0 + error(errSyntaxWarning, getPos(), + "Too many ({0:d}) args to '{1:s}' operator", numArgs, name); +#endif + argPtr += numArgs - op->numArgs; + numArgs = op->numArgs; + } + } else { + if (numArgs > -op->numArgs) { + error(errSyntaxError, getPos(), "Too many ({0:d}) args to '{1:s}' operator", + numArgs, name); + return; + } + } + for (i = 0; i < numArgs; ++i) { + if (!checkArg(&argPtr[i], op->tchk[i])) { + error(errSyntaxError, getPos(), "Arg #{0:d} to '{1:s}' operator is wrong type ({2:s})", + i, name, argPtr[i].getTypeName()); + return; + } + } + + // do it + (this->*op->func)(argPtr, numArgs); +} + +Operator *Gfx::findOp(char *name) { + int a, b, m, cmp; + + a = -1; + b = numOps; + cmp = 0; // make gcc happy + // invariant: opTab[a] < name < opTab[b] + while (b - a > 1) { + m = (a + b) / 2; + cmp = strcmp(opTab[m].name, name); + if (cmp < 0) + a = m; + else if (cmp > 0) + b = m; + else + a = b = m; + } + if (cmp != 0) + return NULL; + return &opTab[a]; +} + +GBool Gfx::checkArg(Object *arg, TchkType type) { + switch (type) { + case tchkBool: return arg->isBool(); + case tchkInt: return arg->isInt(); + case tchkNum: return arg->isNum(); + case tchkString: return arg->isString(); + case tchkName: return arg->isName(); + case tchkArray: return arg->isArray(); + case tchkProps: return arg->isDict() || arg->isName(); + case tchkSCN: return arg->isNum() || arg->isName(); + case tchkNone: return gFalse; + } + return gFalse; +} + +int Gfx::getPos() { + return parser ? parser->getPos() : -1; +} + +//------------------------------------------------------------------------ +// graphics state operators +//------------------------------------------------------------------------ + +void Gfx::opSave(Object args[], int numArgs) { + saveState(); +} + +void Gfx::opRestore(Object args[], int numArgs) { + restoreState(); +} + +void Gfx::opConcat(Object args[], int numArgs) { + state->concatCTM(args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + out->updateCTM(state, args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + fontChanged = gTrue; +} + +void Gfx::opSetDash(Object args[], int numArgs) { + Array *a; + int length; + Object obj; + double *dash; + int i; + + a = args[0].getArray(); + length = a->getLength(); + if (length == 0) { + dash = NULL; + } else { + dash = (double *)gmallocn(length, sizeof(double)); + for (i = 0; i < length; ++i) { + dash[i] = a->get(i, &obj)->getNum(); + obj.free(); + } + } + state->setLineDash(dash, length, args[1].getNum()); + out->updateLineDash(state); +} + +void Gfx::opSetFlat(Object args[], int numArgs) { + state->setFlatness((int)args[0].getNum()); + out->updateFlatness(state); +} + +void Gfx::opSetLineJoin(Object args[], int numArgs) { + state->setLineJoin(args[0].getInt()); + out->updateLineJoin(state); +} + +void Gfx::opSetLineCap(Object args[], int numArgs) { + state->setLineCap(args[0].getInt()); + out->updateLineCap(state); +} + +void Gfx::opSetMiterLimit(Object args[], int numArgs) { + state->setMiterLimit(args[0].getNum()); + out->updateMiterLimit(state); +} + +void Gfx::opSetLineWidth(Object args[], int numArgs) { + state->setLineWidth(args[0].getNum()); + out->updateLineWidth(state); +} + +void Gfx::opSetExtGState(Object args[], int numArgs) { + Object obj1, obj2, obj3, obj4, obj5; + Object args2[2]; + GfxBlendMode mode; + GBool haveFillOP; + Function *funcs[4]; + GfxColor backdropColor; + GBool haveBackdropColor; + GfxColorSpace *blendingColorSpace; + GBool alpha, isolated, knockout; + double opac; + int i; + + if (!res->lookupGState(args[0].getName(), &obj1)) { + return; + } + if (!obj1.isDict()) { + error(errSyntaxError, getPos(), "ExtGState '{0:s}' is wrong type", args[0].getName()); + obj1.free(); + return; + } + if (printCommands) { + printf(" gfx state dict: "); + obj1.print(); + printf("\n"); + } + + // parameters that are also set by individual PDF operators + if (obj1.dictLookup("LW", &obj2)->isNum()) { + opSetLineWidth(&obj2, 1); + } + obj2.free(); + if (obj1.dictLookup("LC", &obj2)->isInt()) { + opSetLineCap(&obj2, 1); + } + obj2.free(); + if (obj1.dictLookup("LJ", &obj2)->isInt()) { + opSetLineJoin(&obj2, 1); + } + obj2.free(); + if (obj1.dictLookup("ML", &obj2)->isNum()) { + opSetMiterLimit(&obj2, 1); + } + obj2.free(); + if (obj1.dictLookup("D", &obj2)->isArray() && + obj2.arrayGetLength() == 2) { + obj2.arrayGet(0, &args2[0]); + obj2.arrayGet(1, &args2[1]); + if (args2[0].isArray() && args2[1].isNum()) { + opSetDash(args2, 2); + } + args2[0].free(); + args2[1].free(); + } + obj2.free(); +#if 0 //~ need to add a new version of GfxResources::lookupFont() that + //~ takes an indirect ref instead of a name + if (obj1.dictLookup("Font", &obj2)->isArray() && + obj2.arrayGetLength() == 2) { + obj2.arrayGet(0, &args2[0]); + obj2.arrayGet(1, &args2[1]); + if (args2[0].isDict() && args2[1].isNum()) { + opSetFont(args2, 2); + } + args2[0].free(); + args2[1].free(); + } + obj2.free(); +#endif + if (obj1.dictLookup("FL", &obj2)->isNum()) { + opSetFlat(&obj2, 1); + } + obj2.free(); + + // transparency support: blend mode, fill/stroke opacity + if (!obj1.dictLookup("BM", &obj2)->isNull()) { + if (state->parseBlendMode(&obj2, &mode)) { + state->setBlendMode(mode); + out->updateBlendMode(state); + } else { + error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState"); + } + } + obj2.free(); + if (obj1.dictLookup("ca", &obj2)->isNum()) { + opac = obj2.getNum(); + state->setFillOpacity(opac < 0 ? 0 : opac > 1 ? 1 : opac); + out->updateFillOpacity(state); + } + obj2.free(); + if (obj1.dictLookup("CA", &obj2)->isNum()) { + opac = obj2.getNum(); + state->setStrokeOpacity(opac < 0 ? 0 : opac > 1 ? 1 : opac); + out->updateStrokeOpacity(state); + } + obj2.free(); + + // fill/stroke overprint, overprint mode + if ((haveFillOP = (obj1.dictLookup("op", &obj2)->isBool()))) { + state->setFillOverprint(obj2.getBool()); + out->updateFillOverprint(state); + } + obj2.free(); + if (obj1.dictLookup("OP", &obj2)->isBool()) { + state->setStrokeOverprint(obj2.getBool()); + out->updateStrokeOverprint(state); + if (!haveFillOP) { + state->setFillOverprint(obj2.getBool()); + out->updateFillOverprint(state); + } + } + obj2.free(); + if (obj1.dictLookup("OPM", &obj2)->isInt()) { + state->setOverprintMode(obj2.getInt()); + out->updateOverprintMode(state); + } + obj2.free(); + + // stroke adjust + if (obj1.dictLookup("SA", &obj2)->isBool()) { + state->setStrokeAdjust(obj2.getBool()); + out->updateStrokeAdjust(state); + } + obj2.free(); + + // transfer function + if (obj1.dictLookup("TR2", &obj2)->isNull()) { + obj2.free(); + obj1.dictLookup("TR", &obj2); + } + if (obj2.isName("Default") || + obj2.isName("Identity")) { + funcs[0] = funcs[1] = funcs[2] = funcs[3] = NULL; + state->setTransfer(funcs); + out->updateTransfer(state); + } else if (obj2.isArray() && obj2.arrayGetLength() == 4) { + for (i = 0; i < 4; ++i) { + obj2.arrayGet(i, &obj3); + funcs[i] = Function::parse(&obj3); + obj3.free(); + if (!funcs[i]) { + break; + } + } + if (i == 4) { + state->setTransfer(funcs); + out->updateTransfer(state); + } + } else if (obj2.isName() || obj2.isDict() || obj2.isStream()) { + if ((funcs[0] = Function::parse(&obj2))) { + funcs[1] = funcs[2] = funcs[3] = NULL; + state->setTransfer(funcs); + out->updateTransfer(state); + } + } else if (!obj2.isNull()) { + error(errSyntaxError, getPos(), "Invalid transfer function in ExtGState"); + } + obj2.free(); + + // alpha is shape + if (obj1.dictLookup("AIS", &obj2)->isBool()) { + state->setAlphaIsShape(obj2.getBool()); + out->updateAlphaIsShape(state); + } + obj2.free(); + + // text knockout + if (obj1.dictLookup("TK", &obj2)->isBool()) { + state->setTextKnockout(obj2.getBool()); + out->updateTextKnockout(state); + } + obj2.free(); + + // soft mask + if (!obj1.dictLookup("SMask", &obj2)->isNull()) { + if (obj2.isName("None")) { + out->clearSoftMask(state); + } else if (obj2.isDict()) { + if (obj2.dictLookup("S", &obj3)->isName("Alpha")) { + alpha = gTrue; + } else { // "Luminosity" + alpha = gFalse; + } + obj3.free(); + funcs[0] = NULL; + if (!obj2.dictLookup("TR", &obj3)->isNull()) { + if (obj3.isName("Default") || + obj3.isName("Identity")) { + funcs[0] = NULL; + } else { + funcs[0] = Function::parse(&obj3); + if (funcs[0] == NULL || + funcs[0]->getInputSize() != 1 || + funcs[0]->getOutputSize() != 1) { + error(errSyntaxError, getPos(), + "Invalid transfer function in soft mask in ExtGState"); + delete funcs[0]; + funcs[0] = NULL; + } + } + } + obj3.free(); + if ((haveBackdropColor = obj2.dictLookup("BC", &obj3)->isArray())) { + for (i = 0; i < gfxColorMaxComps; ++i) { + backdropColor.c[i] = 0; + } + for (i = 0; i < obj3.arrayGetLength() && i < gfxColorMaxComps; ++i) { + obj3.arrayGet(i, &obj4); + if (obj4.isNum()) { + backdropColor.c[i] = dblToCol(obj4.getNum()); + } + obj4.free(); + } + } + obj3.free(); + if (obj2.dictLookup("G", &obj3)->isStream()) { + if (obj3.streamGetDict()->lookup("Group", &obj4)->isDict()) { + blendingColorSpace = NULL; + isolated = knockout = gFalse; + if (!obj4.dictLookup("CS", &obj5)->isNull()) { + blendingColorSpace = GfxColorSpace::parse(&obj5, this); + } + obj5.free(); + if (obj4.dictLookup("I", &obj5)->isBool()) { + isolated = obj5.getBool(); + } + obj5.free(); + if (obj4.dictLookup("K", &obj5)->isBool()) { + knockout = obj5.getBool(); + } + obj5.free(); + if (!haveBackdropColor) { + if (blendingColorSpace) { + blendingColorSpace->getDefaultColor(&backdropColor); + } else { + //~ need to get the parent or default color space (?) + for (i = 0; i < gfxColorMaxComps; ++i) { + backdropColor.c[i] = 0; + } + } + } + doSoftMask(&obj3, alpha, blendingColorSpace, + isolated, knockout, funcs[0], &backdropColor); + if (funcs[0]) { + delete funcs[0]; + } + } else { + error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group"); + } + obj4.free(); + } else { + error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group"); + } + obj3.free(); + } else if (!obj2.isNull()) { + error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState"); + } + } + obj2.free(); + if (obj1.dictLookup("Font", &obj2)->isArray()) { + GfxFont *font; + if (obj2.arrayGetLength() == 2) { + Object fargs0, fargs1; + + obj2.arrayGetNF(0,&fargs0); + obj2.arrayGet(1,&fargs1); + if (fargs0.isRef() && fargs1.isNum()) { + Object fobj; + Ref r; + + fargs0.fetch(xref, &fobj); + if (fobj.isDict()) { + r = fargs0.getRef(); + font = GfxFont::makeFont(xref,args[0].getName(),r,fobj.getDict()); + state->setFont(font,fargs1.getNum()); + fontChanged = gTrue; + } + fobj.free(); + } + fargs0.free(); + fargs1.free(); + } else { + error(errSyntaxError, getPos(), "Number of args mismatch for /Font in ExtGState"); + } + } + obj2.free(); + if (obj1.dictLookup("LW", &obj2)->isNum()) { + opSetLineWidth(&obj2,1); + } + obj2.free(); + if (obj1.dictLookup("LC", &obj2)->isInt()) { + opSetLineCap(&obj2,1); + } + obj2.free(); + if (obj1.dictLookup("LJ", &obj2)->isInt()) { + opSetLineJoin(&obj2,1); + } + obj2.free(); + if (obj1.dictLookup("ML", &obj2)->isNum()) { + opSetMiterLimit(&obj2,1); + } + obj2.free(); + if (obj1.dictLookup("D", &obj2)->isArray()) { + if (obj2.arrayGetLength() == 2) { + Object dargs[2]; + + obj2.arrayGetNF(0,&dargs[0]); + obj2.arrayGet(1,&dargs[1]); + if (dargs[0].isArray() && dargs[1].isInt()) { + opSetDash(dargs,2); + } + dargs[0].free(); + dargs[1].free(); + } else { + error(errSyntaxError, getPos(), "Number of args mismatch for /D in ExtGState"); + } + } + obj2.free(); + if (obj1.dictLookup("RI", &obj2)->isName()) { + opSetRenderingIntent(&obj2,1); + } + obj2.free(); + if (obj1.dictLookup("FL", &obj2)->isNum()) { + opSetFlat(&obj2,1); + } + obj2.free(); + + obj1.free(); +} + +void Gfx::doSoftMask(Object *str, GBool alpha, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + Function *transferFunc, GfxColor *backdropColor) { + Dict *dict, *resDict; + double m[6], bbox[4]; + Object obj1, obj2; + int i; + + // check for excessive recursion + if (formDepth > 20) { + return; + } + + // get stream dict + dict = str->streamGetDict(); + + // check form type + dict->lookup("FormType", &obj1); + if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { + error(errSyntaxError, getPos(), "Unknown form type"); + } + obj1.free(); + + // get bounding box + dict->lookup("BBox", &obj1); + if (!obj1.isArray()) { + obj1.free(); + error(errSyntaxError, getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + obj1.arrayGet(i, &obj2); + if (likely(obj2.isNum())) bbox[i] = obj2.getNum(); + else { + obj2.free(); + obj1.free(); + error(errSyntaxError, getPos(), "Bad form bounding box (non number)"); + return; + } + obj2.free(); + } + obj1.free(); + + // get matrix + dict->lookup("Matrix", &obj1); + if (obj1.isArray()) { + for (i = 0; i < 6; ++i) { + obj1.arrayGet(i, &obj2); + if (likely(obj2.isNum())) m[i] = obj2.getNum(); + else m[i] = 0; + obj2.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + obj1.free(); + + // get resources + dict->lookup("Resources", &obj1); + resDict = obj1.isDict() ? obj1.getDict() : (Dict *)NULL; + + // draw it + ++formDepth; + drawForm(str, resDict, m, bbox, gTrue, gTrue, + blendingColorSpace, isolated, knockout, + alpha, transferFunc, backdropColor); + --formDepth; + + if (blendingColorSpace) { + delete blendingColorSpace; + } + obj1.free(); +} + +void Gfx::opSetRenderingIntent(Object args[], int numArgs) { +} + +//------------------------------------------------------------------------ +// color operators +//------------------------------------------------------------------------ + +void Gfx::opSetFillGray(Object args[], int numArgs) { + GfxColor color; + GfxColorSpace *colorSpace = NULL; + Object obj; + + state->setFillPattern(NULL); + res->lookupColorSpace("DefaultGray", &obj); + if (!obj.isNull()) { + colorSpace = GfxColorSpace::parse(&obj, this); + } + if (colorSpace == NULL) { + colorSpace = new GfxDeviceGrayColorSpace(); + } + obj.free(); + state->setFillColorSpace(colorSpace); + out->updateFillColorSpace(state); + color.c[0] = dblToCol(args[0].getNum()); + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeGray(Object args[], int numArgs) { + GfxColor color; + GfxColorSpace *colorSpace = NULL; + Object obj; + + state->setStrokePattern(NULL); + res->lookupColorSpace("DefaultGray", &obj); + if (!obj.isNull()) { + colorSpace = GfxColorSpace::parse(&obj, this); + } + if (colorSpace == NULL) { + colorSpace = new GfxDeviceGrayColorSpace(); + } + obj.free(); + state->setStrokeColorSpace(colorSpace); + out->updateStrokeColorSpace(state); + color.c[0] = dblToCol(args[0].getNum()); + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillCMYKColor(Object args[], int numArgs) { + GfxColor color; + GfxColorSpace *colorSpace = NULL; + Object obj; + int i; + + res->lookupColorSpace("DefaultCMYK", &obj); + if (!obj.isNull()) { + colorSpace = GfxColorSpace::parse(&obj, this); + } + if (colorSpace == NULL) { + colorSpace = new GfxDeviceCMYKColorSpace(); + } + obj.free(); + state->setFillPattern(NULL); + state->setFillColorSpace(colorSpace); + out->updateFillColorSpace(state); + for (i = 0; i < 4; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) { + GfxColor color; + GfxColorSpace *colorSpace = NULL; + Object obj; + int i; + + state->setStrokePattern(NULL); + res->lookupColorSpace("DefaultCMYK", &obj); + if (!obj.isNull()) { + colorSpace = GfxColorSpace::parse(&obj, this); + } + if (colorSpace == NULL) { + colorSpace = new GfxDeviceCMYKColorSpace(); + } + obj.free(); + state->setStrokeColorSpace(colorSpace); + out->updateStrokeColorSpace(state); + for (i = 0; i < 4; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillRGBColor(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace = NULL; + GfxColor color; + int i; + + state->setFillPattern(NULL); + res->lookupColorSpace("DefaultRGB", &obj); + if (!obj.isNull()) { + colorSpace = GfxColorSpace::parse(&obj, this); + } + if (colorSpace == NULL) { + colorSpace = new GfxDeviceRGBColorSpace(); + } + obj.free(); + state->setFillColorSpace(colorSpace); + out->updateFillColorSpace(state); + for (i = 0; i < 3; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace = NULL; + GfxColor color; + int i; + + state->setStrokePattern(NULL); + res->lookupColorSpace("DefaultRGB", &obj); + if (!obj.isNull()) { + colorSpace = GfxColorSpace::parse(&obj, this); + } + if (colorSpace == NULL) { + colorSpace = new GfxDeviceRGBColorSpace(); + } + obj.free(); + state->setStrokeColorSpace(colorSpace); + out->updateStrokeColorSpace(state); + for (i = 0; i < 3; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColorSpace(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace; + GfxColor color; + + res->lookupColorSpace(args[0].getName(), &obj); + if (obj.isNull()) { + colorSpace = GfxColorSpace::parse(&args[0], this); + } else { + colorSpace = GfxColorSpace::parse(&obj, this); + } + obj.free(); + if (colorSpace) { + state->setFillPattern(NULL); + state->setFillColorSpace(colorSpace); + out->updateFillColorSpace(state); + colorSpace->getDefaultColor(&color); + state->setFillColor(&color); + out->updateFillColor(state); + } else { + error(errSyntaxError, getPos(), "Bad color space (fill)"); + } +} + +void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace; + GfxColor color; + + state->setStrokePattern(NULL); + res->lookupColorSpace(args[0].getName(), &obj); + if (obj.isNull()) { + colorSpace = GfxColorSpace::parse(&args[0], this); + } else { + colorSpace = GfxColorSpace::parse(&obj, this); + } + obj.free(); + if (colorSpace) { + state->setStrokeColorSpace(colorSpace); + out->updateStrokeColorSpace(state); + colorSpace->getDefaultColor(&color); + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } else { + error(errSyntaxError, getPos(), "Bad color space (stroke)"); + } +} + +void Gfx::opSetFillColor(Object args[], int numArgs) { + GfxColor color; + int i; + + if (numArgs != state->getFillColorSpace()->getNComps()) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'sc' command"); + return; + } + state->setFillPattern(NULL); + for (i = 0; i < numArgs; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeColor(Object args[], int numArgs) { + GfxColor color; + int i; + + if (numArgs != state->getStrokeColorSpace()->getNComps()) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SC' command"); + return; + } + state->setStrokePattern(NULL); + for (i = 0; i < numArgs; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColorN(Object args[], int numArgs) { + GfxColor color; + GfxPattern *pattern; + int i; + + if (state->getFillColorSpace()->getMode() == csPattern) { + if (numArgs > 1) { + if (!((GfxPatternColorSpace *)state->getFillColorSpace())->getUnder() || + numArgs - 1 != ((GfxPatternColorSpace *)state->getFillColorSpace()) + ->getUnder()->getNComps()) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'scn' command"); + return; + } + for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } else { + color.c[i] = 0; // TODO Investigate if this is what Adobe does + } + } + state->setFillColor(&color); + out->updateFillColor(state); + } + if (numArgs > 0) { + if (args[numArgs-1].isName() && + (pattern = res->lookupPattern(args[numArgs-1].getName(), this))) { + state->setFillPattern(pattern); + } + } + + } else { + if (numArgs != state->getFillColorSpace()->getNComps()) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'scn' command"); + return; + } + state->setFillPattern(NULL); + for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } else { + color.c[i] = 0; // TODO Investigate if this is what Adobe does + } + } + state->setFillColor(&color); + out->updateFillColor(state); + } +} + +void Gfx::opSetStrokeColorN(Object args[], int numArgs) { + GfxColor color; + GfxPattern *pattern; + int i; + + if (state->getStrokeColorSpace()->getMode() == csPattern) { + if (numArgs > 1) { + if (!((GfxPatternColorSpace *)state->getStrokeColorSpace()) + ->getUnder() || + numArgs - 1 != ((GfxPatternColorSpace *)state->getStrokeColorSpace()) + ->getUnder()->getNComps()) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command"); + return; + } + for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } else { + color.c[i] = 0; // TODO Investigate if this is what Adobe does + } + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } + if (unlikely(numArgs <= 0)) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command"); + return; + } + if (args[numArgs-1].isName() && + (pattern = res->lookupPattern(args[numArgs-1].getName(), this))) { + state->setStrokePattern(pattern); + } + + } else { + if (numArgs != state->getStrokeColorSpace()->getNComps()) { + error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command"); + return; + } + state->setStrokePattern(NULL); + for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } else { + color.c[i] = 0; // TODO Investigate if this is what Adobe does + } + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } +} + +//------------------------------------------------------------------------ +// path segment operators +//------------------------------------------------------------------------ + +void Gfx::opMoveTo(Object args[], int numArgs) { + state->moveTo(args[0].getNum(), args[1].getNum()); +} + +void Gfx::opLineTo(Object args[], int numArgs) { + if (!state->isCurPt()) { + error(errSyntaxError, getPos(), "No current point in lineto"); + return; + } + state->lineTo(args[0].getNum(), args[1].getNum()); +} + +void Gfx::opCurveTo(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(errSyntaxError, getPos(), "No current point in curveto"); + return; + } + x1 = args[0].getNum(); + y1 = args[1].getNum(); + x2 = args[2].getNum(); + y2 = args[3].getNum(); + x3 = args[4].getNum(); + y3 = args[5].getNum(); + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opCurveTo1(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(errSyntaxError, getPos(), "No current point in curveto1"); + return; + } + x1 = state->getCurX(); + y1 = state->getCurY(); + x2 = args[0].getNum(); + y2 = args[1].getNum(); + x3 = args[2].getNum(); + y3 = args[3].getNum(); + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opCurveTo2(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(errSyntaxError, getPos(), "No current point in curveto2"); + return; + } + x1 = args[0].getNum(); + y1 = args[1].getNum(); + x2 = args[2].getNum(); + y2 = args[3].getNum(); + x3 = x2; + y3 = y2; + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opRectangle(Object args[], int numArgs) { + double x, y, w, h; + + x = args[0].getNum(); + y = args[1].getNum(); + w = args[2].getNum(); + h = args[3].getNum(); + state->moveTo(x, y); + state->lineTo(x + w, y); + state->lineTo(x + w, y + h); + state->lineTo(x, y + h); + state->closePath(); +} + +void Gfx::opClosePath(Object args[], int numArgs) { + if (!state->isCurPt()) { + error(errSyntaxError, getPos(), "No current point in closepath"); + return; + } + state->closePath(); +} + +//------------------------------------------------------------------------ +// path painting operators +//------------------------------------------------------------------------ + +void Gfx::opEndPath(Object args[], int numArgs) { + doEndPath(); +} + +void Gfx::opStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in stroke"); + return; + } + if (state->isPath()) { + if (ocState) { + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + } + doEndPath(); +} + +void Gfx::opCloseStroke(Object * /*args[]*/, int /*numArgs*/) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in closepath/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (ocState) { + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + } + doEndPath(); +} + +void Gfx::opFill(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in fill"); + return; + } + if (state->isPath()) { + if (ocState) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + } + } + doEndPath(); +} + +void Gfx::opEOFill(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in eofill"); + return; + } + if (state->isPath()) { + if (ocState) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + } + } + doEndPath(); +} + +void Gfx::opFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in fill/stroke"); + return; + } + if (state->isPath()) { + if (ocState) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + } + doEndPath(); +} + +void Gfx::opCloseFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in closepath/fill/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (ocState) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + } + doEndPath(); +} + +void Gfx::opEOFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in eofill/stroke"); + return; + } + if (state->isPath()) { + if (ocState) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + } + doEndPath(); +} + +void Gfx::opCloseEOFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(errSyntaxError, getPos(), "No path in closepath/eofill/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (ocState) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + } + doEndPath(); +} + +void Gfx::doPatternFill(GBool eoFill) { + GfxPattern *pattern; + + // this is a bit of a kludge -- patterns can be really slow, so we + // skip them if we're only doing text extraction, since they almost + // certainly don't contain any text + if (!out->needNonText()) { + return; + } + + if (!(pattern = state->getFillPattern())) { + return; + } + switch (pattern->getType()) { + case 1: + doTilingPatternFill((GfxTilingPattern *)pattern, gFalse, eoFill, gFalse); + break; + case 2: + doShadingPatternFill((GfxShadingPattern *)pattern, gFalse, eoFill, gFalse); + break; + default: + error(errSyntaxError, getPos(), "Unknown pattern type ({0:d}) in fill", + pattern->getType()); + break; + } +} + +void Gfx::doPatternStroke() { + GfxPattern *pattern; + + // this is a bit of a kludge -- patterns can be really slow, so we + // skip them if we're only doing text extraction, since they almost + // certainly don't contain any text + if (!out->needNonText()) { + return; + } + + if (!(pattern = state->getStrokePattern())) { + return; + } + switch (pattern->getType()) { + case 1: + doTilingPatternFill((GfxTilingPattern *)pattern, gTrue, gFalse, gFalse); + break; + case 2: + doShadingPatternFill((GfxShadingPattern *)pattern, gTrue, gFalse, gFalse); + break; + default: + error(errSyntaxError, getPos(), "Unknown pattern type ({0:d}) in stroke", + pattern->getType()); + break; + } +} + +void Gfx::doPatternText() { + GfxPattern *pattern; + + // this is a bit of a kludge -- patterns can be really slow, so we + // skip them if we're only doing text extraction, since they almost + // certainly don't contain any text + if (!out->needNonText()) { + return; + } + + if (!(pattern = state->getFillPattern())) { + return; + } + switch (pattern->getType()) { + case 1: + doTilingPatternFill((GfxTilingPattern *)pattern, gFalse, gFalse, gTrue); + break; + case 2: + doShadingPatternFill((GfxShadingPattern *)pattern, gFalse, gFalse, gTrue); + break; + default: + error(errSyntaxError, getPos(), "Unknown pattern type ({0:d}) in fill", + pattern->getType()); + break; + } +} + +void Gfx::doPatternImageMask(Object *ref, Stream *str, int width, int height, + GBool invert, GBool inlineImg) { + saveState(); + + out->setSoftMaskFromImageMask(state, ref, str, + width, height, invert, inlineImg, baseMatrix); + + state->clearPath(); + state->moveTo(0, 0); + state->lineTo(1, 0); + state->lineTo(1, 1); + state->lineTo(0, 1); + state->closePath(); + doPatternText(); + + out->unsetSoftMaskFromImageMask(state, baseMatrix); + restoreState(); +} + +void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, + GBool stroke, GBool eoFill, GBool text) { + GfxPatternColorSpace *patCS; + GfxColorSpace *cs; + GfxColor color; + GfxState *savedState; + double xMin, yMin, xMax, yMax, x, y, x1, y1; + double cxMin, cyMin, cxMax, cyMax; + int xi0, yi0, xi1, yi1, xi, yi; + double *ctm, *btm, *ptm; + double m[6], ictm[6], m1[6], imb[6]; + double det; + double xstep, ystep; + int i; + + // get color space + patCS = (GfxPatternColorSpace *)(stroke ? state->getStrokeColorSpace() + : state->getFillColorSpace()); + + // construct a (pattern space) -> (current space) transform matrix + ctm = state->getCTM(); + btm = baseMatrix; + ptm = tPat->getMatrix(); + // iCTM = invert CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + // m1 = PTM * BTM = PTM * base transform matrix + m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; + m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; + m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; + m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; + m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; + m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; + // m = m1 * iCTM = (PTM * BTM) * (iCTM) + m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; + m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; + m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; + m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; + m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; + m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; + + // construct a (device space) -> (pattern space) transform matrix + det = 1 / (m1[0] * m1[3] - m1[1] * m1[2]); + imb[0] = m1[3] * det; + imb[1] = -m1[1] * det; + imb[2] = -m1[2] * det; + imb[3] = m1[0] * det; + imb[4] = (m1[2] * m1[5] - m1[3] * m1[4]) * det; + imb[5] = (m1[1] * m1[4] - m1[0] * m1[5]) * det; + + // save current graphics state + savedState = saveStateStack(); + + // set underlying color space (for uncolored tiling patterns); set + // various other parameters (stroke color, line width) to match + // Adobe's behavior + state->setFillPattern(NULL); + state->setStrokePattern(NULL); + if (tPat->getPaintType() == 2 && (cs = patCS->getUnder())) { + state->setFillColorSpace(cs->copy()); + out->updateFillColorSpace(state); + state->setStrokeColorSpace(cs->copy()); + out->updateStrokeColorSpace(state); + if (stroke) { + state->setFillColor(state->getStrokeColor()); + } else { + state->setStrokeColor(state->getFillColor()); + } + out->updateFillColor(state); + out->updateStrokeColor(state); + } else { + cs = new GfxDeviceGrayColorSpace(); + state->setFillColorSpace(cs); + cs->getDefaultColor(&color); + state->setFillColor(&color); + out->updateFillColorSpace(state); + state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); + state->setStrokeColor(&color); + out->updateStrokeColorSpace(state); + } + if (!stroke) { + state->setLineWidth(0); + out->updateLineWidth(state); + } + + // clip to current path + if (stroke) { + state->clipToStrokePath(); + out->clipToStrokePath(state); + } else if (!text) { + state->clip(); + if (eoFill) { + out->eoClip(state); + } else { + out->clip(state); + } + } + state->clearPath(); + + // get the clip region, check for empty + state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax); + if (cxMin > cxMax || cyMin > cyMax) { + goto restore; + } + + // transform clip region bbox to pattern space + xMin = xMax = cxMin * imb[0] + cyMin * imb[2] + imb[4]; + yMin = yMax = cxMin * imb[1] + cyMin * imb[3] + imb[5]; + x1 = cxMin * imb[0] + cyMax * imb[2] + imb[4]; + y1 = cxMin * imb[1] + cyMax * imb[3] + imb[5]; + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + x1 = cxMax * imb[0] + cyMin * imb[2] + imb[4]; + y1 = cxMax * imb[1] + cyMin * imb[3] + imb[5]; + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + x1 = cxMax * imb[0] + cyMax * imb[2] + imb[4]; + y1 = cxMax * imb[1] + cyMax * imb[3] + imb[5]; + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + + // draw the pattern + //~ this should treat negative steps differently -- start at right/top + //~ edge instead of left/bottom (?) + xstep = fabs(tPat->getXStep()); + ystep = fabs(tPat->getYStep()); + xi0 = (int)ceil((xMin - tPat->getBBox()[2]) / xstep); + xi1 = (int)floor((xMax - tPat->getBBox()[0]) / xstep) + 1; + yi0 = (int)ceil((yMin - tPat->getBBox()[3]) / ystep); + yi1 = (int)floor((yMax - tPat->getBBox()[1]) / ystep) + 1; + for (i = 0; i < 4; ++i) { + m1[i] = m[i]; + } + m1[4] = m[4]; + m1[5] = m[5]; + if (out->useTilingPatternFill() && + out->tilingPatternFill(state, this, catalog, tPat->getContentStream(), + tPat->getMatrix(), tPat->getPaintType(), tPat->getTilingType(), + tPat->getResDict(), m1, tPat->getBBox(), + xi0, yi0, xi1, yi1, xstep, ystep)) { + goto restore; + } else { + for (yi = yi0; yi < yi1; ++yi) { + for (xi = xi0; xi < xi1; ++xi) { + x = xi * xstep; + y = yi * ystep; + m1[4] = x * m[0] + y * m[2] + m[4]; + m1[5] = x * m[1] + y * m[3] + m[5]; + drawForm(tPat->getContentStream(), tPat->getResDict(), + m1, tPat->getBBox()); + } + } + } + + // restore graphics state + restore: + restoreStateStack(savedState); +} + +void Gfx::doShadingPatternFill(GfxShadingPattern *sPat, + GBool stroke, GBool eoFill, GBool text) { + GfxShading *shading; + GfxState *savedState; + double *ctm, *btm, *ptm; + double m[6], ictm[6], m1[6]; + double xMin, yMin, xMax, yMax; + double det; + + shading = sPat->getShading(); + + // save current graphics state + savedState = saveStateStack(); + + // clip to current path + if (stroke) { + state->clipToStrokePath(); + out->clipToStrokePath(state); + } else if (!text) { + state->clip(); + if (eoFill) { + out->eoClip(state); + } else { + out->clip(state); + } + } + state->clearPath(); + + // construct a (pattern space) -> (current space) transform matrix + ctm = state->getCTM(); + btm = baseMatrix; + ptm = sPat->getMatrix(); + // iCTM = invert CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + // m1 = PTM * BTM = PTM * base transform matrix + m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; + m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; + m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; + m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; + m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; + m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; + // m = m1 * iCTM = (PTM * BTM) * (iCTM) + m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; + m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; + m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; + m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; + m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; + m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; + + // set the new matrix + state->concatCTM(m[0], m[1], m[2], m[3], m[4], m[5]); + out->updateCTM(state, m[0], m[1], m[2], m[3], m[4], m[5]); + + // clip to bbox + if (shading->getHasBBox()) { + shading->getBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } + + // set the color space + state->setFillColorSpace(shading->getColorSpace()->copy()); + out->updateFillColorSpace(state); + + // background color fill + if (shading->getHasBackground()) { + state->setFillColor(shading->getBackground()); + out->updateFillColor(state); + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + out->fill(state); + state->clearPath(); + } + +#if 1 //~tmp: turn off anti-aliasing temporarily + GBool vaa = out->getVectorAntialias(); + if (vaa) { + out->setVectorAntialias(gFalse); + } +#endif + + // do shading type-specific operations + switch (shading->getType()) { + case 1: + doFunctionShFill((GfxFunctionShading *)shading); + break; + case 2: + doAxialShFill((GfxAxialShading *)shading); + break; + case 3: + doRadialShFill((GfxRadialShading *)shading); + break; + case 4: + case 5: + doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading); + break; + case 6: + case 7: + doPatchMeshShFill((GfxPatchMeshShading *)shading); + break; + } + +#if 1 //~tmp: turn off anti-aliasing temporarily + if (vaa) { + out->setVectorAntialias(gTrue); + } +#endif + + // restore graphics state + restoreStateStack(savedState); +} + +void Gfx::opShFill(Object args[], int numArgs) { + GfxShading *shading; + GfxState *savedState; + double xMin, yMin, xMax, yMax; + + if (!ocState) { + return; + } + + if (!(shading = res->lookupShading(args[0].getName(), this))) { + return; + } + + // save current graphics state + savedState = saveStateStack(); + + // clip to bbox + if (shading->getHasBBox()) { + shading->getBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } + + // set the color space + state->setFillColorSpace(shading->getColorSpace()->copy()); + out->updateFillColorSpace(state); + +#if 1 //~tmp: turn off anti-aliasing temporarily + GBool vaa = out->getVectorAntialias(); + if (vaa) { + out->setVectorAntialias(gFalse); + } +#endif + + // do shading type-specific operations + switch (shading->getType()) { + case 1: + doFunctionShFill((GfxFunctionShading *)shading); + break; + case 2: + doAxialShFill((GfxAxialShading *)shading); + break; + case 3: + doRadialShFill((GfxRadialShading *)shading); + break; + case 4: + case 5: + doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading); + break; + case 6: + case 7: + doPatchMeshShFill((GfxPatchMeshShading *)shading); + break; + } + +#if 1 //~tmp: turn off anti-aliasing temporarily + if (vaa) { + out->setVectorAntialias(gTrue); + } +#endif + + // restore graphics state + restoreStateStack(savedState); + + delete shading; +} + +void Gfx::doFunctionShFill(GfxFunctionShading *shading) { + double x0, y0, x1, y1; + GfxColor colors[4]; + + if (out->useShadedFills( shading->getType() ) && + out->functionShadedFill(state, shading)) { + return; + } + + shading->getDomain(&x0, &y0, &x1, &y1); + shading->getColor(x0, y0, &colors[0]); + shading->getColor(x0, y1, &colors[1]); + shading->getColor(x1, y0, &colors[2]); + shading->getColor(x1, y1, &colors[3]); + doFunctionShFill1(shading, x0, y0, x1, y1, colors, 0); +} + +void Gfx::doFunctionShFill1(GfxFunctionShading *shading, + double x0, double y0, + double x1, double y1, + GfxColor *colors, int depth) { + GfxColor fillColor; + GfxColor color0M, color1M, colorM0, colorM1, colorMM; + GfxColor colors2[4]; + double *matrix; + double xM, yM; + int nComps, i, j; + + nComps = shading->getColorSpace()->getNComps(); + matrix = shading->getMatrix(); + + // compare the four corner colors + for (i = 0; i < 4; ++i) { + for (j = 0; j < nComps; ++j) { + if (abs(colors[i].c[j] - colors[(i+1)&3].c[j]) > functionColorDelta) { + break; + } + } + if (j < nComps) { + break; + } + } + + // center of the rectangle + xM = 0.5 * (x0 + x1); + yM = 0.5 * (y0 + y1); + + // the four corner colors are close (or we hit the recursive limit) + // -- fill the rectangle; but require at least one subdivision + // (depth==0) to avoid problems when the four outer corners of the + // shaded region are the same color + if ((i == 4 && depth > 0) || depth == functionMaxDepth) { + + // use the center color + shading->getColor(xM, yM, &fillColor); + state->setFillColor(&fillColor); + out->updateFillColor(state); + + // fill the rectangle + state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4], + x0 * matrix[1] + y0 * matrix[3] + matrix[5]); + state->lineTo(x1 * matrix[0] + y0 * matrix[2] + matrix[4], + x1 * matrix[1] + y0 * matrix[3] + matrix[5]); + state->lineTo(x1 * matrix[0] + y1 * matrix[2] + matrix[4], + x1 * matrix[1] + y1 * matrix[3] + matrix[5]); + state->lineTo(x0 * matrix[0] + y1 * matrix[2] + matrix[4], + x0 * matrix[1] + y1 * matrix[3] + matrix[5]); + state->closePath(); + out->fill(state); + state->clearPath(); + + // the four corner colors are not close enough -- subdivide the + // rectangle + } else { + + // colors[0] colorM0 colors[2] + // (x0,y0) (xM,y0) (x1,y0) + // +----------+----------+ + // | | | + // | UL | UR | + // color0M | colorMM | color1M + // (x0,yM) +----------+----------+ (x1,yM) + // | (xM,yM) | + // | LL | LR | + // | | | + // +----------+----------+ + // colors[1] colorM1 colors[3] + // (x0,y1) (xM,y1) (x1,y1) + + shading->getColor(x0, yM, &color0M); + shading->getColor(x1, yM, &color1M); + shading->getColor(xM, y0, &colorM0); + shading->getColor(xM, y1, &colorM1); + shading->getColor(xM, yM, &colorMM); + + // upper-left sub-rectangle + colors2[0] = colors[0]; + colors2[1] = color0M; + colors2[2] = colorM0; + colors2[3] = colorMM; + doFunctionShFill1(shading, x0, y0, xM, yM, colors2, depth + 1); + + // lower-left sub-rectangle + colors2[0] = color0M; + colors2[1] = colors[1]; + colors2[2] = colorMM; + colors2[3] = colorM1; + doFunctionShFill1(shading, x0, yM, xM, y1, colors2, depth + 1); + + // upper-right sub-rectangle + colors2[0] = colorM0; + colors2[1] = colorMM; + colors2[2] = colors[2]; + colors2[3] = color1M; + doFunctionShFill1(shading, xM, y0, x1, yM, colors2, depth + 1); + + // lower-right sub-rectangle + colors2[0] = colorMM; + colors2[1] = colorM1; + colors2[2] = color1M; + colors2[3] = colors[3]; + doFunctionShFill1(shading, xM, yM, x1, y1, colors2, depth + 1); + } +} + +static void bubbleSort(double array[]) +{ + for (int j = 0; j < 3; ++j) { + int kk = j; + for (int k = j + 1; k < 4; ++k) { + if (array[k] < array[kk]) { + kk = k; + } + } + double tmp = array[j]; + array[j] = array[kk]; + array[kk] = tmp; + } +} + +void Gfx::doAxialShFill(GfxAxialShading *shading) { + double xMin, yMin, xMax, yMax; + double x0, y0, x1, y1; + double dx, dy, mul; + GBool dxZero, dyZero; + double bboxIntersections[4]; + double tMin, tMax, tx, ty; + double s[4], sMin, sMax, tmp; + double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1; + double t0, t1, tt; + double ta[axialMaxSplits + 1]; + int next[axialMaxSplits + 1]; + GfxColor color0, color1; + int nComps; + int i, j, k; + GBool needExtend = gTrue; + + // get the clip region bbox + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + + // compute min and max t values, based on the four corners of the + // clip region bbox + shading->getCoords(&x0, &y0, &x1, &y1); + dx = x1 - x0; + dy = y1 - y0; + dxZero = fabs(dx) < 0.01; + dyZero = fabs(dy) < 0.01; + if (dxZero && dyZero) { + tMin = tMax = 0; + } else { + mul = 1 / (dx * dx + dy * dy); + bboxIntersections[0] = ((xMin - x0) * dx + (yMin - y0) * dy) * mul; + bboxIntersections[1] = ((xMin - x0) * dx + (yMax - y0) * dy) * mul; + bboxIntersections[2] = ((xMax - x0) * dx + (yMin - y0) * dy) * mul; + bboxIntersections[3] = ((xMax - x0) * dx + (yMax - y0) * dy) * mul; + bubbleSort(bboxIntersections); + tMin = bboxIntersections[0]; + tMax = bboxIntersections[3]; + if (tMin < 0 && !shading->getExtend0()) { + tMin = 0; + } + if (tMax > 1 && !shading->getExtend1()) { + tMax = 1; + } + } + + if (out->useShadedFills( shading->getType() ) && + out->axialShadedFill(state, shading, tMin, tMax)) { + return; + } + + // get the function domain + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + + // Traverse the t axis and do the shading. + // + // For each point (tx, ty) on the t axis, consider a line through + // that point perpendicular to the t axis: + // + // x(s) = tx + s * -dy --> s = (x - tx) / -dy + // y(s) = ty + s * dx --> s = (y - ty) / dx + // + // Then look at the intersection of this line with the bounding box + // (xMin, yMin, xMax, yMax). In the general case, there are four + // intersection points: + // + // s0 = (xMin - tx) / -dy + // s1 = (xMax - tx) / -dy + // s2 = (yMin - ty) / dx + // s3 = (yMax - ty) / dx + // + // and we want the middle two s values. + // + // In the case where dx = 0, take s0 and s1; in the case where dy = + // 0, take s2 and s3. + // + // Each filled polygon is bounded by two of these line segments + // perpdendicular to the t axis. + // + // The t axis is bisected into smaller regions until the color + // difference across a region is small enough, and then the region + // is painted with a single color. + + // set up: require at least one split to avoid problems when the two + // ends of the t axis have the same color + nComps = shading->getColorSpace()->getNComps(); + ta[0] = tMin; + next[0] = axialMaxSplits / 2; + ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax); + next[axialMaxSplits / 2] = axialMaxSplits; + ta[axialMaxSplits] = tMax; + + // compute the color at t = tMin + if (tMin < 0) { + tt = t0; + } else if (tMin > 1) { + tt = t1; + } else { + tt = t0 + (t1 - t0) * tMin; + } + shading->getColor(tt, &color0); + + if (out->useFillColorStop()) { + // make sure we add stop color when t = tMin + state->setFillColor(&color0); + out->updateFillColorStop(state, 0); + } + + // compute the coordinates of the point on the t axis at t = tMin; + // then compute the intersection of the perpendicular line with the + // bounding box + tx = x0 + tMin * dx; + ty = y0 + tMin * dy; + if (dxZero && dyZero) { + sMin = sMax = 0; + } else if (dxZero) { + sMin = (xMin - tx) / -dy; + sMax = (xMax - tx) / -dy; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else if (dyZero) { + sMin = (yMin - ty) / dx; + sMax = (yMax - ty) / dx; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else { + s[0] = (yMin - ty) / dx; + s[1] = (yMax - ty) / dx; + s[2] = (xMin - tx) / -dy; + s[3] = (xMax - tx) / -dy; + bubbleSort(s); + sMin = s[1]; + sMax = s[2]; + } + ux0 = tx - sMin * dy; + uy0 = ty + sMin * dx; + vx0 = tx - sMax * dy; + vy0 = ty + sMax * dx; + + i = 0; + bool doneBBox1, doneBBox2; + if (dxZero && dyZero) { + doneBBox1 = doneBBox2 = true; + } else { + doneBBox1 = bboxIntersections[1] < tMin; + doneBBox2 = bboxIntersections[2] > tMax; + } + + // If output device doesn't support the extended mode required + // we have to do it here + needExtend = !out->axialShadedSupportExtend(state, shading); + + while (i < axialMaxSplits) { + + // bisect until color difference is small enough or we hit the + // bisection limit + j = next[i]; + while (j > i + 1) { + if (ta[j] < 0) { + tt = t0; + } else if (ta[j] > 1) { + tt = t1; + } else { + tt = t0 + (t1 - t0) * ta[j]; + } + shading->getColor(tt, &color1); + if (isSameGfxColor(color1, color0, nComps, axialColorDelta)) { + // in these two if what we guarantee is that if we are skipping lots of + // positions because the colors are the same, we still create a region + // with vertexs passing by bboxIntersections[1] and bboxIntersections[2] + // otherwise we can have empty regions that should really be painted + // like happened in bug 19896 + // What we do to ensure that we pass a line through this points + // is making sure use the exact bboxIntersections[] value as one of the used ta[] values + if (!doneBBox1 && ta[i] < bboxIntersections[1] && ta[j] > bboxIntersections[1]) { + int teoricalj = (int) ((bboxIntersections[1] - tMin) * axialMaxSplits / (tMax - tMin)); + if (teoricalj <= i) teoricalj = i + 1; + if (teoricalj < j) { + next[i] = teoricalj; + next[teoricalj] = j; + } + else { + teoricalj = j; + } + ta[teoricalj] = bboxIntersections[1]; + j = teoricalj; + doneBBox1 = true; + } + if (!doneBBox2 && ta[i] < bboxIntersections[2] && ta[j] > bboxIntersections[2]) { + int teoricalj = (int) ((bboxIntersections[2] - tMin) * axialMaxSplits / (tMax - tMin)); + if (teoricalj <= i) teoricalj = i + 1; + if (teoricalj < j) { + next[i] = teoricalj; + next[teoricalj] = j; + } + else { + teoricalj = j; + } + ta[teoricalj] = bboxIntersections[2]; + j = teoricalj; + doneBBox2 = true; + } + break; + } + k = (i + j) / 2; + ta[k] = 0.5 * (ta[i] + ta[j]); + next[i] = k; + next[k] = j; + j = k; + } + + // use the average of the colors of the two sides of the region + for (k = 0; k < nComps; ++k) { + color0.c[k] = (color0.c[k] + color1.c[k]) / 2; + } + + // compute the coordinates of the point on the t axis; then + // compute the intersection of the perpendicular line with the + // bounding box + tx = x0 + ta[j] * dx; + ty = y0 + ta[j] * dy; + if (dxZero && dyZero) { + sMin = sMax = 0; + } else if (dxZero) { + sMin = (xMin - tx) / -dy; + sMax = (xMax - tx) / -dy; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else if (dyZero) { + sMin = (yMin - ty) / dx; + sMax = (yMax - ty) / dx; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else { + s[0] = (yMin - ty) / dx; + s[1] = (yMax - ty) / dx; + s[2] = (xMin - tx) / -dy; + s[3] = (xMax - tx) / -dy; + bubbleSort(s); + sMin = s[1]; + sMax = s[2]; + } + ux1 = tx - sMin * dy; + uy1 = ty + sMin * dx; + vx1 = tx - sMax * dy; + vy1 = ty + sMax * dx; + + // set the color + state->setFillColor(&color0); + if (out->useFillColorStop()) + out->updateFillColorStop(state, (ta[j] - tMin)/(tMax - tMin)); + else + out->updateFillColor(state); + + if (needExtend) { + // fill the region + state->moveTo(ux0, uy0); + state->lineTo(vx0, vy0); + state->lineTo(vx1, vy1); + state->lineTo(ux1, uy1); + state->closePath(); + } + + if (!out->useFillColorStop()) { + out->fill(state); + state->clearPath(); + } + + // set up for next region + ux0 = ux1; + uy0 = uy1; + vx0 = vx1; + vy0 = vy1; + color0 = color1; + i = next[i]; + } + + if (out->useFillColorStop()) { + if (!needExtend) { + state->moveTo(xMin, yMin); + state->lineTo(xMin, yMax); + state->lineTo(xMax, yMax); + state->lineTo(xMax, yMin); + state->closePath(); + } + out->fill(state); + state->clearPath(); + } +} + +static inline void getShadingColorRadialHelper(double t0, double t1, double t, GfxRadialShading *shading, GfxColor *color) +{ + if (t0 < t1) { + if (t < t0) { + shading->getColor(t0, color); + } else if (t > t1) { + shading->getColor(t1, color); + } else { + shading->getColor(t, color); + } + } else { + if (t > t0) { + shading->getColor(t0, color); + } else if (t < t1) { + shading->getColor(t1, color); + } else { + shading->getColor(t, color); + } + } +} + +void Gfx::doRadialShFill(GfxRadialShading *shading) { + double xMin, yMin, xMax, yMax; + double x0, y0, r0, x1, y1, r1, t0, t1; + int nComps; + GfxColor colorA, colorB; + double xa, ya, xb, yb, ra, rb; + double ta, tb, sa, sb; + double sz, xz, yz, sMin, sMax; + GBool enclosed; + int ia, ib, k, n; + double *ctm; + double theta, alpha, angle, t; + GBool needExtend = gTrue; + + // get the shading info + shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1); + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + nComps = shading->getColorSpace()->getNComps(); + + // Compute the point at which r(s) = 0; check for the enclosed + // circles case; and compute the angles for the tangent lines. + if (x0 == x1 && y0 == y1) { + enclosed = gTrue; + theta = 0; // make gcc happy + sz = 0; // make gcc happy + } else if (r0 == r1) { + enclosed = gFalse; + theta = 0; + sz = 0; // make gcc happy + } else { + sz = (r1 > r0) ? -r0 / (r1 - r0) : -r1 / (r0 - r1); + xz = x0 + sz * (x1 - x0); + yz = y0 + sz * (y1 - y0); + enclosed = (xz - x0) * (xz - x0) + (yz - y0) * (yz - y0) <= r0 * r0; + theta = asin(r0 / sqrt((x0 - xz) * (x0 - xz) + (y0 - yz) * (y0 - yz))); + if (r0 > r1) { + theta = -theta; + } + } + if (enclosed) { + alpha = 0; + } else { + alpha = atan2(y1 - y0, x1 - x0); + } + + // compute the (possibly extended) s range + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + if (enclosed) { + sMin = 0; + sMax = 1; + } else { + sMin = 1; + sMax = 0; + // solve for x(s) + r(s) = xMin + if ((x1 + r1) - (x0 + r0) != 0) { + sa = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // solve for x(s) - r(s) = xMax + if ((x1 - r1) - (x0 - r0) != 0) { + sa = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // solve for y(s) + r(s) = yMin + if ((y1 + r1) - (y0 + r0) != 0) { + sa = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // solve for y(s) - r(s) = yMax + if ((y1 - r1) - (y0 - r0) != 0) { + sa = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // check against sz + if (r0 < r1) { + if (sMin < sz) { + sMin = sz; + } + } else if (r0 > r1) { + if (sMax > sz) { + sMax = sz; + } + } + // check the 'extend' flags + if (!shading->getExtend0() && sMin < 0) { + sMin = 0; + } + if (!shading->getExtend1() && sMax > 1) { + sMax = 1; + } + } + + if (out->useShadedFills( shading->getType() ) && + out->radialShadedFill(state, shading, sMin, sMax)) { + return; + } + + // compute the number of steps into which circles must be divided to + // achieve a curve flatness of 0.1 pixel in device space for the + // largest circle (note that "device space" is 72 dpi when generating + // PostScript, hence the relatively small 0.1 pixel accuracy) + ctm = state->getCTM(); + t = fabs(ctm[0]); + if (fabs(ctm[1]) > t) { + t = fabs(ctm[1]); + } + if (fabs(ctm[2]) > t) { + t = fabs(ctm[2]); + } + if (fabs(ctm[3]) > t) { + t = fabs(ctm[3]); + } + if (r0 > r1) { + t *= r0; + } else { + t *= r1; + } + if (t < 1) { + n = 3; + } else { + n = (int)(M_PI / acos(1 - 0.1 / t)); + if (n < 3) { + n = 3; + } else if (n > 200) { + n = 200; + } + } + + // setup for the start circle + ia = 0; + sa = sMin; + ta = t0 + sa * (t1 - t0); + xa = x0 + sa * (x1 - x0); + ya = y0 + sa * (y1 - y0); + ra = r0 + sa * (r1 - r0); + getShadingColorRadialHelper(t0, t1, ta, shading, &colorA); + + needExtend = !out->radialShadedSupportExtend(state, shading); + + // fill the circles + while (ia < radialMaxSplits) { + + // go as far along the t axis (toward t1) as we can, such that the + // color difference is within the tolerance (radialColorDelta) -- + // this uses bisection (between the current value, t, and t1), + // limited to radialMaxSplits points along the t axis; require at + // least one split to avoid problems when the innermost and + // outermost colors are the same + ib = radialMaxSplits; + sb = sMax; + tb = t0 + sb * (t1 - t0); + getShadingColorRadialHelper(t0, t1, tb, shading, &colorB); + while (ib - ia > 1) { + if (isSameGfxColor(colorB, colorA, nComps, radialColorDelta)) { + // The shading is not necessarily lineal so having two points with the + // same color does not mean all the areas in between have the same color too + int ic = ia + 1; + for (; ic <= ib; ic++) { + GfxColor colorC; + const double sc = sMin + ((double)ic / (double)radialMaxSplits) * (sMax - sMin); + const double tc = t0 + sc * (t1 - t0); + getShadingColorRadialHelper(t0, t1, tc, shading, &colorC); + if (!isSameGfxColor(colorC, colorA, nComps, radialColorDelta)) { + break; + } + } + ib = (ic > ia + 1) ? ic - 1 : ia + 1; + sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin); + tb = t0 + sb * (t1 - t0); + getShadingColorRadialHelper(t0, t1, tb, shading, &colorB); + break; + } + ib = (ia + ib) / 2; + sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin); + tb = t0 + sb * (t1 - t0); + getShadingColorRadialHelper(t0, t1, tb, shading, &colorB); + } + + // compute center and radius of the circle + xb = x0 + sb * (x1 - x0); + yb = y0 + sb * (y1 - y0); + rb = r0 + sb * (r1 - r0); + + // use the average of the colors at the two circles + for (k = 0; k < nComps; ++k) { + colorA.c[k] = (colorA.c[k] + colorB.c[k]) / 2; + } + state->setFillColor(&colorA); + if (out->useFillColorStop()) + out->updateFillColorStop(state, (sa - sMin)/(sMax - sMin)); + else + out->updateFillColor(state); + + if (needExtend) { + if (enclosed) { + // construct path for first circle (counterclockwise) + state->moveTo(xa + ra, ya); + for (k = 1; k < n; ++k) { + angle = ((double)k / (double)n) * 2 * M_PI; + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + + // construct and append path for second circle (clockwise) + state->moveTo(xb + rb, yb); + for (k = 1; k < n; ++k) { + angle = -((double)k / (double)n) * 2 * M_PI; + state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); + } + state->closePath(); + } else { + // construct the first subpath (clockwise) + state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI), + ya + ra * sin(alpha + theta + 0.5 * M_PI)); + for (k = 0; k < n; ++k) { + angle = alpha + theta + 0.5 * M_PI + - ((double)k / (double)n) * (2 * theta + M_PI); + state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); + } + for (k = 0; k < n; ++k) { + angle = alpha - theta - 0.5 * M_PI + + ((double)k / (double)n) * (2 * theta - M_PI); + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + + // construct the second subpath (counterclockwise) + state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI), + ya + ra * sin(alpha + theta + 0.5 * M_PI)); + for (k = 0; k < n; ++k) { + angle = alpha + theta + 0.5 * M_PI + + ((double)k / (double)n) * (-2 * theta + M_PI); + state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); + } + for (k = 0; k < n; ++k) { + angle = alpha - theta - 0.5 * M_PI + + ((double)k / (double)n) * (2 * theta + M_PI); + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + } + } + + if (!out->useFillColorStop()) { + // fill the path + out->fill(state); + state->clearPath(); + } + + // step to the next value of t + ia = ib; + sa = sb; + ta = tb; + xa = xb; + ya = yb; + ra = rb; + colorA = colorB; + } + + if (out->useFillColorStop()) { + // make sure we add stop color when sb = sMax + state->setFillColor(&colorA); + out->updateFillColorStop(state, (sb - sMin)/(sMax - sMin)); + + // fill the path + state->moveTo(xMin, yMin); + state->lineTo(xMin, yMax); + state->lineTo(xMax, yMax); + state->lineTo(xMax, yMin); + state->closePath(); + + out->fill(state); + state->clearPath(); + } + + if (!needExtend) + return; + + if (enclosed) { + // extend the smaller circle + if ((shading->getExtend0() && r0 <= r1) || + (shading->getExtend1() && r1 < r0)) { + if (r0 <= r1) { + ta = t0; + ra = r0; + xa = x0; + ya = y0; + } else { + ta = t1; + ra = r1; + xa = x1; + ya = y1; + } + shading->getColor(ta, &colorA); + state->setFillColor(&colorA); + out->updateFillColor(state); + state->moveTo(xa + ra, ya); + for (k = 1; k < n; ++k) { + angle = ((double)k / (double)n) * 2 * M_PI; + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + out->fill(state); + state->clearPath(); + } + + // extend the larger circle + if ((shading->getExtend0() && r0 > r1) || + (shading->getExtend1() && r1 >= r0)) { + if (r0 > r1) { + ta = t0; + ra = r0; + xa = x0; + ya = y0; + } else { + ta = t1; + ra = r1; + xa = x1; + ya = y1; + } + shading->getColor(ta, &colorA); + state->setFillColor(&colorA); + out->updateFillColor(state); + state->moveTo(xMin, yMin); + state->lineTo(xMin, yMax); + state->lineTo(xMax, yMax); + state->lineTo(xMax, yMin); + state->closePath(); + state->moveTo(xa + ra, ya); + for (k = 1; k < n; ++k) { + angle = ((double)k / (double)n) * 2 * M_PI; + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + out->fill(state); + state->clearPath(); + } + } +} + +void Gfx::doGouraudTriangleShFill(GfxGouraudTriangleShading *shading) { + double x0, y0, x1, y1, x2, y2; + int i; + + if (out->useShadedFills( shading->getType())) { + if (out->gouraudTriangleShadedFill( state, shading)) + return; + } + + // preallocate a path (speed improvements) + state->moveTo(0., 0.); + state->lineTo(1., 0.); + state->lineTo(0., 1.); + state->closePath(); + + GfxState::ReusablePathIterator *reusablePath = state->getReusablePath(); + + if (shading->isParameterized()) { + // work with parameterized values: + double color0, color1, color2; + // a relative threshold: + const double refineColorThreshold = gouraudParameterizedColorDelta * + (shading->getParameterDomainMax() - shading->getParameterDomainMin()); + for (i = 0; i < shading->getNTriangles(); ++i) { + shading->getTriangle(i, &x0, &y0, &color0, + &x1, &y1, &color1, + &x2, &y2, &color2); + gouraudFillTriangle(x0, y0, color0, x1, y1, color1, x2, y2, color2, refineColorThreshold, 0, shading, reusablePath); + } + + } else { + // this always produces output -- even for parameterized ranges. + // But it ignores the parameterized color map (the function). + // + // Note that using this code in for parameterized shadings might be + // correct in circumstances (namely if the function is linear in the actual + // triangle), but in general, it will simply be wrong. + GfxColor color0, color1, color2; + for (i = 0; i < shading->getNTriangles(); ++i) { + shading->getTriangle(i, &x0, &y0, &color0, + &x1, &y1, &color1, + &x2, &y2, &color2); + gouraudFillTriangle(x0, y0, &color0, x1, y1, &color1, x2, y2, &color2, shading->getColorSpace()->getNComps(), 0, reusablePath); + } + } + + delete reusablePath; +} + +void Gfx::gouraudFillTriangle(double x0, double y0, GfxColor *color0, + double x1, double y1, GfxColor *color1, + double x2, double y2, GfxColor *color2, + int nComps, int depth, GfxState::ReusablePathIterator *path) { + double x01, y01, x12, y12, x20, y20; + GfxColor color01, color12, color20; + int i; + + for (i = 0; i < nComps; ++i) { + if (abs(color0->c[i] - color1->c[i]) > gouraudColorDelta || + abs(color1->c[i] - color2->c[i]) > gouraudColorDelta) { + break; + } + } + if (i == nComps || depth == gouraudMaxDepth) { + state->setFillColor(color0); + out->updateFillColor(state); + + path->reset(); assert(!path->isEnd()); + path->setCoord(x0,y0); path->next(); assert(!path->isEnd()); + path->setCoord(x1,y1); path->next(); assert(!path->isEnd()); + path->setCoord(x2,y2); path->next(); assert(!path->isEnd()); + path->setCoord(x0,y0); path->next(); assert( path->isEnd()); + out->fill(state); + + } else { + x01 = 0.5 * (x0 + x1); + y01 = 0.5 * (y0 + y1); + x12 = 0.5 * (x1 + x2); + y12 = 0.5 * (y1 + y2); + x20 = 0.5 * (x2 + x0); + y20 = 0.5 * (y2 + y0); + for (i = 0; i < nComps; ++i) { + color01.c[i] = (color0->c[i] + color1->c[i]) / 2; + color12.c[i] = (color1->c[i] + color2->c[i]) / 2; + color20.c[i] = (color2->c[i] + color0->c[i]) / 2; + } + gouraudFillTriangle(x0, y0, color0, x01, y01, &color01, + x20, y20, &color20, nComps, depth + 1, path); + gouraudFillTriangle(x01, y01, &color01, x1, y1, color1, + x12, y12, &color12, nComps, depth + 1, path); + gouraudFillTriangle(x01, y01, &color01, x12, y12, &color12, + x20, y20, &color20, nComps, depth + 1, path); + gouraudFillTriangle(x20, y20, &color20, x12, y12, &color12, + x2, y2, color2, nComps, depth + 1, path); + } +} +void Gfx::gouraudFillTriangle(double x0, double y0, double color0, + double x1, double y1, double color1, + double x2, double y2, double color2, + double refineColorThreshold, int depth, GfxGouraudTriangleShading *shading, GfxState::ReusablePathIterator *path) { + const double meanColor = (color0 + color1 + color2) / 3; + + const bool isFineEnough = + fabs(color0 - meanColor) < refineColorThreshold && + fabs(color1 - meanColor) < refineColorThreshold && + fabs(color2 - meanColor) < refineColorThreshold; + + if (isFineEnough || depth == gouraudMaxDepth) { + GfxColor color; + + shading->getParameterizedColor(meanColor, &color); + state->setFillColor(&color); + out->updateFillColor(state); + + path->reset(); assert(!path->isEnd()); + path->setCoord(x0,y0); path->next(); assert(!path->isEnd()); + path->setCoord(x1,y1); path->next(); assert(!path->isEnd()); + path->setCoord(x2,y2); path->next(); assert(!path->isEnd()); + path->setCoord(x0,y0); path->next(); assert( path->isEnd()); + out->fill(state); + + } else { + const double x01 = 0.5 * (x0 + x1); + const double y01 = 0.5 * (y0 + y1); + const double x12 = 0.5 * (x1 + x2); + const double y12 = 0.5 * (y1 + y2); + const double x20 = 0.5 * (x2 + x0); + const double y20 = 0.5 * (y2 + y0); + const double color01 = (color0 + color1) / 2.; + const double color12 = (color1 + color2) / 2.; + const double color20 = (color2 + color0) / 2.; + ++depth; + gouraudFillTriangle(x0, y0, color0, + x01, y01, color01, + x20, y20, color20, + refineColorThreshold, depth, shading, path); + gouraudFillTriangle(x01, y01, color01, + x1, y1, color1, + x12, y12, color12, + refineColorThreshold, depth, shading, path); + gouraudFillTriangle(x01, y01, color01, + x12, y12, color12, + x20, y20, color20, + refineColorThreshold, depth, shading, path); + gouraudFillTriangle(x20, y20, color20, + x12, y12, color12, + x2, y2, color2, + refineColorThreshold, depth, shading, path); + } +} + +void Gfx::doPatchMeshShFill(GfxPatchMeshShading *shading) { + int start, i; + + if (out->useShadedFills( shading->getType())) { + if (out->patchMeshShadedFill( state, shading)) + return; + } + + if (shading->getNPatches() > 128) { + start = 3; + } else if (shading->getNPatches() > 64) { + start = 2; + } else if (shading->getNPatches() > 16) { + start = 1; + } else { + start = 0; + } + /* + * Parameterized shadings take one parameter [t_0,t_e] + * and map it into the color space. + * + * Consequently, all color values are stored as doubles. + * + * These color values are interpreted as parameters for parameterized + * shadings and as colorspace entities otherwise. + * + * The only difference is that color space entities are stored into + * DOUBLE arrays, not into arrays of type GfxColorComp. + */ + const int colorComps = shading->getColorSpace()->getNComps(); + double refineColorThreshold; + if( shading->isParameterized() ) { + refineColorThreshold = gouraudParameterizedColorDelta * + (shading->getParameterDomainMax() - shading->getParameterDomainMin()); + + } else { + refineColorThreshold = patchColorDelta; + } + + for (i = 0; i < shading->getNPatches(); ++i) { + fillPatch(shading->getPatch(i), + colorComps, + shading->isParameterized() ? 1 : colorComps, + refineColorThreshold, + start, + shading); + } +} + + +void Gfx::fillPatch(GfxPatch *patch, int colorComps, int patchColorComps, double refineColorThreshold, int depth, GfxPatchMeshShading *shading) { + GfxPatch patch00, patch01, patch10, patch11; + double xx[4][8], yy[4][8]; + double xxm, yym; + int i; + + for (i = 0; i < patchColorComps; ++i) { + // these comparisons are done in double arithmetics. + // + // For non-parameterized shadings, they are done in color space + // components. + if (fabs(patch->color[0][0].c[i] - patch->color[0][1].c[i]) > refineColorThreshold || + fabs(patch->color[0][1].c[i] - patch->color[1][1].c[i]) > refineColorThreshold || + fabs(patch->color[1][1].c[i] - patch->color[1][0].c[i]) > refineColorThreshold || + fabs(patch->color[1][0].c[i] - patch->color[0][0].c[i]) > refineColorThreshold) { + break; + } + } + if (i == patchColorComps || depth == patchMaxDepth) { + GfxColor flatColor; + if( shading->isParameterized() ) { + shading->getParameterizedColor( patch->color[0][0].c[0], &flatColor ); + } else { + for( i = 0; icolor[0][0].c[i]); + } + } + state->setFillColor(&flatColor); + out->updateFillColor(state); + state->moveTo(patch->x[0][0], patch->y[0][0]); + state->curveTo(patch->x[0][1], patch->y[0][1], + patch->x[0][2], patch->y[0][2], + patch->x[0][3], patch->y[0][3]); + state->curveTo(patch->x[1][3], patch->y[1][3], + patch->x[2][3], patch->y[2][3], + patch->x[3][3], patch->y[3][3]); + state->curveTo(patch->x[3][2], patch->y[3][2], + patch->x[3][1], patch->y[3][1], + patch->x[3][0], patch->y[3][0]); + state->curveTo(patch->x[2][0], patch->y[2][0], + patch->x[1][0], patch->y[1][0], + patch->x[0][0], patch->y[0][0]); + state->closePath(); + out->fill(state); + state->clearPath(); + } else { + for (i = 0; i < 4; ++i) { + xx[i][0] = patch->x[i][0]; + yy[i][0] = patch->y[i][0]; + xx[i][1] = 0.5 * (patch->x[i][0] + patch->x[i][1]); + yy[i][1] = 0.5 * (patch->y[i][0] + patch->y[i][1]); + xxm = 0.5 * (patch->x[i][1] + patch->x[i][2]); + yym = 0.5 * (patch->y[i][1] + patch->y[i][2]); + xx[i][6] = 0.5 * (patch->x[i][2] + patch->x[i][3]); + yy[i][6] = 0.5 * (patch->y[i][2] + patch->y[i][3]); + xx[i][2] = 0.5 * (xx[i][1] + xxm); + yy[i][2] = 0.5 * (yy[i][1] + yym); + xx[i][5] = 0.5 * (xxm + xx[i][6]); + yy[i][5] = 0.5 * (yym + yy[i][6]); + xx[i][3] = xx[i][4] = 0.5 * (xx[i][2] + xx[i][5]); + yy[i][3] = yy[i][4] = 0.5 * (yy[i][2] + yy[i][5]); + xx[i][7] = patch->x[i][3]; + yy[i][7] = patch->y[i][3]; + } + for (i = 0; i < 4; ++i) { + patch00.x[0][i] = xx[0][i]; + patch00.y[0][i] = yy[0][i]; + patch00.x[1][i] = 0.5 * (xx[0][i] + xx[1][i]); + patch00.y[1][i] = 0.5 * (yy[0][i] + yy[1][i]); + xxm = 0.5 * (xx[1][i] + xx[2][i]); + yym = 0.5 * (yy[1][i] + yy[2][i]); + patch10.x[2][i] = 0.5 * (xx[2][i] + xx[3][i]); + patch10.y[2][i] = 0.5 * (yy[2][i] + yy[3][i]); + patch00.x[2][i] = 0.5 * (patch00.x[1][i] + xxm); + patch00.y[2][i] = 0.5 * (patch00.y[1][i] + yym); + patch10.x[1][i] = 0.5 * (xxm + patch10.x[2][i]); + patch10.y[1][i] = 0.5 * (yym + patch10.y[2][i]); + patch00.x[3][i] = 0.5 * (patch00.x[2][i] + patch10.x[1][i]); + patch00.y[3][i] = 0.5 * (patch00.y[2][i] + patch10.y[1][i]); + patch10.x[0][i] = patch00.x[3][i]; + patch10.y[0][i] = patch00.y[3][i]; + patch10.x[3][i] = xx[3][i]; + patch10.y[3][i] = yy[3][i]; + } + for (i = 4; i < 8; ++i) { + patch01.x[0][i-4] = xx[0][i]; + patch01.y[0][i-4] = yy[0][i]; + patch01.x[1][i-4] = 0.5 * (xx[0][i] + xx[1][i]); + patch01.y[1][i-4] = 0.5 * (yy[0][i] + yy[1][i]); + xxm = 0.5 * (xx[1][i] + xx[2][i]); + yym = 0.5 * (yy[1][i] + yy[2][i]); + patch11.x[2][i-4] = 0.5 * (xx[2][i] + xx[3][i]); + patch11.y[2][i-4] = 0.5 * (yy[2][i] + yy[3][i]); + patch01.x[2][i-4] = 0.5 * (patch01.x[1][i-4] + xxm); + patch01.y[2][i-4] = 0.5 * (patch01.y[1][i-4] + yym); + patch11.x[1][i-4] = 0.5 * (xxm + patch11.x[2][i-4]); + patch11.y[1][i-4] = 0.5 * (yym + patch11.y[2][i-4]); + patch01.x[3][i-4] = 0.5 * (patch01.x[2][i-4] + patch11.x[1][i-4]); + patch01.y[3][i-4] = 0.5 * (patch01.y[2][i-4] + patch11.y[1][i-4]); + patch11.x[0][i-4] = patch01.x[3][i-4]; + patch11.y[0][i-4] = patch01.y[3][i-4]; + patch11.x[3][i-4] = xx[3][i]; + patch11.y[3][i-4] = yy[3][i]; + } + for (i = 0; i < patchColorComps; ++i) { + patch00.color[0][0].c[i] = patch->color[0][0].c[i]; + patch00.color[0][1].c[i] = (patch->color[0][0].c[i] + + patch->color[0][1].c[i]) / 2; + patch01.color[0][0].c[i] = patch00.color[0][1].c[i]; + patch01.color[0][1].c[i] = patch->color[0][1].c[i]; + patch01.color[1][1].c[i] = (patch->color[0][1].c[i] + + patch->color[1][1].c[i]) / 2; + patch11.color[0][1].c[i] = patch01.color[1][1].c[i]; + patch11.color[1][1].c[i] = patch->color[1][1].c[i]; + patch11.color[1][0].c[i] = (patch->color[1][1].c[i] + + patch->color[1][0].c[i]) / 2; + patch10.color[1][1].c[i] = patch11.color[1][0].c[i]; + patch10.color[1][0].c[i] = patch->color[1][0].c[i]; + patch10.color[0][0].c[i] = (patch->color[1][0].c[i] + + patch->color[0][0].c[i]) / 2; + patch00.color[1][0].c[i] = patch10.color[0][0].c[i]; + patch00.color[1][1].c[i] = (patch00.color[1][0].c[i] + + patch01.color[1][1].c[i]) / 2; + patch01.color[1][0].c[i] = patch00.color[1][1].c[i]; + patch11.color[0][0].c[i] = patch00.color[1][1].c[i]; + patch10.color[0][1].c[i] = patch00.color[1][1].c[i]; + } + fillPatch(&patch00, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading); + fillPatch(&patch10, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading); + fillPatch(&patch01, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading); + fillPatch(&patch11, colorComps, patchColorComps, refineColorThreshold, depth + 1, shading); + } +} + +void Gfx::doEndPath() { + if (state->isCurPt() && clip != clipNone) { + state->clip(); + if (clip == clipNormal) { + out->clip(state); + } else { + out->eoClip(state); + } + } + clip = clipNone; + state->clearPath(); +} + +//------------------------------------------------------------------------ +// path clipping operators +//------------------------------------------------------------------------ + +void Gfx::opClip(Object args[], int numArgs) { + clip = clipNormal; +} + +void Gfx::opEOClip(Object args[], int numArgs) { + clip = clipEO; +} + +//------------------------------------------------------------------------ +// text object operators +//------------------------------------------------------------------------ + +void Gfx::opBeginText(Object args[], int numArgs) { + out->beginTextObject(state); + state->setTextMat(1, 0, 0, 1, 0, 0); + state->textMoveTo(0, 0); + out->updateTextMat(state); + out->updateTextPos(state); + fontChanged = gTrue; + textClipBBoxEmpty = gTrue; +} + +void Gfx::opEndText(Object args[], int numArgs) { + out->endTextObject(state); +} + +//------------------------------------------------------------------------ +// text state operators +//------------------------------------------------------------------------ + +void Gfx::opSetCharSpacing(Object args[], int numArgs) { + state->setCharSpace(args[0].getNum()); + out->updateCharSpace(state); +} + +void Gfx::opSetFont(Object args[], int numArgs) { + GfxFont *font; + + if (!(font = res->lookupFont(args[0].getName()))) { + // unsetting the font (drawing no text) is better than using the + // previous one and drawing random glyphs from it + state->setFont(NULL, args[1].getNum()); + fontChanged = gTrue; + return; + } + if (printCommands) { + printf(" font: tag=%s name='%s' %g\n", + font->getTag()->getCString(), + font->getName() ? font->getName()->getCString() : "???", + args[1].getNum()); + fflush(stdout); + } + + font->incRefCnt(); + state->setFont(font, args[1].getNum()); + fontChanged = gTrue; +} + +void Gfx::opSetTextLeading(Object args[], int numArgs) { + state->setLeading(args[0].getNum()); +} + +void Gfx::opSetTextRender(Object args[], int numArgs) { + state->setRender(args[0].getInt()); + out->updateRender(state); +} + +void Gfx::opSetTextRise(Object args[], int numArgs) { + state->setRise(args[0].getNum()); + out->updateRise(state); +} + +void Gfx::opSetWordSpacing(Object args[], int numArgs) { + state->setWordSpace(args[0].getNum()); + out->updateWordSpace(state); +} + +void Gfx::opSetHorizScaling(Object args[], int numArgs) { + state->setHorizScaling(args[0].getNum()); + out->updateHorizScaling(state); + fontChanged = gTrue; +} + +//------------------------------------------------------------------------ +// text positioning operators +//------------------------------------------------------------------------ + +void Gfx::opTextMove(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX() + args[0].getNum(); + ty = state->getLineY() + args[1].getNum(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +void Gfx::opTextMoveSet(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX() + args[0].getNum(); + ty = args[1].getNum(); + state->setLeading(-ty); + ty += state->getLineY(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +void Gfx::opSetTextMatrix(Object args[], int numArgs) { + state->setTextMat(args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + state->textMoveTo(0, 0); + out->updateTextMat(state); + out->updateTextPos(state); + fontChanged = gTrue; +} + +void Gfx::opTextNextLine(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +//------------------------------------------------------------------------ +// text string operators +//------------------------------------------------------------------------ + +void Gfx::opShowText(Object args[], int numArgs) { + if (!state->getFont()) { + error(errSyntaxError, getPos(), "No font in show"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + out->beginStringOp(state); + doShowText(args[0].getString()); + out->endStringOp(state); + if (!ocState) { + doIncCharCount(args[0].getString()); + } +} + +void Gfx::opMoveShowText(Object args[], int numArgs) { + double tx, ty; + + if (!state->getFont()) { + error(errSyntaxError, getPos(), "No font in move/show"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); + out->beginStringOp(state); + doShowText(args[0].getString()); + out->endStringOp(state); + if (!ocState) { + doIncCharCount(args[0].getString()); + } +} + +void Gfx::opMoveSetShowText(Object args[], int numArgs) { + double tx, ty; + + if (!state->getFont()) { + error(errSyntaxError, getPos(), "No font in move/set/show"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + state->setWordSpace(args[0].getNum()); + state->setCharSpace(args[1].getNum()); + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateWordSpace(state); + out->updateCharSpace(state); + out->updateTextPos(state); + out->beginStringOp(state); + doShowText(args[2].getString()); + out->endStringOp(state); + if (ocState) { + doIncCharCount(args[2].getString()); + } +} + +void Gfx::opShowSpaceText(Object args[], int numArgs) { + Array *a; + Object obj; + int wMode; + int i; + + if (!state->getFont()) { + error(errSyntaxError, getPos(), "No font in show/space"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + out->beginStringOp(state); + wMode = state->getFont()->getWMode(); + a = args[0].getArray(); + for (i = 0; i < a->getLength(); ++i) { + a->get(i, &obj); + if (obj.isNum()) { + // this uses the absolute value of the font size to match + // Acrobat's behavior + if (wMode) { + state->textShift(0, -obj.getNum() * 0.001 * + state->getFontSize()); + } else { + state->textShift(-obj.getNum() * 0.001 * + state->getFontSize() * + state->getHorizScaling(), 0); + } + out->updateTextShift(state, obj.getNum()); + } else if (obj.isString()) { + doShowText(obj.getString()); + } else { + error(errSyntaxError, getPos(), + "Element of show/space array must be number or string"); + } + obj.free(); + } + out->endStringOp(state); + if (!ocState) { + a = args[0].getArray(); + for (i = 0; i < a->getLength(); ++i) { + a->get(i, &obj); + if (obj.isString()) { + doIncCharCount(obj.getString()); + } + obj.free(); + } + } +} + +void Gfx::doShowText(GooString *s) { + GfxFont *font; + int wMode; + double riseX, riseY; + CharCode code; + Unicode *u = NULL; + double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, ddx, ddy; + double originX, originY, tOriginX, tOriginY; + double x0, y0, x1, y1; + double oldCTM[6], newCTM[6]; + double *mat; + Object charProc; + Dict *resDict; + Parser *oldParser; + GfxState *savedState; + char *p; + int render; + GBool patternFill; + int len, n, uLen, nChars, nSpaces, i; + + font = state->getFont(); + wMode = font->getWMode(); + + if (out->useDrawChar()) { + out->beginString(state, s); + } + + // if we're doing a pattern fill, set up clipping + render = state->getRender(); + if (!(render & 1) && + state->getFillColorSpace()->getMode() == csPattern) { + patternFill = gTrue; + saveState(); + // disable fill, enable clipping, leave stroke unchanged + if ((render ^ (render >> 1)) & 1) { + render = 5; + } else { + render = 7; + } + state->setRender(render); + out->updateRender(state); + } else { + patternFill = gFalse; + } + + state->textTransformDelta(0, state->getRise(), &riseX, &riseY); + x0 = state->getCurX() + riseX; + y0 = state->getCurY() + riseY; + + // handle a Type 3 char + if (font->getType() == fontType3 && out->interpretType3Chars()) { + mat = state->getCTM(); + for (i = 0; i < 6; ++i) { + oldCTM[i] = mat[i]; + } + mat = state->getTextMat(); + newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2]; + newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3]; + newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2]; + newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3]; + mat = font->getFontMatrix(); + newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2]; + newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3]; + newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2]; + newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3]; + newCTM[0] *= state->getFontSize(); + newCTM[1] *= state->getFontSize(); + newCTM[2] *= state->getFontSize(); + newCTM[3] *= state->getFontSize(); + newCTM[0] *= state->getHorizScaling(); + newCTM[2] *= state->getHorizScaling(); + curX = state->getCurX(); + curY = state->getCurY(); + oldParser = parser; + p = s->getCString(); + len = s->getLength(); + while (len > 0) { + n = font->getNextChar(p, len, &code, + &u, &uLen, + &dx, &dy, &originX, &originY); + dx = dx * state->getFontSize() + state->getCharSpace(); + if (n == 1 && *p == ' ') { + dx += state->getWordSpace(); + } + dx *= state->getHorizScaling(); + dy *= state->getFontSize(); + state->textTransformDelta(dx, dy, &tdx, &tdy); + state->transform(curX + riseX, curY + riseY, &x, &y); + savedState = saveStateStack(); + state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y); + //~ the CTM concat values here are wrong (but never used) + out->updateCTM(state, 1, 0, 0, 1, 0, 0); + state->transformDelta(dx, dy, &ddx, &ddy); + if (!out->beginType3Char(state, curX + riseX, curY + riseY, ddx, ddy, + code, u, uLen)) { + ((Gfx8BitFont *)font)->getCharProc(code, &charProc); + if ((resDict = ((Gfx8BitFont *)font)->getResources())) { + pushResources(resDict); + } + if (charProc.isStream()) { + display(&charProc, gFalse); + } else { + error(errSyntaxError, getPos(), "Missing or bad Type3 CharProc entry"); + } + out->endType3Char(state); + if (resDict) { + popResources(); + } + charProc.free(); + } + restoreStateStack(savedState); + // GfxState::restore() does *not* restore the current position, + // so we deal with it here using (curX, curY) and (lineX, lineY) + curX += tdx; + curY += tdy; + state->moveTo(curX, curY); + p += n; + len -= n; + } + parser = oldParser; + + } else if (out->useDrawChar()) { + p = s->getCString(); + len = s->getLength(); + while (len > 0) { + n = font->getNextChar(p, len, &code, + &u, &uLen, + &dx, &dy, &originX, &originY); + if (wMode) { + dx *= state->getFontSize(); + dy = dy * state->getFontSize() + state->getCharSpace(); + if (n == 1 && *p == ' ') { + dy += state->getWordSpace(); + } + } else { + dx = dx * state->getFontSize() + state->getCharSpace(); + if (n == 1 && *p == ' ') { + dx += state->getWordSpace(); + } + dx *= state->getHorizScaling(); + dy *= state->getFontSize(); + } + state->textTransformDelta(dx, dy, &tdx, &tdy); + originX *= state->getFontSize(); + originY *= state->getFontSize(); + state->textTransformDelta(originX, originY, &tOriginX, &tOriginY); + if (ocState) + out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY, + tdx, tdy, tOriginX, tOriginY, code, n, u, uLen); + state->shift(tdx, tdy); + p += n; + len -= n; + } + } else { + dx = dy = 0; + p = s->getCString(); + len = s->getLength(); + nChars = nSpaces = 0; + while (len > 0) { + n = font->getNextChar(p, len, &code, + &u, &uLen, + &dx2, &dy2, &originX, &originY); + dx += dx2; + dy += dy2; + if (n == 1 && *p == ' ') { + ++nSpaces; + } + ++nChars; + p += n; + len -= n; + } + if (wMode) { + dx *= state->getFontSize(); + dy = dy * state->getFontSize() + + nChars * state->getCharSpace() + + nSpaces * state->getWordSpace(); + } else { + dx = dx * state->getFontSize() + + nChars * state->getCharSpace() + + nSpaces * state->getWordSpace(); + dx *= state->getHorizScaling(); + dy *= state->getFontSize(); + } + state->textTransformDelta(dx, dy, &tdx, &tdy); + if (ocState) + out->drawString(state, s); + state->shift(tdx, tdy); + } + + if (out->useDrawChar()) { + out->endString(state); + } + + if (patternFill && ocState) { + out->saveTextPos(state); + // tell the OutputDev to do the clipping + out->endTextObject(state); + // set up a clipping bbox so doPatternText will work -- assume + // that the text bounding box does not extend past the baseline in + // any direction by more than twice the font size + x1 = state->getCurX() + riseX; + y1 = state->getCurY() + riseY; + if (x0 > x1) { + x = x0; x0 = x1; x1 = x; + } + if (y0 > y1) { + y = y0; y0 = y1; y1 = y; + } + state->textTransformDelta(0, state->getFontSize(), &dx, &dy); + state->textTransformDelta(state->getFontSize(), 0, &dx2, &dy2); + dx = fabs(dx); + dx2 = fabs(dx2); + if (dx2 > dx) { + dx = dx2; + } + dy = fabs(dy); + dy2 = fabs(dy2); + if (dy2 > dy) { + dy = dy2; + } + state->clipToRect(x0 - 2 * dx, y0 - 2 * dy, x1 + 2 * dx, y1 + 2 * dy); + // set render mode to fill-only + state->setRender(0); + out->updateRender(state); + doPatternText(); + restoreState(); + out->restoreTextPos(state); + } + + updateLevel += 10 * s->getLength(); +} + +// NB: this is only called when ocState is false. +void Gfx::doIncCharCount(GooString *s) { + if (out->needCharCount()) { + out->incCharCount(s->getLength()); + } +} + +//------------------------------------------------------------------------ +// XObject operators +//------------------------------------------------------------------------ + +void Gfx::opXObject(Object args[], int numArgs) { + char *name; + Object obj1, obj2, obj3, refObj; +#if OPI_SUPPORT + Object opiDict; +#endif + + if (!ocState && !out->needCharCount()) { + return; + } + name = args[0].getName(); + if (!res->lookupXObject(name, &obj1)) { + return; + } + if (!obj1.isStream()) { + error(errSyntaxError, getPos(), "XObject '{0:s}' is wrong type", name); + obj1.free(); + return; + } + +#if OPI_SUPPORT + obj1.streamGetDict()->lookup("OPI", &opiDict); + if (opiDict.isDict()) { + out->opiBegin(state, opiDict.getDict()); + } +#endif + obj1.streamGetDict()->lookup("Subtype", &obj2); + if (obj2.isName("Image")) { + if (out->needNonText()) { + res->lookupXObjectNF(name, &refObj); + doImage(&refObj, obj1.getStream(), gFalse); + refObj.free(); + } + } else if (obj2.isName("Form")) { + res->lookupXObjectNF(name, &refObj); + if (out->useDrawForm() && refObj.isRef()) { + out->drawForm(refObj.getRef()); + } else { + doForm(&obj1); + } + refObj.free(); + } else if (obj2.isName("PS")) { + obj1.streamGetDict()->lookup("Level1", &obj3); + out->psXObject(obj1.getStream(), + obj3.isStream() ? obj3.getStream() : (Stream *)NULL); + } else if (obj2.isName()) { + error(errSyntaxError, getPos(), "Unknown XObject subtype '{0:s}'", obj2.getName()); + } else { + error(errSyntaxError, getPos(), "XObject subtype is missing or wrong type"); + } + obj2.free(); +#if OPI_SUPPORT + if (opiDict.isDict()) { + out->opiEnd(state, opiDict.getDict()); + } + opiDict.free(); +#endif + obj1.free(); +} + +void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) { + Dict *dict, *maskDict; + int width, height; + int bits, maskBits; + GBool interpolate; + StreamColorSpaceMode csMode; + GBool mask; + GBool invert; + GfxColorSpace *colorSpace, *maskColorSpace; + GfxImageColorMap *colorMap, *maskColorMap; + Object maskObj, smaskObj; + GBool haveColorKeyMask, haveExplicitMask, haveSoftMask; + int maskColors[2*gfxColorMaxComps]; + int maskWidth, maskHeight; + GBool maskInvert; + GBool maskInterpolate; + Stream *maskStr; + Object obj1, obj2; + int i, n; + + // get info from the stream + bits = 0; + csMode = streamCSNone; + str->getImageParams(&bits, &csMode); + + // get stream dict + dict = str->getDict(); + + // check for optional content key + if (ref) { + dict->lookupNF("OC", &obj1); + if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) { + obj1.free(); + return; + } + obj1.free(); + } + + // get size + dict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("W", &obj1); + } + if (obj1.isInt()) + width = obj1.getInt(); + else if (obj1.isReal()) + width = (int)obj1.getReal(); + else + goto err2; + obj1.free(); + dict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("H", &obj1); + } + if (obj1.isInt()) + height = obj1.getInt(); + else if (obj1.isReal()) + height = (int)obj1.getReal(); + else + goto err2; + obj1.free(); + + if (width < 1 || height < 1) + goto err1; + + // image interpolation + dict->lookup("Interpolate", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("I", &obj1); + } + if (obj1.isBool()) + interpolate = obj1.getBool(); + else + interpolate = gFalse; + obj1.free(); + maskInterpolate = gFalse; + + // image or mask? + dict->lookup("ImageMask", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("IM", &obj1); + } + mask = gFalse; + if (obj1.isBool()) + mask = obj1.getBool(); + else if (!obj1.isNull()) + goto err2; + obj1.free(); + + // bit depth + if (bits == 0) { + dict->lookup("BitsPerComponent", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("BPC", &obj1); + } + if (obj1.isInt()) { + bits = obj1.getInt(); + } else if (mask) { + bits = 1; + } else { + goto err2; + } + obj1.free(); + } + + // display a mask + if (mask) { + + // check for inverted mask + if (bits != 1) + goto err1; + invert = gFalse; + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + if (obj1.isArray()) { + obj1.arrayGet(0, &obj2); + // Table 4.39 says /Decode must be [1 0] or [0 1]. Adobe + // accepts [1.0 0.0] as well. + if (obj2.isNum() && obj2.getNum() >= 0.9) + invert = gTrue; + obj2.free(); + } else if (!obj1.isNull()) { + goto err2; + } + obj1.free(); + + // if drawing is disabled, skip over inline image data + if (!ocState) { + str->reset(); + n = height * ((width + 7) / 8); + for (i = 0; i < n; ++i) { + str->getChar(); + } + str->close(); + + // draw it + } else { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternImageMask(ref, str, width, height, invert, inlineImg); + } else { + out->drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg); + } + } + } else { + + // get color space and color map + dict->lookup("ColorSpace", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("CS", &obj1); + } + if (obj1.isName() && inlineImg) { + res->lookupColorSpace(obj1.getName(), &obj2); + if (!obj2.isNull()) { + obj1.free(); + obj1 = obj2; + } else { + obj2.free(); + } + } + if (!obj1.isNull()) { + colorSpace = GfxColorSpace::parse(&obj1, this); + } else if (csMode == streamCSDeviceGray) { + Object objCS; + res->lookupColorSpace("DefaultGray", &objCS); + if (objCS.isNull()) { + colorSpace = new GfxDeviceGrayColorSpace(); + } else { + colorSpace = GfxColorSpace::parse(&objCS, this); + } + objCS.free(); + } else if (csMode == streamCSDeviceRGB) { + Object objCS; + res->lookupColorSpace("DefaultRGB", &objCS); + if (objCS.isNull()) { + colorSpace = new GfxDeviceRGBColorSpace(); + } else { + colorSpace = GfxColorSpace::parse(&objCS, this); + } + objCS.free(); + } else if (csMode == streamCSDeviceCMYK) { + Object objCS; + res->lookupColorSpace("DefaultCMYK", &objCS); + if (objCS.isNull()) { + colorSpace = new GfxDeviceCMYKColorSpace(); + } else { + colorSpace = GfxColorSpace::parse(&objCS, this); + } + objCS.free(); + } else { + colorSpace = NULL; + } + obj1.free(); + if (!colorSpace) { + goto err1; + } + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + if (bits == 0) { + delete colorSpace; + goto err2; + } + colorMap = new GfxImageColorMap(bits, &obj1, colorSpace); + obj1.free(); + if (!colorMap->isOk()) { + delete colorMap; + goto err1; + } + + // get the mask + haveColorKeyMask = haveExplicitMask = haveSoftMask = gFalse; + maskStr = NULL; // make gcc happy + maskWidth = maskHeight = 0; // make gcc happy + maskInvert = gFalse; // make gcc happy + maskColorMap = NULL; // make gcc happy + dict->lookup("Mask", &maskObj); + dict->lookup("SMask", &smaskObj); + if (smaskObj.isStream()) { + // soft mask + if (inlineImg) { + goto err1; + } + maskStr = smaskObj.getStream(); + maskDict = smaskObj.streamGetDict(); + maskDict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("W", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskWidth = obj1.getInt(); + obj1.free(); + maskDict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("H", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskHeight = obj1.getInt(); + obj1.free(); + maskDict->lookup("Interpolate", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("I", &obj1); + } + if (obj1.isBool()) + maskInterpolate = obj1.getBool(); + else + maskInterpolate = gFalse; + obj1.free(); + maskDict->lookup("BitsPerComponent", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("BPC", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskBits = obj1.getInt(); + obj1.free(); + maskDict->lookup("ColorSpace", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("CS", &obj1); + } + if (obj1.isName()) { + res->lookupColorSpace(obj1.getName(), &obj2); + if (!obj2.isNull()) { + obj1.free(); + obj1 = obj2; + } else { + obj2.free(); + } + } + maskColorSpace = GfxColorSpace::parse(&obj1, this); + obj1.free(); + if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) { + goto err1; + } + maskDict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("D", &obj1); + } + maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace); + obj1.free(); + if (!maskColorMap->isOk()) { + delete maskColorMap; + goto err1; + } + //~ handle the Matte entry + haveSoftMask = gTrue; + } else if (maskObj.isArray()) { + // color key mask + for (i = 0; + i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps; + ++i) { + maskObj.arrayGet(i, &obj1); + if (obj1.isInt()) { + maskColors[i] = obj1.getInt(); + } else if (obj1.isReal()) { + error(errSyntaxError, -1, "Mask entry should be an integer but it's a real, trying to use it"); + maskColors[i] = (int) obj1.getReal(); + } else { + error(errSyntaxError, -1, "Mask entry should be an integer but it's of type {0:d}", obj1.getType()); + obj1.free(); + goto err1; + } + obj1.free(); + } + haveColorKeyMask = gTrue; + } else if (maskObj.isStream()) { + // explicit mask + if (inlineImg) { + goto err1; + } + maskStr = maskObj.getStream(); + maskDict = maskObj.streamGetDict(); + maskDict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("W", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskWidth = obj1.getInt(); + obj1.free(); + maskDict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("H", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskHeight = obj1.getInt(); + obj1.free(); + maskDict->lookup("Interpolate", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("I", &obj1); + } + if (obj1.isBool()) + maskInterpolate = obj1.getBool(); + else + maskInterpolate = gFalse; + obj1.free(); + maskDict->lookup("ImageMask", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("IM", &obj1); + } + if (!obj1.isBool() || !obj1.getBool()) { + goto err2; + } + obj1.free(); + maskInvert = gFalse; + maskDict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("D", &obj1); + } + if (obj1.isArray()) { + obj1.arrayGet(0, &obj2); + // Table 4.39 says /Decode must be [1 0] or [0 1]. Adobe + // accepts [1.0 0.0] as well. + if (obj2.isNum() && obj2.getNum() >= 0.9) { + maskInvert = gTrue; + } + obj2.free(); + } else if (!obj1.isNull()) { + goto err2; + } + obj1.free(); + haveExplicitMask = gTrue; + } + + // if drawing is disabled, skip over inline image data + if (!ocState) { + str->reset(); + n = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + for (i = 0; i < n; ++i) { + str->getChar(); + } + str->close(); + + // draw it + } else { + if (haveSoftMask) { + out->drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate); + delete maskColorMap; + } else if (haveExplicitMask) { + out->drawMaskedImage(state, ref, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskInvert, maskInterpolate); + } else { + out->drawImage(state, ref, str, width, height, colorMap, interpolate, + haveColorKeyMask ? maskColors : (int *)NULL, inlineImg); + } + } + delete colorMap; + + maskObj.free(); + smaskObj.free(); + } + + if ((i = width * height) > 1000) { + i = 1000; + } + updateLevel += i; + + return; + + err2: + obj1.free(); + err1: + error(errSyntaxError, getPos(), "Bad image parameters"); +} + +GBool Gfx::checkTransparencyGroup(Dict *resDict) { + // check the effect of compositing objects as a group: + // look for ExtGState entries with ca != 1 or CA != 1 or BM != normal + Object extGStates; + GBool transpGroup = gFalse; + double opac; + + if (resDict == NULL) + return gFalse; + pushResources(resDict); + resDict->lookup("ExtGState", &extGStates); + if (extGStates.isDict()) { + Dict *dict = extGStates.getDict(); + for (int i = 0; i < dict->getLength() && !transpGroup; i++) { + Object obj1, obj2; + GfxBlendMode mode; + + if (res->lookupGState(dict->getKey(i), &obj1)) { + if (!obj1.dictLookup("BM", &obj2)->isNull()) { + if (state->parseBlendMode(&obj2, &mode)) { + if (mode != gfxBlendNormal) + transpGroup = gTrue; + } else { + error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState"); + } + } + obj2.free(); + if (obj1.dictLookup("ca", &obj2)->isNum()) { + opac = obj2.getNum(); + opac = opac < 0 ? 0 : opac > 1 ? 1 : opac; + if (opac != 1) + transpGroup = gTrue; + } + obj2.free(); + if (obj1.dictLookup("CA", &obj2)->isNum()) { + opac = obj2.getNum(); + opac = opac < 0 ? 0 : opac > 1 ? 1 : opac; + if (opac != 1) + transpGroup = gTrue; + } + obj2.free(); + // alpha is shape + if (!transpGroup && obj1.dictLookup("AIS", &obj2)->isBool()) { + transpGroup = obj2.getBool(); + } + obj2.free(); + // soft mask + if (!transpGroup && !obj1.dictLookup("SMask", &obj2)->isNull()) { + if (!obj2.isName("None")) { + transpGroup = gTrue; + } + } + obj2.free(); + } + obj1.free(); + } + } + extGStates.free(); + popResources(); + return transpGroup; +} + +void Gfx::doForm(Object *str) { + Dict *dict; + GBool transpGroup, isolated, knockout; + GfxColorSpace *blendingColorSpace; + Object matrixObj, bboxObj; + double m[6], bbox[4]; + Object resObj; + Dict *resDict; + GBool ocSaved; + Object obj1, obj2, obj3; + int i; + + // check for excessive recursion + if (formDepth > 100) { + return; + } + + // get stream dict + dict = str->streamGetDict(); + + // check form type + dict->lookup("FormType", &obj1); + if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { + error(errSyntaxError, getPos(), "Unknown form type"); + } + obj1.free(); + + // check for optional content key + ocSaved = ocState; + dict->lookupNF("OC", &obj1); + if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) { + obj1.free(); + if (out->needCharCount()) { + ocState = gFalse; + } else { + return; + } + } + obj1.free(); + + // get bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + bboxObj.free(); + error(errSyntaxError, getPos(), "Bad form bounding box"); + ocState = ocSaved; + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + if (likely(obj1.isNum())) { + bbox[i] = obj1.getNum(); + obj1.free(); + } else { + obj1.free(); + error(errSyntaxError, getPos(), "Bad form bounding box value"); + return; + } + } + bboxObj.free(); + + // get matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray()) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + if (likely(obj1.isNum())) m[i] = obj1.getNum(); + else m[i] = 0; + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // get resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; + + // check for a transparency group + transpGroup = isolated = knockout = gFalse; + blendingColorSpace = NULL; + if (dict->lookup("Group", &obj1)->isDict()) { + if (obj1.dictLookup("S", &obj2)->isName("Transparency")) { + if (!obj1.dictLookup("CS", &obj3)->isNull()) { + blendingColorSpace = GfxColorSpace::parse(&obj3, this); + } + obj3.free(); + if (obj1.dictLookup("I", &obj3)->isBool()) { + isolated = obj3.getBool(); + } + obj3.free(); + if (obj1.dictLookup("K", &obj3)->isBool()) { + knockout = obj3.getBool(); + } + obj3.free(); + transpGroup = isolated || out->checkTransparencyGroup(state, knockout) || checkTransparencyGroup(resDict); + } + obj2.free(); + } + obj1.free(); + + // draw it + ++formDepth; + drawForm(str, resDict, m, bbox, + transpGroup, gFalse, blendingColorSpace, isolated, knockout); + --formDepth; + + if (blendingColorSpace) { + delete blendingColorSpace; + } + resObj.free(); + + ocState = ocSaved; +} + +void Gfx::drawForm(Object *str, Dict *resDict, double *matrix, double *bbox, + GBool transpGroup, GBool softMask, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool alpha, Function *transferFunc, + GfxColor *backdropColor) { + Parser *oldParser; + GfxState *savedState; + double oldBaseMatrix[6]; + int i; + + // push new resources on stack + pushResources(resDict); + + // save current graphics state + savedState = saveStateStack(); + + // kill any pre-existing path + state->clearPath(); + + // save current parser + oldParser = parser; + + // set form transformation matrix + state->concatCTM(matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + out->updateCTM(state, matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + + // set form bounding box + state->moveTo(bbox[0], bbox[1]); + state->lineTo(bbox[2], bbox[1]); + state->lineTo(bbox[2], bbox[3]); + state->lineTo(bbox[0], bbox[3]); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + + if (softMask || transpGroup) { + if (state->getBlendMode() != gfxBlendNormal) { + state->setBlendMode(gfxBlendNormal); + out->updateBlendMode(state); + } + if (state->getFillOpacity() != 1) { + state->setFillOpacity(1); + out->updateFillOpacity(state); + } + if (state->getStrokeOpacity() != 1) { + state->setStrokeOpacity(1); + out->updateStrokeOpacity(state); + } + out->clearSoftMask(state); + out->beginTransparencyGroup(state, bbox, blendingColorSpace, + isolated, knockout, softMask); + } + + // set new base matrix + for (i = 0; i < 6; ++i) { + oldBaseMatrix[i] = baseMatrix[i]; + baseMatrix[i] = state->getCTM()[i]; + } + + GfxState *stateBefore = state; + + // draw the form + display(str, gFalse); + + if (stateBefore != state) { + if (state->isParentState(stateBefore)) { + error(errSyntaxError, -1, "There's a form with more q than Q, trying to fix"); + while (stateBefore != state) { + restoreState(); + } + } else { + error(errSyntaxError, -1, "There's a form with more Q than q"); + } + } + + if (softMask || transpGroup) { + out->endTransparencyGroup(state); + } + + // restore base matrix + for (i = 0; i < 6; ++i) { + baseMatrix[i] = oldBaseMatrix[i]; + } + + // restore parser + parser = oldParser; + + // restore graphics state + restoreStateStack(savedState); + + // pop resource stack + popResources(); + + if (softMask) { + out->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); + } else if (transpGroup) { + out->paintTransparencyGroup(state, bbox); + } + + return; +} + +//------------------------------------------------------------------------ +// in-line image operators +//------------------------------------------------------------------------ + +void Gfx::opBeginImage(Object args[], int numArgs) { + Stream *str; + int c1, c2; + + // NB: this function is run even if ocState is false -- doImage() is + // responsible for skipping over the inline image data + + // build dict/stream + str = buildImageStream(); + + // display the image + if (str) { + doImage(NULL, str, gTrue); + + // skip 'EI' tag + c1 = str->getUndecodedStream()->getChar(); + c2 = str->getUndecodedStream()->getChar(); + while (!(c1 == 'E' && c2 == 'I') && c2 != EOF) { + c1 = c2; + c2 = str->getUndecodedStream()->getChar(); + } + delete str; + } +} + +Stream *Gfx::buildImageStream() { + Object dict; + Object obj; + char *key; + Stream *str; + + // build dictionary + dict.initDict(xref); + parser->getObj(&obj); + while (!obj.isCmd("ID") && !obj.isEOF()) { + if (!obj.isName()) { + error(errSyntaxError, getPos(), "Inline image dictionary key must be a name object"); + obj.free(); + } else { + key = copyString(obj.getName()); + obj.free(); + parser->getObj(&obj); + if (obj.isEOF() || obj.isError()) { + gfree(key); + break; + } + dict.dictAdd(key, &obj); + } + parser->getObj(&obj); + } + if (obj.isEOF()) { + error(errSyntaxError, getPos(), "End of file in inline image"); + obj.free(); + dict.free(); + return NULL; + } + obj.free(); + + // make stream + if (parser->getStream()) { + str = new EmbedStream(parser->getStream(), &dict, gFalse, 0); + str = str->addFilters(&dict); + } else { + str = NULL; + dict.free(); + } + + return str; +} + +void Gfx::opImageData(Object args[], int numArgs) { + error(errInternal, getPos(), "Got 'ID' operator"); +} + +void Gfx::opEndImage(Object args[], int numArgs) { + error(errInternal, getPos(), "Got 'EI' operator"); +} + +//------------------------------------------------------------------------ +// type 3 font operators +//------------------------------------------------------------------------ + +void Gfx::opSetCharWidth(Object args[], int numArgs) { + out->type3D0(state, args[0].getNum(), args[1].getNum()); +} + +void Gfx::opSetCacheDevice(Object args[], int numArgs) { + out->type3D1(state, args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); +} + +//------------------------------------------------------------------------ +// compatibility operators +//------------------------------------------------------------------------ + +void Gfx::opBeginIgnoreUndef(Object args[], int numArgs) { + ++ignoreUndef; +} + +void Gfx::opEndIgnoreUndef(Object args[], int numArgs) { + if (ignoreUndef > 0) + --ignoreUndef; +} + +//------------------------------------------------------------------------ +// marked content operators +//------------------------------------------------------------------------ + +enum GfxMarkedContentKind { + gfxMCOptionalContent, + gfxMCActualText, + gfxMCOther +}; + +struct MarkedContentStack { + GfxMarkedContentKind kind; + GBool ocSuppressed; // are we ignoring content based on OptionalContent? + MarkedContentStack *next; // next object on stack +}; + +void Gfx::popMarkedContent() { + MarkedContentStack *mc = mcStack; + mcStack = mc->next; + delete mc; +} + +void Gfx::pushMarkedContent() { + MarkedContentStack *mc = new MarkedContentStack(); + mc->ocSuppressed = gFalse; + mc->kind = gfxMCOther; + mc->next = mcStack; + mcStack = mc; +} + +GBool Gfx::contentIsHidden() { + MarkedContentStack *mc = mcStack; + bool hidden = mc && mc->ocSuppressed; + while (!hidden && mc && mc->next) { + mc = mc->next; + hidden = mc->ocSuppressed; + } + return hidden; +} + +void Gfx::opBeginMarkedContent(Object args[], int numArgs) { + // push a new stack entry + pushMarkedContent(); + + OCGs *contentConfig = catalog->getOptContentConfig(); + char* name0 = args[0].getName(); + if ( strncmp( name0, "OC", 2) == 0 && contentConfig) { + if ( numArgs >= 2 ) { + if (!args[1].isName()) { + error(errSyntaxError, getPos(), "Unexpected MC Type: {0:d}", args[1].getType()); + } + char* name1 = args[1].getName(); + Object markedContent; + MarkedContentStack *mc = mcStack; + mc->kind = gfxMCOptionalContent; + if ( res->lookupMarkedContentNF( name1, &markedContent ) ) { + bool visible = contentConfig->optContentIsVisible(&markedContent); + mc->ocSuppressed = !(visible); + } else { + error(errSyntaxError, getPos(), "DID NOT find {0:s}", name1); + } + markedContent.free(); + } else { + error(errSyntaxError, getPos(), "insufficient arguments for Marked Content"); + } + } else if (args[0].isName("Span") && numArgs == 2 && args[1].isDict()) { + Object obj; + if (args[1].dictLookup("ActualText", &obj)->isString()) { + out->beginActualText(state, obj.getString()); + MarkedContentStack *mc = mcStack; + mc->kind = gfxMCActualText; + } + obj.free(); + } + + if (printCommands) { + printf(" marked content: %s ", args[0].getName()); + if (numArgs == 2) + args[1].print(stdout); + printf("\n"); + fflush(stdout); + } + ocState = !contentIsHidden(); + + if (numArgs == 2 && args[1].isDict()) { + out->beginMarkedContent(args[0].getName(), args[1].getDict()); + } else if(numArgs == 1) { + out->beginMarkedContent(args[0].getName(), NULL); + } +} + +void Gfx::opEndMarkedContent(Object args[], int numArgs) { + if (!mcStack) { + error(errSyntaxWarning, getPos(), "Mismatched EMC operator"); + return; + } + + MarkedContentStack *mc = mcStack; + GfxMarkedContentKind mcKind = mc->kind; + + // pop the stack + popMarkedContent(); + + if (mcKind == gfxMCActualText) + out->endActualText(state); + ocState = !contentIsHidden(); + + out->endMarkedContent(state); +} + +void Gfx::opMarkPoint(Object args[], int numArgs) { + if (printCommands) { + printf(" mark point: %s ", args[0].getName()); + if (numArgs == 2) + args[1].print(stdout); + printf("\n"); + fflush(stdout); + } + + if(numArgs == 2 && args[1].isDict()) { + out->markPoint(args[0].getName(),args[1].getDict()); + } else { + out->markPoint(args[0].getName()); + } + +} + +//------------------------------------------------------------------------ +// misc +//------------------------------------------------------------------------ + +void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, + double xMin, double yMin, double xMax, double yMax) { + Dict *dict, *resDict; + Object matrixObj, bboxObj, resObj, obj1; + double formXMin, formYMin, formXMax, formYMax; + double x, y, sx, sy, tx, ty; + double m[6], bbox[4]; + double r, g, b; + GfxColor color; + double *dash, *dash2; + int dashLength; + int i; + + // this function assumes that we are in the default user space, + // i.e., baseMatrix = ctm + + // if the bounding box has zero width or height, don't draw anything + // at all + if (xMin == xMax || yMin == yMax) { + return; + } + + // draw the appearance stream (if there is one) + if (str->isStream()) { + + // get stream dict + dict = str->streamGetDict(); + + // get the form bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + bboxObj.free(); + error(errSyntaxError, getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + if (likely(obj1.isNum())) { + bbox[i] = obj1.getNum(); + obj1.free(); + } else { + obj1.free(); + error(errSyntaxError, getPos(), "Bad form bounding box value"); + return; + } + } + bboxObj.free(); + + // get the form matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray() && matrixObj.arrayGetLength() >= 6) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + m[i] = obj1.getNum(); + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // transform the four corners of the form bbox to default user + // space, and construct the transformed bbox + x = bbox[0] * m[0] + bbox[1] * m[2] + m[4]; + y = bbox[0] * m[1] + bbox[1] * m[3] + m[5]; + formXMin = formXMax = x; + formYMin = formYMax = y; + x = bbox[0] * m[0] + bbox[3] * m[2] + m[4]; + y = bbox[0] * m[1] + bbox[3] * m[3] + m[5]; + if (x < formXMin) { + formXMin = x; + } else if (x > formXMax) { + formXMax = x; + } + if (y < formYMin) { + formYMin = y; + } else if (y > formYMax) { + formYMax = y; + } + x = bbox[2] * m[0] + bbox[1] * m[2] + m[4]; + y = bbox[2] * m[1] + bbox[1] * m[3] + m[5]; + if (x < formXMin) { + formXMin = x; + } else if (x > formXMax) { + formXMax = x; + } + if (y < formYMin) { + formYMin = y; + } else if (y > formYMax) { + formYMax = y; + } + x = bbox[2] * m[0] + bbox[3] * m[2] + m[4]; + y = bbox[2] * m[1] + bbox[3] * m[3] + m[5]; + if (x < formXMin) { + formXMin = x; + } else if (x > formXMax) { + formXMax = x; + } + if (y < formYMin) { + formYMin = y; + } else if (y > formYMax) { + formYMax = y; + } + + // construct a mapping matrix, [sx 0 0], which maps the transformed + // [0 sy 0] + // [tx ty 1] + // bbox to the annotation rectangle + if (formXMin == formXMax) { + // this shouldn't happen + sx = 1; + } else { + sx = (xMax - xMin) / (formXMax - formXMin); + } + if (formYMin == formYMax) { + // this shouldn't happen + sy = 1; + } else { + sy = (yMax - yMin) / (formYMax - formYMin); + } + tx = -formXMin * sx + xMin; + ty = -formYMin * sy + yMin; + + // the final transform matrix is (form matrix) * (mapping matrix) + m[0] *= sx; + m[1] *= sy; + m[2] *= sx; + m[3] *= sy; + m[4] = m[4] * sx + tx; + m[5] = m[5] * sy + ty; + + // get the resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; + + // draw it + drawForm(str, resDict, m, bbox); + + resObj.free(); + } + + // draw the border + if (border && border->getWidth() > 0) { + saveState(); + if (state->getStrokeColorSpace()->getMode() != csDeviceRGB) { + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceRGBColorSpace()); + out->updateStrokeColorSpace(state); + } + if (aColor && (aColor->getSpace() == AnnotColor::colorRGB)) { + const double *values = aColor->getValues(); + r = values[0]; + g = values[1]; + b = values[2]; + } else { + r = g = b = 0; + }; + color.c[0] = dblToCol(r); + color.c[1] = dblToCol(g); + color.c[2] = dblToCol(b); + state->setStrokeColor(&color); + out->updateStrokeColor(state); + state->setLineWidth(border->getWidth()); + out->updateLineWidth(state); + dashLength = border->getDashLength(); + dash = border->getDash(); + if (border->getStyle() == AnnotBorder::borderDashed && dashLength > 0) { + dash2 = (double *)gmallocn(dashLength, sizeof(double)); + memcpy(dash2, dash, dashLength * sizeof(double)); + state->setLineDash(dash2, dashLength, 0); + out->updateLineDash(state); + } + //~ this doesn't currently handle the beveled and engraved styles + state->clearPath(); + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + if (border->getStyle() != AnnotBorder::borderUnderlined) { + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + } + out->stroke(state); + restoreState(); + } +} + +int Gfx::bottomGuard() { + return stateGuards[stateGuards.size()-1]; +} + +void Gfx::pushStateGuard() { + stateGuards.push_back(stackHeight); +} + +void Gfx::popStateGuard() { + while (stackHeight > bottomGuard() && state->hasSaves()) + restoreState(); + stateGuards.pop_back(); +} + +void Gfx::saveState() { + out->saveState(state); + state = state->save(); + stackHeight++; +} + +void Gfx::restoreState() { + if (stackHeight <= bottomGuard() || !state->hasSaves()) { + error(errSyntaxError, -1, "Restoring state when no valid states to pop"); + commandAborted = gTrue; + return; + } + state = state->restore(); + out->restoreState(state); + stackHeight--; +} + +// Create a new state stack, and initialize it with a copy of the +// current state. +GfxState *Gfx::saveStateStack() { + GfxState *oldState; + + out->saveState(state); + oldState = state; + state = state->copy(gTrue); + return oldState; +} + +// Switch back to the previous state stack. +void Gfx::restoreStateStack(GfxState *oldState) { + while (state->hasSaves()) { + restoreState(); + } + delete state; + state = oldState; + out->restoreState(state); +} + +void Gfx::pushResources(Dict *resDict) { + res = new GfxResources(xref, resDict, res); +} + +void Gfx::popResources() { + GfxResources *resPtr; + + resPtr = res->getNext(); + delete res; + res = resPtr; +} + +#ifdef USE_CMS +PopplerCache *Gfx::getIccColorSpaceCache() +{ + return &iccColorSpaceCache; +} +#endif diff --git a/poppler/Gfx.h b/poppler/Gfx.h new file mode 100644 index 0000000..37022e0 --- /dev/null +++ b/poppler/Gfx.h @@ -0,0 +1,391 @@ +//======================================================================== +// +// Gfx.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2007 Iñigo Martínez +// Copyright (C) 2008 Brad Hards +// Copyright (C) 2008, 2010 Carlos Garcia Campos +// Copyright (C) 2009-2011 Albert Astals Cid +// Copyright (C) 2009, 2010, 2012 Thomas Freitag +// Copyright (C) 2010 David Benjamin +// Copyright (C) 2010 Christian Feuersänger +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GFX_H +#define GFX_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "goo/gtypes.h" +#include "goo/GooList.h" +#include "GfxState.h" +#include "Object.h" +#include "PopplerCache.h" + +#include + +class GooString; +class PDFDoc; +class XRef; +class Array; +class Stream; +class Parser; +class Dict; +class Function; +class OutputDev; +class GfxFontDict; +class GfxFont; +class GfxPattern; +class GfxTilingPattern; +class GfxShadingPattern; +class GfxShading; +class GfxFunctionShading; +class GfxAxialShading; +class GfxRadialShading; +class GfxGouraudTriangleShading; +class GfxPatchMeshShading; +struct GfxPatch; +class GfxState; +struct GfxColor; +class GfxColorSpace; +class Gfx; +class PDFRectangle; +class AnnotBorder; +class AnnotColor; +class Catalog; +struct MarkedContentStack; + +//------------------------------------------------------------------------ + +enum GfxClipType { + clipNone, + clipNormal, + clipEO +}; + +enum TchkType { + tchkBool, // boolean + tchkInt, // integer + tchkNum, // number (integer or real) + tchkString, // string + tchkName, // name + tchkArray, // array + tchkProps, // properties (dictionary or name) + tchkSCN, // scn/SCN args (number of name) + tchkNone // used to avoid empty initializer lists +}; + +#define maxArgs 33 + +struct Operator { + char name[4]; + int numArgs; + TchkType tchk[maxArgs]; + void (Gfx::*func)(Object args[], int numArgs); +}; + +//------------------------------------------------------------------------ + +class GfxResources { +public: + + GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA); + ~GfxResources(); + + GfxFont *lookupFont(char *name); + GBool lookupXObject(char *name, Object *obj); + GBool lookupXObjectNF(char *name, Object *obj); + GBool lookupMarkedContentNF(char *name, Object *obj); + void lookupColorSpace(const char *name, Object *obj); + GfxPattern *lookupPattern(char *name, Gfx *gfx); + GfxShading *lookupShading(char *name, Gfx *gfx); + GBool lookupGState(char *name, Object *obj); + GBool lookupGStateNF(char *name, Object *obj); + + GfxResources *getNext() { return next; } + +private: + + GfxFontDict *fonts; + Object xObjDict; + Object colorSpaceDict; + Object patternDict; + Object shadingDict; + Object gStateDict; + PopplerObjectCache gStateCache; + Object propertiesDict; + GfxResources *next; +}; + +//------------------------------------------------------------------------ +// Gfx +//------------------------------------------------------------------------ + +class Gfx { +public: + + // Constructor for regular output. + Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict, + double hDPI, double vDPI, PDFRectangle *box, + PDFRectangle *cropBox, int rotate, + GBool (*abortCheckCbkA)(void *data) = NULL, + void *abortCheckCbkDataA = NULL); + + // Constructor for a sub-page object. + Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict, + PDFRectangle *box, PDFRectangle *cropBox, + GBool (*abortCheckCbkA)(void *data) = NULL, + void *abortCheckCbkDataA = NULL); + + ~Gfx(); + + // Interpret a stream or array of streams. + void display(Object *obj, GBool topLevel = gTrue); + + // Display an annotation, given its appearance (a Form XObject), + // border style, and bounding box (in default user space). + void drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, + double xMin, double yMin, double xMax, double yMax); + + // Save graphics state. + void saveState(); + + // Push a new state guard + void pushStateGuard(); + + // Restore graphics state. + void restoreState(); + + // Pop to state guard and pop guard + void popStateGuard(); + + // Get the current graphics state object. + GfxState *getState() { return state; } + + GBool checkTransparencyGroup(Dict *resDict); + + void drawForm(Object *str, Dict *resDict, double *matrix, double *bbox, + GBool transpGroup = gFalse, GBool softMask = gFalse, + GfxColorSpace *blendingColorSpace = NULL, + GBool isolated = gFalse, GBool knockout = gFalse, + GBool alpha = gFalse, Function *transferFunc = NULL, + GfxColor *backdropColor = NULL); + + void pushResources(Dict *resDict); + void popResources(); + +#ifdef USE_CMS + PopplerCache *getIccColorSpaceCache(); +#endif + +private: + + PDFDoc *doc; + XRef *xref; // the xref table for this PDF file + Catalog *catalog; // the Catalog for this PDF file + OutputDev *out; // output device + GBool subPage; // is this a sub-page object? + GBool printCommands; // print the drawing commands (for debugging) + GBool profileCommands; // profile the drawing commands (for debugging) + GBool commandAborted; // did the previous command abort the drawing? + GfxResources *res; // resource stack + int updateLevel; + + GfxState *state; // current graphics state + int stackHeight; // the height of the current graphics stack + std::vector stateGuards; // a stack of state limits; to guard against unmatched pops + GBool fontChanged; // set if font or text matrix has changed + GfxClipType clip; // do a clip? + int ignoreUndef; // current BX/EX nesting level + double baseMatrix[6]; // default matrix for most recent + // page/form/pattern + int formDepth; + double textClipBBox[4]; // text clipping bounding box + GBool textClipBBoxEmpty; // true if textClipBBox has not been + // initialized yet + GBool ocState; // true if drawing is enabled, false if + // disabled + + MarkedContentStack *mcStack; // current BMC/EMC stack + + Parser *parser; // parser for page content stream(s) + +#ifdef USE_CMS + PopplerCache iccColorSpaceCache; +#endif + + GBool // callback to check for an abort + (*abortCheckCbk)(void *data); + void *abortCheckCbkData; + + static Operator opTab[]; // table of operators + + void go(GBool topLevel); + void execOp(Object *cmd, Object args[], int numArgs); + Operator *findOp(char *name); + GBool checkArg(Object *arg, TchkType type); + int getPos(); + + int bottomGuard(); + + // graphics state operators + void opSave(Object args[], int numArgs); + void opRestore(Object args[], int numArgs); + void opConcat(Object args[], int numArgs); + void opSetDash(Object args[], int numArgs); + void opSetFlat(Object args[], int numArgs); + void opSetLineJoin(Object args[], int numArgs); + void opSetLineCap(Object args[], int numArgs); + void opSetMiterLimit(Object args[], int numArgs); + void opSetLineWidth(Object args[], int numArgs); + void opSetExtGState(Object args[], int numArgs); + void doSoftMask(Object *str, GBool alpha, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + Function *transferFunc, GfxColor *backdropColor); + void opSetRenderingIntent(Object args[], int numArgs); + + // color operators + void opSetFillGray(Object args[], int numArgs); + void opSetStrokeGray(Object args[], int numArgs); + void opSetFillCMYKColor(Object args[], int numArgs); + void opSetStrokeCMYKColor(Object args[], int numArgs); + void opSetFillRGBColor(Object args[], int numArgs); + void opSetStrokeRGBColor(Object args[], int numArgs); + void opSetFillColorSpace(Object args[], int numArgs); + void opSetStrokeColorSpace(Object args[], int numArgs); + void opSetFillColor(Object args[], int numArgs); + void opSetStrokeColor(Object args[], int numArgs); + void opSetFillColorN(Object args[], int numArgs); + void opSetStrokeColorN(Object args[], int numArgs); + + // path segment operators + void opMoveTo(Object args[], int numArgs); + void opLineTo(Object args[], int numArgs); + void opCurveTo(Object args[], int numArgs); + void opCurveTo1(Object args[], int numArgs); + void opCurveTo2(Object args[], int numArgs); + void opRectangle(Object args[], int numArgs); + void opClosePath(Object args[], int numArgs); + + // path painting operators + void opEndPath(Object args[], int numArgs); + void opStroke(Object args[], int numArgs); + void opCloseStroke(Object args[], int numArgs); + void opFill(Object args[], int numArgs); + void opEOFill(Object args[], int numArgs); + void opFillStroke(Object args[], int numArgs); + void opCloseFillStroke(Object args[], int numArgs); + void opEOFillStroke(Object args[], int numArgs); + void opCloseEOFillStroke(Object args[], int numArgs); + void doPatternFill(GBool eoFill); + void doPatternStroke(); + void doPatternText(); + void doPatternImageMask(Object *ref, Stream *str, int width, int height, + GBool invert, GBool inlineImg); + void doTilingPatternFill(GfxTilingPattern *tPat, + GBool stroke, GBool eoFill, GBool text); + void doShadingPatternFill(GfxShadingPattern *sPat, + GBool stroke, GBool eoFill, GBool text); + void opShFill(Object args[], int numArgs); + void doFunctionShFill(GfxFunctionShading *shading); + void doFunctionShFill1(GfxFunctionShading *shading, + double x0, double y0, + double x1, double y1, + GfxColor *colors, int depth); + void doAxialShFill(GfxAxialShading *shading); + void doRadialShFill(GfxRadialShading *shading); + void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading); + void gouraudFillTriangle(double x0, double y0, GfxColor *color0, + double x1, double y1, GfxColor *color1, + double x2, double y2, GfxColor *color2, + int nComps, int depth, GfxState::ReusablePathIterator *path); + void gouraudFillTriangle(double x0, double y0, double color0, + double x1, double y1, double color1, + double x2, double y2, double color2, + double refineColorThreshold, int depth, GfxGouraudTriangleShading *shading, GfxState::ReusablePathIterator *path); + void doPatchMeshShFill(GfxPatchMeshShading *shading); + void fillPatch(GfxPatch *patch, int colorComps, int patchColorComps, double refineColorThreshold, int depth, GfxPatchMeshShading *shading); + void doEndPath(); + + // path clipping operators + void opClip(Object args[], int numArgs); + void opEOClip(Object args[], int numArgs); + + // text object operators + void opBeginText(Object args[], int numArgs); + void opEndText(Object args[], int numArgs); + + // text state operators + void opSetCharSpacing(Object args[], int numArgs); + void opSetFont(Object args[], int numArgs); + void opSetTextLeading(Object args[], int numArgs); + void opSetTextRender(Object args[], int numArgs); + void opSetTextRise(Object args[], int numArgs); + void opSetWordSpacing(Object args[], int numArgs); + void opSetHorizScaling(Object args[], int numArgs); + + // text positioning operators + void opTextMove(Object args[], int numArgs); + void opTextMoveSet(Object args[], int numArgs); + void opSetTextMatrix(Object args[], int numArgs); + void opTextNextLine(Object args[], int numArgs); + + // text string operators + void opShowText(Object args[], int numArgs); + void opMoveShowText(Object args[], int numArgs); + void opMoveSetShowText(Object args[], int numArgs); + void opShowSpaceText(Object args[], int numArgs); + void doShowText(GooString *s); + void doIncCharCount(GooString *s); + + // XObject operators + void opXObject(Object args[], int numArgs); + void doImage(Object *ref, Stream *str, GBool inlineImg); + void doForm(Object *str); + + // in-line image operators + void opBeginImage(Object args[], int numArgs); + Stream *buildImageStream(); + void opImageData(Object args[], int numArgs); + void opEndImage(Object args[], int numArgs); + + // type 3 font operators + void opSetCharWidth(Object args[], int numArgs); + void opSetCacheDevice(Object args[], int numArgs); + + // compatibility operators + void opBeginIgnoreUndef(Object args[], int numArgs); + void opEndIgnoreUndef(Object args[], int numArgs); + + // marked content operators + void opBeginMarkedContent(Object args[], int numArgs); + void opEndMarkedContent(Object args[], int numArgs); + void opMarkPoint(Object args[], int numArgs); + GfxState *saveStateStack(); + void restoreStateStack(GfxState *oldState); + GBool contentIsHidden(); + void pushMarkedContent(); + void popMarkedContent(); +}; + +#endif diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc new file mode 100644 index 0000000..ea22af8 --- /dev/null +++ b/poppler/GfxFont.cc @@ -0,0 +1,2535 @@ +//======================================================================== +// +// GfxFont.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2006, 2008-2010, 2012 Albert Astals Cid +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2007 Jeff Muizelaar +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2007 Ed Catmur +// Copyright (C) 2008 Jonathan Kew +// Copyright (C) 2008 Ed Avis +// Copyright (C) 2008, 2010 Hib Eris +// Copyright (C) 2009 Peter Kerzum +// Copyright (C) 2009, 2010 David Benjamin +// Copyright (C) 2011 Axel Strübing +// Copyright (C) 2011, 2012 Adrian Johnson +// Copyright (C) 2012 Yi Yang +// Copyright (C) 2012 Suzuki Toshiya +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include +#include +#include "goo/gmem.h" +#include "Error.h" +#include "Object.h" +#include "Dict.h" +#include "GlobalParams.h" +#include "CMap.h" +#include "CharCodeToUnicode.h" +#include "FontEncodingTables.h" +#include "BuiltinFontTables.h" +#include "UnicodeTypeTable.h" +#include +#include +#include +#include +#include "GfxFont.h" + +//------------------------------------------------------------------------ + +struct Base14FontMapEntry { + const char *altName; + const char *base14Name; +}; + +static const Base14FontMapEntry base14FontMap[] = { + { "Arial", "Helvetica" }, + { "Arial,Bold", "Helvetica-Bold" }, + { "Arial,BoldItalic", "Helvetica-BoldOblique" }, + { "Arial,Italic", "Helvetica-Oblique" }, + { "Arial-Bold", "Helvetica-Bold" }, + { "Arial-BoldItalic", "Helvetica-BoldOblique" }, + { "Arial-BoldItalicMT", "Helvetica-BoldOblique" }, + { "Arial-BoldMT", "Helvetica-Bold" }, + { "Arial-Italic", "Helvetica-Oblique" }, + { "Arial-ItalicMT", "Helvetica-Oblique" }, + { "ArialMT", "Helvetica" }, + { "Courier", "Courier" }, + { "Courier,Bold", "Courier-Bold" }, + { "Courier,BoldItalic", "Courier-BoldOblique" }, + { "Courier,Italic", "Courier-Oblique" }, + { "Courier-Bold", "Courier-Bold" }, + { "Courier-BoldOblique", "Courier-BoldOblique" }, + { "Courier-Oblique", "Courier-Oblique" }, + { "CourierNew", "Courier" }, + { "CourierNew,Bold", "Courier-Bold" }, + { "CourierNew,BoldItalic", "Courier-BoldOblique" }, + { "CourierNew,Italic", "Courier-Oblique" }, + { "CourierNew-Bold", "Courier-Bold" }, + { "CourierNew-BoldItalic", "Courier-BoldOblique" }, + { "CourierNew-Italic", "Courier-Oblique" }, + { "CourierNewPS-BoldItalicMT", "Courier-BoldOblique" }, + { "CourierNewPS-BoldMT", "Courier-Bold" }, + { "CourierNewPS-ItalicMT", "Courier-Oblique" }, + { "CourierNewPSMT", "Courier" }, + { "Helvetica", "Helvetica" }, + { "Helvetica,Bold", "Helvetica-Bold" }, + { "Helvetica,BoldItalic", "Helvetica-BoldOblique" }, + { "Helvetica,Italic", "Helvetica-Oblique" }, + { "Helvetica-Bold", "Helvetica-Bold" }, + { "Helvetica-BoldItalic", "Helvetica-BoldOblique" }, + { "Helvetica-BoldOblique", "Helvetica-BoldOblique" }, + { "Helvetica-Italic", "Helvetica-Oblique" }, + { "Helvetica-Oblique", "Helvetica-Oblique" }, + { "Symbol", "Symbol" }, + { "Symbol,Bold", "Symbol" }, + { "Symbol,BoldItalic", "Symbol" }, + { "Symbol,Italic", "Symbol" }, + { "Times-Bold", "Times-Bold" }, + { "Times-BoldItalic", "Times-BoldItalic" }, + { "Times-Italic", "Times-Italic" }, + { "Times-Roman", "Times-Roman" }, + { "TimesNewRoman", "Times-Roman" }, + { "TimesNewRoman,Bold", "Times-Bold" }, + { "TimesNewRoman,BoldItalic", "Times-BoldItalic" }, + { "TimesNewRoman,Italic", "Times-Italic" }, + { "TimesNewRoman-Bold", "Times-Bold" }, + { "TimesNewRoman-BoldItalic", "Times-BoldItalic" }, + { "TimesNewRoman-Italic", "Times-Italic" }, + { "TimesNewRomanPS", "Times-Roman" }, + { "TimesNewRomanPS-Bold", "Times-Bold" }, + { "TimesNewRomanPS-BoldItalic", "Times-BoldItalic" }, + { "TimesNewRomanPS-BoldItalicMT", "Times-BoldItalic" }, + { "TimesNewRomanPS-BoldMT", "Times-Bold" }, + { "TimesNewRomanPS-Italic", "Times-Italic" }, + { "TimesNewRomanPS-ItalicMT", "Times-Italic" }, + { "TimesNewRomanPSMT", "Times-Roman" }, + { "TimesNewRomanPSMT,Bold", "Times-Bold" }, + { "TimesNewRomanPSMT,BoldItalic", "Times-BoldItalic" }, + { "TimesNewRomanPSMT,Italic", "Times-Italic" }, + { "ZapfDingbats", "ZapfDingbats" } +}; + +//------------------------------------------------------------------------ + +// index: {fixed:0, sans-serif:4, serif:8} + bold*2 + italic +// NB: must be in same order as psSubstFonts in PSOutputDev.cc +static const char *base14SubstFonts[14] = { + "Courier", + "Courier-Oblique", + "Courier-Bold", + "Courier-BoldOblique", + "Helvetica", + "Helvetica-Oblique", + "Helvetica-Bold", + "Helvetica-BoldOblique", + "Times-Roman", + "Times-Italic", + "Times-Bold", + "Times-BoldItalic", + // the last two are never used for substitution + "Symbol", + "ZapfDingbats" +}; + +//------------------------------------------------------------------------ + +static int parseCharName(char *charName, Unicode *uBuf, int uLen, + GBool names, GBool ligatures, + GBool numeric, GBool hex, GBool variants); + +//------------------------------------------------------------------------ + +static int readFromStream(void *data) { + return ((Stream *)data)->getChar(); +} + +//------------------------------------------------------------------------ +// GfxFontLoc +//------------------------------------------------------------------------ + +GfxFontLoc::GfxFontLoc() { + path = NULL; + fontNum = 0; + encoding = NULL; + substIdx = -1; +} + +GfxFontLoc::~GfxFontLoc() { + if (path) { + delete path; + } + if (encoding) { + delete encoding; + } +} + +//------------------------------------------------------------------------ +// GfxFont +//------------------------------------------------------------------------ + +GfxFont *GfxFont::makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict) { + GooString *nameA; + Ref embFontIDA; + GfxFontType typeA; + GfxFont *font; + Object obj1; + + // get base font name + nameA = NULL; + fontDict->lookup("BaseFont", &obj1); + if (obj1.isName()) { + nameA = new GooString(obj1.getName()); + } + obj1.free(); + + // get embedded font ID and font type + typeA = getFontType(xref, fontDict, &embFontIDA); + + // create the font object + font = NULL; + if (typeA < fontCIDType0) { + font = new Gfx8BitFont(xref, tagA, idA, nameA, typeA, embFontIDA, + fontDict); + } else { + font = new GfxCIDFont(xref, tagA, idA, nameA, typeA, embFontIDA, + fontDict); + } + + return font; +} + +GfxFont::GfxFont(const char *tagA, Ref idA, GooString *nameA, + GfxFontType typeA, Ref embFontIDA) { + ok = gFalse; + tag = new GooString(tagA); + id = idA; + name = nameA; + type = typeA; + embFontID = embFontIDA; + embFontName = NULL; + family = NULL; + stretch = StretchNotDefined; + weight = WeightNotDefined; + refCnt = 1; + encodingName = new GooString(""); + hasToUnicode = gFalse; +} + +GfxFont::~GfxFont() { + delete tag; + delete family; + if (name) { + delete name; + } + if (embFontName) { + delete embFontName; + } + if (encodingName) { + delete encodingName; + } +} + +void GfxFont::incRefCnt() { + refCnt++; +} + +void GfxFont::decRefCnt() { + if (--refCnt == 0) + delete this; +} + +// This function extracts three pieces of information: +// 1. the "expected" font type, i.e., the font type implied by +// Font.Subtype, DescendantFont.Subtype, and +// FontDescriptor.FontFile3.Subtype +// 2. the embedded font object ID +// 3. the actual font type - determined by examining the embedded font +// if there is one, otherwise equal to the expected font type +// If the expected and actual font types don't match, a warning +// message is printed. The expected font type is not used for +// anything else. +GfxFontType GfxFont::getFontType(XRef *xref, Dict *fontDict, Ref *embID) { + GfxFontType t, expectedType; + FoFiIdentifierType fft; + Dict *fontDict2; + Object subtype, fontDesc, obj1, obj2, obj3, obj4; + GBool isType0, err; + + t = fontUnknownType; + embID->num = embID->gen = -1; + err = gFalse; + + fontDict->lookup("Subtype", &subtype); + expectedType = fontUnknownType; + isType0 = gFalse; + if (subtype.isName("Type1") || subtype.isName("MMType1")) { + expectedType = fontType1; + } else if (subtype.isName("Type1C")) { + expectedType = fontType1C; + } else if (subtype.isName("Type3")) { + expectedType = fontType3; + } else if (subtype.isName("TrueType")) { + expectedType = fontTrueType; + } else if (subtype.isName("Type0")) { + isType0 = gTrue; + } else { + error(errSyntaxWarning, -1, "Unknown font type: '{0:s}'", + subtype.isName() ? subtype.getName() : "???"); + } + subtype.free(); + + fontDict2 = fontDict; + if (fontDict->lookup("DescendantFonts", &obj1)->isArray()) { + if (obj1.arrayGetLength() == 0) { + error(errSyntaxWarning, -1, "Empty DescendantFonts array in font"); + obj2.initNull(); + } else if (obj1.arrayGet(0, &obj2)->isDict()) { + if (!isType0) { + error(errSyntaxWarning, -1, "Non-CID font with DescendantFonts array"); + } + fontDict2 = obj2.getDict(); + fontDict2->lookup("Subtype", &subtype); + if (subtype.isName("CIDFontType0")) { + if (isType0) { + expectedType = fontCIDType0; + } + } else if (subtype.isName("CIDFontType2")) { + if (isType0) { + expectedType = fontCIDType2; + } + } + subtype.free(); + } + } else { + obj2.initNull(); + } + + if (fontDict2->lookup("FontDescriptor", &fontDesc)->isDict()) { + if (fontDesc.dictLookupNF("FontFile", &obj3)->isRef()) { + *embID = obj3.getRef(); + if (expectedType != fontType1) { + err = gTrue; + } + } + obj3.free(); + if (embID->num == -1 && + fontDesc.dictLookupNF("FontFile2", &obj3)->isRef()) { + *embID = obj3.getRef(); + if (isType0) { + expectedType = fontCIDType2; + } else if (expectedType != fontTrueType) { + err = gTrue; + } + } + obj3.free(); + if (embID->num == -1 && + fontDesc.dictLookupNF("FontFile3", &obj3)->isRef()) { + *embID = obj3.getRef(); + if (obj3.fetch(xref, &obj4)->isStream()) { + obj4.streamGetDict()->lookup("Subtype", &subtype); + if (subtype.isName("Type1")) { + if (expectedType != fontType1) { + err = gTrue; + expectedType = isType0 ? fontCIDType0 : fontType1; + } + } else if (subtype.isName("Type1C")) { + if (expectedType == fontType1) { + expectedType = fontType1C; + } else if (expectedType != fontType1C) { + err = gTrue; + expectedType = isType0 ? fontCIDType0C : fontType1C; + } + } else if (subtype.isName("TrueType")) { + if (expectedType != fontTrueType) { + err = gTrue; + expectedType = isType0 ? fontCIDType2 : fontTrueType; + } + } else if (subtype.isName("CIDFontType0C")) { + if (expectedType == fontCIDType0) { + expectedType = fontCIDType0C; + } else { + err = gTrue; + expectedType = isType0 ? fontCIDType0C : fontType1C; + } + } else if (subtype.isName("OpenType")) { + if (expectedType == fontTrueType) { + expectedType = fontTrueTypeOT; + } else if (expectedType == fontType1) { + expectedType = fontType1COT; + } else if (expectedType == fontCIDType0) { + expectedType = fontCIDType0COT; + } else if (expectedType == fontCIDType2) { + expectedType = fontCIDType2OT; + } else { + err = gTrue; + } + } else { + error(errSyntaxError, -1, "Unknown font type '{0:s}'", + subtype.isName() ? subtype.getName() : "???"); + } + subtype.free(); + } + obj4.free(); + } + obj3.free(); + } + fontDesc.free(); + + t = fontUnknownType; + if (embID->num >= 0) { + obj3.initRef(embID->num, embID->gen); + obj3.fetch(xref, &obj4); + if (obj4.isStream()) { + obj4.streamReset(); + fft = FoFiIdentifier::identifyStream(&readFromStream, obj4.getStream()); + obj4.streamClose(); + switch (fft) { + case fofiIdType1PFA: + case fofiIdType1PFB: + t = fontType1; + break; + case fofiIdCFF8Bit: + t = isType0 ? fontCIDType0C : fontType1C; + break; + case fofiIdCFFCID: + t = fontCIDType0C; + break; + case fofiIdTrueType: + case fofiIdTrueTypeCollection: + t = isType0 ? fontCIDType2 : fontTrueType; + break; + case fofiIdOpenTypeCFF8Bit: + t = expectedType; // hack: open type always == expected type? s. bug-poppler20605.pdf + break; + case fofiIdOpenTypeCFFCID: + t = fontCIDType0COT; + break; + default: + error(errSyntaxError, -1, "Embedded font file may be invalid"); + break; + } + } + obj4.free(); + obj3.free(); + } + + if (t == fontUnknownType) { + t = expectedType; + } + + if (t != expectedType) { + err = gTrue; + } + + if (err) { + error(errSyntaxWarning, -1, + "Mismatch between font type and embedded font file"); + } + + obj2.free(); + obj1.free(); + + return t; +} + +void GfxFont::readFontDescriptor(XRef *xref, Dict *fontDict) { + Object obj1, obj2, obj3, obj4; + double t; + int i; + + // assume Times-Roman by default (for substitution purposes) + flags = fontSerif; + + missingWidth = 0; + + if (fontDict->lookup("FontDescriptor", &obj1)->isDict()) { + + // get flags + if (obj1.dictLookup("Flags", &obj2)->isInt()) { + flags = obj2.getInt(); + } + obj2.free(); + + // get name + obj1.dictLookup("FontName", &obj2); + if (obj2.isName()) { + embFontName = new GooString(obj2.getName()); + } + obj2.free(); + if (embFontName == NULL) { + // get name with typo + obj1.dictLookup("Fontname", &obj2); + if (obj2.isName()) { + embFontName = new GooString(obj2.getName()); + error(errSyntaxWarning, -1, "The file uses Fontname instead of FontName please notify the creator that the file is broken"); + } + obj2.free(); + } + + // get family + obj1.dictLookup("FontFamily", &obj2); + if (obj2.isString()) family = new GooString(obj2.getString()); + obj2.free(); + + // get stretch + obj1.dictLookup("FontStretch", &obj2); + if (obj2.isName()) { + if (strcmp(obj2.getName(), "UltraCondensed") == 0) stretch = UltraCondensed; + else if (strcmp(obj2.getName(), "ExtraCondensed") == 0) stretch = ExtraCondensed; + else if (strcmp(obj2.getName(), "Condensed") == 0) stretch = Condensed; + else if (strcmp(obj2.getName(), "SemiCondensed") == 0) stretch = SemiCondensed; + else if (strcmp(obj2.getName(), "Normal") == 0) stretch = Normal; + else if (strcmp(obj2.getName(), "SemiExpanded") == 0) stretch = SemiExpanded; + else if (strcmp(obj2.getName(), "Expanded") == 0) stretch = Expanded; + else if (strcmp(obj2.getName(), "ExtraExpanded") == 0) stretch = ExtraExpanded; + else if (strcmp(obj2.getName(), "UltraExpanded") == 0) stretch = UltraExpanded; + else error(errSyntaxWarning, -1, "Invalid Font Stretch"); + } + obj2.free(); + + // get weight + obj1.dictLookup("FontWeight", &obj2); + if (obj2.isNum()) { + if (obj2.getNum() == 100) weight = W100; + else if (obj2.getNum() == 200) weight = W200; + else if (obj2.getNum() == 300) weight = W300; + else if (obj2.getNum() == 400) weight = W400; + else if (obj2.getNum() == 500) weight = W500; + else if (obj2.getNum() == 600) weight = W600; + else if (obj2.getNum() == 700) weight = W700; + else if (obj2.getNum() == 800) weight = W800; + else if (obj2.getNum() == 900) weight = W900; + else error(errSyntaxWarning, -1, "Invalid Font Weight"); + } + obj2.free(); + + // look for MissingWidth + obj1.dictLookup("MissingWidth", &obj2); + if (obj2.isNum()) { + missingWidth = obj2.getNum(); + } + obj2.free(); + + // get Ascent and Descent + obj1.dictLookup("Ascent", &obj2); + if (obj2.isNum()) { + t = 0.001 * obj2.getNum(); + // some broken font descriptors specify a negative ascent + if (t < 0) { + t = -t; + } + // some broken font descriptors set ascent and descent to 0; + // others set it to ridiculous values (e.g., 32768) + if (t != 0 && t < 3) { + ascent = t; + } + } + obj2.free(); + obj1.dictLookup("Descent", &obj2); + if (obj2.isNum()) { + t = 0.001 * obj2.getNum(); + // some broken font descriptors specify a positive descent + if (t > 0) { + t = -t; + } + // some broken font descriptors set ascent and descent to 0 + if (t != 0 && t > -3) { + descent = t; + } + } + obj2.free(); + + // font FontBBox + if (obj1.dictLookup("FontBBox", &obj2)->isArray()) { + for (i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) { + if (obj2.arrayGet(i, &obj3)->isNum()) { + fontBBox[i] = 0.001 * obj3.getNum(); + } + obj3.free(); + } + } + obj2.free(); + + } + obj1.free(); +} + +CharCodeToUnicode *GfxFont::readToUnicodeCMap(Dict *fontDict, int nBits, + CharCodeToUnicode *ctu) { + GooString *buf; + Object obj1; + + if (!fontDict->lookup("ToUnicode", &obj1)->isStream()) { + obj1.free(); + return NULL; + } + buf = new GooString(); + obj1.getStream()->fillGooString(buf); + obj1.streamClose(); + obj1.free(); + if (ctu) { + ctu->mergeCMap(buf, nBits); + } else { + ctu = CharCodeToUnicode::parseCMap(buf, nBits); + } + hasToUnicode = gTrue; + delete buf; + return ctu; +} + +GfxFontLoc *GfxFont::locateFont(XRef *xref, GBool ps) { + GfxFontLoc *fontLoc; + SysFontType sysFontType; + GooString *path, *base14Name, *substName; + PSFontParam16 *psFont16; + Object refObj, embFontObj; + int substIdx, fontNum; + GBool embed; + + if (type == fontType3) { + return NULL; + } + + //----- embedded font + if (embFontID.num >= 0) { + embed = gTrue; + refObj.initRef(embFontID.num, embFontID.gen); + refObj.fetch(xref, &embFontObj); + if (!embFontObj.isStream()) { + error(errSyntaxError, -1, "Embedded font object is wrong type"); + embed = gFalse; + } + embFontObj.free(); + refObj.free(); + if (embed) { + if (ps) { + switch (type) { + case fontType1: + case fontType1C: + case fontType1COT: + embed = globalParams->getPSEmbedType1(); + break; + case fontTrueType: + case fontTrueTypeOT: + embed = globalParams->getPSEmbedTrueType(); + break; + case fontCIDType0C: + case fontCIDType0COT: + embed = globalParams->getPSEmbedCIDPostScript(); + break; + case fontCIDType2: + case fontCIDType2OT: + embed = globalParams->getPSEmbedCIDTrueType(); + break; + default: + break; + } + } + if (embed) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocEmbedded; + fontLoc->fontType = type; + fontLoc->embFontID = embFontID; + return fontLoc; + } + } + } + + //----- PS passthrough + if (ps && !isCIDFont() && globalParams->getPSFontPassthrough()) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocResident; + fontLoc->fontType = fontType1; + fontLoc->path = name->copy(); + return fontLoc; + } + + //----- PS resident Base-14 font + if (ps && !isCIDFont() && ((Gfx8BitFont *)this)->base14) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocResident; + fontLoc->fontType = fontType1; + fontLoc->path = new GooString(((Gfx8BitFont *)this)->base14->base14Name); + return fontLoc; + } + + //----- external font file (fontFile, fontDir) + if (name && (path = globalParams->findFontFile(name))) { + if ((fontLoc = getExternalFont(path, isCIDFont()))) { + return fontLoc; + } + } + + //----- external font file for Base-14 font + if (!ps && !isCIDFont() && ((Gfx8BitFont *)this)->base14) { + base14Name = new GooString(((Gfx8BitFont *)this)->base14->base14Name); + if ((path = globalParams->findBase14FontFile(base14Name, this))) { + if ((fontLoc = getExternalFont(path, gFalse))) { + delete base14Name; + return fontLoc; + } + } + delete base14Name; + } + + //----- system font + if ((path = globalParams->findSystemFontFile(this, &sysFontType, + &fontNum))) { + if (isCIDFont()) { + if (sysFontType == sysFontTTF || sysFontType == sysFontTTC) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocExternal; + fontLoc->fontType = fontCIDType2; + fontLoc->path = path; + fontLoc->fontNum = fontNum; + return fontLoc; + } + } else { + if (sysFontType == sysFontTTF || sysFontType == sysFontTTC) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocExternal; + fontLoc->fontType = fontTrueType; + fontLoc->path = path; + return fontLoc; + } else if (sysFontType == sysFontPFA || sysFontType == sysFontPFB) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocExternal; + fontLoc->fontType = fontType1; + fontLoc->path = path; + fontLoc->fontNum = fontNum; + return fontLoc; + } + } + delete path; + } + + if (!isCIDFont()) { + + //----- 8-bit PS resident font + if (name && ps) { + if ((path = globalParams->getPSResidentFont(name))) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocResident; + fontLoc->fontType = fontType1; + fontLoc->path = path; + return fontLoc; + } + } + + //----- 8-bit font substitution + if (flags & fontFixedWidth) { + substIdx = 0; + } else if (flags & fontSerif) { + substIdx = 8; + } else { + substIdx = 4; + } + if (isBold()) { + substIdx += 2; + } + if (isItalic()) { + substIdx += 1; + } + substName = new GooString(base14SubstFonts[substIdx]); + if (ps) { + error(errSyntaxWarning, -1, "Substituting font '{0:s}' for '{1:t}'", + base14SubstFonts[substIdx], name ? name : new GooString("null")); + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocResident; + fontLoc->fontType = fontType1; + fontLoc->path = substName; + fontLoc->substIdx = substIdx; + return fontLoc; + } else { + path = globalParams->findFontFile(substName); + delete substName; + if (path) { + if ((fontLoc = getExternalFont(path, gFalse))) { + error(errSyntaxWarning, -1, "Substituting font '{0:s}' for '{1:t}'", + base14SubstFonts[substIdx], (name == NULL) ? new GooString("") : name); + name = new GooString(base14SubstFonts[substIdx]); + fontLoc->substIdx = substIdx; + return fontLoc; + } + } + } + + // failed to find a substitute font + return NULL; + } + + //----- 16-bit PS resident font + if (ps && ((psFont16 = globalParams->getPSResidentFont16( + name, + ((GfxCIDFont *)this)->getWMode())))) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocResident; + fontLoc->fontType = fontCIDType0; // this is not used + fontLoc->path = psFont16->psFontName->copy(); + fontLoc->encoding = psFont16->encoding->copy(); + fontLoc->wMode = psFont16->wMode; + return fontLoc; + } + if (ps && ((psFont16 = globalParams->getPSResidentFontCC( + ((GfxCIDFont *)this)->getCollection(), + ((GfxCIDFont *)this)->getWMode())))) { + error(errSyntaxWarning, -1, "Substituting font '{0:t}' for '{1:t}'", + psFont16->psFontName, name); + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocResident; + fontLoc->fontType = fontCIDType0; // this is not used + fontLoc->path = psFont16->psFontName->copy(); + fontLoc->encoding = psFont16->encoding->copy(); + fontLoc->wMode = psFont16->wMode; + return fontLoc; + } + + //----- CID font substitution + if ((path = globalParams->findCCFontFile( + ((GfxCIDFont *)this)->getCollection()))) { + if ((fontLoc = getExternalFont(path, gTrue))) { + error(errSyntaxWarning, -1, "Substituting font '{0:t}' for '{1:t}'", + fontLoc->path, name); + return fontLoc; + } + } + + // failed to find a substitute font + return NULL; +} + +GfxFontLoc *GfxFont::locateBase14Font(GooString *base14Name) { + GooString *path; + + path = globalParams->findFontFile(base14Name); + if (!path) { + return NULL; + } + return getExternalFont(path, gFalse); +} + +GfxFontLoc *GfxFont::getExternalFont(GooString *path, GBool cid) { + FoFiIdentifierType fft; + GfxFontType fontType; + GfxFontLoc *fontLoc; + + fft = FoFiIdentifier::identifyFile(path->getCString()); + switch (fft) { + case fofiIdType1PFA: + case fofiIdType1PFB: + fontType = fontType1; + break; + case fofiIdCFF8Bit: + fontType = fontType1C; + break; + case fofiIdCFFCID: + fontType = fontCIDType0C; + break; + case fofiIdTrueType: + case fofiIdTrueTypeCollection: + fontType = cid ? fontCIDType2 : fontTrueType; + break; + case fofiIdOpenTypeCFF8Bit: + fontType = fontType1COT; + break; + case fofiIdOpenTypeCFFCID: + fontType = fontCIDType0COT; + break; + case fofiIdUnknown: + case fofiIdError: + default: + fontType = fontUnknownType; + break; + } + if (fontType == fontUnknownType || + (cid ? (fontType < fontCIDType0) + : (fontType >= fontCIDType0))) { + delete path; + return NULL; + } + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocExternal; + fontLoc->fontType = fontType; + fontLoc->path = path; + return fontLoc; +} + +char *GfxFont::readEmbFontFile(XRef *xref, int *len) { + char *buf; + Object obj1, obj2; + Stream *str; + + obj1.initRef(embFontID.num, embFontID.gen); + obj1.fetch(xref, &obj2); + if (!obj2.isStream()) { + error(errSyntaxError, -1, "Embedded font file is not a stream"); + obj2.free(); + obj1.free(); + embFontID.num = -1; + *len = 0; + return NULL; + } + str = obj2.getStream(); + + buf = (char*)str->toUnsignedChars(len); + str->close(); + + obj2.free(); + obj1.free(); + + return buf; +} + +//------------------------------------------------------------------------ +// Gfx8BitFont +//------------------------------------------------------------------------ + +Gfx8BitFont::Gfx8BitFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA, + GfxFontType typeA, Ref embFontIDA, Dict *fontDict): + GfxFont(tagA, idA, nameA, typeA, embFontIDA) { + GooString *name2; + BuiltinFont *builtinFont; + const char **baseEnc; + GBool baseEncFromFontFile; + char *buf; + int len; + FoFiType1 *ffT1; + FoFiType1C *ffT1C; + int code; + char *charName; + GBool missing, hex; + Unicode toUnicode[256]; + CharCodeToUnicode *utu, *ctu2; + Unicode uBuf[8]; + double mul; + int firstChar, lastChar; + Gushort w; + Object obj1, obj2, obj3; + int n, i, a, b, m; + + refCnt = 1; + ctu = NULL; + + // do font name substitution for various aliases of the Base 14 font + // names + base14 = NULL; + if (name) { + name2 = name->copy(); + i = 0; + while (i < name2->getLength()) { + if (name2->getChar(i) == ' ') { + name2->del(i); + } else { + ++i; + } + } + a = 0; + b = sizeof(base14FontMap) / sizeof(Base14FontMapEntry); + // invariant: base14FontMap[a].altName <= name2 < base14FontMap[b].altName + while (b - a > 1) { + m = (a + b) / 2; + if (name2->cmp(base14FontMap[m].altName) >= 0) { + a = m; + } else { + b = m; + } + } + if (!name2->cmp(base14FontMap[a].altName)) { + base14 = &base14FontMap[a]; + } + delete name2; + } + + // is it a built-in font? + builtinFont = NULL; + if (base14) { + for (i = 0; i < nBuiltinFonts; ++i) { + if (!strcmp(base14->base14Name, builtinFonts[i].name)) { + builtinFont = &builtinFonts[i]; + break; + } + } + } + + // default ascent/descent values + if (builtinFont) { + ascent = 0.001 * builtinFont->ascent; + descent = 0.001 * builtinFont->descent; + fontBBox[0] = 0.001 * builtinFont->bbox[0]; + fontBBox[1] = 0.001 * builtinFont->bbox[1]; + fontBBox[2] = 0.001 * builtinFont->bbox[2]; + fontBBox[3] = 0.001 * builtinFont->bbox[3]; + } else { + ascent = 0.95; + descent = -0.35; + fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; + } + + // get info from font descriptor + readFontDescriptor(xref, fontDict); + + // for non-embedded fonts, don't trust the ascent/descent/bbox + // values from the font descriptor + if (builtinFont && embFontID.num < 0) { + ascent = 0.001 * builtinFont->ascent; + descent = 0.001 * builtinFont->descent; + fontBBox[0] = 0.001 * builtinFont->bbox[0]; + fontBBox[1] = 0.001 * builtinFont->bbox[1]; + fontBBox[2] = 0.001 * builtinFont->bbox[2]; + fontBBox[3] = 0.001 * builtinFont->bbox[3]; + } + + // get font matrix + fontMat[0] = fontMat[3] = 1; + fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0; + if (fontDict->lookup("FontMatrix", &obj1)->isArray()) { + for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + fontMat[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + + // get Type 3 bounding box, font definition, and resources + if (type == fontType3) { + if (fontDict->lookup("FontBBox", &obj1)->isArray()) { + for (i = 0; i < 4 && i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + fontBBox[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + if (!fontDict->lookup("CharProcs", &charProcs)->isDict()) { + error(errSyntaxError, -1, + "Missing or invalid CharProcs dictionary in Type 3 font"); + charProcs.free(); + } + if (!fontDict->lookup("Resources", &resources)->isDict()) { + resources.free(); + } + } + + //----- build the font encoding ----- + + // Encodings start with a base encoding, which can come from + // (in order of priority): + // 1. FontDict.Encoding or FontDict.Encoding.BaseEncoding + // - MacRoman / MacExpert / WinAnsi / Standard + // 2. embedded or external font file + // 3. default: + // - builtin --> builtin encoding + // - TrueType --> WinAnsiEncoding + // - others --> StandardEncoding + // and then add a list of differences (if any) from + // FontDict.Encoding.Differences. + + // check FontDict for base encoding + hasEncoding = gFalse; + usesMacRomanEnc = gFalse; + baseEnc = NULL; + baseEncFromFontFile = gFalse; + fontDict->lookup("Encoding", &obj1); + if (obj1.isDict()) { + obj1.dictLookup("BaseEncoding", &obj2); + if (obj2.isName("MacRomanEncoding")) { + hasEncoding = gTrue; + usesMacRomanEnc = gTrue; + baseEnc = macRomanEncoding; + } else if (obj2.isName("MacExpertEncoding")) { + hasEncoding = gTrue; + baseEnc = macExpertEncoding; + } else if (obj2.isName("WinAnsiEncoding")) { + hasEncoding = gTrue; + baseEnc = winAnsiEncoding; + } + obj2.free(); + } else if (obj1.isName("MacRomanEncoding")) { + hasEncoding = gTrue; + usesMacRomanEnc = gTrue; + baseEnc = macRomanEncoding; + } else if (obj1.isName("MacExpertEncoding")) { + hasEncoding = gTrue; + baseEnc = macExpertEncoding; + } else if (obj1.isName("WinAnsiEncoding")) { + hasEncoding = gTrue; + baseEnc = winAnsiEncoding; + } + + // check embedded font file for base encoding + // (only for Type 1 fonts - trying to get an encoding out of a + // TrueType font is a losing proposition) + ffT1 = NULL; + ffT1C = NULL; + buf = NULL; + if (type == fontType1 && embFontID.num >= 0) { + if ((buf = readEmbFontFile(xref, &len))) { + if ((ffT1 = FoFiType1::make(buf, len))) { + if (ffT1->getName()) { + if (embFontName) { + delete embFontName; + } + embFontName = new GooString(ffT1->getName()); + } + if (!baseEnc) { + baseEnc = (const char **)ffT1->getEncoding(); + baseEncFromFontFile = gTrue; + } + } + gfree(buf); + } + } else if (type == fontType1C && embFontID.num >= 0) { + if ((buf = readEmbFontFile(xref, &len))) { + if ((ffT1C = FoFiType1C::make(buf, len))) { + if (ffT1C->getName()) { + if (embFontName) { + delete embFontName; + } + embFontName = new GooString(ffT1C->getName()); + } + if (!baseEnc) { + baseEnc = (const char **)ffT1C->getEncoding(); + baseEncFromFontFile = gTrue; + } + } + gfree(buf); + } + } + + // get default base encoding + if (!baseEnc) { + if (builtinFont && embFontID.num < 0) { + baseEnc = builtinFont->defaultBaseEnc; + hasEncoding = gTrue; + } else if (type == fontTrueType) { + baseEnc = winAnsiEncoding; + } else { + baseEnc = standardEncoding; + } + } + + if (baseEncFromFontFile) { + encodingName->Set("Builtin"); + } else if (baseEnc == winAnsiEncoding) { + encodingName->Set("WinAnsi"); + } else if (baseEnc == macRomanEncoding) { + encodingName->Set("MacRoman"); + } else if (baseEnc == macExpertEncoding) { + encodingName->Set("MacExpert"); + } else if (baseEnc == symbolEncoding) { + encodingName->Set("Symbol"); + } else if (baseEnc == zapfDingbatsEncoding) { + encodingName->Set("ZapfDingbats"); + } else { + encodingName->Set("Standard"); + } + + // copy the base encoding + for (i = 0; i < 256; ++i) { + enc[i] = (char *)baseEnc[i]; + if ((encFree[i] = baseEncFromFontFile) && enc[i]) { + enc[i] = copyString(baseEnc[i]); + } + } + + // some Type 1C font files have empty encodings, which can break the + // T1C->T1 conversion (since the 'seac' operator depends on having + // the accents in the encoding), so we fill in any gaps from + // StandardEncoding + if (type == fontType1C && embFontID.num >= 0 && baseEncFromFontFile) { + for (i = 0; i < 256; ++i) { + if (!enc[i] && standardEncoding[i]) { + enc[i] = (char *)standardEncoding[i]; + encFree[i] = gFalse; + } + } + } + + // merge differences into encoding + if (obj1.isDict()) { + obj1.dictLookup("Differences", &obj2); + if (obj2.isArray()) { + encodingName->Set("Custom"); + hasEncoding = gTrue; + code = 0; + for (i = 0; i < obj2.arrayGetLength(); ++i) { + obj2.arrayGet(i, &obj3); + if (obj3.isInt()) { + code = obj3.getInt(); + } else if (obj3.isName()) { + if (code >= 0 && code < 256) { + if (encFree[code]) { + gfree(enc[code]); + } + enc[code] = copyString(obj3.getName()); + encFree[code] = gTrue; + } + ++code; + } else { + error(errSyntaxError, -1, + "Wrong type in font encoding resource differences ({0:s})", + obj3.getTypeName()); + } + obj3.free(); + } + } + obj2.free(); + } + obj1.free(); + if (ffT1) { + delete ffT1; + } + if (ffT1C) { + delete ffT1C; + } + + //----- build the mapping to Unicode ----- + + // pass 1: use the name-to-Unicode mapping table + missing = hex = gFalse; + for (code = 0; code < 256; ++code) { + if ((charName = enc[code])) { + if (!(toUnicode[code] = globalParams->mapNameToUnicode(charName)) && + strcmp(charName, ".notdef")) { + // if it wasn't in the name-to-Unicode table, check for a + // name that looks like 'Axx' or 'xx', where 'A' is any letter + // and 'xx' is two hex digits + if ((strlen(charName) == 3 && + isalpha(charName[0]) && + isxdigit(charName[1]) && isxdigit(charName[2]) && + ((charName[1] >= 'a' && charName[1] <= 'f') || + (charName[1] >= 'A' && charName[1] <= 'F') || + (charName[2] >= 'a' && charName[2] <= 'f') || + (charName[2] >= 'A' && charName[2] <= 'F'))) || + (strlen(charName) == 2 && + isxdigit(charName[0]) && isxdigit(charName[1]) && + ((charName[0] >= 'a' && charName[0] <= 'f') || + (charName[0] >= 'A' && charName[0] <= 'F') || + (charName[1] >= 'a' && charName[1] <= 'f') || + (charName[1] >= 'A' && charName[1] <= 'F')))) { + hex = gTrue; + } + missing = gTrue; + } + } else { + toUnicode[code] = 0; + } + } + + // construct the char code -> Unicode mapping object + ctu = CharCodeToUnicode::make8BitToUnicode(toUnicode); + + // pass 1a: Expand ligatures in the Alphabetic Presentation Form + // block (eg "fi", "ffi") to normal form + for (code = 0; code < 256; ++code) { + if (unicodeIsAlphabeticPresentationForm(toUnicode[code])) { + Unicode *normalized = unicodeNormalizeNFKC(&toUnicode[code], 1, &len, NULL); + if (len > 1) + ctu->setMapping((CharCode)code, normalized, len); + gfree(normalized); + } + } + + // pass 2: try to fill in the missing chars, looking for ligatures, numeric + // references and variants + if (missing) { + for (code = 0; code < 256; ++code) { + if (!toUnicode[code]) { + if ((charName = enc[code]) && strcmp(charName, ".notdef") + && (n = parseCharName(charName, uBuf, sizeof(uBuf)/sizeof(*uBuf), + gFalse, // don't check simple names (pass 1) + gTrue, // do check ligatures + globalParams->getMapNumericCharNames(), + hex, + gTrue))) { // do check variants + ctu->setMapping((CharCode)code, uBuf, n); + } else if (globalParams->getMapUnknownCharNames()) { + // if the 'mapUnknownCharNames' flag is set, do a simple pass-through + // mapping for unknown character names + if (charName && charName[0]) { + for (n = 0; n < (int)(sizeof(uBuf)/sizeof(*uBuf)); ++n) + if (!(uBuf[n] = charName[n])) + break; + ctu->setMapping((CharCode)code, uBuf, n); + } else { + uBuf[0] = code; + ctu->setMapping((CharCode)code, uBuf, 1); + } + } + } + } + } + + // merge in a ToUnicode CMap, if there is one -- this overwrites + // existing entries in ctu, i.e., the ToUnicode CMap takes + // precedence, but the other encoding info is allowed to fill in any + // holes + readToUnicodeCMap(fontDict, 8, ctu); + + // look for a Unicode-to-Unicode mapping + if (name && (utu = globalParams->getUnicodeToUnicode(name))) { + Unicode *uAux; + for (i = 0; i < 256; ++i) { + toUnicode[i] = 0; + } + ctu2 = CharCodeToUnicode::make8BitToUnicode(toUnicode); + for (i = 0; i < 256; ++i) { + n = ctu->mapToUnicode((CharCode)i, &uAux); + if (n >= 1) { + n = utu->mapToUnicode((CharCode)uAux[0], &uAux); + if (n >= 1) { + ctu2->setMapping((CharCode)i, uAux, n); + } + } + } + utu->decRefCnt(); + delete ctu; + ctu = ctu2; + } + + //----- get the character widths ----- + + // initialize all widths + for (code = 0; code < 256; ++code) { + widths[code] = missingWidth * 0.001; + } + + // use widths from font dict, if present + fontDict->lookup("FirstChar", &obj1); + firstChar = obj1.isInt() ? obj1.getInt() : 0; + obj1.free(); + if (firstChar < 0 || firstChar > 255) { + firstChar = 0; + } + fontDict->lookup("LastChar", &obj1); + lastChar = obj1.isInt() ? obj1.getInt() : 255; + obj1.free(); + if (lastChar < 0 || lastChar > 255) { + lastChar = 255; + } + mul = (type == fontType3) ? fontMat[0] : 0.001; + fontDict->lookup("Widths", &obj1); + if (obj1.isArray()) { + flags |= fontFixedWidth; + if (obj1.arrayGetLength() < lastChar - firstChar + 1) { + lastChar = firstChar + obj1.arrayGetLength() - 1; + } + for (code = firstChar; code <= lastChar; ++code) { + obj1.arrayGet(code - firstChar, &obj2); + if (obj2.isNum()) { + widths[code] = obj2.getNum() * mul; + if (fabs(widths[code] - widths[firstChar]) > 0.00001) { + flags &= ~fontFixedWidth; + } + } + obj2.free(); + } + + // use widths from built-in font + } else if (builtinFont) { + // this is a kludge for broken PDF files that encode char 32 + // as .notdef + if (builtinFont->widths->getWidth("space", &w)) { + widths[32] = 0.001 * w; + } + for (code = 0; code < 256; ++code) { + if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) { + widths[code] = 0.001 * w; + } + } + + // couldn't find widths -- use defaults + } else { + // this is technically an error -- the Widths entry is required + // for all but the Base-14 fonts -- but certain PDF generators + // apparently don't include widths for Arial and TimesNewRoman + if (isFixedWidth()) { + i = 0; + } else if (isSerif()) { + i = 8; + } else { + i = 4; + } + if (isBold()) { + i += 2; + } + if (isItalic()) { + i += 1; + } + builtinFont = builtinFontSubst[i]; + // this is a kludge for broken PDF files that encode char 32 + // as .notdef + if (builtinFont->widths->getWidth("space", &w)) { + widths[32] = 0.001 * w; + } + for (code = 0; code < 256; ++code) { + if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) { + widths[code] = 0.001 * w; + } + } + } + obj1.free(); + + ok = gTrue; +} + +Gfx8BitFont::~Gfx8BitFont() { + int i; + + for (i = 0; i < 256; ++i) { + if (encFree[i] && enc[i]) { + gfree(enc[i]); + } + } + ctu->decRefCnt(); + if (charProcs.isDict()) { + charProcs.free(); + } + if (resources.isDict()) { + resources.free(); + } +} + +// This function is in part a derived work of the Adobe Glyph Mapping +// Convention: http://www.adobe.com/devnet/opentype/archives/glyph.html +// Algorithmic comments are excerpted from that document to aid +// maintainability. +static int parseCharName(char *charName, Unicode *uBuf, int uLen, + GBool names, GBool ligatures, + GBool numeric, GBool hex, GBool variants) +{ + if (uLen <= 0) { + error(errInternal, -1, "Zero-length output buffer (recursion overflow?) in " + "parseCharName, component \"{0:s}\"", charName); + return 0; + } + // Step 1: drop all the characters from the glyph name starting with the + // first occurrence of a period (U+002E FULL STOP), if any. + if (variants) { + char *var_part = strchr(charName, '.'); + if (var_part == charName) { + return 0; // .notdef or similar + } else if (var_part != NULL) { + // parse names of the form 7.oldstyle, P.swash, s.sc, etc. + char *main_part = gstrndup(charName, var_part - charName); + GBool namesRecurse = gTrue, variantsRecurse = gFalse; + int n = parseCharName(main_part, uBuf, uLen, namesRecurse, ligatures, + numeric, hex, variantsRecurse); + gfree(main_part); + return n; + } + } + // Step 2: split the remaining string into a sequence of components, using + // underscore (U+005F LOW LINE) as the delimiter. + if (ligatures && strchr(charName, '_')) { + // parse names of the form A_a (e.g. f_i, T_h, l_quotesingle) + char *lig_part, *lig_end, *lig_copy; + int n = 0, m; + lig_part = lig_copy = copyString(charName); + do { + if ((lig_end = strchr(lig_part, '_'))) + *lig_end = '\0'; + if (lig_part[0] != '\0') { + GBool namesRecurse = gTrue, ligaturesRecurse = gFalse; + if ((m = parseCharName(lig_part, uBuf + n, uLen - n, namesRecurse, + ligaturesRecurse, numeric, hex, variants))) + n += m; + else + error(errSyntaxWarning, -1, "Could not parse ligature component \"{0:s}\" of \"{1:s}\" in " + "parseCharName", lig_part, charName); + } + lig_part = lig_end + 1; + } while (lig_end && n < uLen); + gfree(lig_copy); + return n; + } + // Step 3: map each component to a character string according to the + // procedure below, and concatenate those strings; the result is the + // character string to which the glyph name is mapped. + // 3.1. if the font is Zapf Dingbats (PostScript FontName ZapfDingbats), and + // the component is in the ZapfDingbats list, then map it to the + // corresponding character in that list. + // 3.2. otherwise, if the component is in the Adobe Glyph List, then map it + // to the corresponding character in that list. + if (names && (uBuf[0] = globalParams->mapNameToUnicode(charName))) { + return 1; + } + if (numeric) { + unsigned int n = strlen(charName); + // 3.3. otherwise, if the component is of the form "uni" (U+0075 U+006E + // U+0069) followed by a sequence of uppercase hexadecimal digits (0 .. 9, + // A .. F, i.e. U+0030 .. U+0039, U+0041 .. U+0046), the length of that + // sequence is a multiple of four, and each group of four digits represents + // a number in the set {0x0000 .. 0xD7FF, 0xE000 .. 0xFFFF}, then interpret + // each such number as a Unicode scalar value and map the component to the + // string made of those scalar values. Note that the range and digit length + // restrictions mean that the "uni" prefix can be used only with Unicode + // values from the Basic Multilingual Plane (BMP). + if (n >= 7 && (n % 4) == 3 && !strncmp(charName, "uni", 3)) { + int i; + unsigned int m; + for (i = 0, m = 3; i < uLen && m < n; m += 4) { + if (isxdigit(charName[m]) && isxdigit(charName[m + 1]) && + isxdigit(charName[m + 2]) && isxdigit(charName[m + 3])) { + unsigned int u; + sscanf(charName + m, "%4x", &u); + if (u <= 0xD7FF || (0xE000 <= u && u <= 0xFFFF)) { + uBuf[i++] = u; + } + } + } + return i; + } + // 3.4. otherwise, if the component is of the form "u" (U+0075) followed by + // a sequence of four to six uppercase hexadecimal digits {0 .. 9, A .. F} + // (U+0030 .. U+0039, U+0041 .. U+0046), and those digits represent a + // number in {0x0000 .. 0xD7FF, 0xE000 .. 0x10FFFF}, then interpret this + // number as a Unicode scalar value and map the component to the string + // made of this scalar value. + if (n >= 5 && n <= 7 && charName[0] == 'u' && isxdigit(charName[1]) && + isxdigit(charName[2]) && isxdigit(charName[3]) && isxdigit(charName[4]) + && (n <= 5 || isxdigit(charName[5])) + && (n <= 6 || isxdigit(charName[6]))) { + unsigned int u; + sscanf(charName + 1, "%x", &u); + if (u <= 0xD7FF || (0xE000 <= u && u <= 0x10FFFF)) { + uBuf[0] = u; + return 1; + } + } + // Not in Adobe Glyph Mapping convention: look for names of the form 'Axx', + // 'xx', 'Ann', 'ABnn', or 'nn', where 'A' and 'B' are any letters, 'xx' is + // two hex digits, and 'nn' is 2-4 decimal digits + if (hex && n == 3 && isalpha(charName[0]) && + isxdigit(charName[1]) && isxdigit(charName[2])) { + sscanf(charName+1, "%x", (unsigned int *)uBuf); + return 1; + } else if (hex && n == 2 && + isxdigit(charName[0]) && isxdigit(charName[1])) { + sscanf(charName, "%x", (unsigned int *)uBuf); + return 1; + } else if (!hex && n >= 2 && n <= 4 && + isdigit(charName[0]) && isdigit(charName[1])) { + uBuf[0] = (Unicode)atoi(charName); + return 1; + } else if (n >= 3 && n <= 5 && + isdigit(charName[1]) && isdigit(charName[2])) { + uBuf[0] = (Unicode)atoi(charName+1); + return 1; + } else if (n >= 4 && n <= 6 && + isdigit(charName[2]) && isdigit(charName[3])) { + uBuf[0] = (Unicode)atoi(charName+2); + return 1; + } + } + // 3.5. otherwise, map the component to the empty string + return 0; +} + +int Gfx8BitFont::getNextChar(char *s, int len, CharCode *code, + Unicode **u, int *uLen, + double *dx, double *dy, double *ox, double *oy) { + CharCode c; + + *code = c = (CharCode)(*s & 0xff); + *uLen = ctu->mapToUnicode(c, u); + *dx = widths[c]; + *dy = *ox = *oy = 0; + return 1; +} + +CharCodeToUnicode *Gfx8BitFont::getToUnicode() { + ctu->incRefCnt(); + return ctu; +} + +int *Gfx8BitFont::getCodeToGIDMap(FoFiTrueType *ff) { + int *map; + int cmapPlatform, cmapEncoding; + int unicodeCmap, macRomanCmap, msSymbolCmap, cmap; + GBool useMacRoman, useUnicode; + char *charName; + Unicode u; + int code, i, n; + + map = (int *)gmallocn(256, sizeof(int)); + for (i = 0; i < 256; ++i) { + map[i] = 0; + } + + // To match up with the Adobe-defined behaviour, we choose a cmap + // like this: + // 1. If the PDF font has an encoding: + // 1a. If the PDF font specified MacRomanEncoding and the + // TrueType font has a Macintosh Roman cmap, use it, and + // reverse map the char names through MacRomanEncoding to + // get char codes. + // 1b. If the PDF font is not symbolic or the PDF font is not + // embedded, and the TrueType font has a Microsoft Unicode + // cmap or a non-Microsoft Unicode cmap, use it, and use the + // Unicode indexes, not the char codes. + // 1c. If the PDF font is symbolic and the TrueType font has a + // Microsoft Symbol cmap, use it, and use char codes + // directly (possibly with an offset of 0xf000). + // 1d. If the TrueType font has a Macintosh Roman cmap, use it, + // as in case 1a. + // 2. If the PDF font does not have an encoding or the PDF font is + // symbolic: + // 2a. If the TrueType font has a Macintosh Roman cmap, use it, + // and use char codes directly (possibly with an offset of + // 0xf000). + // 2b. If the TrueType font has a Microsoft Symbol cmap, use it, + // and use char codes directly (possible with an offset of + // 0xf000). + // 3. If none of these rules apply, use the first cmap and hope for + // the best (this shouldn't happen). + unicodeCmap = macRomanCmap = msSymbolCmap = -1; + for (i = 0; i < ff->getNumCmaps(); ++i) { + cmapPlatform = ff->getCmapPlatform(i); + cmapEncoding = ff->getCmapEncoding(i); + if ((cmapPlatform == 3 && cmapEncoding == 1) || + cmapPlatform == 0) { + unicodeCmap = i; + } else if (cmapPlatform == 1 && cmapEncoding == 0) { + macRomanCmap = i; + } else if (cmapPlatform == 3 && cmapEncoding == 0) { + msSymbolCmap = i; + } + } + cmap = 0; + useMacRoman = gFalse; + useUnicode = gFalse; + if (hasEncoding || type == fontType1) { + if (usesMacRomanEnc && macRomanCmap >= 0) { + cmap = macRomanCmap; + useMacRoman = gTrue; + } else if ((!(flags & fontSymbolic) || embFontID.num < 0) && + unicodeCmap >= 0) { + cmap = unicodeCmap; + useUnicode = gTrue; + } else if ((flags & fontSymbolic) && msSymbolCmap >= 0) { + cmap = msSymbolCmap; + } else if ((flags & fontSymbolic) && macRomanCmap >= 0) { + cmap = macRomanCmap; + } else if (macRomanCmap >= 0) { + cmap = macRomanCmap; + useMacRoman = gTrue; + } + } else { + if (msSymbolCmap >= 0) { + cmap = msSymbolCmap; + } else if (macRomanCmap >= 0) { + cmap = macRomanCmap; + } + } + + // reverse map the char names through MacRomanEncoding, then map the + // char codes through the cmap + if (useMacRoman) { + for (i = 0; i < 256; ++i) { + if ((charName = enc[i])) { + if ((code = globalParams->getMacRomanCharCode(charName))) { + map[i] = ff->mapCodeToGID(cmap, code); + } + } else { + map[i] = -1; + } + } + + // map Unicode through the cmap + } else if (useUnicode) { + Unicode *uAux; + for (i = 0; i < 256; ++i) { + if (((charName = enc[i]) && (u = globalParams->mapNameToUnicode(charName)))) + map[i] = ff->mapCodeToGID(cmap, u); + else + { + n = ctu->mapToUnicode((CharCode)i, &uAux); + if (n > 0) map[i] = ff->mapCodeToGID(cmap, uAux[0]); + else map[i] = -1; + } + } + + // map the char codes through the cmap, possibly with an offset of + // 0xf000 + } else { + for (i = 0; i < 256; ++i) { + if (!(map[i] = ff->mapCodeToGID(cmap, i))) { + map[i] = ff->mapCodeToGID(cmap, 0xf000 + i); + } + } + } + + // try the TrueType 'post' table to handle any unmapped characters + for (i = 0; i < 256; ++i) { + if (map[i] <= 0 && (charName = enc[i])) { + map[i] = ff->mapNameToGID(charName); + } + } + + return map; +} + +Dict *Gfx8BitFont::getCharProcs() { + return charProcs.isDict() ? charProcs.getDict() : (Dict *)NULL; +} + +Object *Gfx8BitFont::getCharProc(int code, Object *proc) { + if (enc[code] && charProcs.isDict()) { + charProcs.dictLookup(enc[code], proc); + } else { + proc->initNull(); + } + return proc; +} + +Dict *Gfx8BitFont::getResources() { + return resources.isDict() ? resources.getDict() : (Dict *)NULL; +} + +//------------------------------------------------------------------------ +// GfxCIDFont +//------------------------------------------------------------------------ + +struct cmpWidthExcepFunctor { + bool operator()(const GfxFontCIDWidthExcep &w1, + const GfxFontCIDWidthExcep &w2) { + return w1.first < w2.first; + } +}; + +struct cmpWidthExcepVFunctor { + bool operator()(const GfxFontCIDWidthExcepV &w1, + const GfxFontCIDWidthExcepV &w2) { + return w1.first < w2.first; + } +}; + +GfxCIDFont::GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA, + GfxFontType typeA, Ref embFontIDA, Dict *fontDict): + GfxFont(tagA, idA, nameA, typeA, embFontIDA) +{ + Dict *desFontDict; + Object desFontDictObj; + Object obj1, obj2, obj3, obj4, obj5, obj6; + CharCodeToUnicode *utu; + CharCode c; + Unicode *uBuf; + int c1, c2; + int excepsSize, i, j, k, n; + + refCnt = 1; + ascent = 0.95; + descent = -0.35; + fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; + collection = NULL; + cMap = NULL; + ctu = NULL; + ctuUsesCharCode = gTrue; + widths.defWidth = 1.0; + widths.defHeight = -1.0; + widths.defVY = 0.880; + widths.exceps = NULL; + widths.nExceps = 0; + widths.excepsV = NULL; + widths.nExcepsV = 0; + cidToGID = NULL; + cidToGIDLen = 0; + + // get the descendant font + if (!fontDict->lookup("DescendantFonts", &obj1)->isArray() || + obj1.arrayGetLength() == 0) { + error(errSyntaxError, -1, "Missing or empty DescendantFonts entry in Type 0 font"); + obj1.free(); + goto err1; + } + if (!obj1.arrayGet(0, &desFontDictObj)->isDict()) { + error(errSyntaxError, -1, "Bad descendant font in Type 0 font"); + goto err3; + } + obj1.free(); + desFontDict = desFontDictObj.getDict(); + + // get info from font descriptor + readFontDescriptor(xref, desFontDict); + + //----- encoding info ----- + + // char collection + if (!desFontDict->lookup("CIDSystemInfo", &obj1)->isDict()) { + error(errSyntaxError, -1, "Missing CIDSystemInfo dictionary in Type 0 descendant font"); + goto err3; + } + obj1.dictLookup("Registry", &obj2); + obj1.dictLookup("Ordering", &obj3); + if (!obj2.isString() || !obj3.isString()) { + error(errSyntaxError, -1, "Invalid CIDSystemInfo dictionary in Type 0 descendant font"); + goto err3; + } + collection = obj2.getString()->copy()->append('-')->append(obj3.getString()); + obj3.free(); + obj2.free(); + obj1.free(); + + // look for a ToUnicode CMap + if (!(ctu = readToUnicodeCMap(fontDict, 16, NULL))) { + ctuUsesCharCode = gFalse; + + // use an identity mapping for the "Adobe-Identity" and + // "Adobe-UCS" collections + if (!collection->cmp("Adobe-Identity") || + !collection->cmp("Adobe-UCS")) { + ctu = CharCodeToUnicode::makeIdentityMapping(); + } else { + // look for a user-supplied .cidToUnicode file + if (!(ctu = globalParams->getCIDToUnicode(collection))) { + // I'm not completely sure that this is the best thing to do + // but it seems to produce better results when the .cidToUnicode + // files from the poppler-data package are missing. At least + // we know that assuming the Identity mapping is definitely wrong. + // -- jrmuizel + static const char * knownCollections [] = { + "Adobe-CNS1", + "Adobe-GB1", + "Adobe-Japan1", + "Adobe-Japan2", + "Adobe-Korea1", + }; + for (size_t i = 0; i < sizeof(knownCollections)/sizeof(knownCollections[0]); i++) { + if (collection->cmp(knownCollections[i]) == 0) { + error(errSyntaxError, -1, "Missing language pack for '{0:t}' mapping", collection); + goto err2; + } + } + error(errSyntaxError, -1, "Unknown character collection '{0:t}'", + collection); + // fall-through, assuming the Identity mapping -- this appears + // to match Adobe's behavior + } + } + } + + // look for a Unicode-to-Unicode mapping + if (name && (utu = globalParams->getUnicodeToUnicode(name))) { + if (ctu) { + for (c = 0; c < ctu->getLength(); ++c) { + n = ctu->mapToUnicode(c, &uBuf); + if (n >= 1) { + n = utu->mapToUnicode((CharCode)uBuf[0], &uBuf); + if (n >= 1) { + ctu->setMapping(c, uBuf, n); + } + } + } + utu->decRefCnt(); + } else { + ctu = utu; + } + } + + // encoding (i.e., CMap) + if (fontDict->lookup("Encoding", &obj1)->isNull()) { + error(errSyntaxError, -1, "Missing Encoding entry in Type 0 font"); + goto err2; + } + if (!(cMap = CMap::parse(NULL, collection, &obj1))) { + goto err2; + } + obj1.free(); + if (cMap->getCMapName()) { + encodingName->Set(cMap->getCMapName()->getCString()); + } else { + encodingName->Set("Custom"); + } + + // CIDToGIDMap (for embedded TrueType fonts) + if (type == fontCIDType2 || type == fontCIDType2OT) { + desFontDict->lookup("CIDToGIDMap", &obj1); + if (obj1.isStream()) { + cidToGIDLen = 0; + i = 64; + cidToGID = (int *)gmallocn(i, sizeof(int)); + obj1.streamReset(); + while ((c1 = obj1.streamGetChar()) != EOF && + (c2 = obj1.streamGetChar()) != EOF) { + if (cidToGIDLen == i) { + i *= 2; + cidToGID = (int *)greallocn(cidToGID, i, sizeof(int)); + } + cidToGID[cidToGIDLen++] = (c1 << 8) + c2; + } + } else if (!obj1.isName("Identity") && !obj1.isNull()) { + error(errSyntaxError, -1, "Invalid CIDToGIDMap entry in CID font"); + } + obj1.free(); + } + + //----- character metrics ----- + + // default char width + if (desFontDict->lookup("DW", &obj1)->isInt()) { + widths.defWidth = obj1.getInt() * 0.001; + } + obj1.free(); + + // char width exceptions + if (desFontDict->lookup("W", &obj1)->isArray()) { + excepsSize = 0; + i = 0; + while (i + 1 < obj1.arrayGetLength()) { + obj1.arrayGet(i, &obj2); + obj1.arrayGet(i + 1, &obj3); + if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) { + if (obj1.arrayGet(i + 2, &obj4)->isNum()) { + if (widths.nExceps == excepsSize) { + excepsSize += 16; + widths.exceps = (GfxFontCIDWidthExcep *) + greallocn(widths.exceps, + excepsSize, sizeof(GfxFontCIDWidthExcep)); + } + widths.exceps[widths.nExceps].first = obj2.getInt(); + widths.exceps[widths.nExceps].last = obj3.getInt(); + widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001; + ++widths.nExceps; + } else { + error(errSyntaxError, -1, "Bad widths array in Type 0 font"); + } + obj4.free(); + i += 3; + } else if (obj2.isInt() && obj3.isArray()) { + if (widths.nExceps + obj3.arrayGetLength() > excepsSize) { + excepsSize = (widths.nExceps + obj3.arrayGetLength() + 15) & ~15; + widths.exceps = (GfxFontCIDWidthExcep *) + greallocn(widths.exceps, + excepsSize, sizeof(GfxFontCIDWidthExcep)); + } + j = obj2.getInt(); + for (k = 0; k < obj3.arrayGetLength(); ++k) { + if (obj3.arrayGet(k, &obj4)->isNum()) { + widths.exceps[widths.nExceps].first = j; + widths.exceps[widths.nExceps].last = j; + widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001; + ++j; + ++widths.nExceps; + } else { + error(errSyntaxError, -1, "Bad widths array in Type 0 font"); + } + obj4.free(); + } + i += 2; + } else { + error(errSyntaxError, -1, "Bad widths array in Type 0 font"); + ++i; + } + obj3.free(); + obj2.free(); + } + std::sort(widths.exceps, widths.exceps + widths.nExceps, + cmpWidthExcepFunctor()); + } + obj1.free(); + + // default metrics for vertical font + if (desFontDict->lookup("DW2", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + if (obj1.arrayGet(0, &obj2)->isNum()) { + widths.defVY = obj2.getNum() * 0.001; + } + obj2.free(); + if (obj1.arrayGet(1, &obj2)->isNum()) { + widths.defHeight = obj2.getNum() * 0.001; + } + obj2.free(); + } + obj1.free(); + + // char metric exceptions for vertical font + if (desFontDict->lookup("W2", &obj1)->isArray()) { + excepsSize = 0; + i = 0; + while (i + 1 < obj1.arrayGetLength()) { + obj1.arrayGet(i, &obj2); + obj1.arrayGet(i+ 1, &obj3); + if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) { + if (obj1.arrayGet(i + 2, &obj4)->isNum() && + obj1.arrayGet(i + 3, &obj5)->isNum() && + obj1.arrayGet(i + 4, &obj6)->isNum()) { + if (widths.nExcepsV == excepsSize) { + excepsSize += 16; + widths.excepsV = (GfxFontCIDWidthExcepV *) + greallocn(widths.excepsV, + excepsSize, sizeof(GfxFontCIDWidthExcepV)); + } + widths.excepsV[widths.nExcepsV].first = obj2.getInt(); + widths.excepsV[widths.nExcepsV].last = obj3.getInt(); + widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001; + widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001; + widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001; + ++widths.nExcepsV; + } else { + error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font"); + } + obj6.free(); + obj5.free(); + obj4.free(); + i += 5; + } else if (obj2.isInt() && obj3.isArray()) { + if (widths.nExcepsV + obj3.arrayGetLength() / 3 > excepsSize) { + excepsSize = + (widths.nExcepsV + obj3.arrayGetLength() / 3 + 15) & ~15; + widths.excepsV = (GfxFontCIDWidthExcepV *) + greallocn(widths.excepsV, + excepsSize, sizeof(GfxFontCIDWidthExcepV)); + } + j = obj2.getInt(); + for (k = 0; k < obj3.arrayGetLength(); k += 3) { + if (obj3.arrayGet(k, &obj4)->isNum() && + obj3.arrayGet(k+1, &obj5)->isNum() && + obj3.arrayGet(k+2, &obj6)->isNum()) { + widths.excepsV[widths.nExcepsV].first = j; + widths.excepsV[widths.nExcepsV].last = j; + widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001; + widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001; + widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001; + ++j; + ++widths.nExcepsV; + } else { + error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font"); + } + obj6.free(); + obj5.free(); + obj4.free(); + } + i += 2; + } else { + error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font"); + ++i; + } + obj3.free(); + obj2.free(); + } + std::sort(widths.excepsV, widths.excepsV + widths.nExcepsV, + cmpWidthExcepVFunctor()); + } + obj1.free(); + + desFontDictObj.free(); + ok = gTrue; + return; + + err3: + obj3.free(); + obj2.free(); + err2: + obj1.free(); + desFontDictObj.free(); + err1:; +} + +GfxCIDFont::~GfxCIDFont() { + if (collection) { + delete collection; + } + if (cMap) { + cMap->decRefCnt(); + } + if (ctu) { + ctu->decRefCnt(); + } + gfree(widths.exceps); + gfree(widths.excepsV); + if (cidToGID) { + gfree(cidToGID); + } +} + +int GfxCIDFont::getNextChar(char *s, int len, CharCode *code, + Unicode **u, int *uLen, + double *dx, double *dy, double *ox, double *oy) { + CID cid; + CharCode c; + double w, h, vx, vy; + int n, a, b, m; + + if (!cMap) { + *code = 0; + *uLen = 0; + *dx = *dy = 0; + return 1; + } + + *code = (CharCode)(cid = cMap->getCID(s, len, &c, &n)); + if (ctu) { + if (hasToUnicode) { + int i = 0, c = 0; + while (i < n) { + c = (c << 8 ) + (s[i] & 0xff); + ++i; + } + *uLen = ctu->mapToUnicode(c, u); + } else { + *uLen = ctu->mapToUnicode(cid, u); + } + } else { + *uLen = 0; + } + + // horizontal + if (cMap->getWMode() == 0) { + w = widths.defWidth; + h = vx = vy = 0; + if (widths.nExceps > 0 && cid >= widths.exceps[0].first) { + a = 0; + b = widths.nExceps; + // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths.exceps[m].first <= cid) { + a = m; + } else { + b = m; + } + } + if (cid <= widths.exceps[a].last) { + w = widths.exceps[a].width; + } + } + + // vertical + } else { + w = 0; + h = widths.defHeight; + vx = widths.defWidth / 2; + vy = widths.defVY; + if (widths.nExcepsV > 0 && cid >= widths.excepsV[0].first) { + a = 0; + b = widths.nExcepsV; + // invariant: widths.excepsV[a].first <= cid < widths.excepsV[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths.excepsV[m].last <= cid) { + a = m; + } else { + b = m; + } + } + if (cid <= widths.excepsV[a].last) { + h = widths.excepsV[a].height; + vx = widths.excepsV[a].vx; + vy = widths.excepsV[a].vy; + } + } + } + + *dx = w; + *dy = h; + *ox = vx; + *oy = vy; + + return n; +} + +int GfxCIDFont::getWMode() { + return cMap ? cMap->getWMode() : 0; +} + +CharCodeToUnicode *GfxCIDFont::getToUnicode() { + if (ctu) { + ctu->incRefCnt(); + } + return ctu; +} + +GooString *GfxCIDFont::getCollection() { + return cMap ? cMap->getCollection() : (GooString *)NULL; +} + +int GfxCIDFont::mapCodeToGID(FoFiTrueType *ff, int cmapi, + Unicode unicode, GBool wmode) { + Gushort gid = ff->mapCodeToGID(cmapi,unicode); + if (wmode) { + Gushort vgid = ff->mapToVertGID(gid); + if (vgid != 0) gid = vgid; + } + return gid; +} + +int *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { +#define N_UCS_CANDIDATES 2 + /* space characters */ + static const unsigned long spaces[] = { + 0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007, + 0x2008,0x2009,0x200A,0x00A0,0x200B,0x2060,0x3000,0xFEFF, + 0 + }; + static const char *adobe_cns1_cmaps[] = { + "UniCNS-UTF32-V", + "UniCNS-UCS2-V", + "UniCNS-UTF32-H", + "UniCNS-UCS2-H", + 0 + }; + static const char *adobe_gb1_cmaps[] = { + "UniGB-UTF32-V", + "UniGB-UCS2-V", + "UniGB-UTF32-H", + "UniGB-UCS2-H", + 0 + }; + static const char *adobe_japan1_cmaps[] = { + "UniJIS-UTF32-V", + "UniJIS-UCS2-V", + "UniJIS-UTF32-H", + "UniJIS-UCS2-H", + 0 + }; + static const char *adobe_japan2_cmaps[] = { + "UniHojo-UTF32-V", + "UniHojo-UCS2-V", + "UniHojo-UTF32-H", + "UniHojo-UCS2-H", + 0 + }; + static const char *adobe_korea1_cmaps[] = { + "UniKS-UTF32-V", + "UniKS-UCS2-V", + "UniKS-UTF32-H", + "UniKS-UCS2-H", + 0 + }; + static struct CMapListEntry { + const char *collection; + const char *scriptTag; + const char *languageTag; + const char *toUnicodeMap; + const char **CMaps; + } CMapList[] = { + { + "Adobe-CNS1", + "hani", "CHN ", + "Adobe-CNS1-UCS2", + adobe_cns1_cmaps, + }, + { + "Adobe-GB1", + "hani", "CHN ", + "Adobe-GB1-UCS2", + adobe_gb1_cmaps, + }, + { + "Adobe-Japan1", + "kana", "JAN ", + "Adobe-Japan1-UCS2", + adobe_japan1_cmaps, + }, + { + "Adobe-Japan2", + "kana", "JAN ", + "Adobe-Japan2-UCS2", + adobe_japan2_cmaps, + }, + { + "Adobe-Korea1", + "hang", "KOR ", + "Adobe-Korea1-UCS2", + adobe_korea1_cmaps, + }, + {0, 0, 0, 0} + }; + Unicode *humap = 0; + Unicode *vumap = 0; + Unicode *tumap = 0; + int *codeToGID = 0; + unsigned long n; + int i; + unsigned long code; + int wmode; + const char **cmapName; + CMap *cMap; + CMapListEntry *lp; + int cmap; + int cmapPlatform, cmapEncoding; + Ref embID; + + *mapsizep = 0; + if (!ctu) return NULL; + if (getCollection()->cmp("Adobe-Identity") == 0) return NULL; + if (getEmbeddedFontID(&embID)) { + /* if this font is embedded font, + * CIDToGIDMap should be embedded in PDF file + * and already set. So return it. + */ + *mapsizep = getCIDToGIDLen(); + return getCIDToGID(); + } + + /* we use only unicode cmap */ + cmap = -1; + for (i = 0; i < ff->getNumCmaps(); ++i) { + cmapPlatform = ff->getCmapPlatform(i); + cmapEncoding = ff->getCmapEncoding(i); + if (cmapPlatform == 3 && cmapEncoding == 10) { + /* UCS-4 */ + cmap = i; + /* use UCS-4 cmap */ + break; + } else if (cmapPlatform == 3 && cmapEncoding == 1) { + /* Unicode */ + cmap = i; + } else if (cmapPlatform == 0 && cmap < 0) { + cmap = i; + } + } + if (cmap < 0) + return NULL; + + wmode = getWMode(); + for (lp = CMapList;lp->collection != 0;lp++) { + if (strcmp(lp->collection,getCollection()->getCString()) == 0) { + break; + } + } + n = 65536; + tumap = new Unicode[n]; + humap = new Unicode[n*N_UCS_CANDIDATES]; + memset(humap,0,sizeof(Unicode)*n*N_UCS_CANDIDATES); + if (lp->collection != 0) { + CharCodeToUnicode *tctu; + GooString tname(lp->toUnicodeMap); + + if ((tctu = CharCodeToUnicode::parseCMapFromFile(&tname,16)) != 0) { + CharCode cid; + for (cid = 0;cid < n ;cid++) { + int len; + Unicode *ucodes; + + len = tctu->mapToUnicode(cid,&ucodes); + if (len == 1) { + tumap[cid] = ucodes[0]; + } else { + /* if not single character, ignore it */ + tumap[cid] = 0; + } + } + delete tctu; + } + vumap = new Unicode[n]; + memset(vumap,0,sizeof(Unicode)*n); + for (cmapName = lp->CMaps;*cmapName != 0;cmapName++) { + GooString cname(*cmapName); + + if ((cMap = globalParams->getCMap(getCollection(),&cname)) + != 0) { + if (cMap->getWMode()) { + cMap->setReverseMap(vumap,n,1); + } else { + cMap->setReverseMap(humap,n,N_UCS_CANDIDATES); + } + cMap->decRefCnt(); + } + } + ff->setupGSUB(lp->scriptTag, lp->languageTag); + } else { + error(errSyntaxError, -1, "Unknown character collection {0:t}\n", + getCollection()); + if ((ctu = getToUnicode()) != 0) { + CharCode cid; + for (cid = 0;cid < n ;cid++) { + Unicode *ucode; + + if (ctu->mapToUnicode(cid, &ucode)) + humap[cid*N_UCS_CANDIDATES] = ucode[0]; + else + humap[cid*N_UCS_CANDIDATES] = 0; + for (i = 1;i < N_UCS_CANDIDATES;i++) { + humap[cid*N_UCS_CANDIDATES+i] = 0; + } + } + ctu->decRefCnt(); + } + } + // map CID -> Unicode -> GID + codeToGID = (int *)gmallocn(n, sizeof(int)); + for (code = 0; code < n; ++code) { + Unicode unicode; + unsigned long gid; + + unicode = 0; + gid = 0; + if (humap != 0) { + for (i = 0;i < N_UCS_CANDIDATES + && gid == 0 && (unicode = humap[code*N_UCS_CANDIDATES+i]) != 0;i++) { + gid = mapCodeToGID(ff,cmap,unicode,gFalse); + } + } + if (gid == 0 && vumap != 0) { + unicode = vumap[code]; + if (unicode != 0) { + gid = mapCodeToGID(ff,cmap,unicode,gTrue); + if (gid == 0 && tumap != 0) { + if ((unicode = tumap[code]) != 0) { + gid = mapCodeToGID(ff,cmap,unicode,gTrue); + } + } + } + } + if (gid == 0 && tumap != 0) { + if ((unicode = tumap[code]) != 0) { + gid = mapCodeToGID(ff,cmap,unicode,gFalse); + } + } + if (gid == 0) { + /* special handling space characters */ + const unsigned long *p; + + if (humap != 0) unicode = humap[code]; + if (unicode != 0) { + /* check if code is space character , so map code to 0x0020 */ + for (p = spaces;*p != 0;p++) { + if (*p == unicode) { + unicode = 0x20; + gid = mapCodeToGID(ff,cmap,unicode,wmode); + break; + } + } + } + } + codeToGID[code] = gid; + } + *mapsizep = n; + if (humap != 0) delete[] humap; + if (tumap != 0) delete[] tumap; + if (vumap != 0) delete[] vumap; + return codeToGID; +} + +double GfxCIDFont::getWidth (char* s, int len) { + int nUsed; + double w; + int a, b, m; + CharCode c; + + CID cid = cMap->getCID(s, len, &c, &nUsed); + + w = widths.defWidth; + if (widths.nExceps > 0 && cid >= widths.exceps[0].first) { + a = 0; + b = widths.nExceps; + // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths.exceps[m].first <= cid) { + a = m; + } else { + b = m; + } + } + if (cid <= widths.exceps[a].last) { + w = widths.exceps[a].width; + } + } + return w; +} + +//------------------------------------------------------------------------ +// GfxFontDict +//------------------------------------------------------------------------ + +GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) { + int i; + Object obj1, obj2; + Ref r; + + numFonts = fontDict->getLength(); + fonts = (GfxFont **)gmallocn(numFonts, sizeof(GfxFont *)); + for (i = 0; i < numFonts; ++i) { + fontDict->getValNF(i, &obj1); + obj1.fetch(xref, &obj2); + if (obj2.isDict()) { + if (obj1.isRef()) { + r = obj1.getRef(); + } else { + // no indirect reference for this font, so invent a unique one + // (legal generation numbers are five digits, so any 6-digit + // number would be safe) + r.num = i; + if (fontDictRef) { + r.gen = 100000 + fontDictRef->num; + } else { + r.gen = 999999; + } + } + fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), + r, obj2.getDict()); + if (fonts[i] && !fonts[i]->isOk()) { + // XXX: it may be meaningful to distinguish between + // NULL and !isOk() so that when we do lookups + // we can tell the difference between a missing font + // and a font that is just !isOk() + fonts[i]->decRefCnt(); + fonts[i] = NULL; + } + } else { + error(errSyntaxError, -1, "font resource is not a dictionary"); + fonts[i] = NULL; + } + obj1.free(); + obj2.free(); + } +} + +GfxFontDict::~GfxFontDict() { + int i; + + for (i = 0; i < numFonts; ++i) { + if (fonts[i]) { + fonts[i]->decRefCnt(); + } + } + gfree(fonts); +} + +GfxFont *GfxFontDict::lookup(char *tag) { + int i; + + for (i = 0; i < numFonts; ++i) { + if (fonts[i] && fonts[i]->matches(tag)) { + return fonts[i]; + } + } + return NULL; +} diff --git a/poppler/GfxFont.h b/poppler/GfxFont.h new file mode 100644 index 0000000..f980668 --- /dev/null +++ b/poppler/GfxFont.h @@ -0,0 +1,436 @@ +//======================================================================== +// +// GfxFont.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2008 Albert Astals Cid +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2007 Jeff Muizelaar +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2011 Axel Strübing +// Copyright (C) 2011, 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GFXFONT_H +#define GFXFONT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "goo/GooString.h" +#include "Object.h" +#include "CharTypes.h" + +class Dict; +class CMap; +class CharCodeToUnicode; +class FoFiTrueType; +struct GfxFontCIDWidths; +struct Base14FontMapEntry; + +//------------------------------------------------------------------------ +// GfxFontType +//------------------------------------------------------------------------ + +enum GfxFontType { + //----- Gfx8BitFont + fontUnknownType, + fontType1, + fontType1C, + fontType1COT, + fontType3, + fontTrueType, + fontTrueTypeOT, + //----- GfxCIDFont + fontCIDType0, + fontCIDType0C, + fontCIDType0COT, + fontCIDType2, + fontCIDType2OT +}; + +//------------------------------------------------------------------------ +// GfxFontCIDWidths +//------------------------------------------------------------------------ + +struct GfxFontCIDWidthExcep { + CID first; // this record applies to + CID last; // CIDs .. + double width; // char width +}; + +struct GfxFontCIDWidthExcepV { + CID first; // this record applies to + CID last; // CIDs .. + double height; // char height + double vx, vy; // origin position +}; + +struct GfxFontCIDWidths { + double defWidth; // default char width + double defHeight; // default char height + double defVY; // default origin position + GfxFontCIDWidthExcep *exceps; // exceptions + int nExceps; // number of valid entries in exceps + GfxFontCIDWidthExcepV * // exceptions for vertical font + excepsV; + int nExcepsV; // number of valid entries in excepsV +}; + +//------------------------------------------------------------------------ +// GfxFontLoc +//------------------------------------------------------------------------ + +enum GfxFontLocType { + gfxFontLocEmbedded, // font embedded in PDF file + gfxFontLocExternal, // external font file + gfxFontLocResident // font resident in PS printer +}; + +class GfxFontLoc { +public: + + GfxFontLoc(); + ~GfxFontLoc(); + + GfxFontLocType locType; + GfxFontType fontType; + Ref embFontID; // embedded stream obj ID + // (if locType == gfxFontLocEmbedded) + GooString *path; // font file path + // (if locType == gfxFontLocExternal) + // PS font name + // (if locType == gfxFontLocResident) + int fontNum; // for TrueType collections + // (if locType == gfxFontLocExternal) + GooString *encoding; // PS font encoding, only for 16-bit fonts + // (if locType == gfxFontLocResident) + int wMode; // writing mode, only for 16-bit fonts + // (if locType == gfxFontLocResident) + int substIdx; // substitute font index + // (if locType == gfxFontLocExternal, + // and a Base-14 substitution was made) +}; + +//------------------------------------------------------------------------ +// GfxFont +//------------------------------------------------------------------------ + +#define fontFixedWidth (1 << 0) +#define fontSerif (1 << 1) +#define fontSymbolic (1 << 2) +#define fontItalic (1 << 6) +#define fontBold (1 << 18) + +class GfxFont { +public: + + enum Stretch { + StretchNotDefined, + UltraCondensed, + ExtraCondensed, + Condensed, + SemiCondensed, + Normal, + SemiExpanded, + Expanded, + ExtraExpanded, + UltraExpanded }; + + enum Weight { + WeightNotDefined, + W100, + W200, + W300, + W400, // Normal + W500, + W600, + W700, // Bold + W800, + W900 }; + + // Build a GfxFont object. + static GfxFont *makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict); + + GfxFont(const char *tagA, Ref idA, GooString *nameA, + GfxFontType typeA, Ref embFontIDA); + + GBool isOk() { return ok; } + + void incRefCnt(); + void decRefCnt(); + + // Get font tag. + GooString *getTag() { return tag; } + + // Get font dictionary ID. + Ref *getID() { return &id; } + + // Does this font match the tag? + GBool matches(char *tagA) { return !tag->cmp(tagA); } + + // Get font family name. + GooString *getFamily() { return family; } + + // Get font stretch. + Stretch getStretch() { return stretch; } + + // Get font weight. + Weight getWeight() { return weight; } + + // Get the original font name (ignornig any munging that might have + // been done to map to a canonical Base-14 font name). + GooString *getName() { return name; } + + // Get font type. + GfxFontType getType() { return type; } + virtual GBool isCIDFont() { return gFalse; } + + // Get embedded font ID, i.e., a ref for the font file stream. + // Returns false if there is no embedded font. + GBool getEmbeddedFontID(Ref *embID) + { *embID = embFontID; return embFontID.num >= 0; } + + // Get the PostScript font name for the embedded font. Returns + // NULL if there is no embedded font. + GooString *getEmbeddedFontName() { return embFontName; } + + // Get font descriptor flags. + int getFlags() { return flags; } + GBool isFixedWidth() { return flags & fontFixedWidth; } + GBool isSerif() { return flags & fontSerif; } + GBool isSymbolic() { return flags & fontSymbolic; } + GBool isItalic() { return flags & fontItalic; } + GBool isBold() { return flags & fontBold; } + + // Return the Unicode map. + virtual CharCodeToUnicode *getToUnicode() = 0; + + // Return the font matrix. + double *getFontMatrix() { return fontMat; } + + // Return the font bounding box. + double *getFontBBox() { return fontBBox; } + + // Return the ascent and descent values. + double getAscent() { return ascent; } + double getDescent() { return descent; } + + // Return the writing mode (0=horizontal, 1=vertical). + virtual int getWMode() { return 0; } + + // Locate the font file for this font. If is true, includes PS + // printer-resident fonts. Returns NULL on failure. + GfxFontLoc *locateFont(XRef *xref, GBool ps); + + // Locate a Base-14 font file for a specified font name. + static GfxFontLoc *locateBase14Font(GooString *base14Name); + + // Read an external or embedded font file into a buffer. + char *readEmbFontFile(XRef *xref, int *len); + + // Get the next char from a string of bytes, returning the + // char , its Unicode mapping , its displacement vector + // (, ), and its origin offset vector (, ). + // is the number of entries available in , and is set to + // the number actually used. Returns the number of bytes used by + // the char code. + virtual int getNextChar(char *s, int len, CharCode *code, + Unicode **u, int *uLen, + double *dx, double *dy, double *ox, double *oy) = 0; + + // Does this font have a toUnicode map? + GBool hasToUnicodeCMap() { return hasToUnicode; } + + // Return the name of the encoding + GooString *getEncodingName() { return encodingName; } + +protected: + + virtual ~GfxFont(); + + static GfxFontType getFontType(XRef *xref, Dict *fontDict, Ref *embID); + void readFontDescriptor(XRef *xref, Dict *fontDict); + CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits, + CharCodeToUnicode *ctu); + static GfxFontLoc *getExternalFont(GooString *path, GBool cid); + + GooString *tag; // PDF font tag + Ref id; // reference (used as unique ID) + GooString *name; // font name + GooString *family; // font family + Stretch stretch; // font stretch + Weight weight; // font weight + GfxFontType type; // type of font + int flags; // font descriptor flags + GooString *embFontName; // name of embedded font + Ref embFontID; // ref to embedded font file stream + double fontMat[6]; // font matrix (Type 3 only) + double fontBBox[4]; // font bounding box (Type 3 only) + double missingWidth; // "default" width + double ascent; // max height above baseline + double descent; // max depth below baseline + int refCnt; + GBool ok; + GBool hasToUnicode; + GooString *encodingName; +}; + +//------------------------------------------------------------------------ +// Gfx8BitFont +//------------------------------------------------------------------------ + +class Gfx8BitFont: public GfxFont { +public: + + Gfx8BitFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA, + GfxFontType typeA, Ref embFontIDA, Dict *fontDict); + + virtual int getNextChar(char *s, int len, CharCode *code, + Unicode **u, int *uLen, + double *dx, double *dy, double *ox, double *oy); + + // Return the encoding. + char **getEncoding() { return enc; } + + // Return the Unicode map. + CharCodeToUnicode *getToUnicode(); + + // Return the character name associated with . + char *getCharName(int code) { return enc[code]; } + + // Returns true if the PDF font specified an encoding. + GBool getHasEncoding() { return hasEncoding; } + + // Returns true if the PDF font specified MacRomanEncoding. + GBool getUsesMacRomanEnc() { return usesMacRomanEnc; } + + // Get width of a character. + double getWidth(Guchar c) { return widths[c]; } + + // Return a char code-to-GID mapping for the provided font file. + // (This is only useful for TrueType fonts.) + int *getCodeToGIDMap(FoFiTrueType *ff); + + // Return the Type 3 CharProc dictionary, or NULL if none. + Dict *getCharProcs(); + + // Return the Type 3 CharProc for the character associated with . + Object *getCharProc(int code, Object *proc); + + // Return the Type 3 Resources dictionary, or NULL if none. + Dict *getResources(); + +private: + virtual ~Gfx8BitFont(); + + const Base14FontMapEntry *base14; // for Base-14 fonts only; NULL otherwise + char *enc[256]; // char code --> char name + char encFree[256]; // boolean for each char name: if set, + // the string is malloc'ed + CharCodeToUnicode *ctu; // char code --> Unicode + GBool hasEncoding; + GBool usesMacRomanEnc; + double widths[256]; // character widths + Object charProcs; // Type 3 CharProcs dictionary + Object resources; // Type 3 Resources dictionary + + friend class GfxFont; +}; + +//------------------------------------------------------------------------ +// GfxCIDFont +//------------------------------------------------------------------------ + +class GfxCIDFont: public GfxFont { +public: + + GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA, + GfxFontType typeA, Ref embFontIDA, Dict *fontDict); + + virtual GBool isCIDFont() { return gTrue; } + + virtual int getNextChar(char *s, int len, CharCode *code, + Unicode **u, int *uLen, + double *dx, double *dy, double *ox, double *oy); + + // Return the writing mode (0=horizontal, 1=vertical). + virtual int getWMode(); + + // Return the Unicode map. + CharCodeToUnicode *getToUnicode(); + + // Get the collection name (-). + GooString *getCollection(); + + // Return the CID-to-GID mapping table. These should only be called + // if type is fontCIDType2. + int *getCIDToGID() { return cidToGID; } + int getCIDToGIDLen() { return cidToGIDLen; } + + int *getCodeToGIDMap(FoFiTrueType *ff, int *length); + + double getWidth(char* s, int len); + +private: + virtual ~GfxCIDFont(); + + int mapCodeToGID(FoFiTrueType *ff, int cmapi, + Unicode unicode, GBool wmode); + + GooString *collection; // collection name + CMap *cMap; // char code --> CID + CharCodeToUnicode *ctu; // CID --> Unicode + GBool ctuUsesCharCode; // true: ctu maps char code to Unicode; + // false: ctu maps CID to Unicode + GfxFontCIDWidths widths; // character widths + int *cidToGID; // CID --> GID mapping (for embedded + // TrueType fonts) + int cidToGIDLen; +}; + +//------------------------------------------------------------------------ +// GfxFontDict +//------------------------------------------------------------------------ + +class GfxFontDict { +public: + + // Build the font dictionary, given the PDF font dictionary. + GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict); + + // Destructor. + ~GfxFontDict(); + + // Get the specified font. + GfxFont *lookup(char *tag); + + // Iterative access. + int getNumFonts() { return numFonts; } + GfxFont *getFont(int i) { return fonts[i]; } + +private: + + GfxFont **fonts; // list of fonts + int numFonts; // number of fonts +}; + +#endif diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc new file mode 100644 index 0000000..252e88d --- /dev/null +++ b/poppler/GfxState.cc @@ -0,0 +1,6129 @@ +//======================================================================== +// +// GfxState.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2006, 2007 Jeff Muizelaar +// Copyright (C) 2006, 2010 Carlos Garcia Campos +// Copyright (C) 2006-2012 Albert Astals Cid +// Copyright (C) 2009, 2012 Koji Otani +// Copyright (C) 2009, 2011, 2012 Thomas Freitag +// Copyright (C) 2009 Christian Persch +// Copyright (C) 2010 Paweł Wiejacha +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Andrea Canciani +// Copyright (C) 2012 William Bader +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "goo/gmem.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "Page.h" +#include "Gfx.h" +#include "GfxState.h" +#include "GfxState_helpers.h" +#include "GfxFont.h" +#include "GlobalParams.h" +#include "PopplerCache.h" + +//------------------------------------------------------------------------ + +// Max depth of nested color spaces. This is used to catch infinite +// loops in the color space object structure. +#define colorSpaceRecursionLimit 8 + +//------------------------------------------------------------------------ + +GBool Matrix::invertTo(Matrix *other) const +{ + double det; + + det = 1 / determinant(); + other->m[0] = m[3] * det; + other->m[1] = -m[1] * det; + other->m[2] = -m[2] * det; + other->m[3] = m[0] * det; + other->m[4] = (m[2] * m[5] - m[3] * m[4]) * det; + other->m[5] = (m[1] * m[4] - m[0] * m[5]) * det; + + return gTrue; +} + +void Matrix::transform(double x, double y, double *tx, double *ty) const +{ + double temp_x, temp_y; + + temp_x = m[0] * x + m[2] * y + m[4]; + temp_y = m[1] * x + m[3] * y + m[5]; + + *tx = temp_x; + *ty = temp_y; +} + +// Matrix norm, taken from _cairo_matrix_transformed_circle_major_axis +double Matrix::norm() const +{ + double f, g, h, i, j; + + i = m[0]*m[0] + m[1]*m[1]; + j = m[2]*m[2] + m[3]*m[3]; + + f = 0.5 * (i + j); + g = 0.5 * (i - j); + h = m[0]*m[2] + m[1]*m[3]; + + return sqrt (f + hypot (g, h)); +} + +//------------------------------------------------------------------------ + +struct GfxBlendModeInfo { + const char *name; + GfxBlendMode mode; +}; + +static const GfxBlendModeInfo gfxBlendModeNames[] = { + { "Normal", gfxBlendNormal }, + { "Compatible", gfxBlendNormal }, + { "Multiply", gfxBlendMultiply }, + { "Screen", gfxBlendScreen }, + { "Overlay", gfxBlendOverlay }, + { "Darken", gfxBlendDarken }, + { "Lighten", gfxBlendLighten }, + { "ColorDodge", gfxBlendColorDodge }, + { "ColorBurn", gfxBlendColorBurn }, + { "HardLight", gfxBlendHardLight }, + { "SoftLight", gfxBlendSoftLight }, + { "Difference", gfxBlendDifference }, + { "Exclusion", gfxBlendExclusion }, + { "Hue", gfxBlendHue }, + { "Saturation", gfxBlendSaturation }, + { "Color", gfxBlendColor }, + { "Luminosity", gfxBlendLuminosity } +}; + +#define nGfxBlendModeNames \ + ((int)((sizeof(gfxBlendModeNames) / sizeof(GfxBlendModeInfo)))) + +//------------------------------------------------------------------------ +// +// NB: This must match the GfxColorSpaceMode enum defined in +// GfxState.h +static const char *gfxColorSpaceModeNames[] = { + "DeviceGray", + "CalGray", + "DeviceRGB", + "CalRGB", + "DeviceCMYK", + "Lab", + "ICCBased", + "Indexed", + "Separation", + "DeviceN", + "Pattern" +}; + +#define nGfxColorSpaceModes ((sizeof(gfxColorSpaceModeNames) / sizeof(char *))) + +#ifdef USE_CMS + +#ifdef USE_LCMS1 +#include +#define cmsColorSpaceSignature icColorSpaceSignature +#define cmsSetLogErrorHandler cmsSetErrorHandler +#define cmsSigXYZData icSigXYZData +#define cmsSigLuvData icSigLuvData +#define cmsSigLabData icSigLabData +#define cmsSigYCbCrData icSigYCbCrData +#define cmsSigYxyData icSigYxyData +#define cmsSigRgbData icSigRgbData +#define cmsSigHsvData icSigHsvData +#define cmsSigHlsData icSigHlsData +#define cmsSigCmyData icSigCmyData +#define cmsSig3colorData icSig3colorData +#define cmsSigGrayData icSigGrayData +#define cmsSigCmykData icSigCmykData +#define cmsSig4colorData icSig4colorData +#define cmsSig2colorData icSig2colorData +#define cmsSig5colorData icSig5colorData +#define cmsSig6colorData icSig6colorData +#define cmsSig7colorData icSig7colorData +#define cmsSig8colorData icSig8colorData +#define cmsSig9colorData icSig9colorData +#define cmsSig10colorData icSig10colorData +#define cmsSig11colorData icSig11colorData +#define cmsSig12colorData icSig12colorData +#define cmsSig13colorData icSig13colorData +#define cmsSig14colorData icSig14colorData +#define cmsSig15colorData icSig15colorData +#define LCMS_FLAGS 0 +#else +#include +#define LCMS_FLAGS cmsFLAGS_NOOPTIMIZE +#endif + +#define COLOR_PROFILE_DIR "/ColorProfiles/" +#define GLOBAL_COLOR_PROFILE_DIR POPPLER_DATADIR COLOR_PROFILE_DIR + +void GfxColorTransform::doTransform(void *in, void *out, unsigned int size) { + cmsDoTransform(transform, in, out, size); +} + +// transformA should be a cmsHTRANSFORM +GfxColorTransform::GfxColorTransform(void *transformA) { + transform = transformA; + refCount = 1; +} + +GfxColorTransform::~GfxColorTransform() { + cmsDeleteTransform(transform); +} + +void GfxColorTransform::ref() { + refCount++; +} + +unsigned int GfxColorTransform::unref() { + return --refCount; +} + +static cmsHPROFILE RGBProfile = NULL; +static GooString *displayProfileName = NULL; // display profile file Name +static cmsHPROFILE displayProfile = NULL; // display profile +static unsigned int displayPixelType = 0; +static GfxColorTransform *XYZ2DisplayTransform = NULL; + +// convert color space signature to cmsColor type +static unsigned int getCMSColorSpaceType(cmsColorSpaceSignature cs); +static unsigned int getCMSNChannels(cmsColorSpaceSignature cs); +static cmsHPROFILE loadColorProfile(const char *fileName); + +void GfxColorSpace::setDisplayProfile(void *displayProfileA) { + displayProfile = displayProfileA; +} + +void GfxColorSpace::setDisplayProfileName(GooString *name) { + displayProfileName = name->copy(); +} + +cmsHPROFILE GfxColorSpace::getRGBProfile() { + return RGBProfile; +} + +cmsHPROFILE GfxColorSpace::getDisplayProfile() { + return displayProfile; +} + +#endif + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +GfxColorSpace::GfxColorSpace() { + overprintMask = 0x0f; +} + +GfxColorSpace::~GfxColorSpace() { +} + +GfxColorSpace *GfxColorSpace::parse(Object *csObj, Gfx *gfx, int recursion) { + GfxColorSpace *cs; + Object obj1; + + if (recursion > colorSpaceRecursionLimit) { + error(errSyntaxError, -1, "Loop detected in color space objects"); + return NULL; + } + + cs = NULL; + if (csObj->isName()) { + if (csObj->isName("DeviceGray") || csObj->isName("G")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) { + cs = new GfxDeviceRGBColorSpace(); + } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else if (csObj->isName("Pattern")) { + cs = new GfxPatternColorSpace(NULL); + } else { + error(errSyntaxWarning, -1, "Bad color space '{0:s}'", csObj->getName()); + } + } else if (csObj->isArray() && csObj->arrayGetLength() > 0) { + csObj->arrayGet(0, &obj1); + if (obj1.isName("DeviceGray") || obj1.isName("G")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) { + cs = new GfxDeviceRGBColorSpace(); + } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else if (obj1.isName("CalGray")) { + cs = GfxCalGrayColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("CalRGB")) { + cs = GfxCalRGBColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Lab")) { + cs = GfxLabColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("ICCBased")) { + cs = GfxICCBasedColorSpace::parse(csObj->getArray(), gfx, recursion); + } else if (obj1.isName("Indexed") || obj1.isName("I")) { + cs = GfxIndexedColorSpace::parse(csObj->getArray(), gfx, recursion); + } else if (obj1.isName("Separation")) { + cs = GfxSeparationColorSpace::parse(csObj->getArray(), gfx, recursion); + } else if (obj1.isName("DeviceN")) { + cs = GfxDeviceNColorSpace::parse(csObj->getArray(), gfx, recursion); + } else if (obj1.isName("Pattern")) { + cs = GfxPatternColorSpace::parse(csObj->getArray(), gfx, recursion); + } else { + error(errSyntaxWarning, -1, "Bad color space"); + } + obj1.free(); + } else if (csObj->isDict()) { + csObj->dictLookup("ColorSpace", &obj1); + if (obj1.isName("DeviceGray")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (obj1.isName("DeviceRGB")) { + cs = new GfxDeviceRGBColorSpace(); + } else if (obj1.isName("DeviceCMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else { + error(errSyntaxWarning, -1, "Bad color space '{0:s}'", csObj->getName()); + } + obj1.free(); + } else { + error(errSyntaxWarning, -1, "Bad color space - expected name or array or dict"); + } + return cs; +} + +void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel) { + int i; + + for (i = 0; i < getNComps(); ++i) { + decodeLow[i] = 0; + decodeRange[i] = 1; + } +} + +int GfxColorSpace::getNumColorSpaceModes() { + return nGfxColorSpaceModes; +} + +const char *GfxColorSpace::getColorSpaceModeName(int idx) { + return gfxColorSpaceModeNames[idx]; +} + +#ifdef USE_CMS +cmsHPROFILE loadColorProfile(const char *fileName) +{ + cmsHPROFILE hp = NULL; + FILE *fp; + + if (fileName[0] == '/') { + // full path + // check if open the file + if ((fp = fopen(fileName,"r")) != NULL) { + fclose(fp); + hp = cmsOpenProfileFromFile(fileName,"r"); + } + return hp; + } + // try to load from user directory + GooString *path = globalParams->getBaseDir(); + path->append(COLOR_PROFILE_DIR); + path->append(fileName); + // check if open the file + if ((fp = fopen(path->getCString(),"r")) != NULL) { + fclose(fp); + hp = cmsOpenProfileFromFile(path->getCString(),"r"); + } + delete path; + if (hp == NULL) { + // load from global directory + path = new GooString(GLOBAL_COLOR_PROFILE_DIR); + path->append(fileName); + // check if open the file + if ((fp = fopen(path->getCString(),"r")) != NULL) { + fclose(fp); + hp = cmsOpenProfileFromFile(path->getCString(),"r"); + } + delete path; + } + return hp; +} + +#ifdef USE_LCMS1 +static int CMSError(int ecode, const char *msg) +{ + error(errSyntaxWarning, -1, "{0:s}", msg); + return 1; +} +#else +static void CMSError(cmsContext /*contextId*/, cmsUInt32Number /*ecode*/, const char *text) +{ + error(errSyntaxWarning, -1, "{0:s}", text); +} +#endif + +int GfxColorSpace::setupColorProfiles() +{ + static GBool initialized = gFalse; + cmsHTRANSFORM transform; + unsigned int nChannels; + + // do only once + if (initialized) return 0; + initialized = gTrue; + + // set error handlor + cmsSetLogErrorHandler(CMSError); + + if (displayProfile == NULL) { + // load display profile if it was not already loaded. + if (displayProfileName == NULL) { + displayProfile = loadColorProfile("display.icc"); + } else if (displayProfileName->getLength() > 0) { + displayProfile = loadColorProfile(displayProfileName->getCString()); + } + } + // load RGB profile + RGBProfile = loadColorProfile("RGB.icc"); + if (RGBProfile == NULL) { + /* use built in sRGB profile */ + RGBProfile = cmsCreate_sRGBProfile(); + } + // create transforms + if (displayProfile != NULL) { + displayPixelType = getCMSColorSpaceType(cmsGetColorSpace(displayProfile)); + nChannels = getCMSNChannels(cmsGetColorSpace(displayProfile)); + // create transform from XYZ + cmsHPROFILE XYZProfile = cmsCreateXYZProfile(); + if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, + displayProfile, + COLORSPACE_SH(displayPixelType) | + CHANNELS_SH(nChannels) | BYTES_SH(1), + INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create Lab transform"); + } else { + XYZ2DisplayTransform = new GfxColorTransform(transform); + } + cmsCloseProfile(XYZProfile); + } + return 0; +} + +unsigned int getCMSColorSpaceType(cmsColorSpaceSignature cs) +{ + switch (cs) { + case cmsSigXYZData: + return PT_XYZ; + break; + case cmsSigLabData: + return PT_Lab; + break; + case cmsSigLuvData: + return PT_YUV; + break; + case cmsSigYCbCrData: + return PT_YCbCr; + break; + case cmsSigYxyData: + return PT_Yxy; + break; + case cmsSigRgbData: + return PT_RGB; + break; + case cmsSigGrayData: + return PT_GRAY; + break; + case cmsSigHsvData: + return PT_HSV; + break; + case cmsSigHlsData: + return PT_HLS; + break; + case cmsSigCmykData: + return PT_CMYK; + break; + case cmsSigCmyData: + return PT_CMY; + break; + case cmsSig2colorData: + case cmsSig3colorData: + case cmsSig4colorData: + case cmsSig5colorData: + case cmsSig6colorData: + case cmsSig7colorData: + case cmsSig8colorData: + case cmsSig9colorData: + case cmsSig10colorData: + case cmsSig11colorData: + case cmsSig12colorData: + case cmsSig13colorData: + case cmsSig14colorData: + case cmsSig15colorData: + default: + break; + } + return PT_RGB; +} + +unsigned int getCMSNChannels(cmsColorSpaceSignature cs) +{ + switch (cs) { + case cmsSigXYZData: + case cmsSigLuvData: + case cmsSigLabData: + case cmsSigYCbCrData: + case cmsSigYxyData: + case cmsSigRgbData: + case cmsSigHsvData: + case cmsSigHlsData: + case cmsSigCmyData: + case cmsSig3colorData: + return 3; + break; + case cmsSigGrayData: + return 1; + break; + case cmsSigCmykData: + case cmsSig4colorData: + return 4; + break; + case cmsSig2colorData: + return 2; + break; + case cmsSig5colorData: + return 5; + break; + case cmsSig6colorData: + return 6; + break; + case cmsSig7colorData: + return 7; + break; + case cmsSig8colorData: + return 8; + break; + case cmsSig9colorData: + return 9; + break; + case cmsSig10colorData: + return 10; + break; + case cmsSig11colorData: + return 11; + break; + case cmsSig12colorData: + return 12; + break; + case cmsSig13colorData: + return 13; + break; + case cmsSig14colorData: + return 14; + break; + case cmsSig15colorData: + return 15; + default: + break; + } + return 3; +} +#endif + +//------------------------------------------------------------------------ +// GfxDeviceGrayColorSpace +//------------------------------------------------------------------------ + +GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() { +} + +GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() { +} + +GfxColorSpace *GfxDeviceGrayColorSpace::copy() { + return new GfxDeviceGrayColorSpace(); +} + +void GfxDeviceGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01(color->c[0]); +} + +void GfxDeviceGrayColorSpace::getGrayLine(Guchar *in, Guchar *out, int length) { + memcpy (out, in, length); +} + +void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = clip01(color->c[0]); +} + +void GfxDeviceGrayColorSpace::getRGBLine(Guchar *in, unsigned int *out, + int length) { + int i; + + for (i = 0; i < length; i++) + out[i] = (in[i] << 16) | (in[i] << 8) | (in[i] << 0); +} + +void GfxDeviceGrayColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) { + for (int i = 0; i < length; i++) { + *out++ = in[i]; + *out++ = in[i]; + *out++ = in[i]; + } +} + +void GfxDeviceGrayColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) { + for (int i = 0; i < length; i++) { + *out++ = in[i]; + *out++ = in[i]; + *out++ = in[i]; + *out++ = 255; + } +} + +void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = clip01(gfxColorComp1 - color->c[0]); +} + +void GfxDeviceGrayColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; +} + +//------------------------------------------------------------------------ +// GfxCalGrayColorSpace +//------------------------------------------------------------------------ + +GfxCalGrayColorSpace::GfxCalGrayColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + gamma = 1; +} + +GfxCalGrayColorSpace::~GfxCalGrayColorSpace() { +} + +GfxColorSpace *GfxCalGrayColorSpace::copy() { + GfxCalGrayColorSpace *cs; + + cs = new GfxCalGrayColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->gamma = gamma; + return cs; +} + +// This is the inverse of MatrixLMN in Example 4.10 from the PostScript +// Language Reference, Third Edition. +static const double xyzrgb[3][3] = { + { 3.240449, -1.537136, -0.498531 }, + { -0.969265, 1.876011, 0.041556 }, + { 0.055643, -0.204026, 1.057229 } +}; + +GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) { + GfxCalGrayColorSpace *cs; + Object obj1, obj2, obj3; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(errSyntaxWarning, -1, "Bad CalGray color space"); + obj1.free(); + return NULL; + } + cs = new GfxCalGrayColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + if (likely(obj3.isNum())) + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + if (likely(obj3.isNum())) + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + if (likely(obj3.isNum())) + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + if (likely(obj3.isNum())) + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + if (likely(obj3.isNum())) + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + if (likely(obj3.isNum())) + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Gamma", &obj2)->isNum()) { + cs->gamma = obj2.getNum(); + } + obj2.free(); + obj1.free(); + + cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX + + xyzrgb[0][1] * cs->whiteY + + xyzrgb[0][2] * cs->whiteZ); + cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX + + xyzrgb[1][1] * cs->whiteY + + xyzrgb[1][2] * cs->whiteZ); + cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX + + xyzrgb[2][1] * cs->whiteY + + xyzrgb[2][2] * cs->whiteZ); + + return cs; +} + +// convert CalGray to media XYZ color space +// (not multiply by the white point) +void GfxCalGrayColorSpace::getXYZ(GfxColor *color, + double *pX, double *pY, double *pZ) { + const double A = colToDbl(color->c[0]); + const double xyzColor = pow(A,gamma); + *pX = xyzColor; + *pY = xyzColor; + *pZ = xyzColor; +} + +void GfxCalGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxRGB rgb; + +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_GRAY) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + double X, Y, Z; + + getXYZ(color,&X,&Y,&Z); + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + XYZ2DisplayTransform->doTransform(in,out,1); + *gray = byteToCol(out[0]); + return; + } +#endif + getRGB(color, &rgb); + *gray = clip01((GfxColorComp)(0.299 * rgb.r + + 0.587 * rgb.g + + 0.114 * rgb.b + 0.5)); +} + +void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double X, Y, Z; + double r, g, b; + + getXYZ(color,&X,&Y,&Z); +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + XYZ2DisplayTransform->doTransform(in,out,1); + rgb->r = byteToCol(out[0]); + rgb->g = byteToCol(out[1]); + rgb->b = byteToCol(out[2]); + return; + } +#endif + X *= whiteX; + Y *= whiteY; + Z *= whiteZ; + // convert XYZ to RGB, including gamut mapping and gamma correction + r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z; + g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z; + b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z; + rgb->r = dblToCol(sqrt(clip01(r * kr))); + rgb->g = dblToCol(sqrt(clip01(g * kg))); + rgb->b = dblToCol(sqrt(clip01(b * kb))); +} + +void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxRGB rgb; + GfxColorComp c, m, y, k; + +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_CMYK) { + double in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + double X, Y, Z; + + getXYZ(color,&X,&Y,&Z); + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + + XYZ2DisplayTransform->doTransform(in,out,1); + cmyk->c = byteToCol(out[0]); + cmyk->m = byteToCol(out[1]); + cmyk->y = byteToCol(out[2]); + cmyk->k = byteToCol(out[3]); + return; + } +#endif + getRGB(color, &rgb); + c = clip01(gfxColorComp1 - rgb.r); + m = clip01(gfxColorComp1 - rgb.g); + y = clip01(gfxColorComp1 - rgb.b); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxCalGrayColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; +} + +//------------------------------------------------------------------------ +// GfxDeviceRGBColorSpace +//------------------------------------------------------------------------ + +GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() { +} + +GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() { +} + +GfxColorSpace *GfxDeviceRGBColorSpace::copy() { + return new GfxDeviceRGBColorSpace(); +} + +void GfxDeviceRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01((GfxColorComp)(0.3 * color->c[0] + + 0.59 * color->c[1] + + 0.11 * color->c[2] + 0.5)); +} + +void GfxDeviceRGBColorSpace::getGrayLine(Guchar *in, Guchar *out, int length) { + int i; + + for (i = 0; i < length; i++) { + out[i] = + (in[i * 3 + 0] * 19595 + + in[i * 3 + 1] * 38469 + + in[i * 3 + 2] * 7472) / 65536; + } +} + +void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = clip01(color->c[0]); + rgb->g = clip01(color->c[1]); + rgb->b = clip01(color->c[2]); +} + +void GfxDeviceRGBColorSpace::getRGBLine(Guchar *in, unsigned int *out, + int length) { + Guchar *p; + int i; + + for (i = 0, p = in; i < length; i++, p += 3) + out[i] = (p[0] << 16) | (p[1] << 8) | (p[2] << 0); +} + +void GfxDeviceRGBColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) { + for (int i = 0; i < length; i++) { + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + } +} + +void GfxDeviceRGBColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) { + for (int i = 0; i < length; i++) { + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + *out++ = 255; + } +} +void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColorComp c, m, y, k; + + c = clip01(gfxColorComp1 - color->c[0]); + m = clip01(gfxColorComp1 - color->c[1]); + y = clip01(gfxColorComp1 - color->c[2]); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxDeviceRGBColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + color->c[1] = 0; + color->c[2] = 0; +} + +//------------------------------------------------------------------------ +// GfxCalRGBColorSpace +//------------------------------------------------------------------------ + +GfxCalRGBColorSpace::GfxCalRGBColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + gammaR = gammaG = gammaB = 1; + mat[0] = 1; mat[1] = 0; mat[2] = 0; + mat[3] = 0; mat[4] = 1; mat[5] = 0; + mat[6] = 0; mat[7] = 0; mat[8] = 1; +} + +GfxCalRGBColorSpace::~GfxCalRGBColorSpace() { +} + +GfxColorSpace *GfxCalRGBColorSpace::copy() { + GfxCalRGBColorSpace *cs; + int i; + + cs = new GfxCalRGBColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->gammaR = gammaR; + cs->gammaG = gammaG; + cs->gammaB = gammaB; + for (i = 0; i < 9; ++i) { + cs->mat[i] = mat[i]; + } + return cs; +} + +GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) { + GfxCalRGBColorSpace *cs; + Object obj1, obj2, obj3; + int i; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(errSyntaxWarning, -1, "Bad CalRGB color space"); + obj1.free(); + return NULL; + } + cs = new GfxCalRGBColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + if (likely(obj3.isNum())) + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + if (likely(obj3.isNum())) + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + if (likely(obj3.isNum())) + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + if (likely(obj3.isNum())) + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + if (likely(obj3.isNum())) + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + if (likely(obj3.isNum())) + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Gamma", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + if (likely(obj3.isNum())) + cs->gammaR = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + if (likely(obj3.isNum())) + cs->gammaG = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + if (likely(obj3.isNum())) + cs->gammaB = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Matrix", &obj2)->isArray() && + obj2.arrayGetLength() == 9) { + for (i = 0; i < 9; ++i) { + obj2.arrayGet(i, &obj3); + if (likely(obj3.isNum())) + cs->mat[i] = obj3.getNum(); + obj3.free(); + } + } + obj2.free(); + obj1.free(); + + cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX + + xyzrgb[0][1] * cs->whiteY + + xyzrgb[0][2] * cs->whiteZ); + cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX + + xyzrgb[1][1] * cs->whiteY + + xyzrgb[1][2] * cs->whiteZ); + cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX + + xyzrgb[2][1] * cs->whiteY + + xyzrgb[2][2] * cs->whiteZ); + + return cs; +} + +// convert CalRGB to XYZ color space +void GfxCalRGBColorSpace::getXYZ(GfxColor *color, + double *pX, double *pY, double *pZ) { + double A, B, C; + + A = pow(colToDbl(color->c[0]), gammaR); + B = pow(colToDbl(color->c[1]), gammaG); + C = pow(colToDbl(color->c[2]), gammaB); + *pX = mat[0] * A + mat[3] * B + mat[6] * C; + *pY = mat[1] * A + mat[4] * B + mat[7] * C; + *pZ = mat[2] * A + mat[5] * B + mat[8] * C; +} + +void GfxCalRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxRGB rgb; + +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_GRAY) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + double X, Y, Z; + + getXYZ(color,&X,&Y,&Z); + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + XYZ2DisplayTransform->doTransform(in,out,1); + *gray = byteToCol(out[0]); + return; + } +#endif + getRGB(color, &rgb); + *gray = clip01((GfxColorComp)(0.299 * rgb.r + + 0.587 * rgb.g + + 0.114 * rgb.b + 0.5)); +} + +void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double X, Y, Z; + double r, g, b; + + getXYZ(color,&X,&Y,&Z); +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + in[0] = clip01(X/whiteX); + in[1] = clip01(Y/whiteY); + in[2] = clip01(Z/whiteZ); + XYZ2DisplayTransform->doTransform(in,out,1); + rgb->r = byteToCol(out[0]); + rgb->g = byteToCol(out[1]); + rgb->b = byteToCol(out[2]); + return; + } +#endif + // convert XYZ to RGB, including gamut mapping and gamma correction + r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z; + g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z; + b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z; + rgb->r = dblToCol(sqrt(clip01(r))); + rgb->g = dblToCol(sqrt(clip01(g))); + rgb->b = dblToCol(sqrt(clip01(b))); +} + +void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxRGB rgb; + GfxColorComp c, m, y, k; + +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_CMYK) { + double in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + double X, Y, Z; + + getXYZ(color,&X,&Y,&Z); + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + XYZ2DisplayTransform->doTransform(in,out,1); + cmyk->c = byteToCol(out[0]); + cmyk->m = byteToCol(out[1]); + cmyk->y = byteToCol(out[2]); + cmyk->k = byteToCol(out[3]); + return; + } +#endif + getRGB(color, &rgb); + c = clip01(gfxColorComp1 - rgb.r); + m = clip01(gfxColorComp1 - rgb.g); + y = clip01(gfxColorComp1 - rgb.b); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxCalRGBColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + color->c[1] = 0; + color->c[2] = 0; +} + +//------------------------------------------------------------------------ +// GfxDeviceCMYKColorSpace +//------------------------------------------------------------------------ + +GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() { +} + +GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() { +} + +GfxColorSpace *GfxDeviceCMYKColorSpace::copy() { + return new GfxDeviceCMYKColorSpace(); +} + +void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01((GfxColorComp)(gfxColorComp1 - color->c[3] + - 0.3 * color->c[0] + - 0.59 * color->c[1] + - 0.11 * color->c[2] + 0.5)); +} + +void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double c, m, y, k, c1, m1, y1, k1, r, g, b; + + c = colToDbl(color->c[0]); + m = colToDbl(color->c[1]); + y = colToDbl(color->c[2]); + k = colToDbl(color->c[3]); + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); + rgb->r = clip01(dblToCol(r)); + rgb->g = clip01(dblToCol(g)); + rgb->b = clip01(dblToCol(b)); +} + +static inline void GfxDeviceCMYKColorSpacegetRGBLineHelper(Guchar *&in, double &r, double &g, double &b) +{ + double c, m, y, k, c1, m1, y1, k1; + + c = byteToDbl(*in++); + m = byteToDbl(*in++); + y = byteToDbl(*in++); + k = byteToDbl(*in++); + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); +} + +void GfxDeviceCMYKColorSpace::getRGBLine(Guchar *in, unsigned int *out, int length) +{ + double r, g, b; + for (int i = 0; i < length; i++) { + GfxDeviceCMYKColorSpacegetRGBLineHelper(in, r, g, b); + *out++ = (dblToByte(clip01(r)) << 16) | (dblToByte(clip01(g)) << 8) | dblToByte(clip01(b)); + } +} + +void GfxDeviceCMYKColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) +{ + double r, g, b; + + for (int i = 0; i < length; i++) { + GfxDeviceCMYKColorSpacegetRGBLineHelper(in, r, g, b); + *out++ = dblToByte(clip01(r)); + *out++ = dblToByte(clip01(g)); + *out++ = dblToByte(clip01(b)); + } +} + +void GfxDeviceCMYKColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) +{ + double r, g, b; + + for (int i = 0; i < length; i++) { + GfxDeviceCMYKColorSpacegetRGBLineHelper(in, r, g, b); + *out++ = dblToByte(clip01(r)); + *out++ = dblToByte(clip01(g)); + *out++ = dblToByte(clip01(b)); + *out++ = 255; + } +} + +void GfxDeviceCMYKColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = clip01(color->c[0]); + cmyk->m = clip01(color->c[1]); + cmyk->y = clip01(color->c[2]); + cmyk->k = clip01(color->c[3]); +} + +void GfxDeviceCMYKColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + color->c[1] = 0; + color->c[2] = 0; + color->c[3] = gfxColorComp1; +} + +//------------------------------------------------------------------------ +// GfxLabColorSpace +//------------------------------------------------------------------------ + +GfxLabColorSpace::GfxLabColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + aMin = bMin = -100; + aMax = bMax = 100; +} + +GfxLabColorSpace::~GfxLabColorSpace() { +} + +GfxColorSpace *GfxLabColorSpace::copy() { + GfxLabColorSpace *cs; + + cs = new GfxLabColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->aMin = aMin; + cs->aMax = aMax; + cs->bMin = bMin; + cs->bMax = bMax; + cs->kr = kr; + cs->kg = kg; + cs->kb = kb; + return cs; +} + +GfxColorSpace *GfxLabColorSpace::parse(Array *arr) { + GfxLabColorSpace *cs; + Object obj1, obj2, obj3; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(errSyntaxWarning, -1, "Bad Lab color space"); + obj1.free(); + return NULL; + } + cs = new GfxLabColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Range", &obj2)->isArray() && + obj2.arrayGetLength() == 4) { + obj2.arrayGet(0, &obj3); + cs->aMin = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->aMax = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->bMin = obj3.getNum(); + obj3.free(); + obj2.arrayGet(3, &obj3); + cs->bMax = obj3.getNum(); + obj3.free(); + } + obj2.free(); + obj1.free(); + + cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX + + xyzrgb[0][1] * cs->whiteY + + xyzrgb[0][2] * cs->whiteZ); + cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX + + xyzrgb[1][1] * cs->whiteY + + xyzrgb[1][2] * cs->whiteZ); + cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX + + xyzrgb[2][1] * cs->whiteY + + xyzrgb[2][2] * cs->whiteZ); + + return cs; +} + +void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxRGB rgb; + +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_GRAY) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + getXYZ(color, &in[0], &in[1], &in[2]); + XYZ2DisplayTransform->doTransform(in,out,1); + *gray = byteToCol(out[0]); + return; + } +#endif + getRGB(color, &rgb); + *gray = clip01((GfxColorComp)(0.299 * rgb.r + + 0.587 * rgb.g + + 0.114 * rgb.b + 0.5)); +} + +// convert L*a*b* to media XYZ color space +// (not multiply by the white point) +void GfxLabColorSpace::getXYZ(GfxColor *color, + double *pX, double *pY, double *pZ) { + double X, Y, Z; + double t1, t2; + + t1 = (colToDbl(color->c[0]) + 16) / 116; + t2 = t1 + colToDbl(color->c[1]) / 500; + if (t2 >= (6.0 / 29.0)) { + X = t2 * t2 * t2; + } else { + X = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); + } + if (t1 >= (6.0 / 29.0)) { + Y = t1 * t1 * t1; + } else { + Y = (108.0 / 841.0) * (t1 - (4.0 / 29.0)); + } + t2 = t1 - colToDbl(color->c[2]) / 200; + if (t2 >= (6.0 / 29.0)) { + Z = t2 * t2 * t2; + } else { + Z = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); + } + *pX = X; + *pY = Y; + *pZ = Z; +} + +void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double X, Y, Z; + double r, g, b; + + getXYZ(color, &X, &Y, &Z); +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_RGB) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + XYZ2DisplayTransform->doTransform(in,out,1); + rgb->r = byteToCol(out[0]); + rgb->g = byteToCol(out[1]); + rgb->b = byteToCol(out[2]); + return; + } +#endif + X *= whiteX; + Y *= whiteY; + Z *= whiteZ; + // convert XYZ to RGB, including gamut mapping and gamma correction + r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z; + g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z; + b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z; + rgb->r = dblToCol(sqrt(clip01(r * kr))); + rgb->g = dblToCol(sqrt(clip01(g * kg))); + rgb->b = dblToCol(sqrt(clip01(b * kb))); +} + +void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxRGB rgb; + GfxColorComp c, m, y, k; + +#ifdef USE_CMS + if (XYZ2DisplayTransform != NULL && displayPixelType == PT_CMYK) { + double in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + getXYZ(color, &in[0], &in[1], &in[2]); + XYZ2DisplayTransform->doTransform(in,out,1); + cmyk->c = byteToCol(out[0]); + cmyk->m = byteToCol(out[1]); + cmyk->y = byteToCol(out[2]); + cmyk->k = byteToCol(out[3]); + return; + } +#endif + getRGB(color, &rgb); + c = clip01(gfxColorComp1 - rgb.r); + m = clip01(gfxColorComp1 - rgb.g); + y = clip01(gfxColorComp1 - rgb.b); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxLabColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + if (aMin > 0) { + color->c[1] = dblToCol(aMin); + } else if (aMax < 0) { + color->c[1] = dblToCol(aMax); + } else { + color->c[1] = 0; + } + if (bMin > 0) { + color->c[2] = dblToCol(bMin); + } else if (bMax < 0) { + color->c[2] = dblToCol(bMax); + } else { + color->c[2] = 0; + } +} + +void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel) { + decodeLow[0] = 0; + decodeRange[0] = 100; + decodeLow[1] = aMin; + decodeRange[1] = aMax - aMin; + decodeLow[2] = bMin; + decodeRange[2] = bMax - bMin; +} + +//------------------------------------------------------------------------ +// GfxICCBasedColorSpace +//------------------------------------------------------------------------ + +class GfxICCBasedColorSpaceKey : public PopplerCacheKey +{ + public: + GfxICCBasedColorSpaceKey(int numA, int genA) : num(numA), gen(genA) + { + } + + bool operator==(const PopplerCacheKey &key) const + { + const GfxICCBasedColorSpaceKey *k = static_cast(&key); + return k->num == num && k->gen == gen; + } + + int num, gen; +}; + +class GfxICCBasedColorSpaceItem : public PopplerCacheItem +{ + public: + GfxICCBasedColorSpaceItem(GfxICCBasedColorSpace *csA) + { + cs = static_cast(csA->copy()); + } + + ~GfxICCBasedColorSpaceItem() + { + delete cs; + } + + GfxICCBasedColorSpace *cs; +}; + +GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA, + Ref *iccProfileStreamA) { + nComps = nCompsA; + alt = altA; + iccProfileStream = *iccProfileStreamA; + rangeMin[0] = rangeMin[1] = rangeMin[2] = rangeMin[3] = 0; + rangeMax[0] = rangeMax[1] = rangeMax[2] = rangeMax[3] = 1; +#ifdef USE_CMS + transform = NULL; + lineTransform = NULL; +#endif +} + +GfxICCBasedColorSpace::~GfxICCBasedColorSpace() { + delete alt; +#ifdef USE_CMS + if (transform != NULL) { + if (transform->unref() == 0) delete transform; + } + if (lineTransform != NULL) { + if (lineTransform->unref() == 0) delete lineTransform; + } +#endif +} + +GfxColorSpace *GfxICCBasedColorSpace::copy() { + GfxICCBasedColorSpace *cs; + int i; + + cs = new GfxICCBasedColorSpace(nComps, alt->copy(), &iccProfileStream); + for (i = 0; i < 4; ++i) { + cs->rangeMin[i] = rangeMin[i]; + cs->rangeMax[i] = rangeMax[i]; + } +#ifdef USE_CMS + cs->transform = transform; + if (transform != NULL) transform->ref(); + cs->lineTransform = lineTransform; + if (lineTransform != NULL) lineTransform->ref(); +#endif + return cs; +} + +GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr, Gfx *gfx, int recursion) { + GfxICCBasedColorSpace *cs; + Ref iccProfileStreamA; + int nCompsA; + GfxColorSpace *altA; + Dict *dict; + Object obj1, obj2, obj3; + int i; + + if (arr->getLength() < 2) { + error(errSyntaxError, -1, "Bad ICCBased color space"); + return NULL; + } + arr->getNF(1, &obj1); + if (obj1.isRef()) { + iccProfileStreamA = obj1.getRef(); + } else { + iccProfileStreamA.num = 0; + iccProfileStreamA.gen = 0; + } + obj1.free(); +#ifdef USE_CMS + // check cache + if (gfx && iccProfileStreamA.num > 0) { + GfxICCBasedColorSpaceKey k(iccProfileStreamA.num, iccProfileStreamA.gen); + GfxICCBasedColorSpaceItem *item = static_cast(gfx->getIccColorSpaceCache()->lookup(k)); + if (item != NULL) + { + cs = static_cast(item->cs->copy()); + return cs; + } + } +#endif + arr->get(1, &obj1); + if (!obj1.isStream()) { + error(errSyntaxWarning, -1, "Bad ICCBased color space (stream)"); + obj1.free(); + return NULL; + } + dict = obj1.streamGetDict(); + if (!dict->lookup("N", &obj2)->isInt()) { + error(errSyntaxWarning, -1, "Bad ICCBased color space (N)"); + obj2.free(); + obj1.free(); + return NULL; + } + nCompsA = obj2.getInt(); + obj2.free(); + if (nCompsA > 4) { + error(errSyntaxError, -1, + "ICCBased color space with too many ({0:d} > 4) components", + nCompsA); + nCompsA = 4; + } + if (dict->lookup("Alternate", &obj2)->isNull() || + !(altA = GfxColorSpace::parse(&obj2, gfx, recursion + 1))) { + switch (nCompsA) { + case 1: + altA = new GfxDeviceGrayColorSpace(); + break; + case 3: + altA = new GfxDeviceRGBColorSpace(); + break; + case 4: + altA = new GfxDeviceCMYKColorSpace(); + break; + default: + error(errSyntaxWarning, -1, "Bad ICCBased color space - invalid N"); + obj2.free(); + obj1.free(); + return NULL; + } + } + obj2.free(); + cs = new GfxICCBasedColorSpace(nCompsA, altA, &iccProfileStreamA); + if (dict->lookup("Range", &obj2)->isArray() && + obj2.arrayGetLength() == 2 * nCompsA) { + Object obj4; + for (i = 0; i < nCompsA; ++i) { + obj2.arrayGet(2*i, &obj3); + obj2.arrayGet(2*i+1, &obj4); + if (obj3.isNum() && obj4.isNum()) { + cs->rangeMin[i] = obj3.getNum(); + cs->rangeMax[i] = obj4.getNum(); + } + obj3.free(); + obj4.free(); + } + } + obj2.free(); + obj1.free(); + +#ifdef USE_CMS + arr->get(1, &obj1); + dict = obj1.streamGetDict(); + Guchar *profBuf; + Stream *iccStream = obj1.getStream(); + int length = 0; + + profBuf = iccStream->toUnsignedChars(&length, 65536, 65536); + cmsHPROFILE hp = cmsOpenProfileFromMem(profBuf,length); + gfree(profBuf); + if (hp == 0) { + error(errSyntaxWarning, -1, "read ICCBased color space profile error"); + } else { + cmsHPROFILE dhp = displayProfile; + if (dhp == NULL) dhp = RGBProfile; + unsigned int cst = getCMSColorSpaceType(cmsGetColorSpace(hp)); + unsigned int dNChannels = getCMSNChannels(cmsGetColorSpace(dhp)); + unsigned int dcst = getCMSColorSpaceType(cmsGetColorSpace(dhp)); + cmsHTRANSFORM transform; + if ((transform = cmsCreateTransform(hp, + COLORSPACE_SH(cst) |CHANNELS_SH(nCompsA) | BYTES_SH(1), + dhp, + COLORSPACE_SH(dcst) | + CHANNELS_SH(dNChannels) | BYTES_SH(1), + INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create transform"); + cs->transform = NULL; + } else { + cs->transform = new GfxColorTransform(transform); + } + if (dcst == PT_RGB) { + // create line transform only when the display is RGB type color space + if ((transform = cmsCreateTransform(hp, + CHANNELS_SH(nCompsA) | BYTES_SH(1),dhp, + TYPE_RGB_8,INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create transform"); + cs->lineTransform = NULL; + } else { + cs->lineTransform = new GfxColorTransform(transform); + } + } + cmsCloseProfile(hp); + } + obj1.free(); + // put this colorSpace into cache + if (gfx && iccProfileStreamA.num > 0) { + GfxICCBasedColorSpaceKey *k = new GfxICCBasedColorSpaceKey(iccProfileStreamA.num, iccProfileStreamA.gen); + GfxICCBasedColorSpaceItem *item = new GfxICCBasedColorSpaceItem(cs); + gfx->getIccColorSpaceCache()->put(k, item); + } +#endif + return cs; +} + +void GfxICCBasedColorSpace::getGray(GfxColor *color, GfxGray *gray) { +#ifdef USE_CMS + if (transform != 0 && displayPixelType == PT_GRAY) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + transform->doTransform(in,out,1); + *gray = byteToCol(out[0]); + } else { + GfxRGB rgb; + getRGB(color,&rgb); + *gray = clip01((GfxColorComp)(0.3 * rgb.r + + 0.59 * rgb.g + + 0.11 * rgb.b + 0.5)); + } +#else + alt->getGray(color, gray); +#endif +} + +void GfxICCBasedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { +#ifdef USE_CMS + if (transform != 0 + && (displayProfile == NULL || displayPixelType == PT_RGB)) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + transform->doTransform(in,out,1); + rgb->r = byteToCol(out[0]); + rgb->g = byteToCol(out[1]); + rgb->b = byteToCol(out[2]); + } else { + alt->getRGB(color, rgb); + } +#else + alt->getRGB(color, rgb); +#endif +} + +void GfxICCBasedColorSpace::getRGBLine(Guchar *in, unsigned int *out, + int length) { +#ifdef USE_CMS + if (lineTransform != 0) { + Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); + lineTransform->doTransform(in, tmp, length); + for (int i = 0; i < length; ++i) { + Guchar *current = tmp + (i * 3); + out[i] = (current[0] << 16) | (current[1] << 8) | current[2]; + } + gfree(tmp); + } else { + alt->getRGBLine(in, out, length); + } +#else + alt->getRGBLine(in, out, length); +#endif +} + +void GfxICCBasedColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) { +#ifdef USE_CMS + if (lineTransform != 0) { + Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); + lineTransform->doTransform(in, tmp, length); + Guchar *current = tmp; + for (int i = 0; i < length; ++i) { + *out++ = *current++; + *out++ = *current++; + *out++ = *current++; + } + gfree(tmp); + } else { + alt->getRGBLine(in, out, length); + } +#else + alt->getRGBLine(in, out, length); +#endif +} + +void GfxICCBasedColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) { +#ifdef USE_CMS + if (lineTransform != 0) { + Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); + lineTransform->doTransform(in, tmp, length); + Guchar *current = tmp; + for (int i = 0; i < length; ++i) { + *out++ = *current++; + *out++ = *current++; + *out++ = *current++; + *out++ = 255; + } + gfree(tmp); + } else { + alt->getRGBXLine(in, out, length); + } +#else + alt->getRGBXLine(in, out, length); +#endif +} + +void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { +#ifdef USE_CMS + if (transform != NULL && displayPixelType == PT_CMYK) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + transform->doTransform(in,out,1); + cmyk->c = byteToCol(out[0]); + cmyk->m = byteToCol(out[1]); + cmyk->y = byteToCol(out[2]); + cmyk->k = byteToCol(out[3]); + } else { + GfxRGB rgb; + GfxColorComp c, m, y, k; + + getRGB(color,&rgb); + c = clip01(gfxColorComp1 - rgb.r); + m = clip01(gfxColorComp1 - rgb.g); + y = clip01(gfxColorComp1 - rgb.b); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; + } +#else + alt->getCMYK(color, cmyk); +#endif +} + +GBool GfxICCBasedColorSpace::useGetRGBLine() { +#ifdef USE_CMS + return lineTransform != NULL || alt->useGetRGBLine(); +#else + return alt->useGetRGBLine(); +#endif +} + +void GfxICCBasedColorSpace::getDefaultColor(GfxColor *color) { + int i; + + for (i = 0; i < nComps; ++i) { + if (rangeMin[i] > 0) { + color->c[i] = dblToCol(rangeMin[i]); + } else if (rangeMax[i] < 0) { + color->c[i] = dblToCol(rangeMax[i]); + } else { + color->c[i] = 0; + } + } +} + +void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow, + double *decodeRange, + int maxImgPixel) { + alt->getDefaultRanges(decodeLow, decodeRange, maxImgPixel); + +#if 0 + // this is nominally correct, but some PDF files don't set the + // correct ranges in the ICCBased dict + int i; + + for (i = 0; i < nComps; ++i) { + decodeLow[i] = rangeMin[i]; + decodeRange[i] = rangeMax[i] - rangeMin[i]; + } +#endif +} + +//------------------------------------------------------------------------ +// GfxIndexedColorSpace +//------------------------------------------------------------------------ + +GfxIndexedColorSpace::GfxIndexedColorSpace(GfxColorSpace *baseA, + int indexHighA) { + base = baseA; + indexHigh = indexHighA; + lookup = (Guchar *)gmallocn((indexHigh + 1) * base->getNComps(), + sizeof(Guchar)); + overprintMask = base->getOverprintMask(); +} + +GfxIndexedColorSpace::~GfxIndexedColorSpace() { + delete base; + gfree(lookup); +} + +GfxColorSpace *GfxIndexedColorSpace::copy() { + GfxIndexedColorSpace *cs; + + cs = new GfxIndexedColorSpace(base->copy(), indexHigh); + memcpy(cs->lookup, lookup, + (indexHigh + 1) * base->getNComps() * sizeof(Guchar)); + return cs; +} + +GfxColorSpace *GfxIndexedColorSpace::parse(Array *arr, Gfx *gfx, int recursion) { + GfxIndexedColorSpace *cs; + GfxColorSpace *baseA; + int indexHighA; + Object obj1; + char *s; + int n, i, j; + + if (arr->getLength() != 4) { + error(errSyntaxWarning, -1, "Bad Indexed color space"); + goto err1; + } + arr->get(1, &obj1); + if (!(baseA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) { + error(errSyntaxWarning, -1, "Bad Indexed color space (base color space)"); + goto err2; + } + obj1.free(); + if (!arr->get(2, &obj1)->isInt()) { + error(errSyntaxWarning, -1, "Bad Indexed color space (hival)"); + delete baseA; + goto err2; + } + indexHighA = obj1.getInt(); + if (indexHighA < 0 || indexHighA > 255) { + // the PDF spec requires indexHigh to be in [0,255] -- allowing + // values larger than 255 creates a security hole: if nComps * + // indexHigh is greater than 2^31, the loop below may overwrite + // past the end of the array + int previousValue = indexHighA; + if (indexHighA < 0) indexHighA = 0; + else indexHighA = 255; + error(errSyntaxWarning, -1, "Bad Indexed color space (invalid indexHigh value, was {0:d} using {1:d} to try to recover)", previousValue, indexHighA); + } + obj1.free(); + cs = new GfxIndexedColorSpace(baseA, indexHighA); + arr->get(3, &obj1); + n = baseA->getNComps(); + if (obj1.isStream()) { + obj1.streamReset(); + for (i = 0; i <= indexHighA; ++i) { + const int readChars = obj1.streamGetChars(n, &cs->lookup[i*n]); + for (j = readChars; j < n; ++j) { + error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table stream too short) padding with zeroes"); + cs->lookup[i*n + j] = 0; + } + } + obj1.streamClose(); + } else if (obj1.isString()) { + if (obj1.getString()->getLength() < (indexHighA + 1) * n) { + error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table string too short)"); + goto err3; + } + s = obj1.getString()->getCString(); + for (i = 0; i <= indexHighA; ++i) { + for (j = 0; j < n; ++j) { + cs->lookup[i*n + j] = (Guchar)*s++; + } + } + } else { + error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table)"); + goto err3; + } + obj1.free(); + return cs; + + err3: + delete cs; + err2: + obj1.free(); + err1: + return NULL; +} + +GfxColor *GfxIndexedColorSpace::mapColorToBase(GfxColor *color, + GfxColor *baseColor) { + Guchar *p; + double low[gfxColorMaxComps], range[gfxColorMaxComps]; + int n, i; + + n = base->getNComps(); + base->getDefaultRanges(low, range, indexHigh); + const int idx = (int)(colToDbl(color->c[0]) + 0.5) * n; + if (likely(idx + n < (indexHigh + 1) * base->getNComps())) { + p = &lookup[idx]; + for (i = 0; i < n; ++i) { + baseColor->c[i] = dblToCol(low[i] + (p[i] / 255.0) * range[i]); + } + } else { + for (i = 0; i < n; ++i) { + baseColor->c[i] = 0; + } + } + return baseColor; +} + +void GfxIndexedColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxColor color2; + + base->getGray(mapColorToBase(color, &color2), gray); +} + +void GfxIndexedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + GfxColor color2; + + base->getRGB(mapColorToBase(color, &color2), rgb); +} + +void GfxIndexedColorSpace::getRGBLine(Guchar *in, unsigned int *out, int length) { + Guchar *line; + int i, j, n; + + n = base->getNComps(); + line = (Guchar *) gmallocn (length, n); + for (i = 0; i < length; i++) + for (j = 0; j < n; j++) + line[i * n + j] = lookup[in[i] * n + j]; + + base->getRGBLine(line, out, length); + + gfree (line); +} + +void GfxIndexedColorSpace::getRGBLine(Guchar *in, Guchar *out, int length) +{ + Guchar *line; + int i, j, n; + + n = base->getNComps(); + line = (Guchar *) gmallocn (length, n); + for (i = 0; i < length; i++) + for (j = 0; j < n; j++) + line[i * n + j] = lookup[in[i] * n + j]; + + base->getRGBLine(line, out, length); + + gfree (line); +} + +void GfxIndexedColorSpace::getRGBXLine(Guchar *in, Guchar *out, int length) +{ + Guchar *line; + int i, j, n; + + n = base->getNComps(); + line = (Guchar *) gmallocn (length, n); + for (i = 0; i < length; i++) + for (j = 0; j < n; j++) + line[i * n + j] = lookup[in[i] * n + j]; + + base->getRGBXLine(line, out, length); + + gfree (line); +} + +void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColor color2; + + base->getCMYK(mapColorToBase(color, &color2), cmyk); +} + +void GfxIndexedColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; +} + +void GfxIndexedColorSpace::getDefaultRanges(double *decodeLow, + double *decodeRange, + int maxImgPixel) { + decodeLow[0] = 0; + decodeRange[0] = maxImgPixel; +} + +//------------------------------------------------------------------------ +// GfxSeparationColorSpace +//------------------------------------------------------------------------ + +GfxSeparationColorSpace::GfxSeparationColorSpace(GooString *nameA, + GfxColorSpace *altA, + Function *funcA) { + name = nameA; + alt = altA; + func = funcA; + nonMarking = !name->cmp("None"); + if (!name->cmp("Cyan")) { + overprintMask = 0x01; + } else if (!name->cmp("Magenta")) { + overprintMask = 0x02; + } else if (!name->cmp("Yellow")) { + overprintMask = 0x04; + } else if (!name->cmp("Black")) { + overprintMask = 0x08; + } +} + +GfxSeparationColorSpace::GfxSeparationColorSpace(GooString *nameA, + GfxColorSpace *altA, + Function *funcA, + GBool nonMarkingA, + Guint overprintMaskA) { + name = nameA; + alt = altA; + func = funcA; + nonMarking = nonMarkingA; + overprintMask = overprintMaskA; +} + +GfxSeparationColorSpace::~GfxSeparationColorSpace() { + delete name; + delete alt; + delete func; +} + +GfxColorSpace *GfxSeparationColorSpace::copy() { + return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy(), + nonMarking, overprintMask); +} + +//~ handle the 'All' and 'None' colorants +GfxColorSpace *GfxSeparationColorSpace::parse(Array *arr, Gfx *gfx, int recursion) { + GfxSeparationColorSpace *cs; + GooString *nameA; + GfxColorSpace *altA; + Function *funcA; + Object obj1; + + if (arr->getLength() != 4) { + error(errSyntaxWarning, -1, "Bad Separation color space"); + goto err1; + } + if (!arr->get(1, &obj1)->isName()) { + error(errSyntaxWarning, -1, "Bad Separation color space (name)"); + goto err2; + } + nameA = new GooString(obj1.getName()); + obj1.free(); + arr->get(2, &obj1); + if (!(altA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) { + error(errSyntaxWarning, -1, "Bad Separation color space (alternate color space)"); + goto err3; + } + obj1.free(); + arr->get(3, &obj1); + if (!(funcA = Function::parse(&obj1))) { + goto err4; + } + obj1.free(); + cs = new GfxSeparationColorSpace(nameA, altA, funcA); + return cs; + + err4: + delete altA; + err3: + delete nameA; + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxSeparationColorSpace::getGray(GfxColor *color, GfxGray *gray) { + double x; + double c[gfxColorMaxComps]; + GfxColor color2; + int i; + + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getGray(&color2, gray); +} + +void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double x; + double c[gfxColorMaxComps]; + GfxColor color2; + int i; + + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getRGB(&color2, rgb); +} + +void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + double x; + double c[gfxColorMaxComps]; + GfxColor color2; + int i; + + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getCMYK(&color2, cmyk); +} + +void GfxSeparationColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = gfxColorComp1; +} + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, + GooString **namesA, + GfxColorSpace *altA, + Function *funcA) { + int i; + + nComps = nCompsA; + alt = altA; + func = funcA; + nonMarking = gTrue; + overprintMask = 0; + for (i = 0; i < nComps; ++i) { + names[i] = namesA[i]; + if (names[i]->cmp("None")) { + nonMarking = gFalse; + } + if (!names[i]->cmp("Cyan")) { + overprintMask |= 0x01; + } else if (!names[i]->cmp("Magenta")) { + overprintMask |= 0x02; + } else if (!names[i]->cmp("Yellow")) { + overprintMask |= 0x04; + } else if (!names[i]->cmp("Black")) { + overprintMask |= 0x08; + } else { + overprintMask = 0x0f; + } + } +} + +GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, + GooString **namesA, + GfxColorSpace *altA, + Function *funcA, + GBool nonMarkingA, + Guint overprintMaskA) { + int i; + + nComps = nCompsA; + alt = altA; + func = funcA; + nonMarking = nonMarkingA; + overprintMask = overprintMaskA; + for (i = 0; i < nComps; ++i) { + names[i] = namesA[i]->copy(); + } +} + +GfxDeviceNColorSpace::~GfxDeviceNColorSpace() { + int i; + + for (i = 0; i < nComps; ++i) { + delete names[i]; + } + delete alt; + delete func; +} + +GfxColorSpace *GfxDeviceNColorSpace::copy() { + return new GfxDeviceNColorSpace(nComps, names, alt->copy(), func->copy(), + nonMarking, overprintMask); +} + +//~ handle the 'None' colorant +GfxColorSpace *GfxDeviceNColorSpace::parse(Array *arr, Gfx *gfx, int recursion) { + GfxDeviceNColorSpace *cs; + int nCompsA; + GooString *namesA[gfxColorMaxComps]; + GfxColorSpace *altA; + Function *funcA; + Object obj1, obj2; + int i; + + if (arr->getLength() != 4 && arr->getLength() != 5) { + error(errSyntaxWarning, -1, "Bad DeviceN color space"); + goto err1; + } + if (!arr->get(1, &obj1)->isArray()) { + error(errSyntaxWarning, -1, "Bad DeviceN color space (names)"); + goto err2; + } + nCompsA = obj1.arrayGetLength(); + if (nCompsA > gfxColorMaxComps) { + error(errSyntaxWarning, -1, "DeviceN color space with too many ({0:d} > {1:d}) components", + nCompsA, gfxColorMaxComps); + nCompsA = gfxColorMaxComps; + } + for (i = 0; i < nCompsA; ++i) { + if (!obj1.arrayGet(i, &obj2)->isName()) { + error(errSyntaxWarning, -1, "Bad DeviceN color space (names)"); + obj2.free(); + goto err2; + } + namesA[i] = new GooString(obj2.getName()); + obj2.free(); + } + obj1.free(); + arr->get(2, &obj1); + if (!(altA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) { + error(errSyntaxWarning, -1, "Bad DeviceN color space (alternate color space)"); + goto err3; + } + obj1.free(); + arr->get(3, &obj1); + if (!(funcA = Function::parse(&obj1))) { + goto err4; + } + obj1.free(); + cs = new GfxDeviceNColorSpace(nCompsA, namesA, altA, funcA); + return cs; + + err4: + delete altA; + err3: + for (i = 0; i < nCompsA; ++i) { + delete namesA[i]; + } + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxDeviceNColorSpace::getGray(GfxColor *color, GfxGray *gray) { + double x[gfxColorMaxComps], c[gfxColorMaxComps]; + GfxColor color2; + int i; + + for (i = 0; i < nComps; ++i) { + x[i] = colToDbl(color->c[i]); + } + func->transform(x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getGray(&color2, gray); +} + +void GfxDeviceNColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double x[gfxColorMaxComps], c[gfxColorMaxComps]; + GfxColor color2; + int i; + + for (i = 0; i < nComps; ++i) { + x[i] = colToDbl(color->c[i]); + } + func->transform(x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getRGB(&color2, rgb); +} + +void GfxDeviceNColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + double x[gfxColorMaxComps], c[gfxColorMaxComps]; + GfxColor color2; + int i; + + for (i = 0; i < nComps; ++i) { + x[i] = colToDbl(color->c[i]); + } + func->transform(x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getCMYK(&color2, cmyk); +} + +void GfxDeviceNColorSpace::getDefaultColor(GfxColor *color) { + int i; + + for (i = 0; i < nComps; ++i) { + color->c[i] = gfxColorComp1; + } +} + +//------------------------------------------------------------------------ +// GfxPatternColorSpace +//------------------------------------------------------------------------ + +GfxPatternColorSpace::GfxPatternColorSpace(GfxColorSpace *underA) { + under = underA; +} + +GfxPatternColorSpace::~GfxPatternColorSpace() { + if (under) { + delete under; + } +} + +GfxColorSpace *GfxPatternColorSpace::copy() { + return new GfxPatternColorSpace(under ? under->copy() : + (GfxColorSpace *)NULL); +} + +GfxColorSpace *GfxPatternColorSpace::parse(Array *arr, Gfx *gfx, int recursion) { + GfxPatternColorSpace *cs; + GfxColorSpace *underA; + Object obj1; + + if (arr->getLength() != 1 && arr->getLength() != 2) { + error(errSyntaxWarning, -1, "Bad Pattern color space"); + return NULL; + } + underA = NULL; + if (arr->getLength() == 2) { + arr->get(1, &obj1); + if (!(underA = GfxColorSpace::parse(&obj1, gfx, recursion + 1))) { + error(errSyntaxWarning, -1, "Bad Pattern color space (underlying color space)"); + obj1.free(); + return NULL; + } + obj1.free(); + } + cs = new GfxPatternColorSpace(underA); + return cs; +} + +void GfxPatternColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = 0; +} + +void GfxPatternColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = 0; +} + +void GfxPatternColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = 1; +} + +void GfxPatternColorSpace::getDefaultColor(GfxColor *color) { + color->c[0]=0; +} + +//------------------------------------------------------------------------ +// Pattern +//------------------------------------------------------------------------ + +GfxPattern::GfxPattern(int typeA) { + type = typeA; +} + +GfxPattern::~GfxPattern() { +} + +GfxPattern *GfxPattern::parse(Object *obj, Gfx *gfx) { + GfxPattern *pattern; + Object obj1; + + if (obj->isDict()) { + obj->dictLookup("PatternType", &obj1); + } else if (obj->isStream()) { + obj->streamGetDict()->lookup("PatternType", &obj1); + } else { + return NULL; + } + pattern = NULL; + if (obj1.isInt() && obj1.getInt() == 1) { + pattern = GfxTilingPattern::parse(obj); + } else if (obj1.isInt() && obj1.getInt() == 2) { + pattern = GfxShadingPattern::parse(obj, gfx); + } + obj1.free(); + return pattern; +} + +//------------------------------------------------------------------------ +// GfxTilingPattern +//------------------------------------------------------------------------ + +GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) { + GfxTilingPattern *pat; + Dict *dict; + int paintTypeA, tilingTypeA; + double bboxA[4], matrixA[6]; + double xStepA, yStepA; + Object resDictA; + Object obj1, obj2; + int i; + + if (!patObj->isStream()) { + return NULL; + } + dict = patObj->streamGetDict(); + + if (dict->lookup("PaintType", &obj1)->isInt()) { + paintTypeA = obj1.getInt(); + } else { + paintTypeA = 1; + error(errSyntaxWarning, -1, "Invalid or missing PaintType in pattern"); + } + obj1.free(); + if (dict->lookup("TilingType", &obj1)->isInt()) { + tilingTypeA = obj1.getInt(); + } else { + tilingTypeA = 1; + error(errSyntaxWarning, -1, "Invalid or missing TilingType in pattern"); + } + obj1.free(); + bboxA[0] = bboxA[1] = 0; + bboxA[2] = bboxA[3] = 1; + if (dict->lookup("BBox", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + for (i = 0; i < 4; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + bboxA[i] = obj2.getNum(); + } + obj2.free(); + } + } else { + error(errSyntaxWarning, -1, "Invalid or missing BBox in pattern"); + } + obj1.free(); + if (dict->lookup("XStep", &obj1)->isNum()) { + xStepA = obj1.getNum(); + } else { + xStepA = 1; + error(errSyntaxWarning, -1, "Invalid or missing XStep in pattern"); + } + obj1.free(); + if (dict->lookup("YStep", &obj1)->isNum()) { + yStepA = obj1.getNum(); + } else { + yStepA = 1; + error(errSyntaxWarning, -1, "Invalid or missing YStep in pattern"); + } + obj1.free(); + if (!dict->lookup("Resources", &resDictA)->isDict()) { + resDictA.free(); + resDictA.initNull(); + error(errSyntaxWarning, -1, "Invalid or missing Resources in pattern"); + } + matrixA[0] = 1; matrixA[1] = 0; + matrixA[2] = 0; matrixA[3] = 1; + matrixA[4] = 0; matrixA[5] = 0; + if (dict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + for (i = 0; i < 6; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + matrixA[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + + pat = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA, + &resDictA, matrixA, patObj); + resDictA.free(); + return pat; +} + +GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA, + double *bboxA, double xStepA, double yStepA, + Object *resDictA, double *matrixA, + Object *contentStreamA): + GfxPattern(1) +{ + int i; + + paintType = paintTypeA; + tilingType = tilingTypeA; + for (i = 0; i < 4; ++i) { + bbox[i] = bboxA[i]; + } + xStep = xStepA; + yStep = yStepA; + resDictA->copy(&resDict); + for (i = 0; i < 6; ++i) { + matrix[i] = matrixA[i]; + } + contentStreamA->copy(&contentStream); +} + +GfxTilingPattern::~GfxTilingPattern() { + resDict.free(); + contentStream.free(); +} + +GfxPattern *GfxTilingPattern::copy() { + return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep, + &resDict, matrix, &contentStream); +} + +//------------------------------------------------------------------------ +// GfxShadingPattern +//------------------------------------------------------------------------ + +GfxShadingPattern *GfxShadingPattern::parse(Object *patObj, Gfx *gfx) { + Dict *dict; + GfxShading *shadingA; + double matrixA[6]; + Object obj1, obj2; + int i; + + if (!patObj->isDict()) { + return NULL; + } + dict = patObj->getDict(); + + dict->lookup("Shading", &obj1); + shadingA = GfxShading::parse(&obj1, gfx); + obj1.free(); + if (!shadingA) { + return NULL; + } + + matrixA[0] = 1; matrixA[1] = 0; + matrixA[2] = 0; matrixA[3] = 1; + matrixA[4] = 0; matrixA[5] = 0; + if (dict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + for (i = 0; i < 6; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + matrixA[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + + return new GfxShadingPattern(shadingA, matrixA); +} + +GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA): + GfxPattern(2) +{ + int i; + + shading = shadingA; + for (i = 0; i < 6; ++i) { + matrix[i] = matrixA[i]; + } +} + +GfxShadingPattern::~GfxShadingPattern() { + delete shading; +} + +GfxPattern *GfxShadingPattern::copy() { + return new GfxShadingPattern(shading->copy(), matrix); +} + +//------------------------------------------------------------------------ +// GfxShading +//------------------------------------------------------------------------ + +GfxShading::GfxShading(int typeA) { + type = typeA; + colorSpace = NULL; +} + +GfxShading::GfxShading(GfxShading *shading) { + int i; + + type = shading->type; + colorSpace = shading->colorSpace->copy(); + for (i = 0; i < gfxColorMaxComps; ++i) { + background.c[i] = shading->background.c[i]; + } + hasBackground = shading->hasBackground; + xMin = shading->xMin; + yMin = shading->yMin; + xMax = shading->xMax; + yMax = shading->yMax; + hasBBox = shading->hasBBox; +} + +GfxShading::~GfxShading() { + if (colorSpace) { + delete colorSpace; + } +} + +GfxShading *GfxShading::parse(Object *obj, Gfx *gfx) { + GfxShading *shading; + Dict *dict; + int typeA; + Object obj1; + + if (obj->isDict()) { + dict = obj->getDict(); + } else if (obj->isStream()) { + dict = obj->streamGetDict(); + } else { + return NULL; + } + + if (!dict->lookup("ShadingType", &obj1)->isInt()) { + error(errSyntaxWarning, -1, "Invalid ShadingType in shading dictionary"); + obj1.free(); + return NULL; + } + typeA = obj1.getInt(); + obj1.free(); + + switch (typeA) { + case 1: + shading = GfxFunctionShading::parse(dict, gfx); + break; + case 2: + shading = GfxAxialShading::parse(dict, gfx); + break; + case 3: + shading = GfxRadialShading::parse(dict, gfx); + break; + case 4: + if (obj->isStream()) { + shading = GfxGouraudTriangleShading::parse(4, dict, obj->getStream(), gfx); + } else { + error(errSyntaxWarning, -1, "Invalid Type 4 shading object"); + goto err1; + } + break; + case 5: + if (obj->isStream()) { + shading = GfxGouraudTriangleShading::parse(5, dict, obj->getStream(), gfx); + } else { + error(errSyntaxWarning, -1, "Invalid Type 5 shading object"); + goto err1; + } + break; + case 6: + if (obj->isStream()) { + shading = GfxPatchMeshShading::parse(6, dict, obj->getStream(), gfx); + } else { + error(errSyntaxWarning, -1, "Invalid Type 6 shading object"); + goto err1; + } + break; + case 7: + if (obj->isStream()) { + shading = GfxPatchMeshShading::parse(7, dict, obj->getStream(), gfx); + } else { + error(errSyntaxWarning, -1, "Invalid Type 7 shading object"); + goto err1; + } + break; + default: + error(errSyntaxWarning, -1, "Unimplemented shading type {0:d}", typeA); + goto err1; + } + + return shading; + + err1: + return NULL; +} + +GBool GfxShading::init(Dict *dict, Gfx *gfx) { + Object obj1, obj2; + int i; + + dict->lookup("ColorSpace", &obj1); + if (!(colorSpace = GfxColorSpace::parse(&obj1, gfx))) { + error(errSyntaxWarning, -1, "Bad color space in shading dictionary"); + obj1.free(); + return gFalse; + } + obj1.free(); + + for (i = 0; i < gfxColorMaxComps; ++i) { + background.c[i] = 0; + } + hasBackground = gFalse; + if (dict->lookup("Background", &obj1)->isArray()) { + if (obj1.arrayGetLength() == colorSpace->getNComps()) { + hasBackground = gTrue; + for (i = 0; i < colorSpace->getNComps(); ++i) { + background.c[i] = dblToCol(obj1.arrayGet(i, &obj2)->getNum()); + obj2.free(); + } + } else { + error(errSyntaxWarning, -1, "Bad Background in shading dictionary"); + } + } + obj1.free(); + + xMin = yMin = xMax = yMax = 0; + hasBBox = gFalse; + if (dict->lookup("BBox", &obj1)->isArray()) { + if (obj1.arrayGetLength() == 4) { + Object obj3, obj4, obj5; + obj1.arrayGet(0, &obj2); + obj1.arrayGet(1, &obj3); + obj1.arrayGet(2, &obj4); + obj1.arrayGet(3, &obj5); + if (obj2.isNum() && obj3.isNum() && obj4.isNum() && obj5.isNum()) + { + hasBBox = gTrue; + xMin = obj2.getNum(); + yMin = obj3.getNum(); + xMax = obj4.getNum(); + yMax = obj5.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad BBox in shading dictionary (Values not numbers)"); + } + obj2.free(); + obj3.free(); + obj4.free(); + obj5.free(); + } else { + error(errSyntaxWarning, -1, "Bad BBox in shading dictionary"); + } + } + obj1.free(); + + return gTrue; +} + +//------------------------------------------------------------------------ +// GfxFunctionShading +//------------------------------------------------------------------------ + +GfxFunctionShading::GfxFunctionShading(double x0A, double y0A, + double x1A, double y1A, + double *matrixA, + Function **funcsA, int nFuncsA): + GfxShading(1) +{ + int i; + + x0 = x0A; + y0 = y0A; + x1 = x1A; + y1 = y1A; + for (i = 0; i < 6; ++i) { + matrix[i] = matrixA[i]; + } + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } +} + +GfxFunctionShading::GfxFunctionShading(GfxFunctionShading *shading): + GfxShading(shading) +{ + int i; + + x0 = shading->x0; + y0 = shading->y0; + x1 = shading->x1; + y1 = shading->y1; + for (i = 0; i < 6; ++i) { + matrix[i] = shading->matrix[i]; + } + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } +} + +GfxFunctionShading::~GfxFunctionShading() { + int i; + + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxFunctionShading *GfxFunctionShading::parse(Dict *dict, Gfx *gfx) { + GfxFunctionShading *shading; + double x0A, y0A, x1A, y1A; + double matrixA[6]; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + Object obj1, obj2; + int i; + + x0A = y0A = 0; + x1A = y1A = 1; + if (dict->lookup("Domain", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + x0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + x1A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + y0A = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + y1A = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + matrixA[0] = 1; matrixA[1] = 0; + matrixA[2] = 0; matrixA[3] = 1; + matrixA[4] = 0; matrixA[5] = 0; + if (dict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + matrixA[0] = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + matrixA[1] = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + matrixA[2] = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + matrixA[3] = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + matrixA[4] = obj1.arrayGet(4, &obj2)->getNum(); + obj2.free(); + matrixA[5] = obj1.arrayGet(5, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + dict->lookup("Function", &obj1); + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + goto err2; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + goto err1; + } + } + obj1.free(); + + shading = new GfxFunctionShading(x0A, y0A, x1A, y1A, matrixA, + funcsA, nFuncsA); + if (!shading->init(dict, gfx)) { + delete shading; + return NULL; + } + return shading; + + err2: + obj2.free(); + err1: + obj1.free(); + return NULL; +} + +GfxShading *GfxFunctionShading::copy() { + return new GfxFunctionShading(this); +} + +void GfxFunctionShading::getColor(double x, double y, GfxColor *color) { + double in[2], out[gfxColorMaxComps]; + int i; + + // NB: there can be one function with n outputs or n functions with + // one output each (where n = number of color components) + for (i = 0; i < gfxColorMaxComps; ++i) { + out[i] = 0; + } + in[0] = x; + in[1] = y; + for (i = 0; i < nFuncs; ++i) { + funcs[i]->transform(in, &out[i]); + } + for (i = 0; i < gfxColorMaxComps; ++i) { + color->c[i] = dblToCol(out[i]); + } +} + +//------------------------------------------------------------------------ +// GfxUnivariateShading +//------------------------------------------------------------------------ + +GfxUnivariateShading::GfxUnivariateShading(int typeA, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A): + GfxShading(typeA) +{ + int i; + + t0 = t0A; + t1 = t1A; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } + extend0 = extend0A; + extend1 = extend1A; + + cacheSize = 0; + lastMatch = 0; + cacheBounds = NULL; + cacheCoeff = NULL; + cacheValues = NULL; +} + +GfxUnivariateShading::GfxUnivariateShading(GfxUnivariateShading *shading): + GfxShading(shading) +{ + int i; + + t0 = shading->t0; + t1 = shading->t1; + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } + extend0 = shading->extend0; + extend1 = shading->extend1; + + cacheSize = 0; + lastMatch = 0; + cacheBounds = NULL; + cacheCoeff = NULL; + cacheValues = NULL; +} + +GfxUnivariateShading::~GfxUnivariateShading() { + int i; + + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } + + gfree (cacheBounds); +} + +void GfxUnivariateShading::getColor(double t, GfxColor *color) { + double out[gfxColorMaxComps]; + int i, nComps; + + // NB: there can be one function with n outputs or n functions with + // one output each (where n = number of color components) + nComps = nFuncs * funcs[0]->getOutputSize(); + + if (cacheSize > 0) { + double x, ix, *l, *u, *upper; + + if (cacheBounds[lastMatch - 1] >= t) { + upper = std::lower_bound (cacheBounds, cacheBounds + lastMatch - 1, t); + lastMatch = upper - cacheBounds; + lastMatch = std::min(std::max(1, lastMatch), cacheSize - 1); + } else if (cacheBounds[lastMatch] < t) { + upper = std::lower_bound (cacheBounds + lastMatch + 1, cacheBounds + cacheSize, t); + lastMatch = upper - cacheBounds; + lastMatch = std::min(std::max(1, lastMatch), cacheSize - 1); + } + + x = (t - cacheBounds[lastMatch-1]) * cacheCoeff[lastMatch]; + ix = 1.0 - x; + u = cacheValues + lastMatch * nComps; + l = u - nComps; + + for (i = 0; i < nComps; ++i) { + out[i] = ix * l[i] + x * u[i]; + } + } else { + for (i = 0; i < nComps; ++i) { + out[i] = 0; + } + for (i = 0; i < nFuncs; ++i) { + funcs[i]->transform(&t, &out[i]); + } + } + + for (i = 0; i < nComps; ++i) { + color->c[i] = dblToCol(out[i]); + } +} + +void GfxUnivariateShading::setupCache(const Matrix *ctm, + double xMin, double yMin, + double xMax, double yMax) { + double sMin, sMax, tMin, tMax, upperBound; + int i, j, nComps, maxSize; + + gfree (cacheBounds); + cacheBounds = NULL; + cacheSize = 0; + + // NB: there can be one function with n outputs or n functions with + // one output each (where n = number of color components) + nComps = nFuncs * funcs[0]->getOutputSize(); + + getParameterRange(&sMin, &sMax, xMin, yMin, xMax, yMax); + upperBound = ctm->norm() * getDistance(sMin, sMax); + maxSize = ceil(upperBound); + maxSize = std::max(maxSize, 2); + + { + double x[4], y[4]; + + ctm->transform(xMin, yMin, &x[0], &y[0]); + ctm->transform(xMax, yMin, &x[1], &y[1]); + ctm->transform(xMin, yMax, &x[2], &y[2]); + ctm->transform(xMax, yMax, &x[3], &y[3]); + + xMin = xMax = x[0]; + yMin = yMax = y[0]; + for (i = 1; i < 4; i++) { + xMin = std::min(xMin, x[i]); + yMin = std::min(yMin, y[i]); + xMax = std::max(xMax, x[i]); + yMax = std::max(yMax, y[i]); + } + } + + if (maxSize > (xMax-xMin) * (yMax-yMin)) { + return; + } + + if (t0 < t1) { + tMin = t0 + sMin * (t1 - t0); + tMax = t0 + sMax * (t1 - t0); + } else { + tMin = t0 + sMax * (t1 - t0); + tMax = t0 + sMin * (t1 - t0); + } + + cacheBounds = (double *)gmallocn(maxSize, sizeof(double) * (nComps + 2)); + cacheCoeff = cacheBounds + maxSize; + cacheValues = cacheCoeff + maxSize; + + if (cacheSize != 0) { + for (j = 0; j < cacheSize; ++j) { + cacheCoeff[j] = 1 / (cacheBounds[j+1] - cacheBounds[j]); + } + } else if (tMax != tMin) { + double step = (tMax - tMin) / (maxSize - 1); + double coeff = (maxSize - 1) / (tMax - tMin); + + cacheSize = maxSize; + + for (j = 0; j < cacheSize; ++j) { + cacheBounds[j] = tMin + j * step; + cacheCoeff[j] = coeff; + + for (i = 0; i < nComps; ++i) { + cacheValues[j*nComps + i] = 0; + } + for (i = 0; i < nFuncs; ++i) { + funcs[i]->transform(&cacheBounds[j], &cacheValues[j*nComps + i]); + } + } + } + + lastMatch = 1; +} + + +//------------------------------------------------------------------------ +// GfxAxialShading +//------------------------------------------------------------------------ + +GfxAxialShading::GfxAxialShading(double x0A, double y0A, + double x1A, double y1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A): + GfxUnivariateShading(2, t0A, t1A, funcsA, nFuncsA, extend0A, extend1A) +{ + x0 = x0A; + y0 = y0A; + x1 = x1A; + y1 = y1A; +} + +GfxAxialShading::GfxAxialShading(GfxAxialShading *shading): + GfxUnivariateShading(shading) +{ + x0 = shading->x0; + y0 = shading->y0; + x1 = shading->x1; + y1 = shading->y1; +} + +GfxAxialShading::~GfxAxialShading() { +} + +GfxAxialShading *GfxAxialShading::parse(Dict *dict, Gfx *gfx) { + GfxAxialShading *shading; + double x0A, y0A, x1A, y1A; + double t0A, t1A; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + GBool extend0A, extend1A; + Object obj1, obj2; + int i; + + x0A = y0A = x1A = y1A = 0; + if (dict->lookup("Coords", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + Object obj3, obj4, obj5; + obj1.arrayGet(0, &obj2); + obj1.arrayGet(1, &obj3); + obj1.arrayGet(2, &obj4); + obj1.arrayGet(3, &obj5); + if (obj2.isNum() && obj3.isNum() && obj4.isNum() && obj5.isNum()) { + x0A = obj2.getNum(); + y0A = obj3.getNum(); + x1A = obj4.getNum(); + y1A = obj5.getNum(); + } + obj2.free(); + obj3.free(); + obj4.free(); + obj5.free(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid Coords in shading dictionary"); + goto err1; + } + obj1.free(); + + t0A = 0; + t1A = 1; + if (dict->lookup("Domain", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + Object obj3; + obj1.arrayGet(0, &obj2); + obj1.arrayGet(1, &obj3); + if (obj2.isNum() && obj3.isNum()) { + t0A = obj2.getNum(); + t1A = obj3.getNum(); + } + obj2.free(); + obj3.free(); + } + obj1.free(); + + dict->lookup("Function", &obj1); + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + obj1.free(); + + extend0A = extend1A = gFalse; + if (dict->lookup("Extend", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + extend0A = obj1.arrayGet(0, &obj2)->getBool(); + obj2.free(); + extend1A = obj1.arrayGet(1, &obj2)->getBool(); + obj2.free(); + } + obj1.free(); + + shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A, + funcsA, nFuncsA, extend0A, extend1A); + if (!shading->init(dict, gfx)) { + delete shading; + return NULL; + } + return shading; + + err1: + return NULL; +} + +GfxShading *GfxAxialShading::copy() { + return new GfxAxialShading(this); +} + +double GfxAxialShading::getDistance(double sMin, double sMax) { + double xMin, yMin, xMax, yMax; + + xMin = x0 + sMin * (x1 - x0); + yMin = y0 + sMin * (y1 - y0); + xMax = x0 + sMax * (x1 - x0); + yMax = y0 + sMax * (y1 - y0); + + return hypot(xMax-xMin, yMax-yMin); +} + +void GfxAxialShading::getParameterRange(double *lower, double *upper, + double xMin, double yMin, + double xMax, double yMax) { + double pdx, pdy, invsqnorm, tdx, tdy, t, range[2]; + + // Linear gradients are orthogonal to the line passing through their + // extremes. Because of convexity, the parameter range can be + // computed as the convex hull (one the real line) of the parameter + // values of the 4 corners of the box. + // + // The parameter value t for a point (x,y) can be computed as: + // + // t = (p2 - p1) . (x,y) / |p2 - p1|^2 + // + // t0 is the t value for the top left corner + // tdx is the difference between left and right corners + // tdy is the difference between top and bottom corners + + pdx = x1 - x0; + pdy = y1 - y0; + invsqnorm = 1.0 / (pdx * pdx + pdy * pdy); + pdx *= invsqnorm; + pdy *= invsqnorm; + + t = (xMin - x0) * pdx + (yMin - y0) * pdy; + tdx = (xMax - xMin) * pdx; + tdy = (yMax - yMin) * pdy; + + // Because of the linearity of the t value, tdx can simply be added + // the t0 to move along the top edge. After this, *lower and *upper + // represent the parameter range for the top edge, so extending it + // to include the whole box simply requires adding tdy to the + // correct extreme. + + range[0] = range[1] = t; + if (tdx < 0) + range[0] += tdx; + else + range[1] += tdx; + + if (tdy < 0) + range[0] += tdy; + else + range[1] += tdy; + + *lower = std::max(0., std::min(1., range[0])); + *upper = std::max(0., std::min(1., range[1])); +} + +//------------------------------------------------------------------------ +// GfxRadialShading +//------------------------------------------------------------------------ + +#ifndef RADIAL_EPSILON +#define RADIAL_EPSILON (1. / 1024 / 1024) +#endif + +GfxRadialShading::GfxRadialShading(double x0A, double y0A, double r0A, + double x1A, double y1A, double r1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A): + GfxUnivariateShading(3, t0A, t1A, funcsA, nFuncsA, extend0A, extend1A) +{ + x0 = x0A; + y0 = y0A; + r0 = r0A; + x1 = x1A; + y1 = y1A; + r1 = r1A; +} + +GfxRadialShading::GfxRadialShading(GfxRadialShading *shading): + GfxUnivariateShading(shading) +{ + x0 = shading->x0; + y0 = shading->y0; + r0 = shading->r0; + x1 = shading->x1; + y1 = shading->y1; + r1 = shading->r1; +} + +GfxRadialShading::~GfxRadialShading() { +} + +GfxRadialShading *GfxRadialShading::parse(Dict *dict, Gfx *gfx) { + GfxRadialShading *shading; + double x0A, y0A, r0A, x1A, y1A, r1A; + double t0A, t1A; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + GBool extend0A, extend1A; + Object obj1, obj2; + int i; + + x0A = y0A = r0A = x1A = y1A = r1A = 0; + if (dict->lookup("Coords", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + x0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + y0A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + r0A = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + x1A = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + y1A = obj1.arrayGet(4, &obj2)->getNum(); + obj2.free(); + r1A = obj1.arrayGet(5, &obj2)->getNum(); + obj2.free(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid Coords in shading dictionary"); + goto err1; + } + obj1.free(); + + t0A = 0; + t1A = 1; + if (dict->lookup("Domain", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + t0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + t1A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + dict->lookup("Function", &obj1); + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + obj1.free(); + + extend0A = extend1A = gFalse; + if (dict->lookup("Extend", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + extend0A = obj1.arrayGet(0, &obj2)->getBool(); + obj2.free(); + extend1A = obj1.arrayGet(1, &obj2)->getBool(); + obj2.free(); + } + obj1.free(); + + shading = new GfxRadialShading(x0A, y0A, r0A, x1A, y1A, r1A, t0A, t1A, + funcsA, nFuncsA, extend0A, extend1A); + if (!shading->init(dict, gfx)) { + delete shading; + return NULL; + } + return shading; + + err1: + return NULL; +} + +GfxShading *GfxRadialShading::copy() { + return new GfxRadialShading(this); +} + +double GfxRadialShading::getDistance(double sMin, double sMax) { + double xMin, yMin, rMin, xMax, yMax, rMax; + + xMin = x0 + sMin * (x1 - x0); + yMin = y0 + sMin * (y1 - y0); + rMin = r0 + sMin * (r1 - r0); + + xMax = x0 + sMax * (x1 - x0); + yMax = y0 + sMax * (y1 - y0); + rMax = r0 + sMax * (r1 - r0); + + return hypot(xMax-xMin, yMax-yMin) + fabs(rMax-rMin); +} + +// extend range, adapted from cairo, radialExtendRange +static GBool +radialExtendRange (double range[2], double value, GBool valid) +{ + if (!valid) + range[0] = range[1] = value; + else if (value < range[0]) + range[0] = value; + else if (value > range[1]) + range[1] = value; + + return gTrue; +} + +inline void radialEdge(double num, double den, double delta, double lower, double upper, + double dr, double mindr, GBool &valid, double *range) +{ + if (fabs (den) >= RADIAL_EPSILON) { + double t_edge, v; + t_edge = (num) / (den); + v = t_edge * (delta); + if (t_edge * dr >= mindr && (lower) <= v && v <= (upper)) + valid = radialExtendRange (range, t_edge, valid); + } +} + +inline void radialCorner1(double x, double y, double &b, double dx, double dy, double cr, + double dr, double mindr, GBool &valid, double *range) +{ + b = (x) * dx + (y) * dy + cr * dr; + if (fabs (b) >= RADIAL_EPSILON) { + double t_corner; + double x2 = (x) * (x); + double y2 = (y) * (y); + double cr2 = (cr) * (cr); + double c = x2 + y2 - cr2; + + t_corner = 0.5 * c / b; + if (t_corner * dr >= mindr) + valid = radialExtendRange (range, t_corner, valid); + } +} + +inline void radialCorner2(double x, double y, double a, double &b, double &c, double &d, double dx, double dy, double cr, + double inva, double dr, double mindr, GBool &valid, double *range) +{ + b = (x) * dx + (y) * dy + cr * dr; + c = (x) * (x) + (y) * (y) - cr * cr; + d = b * b - a * c; + if (d >= 0) { + double t_corner; + + d = sqrt (d); + t_corner = (b + d) * inva; + if (t_corner * dr >= mindr) + valid = radialExtendRange (range, t_corner, valid); + t_corner = (b - d) * inva; + if (t_corner * dr >= mindr) + valid = radialExtendRange (range, t_corner, valid); + } +} +void GfxRadialShading::getParameterRange(double *lower, double *upper, + double xMin, double yMin, + double xMax, double yMax) { + double cx, cy, cr, dx, dy, dr; + double a, x_focus, y_focus; + double mindr, minx, miny, maxx, maxy; + double range[2]; + GBool valid; + + // A radial pattern is considered degenerate if it can be + // represented as a solid or clear pattern. This corresponds to one + // of the two cases: + // + // 1) The radii are both very small: + // |dr| < FLT_EPSILON && min (r0, r1) < FLT_EPSILON + // + // 2) The two circles have about the same radius and are very + // close to each other (approximately a cylinder gradient that + // doesn't move with the parameter): + // |dr| < FLT_EPSILON && max (|dx|, |dy|) < 2 * FLT_EPSILON + + if (xMin >= xMax || yMin >=yMax || + (fabs (r0 - r1) < RADIAL_EPSILON && + (std::min(r0, r1) < RADIAL_EPSILON || + std::max(fabs (x0 - x1), fabs (y0 - y1)) < 2 * RADIAL_EPSILON))) { + *lower = *upper = 0; + return; + } + + range[0] = range[1] = 0; + valid = gFalse; + + x_focus = y_focus = 0; // silence gcc + + cx = x0; + cy = y0; + cr = r0; + dx = x1 - cx; + dy = y1 - cy; + dr = r1 - cr; + + // translate by -(cx, cy) to simplify computations + xMin -= cx; + yMin -= cy; + xMax -= cx; + yMax -= cy; + + // enlarge boundaries slightly to avoid rounding problems in the + // parameter range computation + xMin -= RADIAL_EPSILON; + yMin -= RADIAL_EPSILON; + xMax += RADIAL_EPSILON; + yMax += RADIAL_EPSILON; + + // enlarge boundaries even more to avoid rounding problems when + // testing if a point belongs to the box + minx = xMin - RADIAL_EPSILON; + miny = yMin - RADIAL_EPSILON; + maxx = xMax + RADIAL_EPSILON; + maxy = yMax + RADIAL_EPSILON; + + // we dont' allow negative radiuses, so we will be checking that + // t*dr >= mindr to consider t valid + mindr = -(cr + RADIAL_EPSILON); + + // After the previous transformations, the start circle is centered + // in the origin and has radius cr. A 1-unit change in the t + // parameter corresponds to dx,dy,dr changes in the x,y,r of the + // circle (center coordinates, radius). + // + // To compute the minimum range needed to correctly draw the + // pattern, we start with an empty range and extend it to include + // the circles touching the bounding box or within it. + + // Focus, the point where the circle has radius == 0. + // + // r = cr + t * dr = 0 + // t = -cr / dr + // + // If the radius is constant (dr == 0) there is no focus (the + // gradient represents a cylinder instead of a cone). + if (fabs (dr) >= RADIAL_EPSILON) { + double t_focus; + + t_focus = -cr / dr; + x_focus = t_focus * dx; + y_focus = t_focus * dy; + if (minx <= x_focus && x_focus <= maxx && + miny <= y_focus && y_focus <= maxy) + { + valid = radialExtendRange (range, t_focus, valid); + } + } + + // Circles externally tangent to box edges. + // + // All circles have center in (dx, dy) * t + // + // If the circle is tangent to the line defined by the edge of the + // box, then at least one of the following holds true: + // + // (dx*t) + (cr + dr*t) == x0 (left edge) + // (dx*t) - (cr + dr*t) == x1 (right edge) + // (dy*t) + (cr + dr*t) == y0 (top edge) + // (dy*t) - (cr + dr*t) == y1 (bottom edge) + // + // The solution is only valid if the tangent point is actually on + // the edge, i.e. if its y coordinate is in [y0,y1] for left/right + // edges and if its x coordinate is in [x0,x1] for top/bottom edges. + // + // For the first equation: + // + // (dx + dr) * t = x0 - cr + // t = (x0 - cr) / (dx + dr) + // y = dy * t + // + // in the code this becomes: + // + // t_edge = (num) / (den) + // v = (delta) * t_edge + // + // If the denominator in t is 0, the pattern is tangent to a line + // parallel to the edge under examination. The corner-case where the + // boundary line is the same as the edge is handled by the focus + // point case and/or by the a==0 case. + + // circles tangent (externally) to left/right/top/bottom edge + radialEdge(xMin - cr, dx + dr, dy, miny, maxy, dr, mindr, valid, range); + radialEdge(xMax + cr, dx - dr, dy, miny, maxy, dr, mindr, valid, range); + radialEdge(yMin - cr, dy + dr, dx, minx, maxx, dr, mindr, valid, range); + radialEdge(yMax + cr, dy - dr, dx, minx, maxx, dr, mindr, valid, range); + + // Circles passing through a corner. + // + // A circle passing through the point (x,y) satisfies: + // + // (x-t*dx)^2 + (y-t*dy)^2 == (cr + t*dr)^2 + // + // If we set: + // a = dx^2 + dy^2 - dr^2 + // b = x*dx + y*dy + cr*dr + // c = x^2 + y^2 - cr^2 + // we have: + // a*t^2 - 2*b*t + c == 0 + + a = dx * dx + dy * dy - dr * dr; + if (fabs (a) < RADIAL_EPSILON * RADIAL_EPSILON) { + double b; + + // Ensure that gradients with both a and dr small are + // considered degenerate. + // The floating point version of the degeneracy test implemented + // in _radial_pattern_is_degenerate() is: + // + // 1) The circles are practically the same size: + // |dr| < RADIAL_EPSILON + // AND + // 2a) The circles are both very small: + // min (r0, r1) < RADIAL_EPSILON + // OR + // 2b) The circles are very close to each other: + // max (|dx|, |dy|) < 2 * RADIAL_EPSILON + // + // Assuming that the gradient is not degenerate, we want to + // show that |a| < RADIAL_EPSILON^2 implies |dr| >= RADIAL_EPSILON. + // + // If the gradient is not degenerate yet it has |dr| < + // RADIAL_EPSILON, (2b) is false, thus: + // + // max (|dx|, |dy|) >= 2*RADIAL_EPSILON + // which implies: + // 4*RADIAL_EPSILON^2 <= max (|dx|, |dy|)^2 <= dx^2 + dy^2 + // + // From the definition of a, we get: + // a = dx^2 + dy^2 - dr^2 < RADIAL_EPSILON^2 + // dx^2 + dy^2 - RADIAL_EPSILON^2 < dr^2 + // 3*RADIAL_EPSILON^2 < dr^2 + // + // which is inconsistent with the hypotheses, thus |dr| < + // RADIAL_EPSILON is false or the gradient is degenerate. + + assert (fabs (dr) >= RADIAL_EPSILON); + + // If a == 0, all the circles are tangent to a line in the + // focus point. If this line is within the box extents, we + // should add the circle with infinite radius, but this would + // make the range unbounded. We will be limiting the range to + // [0,1] anyway, so we simply add the biggest legitimate + // circle (it happens for 0 or for 1). + if (dr < 0) { + valid = radialExtendRange (range, 0, valid); + } else { + valid = radialExtendRange (range, 1, valid); + } + + // Nondegenerate, nonlimit circles passing through the corners. + // + // a == 0 && a*t^2 - 2*b*t + c == 0 + // + // t = c / (2*b) + // + // The b == 0 case has just been handled, so we only have to + // compute this if b != 0. + + // circles touching each corner + radialCorner1(xMin, yMin, b, dx, dy, cr, dr, mindr, valid, range); + radialCorner1(xMin, yMax, b, dx, dy, cr, dr, mindr, valid, range); + radialCorner1(xMax, yMin, b, dx, dy, cr, dr, mindr, valid, range); + radialCorner1(xMax, yMax, b, dx, dy, cr, dr, mindr, valid, range); + } else { + double inva, b, c, d; + + inva = 1 / a; + + // Nondegenerate, nonlimit circles passing through the corners. + // + // a != 0 && a*t^2 - 2*b*t + c == 0 + // + // t = (b +- sqrt (b*b - a*c)) / a + // + // If the argument of sqrt() is negative, then no circle + // passes through the corner. + + // circles touching each corner + radialCorner2(xMin, yMin, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range); + radialCorner2(xMin, yMax, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range); + radialCorner2(xMax, yMin, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range); + radialCorner2(xMax, yMax, a, b, c, d, dx, dy, cr, inva, dr, mindr, valid, range); + } + + *lower = std::max(0., std::min(1., range[0])); + *upper = std::max(0., std::min(1., range[1])); +} + +//------------------------------------------------------------------------ +// GfxShadingBitBuf +//------------------------------------------------------------------------ + +class GfxShadingBitBuf { +public: + + GfxShadingBitBuf(Stream *strA); + ~GfxShadingBitBuf(); + GBool getBits(int n, Guint *val); + void flushBits(); + +private: + + Stream *str; + int bitBuf; + int nBits; +}; + +GfxShadingBitBuf::GfxShadingBitBuf(Stream *strA) { + str = strA; + str->reset(); + bitBuf = 0; + nBits = 0; +} + +GfxShadingBitBuf::~GfxShadingBitBuf() { + str->close(); +} + +GBool GfxShadingBitBuf::getBits(int n, Guint *val) { + int x; + + if (nBits >= n) { + x = (bitBuf >> (nBits - n)) & ((1 << n) - 1); + nBits -= n; + } else { + x = 0; + if (nBits > 0) { + x = bitBuf & ((1 << nBits) - 1); + n -= nBits; + nBits = 0; + } + while (n > 0) { + if ((bitBuf = str->getChar()) == EOF) { + nBits = 0; + return gFalse; + } + if (n >= 8) { + x = (x << 8) | bitBuf; + n -= 8; + } else { + x = (x << n) | (bitBuf >> (8 - n)); + nBits = 8 - n; + n = 0; + } + } + } + *val = x; + return gTrue; +} + +void GfxShadingBitBuf::flushBits() { + bitBuf = 0; + nBits = 0; +} + +//------------------------------------------------------------------------ +// GfxGouraudTriangleShading +//------------------------------------------------------------------------ + +GfxGouraudTriangleShading::GfxGouraudTriangleShading( + int typeA, + GfxGouraudVertex *verticesA, int nVerticesA, + int (*trianglesA)[3], int nTrianglesA, + Function **funcsA, int nFuncsA): + GfxShading(typeA) +{ + int i; + + vertices = verticesA; + nVertices = nVerticesA; + triangles = trianglesA; + nTriangles = nTrianglesA; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } +} + +GfxGouraudTriangleShading::GfxGouraudTriangleShading( + GfxGouraudTriangleShading *shading): + GfxShading(shading) +{ + int i; + + nVertices = shading->nVertices; + vertices = (GfxGouraudVertex *)gmallocn(nVertices, sizeof(GfxGouraudVertex)); + memcpy(vertices, shading->vertices, nVertices * sizeof(GfxGouraudVertex)); + nTriangles = shading->nTriangles; + triangles = (int (*)[3])gmallocn(nTriangles * 3, sizeof(int)); + memcpy(triangles, shading->triangles, nTriangles * 3 * sizeof(int)); + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } +} + +GfxGouraudTriangleShading::~GfxGouraudTriangleShading() { + int i; + + gfree(vertices); + gfree(triangles); + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxGouraudTriangleShading *GfxGouraudTriangleShading::parse(int typeA, + Dict *dict, + Stream *str, + Gfx *gfx) { + GfxGouraudTriangleShading *shading; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + int coordBits, compBits, flagBits, vertsPerRow, nRows; + double xMin, xMax, yMin, yMax; + double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps]; + double xMul, yMul; + double cMul[gfxColorMaxComps]; + GfxGouraudVertex *verticesA; + int (*trianglesA)[3]; + int nComps, nVerticesA, nTrianglesA, vertSize, triSize; + Guint x, y, flag; + Guint c[gfxColorMaxComps]; + GfxShadingBitBuf *bitBuf; + Object obj1, obj2; + int i, j, k, state; + + if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) { + coordBits = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid BitsPerCoordinate in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("BitsPerComponent", &obj1)->isInt()) { + compBits = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid BitsPerComponent in shading dictionary"); + goto err2; + } + obj1.free(); + flagBits = vertsPerRow = 0; // make gcc happy + if (typeA == 4) { + if (dict->lookup("BitsPerFlag", &obj1)->isInt()) { + flagBits = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid BitsPerFlag in shading dictionary"); + goto err2; + } + obj1.free(); + } else { + if (dict->lookup("VerticesPerRow", &obj1)->isInt()) { + vertsPerRow = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid VerticesPerRow in shading dictionary"); + goto err2; + } + obj1.free(); + } + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() >= 6) { + xMin = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + xMax = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1); + yMin = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + yMax = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1); + for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) { + cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(); + obj2.free(); + cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(); + obj2.free(); + cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1); + } + nComps = i; + } else { + error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary"); + goto err2; + } + obj1.free(); + + if (!dict->lookup("Function", &obj1)->isNull()) { + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + } else { + nFuncsA = 0; + } + obj1.free(); + + nVerticesA = nTrianglesA = 0; + verticesA = NULL; + trianglesA = NULL; + vertSize = triSize = 0; + state = 0; + flag = 0; // make gcc happy + bitBuf = new GfxShadingBitBuf(str); + while (1) { + if (typeA == 4) { + if (!bitBuf->getBits(flagBits, &flag)) { + break; + } + } + if (!bitBuf->getBits(coordBits, &x) || + !bitBuf->getBits(coordBits, &y)) { + break; + } + for (i = 0; i < nComps; ++i) { + if (!bitBuf->getBits(compBits, &c[i])) { + break; + } + } + if (i < nComps) { + break; + } + if (nVerticesA == vertSize) { + int oldVertSize = vertSize; + vertSize = (vertSize == 0) ? 16 : 2 * vertSize; + verticesA = (GfxGouraudVertex *) + greallocn(verticesA, vertSize, sizeof(GfxGouraudVertex)); + memset(verticesA + oldVertSize, 0, (vertSize - oldVertSize) * sizeof(GfxGouraudVertex)); + } + verticesA[nVerticesA].x = xMin + xMul * (double)x; + verticesA[nVerticesA].y = yMin + yMul * (double)y; + for (i = 0; i < nComps; ++i) { + verticesA[nVerticesA].color.c[i] = + dblToCol(cMin[i] + cMul[i] * (double)c[i]); + } + ++nVerticesA; + bitBuf->flushBits(); + if (typeA == 4) { + if (state == 0 || state == 1) { + ++state; + } else if (state == 2 || flag > 0) { + if (nTrianglesA == triSize) { + triSize = (triSize == 0) ? 16 : 2 * triSize; + trianglesA = (int (*)[3]) + greallocn(trianglesA, triSize * 3, sizeof(int)); + } + if (state == 2) { + trianglesA[nTrianglesA][0] = nVerticesA - 3; + trianglesA[nTrianglesA][1] = nVerticesA - 2; + trianglesA[nTrianglesA][2] = nVerticesA - 1; + ++state; + } else if (flag == 1) { + trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][1]; + trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2]; + trianglesA[nTrianglesA][2] = nVerticesA - 1; + } else { // flag == 2 + trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][0]; + trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2]; + trianglesA[nTrianglesA][2] = nVerticesA - 1; + } + ++nTrianglesA; + } else { // state == 3 && flag == 0 + state = 1; + } + } + } + delete bitBuf; + if (typeA == 5) { + nRows = nVerticesA / vertsPerRow; + nTrianglesA = (nRows - 1) * 2 * (vertsPerRow - 1); + trianglesA = (int (*)[3])gmallocn(nTrianglesA * 3, sizeof(int)); + k = 0; + for (i = 0; i < nRows - 1; ++i) { + for (j = 0; j < vertsPerRow - 1; ++j) { + trianglesA[k][0] = i * vertsPerRow + j; + trianglesA[k][1] = i * vertsPerRow + j+1; + trianglesA[k][2] = (i+1) * vertsPerRow + j; + ++k; + trianglesA[k][0] = i * vertsPerRow + j+1; + trianglesA[k][1] = (i+1) * vertsPerRow + j; + trianglesA[k][2] = (i+1) * vertsPerRow + j+1; + ++k; + } + } + } + + shading = new GfxGouraudTriangleShading(typeA, verticesA, nVerticesA, + trianglesA, nTrianglesA, + funcsA, nFuncsA); + if (!shading->init(dict, gfx)) { + delete shading; + return NULL; + } + return shading; + + err2: + obj1.free(); + err1: + return NULL; +} + +GfxShading *GfxGouraudTriangleShading::copy() { + return new GfxGouraudTriangleShading(this); +} + +void GfxGouraudTriangleShading::getTriangle( + int i, + double *x0, double *y0, GfxColor *color0, + double *x1, double *y1, GfxColor *color1, + double *x2, double *y2, GfxColor *color2) { + double in; + double out[gfxColorMaxComps]; + int v, j; + + assert(!isParameterized()); + + v = triangles[i][0]; + *x0 = vertices[v].x; + *y0 = vertices[v].y; + if (nFuncs > 0) { + in = colToDbl(vertices[v].color.c[0]); + for (j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&in, &out[j]); + } + for (j = 0; j < gfxColorMaxComps; ++j) { + color0->c[j] = dblToCol(out[j]); + } + } else { + *color0 = vertices[v].color; + } + v = triangles[i][1]; + *x1 = vertices[v].x; + *y1 = vertices[v].y; + if (nFuncs > 0) { + in = colToDbl(vertices[v].color.c[0]); + for (j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&in, &out[j]); + } + for (j = 0; j < gfxColorMaxComps; ++j) { + color1->c[j] = dblToCol(out[j]); + } + } else { + *color1 = vertices[v].color; + } + v = triangles[i][2]; + *x2 = vertices[v].x; + *y2 = vertices[v].y; + if (nFuncs > 0) { + in = colToDbl(vertices[v].color.c[0]); + for (j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&in, &out[j]); + } + for (j = 0; j < gfxColorMaxComps; ++j) { + color2->c[j] = dblToCol(out[j]); + } + } else { + *color2 = vertices[v].color; + } +} + +void GfxGouraudTriangleShading::getParameterizedColor(double t, GfxColor *color) { + double out[gfxColorMaxComps]; + + for (int j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&t, &out[j]); + } + for (int j = 0; j < gfxColorMaxComps; ++j) { + color->c[j] = dblToCol(out[j]); + } +} + +void GfxGouraudTriangleShading::getTriangle(int i, + double *x0, double *y0, double *color0, + double *x1, double *y1, double *color1, + double *x2, double *y2, double *color2) { + int v; + + assert(isParameterized()); + + v = triangles[i][0]; + *x0 = vertices[v].x; + *y0 = vertices[v].y; + *color0 = colToDbl(vertices[v].color.c[0]); + v = triangles[i][1]; + *x1 = vertices[v].x; + *y1 = vertices[v].y; + *color1 = colToDbl(vertices[v].color.c[0]); + v = triangles[i][2]; + *x2 = vertices[v].x; + *y2 = vertices[v].y; + *color2 = colToDbl(vertices[v].color.c[0]); +} + +//------------------------------------------------------------------------ +// GfxPatchMeshShading +//------------------------------------------------------------------------ + +GfxPatchMeshShading::GfxPatchMeshShading(int typeA, + GfxPatch *patchesA, int nPatchesA, + Function **funcsA, int nFuncsA): + GfxShading(typeA) +{ + int i; + + patches = patchesA; + nPatches = nPatchesA; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } +} + +GfxPatchMeshShading::GfxPatchMeshShading(GfxPatchMeshShading *shading): + GfxShading(shading) +{ + int i; + + nPatches = shading->nPatches; + patches = (GfxPatch *)gmallocn(nPatches, sizeof(GfxPatch)); + memcpy(patches, shading->patches, nPatches * sizeof(GfxPatch)); + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } +} + +GfxPatchMeshShading::~GfxPatchMeshShading() { + int i; + + gfree(patches); + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxPatchMeshShading *GfxPatchMeshShading::parse(int typeA, Dict *dict, + Stream *str, Gfx *gfx) { + GfxPatchMeshShading *shading; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + int coordBits, compBits, flagBits; + double xMin, xMax, yMin, yMax; + double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps]; + double xMul, yMul; + double cMul[gfxColorMaxComps]; + GfxPatch *patchesA, *p; + int nComps, nPatchesA, patchesSize, nPts, nColors; + Guint flag; + double x[16], y[16]; + Guint xi, yi; + double c[4][gfxColorMaxComps]; + Guint ci; + GfxShadingBitBuf *bitBuf; + Object obj1, obj2; + int i, j; + + if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) { + coordBits = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid BitsPerCoordinate in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("BitsPerComponent", &obj1)->isInt()) { + compBits = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid BitsPerComponent in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("BitsPerFlag", &obj1)->isInt()) { + flagBits = obj1.getInt(); + } else { + error(errSyntaxWarning, -1, "Missing or invalid BitsPerFlag in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() >= 6) { + xMin = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + xMax = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1); + yMin = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + yMax = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1); + for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) { + cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(); + obj2.free(); + cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(); + obj2.free(); + cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1); + } + nComps = i; + } else { + error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary"); + goto err2; + } + obj1.free(); + + if (!dict->lookup("Function", &obj1)->isNull()) { + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + } else { + nFuncsA = 0; + } + obj1.free(); + + nPatchesA = 0; + patchesA = NULL; + patchesSize = 0; + bitBuf = new GfxShadingBitBuf(str); + while (1) { + if (!bitBuf->getBits(flagBits, &flag)) { + break; + } + if (typeA == 6) { + switch (flag) { + case 0: nPts = 12; nColors = 4; break; + case 1: + case 2: + case 3: + default: nPts = 8; nColors = 2; break; + } + } else { + switch (flag) { + case 0: nPts = 16; nColors = 4; break; + case 1: + case 2: + case 3: + default: nPts = 12; nColors = 2; break; + } + } + for (i = 0; i < nPts; ++i) { + if (!bitBuf->getBits(coordBits, &xi) || + !bitBuf->getBits(coordBits, &yi)) { + break; + } + x[i] = xMin + xMul * (double)xi; + y[i] = yMin + yMul * (double)yi; + } + if (i < nPts) { + break; + } + for (i = 0; i < nColors; ++i) { + for (j = 0; j < nComps; ++j) { + if (!bitBuf->getBits(compBits, &ci)) { + break; + } + c[i][j] = cMin[j] + cMul[j] * (double)ci; + if( nFuncsA == 0 ) { + // ... and colorspace values can also be stored into doubles. + // They will be casted later. + c[i][j] = dblToCol(c[i][j]); + } + } + if (j < nComps) { + break; + } + } + if (i < nColors) { + break; + } + if (nPatchesA == patchesSize) { + int oldPatchesSize = patchesSize; + patchesSize = (patchesSize == 0) ? 16 : 2 * patchesSize; + patchesA = (GfxPatch *)greallocn(patchesA, + patchesSize, sizeof(GfxPatch)); + memset(patchesA + oldPatchesSize, 0, (patchesSize - oldPatchesSize) * sizeof(GfxPatch)); + } + p = &patchesA[nPatchesA]; + if (typeA == 6) { + switch (flag) { + case 0: + p->x[0][0] = x[0]; + p->y[0][0] = y[0]; + p->x[0][1] = x[1]; + p->y[0][1] = y[1]; + p->x[0][2] = x[2]; + p->y[0][2] = y[2]; + p->x[0][3] = x[3]; + p->y[0][3] = y[3]; + p->x[1][3] = x[4]; + p->y[1][3] = y[4]; + p->x[2][3] = x[5]; + p->y[2][3] = y[5]; + p->x[3][3] = x[6]; + p->y[3][3] = y[6]; + p->x[3][2] = x[7]; + p->y[3][2] = y[7]; + p->x[3][1] = x[8]; + p->y[3][1] = y[8]; + p->x[3][0] = x[9]; + p->y[3][0] = y[9]; + p->x[2][0] = x[10]; + p->y[2][0] = y[10]; + p->x[1][0] = x[11]; + p->y[1][0] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = c[0][j]; + p->color[0][1].c[j] = c[1][j]; + p->color[1][1].c[j] = c[2][j]; + p->color[1][0].c[j] = c[3][j]; + } + break; + case 1: + if (nPatchesA == 0) { + goto err1; + } + p->x[0][0] = patchesA[nPatchesA-1].x[0][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[0][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[1][3]; + p->y[0][1] = patchesA[nPatchesA-1].y[1][3]; + p->x[0][2] = patchesA[nPatchesA-1].x[2][3]; + p->y[0][2] = patchesA[nPatchesA-1].y[2][3]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][3]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 2: + if (nPatchesA == 0) { + goto err1; + } + p->x[0][0] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[3][2]; + p->y[0][1] = patchesA[nPatchesA-1].y[3][2]; + p->x[0][2] = patchesA[nPatchesA-1].x[3][1]; + p->y[0][2] = patchesA[nPatchesA-1].y[3][1]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 3: + if (nPatchesA == 0) { + goto err1; + } + p->x[0][0] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][0]; + p->x[0][1] = patchesA[nPatchesA-1].x[2][0]; + p->y[0][1] = patchesA[nPatchesA-1].y[2][0]; + p->x[0][2] = patchesA[nPatchesA-1].x[1][0]; + p->y[0][2] = patchesA[nPatchesA-1].y[1][0]; + p->x[0][3] = patchesA[nPatchesA-1].x[0][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[0][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + for (j = 0; j < nComps; ++j) { + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + } + } else { + switch (flag) { + case 0: + p->x[0][0] = x[0]; + p->y[0][0] = y[0]; + p->x[0][1] = x[1]; + p->y[0][1] = y[1]; + p->x[0][2] = x[2]; + p->y[0][2] = y[2]; + p->x[0][3] = x[3]; + p->y[0][3] = y[3]; + p->x[1][3] = x[4]; + p->y[1][3] = y[4]; + p->x[2][3] = x[5]; + p->y[2][3] = y[5]; + p->x[3][3] = x[6]; + p->y[3][3] = y[6]; + p->x[3][2] = x[7]; + p->y[3][2] = y[7]; + p->x[3][1] = x[8]; + p->y[3][1] = y[8]; + p->x[3][0] = x[9]; + p->y[3][0] = y[9]; + p->x[2][0] = x[10]; + p->y[2][0] = y[10]; + p->x[1][0] = x[11]; + p->y[1][0] = y[11]; + p->x[1][1] = x[12]; + p->y[1][1] = y[12]; + p->x[1][2] = x[13]; + p->y[1][2] = y[13]; + p->x[2][2] = x[14]; + p->y[2][2] = y[14]; + p->x[2][1] = x[15]; + p->y[2][1] = y[15]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = c[0][j]; + p->color[0][1].c[j] = c[1][j]; + p->color[1][1].c[j] = c[2][j]; + p->color[1][0].c[j] = c[3][j]; + } + break; + case 1: + if (nPatchesA == 0) { + goto err1; + } + p->x[0][0] = patchesA[nPatchesA-1].x[0][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[0][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[1][3]; + p->y[0][1] = patchesA[nPatchesA-1].y[1][3]; + p->x[0][2] = patchesA[nPatchesA-1].x[2][3]; + p->y[0][2] = patchesA[nPatchesA-1].y[2][3]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][3]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + p->x[1][1] = x[8]; + p->y[1][1] = y[8]; + p->x[1][2] = x[9]; + p->y[1][2] = y[9]; + p->x[2][2] = x[10]; + p->y[2][2] = y[10]; + p->x[2][1] = x[11]; + p->y[2][1] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 2: + if (nPatchesA == 0) { + goto err1; + } + p->x[0][0] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[3][2]; + p->y[0][1] = patchesA[nPatchesA-1].y[3][2]; + p->x[0][2] = patchesA[nPatchesA-1].x[3][1]; + p->y[0][2] = patchesA[nPatchesA-1].y[3][1]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + p->x[1][1] = x[8]; + p->y[1][1] = y[8]; + p->x[1][2] = x[9]; + p->y[1][2] = y[9]; + p->x[2][2] = x[10]; + p->y[2][2] = y[10]; + p->x[2][1] = x[11]; + p->y[2][1] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 3: + if (nPatchesA == 0) { + goto err1; + } + p->x[0][0] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][0]; + p->x[0][1] = patchesA[nPatchesA-1].x[2][0]; + p->y[0][1] = patchesA[nPatchesA-1].y[2][0]; + p->x[0][2] = patchesA[nPatchesA-1].x[1][0]; + p->y[0][2] = patchesA[nPatchesA-1].y[1][0]; + p->x[0][3] = patchesA[nPatchesA-1].x[0][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[0][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + p->x[1][1] = x[8]; + p->y[1][1] = y[8]; + p->x[1][2] = x[9]; + p->y[1][2] = y[9]; + p->x[2][2] = x[10]; + p->y[2][2] = y[10]; + p->x[2][1] = x[11]; + p->y[2][1] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + } + } + ++nPatchesA; + bitBuf->flushBits(); + } + delete bitBuf; + + if (typeA == 6) { + for (i = 0; i < nPatchesA; ++i) { + p = &patchesA[i]; + p->x[1][1] = (-4 * p->x[0][0] + +6 * (p->x[0][1] + p->x[1][0]) + -2 * (p->x[0][3] + p->x[3][0]) + +3 * (p->x[3][1] + p->x[1][3]) + - p->x[3][3]) / 9; + p->y[1][1] = (-4 * p->y[0][0] + +6 * (p->y[0][1] + p->y[1][0]) + -2 * (p->y[0][3] + p->y[3][0]) + +3 * (p->y[3][1] + p->y[1][3]) + - p->y[3][3]) / 9; + p->x[1][2] = (-4 * p->x[0][3] + +6 * (p->x[0][2] + p->x[1][3]) + -2 * (p->x[0][0] + p->x[3][3]) + +3 * (p->x[3][2] + p->x[1][0]) + - p->x[3][0]) / 9; + p->y[1][2] = (-4 * p->y[0][3] + +6 * (p->y[0][2] + p->y[1][3]) + -2 * (p->y[0][0] + p->y[3][3]) + +3 * (p->y[3][2] + p->y[1][0]) + - p->y[3][0]) / 9; + p->x[2][1] = (-4 * p->x[3][0] + +6 * (p->x[3][1] + p->x[2][0]) + -2 * (p->x[3][3] + p->x[0][0]) + +3 * (p->x[0][1] + p->x[2][3]) + - p->x[0][3]) / 9; + p->y[2][1] = (-4 * p->y[3][0] + +6 * (p->y[3][1] + p->y[2][0]) + -2 * (p->y[3][3] + p->y[0][0]) + +3 * (p->y[0][1] + p->y[2][3]) + - p->y[0][3]) / 9; + p->x[2][2] = (-4 * p->x[3][3] + +6 * (p->x[3][2] + p->x[2][3]) + -2 * (p->x[3][0] + p->x[0][3]) + +3 * (p->x[0][2] + p->x[2][0]) + - p->x[0][0]) / 9; + p->y[2][2] = (-4 * p->y[3][3] + +6 * (p->y[3][2] + p->y[2][3]) + -2 * (p->y[3][0] + p->y[0][3]) + +3 * (p->y[0][2] + p->y[2][0]) + - p->y[0][0]) / 9; + } + } + + shading = new GfxPatchMeshShading(typeA, patchesA, nPatchesA, + funcsA, nFuncsA); + if (!shading->init(dict, gfx)) { + delete shading; + return NULL; + } + return shading; + + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxPatchMeshShading::getParameterizedColor(double t, GfxColor *color) { + double out[gfxColorMaxComps]; + + for (int j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&t, &out[j]); + } + for (int j = 0; j < gfxColorMaxComps; ++j) { + color->c[j] = dblToCol(out[j]); + } +} + +GfxShading *GfxPatchMeshShading::copy() { + return new GfxPatchMeshShading(this); +} + +//------------------------------------------------------------------------ +// GfxImageColorMap +//------------------------------------------------------------------------ + +GfxImageColorMap::GfxImageColorMap(int bitsA, Object *decode, + GfxColorSpace *colorSpaceA) { + GfxIndexedColorSpace *indexedCS; + GfxSeparationColorSpace *sepCS; + int maxPixel, indexHigh; + Guchar *indexedLookup; + Function *sepFunc; + Object obj; + double x[gfxColorMaxComps]; + double y[gfxColorMaxComps]; + int i, j, k; + double mapped; + GBool useByteLookup; + + ok = gTrue; + + // bits per component and color space + bits = bitsA; + maxPixel = (1 << bits) - 1; + colorSpace = colorSpaceA; + + // this is a hack to support 16 bits images, everywhere + // we assume a component fits in 8 bits, with this hack + // we treat 16 bit images as 8 bit ones until it's fixed correctly. + // The hack has another part on ImageStream::getLine + if (maxPixel > 255) maxPixel = 255; + + // initialize + for (k = 0; k < gfxColorMaxComps; ++k) { + lookup[k] = NULL; + lookup2[k] = NULL; + } + byte_lookup = NULL; + + // get decode map + if (decode->isNull()) { + nComps = colorSpace->getNComps(); + colorSpace->getDefaultRanges(decodeLow, decodeRange, maxPixel); + } else if (decode->isArray()) { + nComps = decode->arrayGetLength() / 2; + if (nComps < colorSpace->getNComps()) { + goto err1; + } + if (nComps > colorSpace->getNComps()) { + error(errSyntaxWarning, -1, "Too many elements in Decode array"); + nComps = colorSpace->getNComps(); + } + for (i = 0; i < nComps; ++i) { + decode->arrayGet(2*i, &obj); + if (!obj.isNum()) { + goto err2; + } + decodeLow[i] = obj.getNum(); + obj.free(); + decode->arrayGet(2*i+1, &obj); + if (!obj.isNum()) { + goto err2; + } + decodeRange[i] = obj.getNum() - decodeLow[i]; + obj.free(); + } + } else { + goto err1; + } + + // Construct a lookup table -- this stores pre-computed decoded + // values for each component, i.e., the result of applying the + // decode mapping to each possible image pixel component value. + for (k = 0; k < nComps; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + lookup[k][i] = dblToCol(decodeLow[k] + + (i * decodeRange[k]) / maxPixel); + } + } + + // Optimization: for Indexed and Separation color spaces (which have + // only one component), we pre-compute a second lookup table with + // color values + colorSpace2 = NULL; + nComps2 = 0; + useByteLookup = gFalse; + switch (colorSpace->getMode()) { + case csIndexed: + // Note that indexHigh may not be the same as maxPixel -- + // Distiller will remove unused palette entries, resulting in + // indexHigh < maxPixel. + indexedCS = (GfxIndexedColorSpace *)colorSpace; + colorSpace2 = indexedCS->getBase(); + indexHigh = indexedCS->getIndexHigh(); + nComps2 = colorSpace2->getNComps(); + indexedLookup = indexedCS->getLookup(); + colorSpace2->getDefaultRanges(x, y, indexHigh); + if (colorSpace2->useGetGrayLine() || colorSpace2->useGetRGBLine()) { + byte_lookup = (Guchar *)gmallocn ((maxPixel + 1), nComps2); + useByteLookup = gTrue; + } + for (k = 0; k < nComps2; ++k) { + lookup2[k] = (GfxColorComp *)gmallocn(maxPixel + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5); + if (j < 0) { + j = 0; + } else if (j > indexHigh) { + j = indexHigh; + } + + mapped = x[k] + (indexedLookup[j*nComps2 + k] / 255.0) * y[k]; + lookup2[k][i] = dblToCol(mapped); + if (useByteLookup) + byte_lookup[i * nComps2 + k] = (Guchar) (mapped * 255); + } + } + break; + case csSeparation: + sepCS = (GfxSeparationColorSpace *)colorSpace; + colorSpace2 = sepCS->getAlt(); + nComps2 = colorSpace2->getNComps(); + sepFunc = sepCS->getFunc(); + if (colorSpace2->useGetGrayLine() || colorSpace2->useGetRGBLine()) { + byte_lookup = (Guchar *)gmallocn ((maxPixel + 1), nComps2); + useByteLookup = gTrue; + } + for (k = 0; k < nComps2; ++k) { + lookup2[k] = (GfxColorComp *)gmallocn(maxPixel + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel; + sepFunc->transform(x, y); + lookup2[k][i] = dblToCol(y[k]); + if (useByteLookup) + byte_lookup[i*nComps2 + k] = (Guchar) (y[k] * 255); + } + } + break; + default: + if (colorSpace->useGetGrayLine() || colorSpace->useGetRGBLine()) { + byte_lookup = (Guchar *)gmallocn ((maxPixel + 1), nComps); + useByteLookup = gTrue; + } + for (k = 0; k < nComps; ++k) { + lookup2[k] = (GfxColorComp *)gmallocn(maxPixel + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + mapped = decodeLow[k] + (i * decodeRange[k]) / maxPixel; + lookup2[k][i] = dblToCol(mapped); + if (useByteLookup) { + int byte; + + byte = (int) (mapped * 255.0 + 0.5); + if (byte < 0) + byte = 0; + else if (byte > 255) + byte = 255; + byte_lookup[i * nComps + k] = byte; + } + } + } + } + + return; + + err2: + obj.free(); + err1: + ok = gFalse; +} + +GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) { + int n, i, k; + + colorSpace = colorMap->colorSpace->copy(); + bits = colorMap->bits; + nComps = colorMap->nComps; + nComps2 = colorMap->nComps2; + colorSpace2 = NULL; + for (k = 0; k < gfxColorMaxComps; ++k) { + lookup[k] = NULL; + } + n = 1 << bits; + if (colorSpace->getMode() == csIndexed) { + colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase(); + for (k = 0; k < nComps2; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); + memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); + } + } else if (colorSpace->getMode() == csSeparation) { + colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt(); + for (k = 0; k < nComps2; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); + memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); + } + } else { + for (k = 0; k < nComps; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); + memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); + } + } + if (colorMap->byte_lookup) { + int nc = colorSpace2 ? nComps2 : nComps; + + byte_lookup = (Guchar *)gmallocn (n, nc); + memcpy(byte_lookup, colorMap->byte_lookup, n * nc); + } + for (i = 0; i < nComps; ++i) { + decodeLow[i] = colorMap->decodeLow[i]; + decodeRange[i] = colorMap->decodeRange[i]; + } + ok = gTrue; +} + +GfxImageColorMap::~GfxImageColorMap() { + int i; + + delete colorSpace; + for (i = 0; i < gfxColorMaxComps; ++i) { + gfree(lookup[i]); + gfree(lookup2[i]); + } + gfree(byte_lookup); +} + +void GfxImageColorMap::getGray(Guchar *x, GfxGray *gray) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup2[i][x[0]]; + } + colorSpace2->getGray(&color, gray); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup2[i][x[i]]; + } + colorSpace->getGray(&color, gray); + } +} + +void GfxImageColorMap::getRGB(Guchar *x, GfxRGB *rgb) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup2[i][x[0]]; + } + colorSpace2->getRGB(&color, rgb); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup2[i][x[i]]; + } + colorSpace->getRGB(&color, rgb); + } +} + +void GfxImageColorMap::getGrayLine(Guchar *in, Guchar *out, int length) { + int i, j; + Guchar *inp, *tmp_line; + + if ((colorSpace2 && !colorSpace2->useGetGrayLine ()) || + (!colorSpace2 && !colorSpace->useGetGrayLine ())) { + GfxGray gray; + + inp = in; + for (i = 0; i < length; i++) { + getGray (inp, &gray); + out[i] = colToByte(gray); + inp += nComps; + } + return; + } + + switch (colorSpace->getMode()) { + case csIndexed: + case csSeparation: + tmp_line = (Guchar *) gmallocn (length, nComps2); + for (i = 0; i < length; i++) { + for (j = 0; j < nComps2; j++) { + tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j]; + } + } + colorSpace2->getGrayLine(tmp_line, out, length); + gfree (tmp_line); + break; + + default: + inp = in; + for (j = 0; j < length; j++) + for (i = 0; i < nComps; i++) { + *inp = byte_lookup[*inp * nComps + i]; + inp++; + } + colorSpace->getGrayLine(in, out, length); + break; + } + +} + +void GfxImageColorMap::getRGBLine(Guchar *in, unsigned int *out, int length) { + int i, j; + Guchar *inp, *tmp_line; + + if (!useRGBLine()) { + GfxRGB rgb; + + inp = in; + for (i = 0; i < length; i++) { + getRGB (inp, &rgb); + out[i] = + ((int) colToByte(rgb.r) << 16) | + ((int) colToByte(rgb.g) << 8) | + ((int) colToByte(rgb.b) << 0); + inp += nComps; + } + return; + } + + switch (colorSpace->getMode()) { + case csIndexed: + case csSeparation: + tmp_line = (Guchar *) gmallocn (length, nComps2); + for (i = 0; i < length; i++) { + for (j = 0; j < nComps2; j++) { + tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j]; + } + } + colorSpace2->getRGBLine(tmp_line, out, length); + gfree (tmp_line); + break; + + default: + inp = in; + for (j = 0; j < length; j++) + for (i = 0; i < nComps; i++) { + *inp = byte_lookup[*inp * nComps + i]; + inp++; + } + colorSpace->getRGBLine(in, out, length); + break; + } + +} + +void GfxImageColorMap::getRGBLine(Guchar *in, Guchar *out, int length) { + int i, j; + Guchar *inp, *tmp_line; + + if (!useRGBLine()) { + GfxRGB rgb; + + inp = in; + for (i = 0; i < length; i++) { + getRGB (inp, &rgb); + *out++ = colToByte(rgb.r); + *out++ = colToByte(rgb.g); + *out++ = colToByte(rgb.b); + inp += nComps; + } + return; + } + + switch (colorSpace->getMode()) { + case csIndexed: + case csSeparation: + tmp_line = (Guchar *) gmallocn (length, nComps2); + for (i = 0; i < length; i++) { + for (j = 0; j < nComps2; j++) { + tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j]; + } + } + colorSpace2->getRGBLine(tmp_line, out, length); + gfree (tmp_line); + break; + + default: + inp = in; + for (j = 0; j < length; j++) + for (i = 0; i < nComps; i++) { + *inp = byte_lookup[*inp * nComps + i]; + inp++; + } + colorSpace->getRGBLine(in, out, length); + break; + } + +} + +void GfxImageColorMap::getRGBXLine(Guchar *in, Guchar *out, int length) { + int i, j; + Guchar *inp, *tmp_line; + + if (!useRGBLine()) { + GfxRGB rgb; + + inp = in; + for (i = 0; i < length; i++) { + getRGB (inp, &rgb); + *out++ = colToByte(rgb.r); + *out++ = colToByte(rgb.g); + *out++ = colToByte(rgb.b); + *out++ = 255; + inp += nComps; + } + return; + } + + switch (colorSpace->getMode()) { + case csIndexed: + case csSeparation: + tmp_line = (Guchar *) gmallocn (length, nComps2); + for (i = 0; i < length; i++) { + for (j = 0; j < nComps2; j++) { + tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j]; + } + } + colorSpace2->getRGBXLine(tmp_line, out, length); + gfree (tmp_line); + break; + + default: + inp = in; + for (j = 0; j < length; j++) + for (i = 0; i < nComps; i++) { + *inp = byte_lookup[*inp * nComps + i]; + inp++; + } + colorSpace->getRGBXLine(in, out, length); + break; + } + +} + +void GfxImageColorMap::getCMYK(Guchar *x, GfxCMYK *cmyk) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup2[i][x[0]]; + } + colorSpace2->getCMYK(&color, cmyk); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[i][x[i]]; + } + colorSpace->getCMYK(&color, cmyk); + } +} + +void GfxImageColorMap::getColor(Guchar *x, GfxColor *color) { + int maxPixel, i; + + maxPixel = (1 << bits) - 1; + for (i = 0; i < nComps; ++i) { + color->c[i] = dblToCol(decodeLow[i] + (x[i] * decodeRange[i]) / maxPixel); + } +} + +//------------------------------------------------------------------------ +// GfxSubpath and GfxPath +//------------------------------------------------------------------------ + +GfxSubpath::GfxSubpath(double x1, double y1) { + size = 16; + x = (double *)gmallocn(size, sizeof(double)); + y = (double *)gmallocn(size, sizeof(double)); + curve = (GBool *)gmallocn(size, sizeof(GBool)); + n = 1; + x[0] = x1; + y[0] = y1; + curve[0] = gFalse; + closed = gFalse; +} + +GfxSubpath::~GfxSubpath() { + gfree(x); + gfree(y); + gfree(curve); +} + +// Used for copy(). +GfxSubpath::GfxSubpath(GfxSubpath *subpath) { + size = subpath->size; + n = subpath->n; + x = (double *)gmallocn(size, sizeof(double)); + y = (double *)gmallocn(size, sizeof(double)); + curve = (GBool *)gmallocn(size, sizeof(GBool)); + memcpy(x, subpath->x, n * sizeof(double)); + memcpy(y, subpath->y, n * sizeof(double)); + memcpy(curve, subpath->curve, n * sizeof(GBool)); + closed = subpath->closed; +} + +void GfxSubpath::lineTo(double x1, double y1) { + if (n >= size) { + size *= 2; + x = (double *)greallocn(x, size, sizeof(double)); + y = (double *)greallocn(y, size, sizeof(double)); + curve = (GBool *)greallocn(curve, size, sizeof(GBool)); + } + x[n] = x1; + y[n] = y1; + curve[n] = gFalse; + ++n; +} + +void GfxSubpath::curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) { + if (n+3 > size) { + size *= 2; + x = (double *)greallocn(x, size, sizeof(double)); + y = (double *)greallocn(y, size, sizeof(double)); + curve = (GBool *)greallocn(curve, size, sizeof(GBool)); + } + x[n] = x1; + y[n] = y1; + x[n+1] = x2; + y[n+1] = y2; + x[n+2] = x3; + y[n+2] = y3; + curve[n] = curve[n+1] = gTrue; + curve[n+2] = gFalse; + n += 3; +} + +void GfxSubpath::close() { + if (x[n-1] != x[0] || y[n-1] != y[0]) { + lineTo(x[0], y[0]); + } + closed = gTrue; +} + +void GfxSubpath::offset(double dx, double dy) { + int i; + + for (i = 0; i < n; ++i) { + x[i] += dx; + y[i] += dy; + } +} + +GfxPath::GfxPath() { + justMoved = gFalse; + size = 16; + n = 0; + firstX = firstY = 0; + subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *)); +} + +GfxPath::~GfxPath() { + int i; + + for (i = 0; i < n; ++i) + delete subpaths[i]; + gfree(subpaths); +} + +// Used for copy(). +GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1, + GfxSubpath **subpaths1, int n1, int size1) { + int i; + + justMoved = justMoved1; + firstX = firstX1; + firstY = firstY1; + size = size1; + n = n1; + subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *)); + for (i = 0; i < n; ++i) + subpaths[i] = subpaths1[i]->copy(); +} + +void GfxPath::moveTo(double x, double y) { + justMoved = gTrue; + firstX = x; + firstY = y; +} + +void GfxPath::lineTo(double x, double y) { + if (justMoved || (n > 0 && subpaths[n-1]->isClosed())) { + if (n >= size) { + size *= 2; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + if (justMoved) { + subpaths[n] = new GfxSubpath(firstX, firstY); + } else { + subpaths[n] = new GfxSubpath(subpaths[n-1]->getLastX(), + subpaths[n-1]->getLastY()); + } + ++n; + justMoved = gFalse; + } + subpaths[n-1]->lineTo(x, y); +} + +void GfxPath::curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) { + if (justMoved || (n > 0 && subpaths[n-1]->isClosed())) { + if (n >= size) { + size *= 2; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + if (justMoved) { + subpaths[n] = new GfxSubpath(firstX, firstY); + } else { + subpaths[n] = new GfxSubpath(subpaths[n-1]->getLastX(), + subpaths[n-1]->getLastY()); + } + ++n; + justMoved = gFalse; + } + subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3); +} + +void GfxPath::close() { + // this is necessary to handle the pathological case of + // moveto/closepath/clip, which defines an empty clipping region + if (justMoved) { + if (n >= size) { + size *= 2; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + subpaths[n] = new GfxSubpath(firstX, firstY); + ++n; + justMoved = gFalse; + } + subpaths[n-1]->close(); +} + +void GfxPath::append(GfxPath *path) { + int i; + + if (n + path->n > size) { + size = n + path->n; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + for (i = 0; i < path->n; ++i) { + subpaths[n++] = path->subpaths[i]->copy(); + } + justMoved = gFalse; +} + +void GfxPath::offset(double dx, double dy) { + int i; + + for (i = 0; i < n; ++i) { + subpaths[i]->offset(dx, dy); + } +} + +//------------------------------------------------------------------------ +// GfxState +//------------------------------------------------------------------------ +GfxState::ReusablePathIterator::ReusablePathIterator(GfxPath *path) + : path(path), + subPathOff(0), + coordOff(0), + numCoords(0), + curSubPath(NULL) +{ + if( path->getNumSubpaths() ) { + curSubPath = path->getSubpath(subPathOff); + numCoords = curSubPath->getNumPoints(); + } +} + +bool GfxState::ReusablePathIterator::isEnd() const { + return coordOff >= numCoords; +} + +void GfxState::ReusablePathIterator::next() { + ++coordOff; + if (coordOff == numCoords) { + ++subPathOff; + if (subPathOff < path->getNumSubpaths()) { + coordOff = 0; + curSubPath = path->getSubpath(subPathOff); + numCoords = curSubPath->getNumPoints(); + } + } +} + +void GfxState::ReusablePathIterator::setCoord(double x, double y) { + curSubPath->setX(coordOff, x); + curSubPath->setY(coordOff, y); +} + +void GfxState::ReusablePathIterator::reset() { + coordOff = 0; + subPathOff = 0; + curSubPath = path->getSubpath(0); + numCoords = curSubPath->getNumPoints(); +} + +GfxState::GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox, + int rotateA, GBool upsideDown) { + double kx, ky; + + hDPI = hDPIA; + vDPI = vDPIA; + rotate = rotateA; + px1 = pageBox->x1; + py1 = pageBox->y1; + px2 = pageBox->x2; + py2 = pageBox->y2; + kx = hDPI / 72.0; + ky = vDPI / 72.0; + if (rotate == 90) { + ctm[0] = 0; + ctm[1] = upsideDown ? ky : -ky; + ctm[2] = kx; + ctm[3] = 0; + ctm[4] = -kx * py1; + ctm[5] = ky * (upsideDown ? -px1 : px2); + pageWidth = kx * (py2 - py1); + pageHeight = ky * (px2 - px1); + } else if (rotate == 180) { + ctm[0] = -kx; + ctm[1] = 0; + ctm[2] = 0; + ctm[3] = upsideDown ? ky : -ky; + ctm[4] = kx * px2; + ctm[5] = ky * (upsideDown ? -py1 : py2); + pageWidth = kx * (px2 - px1); + pageHeight = ky * (py2 - py1); + } else if (rotate == 270) { + ctm[0] = 0; + ctm[1] = upsideDown ? -ky : ky; + ctm[2] = -kx; + ctm[3] = 0; + ctm[4] = kx * py2; + ctm[5] = ky * (upsideDown ? px2 : -px1); + pageWidth = kx * (py2 - py1); + pageHeight = ky * (px2 - px1); + } else { + ctm[0] = kx; + ctm[1] = 0; + ctm[2] = 0; + ctm[3] = upsideDown ? -ky : ky; + ctm[4] = -kx * px1; + ctm[5] = ky * (upsideDown ? py2 : -py1); + pageWidth = kx * (px2 - px1); + pageHeight = ky * (py2 - py1); + } + + fillColorSpace = new GfxDeviceGrayColorSpace(); + strokeColorSpace = new GfxDeviceGrayColorSpace(); + fillColor.c[0] = 0; + strokeColor.c[0] = 0; + fillPattern = NULL; + strokePattern = NULL; + blendMode = gfxBlendNormal; + fillOpacity = 1; + strokeOpacity = 1; + fillOverprint = gFalse; + strokeOverprint = gFalse; + overprintMode = 0; + transfer[0] = transfer[1] = transfer[2] = transfer[3] = NULL; + + lineWidth = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashStart = 0; + flatness = 1; + lineJoin = 0; + lineCap = 0; + miterLimit = 10; + strokeAdjust = gFalse; + alphaIsShape = gFalse; + textKnockout = gFalse; + + font = NULL; + fontSize = 0; + textMat[0] = 1; textMat[1] = 0; + textMat[2] = 0; textMat[3] = 1; + textMat[4] = 0; textMat[5] = 0; + charSpace = 0; + wordSpace = 0; + horizScaling = 1; + leading = 0; + rise = 0; + render = 0; + + path = new GfxPath(); + curX = curY = 0; + lineX = lineY = 0; + + clipXMin = 0; + clipYMin = 0; + clipXMax = pageWidth; + clipYMax = pageHeight; + + saved = NULL; +#ifdef USE_CMS + GfxColorSpace::setupColorProfiles(); +#endif +} + +GfxState::~GfxState() { + int i; + + if (fillColorSpace) { + delete fillColorSpace; + } + if (strokeColorSpace) { + delete strokeColorSpace; + } + if (fillPattern) { + delete fillPattern; + } + if (strokePattern) { + delete strokePattern; + } + for (i = 0; i < 4; ++i) { + if (transfer[i]) { + delete transfer[i]; + } + } + gfree(lineDash); + if (path) { + // this gets set to NULL by restore() + delete path; + } + if (font) { + font->decRefCnt(); + } +} + +// Used for copy(); +GfxState::GfxState(GfxState *state, GBool copyPath) { + int i; + + memcpy(this, state, sizeof(GfxState)); + if (fillColorSpace) { + fillColorSpace = state->fillColorSpace->copy(); + } + if (strokeColorSpace) { + strokeColorSpace = state->strokeColorSpace->copy(); + } + if (fillPattern) { + fillPattern = state->fillPattern->copy(); + } + if (strokePattern) { + strokePattern = state->strokePattern->copy(); + } + for (i = 0; i < 4; ++i) { + if (transfer[i]) { + transfer[i] = state->transfer[i]->copy(); + } + } + if (lineDashLength > 0) { + lineDash = (double *)gmallocn(lineDashLength, sizeof(double)); + memcpy(lineDash, state->lineDash, lineDashLength * sizeof(double)); + } + if (font) + font->incRefCnt(); + + if (copyPath) { + path = state->path->copy(); + } + saved = NULL; +} + +void GfxState::setPath(GfxPath *pathA) { + delete path; + path = pathA; +} + +void GfxState::getUserClipBBox(double *xMin, double *yMin, + double *xMax, double *yMax) { + double ictm[6]; + double xMin1, yMin1, xMax1, yMax1, det, tx, ty; + + // invert the CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + + // transform all four corners of the clip bbox; find the min and max + // x and y values + xMin1 = xMax1 = clipXMin * ictm[0] + clipYMin * ictm[2] + ictm[4]; + yMin1 = yMax1 = clipXMin * ictm[1] + clipYMin * ictm[3] + ictm[5]; + tx = clipXMin * ictm[0] + clipYMax * ictm[2] + ictm[4]; + ty = clipXMin * ictm[1] + clipYMax * ictm[3] + ictm[5]; + if (tx < xMin1) { + xMin1 = tx; + } else if (tx > xMax1) { + xMax1 = tx; + } + if (ty < yMin1) { + yMin1 = ty; + } else if (ty > yMax1) { + yMax1 = ty; + } + tx = clipXMax * ictm[0] + clipYMin * ictm[2] + ictm[4]; + ty = clipXMax * ictm[1] + clipYMin * ictm[3] + ictm[5]; + if (tx < xMin1) { + xMin1 = tx; + } else if (tx > xMax1) { + xMax1 = tx; + } + if (ty < yMin1) { + yMin1 = ty; + } else if (ty > yMax1) { + yMax1 = ty; + } + tx = clipXMax * ictm[0] + clipYMax * ictm[2] + ictm[4]; + ty = clipXMax * ictm[1] + clipYMax * ictm[3] + ictm[5]; + if (tx < xMin1) { + xMin1 = tx; + } else if (tx > xMax1) { + xMax1 = tx; + } + if (ty < yMin1) { + yMin1 = ty; + } else if (ty > yMax1) { + yMax1 = ty; + } + + *xMin = xMin1; + *yMin = yMin1; + *xMax = xMax1; + *yMax = yMax1; +} + +double GfxState::transformWidth(double w) { + double x, y; + + x = ctm[0] + ctm[2]; + y = ctm[1] + ctm[3]; + return w * sqrt(0.5 * (x * x + y * y)); +} + +double GfxState::getTransformedFontSize() { + double x1, y1, x2, y2; + + x1 = textMat[2] * fontSize; + y1 = textMat[3] * fontSize; + x2 = ctm[0] * x1 + ctm[2] * y1; + y2 = ctm[1] * x1 + ctm[3] * y1; + return sqrt(x2 * x2 + y2 * y2); +} + +void GfxState::getFontTransMat(double *m11, double *m12, + double *m21, double *m22) { + *m11 = (textMat[0] * ctm[0] + textMat[1] * ctm[2]) * fontSize; + *m12 = (textMat[0] * ctm[1] + textMat[1] * ctm[3]) * fontSize; + *m21 = (textMat[2] * ctm[0] + textMat[3] * ctm[2]) * fontSize; + *m22 = (textMat[2] * ctm[1] + textMat[3] * ctm[3]) * fontSize; +} + +void GfxState::setCTM(double a, double b, double c, + double d, double e, double f) { + ctm[0] = a; + ctm[1] = b; + ctm[2] = c; + ctm[3] = d; + ctm[4] = e; + ctm[5] = f; +} + +void GfxState::concatCTM(double a, double b, double c, + double d, double e, double f) { + double a1 = ctm[0]; + double b1 = ctm[1]; + double c1 = ctm[2]; + double d1 = ctm[3]; + + ctm[0] = a * a1 + b * c1; + ctm[1] = a * b1 + b * d1; + ctm[2] = c * a1 + d * c1; + ctm[3] = c * b1 + d * d1; + ctm[4] = e * a1 + f * c1 + ctm[4]; + ctm[5] = e * b1 + f * d1 + ctm[5]; +} + +void GfxState::shiftCTM(double tx, double ty) { + ctm[4] += tx; + ctm[5] += ty; + clipXMin += tx; + clipYMin += ty; + clipXMax += tx; + clipYMax += ty; +} + +void GfxState::setFillColorSpace(GfxColorSpace *colorSpace) { + if (fillColorSpace) { + delete fillColorSpace; + } + fillColorSpace = colorSpace; +} + +void GfxState::setStrokeColorSpace(GfxColorSpace *colorSpace) { + if (strokeColorSpace) { + delete strokeColorSpace; + } + strokeColorSpace = colorSpace; +} + +void GfxState::setFillPattern(GfxPattern *pattern) { + if (fillPattern) { + delete fillPattern; + } + fillPattern = pattern; +} + +void GfxState::setStrokePattern(GfxPattern *pattern) { + if (strokePattern) { + delete strokePattern; + } + strokePattern = pattern; +} + +void GfxState::setFont(GfxFont *fontA, double fontSizeA) { + if (font) + font->decRefCnt(); + + font = fontA; + fontSize = fontSizeA; +} + +void GfxState::setTransfer(Function **funcs) { + int i; + + for (i = 0; i < 4; ++i) { + if (transfer[i]) { + delete transfer[i]; + } + transfer[i] = funcs[i]; + } +} + +void GfxState::setLineDash(double *dash, int length, double start) { + if (lineDash) + gfree(lineDash); + lineDash = dash; + lineDashLength = length; + lineDashStart = start; +} + +void GfxState::clearPath() { + delete path; + path = new GfxPath(); +} + +void GfxState::clip() { + double xMin, yMin, xMax, yMax, x, y; + GfxSubpath *subpath; + int i, j; + + xMin = xMax = yMin = yMax = 0; // make gcc happy + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + for (j = 0; j < subpath->getNumPoints(); ++j) { + transform(subpath->getX(j), subpath->getY(j), &x, &y); + if (i == 0 && j == 0) { + xMin = xMax = x; + yMin = yMax = y; + } else { + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + } + } + } + if (xMin > clipXMin) { + clipXMin = xMin; + } + if (yMin > clipYMin) { + clipYMin = yMin; + } + if (xMax < clipXMax) { + clipXMax = xMax; + } + if (yMax < clipYMax) { + clipYMax = yMax; + } +} + +void GfxState::clipToStrokePath() { + double xMin, yMin, xMax, yMax, x, y, t0, t1; + GfxSubpath *subpath; + int i, j; + + xMin = xMax = yMin = yMax = 0; // make gcc happy + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + for (j = 0; j < subpath->getNumPoints(); ++j) { + transform(subpath->getX(j), subpath->getY(j), &x, &y); + if (i == 0 && j == 0) { + xMin = xMax = x; + yMin = yMax = y; + } else { + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + } + } + } + + // allow for the line width + //~ miter joins can extend farther than this + t0 = fabs(ctm[0]); + t1 = fabs(ctm[2]); + if (t0 > t1) { + xMin -= 0.5 * lineWidth * t0; + xMax += 0.5 * lineWidth * t0; + } else { + xMin -= 0.5 * lineWidth * t1; + xMax += 0.5 * lineWidth * t1; + } + t0 = fabs(ctm[0]); + t1 = fabs(ctm[3]); + if (t0 > t1) { + yMin -= 0.5 * lineWidth * t0; + yMax += 0.5 * lineWidth * t0; + } else { + yMin -= 0.5 * lineWidth * t1; + yMax += 0.5 * lineWidth * t1; + } + + if (xMin > clipXMin) { + clipXMin = xMin; + } + if (yMin > clipYMin) { + clipYMin = yMin; + } + if (xMax < clipXMax) { + clipXMax = xMax; + } + if (yMax < clipYMax) { + clipYMax = yMax; + } +} + +void GfxState::clipToRect(double xMin, double yMin, double xMax, double yMax) { + double x, y, xMin1, yMin1, xMax1, yMax1; + + transform(xMin, yMin, &x, &y); + xMin1 = xMax1 = x; + yMin1 = yMax1 = y; + transform(xMax, yMin, &x, &y); + if (x < xMin1) { + xMin1 = x; + } else if (x > xMax1) { + xMax1 = x; + } + if (y < yMin1) { + yMin1 = y; + } else if (y > yMax1) { + yMax1 = y; + } + transform(xMax, yMax, &x, &y); + if (x < xMin1) { + xMin1 = x; + } else if (x > xMax1) { + xMax1 = x; + } + if (y < yMin1) { + yMin1 = y; + } else if (y > yMax1) { + yMax1 = y; + } + transform(xMin, yMax, &x, &y); + if (x < xMin1) { + xMin1 = x; + } else if (x > xMax1) { + xMax1 = x; + } + if (y < yMin1) { + yMin1 = y; + } else if (y > yMax1) { + yMax1 = y; + } + + if (xMin1 > clipXMin) { + clipXMin = xMin1; + } + if (yMin1 > clipYMin) { + clipYMin = yMin1; + } + if (xMax1 < clipXMax) { + clipXMax = xMax1; + } + if (yMax1 < clipYMax) { + clipYMax = yMax1; + } +} + +void GfxState::textShift(double tx, double ty) { + double dx, dy; + + textTransformDelta(tx, ty, &dx, &dy); + curX += dx; + curY += dy; +} + +void GfxState::shift(double dx, double dy) { + curX += dx; + curY += dy; +} + +GfxState *GfxState::save() { + GfxState *newState; + + newState = copy(); + newState->saved = this; + return newState; +} + +GfxState *GfxState::restore() { + GfxState *oldState; + + if (saved) { + oldState = saved; + + // these attributes aren't saved/restored by the q/Q operators + oldState->path = path; + oldState->curX = curX; + oldState->curY = curY; + oldState->lineX = lineX; + oldState->lineY = lineY; + + path = NULL; + saved = NULL; + delete this; + + } else { + oldState = this; + } + + return oldState; +} + +GBool GfxState::parseBlendMode(Object *obj, GfxBlendMode *mode) { + Object obj2; + int i, j; + + if (obj->isName()) { + for (i = 0; i < nGfxBlendModeNames; ++i) { + if (!strcmp(obj->getName(), gfxBlendModeNames[i].name)) { + *mode = gfxBlendModeNames[i].mode; + return gTrue; + } + } + return gFalse; + } else if (obj->isArray()) { + for (i = 0; i < obj->arrayGetLength(); ++i) { + obj->arrayGet(i, &obj2); + if (!obj2.isName()) { + obj2.free(); + return gFalse; + } + for (j = 0; j < nGfxBlendModeNames; ++j) { + if (!strcmp(obj2.getName(), gfxBlendModeNames[j].name)) { + obj2.free(); + *mode = gfxBlendModeNames[j].mode; + return gTrue; + } + } + obj2.free(); + } + *mode = gfxBlendNormal; + return gTrue; + } else { + return gFalse; + } +} diff --git a/poppler/GfxState.h b/poppler/GfxState.h new file mode 100644 index 0000000..856ec3f --- /dev/null +++ b/poppler/GfxState.h @@ -0,0 +1,1549 @@ +//======================================================================== +// +// GfxState.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2006, 2007 Jeff Muizelaar +// Copyright (C) 2006 Carlos Garcia Campos +// Copyright (C) 2009 Koji Otani +// Copyright (C) 2009-2011 Albert Astals Cid +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Andrea Canciani +// Copyright (C) 2011 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GFXSTATE_H +#define GFXSTATE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" + +#include "goo/gtypes.h" +#include "Object.h" +#include "Function.h" + +#include + +class Array; +class Gfx; +class GfxFont; +class PDFRectangle; +class GfxShading; +class PopplerCache; + +class Matrix { +public: + double m[6]; + + GBool invertTo(Matrix *other) const; + void transform(double x, double y, double *tx, double *ty) const; + double determinant() const { return m[0] * m[3] - m[1] * m[2]; } + double norm() const; +}; + +//------------------------------------------------------------------------ +// GfxBlendMode +//------------------------------------------------------------------------ + +enum GfxBlendMode { + gfxBlendNormal, + gfxBlendMultiply, + gfxBlendScreen, + gfxBlendOverlay, + gfxBlendDarken, + gfxBlendLighten, + gfxBlendColorDodge, + gfxBlendColorBurn, + gfxBlendHardLight, + gfxBlendSoftLight, + gfxBlendDifference, + gfxBlendExclusion, + gfxBlendHue, + gfxBlendSaturation, + gfxBlendColor, + gfxBlendLuminosity +}; + +//------------------------------------------------------------------------ +// GfxColorComp +//------------------------------------------------------------------------ + +// 16.16 fixed point color component +typedef int GfxColorComp; + +#define gfxColorComp1 0x10000 + +static inline GfxColorComp dblToCol(double x) { + return (GfxColorComp)(x * gfxColorComp1); +} + +static inline double colToDbl(GfxColorComp x) { + return (double)x / (double)gfxColorComp1; +} + +static inline Guchar dblToByte(double x) { + return (x * 255.0); +} + +static inline double byteToDbl(Guchar x) { + return (double)x / (double)255.0; +} + +static inline GfxColorComp byteToCol(Guchar x) { + // (x / 255) << 16 = (0.0000000100000001... * x) << 16 + // = ((x << 8) + (x) + (x >> 8) + ...) << 16 + // = (x << 8) + (x) + (x >> 7) + // [for rounding] + return (GfxColorComp)((x << 8) + x + (x >> 7)); +} + +static inline Guchar colToByte(GfxColorComp x) { + // 255 * x + 0.5 = 256 * x - x + 0x8000 + return (Guchar)(((x << 8) - x + 0x8000) >> 16); +} + +//------------------------------------------------------------------------ +// GfxColor +//------------------------------------------------------------------------ + +#define gfxColorMaxComps funcMaxOutputs + +struct GfxColor { + GfxColorComp c[gfxColorMaxComps]; +}; + +//------------------------------------------------------------------------ +// GfxGray +//------------------------------------------------------------------------ + +typedef GfxColorComp GfxGray; + +//------------------------------------------------------------------------ +// GfxRGB +//------------------------------------------------------------------------ + +struct GfxRGB { + GfxColorComp r, g, b; +}; + +//------------------------------------------------------------------------ +// GfxCMYK +//------------------------------------------------------------------------ + +struct GfxCMYK { + GfxColorComp c, m, y, k; +}; + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +// NB: The nGfxColorSpaceModes constant and the gfxColorSpaceModeNames +// array defined in GfxState.cc must match this enum. +enum GfxColorSpaceMode { + csDeviceGray, + csCalGray, + csDeviceRGB, + csCalRGB, + csDeviceCMYK, + csLab, + csICCBased, + csIndexed, + csSeparation, + csDeviceN, + csPattern +}; + +// wrapper of cmsHTRANSFORM to copy +class GfxColorTransform { +public: + void doTransform(void *in, void *out, unsigned int size); + // transformA should be a cmsHTRANSFORM + GfxColorTransform(void *transformA); + ~GfxColorTransform(); + void ref(); + unsigned int unref(); +private: + GfxColorTransform() {} + void *transform; + unsigned int refCount; +}; + +class GfxColorSpace { +public: + + GfxColorSpace(); + virtual ~GfxColorSpace(); + virtual GfxColorSpace *copy() = 0; + virtual GfxColorSpaceMode getMode() = 0; + + // Construct a color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Object *csObj, Gfx *gfx, int recursion = 0); + + // Convert to gray, RGB, or CMYK. + virtual void getGray(GfxColor *color, GfxGray *gray) = 0; + virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0; + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0; + virtual void getGrayLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getGrayLine this should not happen"); } + virtual void getRGBLine(Guchar * /*in*/, unsigned int * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getRGBLine (first variant) this should not happen"); } + virtual void getRGBLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getRGBLine (second variant) this should not happen"); } + virtual void getRGBXLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getRGBXLine this should not happen"); } + + // Does this ColorSpace support getRGBLine? + virtual GBool useGetRGBLine() { return gFalse; } + // Does this ColorSpace support getGrayLine? + virtual GBool useGetGrayLine() { return gFalse; } + + // Return the number of color components. + virtual int getNComps() = 0; + + // Get this color space's default color. + virtual void getDefaultColor(GfxColor *color) = 0; + + // Return the default ranges for each component, assuming an image + // with a max pixel value of . + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Returns true if painting operations in this color space never + // mark the page (e.g., the "None" colorant). + virtual GBool isNonMarking() { return gFalse; } + + // Return the color space's overprint mask. + Guint getOverprintMask() { return overprintMask; } + + // Return the number of color space modes + static int getNumColorSpaceModes(); + + // Return the name of the th color space mode. + static const char *getColorSpaceModeName(int idx); + +#ifdef USE_CMS + static int setupColorProfiles(); + // displayProfileA should be a cmsHPROFILE + static void setDisplayProfile(void *displayProfileA); + static void setDisplayProfileName(GooString *name); + // result will be a cmsHPROFILE + static void *getRGBProfile(); + // result will be a cmsHPROFILE + static void *getDisplayProfile(); +#endif +protected: + + Guint overprintMask; +}; + +//------------------------------------------------------------------------ +// GfxDeviceGrayColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceGrayColorSpace: public GfxColorSpace { +public: + + GfxDeviceGrayColorSpace(); + virtual ~GfxDeviceGrayColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceGray; } + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getGrayLine(Guchar *in, Guchar *out, int length); + virtual void getRGBLine(Guchar *in, unsigned int *out, int length); + virtual void getRGBLine(Guchar *in, Guchar *out, int length); + virtual void getRGBXLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine() { return gTrue; } + virtual GBool useGetGrayLine() { return gTrue; } + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + +private: +}; + +//------------------------------------------------------------------------ +// GfxCalGrayColorSpace +//------------------------------------------------------------------------ + +class GfxCalGrayColorSpace: public GfxColorSpace { +public: + + GfxCalGrayColorSpace(); + virtual ~GfxCalGrayColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csCalGray; } + + // Construct a CalGray color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + + // CalGray-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getGamma() { return gamma; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double gamma; // gamma value + double kr, kg, kb; // gamut mapping mulitpliers + void getXYZ(GfxColor *color, double *pX, double *pY, double *pZ); +}; + +//------------------------------------------------------------------------ +// GfxDeviceRGBColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceRGBColorSpace: public GfxColorSpace { +public: + + GfxDeviceRGBColorSpace(); + virtual ~GfxDeviceRGBColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceRGB; } + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getGrayLine(Guchar *in, Guchar *out, int length); + virtual void getRGBLine(Guchar *in, unsigned int *out, int length); + virtual void getRGBLine(Guchar *in, Guchar *out, int length); + virtual void getRGBXLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine() { return gTrue; } + virtual GBool useGetGrayLine() { return gTrue; } + + virtual int getNComps() { return 3; } + virtual void getDefaultColor(GfxColor *color); + +private: +}; + +//------------------------------------------------------------------------ +// GfxCalRGBColorSpace +//------------------------------------------------------------------------ + +class GfxCalRGBColorSpace: public GfxColorSpace { +public: + + GfxCalRGBColorSpace(); + virtual ~GfxCalRGBColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csCalRGB; } + + // Construct a CalRGB color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + virtual void getDefaultColor(GfxColor *color); + + // CalRGB-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getGammaR() { return gammaR; } + double getGammaG() { return gammaG; } + double getGammaB() { return gammaB; } + double *getMatrix() { return mat; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double gammaR, gammaG, gammaB; // gamma values + double mat[9]; // ABC -> XYZ transform matrix + double kr, kg, kb; // gamut mapping mulitpliers + void getXYZ(GfxColor *color, double *pX, double *pY, double *pZ); +}; + +//------------------------------------------------------------------------ +// GfxDeviceCMYKColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceCMYKColorSpace: public GfxColorSpace { +public: + + GfxDeviceCMYKColorSpace(); + virtual ~GfxDeviceCMYKColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; } + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getRGBLine(Guchar *in, unsigned int *out, int length); + virtual void getRGBLine(Guchar *, Guchar *out, int length); + virtual void getRGBXLine(Guchar *in, Guchar *out, int length); + virtual GBool useGetRGBLine() { return gTrue; } + + virtual int getNComps() { return 4; } + virtual void getDefaultColor(GfxColor *color); + +private: +}; + +//------------------------------------------------------------------------ +// GfxLabColorSpace +//------------------------------------------------------------------------ + +class GfxLabColorSpace: public GfxColorSpace { +public: + + GfxLabColorSpace(); + virtual ~GfxLabColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csLab; } + + // Construct a Lab color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + virtual void getDefaultColor(GfxColor *color); + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Lab-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getAMin() { return aMin; } + double getAMax() { return aMax; } + double getBMin() { return bMin; } + double getBMax() { return bMax; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double aMin, aMax, bMin, bMax; // range for the a and b components + double kr, kg, kb; // gamut mapping mulitpliers + void getXYZ(GfxColor *color, double *pX, double *pY, double *pZ); +}; + +//------------------------------------------------------------------------ +// GfxICCBasedColorSpace +//------------------------------------------------------------------------ + +class GfxICCBasedColorSpace: public GfxColorSpace { +public: + + GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA, + Ref *iccProfileStreamA); + virtual ~GfxICCBasedColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csICCBased; } + + // Construct an ICCBased color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getRGBLine(Guchar *in, unsigned int *out, int length); + virtual void getRGBLine(Guchar *in, Guchar *out, int length); + virtual void getRGBXLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine(); + + virtual int getNComps() { return nComps; } + virtual void getDefaultColor(GfxColor *color); + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // ICCBased-specific access. + GfxColorSpace *getAlt() { return alt; } + +private: + + int nComps; // number of color components (1, 3, or 4) + GfxColorSpace *alt; // alternate color space + double rangeMin[4]; // min values for each component + double rangeMax[4]; // max values for each component + Ref iccProfileStream; // the ICC profile +#ifdef USE_CMS + GfxColorTransform *transform; + GfxColorTransform *lineTransform; // color transform for line +#endif +}; +//------------------------------------------------------------------------ +// GfxIndexedColorSpace +//------------------------------------------------------------------------ + +class GfxIndexedColorSpace: public GfxColorSpace { +public: + + GfxIndexedColorSpace(GfxColorSpace *baseA, int indexHighA); + virtual ~GfxIndexedColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csIndexed; } + + // Construct an Indexed color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getRGBLine(Guchar *in, unsigned int *out, int length); + virtual void getRGBLine(Guchar *in, Guchar *out, int length); + virtual void getRGBXLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine() { return gTrue; } + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Indexed-specific access. + GfxColorSpace *getBase() { return base; } + int getIndexHigh() { return indexHigh; } + Guchar *getLookup() { return lookup; } + GfxColor *mapColorToBase(GfxColor *color, GfxColor *baseColor); + +private: + + GfxColorSpace *base; // base color space + int indexHigh; // max pixel value + Guchar *lookup; // lookup table +}; + +//------------------------------------------------------------------------ +// GfxSeparationColorSpace +//------------------------------------------------------------------------ + +class GfxSeparationColorSpace: public GfxColorSpace { +public: + + GfxSeparationColorSpace(GooString *nameA, GfxColorSpace *altA, + Function *funcA); + virtual ~GfxSeparationColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csSeparation; } + + // Construct a Separation color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + + virtual GBool isNonMarking() { return nonMarking; } + + // Separation-specific access. + GooString *getName() { return name; } + GfxColorSpace *getAlt() { return alt; } + Function *getFunc() { return func; } + +private: + + GfxSeparationColorSpace(GooString *nameA, GfxColorSpace *altA, + Function *funcA, GBool nonMarkingA, + Guint overprintMaskA); + + GooString *name; // colorant name + GfxColorSpace *alt; // alternate color space + Function *func; // tint transform (into alternate color space) + GBool nonMarking; +}; + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceNColorSpace: public GfxColorSpace { +public: + + GfxDeviceNColorSpace(int nCompsA, GooString **namesA, + GfxColorSpace *alt, Function *func); + virtual ~GfxDeviceNColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceN; } + + // Construct a DeviceN color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return nComps; } + virtual void getDefaultColor(GfxColor *color); + + virtual GBool isNonMarking() { return nonMarking; } + + // DeviceN-specific access. + GooString *getColorantName(int i) { return names[i]; } + GfxColorSpace *getAlt() { return alt; } + Function *getTintTransformFunc() { return func; } + +private: + + GfxDeviceNColorSpace(int nCompsA, GooString **namesA, + GfxColorSpace *alt, Function *func, + GBool nonMarkingA, Guint overprintMaskA); + + int nComps; // number of components + GooString // colorant names + *names[gfxColorMaxComps]; + GfxColorSpace *alt; // alternate color space + Function *func; // tint transform (into alternate color space) + GBool nonMarking; +}; + +//------------------------------------------------------------------------ +// GfxPatternColorSpace +//------------------------------------------------------------------------ + +class GfxPatternColorSpace: public GfxColorSpace { +public: + + GfxPatternColorSpace(GfxColorSpace *underA); + virtual ~GfxPatternColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csPattern; } + + // Construct a Pattern color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr, Gfx *gfx, int recursion); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 0; } + virtual void getDefaultColor(GfxColor *color); + + // Pattern-specific access. + GfxColorSpace *getUnder() { return under; } + +private: + + GfxColorSpace *under; // underlying color space (for uncolored + // patterns) +}; + +//------------------------------------------------------------------------ +// GfxPattern +//------------------------------------------------------------------------ + +class GfxPattern { +public: + + GfxPattern(int typeA); + virtual ~GfxPattern(); + + static GfxPattern *parse(Object *obj, Gfx *gfx); + + virtual GfxPattern *copy() = 0; + + int getType() { return type; } + +private: + + int type; +}; + +//------------------------------------------------------------------------ +// GfxTilingPattern +//------------------------------------------------------------------------ + +class GfxTilingPattern: public GfxPattern { +public: + + static GfxTilingPattern *parse(Object *patObj); + virtual ~GfxTilingPattern(); + + virtual GfxPattern *copy(); + + int getPaintType() { return paintType; } + int getTilingType() { return tilingType; } + double *getBBox() { return bbox; } + double getXStep() { return xStep; } + double getYStep() { return yStep; } + Dict *getResDict() + { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; } + double *getMatrix() { return matrix; } + Object *getContentStream() { return &contentStream; } + +private: + + GfxTilingPattern(int paintTypeA, int tilingTypeA, + double *bboxA, double xStepA, double yStepA, + Object *resDictA, double *matrixA, + Object *contentStreamA); + + int paintType; + int tilingType; + double bbox[4]; + double xStep, yStep; + Object resDict; + double matrix[6]; + Object contentStream; +}; + +//------------------------------------------------------------------------ +// GfxShadingPattern +//------------------------------------------------------------------------ + +class GfxShadingPattern: public GfxPattern { +public: + + static GfxShadingPattern *parse(Object *patObj, Gfx *gfx); + virtual ~GfxShadingPattern(); + + virtual GfxPattern *copy(); + + GfxShading *getShading() { return shading; } + double *getMatrix() { return matrix; } + +private: + + GfxShadingPattern(GfxShading *shadingA, double *matrixA); + + GfxShading *shading; + double matrix[6]; +}; + +//------------------------------------------------------------------------ +// GfxShading +//------------------------------------------------------------------------ + +class GfxShading { +public: + + GfxShading(int typeA); + GfxShading(GfxShading *shading); + virtual ~GfxShading(); + + static GfxShading *parse(Object *obj, Gfx *gfx); + + virtual GfxShading *copy() = 0; + + int getType() { return type; } + GfxColorSpace *getColorSpace() { return colorSpace; } + GfxColor *getBackground() { return &background; } + GBool getHasBackground() { return hasBackground; } + void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + GBool getHasBBox() { return hasBBox; } + +protected: + + GBool init(Dict *dict, Gfx *gfx); + + int type; + GfxColorSpace *colorSpace; + GfxColor background; + GBool hasBackground; + double xMin, yMin, xMax, yMax; + GBool hasBBox; +}; + +//------------------------------------------------------------------------ +// GfxUnivariateShading +//------------------------------------------------------------------------ + +class GfxUnivariateShading: public GfxShading { +public: + + GfxUnivariateShading(int typeA, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A); + GfxUnivariateShading(GfxUnivariateShading *shading); + virtual ~GfxUnivariateShading(); + + double getDomain0() { return t0; } + double getDomain1() { return t1; } + GBool getExtend0() { return extend0; } + GBool getExtend1() { return extend1; } + int getNFuncs() { return nFuncs; } + Function *getFunc(int i) { return funcs[i]; } + void getColor(double t, GfxColor *color); + + void setupCache(const Matrix *ctm, + double xMin, double yMin, + double xMax, double yMax); + + virtual void getParameterRange(double *lower, double *upper, + double xMin, double yMin, + double xMax, double yMax) = 0; + + virtual double getDistance(double tMin, double tMax) = 0; + +private: + + double t0, t1; + Function *funcs[gfxColorMaxComps]; + int nFuncs; + GBool extend0, extend1; + + int cacheSize, lastMatch; + double *cacheBounds; + double *cacheCoeff; + double *cacheValues; +}; + +//------------------------------------------------------------------------ +// GfxFunctionShading +//------------------------------------------------------------------------ + +class GfxFunctionShading: public GfxShading { +public: + + GfxFunctionShading(double x0A, double y0A, + double x1A, double y1A, + double *matrixA, + Function **funcsA, int nFuncsA); + GfxFunctionShading(GfxFunctionShading *shading); + virtual ~GfxFunctionShading(); + + static GfxFunctionShading *parse(Dict *dict, Gfx *gfx); + + virtual GfxShading *copy(); + + void getDomain(double *x0A, double *y0A, double *x1A, double *y1A) + { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; } + double *getMatrix() { return matrix; } + int getNFuncs() { return nFuncs; } + Function *getFunc(int i) { return funcs[i]; } + void getColor(double x, double y, GfxColor *color); + +private: + + double x0, y0, x1, y1; + double matrix[6]; + Function *funcs[gfxColorMaxComps]; + int nFuncs; +}; + +//------------------------------------------------------------------------ +// GfxAxialShading +//------------------------------------------------------------------------ + +class GfxAxialShading: public GfxUnivariateShading { +public: + + GfxAxialShading(double x0A, double y0A, + double x1A, double y1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A); + GfxAxialShading(GfxAxialShading *shading); + virtual ~GfxAxialShading(); + + static GfxAxialShading *parse(Dict *dict, Gfx *gfx); + + virtual GfxShading *copy(); + + void getCoords(double *x0A, double *y0A, double *x1A, double *y1A) + { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; } + + virtual void getParameterRange(double *lower, double *upper, + double xMin, double yMin, + double xMax, double yMax); + + virtual double getDistance(double tMin, double tMax); + +private: + + double x0, y0, x1, y1; +}; + +//------------------------------------------------------------------------ +// GfxRadialShading +//------------------------------------------------------------------------ + +class GfxRadialShading: public GfxUnivariateShading { +public: + + GfxRadialShading(double x0A, double y0A, double r0A, + double x1A, double y1A, double r1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A); + GfxRadialShading(GfxRadialShading *shading); + virtual ~GfxRadialShading(); + + static GfxRadialShading *parse(Dict *dict, Gfx *gfx); + + virtual GfxShading *copy(); + + void getCoords(double *x0A, double *y0A, double *r0A, + double *x1A, double *y1A, double *r1A) + { *x0A = x0; *y0A = y0; *r0A = r0; *x1A = x1; *y1A = y1; *r1A = r1; } + + virtual void getParameterRange(double *lower, double *upper, + double xMin, double yMin, + double xMax, double yMax); + + virtual double getDistance(double tMin, double tMax); + +private: + + double x0, y0, r0, x1, y1, r1; +}; + +//------------------------------------------------------------------------ +// GfxGouraudTriangleShading +//------------------------------------------------------------------------ + +struct GfxGouraudVertex { + double x, y; + GfxColor color; +}; + +class GfxGouraudTriangleShading: public GfxShading { +public: + + GfxGouraudTriangleShading(int typeA, + GfxGouraudVertex *verticesA, int nVerticesA, + int (*trianglesA)[3], int nTrianglesA, + Function **funcsA, int nFuncsA); + GfxGouraudTriangleShading(GfxGouraudTriangleShading *shading); + virtual ~GfxGouraudTriangleShading(); + + static GfxGouraudTriangleShading *parse(int typeA, Dict *dict, Stream *str, Gfx *gfx); + + virtual GfxShading *copy(); + + int getNTriangles() { return nTriangles; } + + bool isParameterized() const { return nFuncs > 0; } + + /** + * @precondition isParameterized() == true + */ + double getParameterDomainMin() const { assert(isParameterized()); return funcs[0]->getDomainMin(0); } + + /** + * @precondition isParameterized() == true + */ + double getParameterDomainMax() const { assert(isParameterized()); return funcs[0]->getDomainMax(0); } + + /** + * @precondition isParameterized() == false + */ + void getTriangle(int i, double *x0, double *y0, GfxColor *color0, + double *x1, double *y1, GfxColor *color1, + double *x2, double *y2, GfxColor *color2); + + /** + * Variant for functions. + * + * @precondition isParameterized() == true + */ + void getTriangle(int i, double *x0, double *y0, double *color0, + double *x1, double *y1, double *color1, + double *x2, double *y2, double *color2); + + void getParameterizedColor(double t, GfxColor *color); + +private: + + GfxGouraudVertex *vertices; + int nVertices; + int (*triangles)[3]; + int nTriangles; + Function *funcs[gfxColorMaxComps]; + int nFuncs; +}; + +//------------------------------------------------------------------------ +// GfxPatchMeshShading +//------------------------------------------------------------------------ + +/** + * A tensor product cubic bezier patch consisting of 4x4 points and 4 color + * values. + * + * See the Shading Type 7 specifications. Note that Shading Type 6 is also + * represented using GfxPatch. + */ +struct GfxPatch { + /** + * Represents a single color value for the patch. + */ + struct ColorValue { + /** + * For parameterized patches, only element 0 is valid; it contains + * the single parameter. + * + * For non-parameterized patches, c contains all color components + * as decoded from the input stream. In this case, you will need to + * use dblToCol() before assigning them to GfxColor. + */ + double c[gfxColorMaxComps]; + }; + + double x[4][4]; + double y[4][4]; + ColorValue color[2][2]; +}; + +class GfxPatchMeshShading: public GfxShading { +public: + + GfxPatchMeshShading(int typeA, GfxPatch *patchesA, int nPatchesA, + Function **funcsA, int nFuncsA); + GfxPatchMeshShading(GfxPatchMeshShading *shading); + virtual ~GfxPatchMeshShading(); + + static GfxPatchMeshShading *parse(int typeA, Dict *dict, Stream *str, Gfx *gfx); + + virtual GfxShading *copy(); + + int getNPatches() { return nPatches; } + GfxPatch *getPatch(int i) { return &patches[i]; } + + bool isParameterized() const { return nFuncs > 0; } + + /** + * @precondition isParameterized() == true + */ + double getParameterDomainMin() const { assert(isParameterized()); return funcs[0]->getDomainMin(0); } + + /** + * @precondition isParameterized() == true + */ + double getParameterDomainMax() const { assert(isParameterized()); return funcs[0]->getDomainMax(0); } + + void getParameterizedColor(double t, GfxColor *color); + +private: + + GfxPatch *patches; + int nPatches; + Function *funcs[gfxColorMaxComps]; + int nFuncs; +}; + +//------------------------------------------------------------------------ +// GfxImageColorMap +//------------------------------------------------------------------------ + +class GfxImageColorMap { +public: + + // Constructor. + GfxImageColorMap(int bitsA, Object *decode, GfxColorSpace *colorSpaceA); + + // Destructor. + ~GfxImageColorMap(); + + // Return a copy of this color map. + GfxImageColorMap *copy() { return new GfxImageColorMap(this); } + + // Is color map valid? + GBool isOk() { return ok; } + + // Get the color space. + GfxColorSpace *getColorSpace() { return colorSpace; } + + // Get stream decoding info. + int getNumPixelComps() { return nComps; } + int getBits() { return bits; } + + // Get decode table. + double getDecodeLow(int i) { return decodeLow[i]; } + double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; } + + bool useRGBLine() { return (colorSpace2 && colorSpace2->useGetRGBLine ()) || (!colorSpace2 && colorSpace->useGetRGBLine ()); } + + // Convert an image pixel to a color. + void getGray(Guchar *x, GfxGray *gray); + void getRGB(Guchar *x, GfxRGB *rgb); + void getRGBLine(Guchar *in, unsigned int *out, int length); + void getRGBLine(Guchar *in, Guchar *out, int length); + void getRGBXLine(Guchar *in, Guchar *out, int length); + void getGrayLine(Guchar *in, Guchar *out, int length); + void getCMYK(Guchar *x, GfxCMYK *cmyk); + void getColor(Guchar *x, GfxColor *color); + +private: + + GfxImageColorMap(GfxImageColorMap *colorMap); + + GfxColorSpace *colorSpace; // the image color space + int bits; // bits per component + int nComps; // number of components in a pixel + GfxColorSpace *colorSpace2; // secondary color space + int nComps2; // number of components in colorSpace2 + GfxColorComp * // lookup table + lookup[gfxColorMaxComps]; + GfxColorComp * // optimized case lookup table + lookup2[gfxColorMaxComps]; + Guchar *byte_lookup; + double // minimum values for each component + decodeLow[gfxColorMaxComps]; + double // max - min value for each component + decodeRange[gfxColorMaxComps]; + GBool ok; +}; + +//------------------------------------------------------------------------ +// GfxSubpath and GfxPath +//------------------------------------------------------------------------ + +class GfxSubpath { +public: + + // Constructor. + GfxSubpath(double x1, double y1); + + // Destructor. + ~GfxSubpath(); + + // Copy. + GfxSubpath *copy() { return new GfxSubpath(this); } + + // Get points. + int getNumPoints() { return n; } + double getX(int i) { return x[i]; } + double getY(int i) { return y[i]; } + GBool getCurve(int i) { return curve[i]; } + + void setX(int i, double a) { x[i] = a; } + void setY(int i, double a) { y[i] = a; } + + // Get last point. + double getLastX() { return x[n-1]; } + double getLastY() { return y[n-1]; } + + // Add a line segment. + void lineTo(double x1, double y1); + + // Add a Bezier curve. + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + + // Close the subpath. + void close(); + GBool isClosed() { return closed; } + + // Add (, ) to each point in the subpath. + void offset(double dx, double dy); + +private: + + double *x, *y; // points + GBool *curve; // curve[i] => point i is a control point + // for a Bezier curve + int n; // number of points + int size; // size of x/y arrays + GBool closed; // set if path is closed + + GfxSubpath(GfxSubpath *subpath); +}; + +class GfxPath { +public: + + // Constructor. + GfxPath(); + + // Destructor. + ~GfxPath(); + + // Copy. + GfxPath *copy() + { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); } + + // Is there a current point? + GBool isCurPt() { return n > 0 || justMoved; } + + // Is the path non-empty, i.e., is there at least one segment? + GBool isPath() { return n > 0; } + + // Get subpaths. + int getNumSubpaths() { return n; } + GfxSubpath *getSubpath(int i) { return subpaths[i]; } + + // Get last point on last subpath. + double getLastX() { return subpaths[n-1]->getLastX(); } + double getLastY() { return subpaths[n-1]->getLastY(); } + + // Move the current point. + void moveTo(double x, double y); + + // Add a segment to the last subpath. + void lineTo(double x, double y); + + // Add a Bezier curve to the last subpath + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + + // Close the last subpath. + void close(); + + // Append to . + void append(GfxPath *path); + + // Add (, ) to each point in the path. + void offset(double dx, double dy); + +private: + + GBool justMoved; // set if a new subpath was just started + double firstX, firstY; // first point in new subpath + GfxSubpath **subpaths; // subpaths + int n; // number of subpaths + int size; // size of subpaths array + + GfxPath(GBool justMoved1, double firstX1, double firstY1, + GfxSubpath **subpaths1, int n1, int size1); +}; + +//------------------------------------------------------------------------ +// GfxState +//------------------------------------------------------------------------ + +class GfxState { +public: + /** + * When GfxState::getReusablePath() is invoked, the currently active + * path is taken per reference and its coordinates can be re-edited. + * + * A ReusablePathIterator is intented to reduce overhead when the same + * path type is used a lot of times, only with different coordinates. It + * allows just to update the coordinates (occuring in the same order as + * in the original path). + */ + class ReusablePathIterator { + public: + /** + * Creates the ReusablePathIterator. This should only be done from + * GfxState::getReusablePath(). + * + * @param path the path as it is used so far. Changing this path, + * deleting it or starting a new path from scratch will most likely + * invalidate the iterator (and may cause serious problems). Make + * sure the path's memory structure is not changed during the + * lifetime of the ReusablePathIterator. + */ + ReusablePathIterator( GfxPath* path ); + + /** + * Returns true if and only if the current iterator position is + * beyond the last valid point. + * + * A call to setCoord() will be undefined. + */ + bool isEnd() const; + + /** + * Advances the iterator. + */ + void next(); + + /** + * Updates the coordinates associated to the current iterator + * position. + */ + void setCoord( double x, double y ); + + /** + * Resets the iterator. + */ + void reset(); + private: + GfxPath *path; + int subPathOff; + + int coordOff; + int numCoords; + + GfxSubpath *curSubPath; + }; + + // Construct a default GfxState, for a device with resolution + // x , page box , page rotation , and + // coordinate system specified by . + GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox, + int rotateA, GBool upsideDown); + + // Destructor. + ~GfxState(); + + // Copy. + GfxState *copy(GBool copyPath = gFalse) + { return new GfxState(this, copyPath); } + + // Accessors. + double getHDPI() { return hDPI; } + double getVDPI() { return vDPI; } + double *getCTM() { return ctm; } + void getCTM(Matrix *m) { memcpy (m->m, ctm, sizeof m->m); } + double getX1() { return px1; } + double getY1() { return py1; } + double getX2() { return px2; } + double getY2() { return py2; } + double getPageWidth() { return pageWidth; } + double getPageHeight() { return pageHeight; } + int getRotate() { return rotate; } + GfxColor *getFillColor() { return &fillColor; } + GfxColor *getStrokeColor() { return &strokeColor; } + void getFillGray(GfxGray *gray) + { fillColorSpace->getGray(&fillColor, gray); } + void getStrokeGray(GfxGray *gray) + { strokeColorSpace->getGray(&strokeColor, gray); } + void getFillRGB(GfxRGB *rgb) + { fillColorSpace->getRGB(&fillColor, rgb); } + void getStrokeRGB(GfxRGB *rgb) + { strokeColorSpace->getRGB(&strokeColor, rgb); } + void getFillCMYK(GfxCMYK *cmyk) + { fillColorSpace->getCMYK(&fillColor, cmyk); } + void getStrokeCMYK(GfxCMYK *cmyk) + { strokeColorSpace->getCMYK(&strokeColor, cmyk); } + GfxColorSpace *getFillColorSpace() { return fillColorSpace; } + GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; } + GfxPattern *getFillPattern() { return fillPattern; } + GfxPattern *getStrokePattern() { return strokePattern; } + GfxBlendMode getBlendMode() { return blendMode; } + double getFillOpacity() { return fillOpacity; } + double getStrokeOpacity() { return strokeOpacity; } + GBool getFillOverprint() { return fillOverprint; } + GBool getStrokeOverprint() { return strokeOverprint; } + int getOverprintMode() { return overprintMode; } + Function **getTransfer() { return transfer; } + double getLineWidth() { return lineWidth; } + void getLineDash(double **dash, int *length, double *start) + { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; } + int getFlatness() { return flatness; } + int getLineJoin() { return lineJoin; } + int getLineCap() { return lineCap; } + double getMiterLimit() { return miterLimit; } + GBool getStrokeAdjust() { return strokeAdjust; } + GBool getAlphaIsShape() { return alphaIsShape; } + GBool getTextKnockout() { return textKnockout; } + GfxFont *getFont() { return font; } + double getFontSize() { return fontSize; } + double *getTextMat() { return textMat; } + double getCharSpace() { return charSpace; } + double getWordSpace() { return wordSpace; } + double getHorizScaling() { return horizScaling; } + double getLeading() { return leading; } + double getRise() { return rise; } + int getRender() { return render; } + GfxPath *getPath() { return path; } + void setPath(GfxPath *pathA); + double getCurX() { return curX; } + double getCurY() { return curY; } + void getClipBBox(double *xMin, double *yMin, double *xMax, double *yMax) + { *xMin = clipXMin; *yMin = clipYMin; *xMax = clipXMax; *yMax = clipYMax; } + void getUserClipBBox(double *xMin, double *yMin, double *xMax, double *yMax); + double getLineX() { return lineX; } + double getLineY() { return lineY; } + + // Is there a current point/path? + GBool isCurPt() { return path->isCurPt(); } + GBool isPath() { return path->isPath(); } + + // Transforms. + void transform(double x1, double y1, double *x2, double *y2) + { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4]; + *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; } + void transformDelta(double x1, double y1, double *x2, double *y2) + { *x2 = ctm[0] * x1 + ctm[2] * y1; + *y2 = ctm[1] * x1 + ctm[3] * y1; } + void textTransform(double x1, double y1, double *x2, double *y2) + { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4]; + *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; } + void textTransformDelta(double x1, double y1, double *x2, double *y2) + { *x2 = textMat[0] * x1 + textMat[2] * y1; + *y2 = textMat[1] * x1 + textMat[3] * y1; } + double transformWidth(double w); + double getTransformedLineWidth() + { return transformWidth(lineWidth); } + double getTransformedFontSize(); + void getFontTransMat(double *m11, double *m12, double *m21, double *m22); + + // Change state parameters. + void setCTM(double a, double b, double c, + double d, double e, double f); + void concatCTM(double a, double b, double c, + double d, double e, double f); + void shiftCTM(double tx, double ty); + void setFillColorSpace(GfxColorSpace *colorSpace); + void setStrokeColorSpace(GfxColorSpace *colorSpace); + void setFillColor(GfxColor *color) { fillColor = *color; } + void setStrokeColor(GfxColor *color) { strokeColor = *color; } + void setFillPattern(GfxPattern *pattern); + void setStrokePattern(GfxPattern *pattern); + void setBlendMode(GfxBlendMode mode) { blendMode = mode; } + void setFillOpacity(double opac) { fillOpacity = opac; } + void setStrokeOpacity(double opac) { strokeOpacity = opac; } + void setFillOverprint(GBool op) { fillOverprint = op; } + void setStrokeOverprint(GBool op) { strokeOverprint = op; } + void setOverprintMode(int op) { overprintMode = op; } + void setTransfer(Function **funcs); + void setLineWidth(double width) { lineWidth = width; } + void setLineDash(double *dash, int length, double start); + void setFlatness(int flatness1) { flatness = flatness1; } + void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; } + void setLineCap(int lineCap1) { lineCap = lineCap1; } + void setMiterLimit(double limit) { miterLimit = limit; } + void setStrokeAdjust(GBool sa) { strokeAdjust = sa; } + void setAlphaIsShape(GBool ais) { alphaIsShape = ais; } + void setTextKnockout(GBool tk) { textKnockout = tk; } + void setFont(GfxFont *fontA, double fontSizeA); + void setTextMat(double a, double b, double c, + double d, double e, double f) + { textMat[0] = a; textMat[1] = b; textMat[2] = c; + textMat[3] = d; textMat[4] = e; textMat[5] = f; } + void setCharSpace(double space) + { charSpace = space; } + void setWordSpace(double space) + { wordSpace = space; } + void setHorizScaling(double scale) + { horizScaling = 0.01 * scale; } + void setLeading(double leadingA) + { leading = leadingA; } + void setRise(double riseA) + { rise = riseA; } + void setRender(int renderA) + { render = renderA; } + + // Add to path. + void moveTo(double x, double y) + { path->moveTo(curX = x, curY = y); } + void lineTo(double x, double y) + { path->lineTo(curX = x, curY = y); } + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) + { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); } + void closePath() + { path->close(); curX = path->getLastX(); curY = path->getLastY(); } + void clearPath(); + + // Update clip region. + void clip(); + void clipToStrokePath(); + void clipToRect(double xMin, double yMin, double xMax, double yMax); + + // Text position. + void textSetPos(double tx, double ty) { lineX = tx; lineY = ty; } + void textMoveTo(double tx, double ty) + { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); } + void textShift(double tx, double ty); + void shift(double dx, double dy); + + // Push/pop GfxState on/off stack. + GfxState *save(); + GfxState *restore(); + GBool hasSaves() { return saved != NULL; } + GBool isParentState(GfxState *state) { return saved == state || (saved && saved->isParentState(state)); } + + // Misc + GBool parseBlendMode(Object *obj, GfxBlendMode *mode); + + ReusablePathIterator *getReusablePath() { return new ReusablePathIterator(path); } +private: + + double hDPI, vDPI; // resolution + double ctm[6]; // coord transform matrix + double px1, py1, px2, py2; // page corners (user coords) + double pageWidth, pageHeight; // page size (pixels) + int rotate; // page rotation angle + + GfxColorSpace *fillColorSpace; // fill color space + GfxColorSpace *strokeColorSpace; // stroke color space + GfxColor fillColor; // fill color + GfxColor strokeColor; // stroke color + GfxPattern *fillPattern; // fill pattern + GfxPattern *strokePattern; // stroke pattern + GfxBlendMode blendMode; // transparency blend mode + double fillOpacity; // fill opacity + double strokeOpacity; // stroke opacity + GBool fillOverprint; // fill overprint + GBool strokeOverprint; // stroke overprint + int overprintMode; // overprint mode + Function *transfer[4]; // transfer function (entries may be: all + // NULL = identity; last three NULL = + // single function; all four non-NULL = + // R,G,B,gray functions) + + double lineWidth; // line width + double *lineDash; // line dash + int lineDashLength; + double lineDashStart; + int flatness; // curve flatness + int lineJoin; // line join style + int lineCap; // line cap style + double miterLimit; // line miter limit + GBool strokeAdjust; // stroke adjustment + GBool alphaIsShape; // alpha is shape + GBool textKnockout; // text knockout + + GfxFont *font; // font + double fontSize; // font size + double textMat[6]; // text matrix + double charSpace; // character spacing + double wordSpace; // word spacing + double horizScaling; // horizontal scaling + double leading; // text leading + double rise; // text rise + int render; // text rendering mode + + GfxPath *path; // array of path elements + double curX, curY; // current point (user coords) + double lineX, lineY; // start of current text line (text coords) + + double clipXMin, clipYMin, // bounding box for clip region + clipXMax, clipYMax; + + GfxState *saved; // next GfxState on stack + + GfxState(GfxState *state, GBool copyPath); +}; + +#endif diff --git a/poppler/GfxState_helpers.h b/poppler/GfxState_helpers.h new file mode 100644 index 0000000..bc0024e --- /dev/null +++ b/poppler/GfxState_helpers.h @@ -0,0 +1,82 @@ +//======================================================================== +// +// GfxState.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009, 2011 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "GfxState.h" + +static inline GfxColorComp clip01(GfxColorComp x) { + return (x < 0) ? 0 : (x > gfxColorComp1) ? gfxColorComp1 : x; +} + +static inline double clip01(double x) { + return (x < 0) ? 0 : (x > 1) ? 1 : x; +} + +static inline void cmykToRGBMatrixMultiplication(const double &c, const double &m, const double &y, const double &k, const double &c1, const double &m1, const double &y1, const double &k1, double &r, double &g, double &b) +{ + double x; + // this is a matrix multiplication, unrolled for performance + // C M Y K + x = c1 * m1 * y1 * k1; // 0 0 0 0 + r = g = b = x; + x = c1 * m1 * y1 * k; // 0 0 0 1 + r += 0.1373 * x; + g += 0.1216 * x; + b += 0.1255 * x; + x = c1 * m1 * y * k1; // 0 0 1 0 + r += x; + g += 0.9490 * x; + x = c1 * m1 * y * k; // 0 0 1 1 + r += 0.1098 * x; + g += 0.1020 * x; + x = c1 * m * y1 * k1; // 0 1 0 0 + r += 0.9255 * x; + b += 0.5490 * x; + x = c1 * m * y1 * k; // 0 1 0 1 + r += 0.1412 * x; + x = c1 * m * y * k1; // 0 1 1 0 + r += 0.9294 * x; + g += 0.1098 * x; + b += 0.1412 * x; + x = c1 * m * y * k; // 0 1 1 1 + r += 0.1333 * x; + x = c * m1 * y1 * k1; // 1 0 0 0 + g += 0.6784 * x; + b += 0.9373 * x; + x = c * m1 * y1 * k; // 1 0 0 1 + g += 0.0588 * x; + b += 0.1412 * x; + x = c * m1 * y * k1; // 1 0 1 0 + g += 0.6510 * x; + b += 0.3137 * x; + x = c * m1 * y * k; // 1 0 1 1 + g += 0.0745 * x; + x = c * m * y1 * k1; // 1 1 0 0 + r += 0.1804 * x; + g += 0.1922 * x; + b += 0.5725 * x; + x = c * m * y1 * k; // 1 1 0 1 + b += 0.0078 * x; + x = c * m * y * k1; // 1 1 1 0 + r += 0.2118 * x; + g += 0.2119 * x; + b += 0.2235 * x; +} diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc new file mode 100644 index 0000000..76394ca --- /dev/null +++ b/poppler/GlobalParams.cc @@ -0,0 +1,2283 @@ +//======================================================================== +// +// GlobalParams.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Martin Kretzschmar +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2005, 2007-2010, 2012 Albert Astals Cid +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2006, 2007 Jeff Muizelaar +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2006 Ed Catmur +// Copyright (C) 2007 Krzysztof Kowalczyk +// Copyright (C) 2007, 2009 Jonathan Kew +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2009, 2011, 2012 William Bader +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Patrick Spendrin +// Copyright (C) 2010 Jakub Wilk +// Copyright (C) 2011 Pino Toscano +// Copyright (C) 2011 Koji Otani +// Copyright (C) 2012 Yi Yang +// Copyright (C) 2012 Adrian Johnson +// Copyright (C) 2012 Thomas Freitag +// Copyright (C) 2012 Peter Breitenlohner +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#ifdef ENABLE_PLUGINS +# ifndef _WIN32 +# include +# endif +#endif +#ifdef _WIN32 +# include +# include +#endif +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "goo/GooHash.h" +#include "goo/gfile.h" +#include "Error.h" +#include "NameToCharCode.h" +#include "CharCodeToUnicode.h" +#include "UnicodeMap.h" +#include "CMap.h" +#include "BuiltinFontTables.h" +#include "FontEncodingTables.h" +#ifdef ENABLE_PLUGINS +# include "XpdfPluginAPI.h" +#endif +#include "GlobalParams.h" +#include "GfxFont.h" + +#if WITH_FONTCONFIGURATION_FONTCONFIG +#include +#endif + +#ifdef _WIN32 +# define strcasecmp stricmp +#else +# include +#endif + +#if MULTITHREADED +# define lockGlobalParams gLockMutex(&mutex) +# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex) +# define lockCMapCache gLockMutex(&cMapCacheMutex) +# define unlockGlobalParams gUnlockMutex(&mutex) +# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex) +# define unlockCMapCache gUnlockMutex(&cMapCacheMutex) +#else +# define lockGlobalParams +# define lockUnicodeMapCache +# define lockCMapCache +# define unlockGlobalParams +# define unlockUnicodeMapCache +# define unlockCMapCache +#endif + +#ifndef FC_WEIGHT_BOOK +#define FC_WEIGHT_BOOK 75 +#endif + +#include "NameToUnicodeTable.h" +#include "UnicodeMapTables.h" +#include "UTF8.h" + +#ifdef ENABLE_PLUGINS +# ifdef _WIN32 +extern XpdfPluginVecTable xpdfPluginVecTable; +# endif +#endif + +//------------------------------------------------------------------------ + +#define cidToUnicodeCacheSize 4 +#define unicodeToUnicodeCacheSize 4 + +//------------------------------------------------------------------------ + +GlobalParams *globalParams = NULL; + +//------------------------------------------------------------------------ +// PSFontParam16 +//------------------------------------------------------------------------ + +PSFontParam16::PSFontParam16(GooString *nameA, int wModeA, + GooString *psFontNameA, GooString *encodingA) { + name = nameA; + wMode = wModeA; + psFontName = psFontNameA; + encoding = encodingA; +} + +PSFontParam16::~PSFontParam16() { + delete name; + delete psFontName; + delete encoding; +} + +#if ENABLE_RELOCATABLE && defined(_WIN32) + +/* search for data relative to where we are installed */ + +static HMODULE hmodule; + +extern "C" { +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + hmodule = hinstDLL; + break; + } + + return TRUE; +} +} + +static char * +get_poppler_datadir (void) +{ + static char retval[MAX_PATH]; + static int beenhere = 0; + + unsigned char *p; + + if (beenhere) + return retval; + + if (!GetModuleFileName (hmodule, (CHAR *) retval, sizeof(retval) - 20)) + return POPPLER_DATADIR; + + p = _mbsrchr ((unsigned char *) retval, '\\'); + *p = '\0'; + p = _mbsrchr ((unsigned char *) retval, '\\'); + if (p) { + if (stricmp ((const char *) (p+1), "bin") == 0) + *p = '\0'; + } + strcat (retval, "\\share\\poppler"); + + beenhere = 1; + + return retval; +} + +#undef POPPLER_DATADIR +#define POPPLER_DATADIR get_poppler_datadir () + +#endif + +//------------------------------------------------------------------------ +// SysFontInfo +//------------------------------------------------------------------------ + +class SysFontInfo { +public: + + GooString *name; + GBool bold; + GBool italic; + GBool oblique; + GBool fixedWidth; + GooString *path; + SysFontType type; + int fontNum; // for TrueType collections + GooString *substituteName; + + SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA, + GooString *pathA, SysFontType typeA, int fontNumA, GooString *substituteNameA); + ~SysFontInfo(); + GBool match(SysFontInfo *fi); + GBool match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA); + GBool match(GooString *nameA, GBool boldA, GBool italicA); +}; + +SysFontInfo::SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA, + GooString *pathA, SysFontType typeA, int fontNumA, GooString *substituteNameA) { + name = nameA; + bold = boldA; + italic = italicA; + oblique = obliqueA; + fixedWidth = fixedWidthA; + path = pathA; + type = typeA; + fontNum = fontNumA; + substituteName = substituteNameA; +} + +SysFontInfo::~SysFontInfo() { + delete name; + delete path; + delete substituteName; +} + +GBool SysFontInfo::match(SysFontInfo *fi) { + return !strcasecmp(name->getCString(), fi->name->getCString()) && + bold == fi->bold && italic == fi->italic && oblique == fi->oblique && fixedWidth == fi->fixedWidth; +} + +GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA) { + return !strcasecmp(name->getCString(), nameA->getCString()) && + bold == boldA && italic == italicA && oblique == obliqueA && fixedWidth == fixedWidthA; +} + +GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA) { + return !strcasecmp(name->getCString(), nameA->getCString()) && + bold == boldA && italic == italicA; +} + +//------------------------------------------------------------------------ +// SysFontList +//------------------------------------------------------------------------ + +class SysFontList { +public: + + SysFontList(); + ~SysFontList(); + SysFontInfo *find(GooString *name, GBool isFixedWidth, GBool exact); + +#ifdef WIN32 + void scanWindowsFonts(GooString *winFontDir); +#endif +#ifdef WITH_FONTCONFIGURATION_FONTCONFIG + void addFcFont(SysFontInfo *si) {fonts->append(si);} +#endif +private: + +#ifdef WIN32 + SysFontInfo *makeWindowsFont(char *name, int fontNum, + char *path); +#endif + + GooList *fonts; // [SysFontInfo] +}; + +SysFontList::SysFontList() { + fonts = new GooList(); +} + +SysFontList::~SysFontList() { + deleteGooList(fonts, SysFontInfo); +} + +SysFontInfo *SysFontList::find(GooString *name, GBool fixedWidth, GBool exact) { + GooString *name2; + GBool bold, italic, oblique; + SysFontInfo *fi; + char c; + int n, i; + + name2 = name->copy(); + + // remove space, comma, dash chars + i = 0; + while (i < name2->getLength()) { + c = name2->getChar(i); + if (c == ' ' || c == ',' || c == '-') { + name2->del(i); + } else { + ++i; + } + } + n = name2->getLength(); + + // remove trailing "MT" (Foo-MT, Foo-BoldMT, etc.) + if (n > 2 && !strcmp(name2->getCString() + n - 2, "MT")) { + name2->del(n - 2, 2); + n -= 2; + } + + // look for "Regular" + if (n > 7 && !strcmp(name2->getCString() + n - 7, "Regular")) { + name2->del(n - 7, 7); + n -= 7; + } + + // look for "Italic" + if (n > 6 && !strcmp(name2->getCString() + n - 6, "Italic")) { + name2->del(n - 6, 6); + italic = gTrue; + n -= 6; + } else { + italic = gFalse; + } + + // look for "Oblique" + if (n > 6 && !strcmp(name2->getCString() + n - 7, "Oblique")) { + name2->del(n - 7, 7); + oblique = gTrue; + n -= 6; + } else { + oblique = gFalse; + } + + // look for "Bold" + if (n > 4 && !strcmp(name2->getCString() + n - 4, "Bold")) { + name2->del(n - 4, 4); + bold = gTrue; + n -= 4; + } else { + bold = gFalse; + } + + // remove trailing "MT" (FooMT-Bold, etc.) + if (n > 2 && !strcmp(name2->getCString() + n - 2, "MT")) { + name2->del(n - 2, 2); + n -= 2; + } + + // remove trailing "PS" + if (n > 2 && !strcmp(name2->getCString() + n - 2, "PS")) { + name2->del(n - 2, 2); + n -= 2; + } + + // remove trailing "IdentityH" + if (n > 9 && !strcmp(name2->getCString() + n - 9, "IdentityH")) { + name2->del(n - 9, 9); + n -= 9; + } + + // search for the font + fi = NULL; + for (i = 0; i < fonts->getLength(); ++i) { + fi = (SysFontInfo *)fonts->get(i); + if (fi->match(name2, bold, italic, oblique, fixedWidth)) { + break; + } + fi = NULL; + } + if (!fi && !exact && bold) { + // try ignoring the bold flag + for (i = 0; i < fonts->getLength(); ++i) { + fi = (SysFontInfo *)fonts->get(i); + if (fi->match(name2, gFalse, italic)) { + break; + } + fi = NULL; + } + } + if (!fi && !exact && (bold || italic)) { + // try ignoring the bold and italic flags + for (i = 0; i < fonts->getLength(); ++i) { + fi = (SysFontInfo *)fonts->get(i); + if (fi->match(name2, gFalse, gFalse)) { + break; + } + fi = NULL; + } + } + + delete name2; + return fi; +} + + +#ifdef ENABLE_PLUGINS +//------------------------------------------------------------------------ +// Plugin +//------------------------------------------------------------------------ + +class Plugin { +public: + + static Plugin *load(char *type, char *name); + ~Plugin(); + +private: + +#ifdef _WIN32 + Plugin(HMODULE libA); + HMODULE lib; +#else + Plugin(void *dlA); + void *dl; +#endif +}; + +Plugin *Plugin::load(char *type, char *name) { + GooString *path; + Plugin *plugin; + XpdfPluginVecTable *vt; + XpdfBool (*xpdfInitPlugin)(void); +#ifdef _WIN32 + HMODULE libA; +#else + void *dlA; +#endif + + path = globalParams->getBaseDir(); + appendToPath(path, "plugins"); + appendToPath(path, type); + appendToPath(path, name); + +#ifdef _WIN32 + path->append(".dll"); + if (!(libA = LoadLibrary(path->getCString()))) { + error(errIO, -1, "Failed to load plugin '{0:t}'", path); + goto err1; + } + if (!(vt = (XpdfPluginVecTable *) + GetProcAddress(libA, "xpdfPluginVecTable"))) { + error(errIO, -1, "Failed to find xpdfPluginVecTable in plugin '{0:t}'", + path); + goto err2; + } +#else + //~ need to deal with other extensions here + path->append(".so"); + if (!(dlA = dlopen(path->getCString(), RTLD_NOW))) { + error(errIO, -1, "Failed to load plugin '{0:t}': {1:s}", + path, dlerror()); + goto err1; + } + if (!(vt = (XpdfPluginVecTable *)dlsym(dlA, "xpdfPluginVecTable"))) { + error(errIO, -1, "Failed to find xpdfPluginVecTable in plugin '{0:t}'", + path); + goto err2; + } +#endif + + if (vt->version != xpdfPluginVecTable.version) { + error(errIO, -1, "Plugin '{0:t}' is wrong version", path); + goto err2; + } + memcpy(vt, &xpdfPluginVecTable, sizeof(xpdfPluginVecTable)); + +#ifdef _WIN32 + if (!(xpdfInitPlugin = (XpdfBool (*)(void)) + GetProcAddress(libA, "xpdfInitPlugin"))) { + error(errIO, -1, "Failed to find xpdfInitPlugin in plugin '{0:t}'", + path); + goto err2; + } +#else + if (!(xpdfInitPlugin = (XpdfBool (*)(void))dlsym(dlA, "xpdfInitPlugin"))) { + error(errIO, -1, "Failed to find xpdfInitPlugin in plugin '{0:t}'", + path); + goto err2; + } +#endif + + if (!(*xpdfInitPlugin)()) { + error(errIO, -1, "Initialization of plugin '{0:t}' failed", path); + goto err2; + } + +#ifdef _WIN32 + plugin = new Plugin(libA); +#else + plugin = new Plugin(dlA); +#endif + + delete path; + return plugin; + + err2: +#ifdef _WIN32 + FreeLibrary(libA); +#else + dlclose(dlA); +#endif + err1: + delete path; + return NULL; +} + +#ifdef _WIN32 +Plugin::Plugin(HMODULE libA) { + lib = libA; +} +#else +Plugin::Plugin(void *dlA) { + dl = dlA; +} +#endif + +Plugin::~Plugin() { + void (*xpdfFreePlugin)(void); + +#ifdef _WIN32 + if ((xpdfFreePlugin = (void (*)(void)) + GetProcAddress(lib, "xpdfFreePlugin"))) { + (*xpdfFreePlugin)(); + } + FreeLibrary(lib); +#else + if ((xpdfFreePlugin = (void (*)(void))dlsym(dl, "xpdfFreePlugin"))) { + (*xpdfFreePlugin)(); + } + dlclose(dl); +#endif +} + +#endif // ENABLE_PLUGINS + +//------------------------------------------------------------------------ +// parsing +//------------------------------------------------------------------------ + +GlobalParams::GlobalParams(const char *customPopplerDataDir) + : popplerDataDir(customPopplerDataDir) +{ + UnicodeMap *map; + int i; + +#if MULTITHREADED + gInitMutex(&mutex); + gInitMutex(&unicodeMapCacheMutex); + gInitMutex(&cMapCacheMutex); +#endif + + initBuiltinFontTables(); + + // scan the encoding in reverse because we want the lowest-numbered + // index for each char name ('space' is encoded twice) + macRomanReverseMap = new NameToCharCode(); + for (i = 255; i >= 0; --i) { + if (macRomanEncoding[i]) { + macRomanReverseMap->add(macRomanEncoding[i], (CharCode)i); + } + } + +#ifdef _WIN32 + // baseDir will be set by a call to setBaseDir + baseDir = new GooString(); + substFiles = new GooHash(gTrue); +#else + baseDir = appendToPath(getHomeDir(), ".xpdf"); +#endif + nameToUnicode = new NameToCharCode(); + cidToUnicodes = new GooHash(gTrue); + unicodeToUnicodes = new GooHash(gTrue); + residentUnicodeMaps = new GooHash(); + unicodeMaps = new GooHash(gTrue); + cMapDirs = new GooHash(gTrue); + toUnicodeDirs = new GooList(); + fontFiles = new GooHash(gTrue); + fontDirs = new GooList(); + ccFontFiles = new GooHash(gTrue); + sysFonts = new SysFontList(); + psExpandSmaller = gFalse; + psShrinkLarger = gTrue; + psCenter = gTrue; + psLevel = psLevel2; + psFile = NULL; + psResidentFonts = new GooHash(gTrue); + psResidentFonts16 = new GooList(); + psResidentFontsCC = new GooList(); + psEmbedType1 = gTrue; + psEmbedTrueType = gTrue; + psEmbedCIDPostScript = gTrue; + psEmbedCIDTrueType = gTrue; + psFontPassthrough = gFalse; + psPreload = gFalse; + psOPI = gFalse; + psASCIIHex = gFalse; + psBinary = gFalse; + psUncompressPreloadedImages = gFalse; + psRasterResolution = 300; + psRasterMono = gFalse; + textEncoding = new GooString("UTF-8"); +#if defined(_WIN32) + textEOL = eolDOS; +#elif defined(MACOS) + textEOL = eolMac; +#else + textEOL = eolUnix; +#endif + textPageBreaks = gTrue; + textKeepTinyChars = gFalse; + enableFreeType = gTrue; + antialias = gTrue; + vectorAntialias = gTrue; + antialiasPrinting = gFalse; + strokeAdjust = gTrue; + screenType = screenUnset; + screenSize = -1; + screenDotRadius = -1; + screenGamma = 1.0; + screenBlackThreshold = 0.0; + screenWhiteThreshold = 1.0; + minLineWidth = 0.0; + overprintPreview = gFalse; + mapNumericCharNames = gTrue; + mapUnknownCharNames = gFalse; + printCommands = gFalse; + profileCommands = gFalse; + errQuiet = gFalse; + + cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize); + unicodeToUnicodeCache = + new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize); + unicodeMapCache = new UnicodeMapCache(); + cMapCache = new CMapCache(); + + baseFontsInitialized = gFalse; +#ifdef ENABLE_PLUGINS + plugins = new GooList(); + securityHandlers = new GooList(); +#endif + + // set up the initial nameToUnicode table + for (i = 0; nameToUnicodeTab[i].name; ++i) { + nameToUnicode->add(nameToUnicodeTab[i].name, nameToUnicodeTab[i].u); + } + + // set up the residentUnicodeMaps table + map = new UnicodeMap("Latin1", gFalse, + latin1UnicodeMapRanges, latin1UnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("ASCII7", gFalse, + ascii7UnicodeMapRanges, ascii7UnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("Symbol", gFalse, + symbolUnicodeMapRanges, symbolUnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges, + zapfDingbatsUnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("UTF-8", gTrue, &mapUTF8); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("UCS-2", gTrue, &mapUCS2); + residentUnicodeMaps->add(map->getEncodingName(), map); + + scanEncodingDirs(); +} + +void GlobalParams::scanEncodingDirs() { + GDir *dir; + GDirEntry *entry; + const char *dataRoot = popplerDataDir ? popplerDataDir : POPPLER_DATADIR; + + // allocate buffer large enough to append "/nameToUnicode" + size_t bufSize = strlen(dataRoot) + strlen("/nameToUnicode") + 1; + char *dataPathBuffer = new char[bufSize]; + + snprintf(dataPathBuffer, bufSize, "%s/nameToUnicode", dataRoot); + dir = new GDir(dataPathBuffer, gTrue); + while (entry = dir->getNextEntry(), entry != NULL) { + if (!entry->isDir()) { + parseNameToUnicode(entry->getFullPath()); + } + delete entry; + } + delete dir; + + snprintf(dataPathBuffer, bufSize, "%s/cidToUnicode", dataRoot); + dir = new GDir(dataPathBuffer, gFalse); + while (entry = dir->getNextEntry(), entry != NULL) { + addCIDToUnicode(entry->getName(), entry->getFullPath()); + delete entry; + } + delete dir; + + snprintf(dataPathBuffer, bufSize, "%s/unicodeMap", dataRoot); + dir = new GDir(dataPathBuffer, gFalse); + while (entry = dir->getNextEntry(), entry != NULL) { + addUnicodeMap(entry->getName(), entry->getFullPath()); + delete entry; + } + delete dir; + + snprintf(dataPathBuffer, bufSize, "%s/cMap", dataRoot); + dir = new GDir(dataPathBuffer, gFalse); + while (entry = dir->getNextEntry(), entry != NULL) { + addCMapDir(entry->getName(), entry->getFullPath()); + toUnicodeDirs->append(entry->getFullPath()->copy()); + delete entry; + } + delete dir; + + delete[] dataPathBuffer; +} + +void GlobalParams::parseNameToUnicode(GooString *name) { + char *tok1, *tok2; + FILE *f; + char buf[256]; + int line; + Unicode u; + char *tokptr; + + if (!(f = openFile(name->getCString(), "r"))) { + error(errIO, -1, "Couldn't open 'nameToUnicode' file '{0:t}'", + name); + return; + } + line = 1; + while (getLine(buf, sizeof(buf), f)) { + tok1 = strtok_r(buf, " \t\r\n", &tokptr); + tok2 = strtok_r(NULL, " \t\r\n", &tokptr); + if (tok1 && tok2) { + sscanf(tok1, "%x", &u); + nameToUnicode->add(tok2, u); + } else { + error(errConfig, -1, "Bad line in 'nameToUnicode' file ({0:t}:{1:d})", + name, line); + } + ++line; + } + fclose(f); +} + +void GlobalParams::addCIDToUnicode(GooString *collection, + GooString *fileName) { + GooString *old; + + if ((old = (GooString *)cidToUnicodes->remove(collection))) { + delete old; + } + cidToUnicodes->add(collection->copy(), fileName->copy()); +} + +void GlobalParams::addUnicodeMap(GooString *encodingName, GooString *fileName) +{ + GooString *old; + + if ((old = (GooString *)unicodeMaps->remove(encodingName))) { + delete old; + } + unicodeMaps->add(encodingName->copy(), fileName->copy()); +} + +void GlobalParams::addCMapDir(GooString *collection, GooString *dir) { + GooList *list; + + if (!(list = (GooList *)cMapDirs->lookup(collection))) { + list = new GooList(); + cMapDirs->add(collection->copy(), list); + } + list->append(dir->copy()); +} + +GBool GlobalParams::parseYesNo2(const char *token, GBool *flag) { + if (!strcmp(token, "yes")) { + *flag = gTrue; + } else if (!strcmp(token, "no")) { + *flag = gFalse; + } else { + return gFalse; + } + return gTrue; +} + +GlobalParams::~GlobalParams() { + freeBuiltinFontTables(); + + delete macRomanReverseMap; + + delete baseDir; + delete nameToUnicode; + deleteGooHash(cidToUnicodes, GooString); + deleteGooHash(unicodeToUnicodes, GooString); + deleteGooHash(residentUnicodeMaps, UnicodeMap); + deleteGooHash(unicodeMaps, GooString); + deleteGooList(toUnicodeDirs, GooString); + deleteGooHash(fontFiles, GooString); + deleteGooList(fontDirs, GooString); + deleteGooHash(ccFontFiles, GooString); +#ifdef _WIN32 + deleteGooHash(substFiles, GooString); +#endif + delete sysFonts; + if (psFile) { + delete psFile; + } + deleteGooHash(psResidentFonts, GooString); + deleteGooList(psResidentFonts16, PSFontParam16); + deleteGooList(psResidentFontsCC, PSFontParam16); + delete textEncoding; + + GooHashIter *iter; + GooString *key; + cMapDirs->startIter(&iter); + void *val; + while (cMapDirs->getNext(&iter, &key, &val)) { + GooList* list = (GooList*)val; + deleteGooList(list, GooString); + } + delete cMapDirs; + + delete cidToUnicodeCache; + delete unicodeToUnicodeCache; + delete unicodeMapCache; + delete cMapCache; + +#ifdef ENABLE_PLUGINS + delete securityHandlers; + deleteGooList(plugins, Plugin); +#endif + +#if MULTITHREADED + gDestroyMutex(&mutex); + gDestroyMutex(&unicodeMapCacheMutex); + gDestroyMutex(&cMapCacheMutex); +#endif +} + +//------------------------------------------------------------------------ + +void GlobalParams::setBaseDir(const char *dir) { + delete baseDir; + baseDir = new GooString(dir); +} + +//------------------------------------------------------------------------ +// accessors +//------------------------------------------------------------------------ + +CharCode GlobalParams::getMacRomanCharCode(char *charName) { + // no need to lock - macRomanReverseMap is constant + return macRomanReverseMap->lookup(charName); +} + +GooString *GlobalParams::getBaseDir() { + GooString *s; + + lockGlobalParams; + s = baseDir->copy(); + unlockGlobalParams; + return s; +} + +Unicode GlobalParams::mapNameToUnicode(const char *charName) { + // no need to lock - nameToUnicode is constant + return nameToUnicode->lookup(charName); +} + +UnicodeMap *GlobalParams::getResidentUnicodeMap(GooString *encodingName) { + UnicodeMap *map; + + lockGlobalParams; + map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName); + unlockGlobalParams; + if (map) { + map->incRefCnt(); + } + return map; +} + +FILE *GlobalParams::getUnicodeMapFile(GooString *encodingName) { + GooString *fileName; + FILE *f; + + lockGlobalParams; + if ((fileName = (GooString *)unicodeMaps->lookup(encodingName))) { + f = openFile(fileName->getCString(), "r"); + } else { + f = NULL; + } + unlockGlobalParams; + return f; +} + +FILE *GlobalParams::findCMapFile(GooString *collection, GooString *cMapName) { + GooList *list; + GooString *dir; + GooString *fileName; + FILE *f; + int i; + + lockGlobalParams; + if (!(list = (GooList *)cMapDirs->lookup(collection))) { + unlockGlobalParams; + return NULL; + } + for (i = 0; i < list->getLength(); ++i) { + dir = (GooString *)list->get(i); + fileName = appendToPath(dir->copy(), cMapName->getCString()); + f = openFile(fileName->getCString(), "r"); + delete fileName; + if (f) { + unlockGlobalParams; + return f; + } + } + unlockGlobalParams; + return NULL; +} + +FILE *GlobalParams::findToUnicodeFile(GooString *name) { + GooString *dir, *fileName; + FILE *f; + int i; + + lockGlobalParams; + for (i = 0; i < toUnicodeDirs->getLength(); ++i) { + dir = (GooString *)toUnicodeDirs->get(i); + fileName = appendToPath(dir->copy(), name->getCString()); + f = openFile(fileName->getCString(), "r"); + delete fileName; + if (f) { + unlockGlobalParams; + return f; + } + } + unlockGlobalParams; + return NULL; +} + +#if WITH_FONTCONFIGURATION_FONTCONFIG +static GBool findModifier(const char *name, const char *modifier, const char **start) +{ + const char *match; + + if (name == NULL) + return gFalse; + + match = strstr(name, modifier); + if (match) { + if (*start == NULL || match < *start) + *start = match; + return gTrue; + } + else { + return gFalse; + } +} + +static const char *getFontLang(GfxFont *font) +{ + const char *lang; + + // find the language we want the font to support + if (font->isCIDFont()) + { + GooString *collection = ((GfxCIDFont *)font)->getCollection(); + if (collection) + { + if (strcmp(collection->getCString(), "Adobe-GB1") == 0) + lang = "zh-cn"; // Simplified Chinese + else if (strcmp(collection->getCString(), "Adobe-CNS1") == 0) + lang = "zh-tw"; // Traditional Chinese + else if (strcmp(collection->getCString(), "Adobe-Japan1") == 0) + lang = "ja"; // Japanese + else if (strcmp(collection->getCString(), "Adobe-Japan2") == 0) + lang = "ja"; // Japanese + else if (strcmp(collection->getCString(), "Adobe-Korea1") == 0) + lang = "ko"; // Korean + else if (strcmp(collection->getCString(), "Adobe-UCS") == 0) + lang = "xx"; + else if (strcmp(collection->getCString(), "Adobe-Identity") == 0) + lang = "xx"; + else + { + error(errUnimplemented, -1, "Unknown CID font collection, please report to poppler bugzilla."); + lang = "xx"; + } + } + else lang = "xx"; + } + else lang = "xx"; + return lang; +} + +static FcPattern *buildFcPattern(GfxFont *font, GooString *base14Name) +{ + int weight = -1, + slant = -1, + width = -1, + spacing = -1; + bool deleteFamily = false; + char *family, *name, *modifiers; + const char *start; + FcPattern *p; + + // this is all heuristics will be overwritten if font had proper info + name = (base14Name == NULL) ? font->getName()->getCString() : base14Name->getCString(); + + modifiers = strchr (name, ','); + if (modifiers == NULL) + modifiers = strchr (name, '-'); + + // remove the - from the names, for some reason, Fontconfig does not + // understand "MS-Mincho" but does with "MS Mincho" + int len = strlen(name); + for (int i = 0; i < len; i++) + name[i] = (name[i] == '-' ? ' ' : name[i]); + + start = NULL; + findModifier(modifiers, "Regular", &start); + findModifier(modifiers, "Roman", &start); + + if (findModifier(modifiers, "Oblique", &start)) + slant = FC_SLANT_OBLIQUE; + if (findModifier(modifiers, "Italic", &start)) + slant = FC_SLANT_ITALIC; + if (findModifier(modifiers, "Bold", &start)) + weight = FC_WEIGHT_BOLD; + if (findModifier(modifiers, "Light", &start)) + weight = FC_WEIGHT_LIGHT; + if (findModifier(modifiers, "Medium", &start)) + weight = FC_WEIGHT_MEDIUM; + if (findModifier(modifiers, "Condensed", &start)) + width = FC_WIDTH_CONDENSED; + + if (start) { + // There have been "modifiers" in the name, crop them to obtain + // the family name + family = new char[len+1]; + strcpy(family, name); + int pos = (modifiers - name); + family[pos] = '\0'; + deleteFamily = true; + } + else { + family = name; + } + + // use font flags + if (font->isFixedWidth()) + spacing = FC_MONO; + if (font->isBold()) + weight = FC_WEIGHT_BOLD; + if (font->isItalic()) + slant = FC_SLANT_ITALIC; + + // if the FontDescriptor specified a family name use it + if (font->getFamily()) { + if (deleteFamily) { + delete[] family; + deleteFamily = false; + } + family = font->getFamily()->getCString(); + } + + // if the FontDescriptor specified a weight use it + switch (font -> getWeight()) + { + case GfxFont::W100: weight = FC_WEIGHT_EXTRALIGHT; break; + case GfxFont::W200: weight = FC_WEIGHT_LIGHT; break; + case GfxFont::W300: weight = FC_WEIGHT_BOOK; break; + case GfxFont::W400: weight = FC_WEIGHT_NORMAL; break; + case GfxFont::W500: weight = FC_WEIGHT_MEDIUM; break; + case GfxFont::W600: weight = FC_WEIGHT_DEMIBOLD; break; + case GfxFont::W700: weight = FC_WEIGHT_BOLD; break; + case GfxFont::W800: weight = FC_WEIGHT_EXTRABOLD; break; + case GfxFont::W900: weight = FC_WEIGHT_BLACK; break; + default: break; + } + + // if the FontDescriptor specified a width use it + switch (font -> getStretch()) + { + case GfxFont::UltraCondensed: width = FC_WIDTH_ULTRACONDENSED; break; + case GfxFont::ExtraCondensed: width = FC_WIDTH_EXTRACONDENSED; break; + case GfxFont::Condensed: width = FC_WIDTH_CONDENSED; break; + case GfxFont::SemiCondensed: width = FC_WIDTH_SEMICONDENSED; break; + case GfxFont::Normal: width = FC_WIDTH_NORMAL; break; + case GfxFont::SemiExpanded: width = FC_WIDTH_SEMIEXPANDED; break; + case GfxFont::Expanded: width = FC_WIDTH_EXPANDED; break; + case GfxFont::ExtraExpanded: width = FC_WIDTH_EXTRAEXPANDED; break; + case GfxFont::UltraExpanded: width = FC_WIDTH_ULTRAEXPANDED; break; + default: break; + } + + const char *lang = getFontLang(font); + + p = FcPatternBuild(NULL, + FC_FAMILY, FcTypeString, family, + FC_LANG, FcTypeString, lang, + NULL); + if (slant != -1) FcPatternAddInteger(p, FC_SLANT, slant); + if (weight != -1) FcPatternAddInteger(p, FC_WEIGHT, weight); + if (width != -1) FcPatternAddInteger(p, FC_WIDTH, width); + if (spacing != -1) FcPatternAddInteger(p, FC_SPACING, spacing); + + if (deleteFamily) + delete[] family; + return p; +} +#endif + +GooString *GlobalParams::findFontFile(GooString *fontName) { + static const char *exts[] = { ".pfa", ".pfb", ".ttf", ".ttc", ".otf" }; + GooString *path, *dir; +#ifdef WIN32 + GooString *fontNameU; +#endif + const char *ext; + FILE *f; + int i, j; + + setupBaseFonts(NULL); + lockGlobalParams; + if ((path = (GooString *)fontFiles->lookup(fontName))) { + path = path->copy(); + unlockGlobalParams; + return path; + } + for (i = 0; i < fontDirs->getLength(); ++i) { + dir = (GooString *)fontDirs->get(i); + for (j = 0; j < (int)(sizeof(exts) / sizeof(exts[0])); ++j) { + ext = exts[j]; +#ifdef WIN32 + fontNameU = fileNameToUTF8(fontName->getCString()); + path = appendToPath(dir->copy(), fontNameU->getCString()); + delete fontNameU; +#else + path = appendToPath(dir->copy(), fontName->getCString()); +#endif + path->append(ext); + if ((f = openFile(path->getCString(), "rb"))) { + fclose(f); + unlockGlobalParams; + return path; + } + delete path; + } + } + unlockGlobalParams; + return NULL; +} + +/* if you can't or don't want to use Fontconfig, you need to implement + this function for your platform. For Windows, it's in GlobalParamsWin.cc +*/ +#if WITH_FONTCONFIGURATION_FONTCONFIG +// not needed for fontconfig +void GlobalParams::setupBaseFonts(char *dir) { +} + +GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) { + SysFontType type; + int fontNum; + + return findSystemFontFile(font, &type, &fontNum, NULL, base14Name); +} + +GooString *GlobalParams::findSystemFontFile(GfxFont *font, + SysFontType *type, + int *fontNum, GooString *substituteFontName, GooString *base14Name) { + SysFontInfo *fi = NULL; + FcPattern *p=0; + GooString *path = NULL; + GooString *fontName = font->getName(); + GooString substituteName; + if (!fontName) return NULL; + lockGlobalParams; + + if ((fi = sysFonts->find(fontName, font->isFixedWidth(), gTrue))) { + path = fi->path->copy(); + *type = fi->type; + *fontNum = fi->fontNum; + substituteName.Set(fi->substituteName->getCString()); + } else { + FcChar8* s; + char * ext; + FcResult res; + FcFontSet *set; + int i; + FcLangSet *lb = NULL; + p = buildFcPattern(font, base14Name); + + if (!p) + goto fin; + FcConfigSubstitute(NULL, p, FcMatchPattern); + FcDefaultSubstitute(p); + set = FcFontSort(NULL, p, FcFalse, NULL, &res); + if (!set) + goto fin; + + // find the language we want the font to support + const char *lang = getFontLang(font); + if (strcmp(lang,"xx") != 0) { + lb = FcLangSetCreate(); + FcLangSetAdd(lb,(FcChar8 *)lang); + } + + /* + scan twice. + first: fonts support the language + second: all fonts (fall back) + */ + while (fi == NULL) + { + for (i = 0; i < set->nfont; ++i) + { + res = FcPatternGetString(set->fonts[i], FC_FILE, 0, &s); + if (res != FcResultMatch || !s) + continue; + if (lb != NULL) { + FcLangSet *l; + res = FcPatternGetLangSet(set->fonts[i], FC_LANG, 0, &l); + if (res != FcResultMatch || !FcLangSetContains(l,lb)) { + continue; + } + } + FcChar8* s2; + res = FcPatternGetString(set->fonts[i], FC_FULLNAME, 0, &s2); + if (res == FcResultMatch && s2) { + substituteName.Set((char*)s2); + } else { + // fontconfig does not extract fullname for some fonts + // create the fullname from family and style + res = FcPatternGetString(set->fonts[i], FC_FAMILY, 0, &s2); + if (res == FcResultMatch && s2) { + substituteName.Set((char*)s2); + res = FcPatternGetString(set->fonts[i], FC_STYLE, 0, &s2); + if (res == FcResultMatch && s2) { + GooString *style = new GooString((char*)s2); + if (style->cmp("Regular") != 0) { + substituteName.append(" "); + substituteName.append(style); + } + delete style; + } + } + } + ext = strrchr((char*)s,'.'); + if (!ext) + continue; + if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4) || !strncasecmp(ext, ".otf", 4)) + { + int weight, slant; + GBool bold = font->isBold(); + GBool italic = font->isItalic(); + GBool oblique = gFalse; + FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0, &weight); + FcPatternGetInteger(set->fonts[i], FC_SLANT, 0, &slant); + if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD + || weight == FC_WEIGHT_EXTRABOLD || weight == FC_WEIGHT_BLACK) + { + bold = gTrue; + } + if (slant == FC_SLANT_ITALIC) + italic = gTrue; + if (slant == FC_SLANT_OBLIQUE) + oblique = gTrue; + *fontNum = 0; + *type = (!strncasecmp(ext,".ttc",4)) ? sysFontTTC : sysFontTTF; + FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum); + fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(), + new GooString((char*)s), *type, *fontNum, substituteName.copy()); + sysFonts->addFcFont(fi); + path = new GooString((char*)s); + } + else if (!strncasecmp(ext,".pfa",4) || !strncasecmp(ext,".pfb",4)) + { + int weight, slant; + GBool bold = font->isBold(); + GBool italic = font->isItalic(); + GBool oblique = gFalse; + FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0, &weight); + FcPatternGetInteger(set->fonts[i], FC_SLANT, 0, &slant); + if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD + || weight == FC_WEIGHT_EXTRABOLD || weight == FC_WEIGHT_BLACK) + { + bold = gTrue; + } + if (slant == FC_SLANT_ITALIC) + italic = gTrue; + if (slant == FC_SLANT_OBLIQUE) + oblique = gTrue; + *fontNum = 0; + *type = (!strncasecmp(ext,".pfa",4)) ? sysFontPFA : sysFontPFB; + FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum); + fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(), + new GooString((char*)s), *type, *fontNum, substituteName.copy()); + sysFonts->addFcFont(fi); + path = new GooString((char*)s); + } + else + continue; + break; + } + if (lb != NULL) { + FcLangSetDestroy(lb); + lb = NULL; + } else { + /* scan all fonts of the list */ + break; + } + } + FcFontSetDestroy(set); + } + if (path == NULL && (fi = sysFonts->find(fontName, font->isFixedWidth(), gFalse))) { + path = fi->path->copy(); + *type = fi->type; + *fontNum = fi->fontNum; + } + if (substituteFontName) { + substituteFontName->Set(substituteName.getCString()); + } +fin: + if (p) + FcPatternDestroy(p); + unlockGlobalParams; + return path; +} + +#elif WITH_FONTCONFIGURATION_WIN32 +#include "GlobalParamsWin.cc" + +GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) { + return findFontFile(base14Name); +} +#else +GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) { + return findFontFile(base14Name); +} + +static struct { + const char *name; + const char *t1FileName; + const char *ttFileName; +} displayFontTab[] = { + {"Courier", "n022003l.pfb", "cour.ttf"}, + {"Courier-Bold", "n022004l.pfb", "courbd.ttf"}, + {"Courier-BoldOblique", "n022024l.pfb", "courbi.ttf"}, + {"Courier-Oblique", "n022023l.pfb", "couri.ttf"}, + {"Helvetica", "n019003l.pfb", "arial.ttf"}, + {"Helvetica-Bold", "n019004l.pfb", "arialbd.ttf"}, + {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf"}, + {"Helvetica-Oblique", "n019023l.pfb", "ariali.ttf"}, + {"Symbol", "s050000l.pfb", NULL}, + {"Times-Bold", "n021004l.pfb", "timesbd.ttf"}, + {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf"}, + {"Times-Italic", "n021023l.pfb", "timesi.ttf"}, + {"Times-Roman", "n021003l.pfb", "times.ttf"}, + {"ZapfDingbats", "d050000l.pfb", NULL}, + {NULL} +}; + +static const char *displayFontDirs[] = { + "/usr/share/ghostscript/fonts", + "/usr/local/share/ghostscript/fonts", + "/usr/share/fonts/default/Type1", + "/usr/share/fonts/default/ghostscript", + "/usr/share/fonts/type1/gsfonts", + NULL +}; + +void GlobalParams::setupBaseFonts(char *dir) { + GooString *fontName; + GooString *fileName; + FILE *f; + int i, j; + + for (i = 0; displayFontTab[i].name; ++i) { + if (fontFiles->lookup(displayFontTab[i].name)) { + continue; + } + fontName = new GooString(displayFontTab[i].name); + fileName = NULL; + if (dir) { + fileName = appendToPath(new GooString(dir), displayFontTab[i].t1FileName); + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + } else { + delete fileName; + fileName = NULL; + } + } + for (j = 0; !fileName && displayFontDirs[j]; ++j) { + fileName = appendToPath(new GooString(displayFontDirs[j]), + displayFontTab[i].t1FileName); + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + } else { + delete fileName; + fileName = NULL; + } + } + if (!fileName) { + error(errConfig, -1, "No display font for '{0:s}'", + displayFontTab[i].name); + delete fontName; + continue; + } + addFontFile(fontName, fileName); + } + +} + +GooString *GlobalParams::findSystemFontFile(GfxFont *font, + SysFontType *type, + int *fontNum, GooString * /*substituteFontName*/, + GooString * /*base14Name*/) { + SysFontInfo *fi; + GooString *path; + + path = NULL; + lockGlobalParams; + if ((fi = sysFonts->find(font->getName(), font->isFixedWidth(), gFalse))) { + path = fi->path->copy(); + *type = fi->type; + *fontNum = fi->fontNum; + } + unlockGlobalParams; + return path; +} +#endif + +GooString *GlobalParams::findCCFontFile(GooString *collection) { + GooString *path; + + lockGlobalParams; + if ((path = (GooString *)ccFontFiles->lookup(collection))) { + path = path->copy(); + } + unlockGlobalParams; + return path; +} + + +GBool GlobalParams::getPSExpandSmaller() { + GBool f; + + lockGlobalParams; + f = psExpandSmaller; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getPSShrinkLarger() { + GBool f; + + lockGlobalParams; + f = psShrinkLarger; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getPSCenter() { + GBool f; + + lockGlobalParams; + f = psCenter; + unlockGlobalParams; + return f; +} + +PSLevel GlobalParams::getPSLevel() { + PSLevel level; + + lockGlobalParams; + level = psLevel; + unlockGlobalParams; + return level; +} + +GooString *GlobalParams::getPSResidentFont(GooString *fontName) { + GooString *psName; + + lockGlobalParams; + psName = (GooString *)psResidentFonts->lookup(fontName); + unlockGlobalParams; + return psName; +} + +GooList *GlobalParams::getPSResidentFonts() { + GooList *names; + GooHashIter *iter; + GooString *name; + GooString *psName; + + names = new GooList(); + lockGlobalParams; + psResidentFonts->startIter(&iter); + while (psResidentFonts->getNext(&iter, &name, (void **)&psName)) { + names->append(psName->copy()); + } + unlockGlobalParams; + return names; +} + +PSFontParam16 *GlobalParams::getPSResidentFont16(GooString *fontName, + int wMode) { + PSFontParam16 *p; + int i; + + lockGlobalParams; + p = NULL; + for (i = 0; i < psResidentFonts16->getLength(); ++i) { + p = (PSFontParam16 *)psResidentFonts16->get(i); + if (!(p->name->cmp(fontName)) && p->wMode == wMode) { + break; + } + p = NULL; + } + unlockGlobalParams; + return p; +} + +PSFontParam16 *GlobalParams::getPSResidentFontCC(GooString *collection, + int wMode) { + PSFontParam16 *p; + int i; + + lockGlobalParams; + p = NULL; + for (i = 0; i < psResidentFontsCC->getLength(); ++i) { + p = (PSFontParam16 *)psResidentFontsCC->get(i); + if (!(p->name->cmp(collection)) && p->wMode == wMode) { + break; + } + p = NULL; + } + unlockGlobalParams; + return p; +} + +GBool GlobalParams::getPSEmbedType1() { + GBool e; + + lockGlobalParams; + e = psEmbedType1; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSEmbedTrueType() { + GBool e; + + lockGlobalParams; + e = psEmbedTrueType; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSEmbedCIDPostScript() { + GBool e; + + lockGlobalParams; + e = psEmbedCIDPostScript; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSEmbedCIDTrueType() { + GBool e; + + lockGlobalParams; + e = psEmbedCIDTrueType; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSFontPassthrough() { + GBool e; + + lockGlobalParams; + e = psFontPassthrough; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSPreload() { + GBool preload; + + lockGlobalParams; + preload = psPreload; + unlockGlobalParams; + return preload; +} + +GBool GlobalParams::getPSOPI() { + GBool opi; + + lockGlobalParams; + opi = psOPI; + unlockGlobalParams; + return opi; +} + +GBool GlobalParams::getPSASCIIHex() { + GBool ah; + + lockGlobalParams; + ah = psASCIIHex; + unlockGlobalParams; + return ah; +} + +GBool GlobalParams::getPSBinary() { + GBool binary; + + lockGlobalParams; + binary = psBinary; + unlockGlobalParams; + return binary; +} + +GBool GlobalParams::getPSUncompressPreloadedImages() { + GBool ah; + + lockGlobalParams; + ah = psUncompressPreloadedImages; + unlockGlobalParams; + return ah; +} + +double GlobalParams::getPSRasterResolution() { + double res; + + lockGlobalParams; + res = psRasterResolution; + unlockGlobalParams; + return res; +} + +GBool GlobalParams::getPSRasterMono() { + GBool mono; + + lockGlobalParams; + mono = psRasterMono; + unlockGlobalParams; + return mono; +} + +GooString *GlobalParams::getTextEncodingName() { + GooString *s; + + lockGlobalParams; + s = textEncoding->copy(); + unlockGlobalParams; + return s; +} + +EndOfLineKind GlobalParams::getTextEOL() { + EndOfLineKind eol; + + lockGlobalParams; + eol = textEOL; + unlockGlobalParams; + return eol; +} + +GBool GlobalParams::getTextPageBreaks() { + GBool pageBreaks; + + lockGlobalParams; + pageBreaks = textPageBreaks; + unlockGlobalParams; + return pageBreaks; +} + +GBool GlobalParams::getTextKeepTinyChars() { + GBool tiny; + + lockGlobalParams; + tiny = textKeepTinyChars; + unlockGlobalParams; + return tiny; +} + +GBool GlobalParams::getEnableFreeType() { + GBool f; + + lockGlobalParams; + f = enableFreeType; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getAntialias() { + GBool f; + + lockGlobalParams; + f = antialias; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getVectorAntialias() { + GBool f; + + lockGlobalParams; + f = vectorAntialias; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getAntialiasPrinting() { + GBool f; + + lockGlobalParams; + f = antialiasPrinting; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getStrokeAdjust() { + GBool f; + + lockGlobalParams; + f = strokeAdjust; + unlockGlobalParams; + return f; +} + +ScreenType GlobalParams::getScreenType() { + ScreenType t; + + lockGlobalParams; + t = screenType; + unlockGlobalParams; + return t; +} + +int GlobalParams::getScreenSize() { + int size; + + lockGlobalParams; + size = screenSize; + unlockGlobalParams; + return size; +} + +int GlobalParams::getScreenDotRadius() { + int r; + + lockGlobalParams; + r = screenDotRadius; + unlockGlobalParams; + return r; +} + +double GlobalParams::getScreenGamma() { + double gamma; + + lockGlobalParams; + gamma = screenGamma; + unlockGlobalParams; + return gamma; +} + +double GlobalParams::getScreenBlackThreshold() { + double thresh; + + lockGlobalParams; + thresh = screenBlackThreshold; + unlockGlobalParams; + return thresh; +} + +double GlobalParams::getScreenWhiteThreshold() { + double thresh; + + lockGlobalParams; + thresh = screenWhiteThreshold; + unlockGlobalParams; + return thresh; +} + +double GlobalParams::getMinLineWidth() { + double minLineWidthA; + + lockGlobalParams; + minLineWidthA = minLineWidth; + unlockGlobalParams; + return minLineWidthA; +} + +GBool GlobalParams::getMapNumericCharNames() { + GBool map; + + lockGlobalParams; + map = mapNumericCharNames; + unlockGlobalParams; + return map; +} + +GBool GlobalParams::getMapUnknownCharNames() { + GBool map; + + lockGlobalParams; + map = mapUnknownCharNames; + unlockGlobalParams; + return map; +} + +GBool GlobalParams::getPrintCommands() { + GBool p; + + lockGlobalParams; + p = printCommands; + unlockGlobalParams; + return p; +} + +GBool GlobalParams::getProfileCommands() { + GBool p; + + lockGlobalParams; + p = profileCommands; + unlockGlobalParams; + return p; +} + +GBool GlobalParams::getErrQuiet() { + // no locking -- this function may get called from inside a locked + // section + return errQuiet; +} + +CharCodeToUnicode *GlobalParams::getCIDToUnicode(GooString *collection) { + GooString *fileName; + CharCodeToUnicode *ctu; + + lockGlobalParams; + if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) { + if ((fileName = (GooString *)cidToUnicodes->lookup(collection)) && + (ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) { + cidToUnicodeCache->add(ctu); + } + } + unlockGlobalParams; + return ctu; +} + +CharCodeToUnicode *GlobalParams::getUnicodeToUnicode(GooString *fontName) { + lockGlobalParams; + GooHashIter *iter; + unicodeToUnicodes->startIter(&iter); + GooString *fileName = NULL; + GooString *fontPattern; + void *val; + while (!fileName && unicodeToUnicodes->getNext(&iter, &fontPattern, &val)) { + if (strstr(fontName->getCString(), fontPattern->getCString())) { + unicodeToUnicodes->killIter(&iter); + fileName = (GooString*)val; + } + } + CharCodeToUnicode *ctu = NULL; + if (fileName) { + ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName); + if (!ctu) { + ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName); + if (ctu) + unicodeToUnicodeCache->add(ctu); + } + } + unlockGlobalParams; + return ctu; +} + +UnicodeMap *GlobalParams::getUnicodeMap(GooString *encodingName) { + return getUnicodeMap2(encodingName); +} + +UnicodeMap *GlobalParams::getUnicodeMap2(GooString *encodingName) { + UnicodeMap *map; + + if (!(map = getResidentUnicodeMap(encodingName))) { + lockUnicodeMapCache; + map = unicodeMapCache->getUnicodeMap(encodingName); + unlockUnicodeMapCache; + } + return map; +} + +CMap *GlobalParams::getCMap(GooString *collection, GooString *cMapName, Stream *stream) { + CMap *cMap; + + lockCMapCache; + cMap = cMapCache->getCMap(collection, cMapName, stream); + unlockCMapCache; + return cMap; +} + +UnicodeMap *GlobalParams::getTextEncoding() { + return getUnicodeMap2(textEncoding); +} + +GooList *GlobalParams::getEncodingNames() +{ + GooList *result = new GooList; + GooHashIter *iter; + GooString *key; + void *val; + residentUnicodeMaps->startIter(&iter); + while (residentUnicodeMaps->getNext(&iter, &key, &val)) { + result->append(key); + } + residentUnicodeMaps->killIter(&iter); + unicodeMaps->startIter(&iter); + while (unicodeMaps->getNext(&iter, &key, &val)) { + result->append(key); + } + unicodeMaps->killIter(&iter); + return result; +} + +//------------------------------------------------------------------------ +// functions to set parameters +//------------------------------------------------------------------------ + +void GlobalParams::addFontFile(GooString *fontName, GooString *path) { + lockGlobalParams; + fontFiles->add(fontName, path); + unlockGlobalParams; +} + +void GlobalParams::setPSFile(char *file) { + lockGlobalParams; + if (psFile) { + delete psFile; + } + psFile = new GooString(file); + unlockGlobalParams; +} + +void GlobalParams::setPSExpandSmaller(GBool expand) { + lockGlobalParams; + psExpandSmaller = expand; + unlockGlobalParams; +} + +void GlobalParams::setPSShrinkLarger(GBool shrink) { + lockGlobalParams; + psShrinkLarger = shrink; + unlockGlobalParams; +} + +void GlobalParams::setPSCenter(GBool center) { + lockGlobalParams; + psCenter = center; + unlockGlobalParams; +} + +void GlobalParams::setPSLevel(PSLevel level) { + lockGlobalParams; + psLevel = level; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedType1(GBool embed) { + lockGlobalParams; + psEmbedType1 = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedTrueType(GBool embed) { + lockGlobalParams; + psEmbedTrueType = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedCIDPostScript(GBool embed) { + lockGlobalParams; + psEmbedCIDPostScript = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedCIDTrueType(GBool embed) { + lockGlobalParams; + psEmbedCIDTrueType = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSFontPassthrough(GBool passthrough) { + lockGlobalParams; + psFontPassthrough = passthrough; + unlockGlobalParams; +} + +void GlobalParams::setPSPreload(GBool preload) { + lockGlobalParams; + psPreload = preload; + unlockGlobalParams; +} + +void GlobalParams::setPSOPI(GBool opi) { + lockGlobalParams; + psOPI = opi; + unlockGlobalParams; +} + +void GlobalParams::setPSASCIIHex(GBool hex) { + lockGlobalParams; + psASCIIHex = hex; + unlockGlobalParams; +} + +void GlobalParams::setPSBinary(GBool binary) { + lockGlobalParams; + psBinary = binary; + unlockGlobalParams; +} + +void GlobalParams::setPSUncompressPreloadedImages(GBool uncomp) { + lockGlobalParams; + psUncompressPreloadedImages = uncomp; + unlockGlobalParams; +} + +void GlobalParams::setPSRasterResolution(double res) { + lockGlobalParams; + psRasterResolution = res; + unlockGlobalParams; +} + +void GlobalParams::setPSRasterMono(GBool mono) { + lockGlobalParams; + psRasterMono = mono; + unlockGlobalParams; +} + +void GlobalParams::setTextEncoding(char *encodingName) { + lockGlobalParams; + delete textEncoding; + textEncoding = new GooString(encodingName); + unlockGlobalParams; +} + +GBool GlobalParams::setTextEOL(char *s) { + lockGlobalParams; + if (!strcmp(s, "unix")) { + textEOL = eolUnix; + } else if (!strcmp(s, "dos")) { + textEOL = eolDOS; + } else if (!strcmp(s, "mac")) { + textEOL = eolMac; + } else { + unlockGlobalParams; + return gFalse; + } + unlockGlobalParams; + return gTrue; +} + +void GlobalParams::setTextPageBreaks(GBool pageBreaks) { + lockGlobalParams; + textPageBreaks = pageBreaks; + unlockGlobalParams; +} + +void GlobalParams::setTextKeepTinyChars(GBool keep) { + lockGlobalParams; + textKeepTinyChars = keep; + unlockGlobalParams; +} + +GBool GlobalParams::setEnableFreeType(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &enableFreeType); + unlockGlobalParams; + return ok; +} + +GBool GlobalParams::setDisableFreeTypeHinting(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &disableFreeTypeHinting); + unlockGlobalParams; + return ok; +} + +GBool GlobalParams::setAntialias(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &antialias); + unlockGlobalParams; + return ok; +} + +GBool GlobalParams::setVectorAntialias(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &vectorAntialias); + unlockGlobalParams; + return ok; +} + +void GlobalParams::setAntialiasPrinting(GBool anti) { + lockGlobalParams; + antialiasPrinting = anti; + unlockGlobalParams; +} + +void GlobalParams::setStrokeAdjust(GBool adjust) +{ + lockGlobalParams; + strokeAdjust = adjust; + unlockGlobalParams; +} + +void GlobalParams::setScreenType(ScreenType st) +{ + lockGlobalParams; + screenType = st; + unlockGlobalParams; +} + +void GlobalParams::setScreenSize(int size) +{ + lockGlobalParams; + screenSize = size; + unlockGlobalParams; +} + +void GlobalParams::setScreenDotRadius(int radius) +{ + lockGlobalParams; + screenDotRadius = radius; + unlockGlobalParams; +} + +void GlobalParams::setScreenGamma(double gamma) +{ + lockGlobalParams; + screenGamma = gamma; + unlockGlobalParams; +} + +void GlobalParams::setScreenBlackThreshold(double blackThreshold) +{ + lockGlobalParams; + screenBlackThreshold = blackThreshold; + unlockGlobalParams; +} + +void GlobalParams::setScreenWhiteThreshold(double whiteThreshold) +{ + lockGlobalParams; + screenWhiteThreshold = whiteThreshold; + unlockGlobalParams; +} + +void GlobalParams::setMinLineWidth(double minLineWidthA) +{ + lockGlobalParams; + minLineWidth = minLineWidthA; + unlockGlobalParams; +} + +void GlobalParams::setOverprintPreview(GBool overprintPreviewA) { + lockGlobalParams; + overprintPreview = overprintPreviewA; + unlockGlobalParams; +} + +void GlobalParams::setMapNumericCharNames(GBool map) { + lockGlobalParams; + mapNumericCharNames = map; + unlockGlobalParams; +} + +void GlobalParams::setMapUnknownCharNames(GBool map) { + lockGlobalParams; + mapUnknownCharNames = map; + unlockGlobalParams; +} + +void GlobalParams::setPrintCommands(GBool printCommandsA) { + lockGlobalParams; + printCommands = printCommandsA; + unlockGlobalParams; +} + +void GlobalParams::setProfileCommands(GBool profileCommandsA) { + lockGlobalParams; + profileCommands = profileCommandsA; + unlockGlobalParams; +} + +void GlobalParams::setErrQuiet(GBool errQuietA) { + lockGlobalParams; + errQuiet = errQuietA; + unlockGlobalParams; +} + +void GlobalParams::addSecurityHandler(XpdfSecurityHandler *handler) { +#ifdef ENABLE_PLUGINS + lockGlobalParams; + securityHandlers->append(handler); + unlockGlobalParams; +#endif +} + +XpdfSecurityHandler *GlobalParams::getSecurityHandler(char *name) { +#ifdef ENABLE_PLUGINS + XpdfSecurityHandler *hdlr; + int i; + + lockGlobalParams; + for (i = 0; i < securityHandlers->getLength(); ++i) { + hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); + if (!strcasecmp(hdlr->name, name)) { + unlockGlobalParams; + return hdlr; + } + } + unlockGlobalParams; + + if (!loadPlugin("security", name)) { + return NULL; + } + + lockGlobalParams; + for (i = 0; i < securityHandlers->getLength(); ++i) { + hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); + if (!strcmp(hdlr->name, name)) { + unlockGlobalParams; + return hdlr; + } + } + unlockGlobalParams; +#else + (void)name; +#endif + + return NULL; +} + +#ifdef ENABLE_PLUGINS +//------------------------------------------------------------------------ +// plugins +//------------------------------------------------------------------------ + +GBool GlobalParams::loadPlugin(char *type, char *name) { + Plugin *plugin; + + if (!(plugin = Plugin::load(type, name))) { + return gFalse; + } + lockGlobalParams; + plugins->append(plugin); + unlockGlobalParams; + return gTrue; +} + +#endif // ENABLE_PLUGINS diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h new file mode 100644 index 0000000..375ac2c --- /dev/null +++ b/poppler/GlobalParams.h @@ -0,0 +1,377 @@ +//======================================================================== +// +// GlobalParams.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2007-2010 Albert Astals Cid +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2007 Krzysztof Kowalczyk +// Copyright (C) 2009 Jonathan Kew +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2009, 2011, 2012 William Bader +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2011 Pino Toscano +// Copyright (C) 2012 Adrian Johnson +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef GLOBALPARAMS_H +#define GLOBALPARAMS_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "poppler-config.h" +#include +#include "goo/gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "goo/GooMutex.h" +#endif + +class GooString; +class GooList; +class GooHash; +class NameToCharCode; +class CharCodeToUnicode; +class CharCodeToUnicodeCache; +class UnicodeMap; +class UnicodeMapCache; +class CMap; +class CMapCache; +struct XpdfSecurityHandler; +class GlobalParams; +class GfxFont; +class Stream; +class SysFontList; + +//------------------------------------------------------------------------ + +// The global parameters object. +extern GlobalParams *globalParams; + +//------------------------------------------------------------------------ + +enum SysFontType { + sysFontPFA, + sysFontPFB, + sysFontTTF, + sysFontTTC +}; + +//------------------------------------------------------------------------ + +class PSFontParam16 { +public: + + GooString *name; // PDF font name for psResidentFont16; + // char collection name for psResidentFontCC + int wMode; // writing mode (0=horiz, 1=vert) + GooString *psFontName; // PostScript font name + GooString *encoding; // encoding + + PSFontParam16(GooString *nameA, int wModeA, + GooString *psFontNameA, GooString *encodingA); + ~PSFontParam16(); +}; + +//------------------------------------------------------------------------ + +enum PSLevel { + psLevel1, + psLevel1Sep, + psLevel2, + psLevel2Sep, + psLevel3, + psLevel3Sep +}; + +//------------------------------------------------------------------------ + +enum EndOfLineKind { + eolUnix, // LF + eolDOS, // CR+LF + eolMac // CR +}; + +//------------------------------------------------------------------------ + +enum ScreenType { + screenUnset, + screenDispersed, + screenClustered, + screenStochasticClustered +}; + +//------------------------------------------------------------------------ + +class GlobalParams { +public: + + // Initialize the global parameters by attempting to read a config + // file. + GlobalParams(const char *customPopplerDataDir = NULL); + + ~GlobalParams(); + + void setBaseDir(const char *dir); + void setupBaseFonts(char *dir); + + //----- accessors + + CharCode getMacRomanCharCode(char *charName); + + GooString *getBaseDir(); + Unicode mapNameToUnicode(const char *charName); + UnicodeMap *getResidentUnicodeMap(GooString *encodingName); + FILE *getUnicodeMapFile(GooString *encodingName); + FILE *findCMapFile(GooString *collection, GooString *cMapName); + FILE *findToUnicodeFile(GooString *name); + GooString *findFontFile(GooString *fontName); + GooString *findBase14FontFile(GooString *base14Name, GfxFont *font); + GooString *findSystemFontFile(GfxFont *font, SysFontType *type, + int *fontNum, GooString *substituteFontName = NULL, + GooString *base14Name = NULL); + GooString *findCCFontFile(GooString *collection); + GBool getPSExpandSmaller(); + GBool getPSShrinkLarger(); + GBool getPSCenter(); + PSLevel getPSLevel(); + GooString *getPSResidentFont(GooString *fontName); + GooList *getPSResidentFonts(); + PSFontParam16 *getPSResidentFont16(GooString *fontName, int wMode); + PSFontParam16 *getPSResidentFontCC(GooString *collection, int wMode); + GBool getPSEmbedType1(); + GBool getPSEmbedTrueType(); + GBool getPSEmbedCIDPostScript(); + GBool getPSEmbedCIDTrueType(); + GBool getPSFontPassthrough(); + GBool getPSPreload(); + GBool getPSOPI(); + GBool getPSASCIIHex(); + GBool getPSBinary(); + GBool getPSUncompressPreloadedImages(); + double getPSRasterResolution(); + GBool getPSRasterMono(); + GooString *getTextEncodingName(); + EndOfLineKind getTextEOL(); + GBool getTextPageBreaks(); + GBool getTextKeepTinyChars(); + GBool getEnableFreeType(); + GBool getAntialias(); + GBool getVectorAntialias(); + GBool getAntialiasPrinting(); + GBool getStrokeAdjust(); + ScreenType getScreenType(); + int getScreenSize(); + int getScreenDotRadius(); + double getScreenGamma(); + double getScreenBlackThreshold(); + double getScreenWhiteThreshold(); + double getMinLineWidth(); + GBool getOverprintPreview() { return overprintPreview; } + GBool getMapNumericCharNames(); + GBool getMapUnknownCharNames(); + GBool getPrintCommands(); + GBool getProfileCommands(); + GBool getErrQuiet(); + double getSplashResolution(); + + CharCodeToUnicode *getCIDToUnicode(GooString *collection); + CharCodeToUnicode *getUnicodeToUnicode(GooString *fontName); + UnicodeMap *getUnicodeMap(GooString *encodingName); + CMap *getCMap(GooString *collection, GooString *cMapName, Stream *stream = NULL); + UnicodeMap *getTextEncoding(); +#ifdef ENABLE_PLUGINS + GBool loadPlugin(char *type, char *name); +#endif + + GooList *getEncodingNames(); + + //----- functions to set parameters + void addFontFile(GooString *fontName, GooString *path); + void setPSFile(char *file); + void setPSExpandSmaller(GBool expand); + void setPSShrinkLarger(GBool shrink); + void setPSCenter(GBool center); + void setPSLevel(PSLevel level); + void setPSEmbedType1(GBool embed); + void setPSEmbedTrueType(GBool embed); + void setPSEmbedCIDPostScript(GBool embed); + void setPSEmbedCIDTrueType(GBool embed); + void setPSFontPassthrough(GBool passthrough); + void setPSPreload(GBool preload); + void setPSOPI(GBool opi); + void setPSASCIIHex(GBool hex); + void setPSBinary(GBool binary); + void setPSUncompressPreloadedImages(GBool uncomp); + void setPSRasterResolution(double res); + void setPSRasterMono(GBool mono); + void setTextEncoding(char *encodingName); + GBool setTextEOL(char *s); + void setTextPageBreaks(GBool pageBreaks); + void setTextKeepTinyChars(GBool keep); + GBool setEnableFreeType(char *s); + GBool setDisableFreeTypeHinting(char *s); + GBool setAntialias(char *s); + GBool setVectorAntialias(char *s); + void setAntialiasPrinting(GBool print); + void setStrokeAdjust(GBool strokeAdjust); + void setScreenType(ScreenType st); + void setScreenSize(int size); + void setScreenDotRadius(int radius); + void setScreenGamma(double gamma); + void setScreenBlackThreshold(double blackThreshold); + void setScreenWhiteThreshold(double whiteThreshold); + void setMinLineWidth(double minLineWidth); + void setOverprintPreview(GBool overprintPreviewA); + void setMapNumericCharNames(GBool map); + void setMapUnknownCharNames(GBool map); + void setPrintCommands(GBool printCommandsA); + void setProfileCommands(GBool profileCommandsA); + void setErrQuiet(GBool errQuietA); + + //----- security handlers + + void addSecurityHandler(XpdfSecurityHandler *handler); + XpdfSecurityHandler *getSecurityHandler(char *name); + +private: + + void parseNameToUnicode(GooString *name); + GBool parseYesNo2(const char *token, GBool *flag); + UnicodeMap *getUnicodeMap2(GooString *encodingName); + + void scanEncodingDirs(); + void addCIDToUnicode(GooString *collection, GooString *fileName); + void addUnicodeMap(GooString *encodingName, GooString *fileName); + void addCMapDir(GooString *collection, GooString *dir); + + //----- static tables + + NameToCharCode * // mapping from char name to + macRomanReverseMap; // MacRomanEncoding index + + //----- user-modifiable settings + + GooString *baseDir; // base directory - for plugins, etc. + NameToCharCode * // mapping from char name to Unicode + nameToUnicode; + GooHash *cidToUnicodes; // files for mappings from char collections + // to Unicode, indexed by collection name + // [GooString] + GooHash *unicodeToUnicodes; // files for Unicode-to-Unicode mappings, + // indexed by font name pattern [GooString] + GooHash *residentUnicodeMaps; // mappings from Unicode to char codes, + // indexed by encoding name [UnicodeMap] + GooHash *unicodeMaps; // files for mappings from Unicode to char + // codes, indexed by encoding name [GooString] + GooHash *cMapDirs; // list of CMap dirs, indexed by collection + // name [GooList[GooString]] + GooList *toUnicodeDirs; // list of ToUnicode CMap dirs [GooString] + GBool baseFontsInitialized; +#ifdef _WIN32 + GooHash *substFiles; // windows font substitutes (for CID fonts) +#endif + GooHash *fontFiles; // font files: font name mapped to path + // [GString] + GooList *fontDirs; // list of font dirs [GString] + GooHash *ccFontFiles; // character collection font files: + // collection name mapped to path [GString] + SysFontList *sysFonts; // system fonts + GooString *psFile; // PostScript file or command (for xpdf) + GBool psExpandSmaller; // expand smaller pages to fill paper + GBool psShrinkLarger; // shrink larger pages to fit paper + GBool psCenter; // center pages on the paper + PSLevel psLevel; // PostScript level to generate + GooHash *psResidentFonts; // 8-bit fonts resident in printer: + // PDF font name mapped to PS font name + // [GString] + GooList *psResidentFonts16; // 16-bit fonts resident in printer: + // PDF font name mapped to font info + // [PSFontParam16] + GooList *psResidentFontsCC; // 16-bit character collection fonts + // resident in printer: collection name + // mapped to font info [PSFontParam16] + GBool psEmbedType1; // embed Type 1 fonts? + GBool psEmbedTrueType; // embed TrueType fonts? + GBool psEmbedCIDPostScript; // embed CID PostScript fonts? + GBool psEmbedCIDTrueType; // embed CID TrueType fonts? + GBool psFontPassthrough; // pass all fonts through as-is? + GBool psPreload; // preload PostScript images and forms into + // memory + GBool psOPI; // generate PostScript OPI comments? + GBool psASCIIHex; // use ASCIIHex instead of ASCII85? + GBool psBinary; // use binary instead of hex + GBool psUncompressPreloadedImages; // uncompress all preloaded images + double psRasterResolution; // PostScript rasterization resolution (dpi) + GBool psRasterMono; // true to do PostScript rasterization + // in monochrome (gray); false to do it + // in color (RGB/CMYK) + GooString *textEncoding; // encoding (unicodeMap) to use for text + // output + EndOfLineKind textEOL; // type of EOL marker to use for text + // output + GBool textPageBreaks; // insert end-of-page markers? + GBool textKeepTinyChars; // keep all characters in text output + GBool enableFreeType; // FreeType enable flag + GBool disableFreeTypeHinting; // FreeType disable hinting flag + GBool antialias; // anti-aliasing enable flag + GBool vectorAntialias; // vector anti-aliasing enable flag + GBool antialiasPrinting; // allow anti-aliasing when printing + GBool strokeAdjust; // stroke adjustment enable flag + ScreenType screenType; // halftone screen type + int screenSize; // screen matrix size + int screenDotRadius; // screen dot radius + double screenGamma; // screen gamma correction + double screenBlackThreshold; // screen black clamping threshold + double screenWhiteThreshold; // screen white clamping threshold + double minLineWidth; // minimum line width + GBool overprintPreview; // enable overprint preview + GBool mapNumericCharNames; // map numeric char names (from font subsets)? + GBool mapUnknownCharNames; // map unknown char names? + GBool printCommands; // print the drawing commands + GBool profileCommands; // profile the drawing commands + GBool errQuiet; // suppress error messages? + double splashResolution; // resolution when rasterizing images + + CharCodeToUnicodeCache *cidToUnicodeCache; + CharCodeToUnicodeCache *unicodeToUnicodeCache; + UnicodeMapCache *unicodeMapCache; + CMapCache *cMapCache; + +#ifdef ENABLE_PLUGINS + GooList *plugins; // list of plugins [Plugin] + GooList *securityHandlers; // list of loaded security handlers + // [XpdfSecurityHandler] +#endif + +#if MULTITHREADED + GooMutex mutex; + GooMutex unicodeMapCacheMutex; + GooMutex cMapCacheMutex; +#endif + + const char *popplerDataDir; +}; + +#endif diff --git a/poppler/GlobalParamsWin.cc b/poppler/GlobalParamsWin.cc new file mode 100644 index 0000000..527f08e --- /dev/null +++ b/poppler/GlobalParamsWin.cc @@ -0,0 +1,598 @@ +/* Written by Krzysztof Kowalczyk (http://blog.kowalczyk.info) + but mostly based on xpdf code. + + // Copyright (C) 2010 Hib Eris + // Copyright (C) 2012 Thomas Freitag + // Copyright (C) 2012 Suzuki Toshiya + // Copyright (C) 2012 Adrian Johnson + // Copyright (C) 2012 Mark Brand + +TODO: instead of a fixed mapping defined in displayFontTab, it could +scan the whole fonts directory, parse TTF files and build font +description for all fonts available in Windows. That's how MuPDF works. +*/ + +#ifndef PACKAGE_NAME +#include +#endif + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#if !(_WIN32_IE >= 0x0500) +#error "_WIN32_IE must be defined >= 0x0500 for SHGFP_TYPE_CURRENT from shlobj.h" +#endif +#include +#include +#include +#include +#include + +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "goo/GooHash.h" +#include "goo/gfile.h" +#include "Error.h" +#include "NameToCharCode.h" +#include "CharCodeToUnicode.h" +#include "UnicodeMap.h" +#include "CMap.h" +#include "BuiltinFontTables.h" +#include "FontEncodingTables.h" +#include "GlobalParams.h" +#include "GfxFont.h" +#include +#include "Object.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" + +#if MULTITHREADED +# define lockGlobalParams gLockMutex(&mutex) +# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex) +# define lockCMapCache gLockMutex(&cMapCacheMutex) +# define unlockGlobalParams gUnlockMutex(&mutex) +# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex) +# define unlockCMapCache gUnlockMutex(&cMapCacheMutex) +#else +# define lockGlobalParams +# define lockUnicodeMapCache +# define lockCMapCache +# define unlockGlobalParams +# define unlockUnicodeMapCache +# define unlockCMapCache +#endif + +#define DEFAULT_SUBSTITUTE_FONT "Helvetica" +#define DEFAULT_CID_FONT_AC1_MSWIN "MingLiU" /* Adobe-CNS1 for Taiwan, HongKong */ +#define DEFAULT_CID_FONT_AG1_MSWIN "SimSun" /* Adobe-GB1 for PRC, Singapore */ +#define DEFAULT_CID_FONT_AJ1_MSWIN "MS-Mincho" /* Adobe-Japan1 */ +#define DEFAULT_CID_FONT_AJ2_MSWIN "MS-Mincho" /* Adobe-Japan2 (legacy) */ +#define DEFAULT_CID_FONT_AK1_MSWIN "Batang" /* Adobe-Korea1 */ +#define DEFAULT_CID_FONT_MSWIN "ArialUnicode" /* Unknown */ + +static struct { + const char *name; + const char *t1FileName; + const char *ttFileName; + GBool warnIfMissing; +} displayFontTab[] = { + {"Courier", "n022003l.pfb", "cour.ttf", gTrue}, + {"Courier-Bold", "n022004l.pfb", "courbd.ttf", gTrue}, + {"Courier-BoldOblique", "n022024l.pfb", "courbi.ttf", gTrue}, + {"Courier-Oblique", "n022023l.pfb", "couri.ttf", gTrue}, + {"Helvetica", "n019003l.pfb", "arial.ttf", gTrue}, + {"Helvetica-Bold", "n019004l.pfb", "arialbd.ttf", gTrue}, + {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf", gTrue}, + {"Helvetica-Oblique", "n019023l.pfb", "ariali.ttf", gTrue}, + // TODO: not sure if "symbol.ttf" is right + {"Symbol", "s050000l.pfb", "symbol.ttf", gTrue}, + {"Times-Bold", "n021004l.pfb", "timesbd.ttf", gTrue}, + {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf", gTrue}, + {"Times-Italic", "n021023l.pfb", "timesi.ttf", gTrue}, + {"Times-Roman", "n021003l.pfb", "times.ttf", gTrue}, + // TODO: not sure if "wingding.ttf" is right + {"ZapfDingbats", "d050000l.pfb", "wingding.ttf", gTrue}, + + // those seem to be frequently accessed by PDF files and I kind of guess + // which font file do the refer to + {"Palatino", NULL, "pala.ttf", gTrue}, + {"Palatino-Roman", NULL, "pala.ttf", gTrue}, + {"Palatino-Bold", NULL, "palab.ttf", gTrue}, + {"Palatino-Italic", NULL, "palai.ttf", gTrue}, + {"Palatino,Italic", NULL, "palai.ttf", gTrue}, + {"Palatino-BoldItalic", NULL, "palabi.ttf", gTrue}, + + {"ArialBlack", NULL, "arialbd.ttf", gTrue}, + + {"ArialNarrow", NULL, "arialn.ttf", gTrue}, + {"ArialNarrow,Bold", NULL, "arialnb.ttf", gTrue}, + {"ArialNarrow,Italic", NULL, "arialni.ttf", gTrue}, + {"ArialNarrow,BoldItalic", NULL, "arialnbi.ttf", gTrue}, + {"ArialNarrow-Bold", NULL, "arialnb.ttf", gTrue}, + {"ArialNarrow-Italic", NULL, "arialni.ttf", gTrue}, + {"ArialNarrow-BoldItalic", NULL, "arialnbi.ttf", gTrue}, + + {"HelveticaNarrow", NULL, "arialn.ttf", gTrue}, + {"HelveticaNarrow,Bold", NULL, "arialnb.ttf", gTrue}, + {"HelveticaNarrow,Italic", NULL, "arialni.ttf", gTrue}, + {"HelveticaNarrow,BoldItalic", NULL, "arialnbi.ttf", gTrue}, + {"HelveticaNarrow-Bold", NULL, "arialnb.ttf", gTrue}, + {"HelveticaNarrow-Italic", NULL, "arialni.ttf", gTrue}, + {"HelveticaNarrow-BoldItalic", NULL, "arialnbi.ttf", gTrue}, + + {"BookAntiqua", NULL, "bkant.ttf", gTrue}, + {"BookAntiqua,Bold", NULL, "bkant.ttf", gTrue}, + {"BookAntiqua,Italic", NULL, "bkant.ttf", gTrue}, + {"BookAntiqua,BoldItalic", NULL, "bkant.ttf", gTrue}, + {"BookAntiqua-Bold", NULL, "bkant.ttf", gTrue}, + {"BookAntiqua-Italic", NULL, "bkant.ttf", gTrue}, + {"BookAntiqua-BoldItalic", NULL, "bkant.ttf", gTrue}, + + {"Verdana", NULL, "verdana.ttf", gTrue}, + {"Verdana,Bold", NULL, "verdanab.ttf", gTrue}, + {"Verdana,Italic", NULL, "verdanai.ttf", gTrue}, + {"Verdana,BoldItalic", NULL, "verdanaz.ttf", gTrue}, + {"Verdana-Bold", NULL, "verdanab.ttf", gTrue}, + {"Verdana-Italic", NULL, "verdanai.ttf", gTrue}, + {"Verdana-BoldItalic", NULL, "verdanaz.ttf", gTrue}, + + {"Tahoma", NULL, "tahoma.ttf", gTrue}, + {"Tahoma,Bold", NULL, "tahomabd.ttf", gTrue}, + {"Tahoma,Italic", NULL, "tahoma.ttf", gTrue}, + {"Tahoma,BoldItalic", NULL, "tahomabd.ttf", gTrue}, + {"Tahoma-Bold", NULL, "tahomabd.ttf", gTrue}, + {"Tahoma-Italic", NULL, "tahoma.ttf", gTrue}, + {"Tahoma-BoldItalic", NULL, "tahomabd.ttf", gTrue}, + + {"CCRIKH+Verdana", NULL, "verdana.ttf", gTrue}, + {"CCRIKH+Verdana,Bold", NULL, "verdanab.ttf", gTrue}, + {"CCRIKH+Verdana,Italic", NULL, "verdanai.ttf", gTrue}, + {"CCRIKH+Verdana,BoldItalic", NULL, "verdanaz.ttf", gTrue}, + {"CCRIKH+Verdana-Bold", NULL, "verdanab.ttf", gTrue}, + {"CCRIKH+Verdana-Italic", NULL, "verdanai.ttf", gTrue}, + {"CCRIKH+Verdana-BoldItalic", NULL, "verdanaz.ttf", gTrue}, + + {"Georgia", NULL, "georgia.ttf", gTrue}, + {"Georgia,Bold", NULL, "georgiab.ttf", gTrue}, + {"Georgia,Italic", NULL, "georgiai.ttf", gTrue}, + {"Georgia,BoldItalic", NULL, "georgiaz.ttf", gTrue}, + {"Georgia-Bold", NULL, "georgiab.ttf", gTrue}, + {"Georgia-Italic", NULL, "georgiai.ttf", gTrue}, + {"Georgia-BoldItalic", NULL, "georgiaz.ttf", gTrue}, + + // fallback for Adobe CID fonts: + {"MingLiU", NULL, "mingliu.ttf", gFalse}, + {"SimSun", NULL, "simsun.ttf", gFalse}, + {"MS-Mincho", NULL, "msmincho.ttf", gFalse}, + {"Batang", NULL, "batang.ttf", gFalse}, + {"ArialUnicode", NULL, "arialuni.ttf", gTrue}, + {NULL} +}; + +#define FONTS_SUBDIR "\\fonts" + +static void GetWindowsFontDir(char *winFontDir, int cbWinFontDirLen) +{ + BOOL (__stdcall *SHGetSpecialFolderPathFunc)(HWND hwndOwner, + LPTSTR lpszPath, + int nFolder, + BOOL fCreate); + HRESULT (__stdcall *SHGetFolderPathFunc)(HWND hwndOwner, + int nFolder, + HANDLE hToken, + DWORD dwFlags, + LPTSTR pszPath); + + // SHGetSpecialFolderPath isn't available in older versions of shell32.dll (Win95 and + // WinNT4), so do a dynamic load of ANSI versions. + winFontDir[0] = '\0'; + + HMODULE hLib = LoadLibrary("shell32.dll"); + if (hLib) { + SHGetFolderPathFunc = (HRESULT (__stdcall *)(HWND, int, HANDLE, DWORD, LPTSTR)) + GetProcAddress(hLib, "SHGetFolderPathA"); + if (SHGetFolderPathFunc) + (*SHGetFolderPathFunc)(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, winFontDir); + + if (!winFontDir[0]) { + // Try an older function + SHGetSpecialFolderPathFunc = (BOOL (__stdcall *)(HWND, LPTSTR, int, BOOL)) + GetProcAddress(hLib, "SHGetSpecialFolderPathA"); + if (SHGetSpecialFolderPathFunc) + (*SHGetSpecialFolderPathFunc)(NULL, winFontDir, CSIDL_FONTS, FALSE); + } + FreeLibrary(hLib); + } + if (winFontDir[0]) + return; + + // Try older DLL + hLib = LoadLibrary("SHFolder.dll"); + if (hLib) { + SHGetFolderPathFunc = (HRESULT (__stdcall *)(HWND, int, HANDLE, DWORD, LPTSTR)) + GetProcAddress(hLib, "SHGetFolderPathA"); + if (SHGetFolderPathFunc) + (*SHGetFolderPathFunc)(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, winFontDir); + FreeLibrary(hLib); + } + if (winFontDir[0]) + return; + + // Everything else failed so the standard fonts directory. + GetWindowsDirectory(winFontDir, cbWinFontDirLen); + if (winFontDir[0]) { + strncat(winFontDir, FONTS_SUBDIR, cbWinFontDirLen); + winFontDir[cbWinFontDirLen-1] = 0; + } +} + +static bool FileExists(const char *path) +{ + FILE * f = fopen(path, "rb"); + if (f) { + fclose(f); + return true; + } + return false; +} + +void SysFontList::scanWindowsFonts(GooString *winFontDir) { + OSVERSIONINFO version; + char *path; + DWORD idx, valNameLen, dataLen, type; + HKEY regKey; + char valName[1024], data[1024]; + int n, fontNum; + char *p0, *p1; + GooString *fontPath; + + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\\"; + } else { + path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts\\"; + } + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, + KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, + ®Key) == ERROR_SUCCESS) { + idx = 0; + while (1) { + valNameLen = sizeof(valName) - 1; + dataLen = sizeof(data) - 1; + if (RegEnumValue(regKey, idx, valName, &valNameLen, NULL, + &type, (LPBYTE)data, &dataLen) != ERROR_SUCCESS) { + break; + } + if (type == REG_SZ && + valNameLen > 0 && valNameLen < sizeof(valName) && + dataLen > 0 && dataLen < sizeof(data)) { + valName[valNameLen] = '\0'; + data[dataLen] = '\0'; + n = strlen(data); + if (!strcasecmp(data + n - 4, ".ttf") || + !strcasecmp(data + n - 4, ".ttc") || + !strcasecmp(data + n - 4, ".otf")) { + fontPath = new GooString(data); + if (!(dataLen >= 3 && data[1] == ':' && data[2] == '\\')) { + fontPath->insert(0, '\\'); + fontPath->insert(0, winFontDir); + fontPath->append('\0'); + } + p0 = valName; + fontNum = 0; + while (*p0) { + p1 = strstr(p0, " & "); + if (p1) { + *p1 = '\0'; + p1 = p1 + 3; + } else { + p1 = p0 + strlen(p0); + } + fonts->append(makeWindowsFont(p0, fontNum, + fontPath->getCString())); + p0 = p1; + ++fontNum; + } + delete fontPath; + } + } + ++idx; + } + RegCloseKey(regKey); + } +} + +SysFontInfo *SysFontList::makeWindowsFont(char *name, int fontNum, + char *path) { + int n; + GBool bold, italic, oblique, fixedWidth; + GooString *s; + char c; + int i; + SysFontType type; + GooString substituteName; + + n = strlen(name); + bold = italic = oblique = fixedWidth = gFalse; + + // remove trailing ' (TrueType)' + if (n > 11 && !strncmp(name + n - 11, " (TrueType)", 11)) { + n -= 11; + } + + // remove trailing ' (OpenType)' + if (n > 11 && !strncmp(name + n - 11, " (OpenType)", 11)) { + n -= 11; + } + + // remove trailing ' Italic' + if (n > 7 && !strncmp(name + n - 7, " Italic", 7)) { + n -= 7; + italic = gTrue; + } + + // remove trailing ' Oblique' + if (n > 7 && !strncmp(name + n - 8, " Oblique", 8)) { + n -= 8; + oblique = gTrue; + } + + // remove trailing ' Bold' + if (n > 5 && !strncmp(name + n - 5, " Bold", 5)) { + n -= 5; + bold = gTrue; + } + + // remove trailing ' Regular' + if (n > 5 && !strncmp(name + n - 8, " Regular", 8)) { + n -= 8; + } + + // the familyname cannot indicate whether a font is fixedWidth or not. + // some well-known fixedWidth typeface family names or keyword are checked. + if ( strstr(name, "Courier") || + strstr(name, "Fixed") || + (strstr(name, "Mono") && !strstr(name, "Monotype")) || + strstr(name, "Typewriter") ) + fixedWidth = gTrue; + else + fixedWidth = gFalse; + + + //----- normalize the font name + s = new GooString(name, n); + i = 0; + while (i < s->getLength()) { + c = s->getChar(i); + if (c == ' ' || c == ',' || c == '-') { + s->del(i); + } else { + ++i; + } + } + + if (!strcasecmp(path + strlen(path) - 4, ".ttc")) { + type = sysFontTTC; + } else { + type = sysFontTTF; + } + + return new SysFontInfo(s, bold, italic, oblique, fixedWidth, + new GooString(path), type, fontNum, substituteName.copy()); +} + +static GooString* replaceSuffix(GooString *path, + const char* suffixA, const char* suffixB) +{ + int suffLenA = strlen(suffixA); + int suffLenB = strlen(suffixB); + int baseLenA = path->getLength() - suffLenA; + int baseLenB = path->getLength() - suffLenB; + + if (!strcasecmp(path->getCString()+baseLenA, suffixA)) { + path->del(baseLenA,suffLenA)->append(suffixB); + } else if (!strcasecmp(path->getCString()+baseLenB, suffixB)) { + path->del(baseLenB,suffLenB)->append(suffixA); + } + + return path; +} + + +void GlobalParams::setupBaseFonts(char * dir) +{ + const char *dataRoot = popplerDataDir ? popplerDataDir : POPPLER_DATADIR; + GooString *fileName = NULL; + struct stat buf; + FILE *file; + int size = 0; + + if (baseFontsInitialized) + return; + baseFontsInitialized = true; + + char winFontDir[MAX_PATH]; + GetWindowsFontDir(winFontDir, sizeof(winFontDir)); + + for (int i = 0; displayFontTab[i].name; ++i) { + GooString *fontName = new GooString(displayFontTab[i].name); + if (fontFiles->lookup(fontName)) + continue; + + if (dir) { + GooString *fontPath = appendToPath(new GooString(dir), displayFontTab[i].t1FileName); + if (FileExists(fontPath->getCString()) || + FileExists(replaceSuffix(fontPath, ".pfb", ".pfa")->getCString())) { + addFontFile(fontName, fontPath); + continue; + } + delete fontPath; + } + + if (winFontDir[0] && displayFontTab[i].ttFileName) { + GooString *fontPath = appendToPath(new GooString(winFontDir), displayFontTab[i].ttFileName); + if (FileExists(fontPath->getCString()) || + FileExists(replaceSuffix(fontPath, ".ttc", ".ttf")->getCString())) { + addFontFile(fontName, fontPath); + continue; + } + delete fontPath; + } + + if (displayFontTab[i].warnIfMissing) + error(errSyntaxError, -1, "No display font for '{0:s}'", fontName); + } + if (winFontDir[0]) { + sysFonts->scanWindowsFonts(new GooString(winFontDir)); + } + + fileName = new GooString(dataRoot); + fileName->append("/cidfmap"); + if (stat(fileName->getCString(), &buf) == 0) { + size = buf.st_size; + } + // try to open file +#ifdef VMS + file = fopen(fileName->getCString(), "rb", "ctx=stm"); +#else + file = fopen(fileName->getCString(), "rb"); +#endif + + if (file != NULL) { + Parser *parser; + Object obj1, obj2; + + obj1.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, + new FileStream(file, 0, gFalse, size, &obj1)), + gTrue); + obj1.free(); + parser->getObj(&obj1); + while (!obj1.isEOF()) { + parser->getObj(&obj2); + if (obj1.isName()) { + // Substitutions + if (obj2.isDict()) { + Object obj3; + obj2.getDict()->lookup("Path", &obj3); + if (obj3.isString()) + addFontFile(new GooString(obj1.getName()), obj3.getString()->copy()); + obj3.free(); + // Aliases + } else if (obj2.isName()) { + substFiles->add(new GooString(obj1.getName()), new GooString(obj2.getName())); + } + } + obj2.free(); + obj1.free(); + parser->getObj(&obj1); + // skip trailing ';' + while (obj1.isCmd(";")) { + obj1.free(); + parser->getObj(&obj1); + } + } + fclose(file); + delete parser; + } +} + +static const char *findSubstituteName(GfxFont *font, GooHash *fontFiles, + GooHash *substFiles, + const char *origName) +{ + assert(origName); + if (!origName) return NULL; + GooString *name2 = new GooString(origName); + int n = strlen(origName); + // remove trailing "-Identity-H" + if (n > 11 && !strcmp(name2->getCString() + n - 11, "-Identity-H")) { + name2->del(n - 11, 11); + n -= 11; + } + // remove trailing "-Identity-V" + if (n > 11 && !strcmp(name2->getCString() + n - 11, "-Identity-V")) { + name2->del(n - 11, 11); + n -= 11; + } + GooString *substName = (GooString *)substFiles->lookup(name2); + if (substName != NULL) { + delete name2; + return substName->getCString(); + } + + /* TODO: try to at least guess bold/italic/bolditalic from the name */ + delete name2; + if (font->isCIDFont()) { + GooString *collection = ((GfxCIDFont *)font)->getCollection(); + + const char* name3 = NULL; + if ( !collection->cmp("Adobe-CNS1") ) + name3 = DEFAULT_CID_FONT_AC1_MSWIN; + else if ( !collection->cmp("Adobe-GB1") ) + name3 = DEFAULT_CID_FONT_AG1_MSWIN; + else if ( !collection->cmp("Adobe-Japan1") ) + name3 = DEFAULT_CID_FONT_AJ1_MSWIN; + else if ( !collection->cmp("Adobe-Japan2") ) + name3 = DEFAULT_CID_FONT_AJ2_MSWIN; + else if ( !collection->cmp("Adobe-Korea1") ) + name3 = DEFAULT_CID_FONT_AK1_MSWIN; + + if (name3 && fontFiles->lookup(name3)) + return name3; + + if (fontFiles->lookup(DEFAULT_CID_FONT_MSWIN)) + return DEFAULT_CID_FONT_MSWIN; + } + return DEFAULT_SUBSTITUTE_FONT; +} + +/* Windows implementation of external font matching code */ +GooString *GlobalParams::findSystemFontFile(GfxFont *font, + SysFontType *type, + int *fontNum, GooString *substituteFontName, + GooString *base14Name) { + SysFontInfo *fi; + GooString *path = NULL; + GooString *fontName = font->getName(); + if (!fontName) return NULL; + lockGlobalParams; + setupBaseFonts(NULL); + + // TODO: base14Name should be changed? + // In the system using FontConfig, findSystemFontFile() uses + // base14Name only for the creation of query pattern. + + if ((fi = sysFonts->find(fontName, gFalse, gFalse))) { + path = fi->path->copy(); + *type = fi->type; + *fontNum = fi->fontNum; + if (substituteFontName) + substituteFontName->Set(fi->substituteName->getCString()); + } else { + GooString *substFontName = new GooString(findSubstituteName(font, fontFiles, + substFiles, + fontName->getCString())); + GooString *path2 = NULL; + error(errSyntaxError, -1, "Couldn't find a font for '{0:t}', subst is '{1:t}'", fontName, substFontName); + if ((path2 = (GooString *)fontFiles->lookup(substFontName))) { + path = new GooString(path2); + if (substituteFontName) + substituteFontName->Set(path->getCString()); + if (!strcasecmp(path->getCString() + path->getLength() - 4, ".ttc")) { + *type = sysFontTTC; + } else { + *type = sysFontTTF; + } + *fontNum = 0; + } + } + unlockGlobalParams; + return path; +} diff --git a/poppler/Hints.cc b/poppler/Hints.cc new file mode 100644 index 0000000..13bcc90 --- /dev/null +++ b/poppler/Hints.cc @@ -0,0 +1,444 @@ +//======================================================================== +// +// Hints.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010, 2012 Hib Eris +// Copyright 2010, 2011 Albert Astals Cid +// Copyright 2010 Pino Toscano +// +//======================================================================== + +#include + +#include "Hints.h" + +#include "Linearization.h" +#include "Object.h" +#include "Stream.h" +#include "XRef.h" +#include "Parser.h" +#include "Lexer.h" +#include "SecurityHandler.h" + +#include + +//------------------------------------------------------------------------ +// Hints +//------------------------------------------------------------------------ + +Hints::Hints(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr) +{ + mainXRefEntriesOffset = linearization->getMainXRefEntriesOffset(); + nPages = linearization->getNumPages(); + pageFirst = linearization->getPageFirst(); + pageEndFirst = linearization->getEndFirst(); + pageObjectFirst = linearization->getObjectNumberFirst(); + if (pageObjectFirst < 0 || pageObjectFirst >= xref->getNumObjects()) { + error(errSyntaxWarning, -1, + "Invalid reference for first page object (%d) in linearization table ", + pageObjectFirst); + pageObjectFirst = 0; + } + pageOffsetFirst = xref->getEntry(pageObjectFirst)->offset; + + if (nPages >= INT_MAX / (int)sizeof(Guint)) { + error(errSyntaxWarning, -1, "Invalid number of pages ({0:d}) for hints table", nPages); + nPages = 0; + } + nObjects = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint)); + pageObjectNum = (int *) gmallocn_checkoverflow(nPages, sizeof(int)); + xRefOffset = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint)); + pageLength = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint)); + pageOffset = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint)); + numSharedObject = (Guint *) gmallocn_checkoverflow(nPages, sizeof(Guint)); + sharedObjectId = (Guint **) gmallocn_checkoverflow(nPages, sizeof(Guint*)); + if (!nObjects || !pageObjectNum || !xRefOffset || !pageLength || !pageOffset || + !numSharedObject || !sharedObjectId) { + error(errSyntaxWarning, -1, "Failed to allocate memory for hints tabel"); + nPages = 0; + } + + memset(pageLength, 0, nPages * sizeof(Guint)); + memset(pageOffset, 0, nPages * sizeof(Guint)); + memset(numSharedObject, 0, nPages * sizeof(Guint)); + memset(pageObjectNum, 0, nPages * sizeof(int)); + + nSharedGroups = 0; + groupLength = NULL; + groupOffset = NULL; + groupHasSignature = NULL; + groupNumObjects = NULL; + groupXRefOffset = NULL; + + readTables(str, linearization, xref, secHdlr); +} + +Hints::~Hints() +{ + gfree(nObjects); + gfree(pageObjectNum); + gfree(xRefOffset); + gfree(pageLength); + gfree(pageOffset); + for (int i=0; i< nPages; i++) { + if (numSharedObject[i]) { + gfree(sharedObjectId[i]); + } + } + gfree(sharedObjectId); + gfree(numSharedObject); + + gfree(groupLength); + gfree(groupOffset); + gfree(groupHasSignature); + gfree(groupNumObjects); + gfree(groupXRefOffset); +} + +void Hints::readTables(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr) +{ + hintsOffset = linearization->getHintsOffset(); + hintsLength = linearization->getHintsLength(); + hintsOffset2 = linearization->getHintsOffset2(); + hintsLength2 = linearization->getHintsLength2(); + + Parser *parser; + Object obj; + + int bufLength = hintsLength + hintsLength2; + + std::vector buf(bufLength); + char *p = &buf[0]; + + obj.initNull(); + Stream *s = str->makeSubStream(hintsOffset, gFalse, hintsLength, &obj); + s->reset(); + for (Guint i=0; i < hintsLength; i++) { *p++ = s->getChar(); } + delete s; + + if (hintsOffset2 && hintsLength2) { + obj.initNull(); + s = str->makeSubStream(hintsOffset2, gFalse, hintsLength2, &obj); + s->reset(); + for (Guint i=0; i < hintsLength2; i++) { *p++ = s->getChar(); } + delete s; + } + + obj.initNull(); + MemStream *memStream = new MemStream (&buf[0], 0, bufLength, &obj); + + obj.initNull(); + parser = new Parser(xref, new Lexer(xref, memStream), gTrue); + + int num, gen; + if (parser->getObj(&obj)->isInt() && + (num = obj.getInt(), obj.free(), parser->getObj(&obj)->isInt()) && + (gen = obj.getInt(), obj.free(), parser->getObj(&obj)->isCmd("obj")) && + (obj.free(), parser->getObj(&obj, gFalse, + secHdlr ? secHdlr->getFileKey() : (Guchar *)NULL, + secHdlr ? secHdlr->getEncAlgorithm() : cryptRC4, + secHdlr ? secHdlr->getFileKeyLength() : 0, + num, gen, 0, gTrue)->isStream())) { + Stream *hintsStream = obj.getStream(); + Dict *hintsDict = obj.streamGetDict(); + + int sharedStreamOffset = 0; + if (hintsDict->lookupInt("S", NULL, &sharedStreamOffset) && + sharedStreamOffset > 0) { + + hintsStream->reset(); + readPageOffsetTable(hintsStream); + + hintsStream->reset(); + for (int i=0; igetChar(); + readSharedObjectsTable(hintsStream); + } else { + error(errSyntaxWarning, -1, "Invalid shared object hint table offset"); + } + } else { + error(errSyntaxWarning, -1, "Failed parsing hints table object"); + } + obj.free(); + + delete parser; +} + +void Hints::readPageOffsetTable(Stream *str) +{ + if (nPages < 1) { + error(errSyntaxWarning, -1, "Invalid number of pages reading page offset hints table"); + return; + } + + inputBits = 0; // reset on byte boundary. + + nObjectLeast = readBits(32, str); + + objectOffsetFirst = readBits(32, str); + if (objectOffsetFirst >= hintsOffset) objectOffsetFirst += hintsLength; + + nBitsDiffObjects = readBits(16, str); + + pageLengthLeast = readBits(32, str); + + nBitsDiffPageLength = readBits(16, str); + + OffsetStreamLeast = readBits(32, str); + + nBitsOffsetStream = readBits(16, str); + + lengthStreamLeast = readBits(32, str); + + nBitsLengthStream = readBits(16, str); + + nBitsNumShared = readBits(16, str); + + nBitsShared = readBits(16, str); + + nBitsNumerator = readBits(16, str); + + denominator = readBits(16, str); + + for (int i=0; i= INT_MAX / (int)sizeof(Guint)) { + error(errSyntaxWarning, -1, "Invalid number of shared objects"); + numSharedObject[i] = 0; + return; + } + sharedObjectId[i] = (Guint *) gmallocn_checkoverflow(numSharedObject[i], sizeof(Guint)); + if (numSharedObject[i] && !sharedObjectId[i]) { + error(errSyntaxWarning, -1, "Failed to allocate memory for shared object IDs"); + numSharedObject[i] = 0; + return; + } + } + + inputBits = 0; // reset on byte boundary. Not in specs! + for (int i=1; i= INT_MAX / (int)sizeof(Guint))) { + error(errSyntaxWarning, -1, "Invalid number of shared object groups"); + nSharedGroups = 0; + return; + } + if ((!nSharedGroupsFirst) || (nSharedGroupsFirst > nSharedGroups)) { + error(errSyntaxWarning, -1, "Invalid number of first page shared object groups"); + nSharedGroupsFirst = nSharedGroups; + } + + groupLength = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint)); + groupOffset = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint)); + groupHasSignature = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint)); + groupNumObjects = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint)); + groupXRefOffset = (Guint *) gmallocn_checkoverflow(nSharedGroups, sizeof(Guint)); + if (!groupLength || !groupOffset || !groupHasSignature || + !groupNumObjects || !groupXRefOffset) { + error(errSyntaxWarning, -1, "Failed to allocate memory for shared object groups"); + nSharedGroups = 0; + return; + } + + inputBits = 0; // reset on byte boundary. Not in specs! + for (Guint i=0; i nSharedGroupsFirst ) { + groupOffset[nSharedGroupsFirst] = firstSharedObjectOffset; + for (Guint i=nSharedGroupsFirst+1; i nSharedGroupsFirst ) { + groupXRefOffset[nSharedGroupsFirst] = + mainXRefEntriesOffset + 20*firstSharedObjectNumber; + for (Guint i=nSharedGroupsFirst+1; i nPages)) return 0; + + if (page-1 > pageFirst) + return pageOffset[page-1]; + else if (page-1 < pageFirst) + return pageOffset[page]; + else + return pageOffset[0]; +} + +std::vector* Hints::getPageRanges(int page) +{ + if ((page < 1) || (page > nPages)) return NULL; + + int idx; + if (page-1 > pageFirst) + idx = page-1; + else if (page-1 < pageFirst) + idx = page; + else + idx = 0; + + ByteRange pageRange; + std::vector *v = new std::vector; + + pageRange.offset = pageOffset[idx]; + pageRange.length = pageLength[idx]; + v->push_back(pageRange); + + pageRange.offset = xRefOffset[idx]; + pageRange.length = 20*nObjects[idx]; + v->push_back(pageRange); + + for (Guint j=0; jpush_back(pageRange); + + pageRange.offset = groupXRefOffset[k]; + pageRange.length = 20*groupNumObjects[k]; + v->push_back(pageRange); + } + + return v; +} + +Guint Hints::readBit(Stream *str) +{ + Guint bit; + int c; + + if (inputBits == 0) { + if ((c = str->getChar()) == EOF) { + return (Guint) -1; + } + bitsBuffer = c; + inputBits = 8; + } + bit = (bitsBuffer >> (inputBits - 1)) & 1; + --inputBits; + return bit; +} + +Guint Hints::readBits(int n, Stream *str) +{ + Guint bit, bits; + + if (n < 0) return -1; + if (n == 0) return 0; + + if (n == 1) + return readBit(str); + + bit = (readBit(str) << (n-1)); + if (bit == (Guint) -1) + return -1; + + bits = readBits(n-1, str); + if (bits == (Guint) -1) + return -1; + + return bit | bits; +} + +int Hints::getPageObjectNum(int page) { + if ((page < 1) || (page > nPages)) return 0; + + if (page-1 > pageFirst) + return pageObjectNum[page-1]; + else if (page-1 < pageFirst) + return pageObjectNum[page]; + else + return pageObjectNum[0]; +} diff --git a/poppler/Hints.h b/poppler/Hints.h new file mode 100644 index 0000000..d598e79 --- /dev/null +++ b/poppler/Hints.h @@ -0,0 +1,95 @@ +//======================================================================== +// +// Hints.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef HINTS_H +#define HINTS_H + +#include +#include "goo/gtypes.h" +#include +#include "PDFDoc.h" + +class Stream; +class BaseStream; +class Linearization; +class XRef; + +//------------------------------------------------------------------------ +// Hints +//------------------------------------------------------------------------ + +class Hints { +public: + + Hints(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr); + ~Hints(); + + int getPageObjectNum(int page); + Guint getPageOffset(int page); + std::vector* getPageRanges(int page); + +private: + + void readTables(BaseStream *str, Linearization *linearization, XRef *xref, SecurityHandler *secHdlr); + void readPageOffsetTable(Stream *str); + void readSharedObjectsTable(Stream *str); + + Guint readBit(Stream *str); + Guint readBits(int n, Stream *str); + + Guint hintsOffset; + Guint hintsLength; + Guint hintsOffset2; + Guint hintsLength2; + Guint mainXRefEntriesOffset; + + int nPages; + int pageFirst; + int pageObjectFirst; + Guint pageOffsetFirst; + Guint pageEndFirst; + int objectNumberFirst; + + Guint nObjectLeast; + Guint objectOffsetFirst; + Guint nBitsDiffObjects; + Guint pageLengthLeast; + Guint nBitsDiffPageLength; + Guint OffsetStreamLeast; + Guint nBitsOffsetStream; + Guint lengthStreamLeast; + Guint nBitsLengthStream; + Guint nBitsNumShared; + Guint nBitsShared; + Guint nBitsNumerator; + Guint denominator; + + Guint *nObjects; + int *pageObjectNum; + Guint *xRefOffset; + Guint *pageLength; + Guint *pageOffset; + Guint *numSharedObject; + Guint **sharedObjectId; + + Guint nSharedGroups; + Guint *groupLength; + Guint *groupOffset; + Guint *groupHasSignature; + Guint *groupNumObjects; + Guint *groupXRefOffset; + + int inputBits; + char bitsBuffer; + +}; + +#endif diff --git a/poppler/JArithmeticDecoder.cc b/poppler/JArithmeticDecoder.cc new file mode 100644 index 0000000..d23f7ea --- /dev/null +++ b/poppler/JArithmeticDecoder.cc @@ -0,0 +1,355 @@ +//======================================================================== +// +// JArithmeticDecoder.cc +// +// Copyright 2002-2004 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "Object.h" +#include "Stream.h" +#include "JArithmeticDecoder.h" + +//------------------------------------------------------------------------ +// JArithmeticDecoderStates +//------------------------------------------------------------------------ + +JArithmeticDecoderStats::JArithmeticDecoderStats(int contextSizeA) { + contextSize = contextSizeA; + cxTab = (Guchar *)gmallocn(contextSize, sizeof(Guchar)); + reset(); +} + +JArithmeticDecoderStats::~JArithmeticDecoderStats() { + gfree(cxTab); +} + +JArithmeticDecoderStats *JArithmeticDecoderStats::copy() { + JArithmeticDecoderStats *stats; + + stats = new JArithmeticDecoderStats(contextSize); + memcpy(stats->cxTab, cxTab, contextSize); + return stats; +} + +void JArithmeticDecoderStats::reset() { + memset(cxTab, 0, contextSize); +} + +void JArithmeticDecoderStats::copyFrom(JArithmeticDecoderStats *stats) { + memcpy(cxTab, stats->cxTab, contextSize); +} + +void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) { + cxTab[cx] = (i << 1) + mps; +} + +//------------------------------------------------------------------------ +// JArithmeticDecoder +//------------------------------------------------------------------------ + +Guint JArithmeticDecoder::qeTab[47] = { + 0x56010000, 0x34010000, 0x18010000, 0x0AC10000, + 0x05210000, 0x02210000, 0x56010000, 0x54010000, + 0x48010000, 0x38010000, 0x30010000, 0x24010000, + 0x1C010000, 0x16010000, 0x56010000, 0x54010000, + 0x51010000, 0x48010000, 0x38010000, 0x34010000, + 0x30010000, 0x28010000, 0x24010000, 0x22010000, + 0x1C010000, 0x18010000, 0x16010000, 0x14010000, + 0x12010000, 0x11010000, 0x0AC10000, 0x09C10000, + 0x08A10000, 0x05210000, 0x04410000, 0x02A10000, + 0x02210000, 0x01410000, 0x01110000, 0x00850000, + 0x00490000, 0x00250000, 0x00150000, 0x00090000, + 0x00050000, 0x00010000, 0x56010000 +}; + +int JArithmeticDecoder::nmpsTab[47] = { + 1, 2, 3, 4, 5, 38, 7, 8, 9, 10, 11, 12, 13, 29, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46 +}; + +int JArithmeticDecoder::nlpsTab[47] = { + 1, 6, 9, 12, 29, 33, 6, 14, 14, 14, 17, 18, 20, 21, 14, 14, + 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46 +}; + +int JArithmeticDecoder::switchTab[47] = { + 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +JArithmeticDecoder::JArithmeticDecoder() { + str = NULL; + dataLen = 0; + limitStream = gFalse; + nBytesRead = 0; +} + +inline Guint JArithmeticDecoder::readByte() { + if (limitStream) { + --dataLen; + if (dataLen < 0) { + return 0xff; + } + } + ++nBytesRead; + return (Guint)str->getChar() & 0xff; +} + +JArithmeticDecoder::~JArithmeticDecoder() { + cleanup(); +} + +void JArithmeticDecoder::start() { + buf0 = readByte(); + buf1 = readByte(); + + // INITDEC + c = (buf0 ^ 0xff) << 16; + byteIn(); + c <<= 7; + ct -= 7; + a = 0x80000000; +} + +void JArithmeticDecoder::restart(int dataLenA) { + Guint cAdd; + GBool prevFF; + int k, nBits; + + if (dataLen >= 0) { + dataLen = dataLenA; + } else if (dataLen == -1) { + dataLen = dataLenA; + buf1 = readByte(); + } else { + k = (-dataLen - 1) * 8 - ct; + dataLen = dataLenA; + cAdd = 0; + prevFF = gFalse; + while (k > 0) { + buf0 = readByte(); + if (prevFF) { + cAdd += 0xfe00 - (buf0 << 9); + nBits = 7; + } else { + cAdd += 0xff00 - (buf0 << 8); + nBits = 8; + } + prevFF = buf0 == 0xff; + if (k > nBits) { + cAdd <<= nBits; + k -= nBits; + } else { + cAdd <<= k; + ct = nBits - k; + k = 0; + } + } + c += cAdd; + buf1 = readByte(); + } +} + +void JArithmeticDecoder::cleanup() { + if (limitStream) { + while (dataLen > 0) { + buf0 = buf1; + buf1 = readByte(); + } + } +} + +int JArithmeticDecoder::decodeBit(Guint context, + JArithmeticDecoderStats *stats) { + int bit; + Guint qe; + int iCX, mpsCX; + + iCX = stats->cxTab[context] >> 1; + mpsCX = stats->cxTab[context] & 1; + qe = qeTab[iCX]; + a -= qe; + if (c < a) { + if (a & 0x80000000) { + bit = mpsCX; + } else { + // MPS_EXCHANGE + if (a < qe) { + bit = 1 - mpsCX; + if (switchTab[iCX]) { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX); + } else { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX; + } + } else { + bit = mpsCX; + stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX; + } + // RENORMD + do { + if (ct == 0) { + byteIn(); + } + a <<= 1; + c <<= 1; + --ct; + } while (!(a & 0x80000000)); + } + } else { + c -= a; + // LPS_EXCHANGE + if (a < qe) { + bit = mpsCX; + stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX; + } else { + bit = 1 - mpsCX; + if (switchTab[iCX]) { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX); + } else { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX; + } + } + a = qe; + // RENORMD + do { + if (ct == 0) { + byteIn(); + } + a <<= 1; + c <<= 1; + --ct; + } while (!(a & 0x80000000)); + } + return bit; +} + +int JArithmeticDecoder::decodeByte(Guint context, + JArithmeticDecoderStats *stats) { + int byte; + int i; + + byte = 0; + for (i = 0; i < 8; ++i) { + byte = (byte << 1) | decodeBit(context, stats); + } + return byte; +} + +GBool JArithmeticDecoder::decodeInt(int *x, JArithmeticDecoderStats *stats) { + int s; + Guint v; + int i; + + prev = 1; + s = decodeIntBit(stats); + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + v = 0; + for (i = 0; i < 32; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 4436; + } else { + v = 0; + for (i = 0; i < 12; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 340; + } + } else { + v = 0; + for (i = 0; i < 8; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 84; + } + } else { + v = 0; + for (i = 0; i < 6; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 20; + } + } else { + v = decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + v += 4; + } + } else { + v = decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + } + + if (s) { + if (v == 0) { + return gFalse; + } + *x = -(int)v; + } else { + *x = (int)v; + } + return gTrue; +} + +int JArithmeticDecoder::decodeIntBit(JArithmeticDecoderStats *stats) { + int bit; + + bit = decodeBit(prev, stats); + if (prev < 0x100) { + prev = (prev << 1) | bit; + } else { + prev = (((prev << 1) | bit) & 0x1ff) | 0x100; + } + return bit; +} + +Guint JArithmeticDecoder::decodeIAID(Guint codeLen, + JArithmeticDecoderStats *stats) { + Guint i; + int bit; + + prev = 1; + for (i = 0; i < codeLen; ++i) { + bit = decodeBit(prev, stats); + prev = (prev << 1) | bit; + } + return prev - (1 << codeLen); +} + +void JArithmeticDecoder::byteIn() { + if (buf0 == 0xff) { + if (buf1 > 0x8f) { + if (limitStream) { + buf0 = buf1; + buf1 = readByte(); + c = c + 0xff00 - (buf0 << 8); + } + ct = 8; + } else { + buf0 = buf1; + buf1 = readByte(); + c = c + 0xfe00 - (buf0 << 9); + ct = 7; + } + } else { + buf0 = buf1; + buf1 = readByte(); + c = c + 0xff00 - (buf0 << 8); + ct = 8; + } +} diff --git a/poppler/JArithmeticDecoder.h b/poppler/JArithmeticDecoder.h new file mode 100644 index 0000000..3c3e6fe --- /dev/null +++ b/poppler/JArithmeticDecoder.h @@ -0,0 +1,111 @@ +//======================================================================== +// +// JArithmeticDecoder.h +// +// Arithmetic decoder used by the JBIG2 and JPEG2000 decoders. +// +// Copyright 2002-2004 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef JARITHMETICDECODER_H +#define JARITHMETICDECODER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +class Stream; + +//------------------------------------------------------------------------ +// JArithmeticDecoderStats +//------------------------------------------------------------------------ + +class JArithmeticDecoderStats { +public: + + JArithmeticDecoderStats(int contextSizeA); + ~JArithmeticDecoderStats(); + JArithmeticDecoderStats *copy(); + void reset(); + int getContextSize() { return contextSize; } + void copyFrom(JArithmeticDecoderStats *stats); + void setEntry(Guint cx, int i, int mps); + +private: + + Guchar *cxTab; // cxTab[cx] = (i[cx] << 1) + mps[cx] + int contextSize; + + friend class JArithmeticDecoder; +}; + +//------------------------------------------------------------------------ +// JArithmeticDecoder +//------------------------------------------------------------------------ + +class JArithmeticDecoder { +public: + + JArithmeticDecoder(); + ~JArithmeticDecoder(); + + void setStream(Stream *strA) + { str = strA; dataLen = 0; limitStream = gFalse; } + void setStream(Stream *strA, int dataLenA) + { str = strA; dataLen = dataLenA; limitStream = gTrue; } + + // Start decoding on a new stream. This fills the byte buffers and + // runs INITDEC. + void start(); + + // Restart decoding on an interrupted stream. This refills the + // buffers if needed, but does not run INITDEC. (This is used in + // JPEG 2000 streams when codeblock data is split across multiple + // packets/layers.) + void restart(int dataLenA); + + // Read any leftover data in the stream. + void cleanup(); + + // Decode one bit. + int decodeBit(Guint context, JArithmeticDecoderStats *stats); + + // Decode eight bits. + int decodeByte(Guint context, JArithmeticDecoderStats *stats); + + // Returns false for OOB, otherwise sets * and returns true. + GBool decodeInt(int *x, JArithmeticDecoderStats *stats); + + Guint decodeIAID(Guint codeLen, + JArithmeticDecoderStats *stats); + + void resetByteCounter() { nBytesRead = 0; } + Guint getByteCounter() { return nBytesRead; } + +private: + + Guint readByte(); + int decodeIntBit(JArithmeticDecoderStats *stats); + void byteIn(); + + static Guint qeTab[47]; + static int nmpsTab[47]; + static int nlpsTab[47]; + static int switchTab[47]; + + Guint buf0, buf1; + Guint c, a; + int ct; + + Guint prev; // for the integer decoder + + Stream *str; + Guint nBytesRead; + int dataLen; + GBool limitStream; +}; + +#endif diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc new file mode 100644 index 0000000..78a205d --- /dev/null +++ b/poppler/JBIG2Stream.cc @@ -0,0 +1,4200 @@ +//======================================================================== +// +// JBIG2Stream.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Raj Kumar +// Copyright (C) 2006 Paul Walmsley +// Copyright (C) 2006-2010, 2012 Albert Astals Cid +// Copyright (C) 2009 David Benjamin +// Copyright (C) 2011 Edward Jiang +// Copyright (C) 2012 William Bader +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/GooList.h" +#include "Error.h" +#include "JArithmeticDecoder.h" +#include "JBIG2Stream.h" + +//~ share these tables +#include "Stream-CCITT.h" + +//------------------------------------------------------------------------ + +static const int contextSize[4] = { 16, 13, 10, 10 }; +static const int refContextSize[2] = { 13, 10 }; + +//------------------------------------------------------------------------ +// JBIG2HuffmanTable +//------------------------------------------------------------------------ + +#define jbig2HuffmanLOW 0xfffffffd +#define jbig2HuffmanOOB 0xfffffffe +#define jbig2HuffmanEOT 0xffffffff + +struct JBIG2HuffmanTable { + int val; + Guint prefixLen; + Guint rangeLen; // can also be LOW, OOB, or EOT + Guint prefix; +}; + +static JBIG2HuffmanTable huffTableA[] = { + { 0, 1, 4, 0x000 }, + { 16, 2, 8, 0x002 }, + { 272, 3, 16, 0x006 }, + { 65808, 3, 32, 0x007 }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableB[] = { + { 0, 1, 0, 0x000 }, + { 1, 2, 0, 0x002 }, + { 2, 3, 0, 0x006 }, + { 3, 4, 3, 0x00e }, + { 11, 5, 6, 0x01e }, + { 75, 6, 32, 0x03e }, + { 0, 6, jbig2HuffmanOOB, 0x03f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableC[] = { + { 0, 1, 0, 0x000 }, + { 1, 2, 0, 0x002 }, + { 2, 3, 0, 0x006 }, + { 3, 4, 3, 0x00e }, + { 11, 5, 6, 0x01e }, + { 0, 6, jbig2HuffmanOOB, 0x03e }, + { 75, 7, 32, 0x0fe }, + { -256, 8, 8, 0x0fe }, + { -257, 8, jbig2HuffmanLOW, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableD[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 0, 0x006 }, + { 4, 4, 3, 0x00e }, + { 12, 5, 6, 0x01e }, + { 76, 5, 32, 0x01f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableE[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 0, 0x006 }, + { 4, 4, 3, 0x00e }, + { 12, 5, 6, 0x01e }, + { 76, 6, 32, 0x03e }, + { -255, 7, 8, 0x07e }, + { -256, 7, jbig2HuffmanLOW, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableF[] = { + { 0, 2, 7, 0x000 }, + { 128, 3, 7, 0x002 }, + { 256, 3, 8, 0x003 }, + { -1024, 4, 9, 0x008 }, + { -512, 4, 8, 0x009 }, + { -256, 4, 7, 0x00a }, + { -32, 4, 5, 0x00b }, + { 512, 4, 9, 0x00c }, + { 1024, 4, 10, 0x00d }, + { -2048, 5, 10, 0x01c }, + { -128, 5, 6, 0x01d }, + { -64, 5, 5, 0x01e }, + { -2049, 6, jbig2HuffmanLOW, 0x03e }, + { 2048, 6, 32, 0x03f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableG[] = { + { -512, 3, 8, 0x000 }, + { 256, 3, 8, 0x001 }, + { 512, 3, 9, 0x002 }, + { 1024, 3, 10, 0x003 }, + { -1024, 4, 9, 0x008 }, + { -256, 4, 7, 0x009 }, + { -32, 4, 5, 0x00a }, + { 0, 4, 5, 0x00b }, + { 128, 4, 7, 0x00c }, + { -128, 5, 6, 0x01a }, + { -64, 5, 5, 0x01b }, + { 32, 5, 5, 0x01c }, + { 64, 5, 6, 0x01d }, + { -1025, 5, jbig2HuffmanLOW, 0x01e }, + { 2048, 5, 32, 0x01f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableH[] = { + { 0, 2, 1, 0x000 }, + { 0, 2, jbig2HuffmanOOB, 0x001 }, + { 4, 3, 4, 0x004 }, + { -1, 4, 0, 0x00a }, + { 22, 4, 4, 0x00b }, + { 38, 4, 5, 0x00c }, + { 2, 5, 0, 0x01a }, + { 70, 5, 6, 0x01b }, + { 134, 5, 7, 0x01c }, + { 3, 6, 0, 0x03a }, + { 20, 6, 1, 0x03b }, + { 262, 6, 7, 0x03c }, + { 646, 6, 10, 0x03d }, + { -2, 7, 0, 0x07c }, + { 390, 7, 8, 0x07d }, + { -15, 8, 3, 0x0fc }, + { -5, 8, 1, 0x0fd }, + { -7, 9, 1, 0x1fc }, + { -3, 9, 0, 0x1fd }, + { -16, 9, jbig2HuffmanLOW, 0x1fe }, + { 1670, 9, 32, 0x1ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableI[] = { + { 0, 2, jbig2HuffmanOOB, 0x000 }, + { -1, 3, 1, 0x002 }, + { 1, 3, 1, 0x003 }, + { 7, 3, 5, 0x004 }, + { -3, 4, 1, 0x00a }, + { 43, 4, 5, 0x00b }, + { 75, 4, 6, 0x00c }, + { 3, 5, 1, 0x01a }, + { 139, 5, 7, 0x01b }, + { 267, 5, 8, 0x01c }, + { 5, 6, 1, 0x03a }, + { 39, 6, 2, 0x03b }, + { 523, 6, 8, 0x03c }, + { 1291, 6, 11, 0x03d }, + { -5, 7, 1, 0x07c }, + { 779, 7, 9, 0x07d }, + { -31, 8, 4, 0x0fc }, + { -11, 8, 2, 0x0fd }, + { -15, 9, 2, 0x1fc }, + { -7, 9, 1, 0x1fd }, + { -32, 9, jbig2HuffmanLOW, 0x1fe }, + { 3339, 9, 32, 0x1ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableJ[] = { + { -2, 2, 2, 0x000 }, + { 6, 2, 6, 0x001 }, + { 0, 2, jbig2HuffmanOOB, 0x002 }, + { -3, 5, 0, 0x018 }, + { 2, 5, 0, 0x019 }, + { 70, 5, 5, 0x01a }, + { 3, 6, 0, 0x036 }, + { 102, 6, 5, 0x037 }, + { 134, 6, 6, 0x038 }, + { 198, 6, 7, 0x039 }, + { 326, 6, 8, 0x03a }, + { 582, 6, 9, 0x03b }, + { 1094, 6, 10, 0x03c }, + { -21, 7, 4, 0x07a }, + { -4, 7, 0, 0x07b }, + { 4, 7, 0, 0x07c }, + { 2118, 7, 11, 0x07d }, + { -5, 8, 0, 0x0fc }, + { 5, 8, 0, 0x0fd }, + { -22, 8, jbig2HuffmanLOW, 0x0fe }, + { 4166, 8, 32, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableK[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 1, 0x002 }, + { 4, 4, 0, 0x00c }, + { 5, 4, 1, 0x00d }, + { 7, 5, 1, 0x01c }, + { 9, 5, 2, 0x01d }, + { 13, 6, 2, 0x03c }, + { 17, 7, 2, 0x07a }, + { 21, 7, 3, 0x07b }, + { 29, 7, 4, 0x07c }, + { 45, 7, 5, 0x07d }, + { 77, 7, 6, 0x07e }, + { 141, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableL[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 1, 0x006 }, + { 5, 5, 0, 0x01c }, + { 6, 5, 1, 0x01d }, + { 8, 6, 1, 0x03c }, + { 10, 7, 0, 0x07a }, + { 11, 7, 1, 0x07b }, + { 13, 7, 2, 0x07c }, + { 17, 7, 3, 0x07d }, + { 25, 7, 4, 0x07e }, + { 41, 8, 5, 0x0fe }, + { 73, 8, 32, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableM[] = { + { 1, 1, 0, 0x000 }, + { 2, 3, 0, 0x004 }, + { 7, 3, 3, 0x005 }, + { 3, 4, 0, 0x00c }, + { 5, 4, 1, 0x00d }, + { 4, 5, 0, 0x01c }, + { 15, 6, 1, 0x03a }, + { 17, 6, 2, 0x03b }, + { 21, 6, 3, 0x03c }, + { 29, 6, 4, 0x03d }, + { 45, 6, 5, 0x03e }, + { 77, 7, 6, 0x07e }, + { 141, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableN[] = { + { 0, 1, 0, 0x000 }, + { -2, 3, 0, 0x004 }, + { -1, 3, 0, 0x005 }, + { 1, 3, 0, 0x006 }, + { 2, 3, 0, 0x007 }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableO[] = { + { 0, 1, 0, 0x000 }, + { -1, 3, 0, 0x004 }, + { 1, 3, 0, 0x005 }, + { -2, 4, 0, 0x00c }, + { 2, 4, 0, 0x00d }, + { -4, 5, 1, 0x01c }, + { 3, 5, 1, 0x01d }, + { -8, 6, 2, 0x03c }, + { 5, 6, 2, 0x03d }, + { -24, 7, 4, 0x07c }, + { 9, 7, 4, 0x07d }, + { -25, 7, jbig2HuffmanLOW, 0x07e }, + { 25, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +//------------------------------------------------------------------------ +// JBIG2HuffmanDecoder +//------------------------------------------------------------------------ + +class JBIG2HuffmanDecoder { +public: + + JBIG2HuffmanDecoder(); + ~JBIG2HuffmanDecoder(); + void setStream(Stream *strA) { str = strA; } + + void reset(); + + // Returns false for OOB, otherwise sets * and returns true. + GBool decodeInt(int *x, JBIG2HuffmanTable *table); + + Guint readBits(Guint n); + Guint readBit(); + + // Sort the table by prefix length and assign prefix values. + void buildTable(JBIG2HuffmanTable *table, Guint len); + +private: + + Stream *str; + Guint buf; + Guint bufLen; +}; + +JBIG2HuffmanDecoder::JBIG2HuffmanDecoder() { + str = NULL; + reset(); +} + +JBIG2HuffmanDecoder::~JBIG2HuffmanDecoder() { +} + +void JBIG2HuffmanDecoder::reset() { + buf = 0; + bufLen = 0; +} + +//~ optimize this +GBool JBIG2HuffmanDecoder::decodeInt(int *x, JBIG2HuffmanTable *table) { + Guint i, len, prefix; + + i = 0; + len = 0; + prefix = 0; + while (table[i].rangeLen != jbig2HuffmanEOT) { + while (len < table[i].prefixLen) { + prefix = (prefix << 1) | readBit(); + ++len; + } + if (prefix == table[i].prefix) { + if (table[i].rangeLen == jbig2HuffmanOOB) { + return gFalse; + } + if (table[i].rangeLen == jbig2HuffmanLOW) { + *x = table[i].val - readBits(32); + } else if (table[i].rangeLen > 0) { + *x = table[i].val + readBits(table[i].rangeLen); + } else { + *x = table[i].val; + } + return gTrue; + } + ++i; + } + return gFalse; +} + +Guint JBIG2HuffmanDecoder::readBits(Guint n) { + Guint x, mask, nLeft; + + mask = (n == 32) ? 0xffffffff : ((1 << n) - 1); + if (bufLen >= n) { + x = (buf >> (bufLen - n)) & mask; + bufLen -= n; + } else { + x = buf & ((1 << bufLen) - 1); + nLeft = n - bufLen; + bufLen = 0; + while (nLeft >= 8) { + x = (x << 8) | (str->getChar() & 0xff); + nLeft -= 8; + } + if (nLeft > 0) { + buf = str->getChar(); + bufLen = 8 - nLeft; + x = (x << nLeft) | ((buf >> bufLen) & ((1 << nLeft) - 1)); + } + } + return x; +} + +Guint JBIG2HuffmanDecoder::readBit() { + if (bufLen == 0) { + buf = str->getChar(); + bufLen = 8; + } + --bufLen; + return (buf >> bufLen) & 1; +} + +void JBIG2HuffmanDecoder::buildTable(JBIG2HuffmanTable *table, Guint len) { + Guint i, j, k, prefix; + JBIG2HuffmanTable tab; + + // stable selection sort: + // - entries with prefixLen > 0, in ascending prefixLen order + // - entry with prefixLen = 0, rangeLen = EOT + // - all other entries with prefixLen = 0 + // (on entry, table[len] has prefixLen = 0, rangeLen = EOT) + for (i = 0; i < len; ++i) { + for (j = i; j < len && table[j].prefixLen == 0; ++j) ; + if (j == len) { + break; + } + for (k = j + 1; k < len; ++k) { + if (table[k].prefixLen > 0 && + table[k].prefixLen < table[j].prefixLen) { + j = k; + } + } + if (j != i) { + tab = table[j]; + for (k = j; k > i; --k) { + table[k] = table[k - 1]; + } + table[i] = tab; + } + } + table[i] = table[len]; + + // assign prefixes + if (table[0].rangeLen != jbig2HuffmanEOT) { + i = 0; + prefix = 0; + table[i++].prefix = prefix++; + for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { + prefix <<= table[i].prefixLen - table[i-1].prefixLen; + table[i].prefix = prefix++; + } + } +} + +//------------------------------------------------------------------------ +// JBIG2MMRDecoder +//------------------------------------------------------------------------ + +class JBIG2MMRDecoder { +public: + + JBIG2MMRDecoder(); + ~JBIG2MMRDecoder(); + void setStream(Stream *strA) { str = strA; } + void reset(); + int get2DCode(); + int getBlackCode(); + int getWhiteCode(); + Guint get24Bits(); + void skipTo(Guint length); + +private: + + Stream *str; + Guint buf; + Guint bufLen; + Guint nBytesRead; +}; + +JBIG2MMRDecoder::JBIG2MMRDecoder() { + str = NULL; + reset(); +} + +JBIG2MMRDecoder::~JBIG2MMRDecoder() { +} + +void JBIG2MMRDecoder::reset() { + buf = 0; + bufLen = 0; + nBytesRead = 0; +} + +int JBIG2MMRDecoder::get2DCode() { + const CCITTCode *p; + + if (bufLen == 0) { + buf = str->getChar() & 0xff; + bufLen = 8; + ++nBytesRead; + p = &twoDimTab1[(buf >> 1) & 0x7f]; + } else if (bufLen == 8) { + p = &twoDimTab1[(buf >> 1) & 0x7f]; + } else { + p = &twoDimTab1[(buf << (7 - bufLen)) & 0x7f]; + if (p->bits < 0 || p->bits > (int)bufLen) { + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + p = &twoDimTab1[(buf >> (bufLen - 7)) & 0x7f]; + } + } + if (p->bits < 0) { + error(errSyntaxError, str->getPos(), "Bad two dim code in JBIG2 MMR stream"); + return EOF; + } + bufLen -= p->bits; + return p->n; +} + +int JBIG2MMRDecoder::getWhiteCode() { + const CCITTCode *p; + Guint code; + + if (bufLen == 0) { + buf = str->getChar() & 0xff; + bufLen = 8; + ++nBytesRead; + } + while (1) { + if (bufLen >= 11 && ((buf >> (bufLen - 7)) & 0x7f) == 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { + code = buf >> (bufLen - 12); + } + p = &whiteTab1[code & 0x1f]; + } else { + if (bufLen <= 9) { + code = buf << (9 - bufLen); + } else { + code = buf >> (bufLen - 9); + } + p = &whiteTab2[code & 0x1ff]; + } + if (p->bits > 0 && p->bits <= (int)bufLen) { + bufLen -= p->bits; + return p->n; + } + if (bufLen >= 12) { + break; + } + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + } + error(errSyntaxError, str->getPos(), "Bad white code in JBIG2 MMR stream"); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + --bufLen; + return 1; +} + +int JBIG2MMRDecoder::getBlackCode() { + const CCITTCode *p; + Guint code; + + if (bufLen == 0) { + buf = str->getChar() & 0xff; + bufLen = 8; + ++nBytesRead; + } + while (1) { + if (bufLen >= 10 && ((buf >> (bufLen - 6)) & 0x3f) == 0) { + if (bufLen <= 13) { + code = buf << (13 - bufLen); + } else { + code = buf >> (bufLen - 13); + } + p = &blackTab1[code & 0x7f]; + } else if (bufLen >= 7 && ((buf >> (bufLen - 4)) & 0x0f) == 0 && + ((buf >> (bufLen - 6)) & 0x03) != 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { + code = buf >> (bufLen - 12); + } + p = &blackTab2[(code & 0xff) - 64]; + } else { + if (bufLen <= 6) { + code = buf << (6 - bufLen); + } else { + code = buf >> (bufLen - 6); + } + p = &blackTab3[code & 0x3f]; + } + if (p->bits > 0 && p->bits <= (int)bufLen) { + bufLen -= p->bits; + return p->n; + } + if (bufLen >= 13) { + break; + } + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + } + error(errSyntaxError, str->getPos(), "Bad black code in JBIG2 MMR stream"); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + --bufLen; + return 1; +} + +Guint JBIG2MMRDecoder::get24Bits() { + while (bufLen < 24) { + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + } + return (buf >> (bufLen - 24)) & 0xffffff; +} + +void JBIG2MMRDecoder::skipTo(Guint length) { + while (nBytesRead < length) { + str->getChar(); + ++nBytesRead; + } +} + +//------------------------------------------------------------------------ +// JBIG2Segment +//------------------------------------------------------------------------ + +enum JBIG2SegmentType { + jbig2SegBitmap, + jbig2SegSymbolDict, + jbig2SegPatternDict, + jbig2SegCodeTable +}; + +class JBIG2Segment { +public: + + JBIG2Segment(Guint segNumA) { segNum = segNumA; } + virtual ~JBIG2Segment() {} + void setSegNum(Guint segNumA) { segNum = segNumA; } + Guint getSegNum() { return segNum; } + virtual JBIG2SegmentType getType() = 0; + +private: + + Guint segNum; +}; + +//------------------------------------------------------------------------ +// JBIG2Bitmap +//------------------------------------------------------------------------ + +struct JBIG2BitmapPtr { + Guchar *p; + int shift; + int x; +}; + +class JBIG2Bitmap: public JBIG2Segment { +public: + + JBIG2Bitmap(Guint segNumA, int wA, int hA); + virtual ~JBIG2Bitmap(); + virtual JBIG2SegmentType getType() { return jbig2SegBitmap; } + JBIG2Bitmap *copy() { return new JBIG2Bitmap(0, this); } + JBIG2Bitmap *getSlice(Guint x, Guint y, Guint wA, Guint hA); + void expand(int newH, Guint pixel); + void clearToZero(); + void clearToOne(); + int getWidth() { return w; } + int getHeight() { return h; } + int getLineSize() { return line; } + int getPixel(int x, int y) + { return (x < 0 || x >= w || y < 0 || y >= h) ? 0 : + (data[y * line + (x >> 3)] >> (7 - (x & 7))) & 1; } + void setPixel(int x, int y) + { data[y * line + (x >> 3)] |= 1 << (7 - (x & 7)); } + void clearPixel(int x, int y) + { data[y * line + (x >> 3)] &= 0x7f7f >> (x & 7); } + void getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr); + int nextPixel(JBIG2BitmapPtr *ptr); + void duplicateRow(int yDest, int ySrc); + void combine(JBIG2Bitmap *bitmap, int x, int y, Guint combOp); + Guchar *getDataPtr() { return data; } + int getDataSize() { return h * line; } + GBool isOk() { return data != NULL; } + +private: + + JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap); + + int w, h, line; + Guchar *data; +}; + +JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, int wA, int hA): + JBIG2Segment(segNumA) +{ + w = wA; + h = hA; + line = (wA + 7) >> 3; + + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { + error(errSyntaxError, -1, "invalid width/height"); + data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); + data[h * line] = 0; +} + +JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap): + JBIG2Segment(segNumA) +{ + if (unlikely(bitmap == NULL)) { + error(errSyntaxError, -1, "NULL bitmap in JBIG2Bitmap"); + w = h = line = 0; + data = NULL; + return; + } + + w = bitmap->w; + h = bitmap->h; + line = bitmap->line; + + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { + error(errSyntaxError, -1, "invalid width/height"); + data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); + memcpy(data, bitmap->data, h * line); + data[h * line] = 0; +} + +JBIG2Bitmap::~JBIG2Bitmap() { + gfree(data); +} + +//~ optimize this +JBIG2Bitmap *JBIG2Bitmap::getSlice(Guint x, Guint y, Guint wA, Guint hA) { + JBIG2Bitmap *slice; + Guint xx, yy; + + slice = new JBIG2Bitmap(0, wA, hA); + if (slice->isOk()) { + slice->clearToZero(); + for (yy = 0; yy < hA; ++yy) { + for (xx = 0; xx < wA; ++xx) { + if (getPixel(x + xx, y + yy)) { + slice->setPixel(xx, yy); + } + } + } + } else { + delete slice; + slice = NULL; + } + return slice; +} + +void JBIG2Bitmap::expand(int newH, Guint pixel) { + if (newH <= h || line <= 0 || newH >= (INT_MAX - 1) / line) { + error(errSyntaxError, -1, "invalid width/height"); + gfree(data); + data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)grealloc(data, newH * line + 1); + if (pixel) { + memset(data + h * line, 0xff, (newH - h) * line); + } else { + memset(data + h * line, 0x00, (newH - h) * line); + } + h = newH; + data[h * line] = 0; +} + +void JBIG2Bitmap::clearToZero() { + memset(data, 0, h * line); +} + +void JBIG2Bitmap::clearToOne() { + memset(data, 0xff, h * line); +} + +inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) { + if (y < 0 || y >= h || x >= w) { + ptr->p = NULL; + ptr->shift = 0; // make gcc happy + ptr->x = 0; // make gcc happy + } else if (x < 0) { + ptr->p = &data[y * line]; + ptr->shift = 7; + ptr->x = x; + } else { + ptr->p = &data[y * line + (x >> 3)]; + ptr->shift = 7 - (x & 7); + ptr->x = x; + } +} + +inline int JBIG2Bitmap::nextPixel(JBIG2BitmapPtr *ptr) { + int pix; + + if (!ptr->p) { + pix = 0; + } else if (ptr->x < 0) { + ++ptr->x; + pix = 0; + } else { + pix = (*ptr->p >> ptr->shift) & 1; + if (++ptr->x == w) { + ptr->p = NULL; + } else if (ptr->shift == 0) { + ++ptr->p; + ptr->shift = 7; + } else { + --ptr->shift; + } + } + return pix; +} + +void JBIG2Bitmap::duplicateRow(int yDest, int ySrc) { + memcpy(data + yDest * line, data + ySrc * line, line); +} + +void JBIG2Bitmap::combine(JBIG2Bitmap *bitmap, int x, int y, + Guint combOp) { + int x0, x1, y0, y1, xx, yy; + Guchar *srcPtr, *destPtr; + Guint src0, src1, src, dest, s1, s2, m1, m2, m3; + GBool oneByte; + + // check for the pathological case where y = -2^31 + if (y < -0x7fffffff) { + return; + } + if (y < 0) { + y0 = -y; + } else { + y0 = 0; + } + if (y + bitmap->h > h) { + y1 = h - y; + } else { + y1 = bitmap->h; + } + if (y0 >= y1) { + return; + } + + if (x >= 0) { + x0 = x & ~7; + } else { + x0 = 0; + } + x1 = x + bitmap->w; + if (x1 > w) { + x1 = w; + } + if (x0 >= x1) { + return; + } + + s1 = x & 7; + s2 = 8 - s1; + m1 = 0xff >> (x1 & 7); + m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); + m3 = (0xff >> s1) & m2; + + oneByte = x0 == ((x1 - 1) & ~7); + + for (yy = y0; yy < y1; ++yy) { + + // one byte per line -- need to mask both left and right side + if (oneByte) { + if (x >= 0) { + destPtr = data + (y + yy) * line + (x >> 3); + srcPtr = bitmap->data + yy * bitmap->line; + dest = *destPtr; + src1 = *srcPtr; + switch (combOp) { + case 0: // or + dest |= (src1 >> s1) & m2; + break; + case 1: // and + dest &= ((0xff00 | src1) >> s1) | m1; + break; + case 2: // xor + dest ^= (src1 >> s1) & m2; + break; + case 3: // xnor + dest ^= ((src1 ^ 0xff) >> s1) & m2; + break; + case 4: // replace + dest = (dest & ~m3) | ((src1 >> s1) & m3); + break; + } + *destPtr = dest; + } else { + destPtr = data + (y + yy) * line; + srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); + dest = *destPtr; + src1 = *srcPtr; + switch (combOp) { + case 0: // or + dest |= src1 & m2; + break; + case 1: // and + dest &= src1 | m1; + break; + case 2: // xor + dest ^= src1 & m2; + break; + case 3: // xnor + dest ^= (src1 ^ 0xff) & m2; + break; + case 4: // replace + dest = (src1 & m2) | (dest & m1); + break; + } + *destPtr = dest; + } + + // multiple bytes per line -- need to mask left side of left-most + // byte and right side of right-most byte + } else { + + // left-most byte + if (x >= 0) { + destPtr = data + (y + yy) * line + (x >> 3); + srcPtr = bitmap->data + yy * bitmap->line; + src1 = *srcPtr++; + dest = *destPtr; + switch (combOp) { + case 0: // or + dest |= src1 >> s1; + break; + case 1: // and + dest &= (0xff00 | src1) >> s1; + break; + case 2: // xor + dest ^= src1 >> s1; + break; + case 3: // xnor + dest ^= (src1 ^ 0xff) >> s1; + break; + case 4: // replace + dest = (dest & (0xff << s2)) | (src1 >> s1); + break; + } + *destPtr++ = dest; + xx = x0 + 8; + } else { + destPtr = data + (y + yy) * line; + srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + } + + // middle bytes + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + switch (combOp) { + case 0: // or + dest |= src; + break; + case 1: // and + dest &= src; + break; + case 2: // xor + dest ^= src; + break; + case 3: // xnor + dest ^= src ^ 0xff; + break; + case 4: // replace + dest = src; + break; + } + *destPtr++ = dest; + } + + // right-most byte + // note: this last byte (src1) may not actually be used, depending + // on the values of s1, m1, and m2 - and in fact, it may be off + // the edge of the source bitmap, which means we need to allocate + // one extra guard byte at the end of each bitmap + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + switch (combOp) { + case 0: // or + dest |= src & m2; + break; + case 1: // and + dest &= src | m1; + break; + case 2: // xor + dest ^= src & m2; + break; + case 3: // xnor + dest ^= (src ^ 0xff) & m2; + break; + case 4: // replace + dest = (src & m2) | (dest & m1); + break; + } + *destPtr = dest; + } + } +} + +//------------------------------------------------------------------------ +// JBIG2SymbolDict +//------------------------------------------------------------------------ + +class JBIG2SymbolDict: public JBIG2Segment { +public: + + JBIG2SymbolDict(Guint segNumA, Guint sizeA); + virtual ~JBIG2SymbolDict(); + virtual JBIG2SegmentType getType() { return jbig2SegSymbolDict; } + Guint getSize() { return size; } + void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } + JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } + GBool isOk() { return bitmaps != NULL; } + void setGenericRegionStats(JArithmeticDecoderStats *stats) + { genericRegionStats = stats; } + void setRefinementRegionStats(JArithmeticDecoderStats *stats) + { refinementRegionStats = stats; } + JArithmeticDecoderStats *getGenericRegionStats() + { return genericRegionStats; } + JArithmeticDecoderStats *getRefinementRegionStats() + { return refinementRegionStats; } + +private: + + Guint size; + JBIG2Bitmap **bitmaps; + JArithmeticDecoderStats *genericRegionStats; + JArithmeticDecoderStats *refinementRegionStats; +}; + +JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA): + JBIG2Segment(segNumA) +{ + Guint i; + + size = sizeA; + bitmaps = (JBIG2Bitmap **)gmallocn_checkoverflow(size, sizeof(JBIG2Bitmap *)); + if (!bitmaps) size = 0; + for (i = 0; i < size; ++i) { + bitmaps[i] = NULL; + } + genericRegionStats = NULL; + refinementRegionStats = NULL; +} + +JBIG2SymbolDict::~JBIG2SymbolDict() { + Guint i; + + for (i = 0; i < size; ++i) { + delete bitmaps[i]; + } + gfree(bitmaps); + if (genericRegionStats) { + delete genericRegionStats; + } + if (refinementRegionStats) { + delete refinementRegionStats; + } +} + +//------------------------------------------------------------------------ +// JBIG2PatternDict +//------------------------------------------------------------------------ + +class JBIG2PatternDict: public JBIG2Segment { +public: + + JBIG2PatternDict(Guint segNumA, Guint sizeA); + virtual ~JBIG2PatternDict(); + virtual JBIG2SegmentType getType() { return jbig2SegPatternDict; } + Guint getSize() { return size; } + void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } + JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } + +private: + + Guint size; + JBIG2Bitmap **bitmaps; +}; + +JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA): + JBIG2Segment(segNumA) +{ + size = sizeA; + bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); +} + +JBIG2PatternDict::~JBIG2PatternDict() { + Guint i; + + for (i = 0; i < size; ++i) { + delete bitmaps[i]; + } + gfree(bitmaps); +} + +//------------------------------------------------------------------------ +// JBIG2CodeTable +//------------------------------------------------------------------------ + +class JBIG2CodeTable: public JBIG2Segment { +public: + + JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA); + virtual ~JBIG2CodeTable(); + virtual JBIG2SegmentType getType() { return jbig2SegCodeTable; } + JBIG2HuffmanTable *getHuffTable() { return table; } + +private: + + JBIG2HuffmanTable *table; +}; + +JBIG2CodeTable::JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA): + JBIG2Segment(segNumA) +{ + table = tableA; +} + +JBIG2CodeTable::~JBIG2CodeTable() { + gfree(table); +} + +//------------------------------------------------------------------------ +// JBIG2Stream +//------------------------------------------------------------------------ + +JBIG2Stream::JBIG2Stream(Stream *strA, Object *globalsStreamA): + FilterStream(strA) +{ + pageBitmap = NULL; + + arithDecoder = new JArithmeticDecoder(); + genericRegionStats = new JArithmeticDecoderStats(1 << 1); + refinementRegionStats = new JArithmeticDecoderStats(1 << 1); + iadhStats = new JArithmeticDecoderStats(1 << 9); + iadwStats = new JArithmeticDecoderStats(1 << 9); + iaexStats = new JArithmeticDecoderStats(1 << 9); + iaaiStats = new JArithmeticDecoderStats(1 << 9); + iadtStats = new JArithmeticDecoderStats(1 << 9); + iaitStats = new JArithmeticDecoderStats(1 << 9); + iafsStats = new JArithmeticDecoderStats(1 << 9); + iadsStats = new JArithmeticDecoderStats(1 << 9); + iardxStats = new JArithmeticDecoderStats(1 << 9); + iardyStats = new JArithmeticDecoderStats(1 << 9); + iardwStats = new JArithmeticDecoderStats(1 << 9); + iardhStats = new JArithmeticDecoderStats(1 << 9); + iariStats = new JArithmeticDecoderStats(1 << 9); + iaidStats = new JArithmeticDecoderStats(1 << 1); + huffDecoder = new JBIG2HuffmanDecoder(); + mmrDecoder = new JBIG2MMRDecoder(); + + globalsStreamA->copy(&globalsStream); + segments = globalSegments = NULL; + curStr = NULL; + dataPtr = dataEnd = NULL; +} + +JBIG2Stream::~JBIG2Stream() { + close(); + globalsStream.free(); + delete arithDecoder; + delete genericRegionStats; + delete refinementRegionStats; + delete iadhStats; + delete iadwStats; + delete iaexStats; + delete iaaiStats; + delete iadtStats; + delete iaitStats; + delete iafsStats; + delete iadsStats; + delete iardxStats; + delete iardyStats; + delete iardwStats; + delete iardhStats; + delete iariStats; + delete iaidStats; + delete huffDecoder; + delete mmrDecoder; + delete str; +} + +void JBIG2Stream::reset() { + // read the globals stream + globalSegments = new GooList(); + if (globalsStream.isStream()) { + segments = globalSegments; + curStr = globalsStream.getStream(); + curStr->reset(); + arithDecoder->setStream(curStr); + huffDecoder->setStream(curStr); + mmrDecoder->setStream(curStr); + readSegments(); + curStr->close(); + } + + // read the main stream + segments = new GooList(); + curStr = str; + curStr->reset(); + arithDecoder->setStream(curStr); + huffDecoder->setStream(curStr); + mmrDecoder->setStream(curStr); + readSegments(); + + if (pageBitmap) { + dataPtr = pageBitmap->getDataPtr(); + dataEnd = dataPtr + pageBitmap->getDataSize(); + } else { + dataPtr = dataEnd = NULL; + } +} + +void JBIG2Stream::close() { + if (pageBitmap) { + delete pageBitmap; + pageBitmap = NULL; + } + if (segments) { + deleteGooList(segments, JBIG2Segment); + segments = NULL; + } + if (globalSegments) { + deleteGooList(globalSegments, JBIG2Segment); + globalSegments = NULL; + } + dataPtr = dataEnd = NULL; + FilterStream::close(); +} + +int JBIG2Stream::getChar() { + if (dataPtr && dataPtr < dataEnd) { + return (*dataPtr++ ^ 0xff) & 0xff; + } + return EOF; +} + +int JBIG2Stream::lookChar() { + if (dataPtr && dataPtr < dataEnd) { + return (*dataPtr ^ 0xff) & 0xff; + } + return EOF; +} + +int JBIG2Stream::getPos() { + if (pageBitmap == NULL) { + return 0; + } + return dataPtr - pageBitmap->getDataPtr(); +} + +int JBIG2Stream::getChars(int nChars, Guchar *buffer) { + int n, i; + + if (nChars <= 0) { + return 0; + } + if (dataEnd - dataPtr < nChars) { + n = (int)(dataEnd - dataPtr); + } else { + n = nChars; + } + for (i = 0; i < n; ++i) { + buffer[i] = *dataPtr++ ^ 0xff; + } + return n; +} + +GooString *JBIG2Stream::getPSFilter(int psLevel, const char *indent) { + return NULL; +} + +GBool JBIG2Stream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void JBIG2Stream::readSegments() { + Guint segNum, segFlags, segType, page, segLength; + Guint refFlags, nRefSegs; + Guint *refSegs; + int segDataPos; + int c1, c2, c3; + Guint i; + + while (readULong(&segNum)) { + + // segment header flags + if (!readUByte(&segFlags)) { + goto eofError1; + } + segType = segFlags & 0x3f; + + // referred-to segment count and retention flags + if (!readUByte(&refFlags)) { + goto eofError1; + } + nRefSegs = refFlags >> 5; + if (nRefSegs == 7) { + if ((c1 = curStr->getChar()) == EOF || + (c2 = curStr->getChar()) == EOF || + (c3 = curStr->getChar()) == EOF) { + goto eofError1; + } + refFlags = (refFlags << 24) | (c1 << 16) | (c2 << 8) | c3; + nRefSegs = refFlags & 0x1fffffff; + for (i = 0; i < (nRefSegs + 9) >> 3; ++i) { + if ((c1 = curStr->getChar()) == EOF) { + goto eofError1; + } + } + } + + // referred-to segment numbers + refSegs = (Guint *)gmallocn(nRefSegs, sizeof(Guint)); + if (segNum <= 256) { + for (i = 0; i < nRefSegs; ++i) { + if (!readUByte(&refSegs[i])) { + goto eofError2; + } + } + } else if (segNum <= 65536) { + for (i = 0; i < nRefSegs; ++i) { + if (!readUWord(&refSegs[i])) { + goto eofError2; + } + } + } else { + for (i = 0; i < nRefSegs; ++i) { + if (!readULong(&refSegs[i])) { + goto eofError2; + } + } + } + + // segment page association + if (segFlags & 0x40) { + if (!readULong(&page)) { + goto eofError2; + } + } else { + if (!readUByte(&page)) { + goto eofError2; + } + } + + // segment data length + if (!readULong(&segLength)) { + goto eofError2; + } + + // keep track of the start of the segment data + segDataPos = curStr->getPos(); + + // check for missing page information segment + if (!pageBitmap && ((segType >= 4 && segType <= 7) || + (segType >= 20 && segType <= 43))) { + error(errSyntaxError, curStr->getPos(), "First JBIG2 segment associated with a page must be a page information segment"); + goto syntaxError; + } + + // read the segment data + switch (segType) { + case 0: + if (!readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs)) { + goto syntaxError; + } + break; + case 4: + readTextRegionSeg(segNum, gFalse, gFalse, segLength, refSegs, nRefSegs); + break; + case 6: + readTextRegionSeg(segNum, gTrue, gFalse, segLength, refSegs, nRefSegs); + break; + case 7: + readTextRegionSeg(segNum, gTrue, gTrue, segLength, refSegs, nRefSegs); + break; + case 16: + readPatternDictSeg(segNum, segLength); + break; + case 20: + readHalftoneRegionSeg(segNum, gFalse, gFalse, segLength, + refSegs, nRefSegs); + break; + case 22: + readHalftoneRegionSeg(segNum, gTrue, gFalse, segLength, + refSegs, nRefSegs); + break; + case 23: + readHalftoneRegionSeg(segNum, gTrue, gTrue, segLength, + refSegs, nRefSegs); + break; + case 36: + readGenericRegionSeg(segNum, gFalse, gFalse, segLength); + break; + case 38: + readGenericRegionSeg(segNum, gTrue, gFalse, segLength); + break; + case 39: + readGenericRegionSeg(segNum, gTrue, gTrue, segLength); + break; + case 40: + readGenericRefinementRegionSeg(segNum, gFalse, gFalse, segLength, + refSegs, nRefSegs); + break; + case 42: + readGenericRefinementRegionSeg(segNum, gTrue, gFalse, segLength, + refSegs, nRefSegs); + break; + case 43: + readGenericRefinementRegionSeg(segNum, gTrue, gTrue, segLength, + refSegs, nRefSegs); + break; + case 48: + readPageInfoSeg(segLength); + break; + case 50: + readEndOfStripeSeg(segLength); + break; + case 52: + readProfilesSeg(segLength); + break; + case 53: + readCodeTableSeg(segNum, segLength); + break; + case 62: + readExtensionSeg(segLength); + break; + default: + error(errSyntaxError, curStr->getPos(), "Unknown segment type in JBIG2 stream"); + for (i = 0; i < segLength; ++i) { + if ((c1 = curStr->getChar()) == EOF) { + goto eofError2; + } + } + break; + } + + // Make sure the segment handler read all of the bytes in the + // segment data, unless this segment is marked as having an + // unknown length (section 7.2.7 of the JBIG2 Final Committee Draft) + + if (segLength != 0xffffffff) { + + int segExtraBytes = segDataPos + segLength - curStr->getPos(); + if (segExtraBytes > 0) { + + // If we didn't read all of the bytes in the segment data, + // indicate an error, and throw away the rest of the data. + + // v.3.1.01.13 of the LuraTech PDF Compressor Server will + // sometimes generate an extraneous NULL byte at the end of + // arithmetic-coded symbol dictionary segments when numNewSyms + // == 0. Segments like this often occur for blank pages. + + error(errSyntaxError, curStr->getPos(), "{0:d} extraneous byte{1:s} after segment", + segExtraBytes, (segExtraBytes > 1) ? "s" : ""); + + // Burn through the remaining bytes -- inefficient, but + // hopefully we're not doing this much + + int trash; + for (int i = segExtraBytes; i > 0; i--) { + readByte(&trash); + } + + } else if (segExtraBytes < 0) { + + // If we read more bytes than we should have, according to the + // segment length field, note an error. + + error(errSyntaxError, curStr->getPos(), "Previous segment handler read too many bytes"); + + } + + } + + gfree(refSegs); + } + + return; + + syntaxError: + gfree(refSegs); + return; + + eofError2: + gfree(refSegs); + eofError1: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +GBool JBIG2Stream::readSymbolDictSeg(Guint segNum, Guint length, + Guint *refSegs, Guint nRefSegs) { + JBIG2SymbolDict *symbolDict; + JBIG2HuffmanTable *huffDHTable, *huffDWTable; + JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable; + JBIG2Segment *seg; + GooList *codeTables; + JBIG2SymbolDict *inputSymbolDict; + Guint flags, sdTemplate, sdrTemplate, huff, refAgg; + Guint huffDH, huffDW, huffBMSize, huffAggInst; + Guint contextUsed, contextRetained; + int sdATX[4], sdATY[4], sdrATX[2], sdrATY[2]; + Guint numExSyms, numNewSyms, numInputSyms, symCodeLen; + JBIG2Bitmap **bitmaps; + JBIG2Bitmap *collBitmap, *refBitmap; + Guint *symWidths; + Guint symHeight, symWidth, totalWidth, x, symID; + int dh, dw, refAggNum, refDX, refDY, bmSize; + GBool ex; + int run, cnt, c; + Guint i, j, k; + Guchar *p; + + symWidths = NULL; + + // symbol dictionary flags + if (!readUWord(&flags)) { + goto eofError; + } + sdTemplate = (flags >> 10) & 3; + sdrTemplate = (flags >> 12) & 1; + huff = flags & 1; + refAgg = (flags >> 1) & 1; + huffDH = (flags >> 2) & 3; + huffDW = (flags >> 4) & 3; + huffBMSize = (flags >> 6) & 1; + huffAggInst = (flags >> 7) & 1; + contextUsed = (flags >> 8) & 1; + contextRetained = (flags >> 9) & 1; + + // symbol dictionary AT flags + if (!huff) { + if (sdTemplate == 0) { + if (!readByte(&sdATX[0]) || + !readByte(&sdATY[0]) || + !readByte(&sdATX[1]) || + !readByte(&sdATY[1]) || + !readByte(&sdATX[2]) || + !readByte(&sdATY[2]) || + !readByte(&sdATX[3]) || + !readByte(&sdATY[3])) { + goto eofError; + } + } else { + if (!readByte(&sdATX[0]) || + !readByte(&sdATY[0])) { + goto eofError; + } + } + } + + // symbol dictionary refinement AT flags + if (refAgg && !sdrTemplate) { + if (!readByte(&sdrATX[0]) || + !readByte(&sdrATY[0]) || + !readByte(&sdrATX[1]) || + !readByte(&sdrATY[1])) { + goto eofError; + } + } + + // SDNUMEXSYMS and SDNUMNEWSYMS + if (!readULong(&numExSyms) || !readULong(&numNewSyms)) { + goto eofError; + } + + // get referenced segments: input symbol dictionaries and code tables + codeTables = new GooList(); + numInputSyms = 0; + for (i = 0; i < nRefSegs; ++i) { + // This is need by bug 12014, returning gFalse makes it not crash + // but we end up with a empty page while acroread is able to render + // part of it + if ((seg = findSegment(refSegs[i]))) { + if (seg->getType() == jbig2SegSymbolDict) { + j = ((JBIG2SymbolDict *)seg)->getSize(); + if (numInputSyms > UINT_MAX - j) { + error(errSyntaxError, curStr->getPos(), "Too many input symbols in JBIG2 symbol dictionary"); + delete codeTables; + goto eofError; + } + numInputSyms += j; + } else if (seg->getType() == jbig2SegCodeTable) { + codeTables->append(seg); + } + } else { + delete codeTables; + return gFalse; + } + } + if (numInputSyms > UINT_MAX - numNewSyms) { + error(errSyntaxError, curStr->getPos(), "Too many input symbols in JBIG2 symbol dictionary"); + delete codeTables; + goto eofError; + } + + // compute symbol code length, per 6.5.8.2.3 + // symCodeLen = ceil( log2( numInputSyms + numNewSyms ) ) + i = numInputSyms + numNewSyms; + if (i <= 1) { + symCodeLen = huff ? 1 : 0; + } else { + --i; + symCodeLen = 0; + // i = floor((numSyms-1) / 2^symCodeLen) + while (i > 0) { + ++symCodeLen; + i >>= 1; + } + } + + // get the input symbol bitmaps + bitmaps = (JBIG2Bitmap **)gmallocn_checkoverflow(numInputSyms + numNewSyms, + sizeof(JBIG2Bitmap *)); + if (!bitmaps && (numInputSyms + numNewSyms > 0)) { + error(errSyntaxError, curStr->getPos(), "Too many input symbols in JBIG2 symbol dictionary"); + delete codeTables; + goto eofError; + } + for (i = 0; i < numInputSyms + numNewSyms; ++i) { + bitmaps[i] = NULL; + } + k = 0; + inputSymbolDict = NULL; + for (i = 0; i < nRefSegs; ++i) { + seg = findSegment(refSegs[i]); + if (seg != NULL && seg->getType() == jbig2SegSymbolDict) { + inputSymbolDict = (JBIG2SymbolDict *)seg; + for (j = 0; j < inputSymbolDict->getSize(); ++j) { + bitmaps[k++] = inputSymbolDict->getBitmap(j); + } + } + } + + // get the Huffman tables + huffDHTable = huffDWTable = NULL; // make gcc happy + huffBMSizeTable = huffAggInstTable = NULL; // make gcc happy + i = 0; + if (huff) { + if (huffDH == 0) { + huffDHTable = huffTableD; + } else if (huffDH == 1) { + huffDHTable = huffTableE; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDW == 0) { + huffDWTable = huffTableB; + } else if (huffDW == 1) { + huffDWTable = huffTableC; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffBMSize == 0) { + huffBMSizeTable = huffTableA; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffBMSizeTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffAggInst == 0) { + huffAggInstTable = huffTableA; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffAggInstTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + } + delete codeTables; + + // set up the Huffman decoder + if (huff) { + huffDecoder->reset(); + + // set up the arithmetic decoder + } else { + if (contextUsed && inputSymbolDict) { + resetGenericStats(sdTemplate, inputSymbolDict->getGenericRegionStats()); + } else { + resetGenericStats(sdTemplate, NULL); + } + resetIntStats(symCodeLen); + arithDecoder->start(); + } + + // set up the arithmetic decoder for refinement/aggregation + if (refAgg) { + if (contextUsed && inputSymbolDict) { + resetRefinementStats(sdrTemplate, + inputSymbolDict->getRefinementRegionStats()); + } else { + resetRefinementStats(sdrTemplate, NULL); + } + } + + // allocate symbol widths storage + if (huff && !refAgg) { + symWidths = (Guint *)gmallocn(numNewSyms, sizeof(Guint)); + } + + symHeight = 0; + i = 0; + while (i < numNewSyms) { + + // read the height class delta height + if (huff) { + huffDecoder->decodeInt(&dh, huffDHTable); + } else { + arithDecoder->decodeInt(&dh, iadhStats); + } + if (dh < 0 && (Guint)-dh >= symHeight) { + error(errSyntaxError, curStr->getPos(), "Bad delta-height value in JBIG2 symbol dictionary"); + goto syntaxError; + } + symHeight += dh; + symWidth = 0; + totalWidth = 0; + j = i; + + // read the symbols in this height class + while (1) { + + // read the delta width + if (huff) { + if (!huffDecoder->decodeInt(&dw, huffDWTable)) { + break; + } + } else { + if (!arithDecoder->decodeInt(&dw, iadwStats)) { + break; + } + } + if (dw < 0 && (Guint)-dw >= symWidth) { + error(errSyntaxError, curStr->getPos(), "Bad delta-height value in JBIG2 symbol dictionary"); + goto syntaxError; + } + symWidth += dw; + if (i >= numNewSyms) { + error(errSyntaxError, curStr->getPos(), "Too many symbols in JBIG2 symbol dictionary"); + goto syntaxError; + } + + // using a collective bitmap, so don't read a bitmap here + if (huff && !refAgg) { + symWidths[i] = symWidth; + totalWidth += symWidth; + + // refinement/aggregate coding + } else if (refAgg) { + if (huff) { + if (!huffDecoder->decodeInt(&refAggNum, huffAggInstTable)) { + break; + } + } else { + if (!arithDecoder->decodeInt(&refAggNum, iaaiStats)) { + break; + } + } +#if 0 //~ This special case was added about a year before the final draft + //~ of the JBIG2 spec was released. I have encountered some old + //~ JBIG2 images that predate it. + if (0) { +#else + if (refAggNum == 1) { +#endif + if (huff) { + symID = huffDecoder->readBits(symCodeLen); + huffDecoder->decodeInt(&refDX, huffTableO); + huffDecoder->decodeInt(&refDY, huffTableO); + huffDecoder->decodeInt(&bmSize, huffTableA); + huffDecoder->reset(); + arithDecoder->start(); + } else { + symID = arithDecoder->decodeIAID(symCodeLen, iaidStats); + arithDecoder->decodeInt(&refDX, iardxStats); + arithDecoder->decodeInt(&refDY, iardyStats); + } + if (symID >= numInputSyms + i) { + error(errSyntaxError, curStr->getPos(), "Invalid symbol ID in JBIG2 symbol dictionary"); + goto syntaxError; + } + refBitmap = bitmaps[symID]; + bitmaps[numInputSyms + i] = + readGenericRefinementRegion(symWidth, symHeight, + sdrTemplate, gFalse, + refBitmap, refDX, refDY, + sdrATX, sdrATY); + //~ do we need to use the bmSize value here (in Huffman mode)? + } else { + bitmaps[numInputSyms + i] = + readTextRegion(huff, gTrue, symWidth, symHeight, + refAggNum, 0, numInputSyms + i, NULL, + symCodeLen, bitmaps, 0, 0, 0, 1, 0, + huffTableF, huffTableH, huffTableK, huffTableO, + huffTableO, huffTableO, huffTableO, huffTableA, + sdrTemplate, sdrATX, sdrATY); + } + + // non-ref/agg coding + } else { + bitmaps[numInputSyms + i] = + readGenericBitmap(gFalse, symWidth, symHeight, + sdTemplate, gFalse, gFalse, NULL, + sdATX, sdATY, 0); + } + + ++i; + } + + // read the collective bitmap + if (huff && !refAgg) { + huffDecoder->decodeInt(&bmSize, huffBMSizeTable); + huffDecoder->reset(); + if (bmSize == 0) { + collBitmap = new JBIG2Bitmap(0, totalWidth, symHeight); + bmSize = symHeight * ((totalWidth + 7) >> 3); + p = collBitmap->getDataPtr(); + for (k = 0; k < (Guint)bmSize; ++k) { + if ((c = curStr->getChar()) == EOF) { + break; + } + *p++ = (Guchar)c; + } + } else { + collBitmap = readGenericBitmap(gTrue, totalWidth, symHeight, + 0, gFalse, gFalse, NULL, NULL, NULL, + bmSize); + } + if (likely(collBitmap != NULL)) { + x = 0; + for (; j < i; ++j) { + bitmaps[numInputSyms + j] = + collBitmap->getSlice(x, 0, symWidths[j], symHeight); + x += symWidths[j]; + } + delete collBitmap; + } else { + error(errSyntaxError, curStr->getPos(), "collBitmap was null"); + goto syntaxError; + } + } + } + + // create the symbol dict object + symbolDict = new JBIG2SymbolDict(segNum, numExSyms); + if (!symbolDict->isOk()) { + delete symbolDict; + goto syntaxError; + } + + // exported symbol list + i = j = 0; + ex = gFalse; + while (i < numInputSyms + numNewSyms) { + if (huff) { + huffDecoder->decodeInt(&run, huffTableA); + } else { + arithDecoder->decodeInt(&run, iaexStats); + } + if (i + run > numInputSyms + numNewSyms || + (ex && j + run > numExSyms)) { + error(errSyntaxError, curStr->getPos(), "Too many exported symbols in JBIG2 symbol dictionary"); + for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL); + delete symbolDict; + goto syntaxError; + } + if (ex) { + for (cnt = 0; cnt < run; ++cnt) { + symbolDict->setBitmap(j++, bitmaps[i++]->copy()); + } + } else { + i += run; + } + ex = !ex; + } + if (j != numExSyms) { + error(errSyntaxError, curStr->getPos(), "Too few symbols in JBIG2 symbol dictionary"); + for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL); + delete symbolDict; + goto syntaxError; + } + + for (i = 0; i < numNewSyms; ++i) { + delete bitmaps[numInputSyms + i]; + } + gfree(bitmaps); + if (symWidths) { + gfree(symWidths); + } + + // save the arithmetic decoder stats + if (!huff && contextRetained) { + symbolDict->setGenericRegionStats(genericRegionStats->copy()); + if (refAgg) { + symbolDict->setRefinementRegionStats(refinementRegionStats->copy()); + } + } + + // store the new symbol dict + segments->append(symbolDict); + + return gTrue; + + codeTableError: + error(errSyntaxError, curStr->getPos(), "Missing code table in JBIG2 symbol dictionary"); + delete codeTables; + + syntaxError: + for (i = 0; i < numNewSyms; ++i) { + if (bitmaps[numInputSyms + i]) { + delete bitmaps[numInputSyms + i]; + } + } + gfree(bitmaps); + if (symWidths) { + gfree(symWidths); + } + return gFalse; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); + return gFalse; +} + +void JBIG2Stream::readTextRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs) { + JBIG2Bitmap *bitmap; + JBIG2HuffmanTable runLengthTab[36]; + JBIG2HuffmanTable *symCodeTab; + JBIG2HuffmanTable *huffFSTable, *huffDSTable, *huffDTTable; + JBIG2HuffmanTable *huffRDWTable, *huffRDHTable; + JBIG2HuffmanTable *huffRDXTable, *huffRDYTable, *huffRSizeTable; + JBIG2Segment *seg; + GooList *codeTables; + JBIG2SymbolDict *symbolDict; + JBIG2Bitmap **syms; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, huff, refine, logStrips, refCorner, transposed; + Guint combOp, defPixel, templ; + int sOffset; + Guint huffFlags, huffFS, huffDS, huffDT; + Guint huffRDW, huffRDH, huffRDX, huffRDY, huffRSize; + Guint numInstances, numSyms, symCodeLen; + int atx[2], aty[2]; + Guint i, k, kk; + int j; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the text region header + if (!readUWord(&flags)) { + goto eofError; + } + huff = flags & 1; + refine = (flags >> 1) & 1; + logStrips = (flags >> 2) & 3; + refCorner = (flags >> 4) & 3; + transposed = (flags >> 6) & 1; + combOp = (flags >> 7) & 3; + defPixel = (flags >> 9) & 1; + sOffset = (flags >> 10) & 0x1f; + if (sOffset & 0x10) { + sOffset |= -1 - 0x0f; + } + templ = (flags >> 15) & 1; + huffFS = huffDS = huffDT = 0; // make gcc happy + huffRDW = huffRDH = huffRDX = huffRDY = huffRSize = 0; // make gcc happy + if (huff) { + if (!readUWord(&huffFlags)) { + goto eofError; + } + huffFS = huffFlags & 3; + huffDS = (huffFlags >> 2) & 3; + huffDT = (huffFlags >> 4) & 3; + huffRDW = (huffFlags >> 6) & 3; + huffRDH = (huffFlags >> 8) & 3; + huffRDX = (huffFlags >> 10) & 3; + huffRDY = (huffFlags >> 12) & 3; + huffRSize = (huffFlags >> 14) & 1; + } + if (refine && templ == 0) { + if (!readByte(&atx[0]) || !readByte(&aty[0]) || + !readByte(&atx[1]) || !readByte(&aty[1])) { + goto eofError; + } + } + if (!readULong(&numInstances)) { + goto eofError; + } + + // get symbol dictionaries and tables + codeTables = new GooList(); + numSyms = 0; + for (i = 0; i < nRefSegs; ++i) { + if ((seg = findSegment(refSegs[i]))) { + if (seg->getType() == jbig2SegSymbolDict) { + numSyms += ((JBIG2SymbolDict *)seg)->getSize(); + } else if (seg->getType() == jbig2SegCodeTable) { + codeTables->append(seg); + } + } else { + error(errSyntaxError, curStr->getPos(), "Invalid segment reference in JBIG2 text region"); + delete codeTables; + return; + } + } + i = numSyms; + if (i <= 1) { + symCodeLen = huff ? 1 : 0; + } else { + --i; + symCodeLen = 0; + // i = floor((numSyms-1) / 2^symCodeLen) + while (i > 0) { + ++symCodeLen; + i >>= 1; + } + } + + // get the symbol bitmaps + syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *)); + kk = 0; + for (i = 0; i < nRefSegs; ++i) { + if ((seg = findSegment(refSegs[i]))) { + if (seg->getType() == jbig2SegSymbolDict) { + symbolDict = (JBIG2SymbolDict *)seg; + for (k = 0; k < symbolDict->getSize(); ++k) { + syms[kk++] = symbolDict->getBitmap(k); + } + } + } + } + + // get the Huffman tables + huffFSTable = huffDSTable = huffDTTable = NULL; // make gcc happy + huffRDWTable = huffRDHTable = NULL; // make gcc happy + huffRDXTable = huffRDYTable = huffRSizeTable = NULL; // make gcc happy + i = 0; + if (huff) { + if (huffFS == 0) { + huffFSTable = huffTableF; + } else if (huffFS == 1) { + huffFSTable = huffTableG; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDS == 0) { + huffDSTable = huffTableH; + } else if (huffDS == 1) { + huffDSTable = huffTableI; + } else if (huffDS == 2) { + huffDSTable = huffTableJ; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDT == 0) { + huffDTTable = huffTableK; + } else if (huffDT == 1) { + huffDTTable = huffTableL; + } else if (huffDT == 2) { + huffDTTable = huffTableM; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDW == 0) { + huffRDWTable = huffTableN; + } else if (huffRDW == 1) { + huffRDWTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDH == 0) { + huffRDHTable = huffTableN; + } else if (huffRDH == 1) { + huffRDHTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDX == 0) { + huffRDXTable = huffTableN; + } else if (huffRDX == 1) { + huffRDXTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDY == 0) { + huffRDYTable = huffTableN; + } else if (huffRDY == 1) { + huffRDYTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRSize == 0) { + huffRSizeTable = huffTableA; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRSizeTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + } + delete codeTables; + + // symbol ID Huffman decoding table + if (huff) { + huffDecoder->reset(); + for (i = 0; i < 32; ++i) { + runLengthTab[i].val = i; + runLengthTab[i].prefixLen = huffDecoder->readBits(4); + runLengthTab[i].rangeLen = 0; + } + runLengthTab[32].val = 0x103; + runLengthTab[32].prefixLen = huffDecoder->readBits(4); + runLengthTab[32].rangeLen = 2; + runLengthTab[33].val = 0x203; + runLengthTab[33].prefixLen = huffDecoder->readBits(4); + runLengthTab[33].rangeLen = 3; + runLengthTab[34].val = 0x20b; + runLengthTab[34].prefixLen = huffDecoder->readBits(4); + runLengthTab[34].rangeLen = 7; + runLengthTab[35].prefixLen = 0; + runLengthTab[35].rangeLen = jbig2HuffmanEOT; + huffDecoder->buildTable(runLengthTab, 35); + symCodeTab = (JBIG2HuffmanTable *)gmallocn(numSyms + 1, + sizeof(JBIG2HuffmanTable)); + for (i = 0; i < numSyms; ++i) { + symCodeTab[i].val = i; + symCodeTab[i].rangeLen = 0; + } + i = 0; + while (i < numSyms) { + huffDecoder->decodeInt(&j, runLengthTab); + if (j > 0x200) { + for (j -= 0x200; j && i < numSyms; --j) { + symCodeTab[i++].prefixLen = 0; + } + } else if (j > 0x100) { + for (j -= 0x100; j && i < numSyms; --j) { + symCodeTab[i].prefixLen = symCodeTab[i-1].prefixLen; + ++i; + } + } else { + symCodeTab[i++].prefixLen = j; + } + } + symCodeTab[numSyms].prefixLen = 0; + symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT; + huffDecoder->buildTable(symCodeTab, numSyms); + huffDecoder->reset(); + + // set up the arithmetic decoder + } else { + symCodeTab = NULL; + resetIntStats(symCodeLen); + arithDecoder->start(); + } + if (refine) { + resetRefinementStats(templ, NULL); + } + + bitmap = readTextRegion(huff, refine, w, h, numInstances, + logStrips, numSyms, symCodeTab, symCodeLen, syms, + defPixel, combOp, transposed, refCorner, sOffset, + huffFSTable, huffDSTable, huffDTTable, + huffRDWTable, huffRDHTable, + huffRDXTable, huffRDYTable, huffRSizeTable, + templ, atx, aty); + + gfree(syms); + + if (bitmap) { + // combine the region bitmap into the page bitmap + if (imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + bitmap->setSegNum(segNum); + segments->append(bitmap); + } + } + + // clean up the Huffman decoder + if (huff) { + gfree(symCodeTab); + } + + return; + + codeTableError: + error(errSyntaxError, curStr->getPos(), "Missing code table in JBIG2 text region"); + gfree(codeTables); + delete syms; + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); + return; +} + +JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine, + int w, int h, + Guint numInstances, + Guint logStrips, + int numSyms, + JBIG2HuffmanTable *symCodeTab, + Guint symCodeLen, + JBIG2Bitmap **syms, + Guint defPixel, Guint combOp, + Guint transposed, Guint refCorner, + int sOffset, + JBIG2HuffmanTable *huffFSTable, + JBIG2HuffmanTable *huffDSTable, + JBIG2HuffmanTable *huffDTTable, + JBIG2HuffmanTable *huffRDWTable, + JBIG2HuffmanTable *huffRDHTable, + JBIG2HuffmanTable *huffRDXTable, + JBIG2HuffmanTable *huffRDYTable, + JBIG2HuffmanTable *huffRSizeTable, + Guint templ, + int *atx, int *aty) { + JBIG2Bitmap *bitmap; + JBIG2Bitmap *symbolBitmap; + Guint strips; + int t, dt, tt, s, ds, sFirst, j; + int rdw, rdh, rdx, rdy, ri, refDX, refDY, bmSize; + Guint symID, inst, bw, bh; + + strips = 1 << logStrips; + + // allocate the bitmap + bitmap = new JBIG2Bitmap(0, w, h); + if (!bitmap->isOk()) { + delete bitmap; + return NULL; + } + if (defPixel) { + bitmap->clearToOne(); + } else { + bitmap->clearToZero(); + } + + // decode initial T value + if (huff) { + huffDecoder->decodeInt(&t, huffDTTable); + } else { + arithDecoder->decodeInt(&t, iadtStats); + } + t *= -(int)strips; + + inst = 0; + sFirst = 0; + while (inst < numInstances) { + + // decode delta-T + if (huff) { + huffDecoder->decodeInt(&dt, huffDTTable); + } else { + arithDecoder->decodeInt(&dt, iadtStats); + } + t += dt * strips; + + // first S value + if (huff) { + huffDecoder->decodeInt(&ds, huffFSTable); + } else { + arithDecoder->decodeInt(&ds, iafsStats); + } + sFirst += ds; + s = sFirst; + + // read the instances + // (this loop test is here to avoid an infinite loop with damaged + // JBIG2 streams where the normal loop exit doesn't get triggered) + while (inst < numInstances) { + + // T value + if (strips == 1) { + dt = 0; + } else if (huff) { + dt = huffDecoder->readBits(logStrips); + } else { + arithDecoder->decodeInt(&dt, iaitStats); + } + tt = t + dt; + + // symbol ID + if (huff) { + if (symCodeTab) { + huffDecoder->decodeInt(&j, symCodeTab); + symID = (Guint)j; + } else { + symID = huffDecoder->readBits(symCodeLen); + } + } else { + symID = arithDecoder->decodeIAID(symCodeLen, iaidStats); + } + + if (symID >= (Guint)numSyms) { + error(errSyntaxError, curStr->getPos(), "Invalid symbol number in JBIG2 text region"); + } else { + + // get the symbol bitmap + symbolBitmap = NULL; + if (refine) { + if (huff) { + ri = (int)huffDecoder->readBit(); + } else { + arithDecoder->decodeInt(&ri, iariStats); + } + } else { + ri = 0; + } + if (ri) { + GBool decodeSuccess; + if (huff) { + decodeSuccess = huffDecoder->decodeInt(&rdw, huffRDWTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdh, huffRDHTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdx, huffRDXTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdy, huffRDYTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&bmSize, huffRSizeTable); + huffDecoder->reset(); + arithDecoder->start(); + } else { + decodeSuccess = arithDecoder->decodeInt(&rdw, iardwStats); + decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdh, iardhStats); + decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdx, iardxStats); + decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdy, iardyStats); + } + + if (decodeSuccess && syms[symID]) + { + refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx; + refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy; + + symbolBitmap = + readGenericRefinementRegion(rdw + syms[symID]->getWidth(), + rdh + syms[symID]->getHeight(), + templ, gFalse, syms[symID], + refDX, refDY, atx, aty); + } + //~ do we need to use the bmSize value here (in Huffman mode)? + } else { + symbolBitmap = syms[symID]; + } + + if (symbolBitmap) { + // combine the symbol bitmap into the region bitmap + //~ something is wrong here - refCorner shouldn't degenerate into + //~ two cases + bw = symbolBitmap->getWidth() - 1; + bh = symbolBitmap->getHeight() - 1; + if (transposed) { + switch (refCorner) { + case 0: // bottom left + bitmap->combine(symbolBitmap, tt, s, combOp); + break; + case 1: // top left + bitmap->combine(symbolBitmap, tt, s, combOp); + break; + case 2: // bottom right + bitmap->combine(symbolBitmap, tt - bw, s, combOp); + break; + case 3: // top right + bitmap->combine(symbolBitmap, tt - bw, s, combOp); + break; + } + s += bh; + } else { + switch (refCorner) { + case 0: // bottom left + bitmap->combine(symbolBitmap, s, tt - bh, combOp); + break; + case 1: // top left + bitmap->combine(symbolBitmap, s, tt, combOp); + break; + case 2: // bottom right + bitmap->combine(symbolBitmap, s, tt - bh, combOp); + break; + case 3: // top right + bitmap->combine(symbolBitmap, s, tt, combOp); + break; + } + s += bw; + } + if (ri) { + delete symbolBitmap; + } + } else { + // NULL symbolBitmap only happens on error + delete bitmap; + return NULL; + } + } + + // next instance + ++inst; + + // next S value + if (huff) { + if (!huffDecoder->decodeInt(&ds, huffDSTable)) { + break; + } + } else { + if (!arithDecoder->decodeInt(&ds, iadsStats)) { + break; + } + } + s += sOffset + ds; + } + } + + return bitmap; +} + +void JBIG2Stream::readPatternDictSeg(Guint segNum, Guint length) { + JBIG2PatternDict *patternDict; + JBIG2Bitmap *bitmap; + Guint flags, patternW, patternH, grayMax, templ, mmr; + int atx[4], aty[4]; + Guint i, x; + + // halftone dictionary flags, pattern width and height, max gray value + if (!readUByte(&flags) || + !readUByte(&patternW) || + !readUByte(&patternH) || + !readULong(&grayMax)) { + goto eofError; + } + templ = (flags >> 1) & 3; + mmr = flags & 1; + + // set up the arithmetic decoder + if (!mmr) { + resetGenericStats(templ, NULL); + arithDecoder->start(); + } + + // read the bitmap + atx[0] = -(int)patternW; aty[0] = 0; + atx[1] = -3; aty[1] = -1; + atx[2] = 2; aty[2] = -2; + atx[3] = -2; aty[3] = -2; + bitmap = readGenericBitmap(mmr, (grayMax + 1) * patternW, patternH, + templ, gFalse, gFalse, NULL, + atx, aty, length - 7); + + if (!bitmap) + return; + + // create the pattern dict object + patternDict = new JBIG2PatternDict(segNum, grayMax + 1); + + // split up the bitmap + x = 0; + for (i = 0; i <= grayMax; ++i) { + patternDict->setBitmap(i, bitmap->getSlice(x, 0, patternW, patternH)); + x += patternW; + } + + // free memory + delete bitmap; + + // store the new pattern dict + segments->append(patternDict); + + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readHalftoneRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs) { + JBIG2Bitmap *bitmap; + JBIG2Segment *seg; + JBIG2PatternDict *patternDict; + JBIG2Bitmap *skipBitmap; + Guint *grayImg; + JBIG2Bitmap *grayBitmap; + JBIG2Bitmap *patternBitmap; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, mmr, templ, enableSkip, combOp; + Guint gridW, gridH, stepX, stepY, patW, patH; + int atx[4], aty[4]; + int gridX, gridY, xx, yy, bit, j; + Guint bpp, m, n, i; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the halftone region header + if (!readUByte(&flags)) { + goto eofError; + } + mmr = flags & 1; + templ = (flags >> 1) & 3; + enableSkip = (flags >> 3) & 1; + combOp = (flags >> 4) & 7; + if (!readULong(&gridW) || !readULong(&gridH) || + !readLong(&gridX) || !readLong(&gridY) || + !readUWord(&stepX) || !readUWord(&stepY)) { + goto eofError; + } + if (w == 0 || h == 0 || w >= INT_MAX / h) { + error(errSyntaxError, curStr->getPos(), "Bad bitmap size in JBIG2 halftone segment"); + return; + } + if (gridH == 0 || gridW >= INT_MAX / gridH) { + error(errSyntaxError, curStr->getPos(), "Bad grid size in JBIG2 halftone segment"); + return; + } + + // get pattern dictionary + if (nRefSegs != 1) { + error(errSyntaxError, curStr->getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } + seg = findSegment(refSegs[0]); + if (seg == NULL || seg->getType() != jbig2SegPatternDict) { + error(errSyntaxError, curStr->getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } + + patternDict = (JBIG2PatternDict *)seg; + i = patternDict->getSize(); + if (i <= 1) { + bpp = 0; + } else { + --i; + bpp = 0; + // i = floor((size-1) / 2^bpp) + while (i > 0) { + ++bpp; + i >>= 1; + } + } + patW = patternDict->getBitmap(0)->getWidth(); + patH = patternDict->getBitmap(0)->getHeight(); + + // set up the arithmetic decoder + if (!mmr) { + resetGenericStats(templ, NULL); + arithDecoder->start(); + } + + // allocate the bitmap + bitmap = new JBIG2Bitmap(segNum, w, h); + if (flags & 0x80) { // HDEFPIXEL + bitmap->clearToOne(); + } else { + bitmap->clearToZero(); + } + + // compute the skip bitmap + skipBitmap = NULL; + if (enableSkip) { + skipBitmap = new JBIG2Bitmap(0, gridW, gridH); + skipBitmap->clearToZero(); + for (m = 0; m < gridH; ++m) { + for (n = 0; n < gridW; ++n) { + xx = gridX + m * stepY + n * stepX; + yy = gridY + m * stepX - n * stepY; + if (((xx + (int)patW) >> 8) <= 0 || (xx >> 8) >= (int)w || + ((yy + (int)patH) >> 8) <= 0 || (yy >> 8) >= (int)h) { + skipBitmap->setPixel(n, m); + } + } + } + } + + // read the gray-scale image + grayImg = (Guint *)gmallocn(gridW * gridH, sizeof(Guint)); + memset(grayImg, 0, gridW * gridH * sizeof(Guint)); + atx[0] = templ <= 1 ? 3 : 2; aty[0] = -1; + atx[1] = -3; aty[1] = -1; + atx[2] = 2; aty[2] = -2; + atx[3] = -2; aty[3] = -2; + for (j = bpp - 1; j >= 0; --j) { + grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, gFalse, + enableSkip, skipBitmap, atx, aty, -1); + i = 0; + for (m = 0; m < gridH; ++m) { + for (n = 0; n < gridW; ++n) { + bit = grayBitmap->getPixel(n, m) ^ (grayImg[i] & 1); + grayImg[i] = (grayImg[i] << 1) | bit; + ++i; + } + } + delete grayBitmap; + } + + // decode the image + i = 0; + for (m = 0; m < gridH; ++m) { + xx = gridX + m * stepY; + yy = gridY + m * stepX; + for (n = 0; n < gridW; ++n) { + if (!(enableSkip && skipBitmap->getPixel(n, m))) { + patternBitmap = patternDict->getBitmap(grayImg[i]); + bitmap->combine(patternBitmap, xx >> 8, yy >> 8, combOp); + } + xx += stepX; + yy -= stepY; + ++i; + } + } + + gfree(grayImg); + if (skipBitmap) { + delete skipBitmap; + } + + // combine the region bitmap into the page bitmap + if (imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + segments->append(bitmap); + } + + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readGenericRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length) { + JBIG2Bitmap *bitmap; + Guint w, h, x, y, segInfoFlags, extCombOp, rowCount; + Guint flags, mmr, templ, tpgdOn; + int atx[4], aty[4]; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the generic region segment header + if (!readUByte(&flags)) { + goto eofError; + } + mmr = flags & 1; + templ = (flags >> 1) & 3; + tpgdOn = (flags >> 3) & 1; + + // AT flags + if (!mmr) { + if (templ == 0) { + if (!readByte(&atx[0]) || + !readByte(&aty[0]) || + !readByte(&atx[1]) || + !readByte(&aty[1]) || + !readByte(&atx[2]) || + !readByte(&aty[2]) || + !readByte(&atx[3]) || + !readByte(&aty[3])) { + goto eofError; + } + } else { + if (!readByte(&atx[0]) || + !readByte(&aty[0])) { + goto eofError; + } + } + } + + // set up the arithmetic decoder + if (!mmr) { + resetGenericStats(templ, NULL); + arithDecoder->start(); + } + + // read the bitmap + bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse, + NULL, atx, aty, mmr ? length - 18 : 0); + if (!bitmap) + return; + + // combine the region bitmap into the page bitmap + if (imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + bitmap->setSegNum(segNum); + segments->append(bitmap); + } + + // immediate generic segments can have an unspecified length, in + // which case, a row count is stored at the end of the segment + if (imm && length == 0xffffffff) { + readULong(&rowCount); + } + + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +inline void JBIG2Stream::mmrAddPixels(int a1, int blackPixels, + int *codingLine, int *a0i, int w) { + if (a1 > codingLine[*a0i]) { + if (a1 > w) { + error(errSyntaxError, curStr->getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1); + a1 = w; + } + if ((*a0i & 1) ^ blackPixels) { + ++*a0i; + } + codingLine[*a0i] = a1; + } +} + +inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels, + int *codingLine, int *a0i, int w) { + if (a1 > codingLine[*a0i]) { + if (a1 > w) { + error(errSyntaxError, curStr->getPos(), "JBIG2 MMR row is wrong length ({0:d})", a1); + a1 = w; + } + if ((*a0i & 1) ^ blackPixels) { + ++*a0i; + } + codingLine[*a0i] = a1; + } else if (a1 < codingLine[*a0i]) { + if (a1 < 0) { + error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 MMR code"); + a1 = 0; + } + while (*a0i > 0 && a1 <= codingLine[*a0i - 1]) { + --*a0i; + } + codingLine[*a0i] = a1; + } +} + +JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h, + int templ, GBool tpgdOn, + GBool useSkip, JBIG2Bitmap *skip, + int *atx, int *aty, + int mmrDataLength) { + JBIG2Bitmap *bitmap; + GBool ltp; + Guint ltpCX, cx, cx0, cx1, cx2; + int *refLine, *codingLine; + int code1, code2, code3; + Guchar *p0, *p1, *p2, *pp; + Guchar *atP0, *atP1, *atP2, *atP3; + Guint buf0, buf1, buf2; + Guint atBuf0, atBuf1, atBuf2, atBuf3; + int atShift0, atShift1, atShift2, atShift3; + Guchar mask; + int x, y, x0, x1, a0i, b1i, blackPixels, pix, i; + + bitmap = new JBIG2Bitmap(0, w, h); + if (!bitmap->isOk()) { + delete bitmap; + return NULL; + } + bitmap->clearToZero(); + + //----- MMR decode + + if (mmr) { + + mmrDecoder->reset(); + if (w > INT_MAX - 2) { + error(errSyntaxError, curStr->getPos(), "Bad width in JBIG2 generic bitmap"); + // force a call to gmalloc(-1), which will throw an exception + w = -3; + } + // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w + // ---> max codingLine size = w + 1 + // refLine has one extra guard entry at the end + // ---> max refLine size = w + 2 + codingLine = (int *)gmallocn(w + 1, sizeof(int)); + refLine = (int *)gmallocn(w + 2, sizeof(int)); + memset(refLine, 0, (w + 2) * sizeof(int)); + for (i = 0; i < w + 1; ++i) codingLine[i] = w; + + for (y = 0; y < h; ++y) { + + // copy coding line to ref line + for (i = 0; codingLine[i] < w; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = w; + refLine[i] = w; + + // decode a line + codingLine[0] = 0; + a0i = 0; + b1i = 0; + blackPixels = 0; + // invariant: + // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] <= w + // exception at left edge: + // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible + // exception at right edge: + // refLine[b1i] = refLine[b1i+1] = w is possible + while (codingLine[a0i] < w) { + code1 = mmrDecoder->get2DCode(); + switch (code1) { + case twoDimPass: + if (unlikely(b1i + 1 >= w + 2)) { + break; + } + mmrAddPixels(refLine[b1i + 1], blackPixels, codingLine, &a0i, w); + if (refLine[b1i + 1] < w) { + b1i += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = mmrDecoder->getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = mmrDecoder->getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = mmrDecoder->getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = mmrDecoder->getBlackCode(); + } while (code3 >= 64); + } + mmrAddPixels(codingLine[a0i] + code1, blackPixels, + codingLine, &a0i, w); + if (codingLine[a0i] < w) { + mmrAddPixels(codingLine[a0i] + code2, blackPixels ^ 1, + codingLine, &a0i, w); + } + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + break; + case twoDimVertR3: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixels(refLine[b1i] + 3, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertR2: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixels(refLine[b1i] + 2, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertR1: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixels(refLine[b1i] + 1, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVert0: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixels(refLine[b1i], blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertL3: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixelsNeg(refLine[b1i] - 3, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertL2: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixelsNeg(refLine[b1i] - 2, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertL1: + if (unlikely(b1i >= w + 2)) { + break; + } + mmrAddPixelsNeg(refLine[b1i] - 1, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (likely(b1i < w + 2) && refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case EOF: + mmrAddPixels(w, 0, codingLine, &a0i, w); + break; + default: + error(errSyntaxError, curStr->getPos(), "Illegal code in JBIG2 MMR bitmap data"); + mmrAddPixels(w, 0, codingLine, &a0i, w); + break; + } + } + + // convert the run lengths to a bitmap line + i = 0; + while (1) { + for (x = codingLine[i]; x < codingLine[i+1]; ++x) { + bitmap->setPixel(x, y); + } + if (codingLine[i+1] >= w || codingLine[i+2] >= w) { + break; + } + i += 2; + } + } + + if (mmrDataLength >= 0) { + mmrDecoder->skipTo(mmrDataLength); + } else { + if (mmrDecoder->get24Bits() != 0x001001) { + error(errSyntaxError, curStr->getPos(), "Missing EOFB in JBIG2 MMR bitmap data"); + } + } + + gfree(refLine); + gfree(codingLine); + + //----- arithmetic decode + + } else { + // set up the typical row context + ltpCX = 0; // make gcc happy + if (tpgdOn) { + switch (templ) { + case 0: + ltpCX = 0x3953; // 001 11001 0101 0011 + break; + case 1: + ltpCX = 0x079a; // 0011 11001 101 0 + break; + case 2: + ltpCX = 0x0e3; // 001 1100 01 1 + break; + case 3: + ltpCX = 0x18a; // 01100 0101 1 + break; + } + } + + ltp = 0; + cx = cx0 = cx1 = cx2 = 0; // make gcc happy + for (y = 0; y < h; ++y) { + + // check for a "typical" (duplicate) row + if (tpgdOn) { + if (arithDecoder->decodeBit(ltpCX, genericRegionStats)) { + ltp = !ltp; + } + if (ltp) { + if (y > 0) { + bitmap->duplicateRow(y, y-1); + } + continue; + } + } + + switch (templ) { + case 0: + + // set up the context + p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize(); + buf2 = *p2++ << 8; + if (y >= 1) { + p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize(); + buf1 = *p1++ << 8; + if (y >= 2) { + p0 = bitmap->getDataPtr() + (y - 2) * bitmap->getLineSize(); + buf0 = *p0++ << 8; + } else { + p0 = NULL; + buf0 = 0; + } + } else { + p1 = p0 = NULL; + buf1 = buf0 = 0; + } + + if (atx[0] >= -8 && atx[0] <= 8 && + atx[1] >= -8 && atx[1] <= 8 && + atx[2] >= -8 && atx[2] <= 8 && + atx[3] >= -8 && atx[3] <= 8) { + // set up the adaptive context + if (y + aty[0] >= 0) { + atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize(); + atBuf0 = *atP0++ << 8; + } else { + atP0 = NULL; + atBuf0 = 0; + } + atShift0 = 15 - atx[0]; + if (y + aty[1] >= 0) { + atP1 = bitmap->getDataPtr() + (y + aty[1]) * bitmap->getLineSize(); + atBuf1 = *atP1++ << 8; + } else { + atP1 = NULL; + atBuf1 = 0; + } + atShift1 = 15 - atx[1]; + if (y + aty[2] >= 0) { + atP2 = bitmap->getDataPtr() + (y + aty[2]) * bitmap->getLineSize(); + atBuf2 = *atP2++ << 8; + } else { + atP2 = NULL; + atBuf2 = 0; + } + atShift2 = 15 - atx[2]; + if (y + aty[3] >= 0) { + atP3 = bitmap->getDataPtr() + (y + aty[3]) * bitmap->getLineSize(); + atBuf3 = *atP3++ << 8; + } else { + atP3 = NULL; + atBuf3 = 0; + } + atShift3 = 15 - atx[3]; + + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p0) { + buf0 |= *p0++; + } + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + if (atP0) { + atBuf0 |= *atP0++; + } + if (atP1) { + atBuf1 |= *atP1++; + } + if (atP2) { + atBuf2 |= *atP2++; + } + if (atP3) { + atBuf3 |= *atP3++; + } + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx0 = (buf0 >> 14) & 0x07; + cx1 = (buf1 >> 13) & 0x1f; + cx2 = (buf2 >> 16) & 0x0f; + cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) | + (((atBuf0 >> atShift0) & 1) << 3) | + (((atBuf1 >> atShift1) & 1) << 2) | + (((atBuf2 >> atShift2) & 1) << 1) | + ((atBuf3 >> atShift3) & 1); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + if (aty[0] == 0) { + atBuf0 |= 0x8000; + } + if (aty[1] == 0) { + atBuf1 |= 0x8000; + } + if (aty[2] == 0) { + atBuf2 |= 0x8000; + } + if (aty[3] == 0) { + atBuf3 |= 0x8000; + } + } + } + + // update the context + buf0 <<= 1; + buf1 <<= 1; + buf2 <<= 1; + atBuf0 <<= 1; + atBuf1 <<= 1; + atBuf2 <<= 1; + atBuf3 <<= 1; + } + } + + } else { + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p0) { + buf0 |= *p0++; + } + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx0 = (buf0 >> 14) & 0x07; + cx1 = (buf1 >> 13) & 0x1f; + cx2 = (buf2 >> 16) & 0x0f; + cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) | + (bitmap->getPixel(x + atx[0], y + aty[0]) << 3) | + (bitmap->getPixel(x + atx[1], y + aty[1]) << 2) | + (bitmap->getPixel(x + atx[2], y + aty[2]) << 1) | + bitmap->getPixel(x + atx[3], y + aty[3]); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + } + } + + // update the context + buf0 <<= 1; + buf1 <<= 1; + buf2 <<= 1; + } + } + } + break; + + case 1: + + // set up the context + p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize(); + buf2 = *p2++ << 8; + if (y >= 1) { + p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize(); + buf1 = *p1++ << 8; + if (y >= 2) { + p0 = bitmap->getDataPtr() + (y - 2) * bitmap->getLineSize(); + buf0 = *p0++ << 8; + } else { + p0 = NULL; + buf0 = 0; + } + } else { + p1 = p0 = NULL; + buf1 = buf0 = 0; + } + + if (atx[0] >= -8 && atx[0] <= 8) { + // set up the adaptive context + if (y + aty[0] >= 0) { + atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize(); + atBuf0 = *atP0++ << 8; + } else { + atP0 = NULL; + atBuf0 = 0; + } + atShift0 = 15 - atx[0]; + + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p0) { + buf0 |= *p0++; + } + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + if (atP0) { + atBuf0 |= *atP0++; + } + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx0 = (buf0 >> 13) & 0x0f; + cx1 = (buf1 >> 13) & 0x1f; + cx2 = (buf2 >> 16) & 0x07; + cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) | + ((atBuf0 >> atShift0) & 1); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + if (aty[0] == 0) { + atBuf0 |= 0x8000; + } + } + } + + // update the context + buf0 <<= 1; + buf1 <<= 1; + buf2 <<= 1; + atBuf0 <<= 1; + } + } + + } else { + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p0) { + buf0 |= *p0++; + } + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx0 = (buf0 >> 13) & 0x0f; + cx1 = (buf1 >> 13) & 0x1f; + cx2 = (buf2 >> 16) & 0x07; + cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) | + bitmap->getPixel(x + atx[0], y + aty[0]); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + } + } + + // update the context + buf0 <<= 1; + buf1 <<= 1; + buf2 <<= 1; + } + } + } + break; + + case 2: + + // set up the context + p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize(); + buf2 = *p2++ << 8; + if (y >= 1) { + p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize(); + buf1 = *p1++ << 8; + if (y >= 2) { + p0 = bitmap->getDataPtr() + (y - 2) * bitmap->getLineSize(); + buf0 = *p0++ << 8; + } else { + p0 = NULL; + buf0 = 0; + } + } else { + p1 = p0 = NULL; + buf1 = buf0 = 0; + } + + if (atx[0] >= -8 && atx[0] <= 8) { + // set up the adaptive context + if (y + aty[0] >= 0) { + atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize(); + atBuf0 = *atP0++ << 8; + } else { + atP0 = NULL; + atBuf0 = 0; + } + atShift0 = 15 - atx[0]; + + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p0) { + buf0 |= *p0++; + } + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + if (atP0) { + atBuf0 |= *atP0++; + } + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx0 = (buf0 >> 14) & 0x07; + cx1 = (buf1 >> 14) & 0x0f; + cx2 = (buf2 >> 16) & 0x03; + cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) | + ((atBuf0 >> atShift0) & 1); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + if (aty[0] == 0) { + atBuf0 |= 0x8000; + } + } + } + + // update the context + buf0 <<= 1; + buf1 <<= 1; + buf2 <<= 1; + atBuf0 <<= 1; + } + } + + } else { + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p0) { + buf0 |= *p0++; + } + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx0 = (buf0 >> 14) & 0x07; + cx1 = (buf1 >> 14) & 0x0f; + cx2 = (buf2 >> 16) & 0x03; + cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) | + bitmap->getPixel(x + atx[0], y + aty[0]); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + } + } + + // update the context + buf0 <<= 1; + buf1 <<= 1; + buf2 <<= 1; + } + } + } + break; + + case 3: + + // set up the context + p2 = pp = bitmap->getDataPtr() + y * bitmap->getLineSize(); + buf2 = *p2++ << 8; + if (y >= 1) { + p1 = bitmap->getDataPtr() + (y - 1) * bitmap->getLineSize(); + buf1 = *p1++ << 8; + } else { + p1 = NULL; + buf1 = 0; + } + + if (atx[0] >= -8 && atx[0] <= 8) { + // set up the adaptive context + if (y + aty[0] >= 0) { + atP0 = bitmap->getDataPtr() + (y + aty[0]) * bitmap->getLineSize(); + atBuf0 = *atP0++ << 8; + } else { + atP0 = NULL; + atBuf0 = 0; + } + atShift0 = 15 - atx[0]; + + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + if (atP0) { + atBuf0 |= *atP0++; + } + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx1 = (buf1 >> 14) & 0x1f; + cx2 = (buf2 >> 16) & 0x0f; + cx = (cx1 << 5) | (cx2 << 1) | + ((atBuf0 >> atShift0) & 1); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + if (aty[0] == 0) { + atBuf0 |= 0x8000; + } + } + } + + // update the context + buf1 <<= 1; + buf2 <<= 1; + atBuf0 <<= 1; + } + } + + } else { + // decode the row + for (x0 = 0, x = 0; x0 < w; x0 += 8, ++pp) { + if (x0 + 8 < w) { + if (p1) { + buf1 |= *p1++; + } + buf2 |= *p2++; + } + for (x1 = 0, mask = 0x80; x1 < 8 && x < w; ++x1, ++x, mask >>= 1) { + + // build the context + cx1 = (buf1 >> 14) & 0x1f; + cx2 = (buf2 >> 16) & 0x0f; + cx = (cx1 << 5) | (cx2 << 1) | + bitmap->getPixel(x + atx[0], y + aty[0]); + + // check for a skipped pixel + if (!(useSkip && skip->getPixel(x, y))) { + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + *pp |= mask; + buf2 |= 0x8000; + } + } + + // update the context + buf1 <<= 1; + buf2 <<= 1; + } + } + } + break; + } + } + } + + return bitmap; +} + +void JBIG2Stream::readGenericRefinementRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, + Guint nRefSegs) { + JBIG2Bitmap *bitmap, *refBitmap; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, templ, tpgrOn; + int atx[2], aty[2]; + JBIG2Segment *seg; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the generic refinement region segment header + if (!readUByte(&flags)) { + goto eofError; + } + templ = flags & 1; + tpgrOn = (flags >> 1) & 1; + + // AT flags + if (!templ) { + if (!readByte(&atx[0]) || !readByte(&aty[0]) || + !readByte(&atx[1]) || !readByte(&aty[1])) { + goto eofError; + } + } + + // resize the page bitmap if needed + if (nRefSegs == 0 || imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + } + + // get referenced bitmap + if (nRefSegs > 1) { + error(errSyntaxError, curStr->getPos(), "Bad reference in JBIG2 generic refinement segment"); + return; + } + if (nRefSegs == 1) { + seg = findSegment(refSegs[0]); + if (seg == NULL || seg->getType() != jbig2SegBitmap) { + error(errSyntaxError, curStr->getPos(), "Bad bitmap reference in JBIG2 generic refinement segment"); + return; + } + refBitmap = (JBIG2Bitmap *)seg; + } else { + refBitmap = pageBitmap->getSlice(x, y, w, h); + } + + // set up the arithmetic decoder + resetRefinementStats(templ, NULL); + arithDecoder->start(); + + // read + bitmap = readGenericRefinementRegion(w, h, templ, tpgrOn, + refBitmap, 0, 0, atx, aty); + + // combine the region bitmap into the page bitmap + if (imm) { + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + if (bitmap) { + bitmap->setSegNum(segNum); + segments->append(bitmap); + } else { + error(errSyntaxError, curStr->getPos(), "readGenericRefinementRegionSeg with null bitmap"); + } + } + + // delete the referenced bitmap + if (nRefSegs == 1) { + discardSegment(refSegs[0]); + } else { + delete refBitmap; + } + + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h, + int templ, GBool tpgrOn, + JBIG2Bitmap *refBitmap, + int refDX, int refDY, + int *atx, int *aty) { + JBIG2Bitmap *bitmap; + GBool ltp; + Guint ltpCX, cx, cx0, cx2, cx3, cx4, tpgrCX0, tpgrCX1, tpgrCX2; + JBIG2BitmapPtr cxPtr0 = {0}; + JBIG2BitmapPtr cxPtr1 = {0}; + JBIG2BitmapPtr cxPtr2 = {0}; + JBIG2BitmapPtr cxPtr3 = {0}; + JBIG2BitmapPtr cxPtr4 = {0}; + JBIG2BitmapPtr cxPtr5 = {0}; + JBIG2BitmapPtr cxPtr6 = {0}; + JBIG2BitmapPtr tpgrCXPtr0 = {0}; + JBIG2BitmapPtr tpgrCXPtr1 = {0}; + JBIG2BitmapPtr tpgrCXPtr2 = {0}; + int x, y, pix; + + bitmap = new JBIG2Bitmap(0, w, h); + if (!bitmap->isOk()) + { + delete bitmap; + return NULL; + } + bitmap->clearToZero(); + + // set up the typical row context + if (templ) { + ltpCX = 0x008; + } else { + ltpCX = 0x0010; + } + + ltp = 0; + for (y = 0; y < h; ++y) { + + if (templ) { + + // set up the context + bitmap->getPixelPtr(0, y-1, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(-1, y, &cxPtr1); + refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3); + cx3 = refBitmap->nextPixel(&cxPtr3); + cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3); + refBitmap->getPixelPtr(-refDX, y+1-refDY, &cxPtr4); + cx4 = refBitmap->nextPixel(&cxPtr4); + + // set up the typical prediction context + tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy + if (tpgrOn) { + refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0); + tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1); + tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2); + tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + } else { + tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy + tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; + tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; + } + + for (x = 0; x < w; ++x) { + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 7; + cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7; + cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 3; + + if (tpgrOn) { + // update the typical predictor context + tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7; + tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7; + tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7; + + // check for a "typical" pixel + if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) { + ltp = !ltp; + } + if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) { + bitmap->clearPixel(x, y); + continue; + } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) { + bitmap->setPixel(x, y); + continue; + } + } + + // build the context + cx = (cx0 << 7) | (bitmap->nextPixel(&cxPtr1) << 6) | + (refBitmap->nextPixel(&cxPtr2) << 5) | + (cx3 << 2) | cx4; + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) { + bitmap->setPixel(x, y); + } + } + + } else { + + // set up the context + bitmap->getPixelPtr(0, y-1, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(-1, y, &cxPtr1); + refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2); + cx2 = refBitmap->nextPixel(&cxPtr2); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3); + cx3 = refBitmap->nextPixel(&cxPtr3); + cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3); + refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &cxPtr4); + cx4 = refBitmap->nextPixel(&cxPtr4); + cx4 = (cx4 << 1) | refBitmap->nextPixel(&cxPtr4); + bitmap->getPixelPtr(atx[0], y+aty[0], &cxPtr5); + refBitmap->getPixelPtr(atx[1]-refDX, y+aty[1]-refDY, &cxPtr6); + + // set up the typical prediction context + tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy + if (tpgrOn) { + refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0); + tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1); + tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2); + tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + } else { + tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy + tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; + tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; + } + + for (x = 0; x < w; ++x) { + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 3; + cx2 = ((cx2 << 1) | refBitmap->nextPixel(&cxPtr2)) & 3; + cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7; + cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 7; + + if (tpgrOn) { + // update the typical predictor context + tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7; + tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7; + tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7; + + // check for a "typical" pixel + if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) { + ltp = !ltp; + } + if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) { + bitmap->clearPixel(x, y); + continue; + } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) { + bitmap->setPixel(x, y); + continue; + } + } + + // build the context + cx = (cx0 << 11) | (bitmap->nextPixel(&cxPtr1) << 10) | + (cx2 << 8) | (cx3 << 5) | (cx4 << 2) | + (bitmap->nextPixel(&cxPtr5) << 1) | + refBitmap->nextPixel(&cxPtr6); + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) { + bitmap->setPixel(x, y); + } + } + } + } + + return bitmap; +} + +void JBIG2Stream::readPageInfoSeg(Guint length) { + Guint xRes, yRes, flags, striping; + + if (!readULong(&pageW) || !readULong(&pageH) || + !readULong(&xRes) || !readULong(&yRes) || + !readUByte(&flags) || !readUWord(&striping)) { + goto eofError; + } + pageDefPixel = (flags >> 2) & 1; + defCombOp = (flags >> 3) & 3; + + // allocate the page bitmap + if (pageH == 0xffffffff) { + curPageH = striping & 0x7fff; + } else { + curPageH = pageH; + } + pageBitmap = new JBIG2Bitmap(0, pageW, curPageH); + + if (!pageBitmap->isOk()) { + delete pageBitmap; + pageBitmap = NULL; + return; + } + + // default pixel value + if (pageDefPixel) { + pageBitmap->clearToOne(); + } else { + pageBitmap->clearToZero(); + } + + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readEndOfStripeSeg(Guint length) { + Guint i; + + // skip the segment + for (i = 0; i < length; ++i) { + if (curStr->getChar() == EOF) { + break; + } + } +} + +void JBIG2Stream::readProfilesSeg(Guint length) { + Guint i; + + // skip the segment + for (i = 0; i < length; ++i) { + if (curStr->getChar() == EOF) { + break; + } + } +} + +void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) { + JBIG2HuffmanTable *huffTab; + Guint flags, oob, prefixBits, rangeBits; + int lowVal, highVal, val; + Guint huffTabSize, i; + + if (!readUByte(&flags) || !readLong(&lowVal) || !readLong(&highVal)) { + goto eofError; + } + oob = flags & 1; + prefixBits = ((flags >> 1) & 7) + 1; + rangeBits = ((flags >> 4) & 7) + 1; + + huffDecoder->reset(); + huffTabSize = 8; + huffTab = (JBIG2HuffmanTable *) + gmallocn(huffTabSize, sizeof(JBIG2HuffmanTable)); + i = 0; + val = lowVal; + while (val < highVal) { + if (i == huffTabSize) { + huffTabSize *= 2; + huffTab = (JBIG2HuffmanTable *) + greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable)); + } + huffTab[i].val = val; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = huffDecoder->readBits(rangeBits); + val += 1 << huffTab[i].rangeLen; + ++i; + } + if (i + oob + 3 > huffTabSize) { + huffTabSize = i + oob + 3; + huffTab = (JBIG2HuffmanTable *) + greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable)); + } + huffTab[i].val = lowVal - 1; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = jbig2HuffmanLOW; + ++i; + huffTab[i].val = highVal; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = 32; + ++i; + if (oob) { + huffTab[i].val = 0; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = jbig2HuffmanOOB; + ++i; + } + huffTab[i].val = 0; + huffTab[i].prefixLen = 0; + huffTab[i].rangeLen = jbig2HuffmanEOT; + huffDecoder->buildTable(huffTab, i); + + // create and store the new table segment + segments->append(new JBIG2CodeTable(segNum, huffTab)); + + return; + + eofError: + error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readExtensionSeg(Guint length) { + Guint i; + + // skip the segment + for (i = 0; i < length; ++i) { + if (curStr->getChar() == EOF) { + break; + } + } +} + +JBIG2Segment *JBIG2Stream::findSegment(Guint segNum) { + JBIG2Segment *seg; + int i; + + for (i = 0; i < globalSegments->getLength(); ++i) { + seg = (JBIG2Segment *)globalSegments->get(i); + if (seg->getSegNum() == segNum) { + return seg; + } + } + for (i = 0; i < segments->getLength(); ++i) { + seg = (JBIG2Segment *)segments->get(i); + if (seg->getSegNum() == segNum) { + return seg; + } + } + return NULL; +} + +void JBIG2Stream::discardSegment(Guint segNum) { + JBIG2Segment *seg; + int i; + + for (i = 0; i < globalSegments->getLength(); ++i) { + seg = (JBIG2Segment *)globalSegments->get(i); + if (seg->getSegNum() == segNum) { + globalSegments->del(i); + return; + } + } + for (i = 0; i < segments->getLength(); ++i) { + seg = (JBIG2Segment *)segments->get(i); + if (seg->getSegNum() == segNum) { + segments->del(i); + return; + } + } +} + +void JBIG2Stream::resetGenericStats(Guint templ, + JArithmeticDecoderStats *prevStats) { + int size; + + size = contextSize[templ]; + if (prevStats && prevStats->getContextSize() == size) { + if (genericRegionStats->getContextSize() == size) { + genericRegionStats->copyFrom(prevStats); + } else { + delete genericRegionStats; + genericRegionStats = prevStats->copy(); + } + } else { + if (genericRegionStats->getContextSize() == size) { + genericRegionStats->reset(); + } else { + delete genericRegionStats; + genericRegionStats = new JArithmeticDecoderStats(1 << size); + } + } +} + +void JBIG2Stream::resetRefinementStats(Guint templ, + JArithmeticDecoderStats *prevStats) { + int size; + + size = refContextSize[templ]; + if (prevStats && prevStats->getContextSize() == size) { + if (refinementRegionStats->getContextSize() == size) { + refinementRegionStats->copyFrom(prevStats); + } else { + delete refinementRegionStats; + refinementRegionStats = prevStats->copy(); + } + } else { + if (refinementRegionStats->getContextSize() == size) { + refinementRegionStats->reset(); + } else { + delete refinementRegionStats; + refinementRegionStats = new JArithmeticDecoderStats(1 << size); + } + } +} + +void JBIG2Stream::resetIntStats(int symCodeLen) { + iadhStats->reset(); + iadwStats->reset(); + iaexStats->reset(); + iaaiStats->reset(); + iadtStats->reset(); + iaitStats->reset(); + iafsStats->reset(); + iadsStats->reset(); + iardxStats->reset(); + iardyStats->reset(); + iardwStats->reset(); + iardhStats->reset(); + iariStats->reset(); + if (iaidStats->getContextSize() == 1 << (symCodeLen + 1)) { + iaidStats->reset(); + } else { + delete iaidStats; + iaidStats = new JArithmeticDecoderStats(1 << (symCodeLen + 1)); + } +} + +GBool JBIG2Stream::readUByte(Guint *x) { + int c0; + + if ((c0 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)c0; + return gTrue; +} + +GBool JBIG2Stream::readByte(int *x) { + int c0; + + if ((c0 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = c0; + if (c0 & 0x80) { + *x |= -1 - 0xff; + } + return gTrue; +} + +GBool JBIG2Stream::readUWord(Guint *x) { + int c0, c1; + + if ((c0 = curStr->getChar()) == EOF || + (c1 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 8) | c1); + return gTrue; +} + +GBool JBIG2Stream::readULong(Guint *x) { + int c0, c1, c2, c3; + + if ((c0 = curStr->getChar()) == EOF || + (c1 = curStr->getChar()) == EOF || + (c2 = curStr->getChar()) == EOF || + (c3 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); + return gTrue; +} + +GBool JBIG2Stream::readLong(int *x) { + int c0, c1, c2, c3; + + if ((c0 = curStr->getChar()) == EOF || + (c1 = curStr->getChar()) == EOF || + (c2 = curStr->getChar()) == EOF || + (c3 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = ((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); + if (c0 & 0x80) { + *x |= -1 - (int)0xffffffff; + } + return gTrue; +} diff --git a/poppler/JBIG2Stream.h b/poppler/JBIG2Stream.h new file mode 100644 index 0000000..c518aa5 --- /dev/null +++ b/poppler/JBIG2Stream.h @@ -0,0 +1,164 @@ +//======================================================================== +// +// JBIG2Stream.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 David Benjamin +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef JBIG2STREAM_H +#define JBIG2STREAM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" +#include "Stream.h" + +class GooList; +class JBIG2Segment; +class JBIG2Bitmap; +class JArithmeticDecoder; +class JArithmeticDecoderStats; +class JBIG2HuffmanDecoder; +struct JBIG2HuffmanTable; +class JBIG2MMRDecoder; + +//------------------------------------------------------------------------ + +class JBIG2Stream: public FilterStream { +public: + + JBIG2Stream(Stream *strA, Object *globalsStreamA); + virtual ~JBIG2Stream(); + virtual StreamKind getKind() { return strJBIG2; } + virtual void reset(); + virtual void close(); + virtual int getPos(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + void readSegments(); + GBool readSymbolDictSeg(Guint segNum, Guint length, + Guint *refSegs, Guint nRefSegs); + void readTextRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs); + JBIG2Bitmap *readTextRegion(GBool huff, GBool refine, + int w, int h, + Guint numInstances, + Guint logStrips, + int numSyms, + JBIG2HuffmanTable *symCodeTab, + Guint symCodeLen, + JBIG2Bitmap **syms, + Guint defPixel, Guint combOp, + Guint transposed, Guint refCorner, + int sOffset, + JBIG2HuffmanTable *huffFSTable, + JBIG2HuffmanTable *huffDSTable, + JBIG2HuffmanTable *huffDTTable, + JBIG2HuffmanTable *huffRDWTable, + JBIG2HuffmanTable *huffRDHTable, + JBIG2HuffmanTable *huffRDXTable, + JBIG2HuffmanTable *huffRDYTable, + JBIG2HuffmanTable *huffRSizeTable, + Guint templ, + int *atx, int *aty); + void readPatternDictSeg(Guint segNum, Guint length); + void readHalftoneRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs); + void readGenericRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length); + void mmrAddPixels(int a1, int blackPixels, + int *codingLine, int *a0i, int w); + void mmrAddPixelsNeg(int a1, int blackPixels, + int *codingLine, int *a0i, int w); + JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h, + int templ, GBool tpgdOn, + GBool useSkip, JBIG2Bitmap *skip, + int *atx, int *aty, + int mmrDataLength); + void readGenericRefinementRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, + Guint nRefSegs); + JBIG2Bitmap *readGenericRefinementRegion(int w, int h, + int templ, GBool tpgrOn, + JBIG2Bitmap *refBitmap, + int refDX, int refDY, + int *atx, int *aty); + void readPageInfoSeg(Guint length); + void readEndOfStripeSeg(Guint length); + void readProfilesSeg(Guint length); + void readCodeTableSeg(Guint segNum, Guint length); + void readExtensionSeg(Guint length); + JBIG2Segment *findSegment(Guint segNum); + void discardSegment(Guint segNum); + void resetGenericStats(Guint templ, + JArithmeticDecoderStats *prevStats); + void resetRefinementStats(Guint templ, + JArithmeticDecoderStats *prevStats); + void resetIntStats(int symCodeLen); + GBool readUByte(Guint *x); + GBool readByte(int *x); + GBool readUWord(Guint *x); + GBool readULong(Guint *x); + GBool readLong(int *x); + + Object globalsStream; + Guint pageW, pageH, curPageH; + Guint pageDefPixel; + JBIG2Bitmap *pageBitmap; + Guint defCombOp; + GooList *segments; // [JBIG2Segment] + GooList *globalSegments; // [JBIG2Segment] + Stream *curStr; + Guchar *dataPtr; + Guchar *dataEnd; + + JArithmeticDecoder *arithDecoder; + JArithmeticDecoderStats *genericRegionStats; + JArithmeticDecoderStats *refinementRegionStats; + JArithmeticDecoderStats *iadhStats; + JArithmeticDecoderStats *iadwStats; + JArithmeticDecoderStats *iaexStats; + JArithmeticDecoderStats *iaaiStats; + JArithmeticDecoderStats *iadtStats; + JArithmeticDecoderStats *iaitStats; + JArithmeticDecoderStats *iafsStats; + JArithmeticDecoderStats *iadsStats; + JArithmeticDecoderStats *iardxStats; + JArithmeticDecoderStats *iardyStats; + JArithmeticDecoderStats *iardwStats; + JArithmeticDecoderStats *iardhStats; + JArithmeticDecoderStats *iariStats; + JArithmeticDecoderStats *iaidStats; + JBIG2HuffmanDecoder *huffDecoder; + JBIG2MMRDecoder *mmrDecoder; +}; + +#endif diff --git a/poppler/JPEG2000Stream.cc b/poppler/JPEG2000Stream.cc new file mode 100644 index 0000000..e2fd808 --- /dev/null +++ b/poppler/JPEG2000Stream.cc @@ -0,0 +1,196 @@ +//======================================================================== +// +// JPEG2000Stream.cc +// +// A JPX stream decoder using OpenJPEG +// +// Copyright 2008-2010, 2012 Albert Astals Cid +// Copyright 2011 Daniel Glöckner +// +// Licensed under GPLv2 or later +// +//======================================================================== + +#include "JPEG2000Stream.h" + +#include "config.h" + +JPXStream::JPXStream(Stream *strA) : FilterStream(strA) +{ + inited = gFalse; + image = NULL; + dinfo = NULL; + npixels = 0; + ncomps = 0; +} + +JPXStream::~JPXStream() { + delete str; + close(); +} + +void JPXStream::reset() { + counter = 0; + ccounter = 0; +} + +void JPXStream::close() { + if (image != NULL) { + opj_image_destroy(image); + image = NULL; + npixels = 0; + } + if (dinfo != NULL) { + opj_destroy_decompress(dinfo); + dinfo = NULL; + } +} + +int JPXStream::getPos() { + return counter * ncomps + ccounter; +} + +int JPXStream::getChars(int nChars, Guchar *buffer) { + for (int i = 0; i < nChars; ++i) { + const int c = doGetChar(); + if (likely(c != EOF)) buffer[i] = c; + else return i; + } + return nChars; +} + +int JPXStream::getChar() { + return doGetChar(); +} + +#define BUFFER_INITIAL_SIZE 4096 + +void JPXStream::init() +{ + Object oLen; + if (getDict()) getDict()->lookup("Length", &oLen); + + int bufSize = BUFFER_INITIAL_SIZE; + if (oLen.isInt()) bufSize = oLen.getInt(); + oLen.free(); + + + int length = 0; + unsigned char *buf = str->toUnsignedChars(&length, bufSize); + init2(buf, length, CODEC_JP2); + free(buf); + + if (image) { + npixels = image->comps[0].w * image->comps[0].h; + ncomps = image->numcomps; + for (int component = 0; component < ncomps; component++) { + if (image->comps[component].data == NULL) { + close(); + break; + } + unsigned char *cdata = (unsigned char *)image->comps[component].data; + int adjust = 0; + if (image->comps[component].prec > 8) + adjust = image->comps[component].prec - 8; + int sgndcorr = 0; + if (image->comps[component].sgnd) + sgndcorr = 1 << (image->comps[0].prec - 1); + for (int i = 0; i < npixels; i++) { + int r = image->comps[component].data[i]; + r += sgndcorr; + if (adjust) { + r = (r >> adjust)+((r >> (adjust-1))%2); + if (unlikely(r > 255)) + r = 255; + } + *(cdata++) = r; + } + } + } else + npixels = 0; + + counter = 0; + ccounter = 0; + inited = gTrue; +} + +static void libopenjpeg_error_callback(const char *msg, void * /*client_data*/) { + error(errSyntaxError, -1, "{0:s}", msg); +} + +static void libopenjpeg_warning_callback(const char *msg, void * /*client_data*/) { + error(errSyntaxWarning, -1, "{0:s}", msg); +} + +void JPXStream::init2(unsigned char *buf, int bufLen, OPJ_CODEC_FORMAT format) +{ + opj_cio_t *cio = NULL; + + /* Use default decompression parameters */ + opj_dparameters_t parameters; + opj_set_default_decoder_parameters(¶meters); +#ifdef WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG + parameters.flags = OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; +#endif + + /* Configure the event manager to receive errors and warnings */ + opj_event_mgr_t event_mgr; + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = libopenjpeg_error_callback; + event_mgr.warning_handler = libopenjpeg_warning_callback; + + /* Get the decoder handle of the format */ + dinfo = opj_create_decompress(format); + if (dinfo == NULL) goto error; + + /* Catch events using our callbacks */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, NULL); + + /* Setup the decoder decoding parameters */ + opj_setup_decoder(dinfo, ¶meters); + + /* Open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, buf, bufLen); + if (cio == NULL) goto error; + + /* Decode the stream and fill the image structure */ + image = opj_decode(dinfo, cio); + + /* Close the byte stream */ + opj_cio_close(cio); + + if (image == NULL) goto error; + else return; + +error: + if (format == CODEC_JP2) { + error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as JP2, trying as J2K."); + init2(buf, bufLen, CODEC_J2K); + } else if (format == CODEC_J2K) { + error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as J2K, trying as JPT."); + init2(buf, bufLen, CODEC_JPT); + } else { + error(errSyntaxError, -1, "Did no succeed opening JPX Stream."); + } +} + +int JPXStream::lookChar() { + return doLookChar(); +} + +GooString *JPXStream::getPSFilter(int psLevel, const char *indent) { + return NULL; +} + +GBool JPXStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void JPXStream::getImageParams(int *bitsPerComponent, StreamColorSpaceMode *csMode) { + if (inited == gFalse) init(); + + *bitsPerComponent = 8; + if (image && image->numcomps == 3) *csMode = streamCSDeviceRGB; + else *csMode = streamCSDeviceGray; +} + diff --git a/poppler/JPEG2000Stream.h b/poppler/JPEG2000Stream.h new file mode 100644 index 0000000..5aed32d --- /dev/null +++ b/poppler/JPEG2000Stream.h @@ -0,0 +1,72 @@ +//======================================================================== +// +// JPEG2000Stream.h +// +// A JPX stream decoder using OpenJPEG +// +// Copyright 2008, 2010 Albert Astals Cid +// Copyright 2011 Daniel Glöckner +// +// Licensed under GPLv2 or later +// +//======================================================================== + + +#ifndef JPEG2000STREAM_H +#define JPEG2000STREAM_H + +#include + +#include "goo/gtypes.h" +#include "Object.h" +#include "Stream.h" + +class JPXStream: public FilterStream { +public: + + JPXStream(Stream *strA); + virtual ~JPXStream(); + virtual StreamKind getKind() { return strJPX; } + virtual void reset(); + virtual void close(); + virtual int getPos(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + virtual void getImageParams(int *bitsPerComponent, StreamColorSpaceMode *csMode); + +private: + void init(); + void init2(unsigned char *buf, int bufLen, OPJ_CODEC_FORMAT format); + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + inline int doGetChar() { + int result = doLookChar(); + if (++ccounter == ncomps) { + ccounter = 0; + ++counter; + } + return result; + } + + inline int doLookChar() { + if (unlikely(inited == gFalse)) init(); + + if (unlikely(counter >= npixels)) return EOF; + + return ((unsigned char *)image->comps[ccounter].data)[counter]; + } + + opj_image_t *image; + opj_dinfo_t *dinfo; + int counter; + int ccounter; + int npixels; + int ncomps; + GBool inited; +}; + +#endif diff --git a/poppler/JPXStream.cc b/poppler/JPXStream.cc new file mode 100644 index 0000000..2cf616d --- /dev/null +++ b/poppler/JPXStream.cc @@ -0,0 +1,3404 @@ +//======================================================================== +// +// JPXStream.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008, 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "Error.h" +#include "JArithmeticDecoder.h" +#include "JPXStream.h" + +//~ to do: +// - precincts +// - ROI +// - progression order changes +// - packed packet headers +// - support for palettes, channel maps, etc. +// - make sure all needed JP2/JPX subboxes are parsed (readBoxes) +// - can we assume that QCC segments must come after the QCD segment? +// - handle tilePartToEOC in readTilePartData +// - progression orders 2, 3, and 4 +// - in coefficient decoding (readCodeBlockData): +// - selective arithmetic coding bypass +// (this also affects reading the cb->dataLen array) +// - coeffs longer than 31 bits (should just ignore the extra bits?) +// - handle boxes larger than 2^32 bytes +// - the fixed-point arithmetic won't handle 16-bit pixels + +//------------------------------------------------------------------------ + +// number of contexts for the arithmetic decoder +#define jpxNContexts 19 + +#define jpxContextSigProp 0 // 0 - 8: significance prop and cleanup +#define jpxContextSign 9 // 9 - 13: sign +#define jpxContextMagRef 14 // 14 -16: magnitude refinement +#define jpxContextRunLength 17 // cleanup: run length +#define jpxContextUniform 18 // cleanup: first signif coeff + +//------------------------------------------------------------------------ + +#define jpxPassSigProp 0 +#define jpxPassMagRef 1 +#define jpxPassCleanup 2 + +//------------------------------------------------------------------------ + +// arithmetic decoder context for the significance propagation and +// cleanup passes: +// [horiz][vert][diag][subband] +// where subband = 0 for HL +// = 1 for LH and LL +// = 2 for HH +static const Guint sigPropContext[3][3][5][3] = { + {{{ 0, 0, 0 }, // horiz=0, vert=0, diag=0 + { 1, 1, 3 }, // horiz=0, vert=0, diag=1 + { 2, 2, 6 }, // horiz=0, vert=0, diag=2 + { 2, 2, 8 }, // horiz=0, vert=0, diag=3 + { 2, 2, 8 }}, // horiz=0, vert=0, diag=4 + {{ 5, 3, 1 }, // horiz=0, vert=1, diag=0 + { 6, 3, 4 }, // horiz=0, vert=1, diag=1 + { 6, 3, 7 }, // horiz=0, vert=1, diag=2 + { 6, 3, 8 }, // horiz=0, vert=1, diag=3 + { 6, 3, 8 }}, // horiz=0, vert=1, diag=4 + {{ 8, 4, 2 }, // horiz=0, vert=2, diag=0 + { 8, 4, 5 }, // horiz=0, vert=2, diag=1 + { 8, 4, 7 }, // horiz=0, vert=2, diag=2 + { 8, 4, 8 }, // horiz=0, vert=2, diag=3 + { 8, 4, 8 }}}, // horiz=0, vert=2, diag=4 + {{{ 3, 5, 1 }, // horiz=1, vert=0, diag=0 + { 3, 6, 4 }, // horiz=1, vert=0, diag=1 + { 3, 6, 7 }, // horiz=1, vert=0, diag=2 + { 3, 6, 8 }, // horiz=1, vert=0, diag=3 + { 3, 6, 8 }}, // horiz=1, vert=0, diag=4 + {{ 7, 7, 2 }, // horiz=1, vert=1, diag=0 + { 7, 7, 5 }, // horiz=1, vert=1, diag=1 + { 7, 7, 7 }, // horiz=1, vert=1, diag=2 + { 7, 7, 8 }, // horiz=1, vert=1, diag=3 + { 7, 7, 8 }}, // horiz=1, vert=1, diag=4 + {{ 8, 7, 2 }, // horiz=1, vert=2, diag=0 + { 8, 7, 5 }, // horiz=1, vert=2, diag=1 + { 8, 7, 7 }, // horiz=1, vert=2, diag=2 + { 8, 7, 8 }, // horiz=1, vert=2, diag=3 + { 8, 7, 8 }}}, // horiz=1, vert=2, diag=4 + {{{ 4, 8, 2 }, // horiz=2, vert=0, diag=0 + { 4, 8, 5 }, // horiz=2, vert=0, diag=1 + { 4, 8, 7 }, // horiz=2, vert=0, diag=2 + { 4, 8, 8 }, // horiz=2, vert=0, diag=3 + { 4, 8, 8 }}, // horiz=2, vert=0, diag=4 + {{ 7, 8, 2 }, // horiz=2, vert=1, diag=0 + { 7, 8, 5 }, // horiz=2, vert=1, diag=1 + { 7, 8, 7 }, // horiz=2, vert=1, diag=2 + { 7, 8, 8 }, // horiz=2, vert=1, diag=3 + { 7, 8, 8 }}, // horiz=2, vert=1, diag=4 + {{ 8, 8, 2 }, // horiz=2, vert=2, diag=0 + { 8, 8, 5 }, // horiz=2, vert=2, diag=1 + { 8, 8, 7 }, // horiz=2, vert=2, diag=2 + { 8, 8, 8 }, // horiz=2, vert=2, diag=3 + { 8, 8, 8 }}} // horiz=2, vert=2, diag=4 +}; + +// arithmetic decoder context and xor bit for the sign bit in the +// significance propagation pass: +// [horiz][vert][k] +// where horiz/vert are offset by 2 (i.e., range is -2 .. 2) +// and k = 0 for the context +// = 1 for the xor bit +static const Guint signContext[5][5][2] = { + {{ 13, 1 }, // horiz=-2, vert=-2 + { 13, 1 }, // horiz=-2, vert=-1 + { 12, 1 }, // horiz=-2, vert= 0 + { 11, 1 }, // horiz=-2, vert=+1 + { 11, 1 }}, // horiz=-2, vert=+2 + {{ 13, 1 }, // horiz=-1, vert=-2 + { 13, 1 }, // horiz=-1, vert=-1 + { 12, 1 }, // horiz=-1, vert= 0 + { 11, 1 }, // horiz=-1, vert=+1 + { 11, 1 }}, // horiz=-1, vert=+2 + {{ 10, 1 }, // horiz= 0, vert=-2 + { 10, 1 }, // horiz= 0, vert=-1 + { 9, 0 }, // horiz= 0, vert= 0 + { 10, 0 }, // horiz= 0, vert=+1 + { 10, 0 }}, // horiz= 0, vert=+2 + {{ 11, 0 }, // horiz=+1, vert=-2 + { 11, 0 }, // horiz=+1, vert=-1 + { 12, 0 }, // horiz=+1, vert= 0 + { 13, 0 }, // horiz=+1, vert=+1 + { 13, 0 }}, // horiz=+1, vert=+2 + {{ 11, 0 }, // horiz=+2, vert=-2 + { 11, 0 }, // horiz=+2, vert=-1 + { 12, 0 }, // horiz=+2, vert= 0 + { 13, 0 }, // horiz=+2, vert=+1 + { 13, 0 }}, // horiz=+2, vert=+2 +}; + +//------------------------------------------------------------------------ + +// constants used in the IDWT +#define idwtAlpha -1.586134342059924 +#define idwtBeta -0.052980118572961 +#define idwtGamma 0.882911075530934 +#define idwtDelta 0.443506852043971 +#define idwtKappa 1.230174104914001 +#define idwtIKappa (1.0 / idwtKappa) + +// number of bits to the right of the decimal point for the fixed +// point arithmetic used in the IDWT +#define fracBits 16 + +//------------------------------------------------------------------------ + +// floor(x / y) +#define jpxFloorDiv(x, y) ((x) / (y)) + +// floor(x / 2^y) +#define jpxFloorDivPow2(x, y) ((x) >> (y)) + +// ceil(x / y) +#define jpxCeilDiv(x, y) (((x) + (y) - 1) / (y)) + +// ceil(x / 2^y) +#define jpxCeilDivPow2(x, y) (((x) + (1 << (y)) - 1) >> (y)) + +//------------------------------------------------------------------------ + +#if 1 //----- disable coverage tracking + +#define cover(idx) + +#else //----- enable coverage tracking + +class JPXCover { +public: + + JPXCover(int sizeA); + ~JPXCover(); + void incr(int idx); + +private: + + int size, used; + int *data; +}; + +JPXCover::JPXCover(int sizeA) { + size = sizeA; + used = -1; + data = (int *)gmallocn(size, sizeof(int)); + memset(data, 0, size * sizeof(int)); +} + +JPXCover::~JPXCover() { + int i; + + printf("JPX coverage:\n"); + for (i = 0; i <= used; ++i) { + printf(" %4d: %8d\n", i, data[i]); + } + gfree(data); +} + +void JPXCover::incr(int idx) { + if (idx < size) { + ++data[idx]; + if (idx > used) { + used = idx; + } + } +} + +JPXCover jpxCover(150); + +#define cover(idx) jpxCover.incr(idx) + +#endif //----- coverage tracking + +//------------------------------------------------------------------------ + +JPXStream::JPXStream(Stream *strA): + FilterStream(strA) +{ + bufStr = new BufStream(str, 2); + + nComps = 0; + bpc = NULL; + width = height = 0; + haveCS = gFalse; + havePalette = gFalse; + haveCompMap = gFalse; + haveChannelDefn = gFalse; + + img.tiles = NULL; + bitBuf = 0; + bitBufLen = 0; + bitBufSkip = gFalse; + byteCount = 0; +} + +JPXStream::~JPXStream() { + close(); + delete bufStr; +} + +void JPXStream::reset() { + bufStr->reset(); + if (readBoxes()) { + curY = img.yOffset; + } else { + // readBoxes reported an error, so we go immediately to EOF + curY = img.ySize; + } + curX = img.xOffset; + curComp = 0; + readBufLen = 0; +} + +void JPXStream::close() { + JPXTile *tile; + JPXTileComp *tileComp; + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + Guint comp, i, k, r, pre, sb; + + gfree(bpc); + bpc = NULL; + if (havePalette) { + gfree(palette.bpc); + gfree(palette.c); + havePalette = gFalse; + } + if (haveCompMap) { + gfree(compMap.comp); + gfree(compMap.type); + gfree(compMap.pComp); + haveCompMap = gFalse; + } + if (haveChannelDefn) { + gfree(channelDefn.idx); + gfree(channelDefn.type); + gfree(channelDefn.assoc); + haveChannelDefn = gFalse; + } + + if (img.tiles) { + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + tile = &img.tiles[i]; + if (tile->tileComps) { + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + gfree(tileComp->quantSteps); + gfree(tileComp->data); + gfree(tileComp->buf); + if (tileComp->resLevels) { + for (r = 0; r <= tileComp->nDecompLevels; ++r) { + resLevel = &tileComp->resLevels[r]; + if (resLevel->precincts) { + for (pre = 0; pre < 1; ++pre) { + precinct = &resLevel->precincts[pre]; + if (precinct->subbands) { + for (sb = 0; sb < (Guint)(r == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + gfree(subband->inclusion); + gfree(subband->zeroBitPlane); + if (subband->cbs) { + for (k = 0; k < subband->nXCBs * subband->nYCBs; ++k) { + cb = &subband->cbs[k]; + gfree(cb->dataLen); + gfree(cb->touched); + if (cb->arithDecoder) { + delete cb->arithDecoder; + } + if (cb->stats) { + delete cb->stats; + } + } + gfree(subband->cbs); + } + } + gfree(precinct->subbands); + } + } + gfree(img.tiles[i].tileComps[comp].resLevels[r].precincts); + } + } + gfree(img.tiles[i].tileComps[comp].resLevels); + } + } + gfree(img.tiles[i].tileComps); + } + } + gfree(img.tiles); + img.tiles = NULL; + } + bufStr->close(); +} + +int JPXStream::getChar() { + int c; + + if (readBufLen < 8) { + fillReadBuf(); + } + if (readBufLen == 8) { + c = readBuf & 0xff; + readBufLen = 0; + } else if (readBufLen > 8) { + c = (readBuf >> (readBufLen - 8)) & 0xff; + readBufLen -= 8; + } else if (readBufLen == 0) { + c = EOF; + } else { + c = (readBuf << (8 - readBufLen)) & 0xff; + readBufLen = 0; + } + return c; +} + +int JPXStream::lookChar() { + int c; + + if (readBufLen < 8) { + fillReadBuf(); + } + if (readBufLen == 8) { + c = readBuf & 0xff; + } else if (readBufLen > 8) { + c = (readBuf >> (readBufLen - 8)) & 0xff; + } else if (readBufLen == 0) { + c = EOF; + } else { + c = (readBuf << (8 - readBufLen)) & 0xff; + } + return c; +} + +void JPXStream::fillReadBuf() { + JPXTileComp *tileComp; + Guint tileIdx, tx, ty; + int pix, pixBits; + + do { + if (curY >= img.ySize) { + return; + } + tileIdx = ((curY - img.yTileOffset) / img.yTileSize) * img.nXTiles + + (curX - img.xTileOffset) / img.xTileSize; +#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid + tileComp = &img.tiles[tileIdx].tileComps[curComp]; +#else + tileComp = &img.tiles[tileIdx].tileComps[havePalette ? 0 : curComp]; +#endif + tx = jpxCeilDiv((curX - img.xTileOffset) % img.xTileSize, tileComp->hSep); + ty = jpxCeilDiv((curY - img.yTileOffset) % img.yTileSize, tileComp->vSep); + if (unlikely(ty >= (tileComp->y1 - tileComp->y0))) { + error(errSyntaxError, getPos(), "Unexpected ty in fillReadBuf in JPX stream"); + return; + } + pix = (int)tileComp->data[ty * (tileComp->x1 - tileComp->x0) + tx]; + pixBits = tileComp->prec; +#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid + if (++curComp == img.nComps) { +#else + if (havePalette) { + if (pix >= 0 && pix < palette.nEntries) { + pix = palette.c[pix * palette.nComps + curComp]; + } else { + pix = 0; + } + pixBits = palette.bpc[curComp]; + } + if (++curComp == (Guint)(havePalette ? palette.nComps : img.nComps)) { +#endif + curComp = 0; + if (++curX == img.xSize) { + curX = img.xOffset; + ++curY; + if (pixBits < 8) { + pix <<= 8 - pixBits; + pixBits = 8; + } + } + } + if (pixBits == 8) { + readBuf = (readBuf << 8) | (pix & 0xff); + } else { + readBuf = (readBuf << pixBits) | (pix & ((1 << pixBits) - 1)); + } + readBufLen += pixBits; + } while (readBufLen < 8); +} + +GooString *JPXStream::getPSFilter(int psLevel, const char *indent) { + return NULL; +} + +GBool JPXStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void JPXStream::getImageParams(int *bitsPerComponent, + StreamColorSpaceMode *csMode) { + Guint boxType, boxLen, dataLen, csEnum; + Guint bpc1, dummy, i; + int csMeth, csPrec, csPrec1, dummy2; + StreamColorSpaceMode csMode1; + GBool haveBPC, haveCSMode; + + csPrec = 0; // make gcc happy + haveBPC = haveCSMode = gFalse; + bufStr->reset(); + if (bufStr->lookChar() == 0xff) { + getImageParams2(bitsPerComponent, csMode); + } else { + while (readBoxHdr(&boxType, &boxLen, &dataLen)) { + if (boxType == 0x6a703268) { // JP2 header + cover(0); + // skip the superbox + } else if (boxType == 0x69686472) { // image header + cover(1); + if (readULong(&dummy) && + readULong(&dummy) && + readUWord(&dummy) && + readUByte(&bpc1) && + readUByte(&dummy) && + readUByte(&dummy) && + readUByte(&dummy)) { + *bitsPerComponent = bpc1 + 1; + haveBPC = gTrue; + } + } else if (boxType == 0x636F6C72) { // color specification + cover(2); + if (readByte(&csMeth) && + readByte(&csPrec1) && + readByte(&dummy2)) { + if (csMeth == 1) { + if (readULong(&csEnum)) { + csMode1 = streamCSNone; + if (csEnum == jpxCSBiLevel || + csEnum == jpxCSGrayscale) { + csMode1 = streamCSDeviceGray; + } else if (csEnum == jpxCSCMYK) { + csMode1 = streamCSDeviceCMYK; + } else if (csEnum == jpxCSsRGB || + csEnum == jpxCSCISesRGB || + csEnum == jpxCSROMMRGB) { + csMode1 = streamCSDeviceRGB; + } + if (csMode1 != streamCSNone && + (!haveCSMode || csPrec1 > csPrec)) { + *csMode = csMode1; + csPrec = csPrec1; + haveCSMode = gTrue; + } + for (i = 0; i < dataLen - 7; ++i) { + bufStr->getChar(); + } + } + } else { + for (i = 0; i < dataLen - 3; ++i) { + bufStr->getChar(); + } + } + } + } else if (boxType == 0x6A703263) { // codestream + cover(3); + if (!(haveBPC && haveCSMode)) { + getImageParams2(bitsPerComponent, csMode); + } + break; + } else { + cover(4); + for (i = 0; i < dataLen; ++i) { + bufStr->getChar(); + } + } + } + } + bufStr->close(); +} + +// Get image parameters from the codestream. +void JPXStream::getImageParams2(int *bitsPerComponent, + StreamColorSpaceMode *csMode) { + int segType; + Guint segLen, nComps1, bpc1, dummy, i; + + while (readMarkerHdr(&segType, &segLen)) { + if (segType == 0x51) { // SIZ - image and tile size + cover(5); + if (readUWord(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readUWord(&nComps1) && + readUByte(&bpc1)) { + *bitsPerComponent = (bpc1 & 0x7f) + 1; + // if there's no color space info, take a guess + if (nComps1 == 1) { + *csMode = streamCSDeviceGray; + } else if (nComps1 == 3) { + *csMode = streamCSDeviceRGB; + } else if (nComps1 == 4) { + *csMode = streamCSDeviceCMYK; + } + } + break; + } else { + cover(6); + if (segLen > 2) { + for (i = 0; i < segLen - 2; ++i) { + bufStr->getChar(); + } + } + } + } +} + +GBool JPXStream::readBoxes() { + Guint boxType, boxLen, dataLen; + Guint bpc1, compression, unknownColorspace, ipr; + Guint i, j; + + haveImgHdr = gFalse; + + // check for a naked JPEG 2000 codestream (without the JP2/JPX + // wrapper) -- this appears to be a violation of the PDF spec, but + // Acrobat allows it + if (bufStr->lookChar() == 0xff) { + cover(7); + error(errSyntaxWarning, getPos(), + "Naked JPEG 2000 codestream, missing JP2/JPX wrapper"); + if (!readCodestream(0)) { + return gFalse; + } + nComps = img.nComps; + bpc = (Guint *)gmallocn(nComps, sizeof(Guint)); + for (i = 0; i < nComps; ++i) { + bpc[i] = img.tiles[0].tileComps[i].prec; + } + width = img.xSize - img.xOffset; + height = img.ySize - img.yOffset; + return gTrue; + } + + while (readBoxHdr(&boxType, &boxLen, &dataLen)) { + switch (boxType) { + case 0x6a703268: // JP2 header + // this is a grouping box ('superbox') which has no real + // contents and doesn't appear to be used consistently, i.e., + // some things which should be subboxes of the JP2 header box + // show up outside of it - so we simply ignore the JP2 header + // box + cover(8); + break; + case 0x69686472: // image header + cover(9); + if (!readULong(&height) || + !readULong(&width) || + !readUWord(&nComps) || + !readUByte(&bpc1) || + !readUByte(&compression) || + !readUByte(&unknownColorspace) || + !readUByte(&ipr)) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + if (compression != 7) { + error(errSyntaxError, getPos(), + "Unknown compression type in JPX stream"); + return gFalse; + } + bpc = (Guint *)gmallocn(nComps, sizeof(Guint)); + for (i = 0; i < nComps; ++i) { + bpc[i] = bpc1; + } + haveImgHdr = gTrue; + break; + case 0x62706363: // bits per component + cover(10); + if (!haveImgHdr) { + error(errSyntaxError, getPos(), + "Found bits per component box before image header box in JPX stream"); + return gFalse; + } + if (dataLen != nComps) { + error(errSyntaxError, getPos(), + "Invalid bits per component box in JPX stream"); + return gFalse; + } + for (i = 0; i < nComps; ++i) { + if (!readUByte(&bpc[i])) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + break; + case 0x636F6C72: // color specification + cover(11); + if (!readColorSpecBox(dataLen)) { + return gFalse; + } + break; + case 0x70636c72: // palette + cover(12); + if (!readUWord(&palette.nEntries) || + !readUByte(&palette.nComps)) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + palette.bpc = (Guint *)gmallocn(palette.nComps, sizeof(Guint)); + palette.c = + (int *)gmallocn(palette.nEntries * palette.nComps, sizeof(int)); + for (i = 0; i < palette.nComps; ++i) { + if (!readUByte(&palette.bpc[i])) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + ++palette.bpc[i]; + } + for (i = 0; i < palette.nEntries; ++i) { + for (j = 0; j < palette.nComps; ++j) { + if (!readNBytes(((palette.bpc[j] & 0x7f) + 7) >> 3, + (palette.bpc[j] & 0x80) ? gTrue : gFalse, + &palette.c[i * palette.nComps + j])) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + } + havePalette = gTrue; + break; + case 0x636d6170: // component mapping + cover(13); + compMap.nChannels = dataLen / 4; + compMap.comp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); + compMap.type = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); + compMap.pComp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); + for (i = 0; i < compMap.nChannels; ++i) { + if (!readUWord(&compMap.comp[i]) || + !readUByte(&compMap.type[i]) || + !readUByte(&compMap.pComp[i])) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + haveCompMap = gTrue; + break; + case 0x63646566: // channel definition + cover(14); + if (!readUWord(&channelDefn.nChannels)) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + channelDefn.idx = + (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); + channelDefn.type = + (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); + channelDefn.assoc = + (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); + for (i = 0; i < channelDefn.nChannels; ++i) { + if (!readUWord(&channelDefn.idx[i]) || + !readUWord(&channelDefn.type[i]) || + !readUWord(&channelDefn.assoc[i])) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + haveChannelDefn = gTrue; + break; + case 0x6A703263: // contiguous codestream + cover(15); + if (!bpc) { + error(errSyntaxError, getPos(), + "JPX stream is missing the image header box"); + } + if (!haveCS) { + error(errSyntaxError, getPos(), + "JPX stream has no supported color spec"); + } + if (!readCodestream(dataLen)) { + return gFalse; + } + break; + default: + cover(16); + for (i = 0; i < dataLen; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + break; + } + } + return gTrue; +} + +GBool JPXStream::readColorSpecBox(Guint dataLen) { + JPXColorSpec newCS; + Guint csApprox, csEnum; + Guint i; + GBool ok; + + ok = gFalse; + if (!readUByte(&newCS.meth) || + !readByte(&newCS.prec) || + !readUByte(&csApprox)) { + goto err; + } + switch (newCS.meth) { + case 1: // enumerated colorspace + cover(17); + if (!readULong(&csEnum)) { + goto err; + } + newCS.enumerated.type = (JPXColorSpaceType)csEnum; + switch (newCS.enumerated.type) { + case jpxCSBiLevel: + ok = gTrue; + break; + case jpxCSYCbCr1: + ok = gTrue; + break; + case jpxCSYCbCr2: + ok = gTrue; + break; + case jpxCSYCBCr3: + ok = gTrue; + break; + case jpxCSPhotoYCC: + ok = gTrue; + break; + case jpxCSCMY: + ok = gTrue; + break; + case jpxCSCMYK: + ok = gTrue; + break; + case jpxCSYCCK: + ok = gTrue; + break; + case jpxCSCIELab: + if (dataLen == 7 + 7*4) { + if (!readULong(&newCS.enumerated.cieLab.rl) || + !readULong(&newCS.enumerated.cieLab.ol) || + !readULong(&newCS.enumerated.cieLab.ra) || + !readULong(&newCS.enumerated.cieLab.oa) || + !readULong(&newCS.enumerated.cieLab.rb) || + !readULong(&newCS.enumerated.cieLab.ob) || + !readULong(&newCS.enumerated.cieLab.il)) { + goto err; + } + } else if (dataLen == 7) { + //~ this assumes the 8-bit case + cover(92); + newCS.enumerated.cieLab.rl = 100; + newCS.enumerated.cieLab.ol = 0; + newCS.enumerated.cieLab.ra = 255; + newCS.enumerated.cieLab.oa = 128; + newCS.enumerated.cieLab.rb = 255; + newCS.enumerated.cieLab.ob = 96; + newCS.enumerated.cieLab.il = 0x00443530; + } else { + goto err; + } + ok = gTrue; + break; + case jpxCSsRGB: + ok = gTrue; + break; + case jpxCSGrayscale: + ok = gTrue; + break; + case jpxCSBiLevel2: + ok = gTrue; + break; + case jpxCSCIEJab: + // not allowed in PDF + goto err; + case jpxCSCISesRGB: + ok = gTrue; + break; + case jpxCSROMMRGB: + ok = gTrue; + break; + case jpxCSsRGBYCbCr: + ok = gTrue; + break; + case jpxCSYPbPr1125: + ok = gTrue; + break; + case jpxCSYPbPr1250: + ok = gTrue; + break; + default: + goto err; + } + break; + case 2: // restricted ICC profile + case 3: // any ICC profile (JPX) + case 4: // vendor color (JPX) + cover(18); + for (i = 0; i < dataLen - 3; ++i) { + if (bufStr->getChar() == EOF) { + goto err; + } + } + break; + } + + if (ok && (!haveCS || newCS.prec > cs.prec)) { + cs = newCS; + haveCS = gTrue; + } + + return gTrue; + + err: + error(errSyntaxError, getPos(), "Error in JPX color spec"); + return gFalse; +} + +GBool JPXStream::readCodestream(Guint len) { + JPXTile *tile; + JPXTileComp *tileComp; + int segType; + GBool haveSIZ, haveCOD, haveQCD, haveSOT; + Guint precinctSize, style; + Guint segLen, capabilities, comp, i, j, r; + + //----- main header + haveSIZ = haveCOD = haveQCD = haveSOT = gFalse; + do { + if (!readMarkerHdr(&segType, &segLen)) { + error(errSyntaxError, getPos(), "Error in JPX codestream"); + return gFalse; + } + switch (segType) { + case 0x4f: // SOC - start of codestream + // marker only + cover(19); + break; + case 0x51: // SIZ - image and tile size + cover(20); + if (haveSIZ) { + error(errSyntaxError, getPos(), + "Duplicate SIZ marker segment in JPX stream"); + return gFalse; + } + if (!readUWord(&capabilities) || + !readULong(&img.xSize) || + !readULong(&img.ySize) || + !readULong(&img.xOffset) || + !readULong(&img.yOffset) || + !readULong(&img.xTileSize) || + !readULong(&img.yTileSize) || + !readULong(&img.xTileOffset) || + !readULong(&img.yTileOffset) || + !readUWord(&img.nComps)) { + error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment"); + return gFalse; + } + if (haveImgHdr && img.nComps != nComps) { + error(errSyntaxError, getPos(), + "Different number of components in JPX SIZ marker segment"); + return gFalse; + } + if (img.xSize == 0 || img.ySize == 0 || + img.xOffset >= img.xSize || img.yOffset >= img.ySize || + img.xTileSize == 0 || img.yTileSize == 0 || + img.xTileOffset > img.xOffset || + img.yTileOffset > img.yOffset || + img.xTileSize + img.xTileOffset <= img.xOffset || + img.yTileSize + img.yTileOffset <= img.yOffset) { + error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment"); + return gFalse; + } + img.nXTiles = (img.xSize - img.xTileOffset + img.xTileSize - 1) + / img.xTileSize; + img.nYTiles = (img.ySize - img.yTileOffset + img.yTileSize - 1) + / img.yTileSize; + // check for overflow before allocating memory + if (img.nXTiles <= 0 || img.nYTiles <= 0 || + img.nXTiles >= INT_MAX / img.nYTiles) { + error(errSyntaxError, getPos(), + "Bad tile count in JPX SIZ marker segment"); + return gFalse; + } + img.tiles = (JPXTile *)gmallocn(img.nXTiles * img.nYTiles, + sizeof(JPXTile)); + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + img.tiles[i].init = gFalse; + img.tiles[i].tileComps = (JPXTileComp *)gmallocn(img.nComps, + sizeof(JPXTileComp)); + for (comp = 0; comp < img.nComps; ++comp) { + img.tiles[i].tileComps[comp].quantSteps = NULL; + img.tiles[i].tileComps[comp].data = NULL; + img.tiles[i].tileComps[comp].buf = NULL; + img.tiles[i].tileComps[comp].resLevels = NULL; + } + } + for (comp = 0; comp < img.nComps; ++comp) { + if (!readUByte(&img.tiles[0].tileComps[comp].prec) || + !readUByte(&img.tiles[0].tileComps[comp].hSep) || + !readUByte(&img.tiles[0].tileComps[comp].vSep)) { + error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment"); + return gFalse; + } + if (img.tiles[0].tileComps[comp].hSep == 0 || + img.tiles[0].tileComps[comp].vSep == 0) { + error(errSyntaxError, getPos(), "Error in JPX SIZ marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].sgned = + (img.tiles[0].tileComps[comp].prec & 0x80) ? gTrue : gFalse; + img.tiles[0].tileComps[comp].prec = + (img.tiles[0].tileComps[comp].prec & 0x7f) + 1; + for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { + img.tiles[i].tileComps[comp] = img.tiles[0].tileComps[comp]; + } + } + haveSIZ = gTrue; + break; + case 0x52: // COD - coding style default + cover(21); + if (!haveSIZ) { + error(errSyntaxError, getPos(), + "JPX COD marker segment before SIZ segment"); + return gFalse; + } + if (!readUByte(&img.tiles[0].tileComps[0].style) || + !readUByte(&img.tiles[0].progOrder) || + !readUWord(&img.tiles[0].nLayers) || + !readUByte(&img.tiles[0].multiComp) || + !readUByte(&img.tiles[0].tileComps[0].nDecompLevels) || + !readUByte(&img.tiles[0].tileComps[0].codeBlockW) || + !readUByte(&img.tiles[0].tileComps[0].codeBlockH) || + !readUByte(&img.tiles[0].tileComps[0].codeBlockStyle) || + !readUByte(&img.tiles[0].tileComps[0].transform)) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + if (img.tiles[0].tileComps[0].nDecompLevels > 32 || + img.tiles[0].tileComps[0].codeBlockW > 8 || + img.tiles[0].tileComps[0].codeBlockH > 8) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[0].codeBlockW += 2; + img.tiles[0].tileComps[0].codeBlockH += 2; + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + if (i != 0) { + img.tiles[i].progOrder = img.tiles[0].progOrder; + img.tiles[i].nLayers = img.tiles[0].nLayers; + img.tiles[i].multiComp = img.tiles[0].multiComp; + } + for (comp = 0; comp < img.nComps; ++comp) { + if (!(i == 0 && comp == 0)) { + img.tiles[i].tileComps[comp].style = + img.tiles[0].tileComps[0].style; + img.tiles[i].tileComps[comp].nDecompLevels = + img.tiles[0].tileComps[0].nDecompLevels; + img.tiles[i].tileComps[comp].codeBlockW = + img.tiles[0].tileComps[0].codeBlockW; + img.tiles[i].tileComps[comp].codeBlockH = + img.tiles[0].tileComps[0].codeBlockH; + img.tiles[i].tileComps[comp].codeBlockStyle = + img.tiles[0].tileComps[0].codeBlockStyle; + img.tiles[i].tileComps[comp].transform = + img.tiles[0].tileComps[0].transform; + } + img.tiles[i].tileComps[comp].resLevels = + (JPXResLevel *)gmallocn( + (img.tiles[i].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; + } + } + } + for (r = 0; r <= img.tiles[0].tileComps[0].nDecompLevels; ++r) { + if (img.tiles[0].tileComps[0].style & 0x01) { + cover(91); + if (!readUByte(&precinctSize)) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[0].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[0].tileComps[0].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[0].tileComps[0].resLevels[r].precinctWidth = 15; + img.tiles[0].tileComps[0].resLevels[r].precinctHeight = 15; + } + } + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + for (comp = 0; comp < img.nComps; ++comp) { + if (!(i == 0 && comp == 0)) { + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = + img.tiles[0].tileComps[0].resLevels[r].precinctWidth; + img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = + img.tiles[0].tileComps[0].resLevels[r].precinctHeight; + } + } + } + } + haveCOD = gTrue; + break; + case 0x53: // COC - coding style component + cover(22); + if (!haveCOD) { + error(errSyntaxError, getPos(), + "JPX COC marker segment before COD segment"); + return gFalse; + } + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&style) || + !readUByte(&img.tiles[0].tileComps[comp].nDecompLevels) || + !readUByte(&img.tiles[0].tileComps[comp].codeBlockW) || + !readUByte(&img.tiles[0].tileComps[comp].codeBlockH) || + !readUByte(&img.tiles[0].tileComps[comp].codeBlockStyle) || + !readUByte(&img.tiles[0].tileComps[comp].transform)) { + error(errSyntaxError, getPos(), "Error in JPX COC marker segment"); + return gFalse; + } + if (img.tiles[0].tileComps[comp].nDecompLevels > 32 || + img.tiles[0].tileComps[comp].codeBlockW > 8 || + img.tiles[0].tileComps[comp].codeBlockH > 8) { + error(errSyntaxError, getPos(), "Error in JPX COC marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].style = + (img.tiles[0].tileComps[comp].style & ~1) | (style & 1); + img.tiles[0].tileComps[comp].codeBlockW += 2; + img.tiles[0].tileComps[comp].codeBlockH += 2; + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + if (i != 0) { + img.tiles[i].tileComps[comp].style = + img.tiles[0].tileComps[comp].style; + img.tiles[i].tileComps[comp].nDecompLevels = + img.tiles[0].tileComps[comp].nDecompLevels; + img.tiles[i].tileComps[comp].codeBlockW = + img.tiles[0].tileComps[comp].codeBlockW; + img.tiles[i].tileComps[comp].codeBlockH = + img.tiles[0].tileComps[comp].codeBlockH; + img.tiles[i].tileComps[comp].codeBlockStyle = + img.tiles[0].tileComps[comp].codeBlockStyle; + img.tiles[i].tileComps[comp].transform = + img.tiles[0].tileComps[comp].transform; + } + img.tiles[i].tileComps[comp].resLevels = + (JPXResLevel *)greallocn( + img.tiles[i].tileComps[comp].resLevels, + (img.tiles[i].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; + } + } + for (r = 0; r <= img.tiles[0].tileComps[comp].nDecompLevels; ++r) { + if (img.tiles[0].tileComps[comp].style & 0x01) { + if (!readUByte(&precinctSize)) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = 15; + img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = 15; + } + } + for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = + img.tiles[0].tileComps[comp].resLevels[r].precinctWidth; + img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = + img.tiles[0].tileComps[comp].resLevels[r].precinctHeight; + } + } + break; + case 0x5c: // QCD - quantization default + cover(23); + if (!haveSIZ) { + error(errSyntaxError, getPos(), + "JPX QCD marker segment before SIZ segment"); + return gFalse; + } + if (!readUByte(&img.tiles[0].tileComps[0].quantStyle)) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x00) { + if (segLen <= 3) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[0].nQuantSteps = segLen - 3; + img.tiles[0].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[0].tileComps[0].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x01) { + img.tiles[0].tileComps[0].nQuantSteps = 1; + img.tiles[0].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[0])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x02) { + if (segLen < 5) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[0].nQuantSteps = (segLen - 3) / 2; + img.tiles[0].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + for (comp = 0; comp < img.nComps; ++comp) { + if (!(i == 0 && comp == 0)) { + img.tiles[i].tileComps[comp].quantStyle = + img.tiles[0].tileComps[0].quantStyle; + img.tiles[i].tileComps[comp].nQuantSteps = + img.tiles[0].tileComps[0].nQuantSteps; + img.tiles[i].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (j = 0; j < img.tiles[0].tileComps[0].nQuantSteps; ++j) { + img.tiles[i].tileComps[comp].quantSteps[j] = + img.tiles[0].tileComps[0].quantSteps[j]; + } + } + } + } + haveQCD = gTrue; + break; + case 0x5d: // QCC - quantization component + cover(24); + if (!haveQCD) { + error(errSyntaxError, getPos(), + "JPX QCC marker segment before QCD segment"); + return gFalse; + } + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&img.tiles[0].tileComps[comp].quantStyle)) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x00) { + if (segLen <= (img.nComps > 256 ? 5U : 4U)) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].nQuantSteps = + segLen - (img.nComps > 256 ? 5 : 4); + img.tiles[0].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[0].tileComps[comp].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } + } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x01) { + img.tiles[0].tileComps[comp].nQuantSteps = 1; + img.tiles[0].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[0])) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x02) { + if (segLen < (img.nComps > 256 ? 5U : 4U) + 2) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].nQuantSteps = + (segLen - (img.nComps > 256 ? 5 : 4)) / 2; + img.tiles[0].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { + img.tiles[i].tileComps[comp].quantStyle = + img.tiles[0].tileComps[comp].quantStyle; + img.tiles[i].tileComps[comp].nQuantSteps = + img.tiles[0].tileComps[comp].nQuantSteps; + img.tiles[i].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (j = 0; j < img.tiles[0].tileComps[comp].nQuantSteps; ++j) { + img.tiles[i].tileComps[comp].quantSteps[j] = + img.tiles[0].tileComps[comp].quantSteps[j]; + } + } + break; + case 0x5e: // RGN - region of interest + cover(25); +#if 1 //~ ROI is unimplemented + error(errUnimplemented, -1, "got a JPX RGN segment"); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX RGN marker segment"); + return gFalse; + } + } +#else + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&compInfo[comp].defROI.style) || + !readUByte(&compInfo[comp].defROI.shift)) { + error(errSyntaxError, getPos(), "Error in JPX RGN marker segment"); + return gFalse; + } +#endif + break; + case 0x5f: // POC - progression order change + cover(26); +#if 1 //~ progression order changes are unimplemented + error(errUnimplemented, -1, "got a JPX POC segment"); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX POC marker segment"); + return gFalse; + } + } +#else + nProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); + progs = (JPXProgOrder *)gmallocn(nProgs, sizeof(JPXProgOrder)); + for (i = 0; i < nProgs; ++i) { + if (!readUByte(&progs[i].startRes) || + !(img.nComps > 256 && readUWord(&progs[i].startComp)) || + !(img.nComps <= 256 && readUByte(&progs[i].startComp)) || + !readUWord(&progs[i].endLayer) || + !readUByte(&progs[i].endRes) || + !(img.nComps > 256 && readUWord(&progs[i].endComp)) || + !(img.nComps <= 256 && readUByte(&progs[i].endComp)) || + !readUByte(&progs[i].progOrder)) { + error(errSyntaxError, getPos(), "Error in JPX POC marker segment"); + return gFalse; + } + } +#endif + break; + case 0x60: // PPM - packed packet headers, main header + cover(27); +#if 1 //~ packed packet headers are unimplemented + error(errUnimplemented, -1, "Got a JPX PPM segment"); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX PPM marker segment"); + return gFalse; + } + } +#endif + break; + case 0x55: // TLM - tile-part lengths + // skipped + cover(28); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX TLM marker segment"); + return gFalse; + } + } + break; + case 0x57: // PLM - packet length, main header + // skipped + cover(29); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX PLM marker segment"); + return gFalse; + } + } + break; + case 0x63: // CRG - component registration + // skipped + cover(30); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX CRG marker segment"); + return gFalse; + } + } + break; + case 0x64: // COM - comment + // skipped + cover(31); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX COM marker segment"); + return gFalse; + } + } + break; + case 0x90: // SOT - start of tile + cover(32); + haveSOT = gTrue; + break; + default: + cover(33); + error(errSyntaxError, getPos(), + "Unknown marker segment {0:02x} in JPX stream", segType); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + break; + } + } + break; + } + } while (!haveSOT); + + if (!haveSIZ) { + error(errSyntaxError, getPos(), + "Missing SIZ marker segment in JPX stream"); + return gFalse; + } + if (!haveCOD) { + error(errSyntaxError, getPos(), + "Missing COD marker segment in JPX stream"); + return gFalse; + } + if (!haveQCD) { + error(errSyntaxError, getPos(), + "Missing QCD marker segment in JPX stream"); + return gFalse; + } + + //----- read the tile-parts + while (1) { + if (!readTilePart()) { + return gFalse; + } + if (!readMarkerHdr(&segType, &segLen)) { + error(errSyntaxError, getPos(), "Error in JPX codestream"); + return gFalse; + } + if (segType != 0x90) { // SOT - start of tile + break; + } + } + + if (segType != 0xd9) { // EOC - end of codestream + error(errSyntaxError, getPos(), "Missing EOC marker in JPX codestream"); + return gFalse; + } + + //----- finish decoding the image + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + tile = &img.tiles[i]; + if (!tile->init) { + error(errSyntaxError, getPos(), "Uninitialized tile in JPX codestream"); + return gFalse; + } + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + inverseTransform(tileComp); + } + if (!inverseMultiCompAndDC(tile)) { + return gFalse; + } + } + + //~ can free memory below tileComps here, and also tileComp.buf + + return gTrue; +} + +GBool JPXStream::readTilePart() { + JPXTile *tile; + JPXTileComp *tileComp; + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + int *sbCoeffs; + GBool haveSOD; + Guint tileIdx, tilePartLen, tilePartIdx, nTileParts; + GBool tilePartToEOC; + Guint precinctSize, style; + Guint n, nSBs, nx, ny, sbx0, sby0, comp, segLen; + Guint i, j, k, cbX, cbY, r, pre, sb, cbi, cbj; + int segType, level; + + // process the SOT marker segment + if (!readUWord(&tileIdx) || + !readULong(&tilePartLen) || + !readUByte(&tilePartIdx) || + !readUByte(&nTileParts)) { + error(errSyntaxError, getPos(), "Error in JPX SOT marker segment"); + return gFalse; + } + + if ((tilePartIdx > 0 && !img.tiles[tileIdx].init) || + tileIdx >= img.nXTiles * img.nYTiles) { + error(errSyntaxError, getPos(), "Weird tile index in JPX stream"); + return gFalse; + } + + tilePartToEOC = tilePartLen == 0; + tilePartLen -= 12; // subtract size of SOT segment + + haveSOD = gFalse; + do { + if (!readMarkerHdr(&segType, &segLen)) { + error(errSyntaxError, getPos(), "Error in JPX tile-part codestream"); + return gFalse; + } + tilePartLen -= 2 + segLen; + switch (segType) { + case 0x52: // COD - coding style default + cover(34); + if (!readUByte(&img.tiles[tileIdx].tileComps[0].style) || + !readUByte(&img.tiles[tileIdx].progOrder) || + !readUWord(&img.tiles[tileIdx].nLayers) || + !readUByte(&img.tiles[tileIdx].multiComp) || + !readUByte(&img.tiles[tileIdx].tileComps[0].nDecompLevels) || + !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockW) || + !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockH) || + !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockStyle) || + !readUByte(&img.tiles[tileIdx].tileComps[0].transform)) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + if (img.tiles[tileIdx].tileComps[0].nDecompLevels > 32 || + img.tiles[tileIdx].tileComps[0].codeBlockW > 8 || + img.tiles[tileIdx].tileComps[0].codeBlockH > 8) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[0].codeBlockW += 2; + img.tiles[tileIdx].tileComps[0].codeBlockH += 2; + for (comp = 0; comp < img.nComps; ++comp) { + if (comp != 0) { + img.tiles[tileIdx].tileComps[comp].style = + img.tiles[tileIdx].tileComps[0].style; + img.tiles[tileIdx].tileComps[comp].nDecompLevels = + img.tiles[tileIdx].tileComps[0].nDecompLevels; + img.tiles[tileIdx].tileComps[comp].codeBlockW = + img.tiles[tileIdx].tileComps[0].codeBlockW; + img.tiles[tileIdx].tileComps[comp].codeBlockH = + img.tiles[tileIdx].tileComps[0].codeBlockH; + img.tiles[tileIdx].tileComps[comp].codeBlockStyle = + img.tiles[tileIdx].tileComps[0].codeBlockStyle; + img.tiles[tileIdx].tileComps[comp].transform = + img.tiles[tileIdx].tileComps[0].transform; + } + img.tiles[tileIdx].tileComps[comp].resLevels = + (JPXResLevel *)greallocn( + img.tiles[tileIdx].tileComps[comp].resLevels, + (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; + r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; + ++r) { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL; + } + } + for (r = 0; r <= img.tiles[tileIdx].tileComps[0].nDecompLevels; ++r) { + if (img.tiles[tileIdx].tileComps[0].style & 0x01) { + if (!readUByte(&precinctSize)) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = 15; + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = 15; + } + } + for (comp = 1; comp < img.nComps; ++comp) { + for (r = 0; + r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; + ++r) { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth; + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight; + } + } + break; + case 0x53: // COC - coding style component + cover(35); + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&style) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].nDecompLevels) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockW) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockH) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockStyle) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].transform)) { + error(errSyntaxError, getPos(), "Error in JPX COC marker segment"); + return gFalse; + } + if (img.tiles[tileIdx].tileComps[comp].nDecompLevels > 32 || + img.tiles[tileIdx].tileComps[comp].codeBlockW > 8 || + img.tiles[tileIdx].tileComps[comp].codeBlockH > 8) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[comp].style = + (img.tiles[tileIdx].tileComps[comp].style & ~1) | (style & 1); + img.tiles[tileIdx].tileComps[comp].codeBlockW += 2; + img.tiles[tileIdx].tileComps[comp].codeBlockH += 2; + img.tiles[tileIdx].tileComps[comp].resLevels = + (JPXResLevel *)greallocn( + img.tiles[tileIdx].tileComps[comp].resLevels, + (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL; + } + for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) { + if (img.tiles[tileIdx].tileComps[comp].style & 0x01) { + if (!readUByte(&precinctSize)) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = 15; + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = 15; + } + } + break; + case 0x5c: // QCD - quantization default + cover(36); + if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantStyle)) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x00) { + if (segLen <= 3) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[0].nQuantSteps = segLen - 3; + img.tiles[tileIdx].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x01) { + img.tiles[tileIdx].tileComps[0].nQuantSteps = 1; + img.tiles[tileIdx].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[0])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x02) { + if (segLen < 5) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[0].nQuantSteps = (segLen - 3) / 2; + img.tiles[tileIdx].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + for (comp = 1; comp < img.nComps; ++comp) { + img.tiles[tileIdx].tileComps[comp].quantStyle = + img.tiles[tileIdx].tileComps[0].quantStyle; + img.tiles[tileIdx].tileComps[comp].nQuantSteps = + img.tiles[tileIdx].tileComps[0].nQuantSteps; + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (j = 0; j < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++j) { + img.tiles[tileIdx].tileComps[comp].quantSteps[j] = + img.tiles[tileIdx].tileComps[0].quantSteps[j]; + } + } + break; + case 0x5d: // QCC - quantization component + cover(37); + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&img.tiles[tileIdx].tileComps[comp].quantStyle)) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) == 0x00) { + if (segLen <= (img.nComps > 256 ? 5U : 4U)) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[comp].nQuantSteps = + segLen - (img.nComps > 256 ? 5 : 4); + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } + } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) + == 0x01) { + img.tiles[tileIdx].tileComps[comp].nQuantSteps = 1; + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[comp].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[0])) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) + == 0x02) { + if (segLen < (img.nComps > 256 ? 5U : 4U) + 2) { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[comp].nQuantSteps = + (segLen - (img.nComps > 256 ? 5 : 4)) / 2; + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) { + error(errSyntaxError, getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(errSyntaxError, getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + break; + case 0x5e: // RGN - region of interest + cover(38); +#if 1 //~ ROI is unimplemented + error(errUnimplemented, -1, "Got a JPX RGN segment"); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX RGN marker segment"); + return gFalse; + } + } +#else + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&compInfo[comp].roi.style) || + !readUByte(&compInfo[comp].roi.shift)) { + error(errSyntaxError, getPos(), "Error in JPX RGN marker segment"); + return gFalse; + } +#endif + break; + case 0x5f: // POC - progression order change + cover(39); +#if 1 //~ progression order changes are unimplemented + error(errUnimplemented, -1, "Got a JPX POC segment"); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX POC marker segment"); + return gFalse; + } + } +#else + nTileProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); + tileProgs = (JPXProgOrder *)gmallocn(nTileProgs, sizeof(JPXProgOrder)); + for (i = 0; i < nTileProgs; ++i) { + if (!readUByte(&tileProgs[i].startRes) || + !(img.nComps > 256 && readUWord(&tileProgs[i].startComp)) || + !(img.nComps <= 256 && readUByte(&tileProgs[i].startComp)) || + !readUWord(&tileProgs[i].endLayer) || + !readUByte(&tileProgs[i].endRes) || + !(img.nComps > 256 && readUWord(&tileProgs[i].endComp)) || + !(img.nComps <= 256 && readUByte(&tileProgs[i].endComp)) || + !readUByte(&tileProgs[i].progOrder)) { + error(errSyntaxError, getPos(), "Error in JPX POC marker segment"); + return gFalse; + } + } +#endif + break; + case 0x61: // PPT - packed packet headers, tile-part hdr + cover(40); +#if 1 //~ packed packet headers are unimplemented + error(errUnimplemented, -1, "Got a JPX PPT segment"); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX PPT marker segment"); + return gFalse; + } + } +#endif + case 0x58: // PLT - packet length, tile-part header + // skipped + cover(41); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX PLT marker segment"); + return gFalse; + } + } + break; + case 0x64: // COM - comment + // skipped + cover(42); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + error(errSyntaxError, getPos(), "Error in JPX COM marker segment"); + return gFalse; + } + } + break; + case 0x93: // SOD - start of data + cover(43); + haveSOD = gTrue; + break; + default: + cover(44); + error(errSyntaxError, getPos(), + "Unknown marker segment {0:02x} in JPX tile-part stream", + segType); + for (i = 0; i < segLen - 2; ++i) { + if (bufStr->getChar() == EOF) { + break; + } + } + break; + } + } while (!haveSOD); + + //----- initialize the tile, precincts, and code-blocks + if (tilePartIdx == 0) { + tile = &img.tiles[tileIdx]; + tile->init = gTrue; + i = tileIdx / img.nXTiles; + j = tileIdx % img.nXTiles; + if ((tile->x0 = img.xTileOffset + j * img.xTileSize) < img.xOffset) { + tile->x0 = img.xOffset; + } + if ((tile->y0 = img.yTileOffset + i * img.yTileSize) < img.yOffset) { + tile->y0 = img.yOffset; + } + if ((tile->x1 = img.xTileOffset + (j + 1) * img.xTileSize) > img.xSize) { + tile->x1 = img.xSize; + } + if ((tile->y1 = img.yTileOffset + (i + 1) * img.yTileSize) > img.ySize) { + tile->y1 = img.ySize; + } + tile->comp = 0; + tile->res = 0; + tile->precinct = 0; + tile->layer = 0; + tile->maxNDecompLevels = 0; + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + if (tileComp->nDecompLevels > tile->maxNDecompLevels) { + tile->maxNDecompLevels = tileComp->nDecompLevels; + } + tileComp->x0 = jpxCeilDiv(tile->x0, tileComp->hSep); + tileComp->y0 = jpxCeilDiv(tile->y0, tileComp->vSep); + tileComp->x1 = jpxCeilDiv(tile->x1, tileComp->hSep); + tileComp->y1 = jpxCeilDiv(tile->y1, tileComp->vSep); + tileComp->w = tileComp->x1 - tileComp->x0; + tileComp->cbW = 1 << tileComp->codeBlockW; + tileComp->cbH = 1 << tileComp->codeBlockH; + tileComp->data = (int *)gmallocn((tileComp->x1 - tileComp->x0) * + (tileComp->y1 - tileComp->y0), + sizeof(int)); + if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { + n = tileComp->x1 - tileComp->x0; + } else { + n = tileComp->y1 - tileComp->y0; + } + tileComp->buf = (int *)gmallocn(n + 8, sizeof(int)); + for (r = 0; r <= tileComp->nDecompLevels; ++r) { + resLevel = &tileComp->resLevels[r]; + k = r == 0 ? tileComp->nDecompLevels + : tileComp->nDecompLevels - r + 1; + resLevel->x0 = jpxCeilDivPow2(tileComp->x0, k); + resLevel->y0 = jpxCeilDivPow2(tileComp->y0, k); + resLevel->x1 = jpxCeilDivPow2(tileComp->x1, k); + resLevel->y1 = jpxCeilDivPow2(tileComp->y1, k); + if (r == 0) { + resLevel->bx0[0] = resLevel->x0; + resLevel->by0[0] = resLevel->y0; + resLevel->bx1[0] = resLevel->x1; + resLevel->by1[0] = resLevel->y1; + } else { + resLevel->bx0[0] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k); + resLevel->by0[0] = resLevel->y0; + resLevel->bx1[0] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k); + resLevel->by1[0] = resLevel->y1; + resLevel->bx0[1] = resLevel->x0; + resLevel->by0[1] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k); + resLevel->bx1[1] = resLevel->x1; + resLevel->by1[1] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k); + resLevel->bx0[2] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k); + resLevel->by0[2] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k); + resLevel->bx1[2] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k); + resLevel->by1[2] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k); + } + resLevel->precincts = (JPXPrecinct *)gmallocn(1, sizeof(JPXPrecinct)); + for (pre = 0; pre < 1; ++pre) { + precinct = &resLevel->precincts[pre]; + precinct->x0 = resLevel->x0; + precinct->y0 = resLevel->y0; + precinct->x1 = resLevel->x1; + precinct->y1 = resLevel->y1; + nSBs = r == 0 ? 1 : 3; + precinct->subbands = + (JPXSubband *)gmallocn(nSBs, sizeof(JPXSubband)); + for (sb = 0; sb < nSBs; ++sb) { + subband = &precinct->subbands[sb]; + subband->x0 = resLevel->bx0[sb]; + subband->y0 = resLevel->by0[sb]; + subband->x1 = resLevel->bx1[sb]; + subband->y1 = resLevel->by1[sb]; + subband->nXCBs = jpxCeilDivPow2(subband->x1, + tileComp->codeBlockW) + - jpxFloorDivPow2(subband->x0, + tileComp->codeBlockW); + subband->nYCBs = jpxCeilDivPow2(subband->y1, + tileComp->codeBlockH) + - jpxFloorDivPow2(subband->y0, + tileComp->codeBlockH); + n = subband->nXCBs > subband->nYCBs ? subband->nXCBs + : subband->nYCBs; + for (subband->maxTTLevel = 0, --n; + n; + ++subband->maxTTLevel, n >>= 1) ; + n = 0; + for (level = subband->maxTTLevel; level >= 0; --level) { + nx = jpxCeilDivPow2(subband->nXCBs, level); + ny = jpxCeilDivPow2(subband->nYCBs, level); + n += nx * ny; + } + subband->inclusion = + (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode)); + subband->zeroBitPlane = + (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode)); + for (k = 0; k < n; ++k) { + subband->inclusion[k].finished = gFalse; + subband->inclusion[k].val = 0; + subband->zeroBitPlane[k].finished = gFalse; + subband->zeroBitPlane[k].val = 0; + } + subband->cbs = (JPXCodeBlock *)gmallocn(subband->nXCBs * + subband->nYCBs, + sizeof(JPXCodeBlock)); + sbx0 = jpxFloorDivPow2(subband->x0, tileComp->codeBlockW); + sby0 = jpxFloorDivPow2(subband->y0, tileComp->codeBlockH); + if (r == 0) { // (NL)LL + sbCoeffs = tileComp->data; + } else if (sb == 0) { // (NL-r+1)HL + sbCoeffs = tileComp->data + + resLevel->bx1[1] - resLevel->bx0[1]; + } else if (sb == 1) { // (NL-r+1)LH + sbCoeffs = tileComp->data + + (resLevel->by1[0] - resLevel->by0[0]) * tileComp->w; + } else { // (NL-r+1)HH + sbCoeffs = tileComp->data + + (resLevel->by1[0] - resLevel->by0[0]) * tileComp->w + + resLevel->bx1[1] - resLevel->bx0[1]; + } + cb = subband->cbs; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb->x0 = (sbx0 + cbX) << tileComp->codeBlockW; + cb->x1 = cb->x0 + tileComp->cbW; + if (subband->x0 > cb->x0) { + cb->x0 = subband->x0; + } + if (subband->x1 < cb->x1) { + cb->x1 = subband->x1; + } + cb->y0 = (sby0 + cbY) << tileComp->codeBlockH; + cb->y1 = cb->y0 + tileComp->cbH; + if (subband->y0 > cb->y0) { + cb->y0 = subband->y0; + } + if (subband->y1 < cb->y1) { + cb->y1 = subband->y1; + } + cb->seen = gFalse; + cb->lBlock = 3; + cb->nextPass = jpxPassCleanup; + cb->nZeroBitPlanes = 0; + cb->dataLenSize = 1; + cb->dataLen = (Guint *)gmalloc(sizeof(Guint)); + cb->coeffs = sbCoeffs + + (cb->y0 - subband->y0) * tileComp->w + + (cb->x0 - subband->x0); + cb->touched = (char *)gmalloc(1 << (tileComp->codeBlockW + + tileComp->codeBlockH)); + cb->len = 0; + for (cbj = 0; cbj < cb->y1 - cb->y0; ++cbj) { + for (cbi = 0; cbi < cb->x1 - cb->x0; ++cbi) { + cb->coeffs[cbj * tileComp->w + cbi] = 0; + } + } + memset(cb->touched, 0, + (1 << (tileComp->codeBlockW + tileComp->codeBlockH))); + cb->arithDecoder = NULL; + cb->stats = NULL; + ++cb; + } + } + } + } + } + } + } + + return readTilePartData(tileIdx, tilePartLen, tilePartToEOC); +} + +GBool JPXStream::readTilePartData(Guint tileIdx, + Guint tilePartLen, GBool tilePartToEOC) { + JPXTile *tile; + JPXTileComp *tileComp; + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + Guint ttVal; + Guint bits, cbX, cbY, nx, ny, i, j, n, sb; + int level; + + tile = &img.tiles[tileIdx]; + + // read all packets from this tile-part + while (1) { + if (tilePartToEOC) { + //~ peek for an EOC marker + cover(93); + } else if (tilePartLen == 0) { + break; + } + + tileComp = &tile->tileComps[tile->comp]; + resLevel = &tileComp->resLevels[tile->res]; + precinct = &resLevel->precincts[tile->precinct]; + + //----- packet header + + // setup + startBitBuf(tilePartLen); + if (tileComp->style & 0x02) { + skipSOP(); + } + + // zero-length flag + if (!readBits(1, &bits)) { + goto err; + } + if (!bits) { + // packet is empty -- clear all code-block inclusion flags + cover(45); + for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb = &subband->cbs[cbY * subband->nXCBs + cbX]; + cb->included = gFalse; + } + } + } + } else { + + for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb = &subband->cbs[cbY * subband->nXCBs + cbX]; + + // skip code-blocks with no coefficients + if (cb->x0 >= cb->x1 || cb->y0 >= cb->y1) { + cover(46); + cb->included = gFalse; + continue; + } + + // code-block inclusion + if (cb->seen) { + cover(47); + if (!readBits(1, &cb->included)) { + goto err; + } + } else { + cover(48); + ttVal = 0; + i = 0; + for (level = subband->maxTTLevel; level >= 0; --level) { + nx = jpxCeilDivPow2(subband->nXCBs, level); + ny = jpxCeilDivPow2(subband->nYCBs, level); + j = i + (cbY >> level) * nx + (cbX >> level); + if (!subband->inclusion[j].finished && + !subband->inclusion[j].val) { + subband->inclusion[j].val = ttVal; + } else { + ttVal = subband->inclusion[j].val; + } + while (!subband->inclusion[j].finished && + ttVal <= tile->layer) { + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 1) { + subband->inclusion[j].finished = gTrue; + } else { + ++ttVal; + } + } + subband->inclusion[j].val = ttVal; + if (ttVal > tile->layer) { + break; + } + i += nx * ny; + } + cb->included = level < 0; + } + + if (cb->included) { + cover(49); + + // zero bit-plane count + if (!cb->seen) { + cover(50); + ttVal = 0; + i = 0; + for (level = subband->maxTTLevel; level >= 0; --level) { + nx = jpxCeilDivPow2(subband->nXCBs, level); + ny = jpxCeilDivPow2(subband->nYCBs, level); + j = i + (cbY >> level) * nx + (cbX >> level); + if (!subband->zeroBitPlane[j].finished && + !subband->zeroBitPlane[j].val) { + subband->zeroBitPlane[j].val = ttVal; + } else { + ttVal = subband->zeroBitPlane[j].val; + } + while (!subband->zeroBitPlane[j].finished) { + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 1) { + subband->zeroBitPlane[j].finished = gTrue; + } else { + ++ttVal; + } + } + subband->zeroBitPlane[j].val = ttVal; + i += nx * ny; + } + cb->nZeroBitPlanes = ttVal; + } + + // number of coding passes + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 0) { + cover(51); + cb->nCodingPasses = 1; + } else { + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 0) { + cover(52); + cb->nCodingPasses = 2; + } else { + cover(53); + if (!readBits(2, &bits)) { + goto err; + } + if (bits < 3) { + cover(54); + cb->nCodingPasses = 3 + bits; + } else { + cover(55); + if (!readBits(5, &bits)) { + goto err; + } + if (bits < 31) { + cover(56); + cb->nCodingPasses = 6 + bits; + } else { + cover(57); + if (!readBits(7, &bits)) { + goto err; + } + cb->nCodingPasses = 37 + bits; + } + } + } + } + + // update Lblock + while (1) { + if (!readBits(1, &bits)) { + goto err; + } + if (!bits) { + break; + } + ++cb->lBlock; + } + + // one codeword segment for each of the coding passes + if (tileComp->codeBlockStyle & 0x04) { + if (cb->nCodingPasses > cb->dataLenSize) { + cb->dataLenSize = cb->nCodingPasses; + cb->dataLen = (Guint *)greallocn(cb->dataLen, + cb->dataLenSize, + sizeof(Guint)); + } + + // read the lengths + for (i = 0; i < cb->nCodingPasses; ++i) { + if (!readBits(cb->lBlock, &cb->dataLen[i])) { + goto err; + } + } + + // one codeword segment for all of the coding passes + } else { + + // read the length + for (n = cb->lBlock, i = cb->nCodingPasses >> 1; + i; + ++n, i >>= 1) ; + if (!readBits(n, &cb->dataLen[0])) { + goto err; + } + } + } + } + } + } + } + if (tileComp->style & 0x04) { + skipEPH(); + } + tilePartLen = finishBitBuf(); + + //----- packet data + + for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb = &subband->cbs[cbY * subband->nXCBs + cbX]; + if (cb->included) { + if (!readCodeBlockData(tileComp, resLevel, precinct, subband, + tile->res, sb, cb)) { + return gFalse; + } + if (tileComp->codeBlockStyle & 0x04) { + for (i = 0; i < cb->nCodingPasses; ++i) { + tilePartLen -= cb->dataLen[i]; + } + } else { + tilePartLen -= cb->dataLen[0]; + } + cb->seen = gTrue; + } + } + } + } + + //----- next packet + + switch (tile->progOrder) { + case 0: // layer, resolution level, component, precinct + cover(58); + if (++tile->comp == img.nComps) { + tile->comp = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + } + } + } + break; + case 1: // resolution level, layer, component, precinct + cover(59); + if (++tile->comp == img.nComps) { + tile->comp = 0; + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + } + } + } + break; + case 2: // resolution level, precinct, component, layer + //~ this isn't correct -- see B.12.1.3 + cover(60); + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->comp == img.nComps) { + tile->comp = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + } + } + } + break; + case 3: // precinct, component, resolution level, layer + //~ this isn't correct -- see B.12.1.4 + cover(61); + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + if (++tile->comp == img.nComps) { + tile->comp = 0; + } + } + } + break; + case 4: // component, precinct, resolution level, layer + //~ this isn't correct -- see B.12.1.5 + cover(62); + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + if (++tile->comp == img.nComps) { + tile->comp = 0; + } + } + } + break; + } + } + + return gTrue; + + err: + error(errSyntaxError, getPos(), "Error in JPX stream"); + return gFalse; +} + +GBool JPXStream::readCodeBlockData(JPXTileComp *tileComp, + JPXResLevel *resLevel, + JPXPrecinct *precinct, + JPXSubband *subband, + Guint res, Guint sb, + JPXCodeBlock *cb) { + int *coeff0, *coeff1, *coeff; + char *touched0, *touched1, *touched; + Guint horiz, vert, diag, all, cx, xorBit; + int horizSign, vertSign, bit; + int segSym; + Guint i, x, y0, y1; + + if (cb->arithDecoder) { + cover(63); + cb->arithDecoder->restart(cb->dataLen[0]); + } else { + cover(64); + cb->arithDecoder = new JArithmeticDecoder(); + cb->arithDecoder->setStream(bufStr, cb->dataLen[0]); + cb->arithDecoder->start(); + cb->stats = new JArithmeticDecoderStats(jpxNContexts); + cb->stats->setEntry(jpxContextSigProp, 4, 0); + cb->stats->setEntry(jpxContextRunLength, 3, 0); + cb->stats->setEntry(jpxContextUniform, 46, 0); + } + + for (i = 0; i < cb->nCodingPasses; ++i) { + if ((tileComp->codeBlockStyle & 0x04) && i > 0) { + cb->arithDecoder->setStream(bufStr, cb->dataLen[i]); + cb->arithDecoder->start(); + } + + switch (cb->nextPass) { + + //----- significance propagation pass + case jpxPassSigProp: + cover(65); + for (y0 = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched; + y0 < cb->y1; + y0 += 4, coeff0 += 4 * tileComp->w, + touched0 += 4 << tileComp->codeBlockW) { + for (x = cb->x0, coeff1 = coeff0, touched1 = touched0; + x < cb->x1; + ++x, ++coeff1, ++touched1) { + for (y1 = 0, coeff = coeff1, touched = touched1; + y1 < 4 && y0+y1 < cb->y1; + ++y1, coeff += tileComp->w, touched += tileComp->cbW) { + if (!*coeff) { + horiz = vert = diag = 0; + horizSign = vertSign = 2; + if (x > cb->x0) { + if (coeff[-1]) { + ++horiz; + horizSign += coeff[-1] < 0 ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += coeff[-(int)tileComp->w - 1] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + diag += coeff[tileComp->w - 1] ? 1 : 0; + } + } + if (x < cb->x1 - 1) { + if (coeff[1]) { + ++horiz; + horizSign += coeff[1] < 0 ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += coeff[-(int)tileComp->w + 1] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + diag += coeff[tileComp->w + 1] ? 1 : 0; + } + } + if (y0+y1 > cb->y0) { + if (coeff[-(int)tileComp->w]) { + ++vert; + vertSign += coeff[-(int)tileComp->w] < 0 ? -1 : 1; + } + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + if (coeff[tileComp->w]) { + ++vert; + vertSign += coeff[tileComp->w] < 0 ? -1 : 1; + } + } + cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb]; + if (cx != 0) { + if (cb->arithDecoder->decodeBit(cx, cb->stats)) { + cx = signContext[horizSign][vertSign][0]; + xorBit = signContext[horizSign][vertSign][1]; + if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { + *coeff = -1; + } else { + *coeff = 1; + } + } + *touched = 1; + } + } + } + } + } + ++cb->nextPass; + break; + + //----- magnitude refinement pass + case jpxPassMagRef: + cover(66); + for (y0 = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched; + y0 < cb->y1; + y0 += 4, coeff0 += 4 * tileComp->w, + touched0 += 4 << tileComp->codeBlockW) { + for (x = cb->x0, coeff1 = coeff0, touched1 = touched0; + x < cb->x1; + ++x, ++coeff1, ++touched1) { + for (y1 = 0, coeff = coeff1, touched = touched1; + y1 < 4 && y0+y1 < cb->y1; + ++y1, coeff += tileComp->w, touched += tileComp->cbW) { + if (*coeff && !*touched) { + if (*coeff == 1 || *coeff == -1) { + all = 0; + if (x > cb->x0) { + all += coeff[-1] ? 1 : 0; + if (y0+y1 > cb->y0) { + all += coeff[-(int)tileComp->w - 1] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + all += coeff[tileComp->w - 1] ? 1 : 0; + } + } + if (x < cb->x1 - 1) { + all += coeff[1] ? 1 : 0; + if (y0+y1 > cb->y0) { + all += coeff[-(int)tileComp->w + 1] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + all += coeff[tileComp->w + 1] ? 1 : 0; + } + } + if (y0+y1 > cb->y0) { + all += coeff[-(int)tileComp->w] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + all += coeff[tileComp->w] ? 1 : 0; + } + cx = all ? 15 : 14; + } else { + cx = 16; + } + bit = cb->arithDecoder->decodeBit(cx, cb->stats); + if (*coeff < 0) { + *coeff = (*coeff << 1) - bit; + } else { + *coeff = (*coeff << 1) + bit; + } + *touched = 1; + } + } + } + } + ++cb->nextPass; + break; + + //----- cleanup pass + case jpxPassCleanup: + cover(67); + for (y0 = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched; + y0 < cb->y1; + y0 += 4, coeff0 += 4 * tileComp->w, + touched0 += 4 << tileComp->codeBlockW) { + for (x = cb->x0, coeff1 = coeff0, touched1 = touched0; + x < cb->x1; + ++x, ++coeff1, ++touched1) { + y1 = 0; + if (y0 + 3 < cb->y1 && + !(*touched1) && + !(touched1[tileComp->cbW]) && + !(touched1[2 * tileComp->cbW]) && + !(touched1[3 * tileComp->cbW]) && + (x == cb->x0 || y0 == cb->y0 || + !coeff1[-(int)tileComp->w - 1]) && + (y0 == cb->y0 || + !coeff1[-(int)tileComp->w]) && + (x == cb->x1 - 1 || y0 == cb->y0 || + !coeff1[-(int)tileComp->w + 1]) && + (x == cb->x0 || + (!coeff1[-1] && + !coeff1[tileComp->w - 1] && + !coeff1[2 * tileComp->w - 1] && + !coeff1[3 * tileComp->w - 1])) && + (x == cb->x1 - 1 || + (!coeff1[1] && + !coeff1[tileComp->w + 1] && + !coeff1[2 * tileComp->w + 1] && + !coeff1[3 * tileComp->w + 1])) && + ((tileComp->codeBlockStyle & 0x08) || + ((x == cb->x0 || y0+4 == cb->y1 || + !coeff1[4 * tileComp->w - 1]) && + (y0+4 == cb->y1 || + !coeff1[4 * tileComp->w]) && + (x == cb->x1 - 1 || y0+4 == cb->y1 || + !coeff1[4 * tileComp->w + 1])))) { + if (cb->arithDecoder->decodeBit(jpxContextRunLength, cb->stats)) { + y1 = cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats); + y1 = (y1 << 1) | + cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats); + coeff = &coeff1[y1 * tileComp->w]; + cx = signContext[2][2][0]; + xorBit = signContext[2][2][1]; + if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { + *coeff = -1; + } else { + *coeff = 1; + } + ++y1; + } else { + y1 = 4; + } + } + for (coeff = &coeff1[y1 * tileComp->w], + touched = &touched1[y1 << tileComp->codeBlockW]; + y1 < 4 && y0 + y1 < cb->y1; + ++y1, coeff += tileComp->w, touched += tileComp->cbW) { + if (!*touched) { + horiz = vert = diag = 0; + horizSign = vertSign = 2; + if (x > cb->x0) { + if (coeff[-1]) { + ++horiz; + horizSign += coeff[-1] < 0 ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += coeff[-(int)tileComp->w - 1] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + diag += coeff[tileComp->w - 1] ? 1 : 0; + } + } + if (x < cb->x1 - 1) { + if (coeff[1]) { + ++horiz; + horizSign += coeff[1] < 0 ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += coeff[-(int)tileComp->w + 1] ? 1 : 0; + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + diag += coeff[tileComp->w + 1] ? 1 : 0; + } + } + if (y0+y1 > cb->y0) { + if (coeff[-(int)tileComp->w]) { + ++vert; + vertSign += coeff[-(int)tileComp->w] < 0 ? -1 : 1; + } + } + if (y0+y1 < cb->y1 - 1 && + (!(tileComp->codeBlockStyle & 0x08) || y1 < 3)) { + if (coeff[tileComp->w]) { + ++vert; + vertSign += coeff[tileComp->w] < 0 ? -1 : 1; + } + } + cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb]; + if (cb->arithDecoder->decodeBit(cx, cb->stats)) { + cx = signContext[horizSign][vertSign][0]; + xorBit = signContext[horizSign][vertSign][1]; + if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { + *coeff = -1; + } else { + *coeff = 1; + } + } + } else { + *touched = 0; + } + } + } + } + ++cb->len; + // look for a segmentation symbol + if (tileComp->codeBlockStyle & 0x20) { + segSym = cb->arithDecoder->decodeBit(jpxContextUniform, + cb->stats) << 3; + segSym |= cb->arithDecoder->decodeBit(jpxContextUniform, + cb->stats) << 2; + segSym |= cb->arithDecoder->decodeBit(jpxContextUniform, + cb->stats) << 1; + segSym |= cb->arithDecoder->decodeBit(jpxContextUniform, + cb->stats); + if (segSym != 0x0a) { + // in theory this should be a fatal error, but it seems to + // be problematic + error(errSyntaxWarning, getPos(), + "Missing or invalid segmentation symbol in JPX stream"); + } + } + cb->nextPass = jpxPassSigProp; + break; + } + + if (tileComp->codeBlockStyle & 0x02) { + cb->stats->reset(); + cb->stats->setEntry(jpxContextSigProp, 4, 0); + cb->stats->setEntry(jpxContextRunLength, 3, 0); + cb->stats->setEntry(jpxContextUniform, 46, 0); + } + + if (tileComp->codeBlockStyle & 0x04) { + cb->arithDecoder->cleanup(); + } + } + + cb->arithDecoder->cleanup(); + return gTrue; +} + +// Inverse quantization, and wavelet transform (IDWT). This also does +// the initial shift to convert to fixed point format. +void JPXStream::inverseTransform(JPXTileComp *tileComp) { + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + int *coeff0, *coeff; + char *touched0, *touched; + Guint qStyle, guard, eps, shift; + int shift2; + double mu; + int val; + Guint r, cbX, cbY, x, y; + + cover(68); + + //----- (NL)LL subband (resolution level 0) + + resLevel = &tileComp->resLevels[0]; + precinct = &resLevel->precincts[0]; + subband = &precinct->subbands[0]; + + // i-quant parameters + qStyle = tileComp->quantStyle & 0x1f; + guard = (tileComp->quantStyle >> 5) & 7; + if (qStyle == 0) { + cover(69); + eps = (tileComp->quantSteps[0] >> 3) & 0x1f; + shift = guard + eps - 1; + mu = 0; // make gcc happy + } else { + cover(70); + shift = guard - 1 + tileComp->prec; + mu = (double)(0x800 + (tileComp->quantSteps[0] & 0x7ff)) / 2048.0; + } + if (tileComp->transform == 0) { + cover(71); + shift += fracBits; + } + + // do fixed point adjustment and dequantization on (NL)LL + cb = subband->cbs; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + for (y = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched; + y < cb->y1; + ++y, coeff0 += tileComp->w, touched0 += tileComp->cbW) { + for (x = cb->x0, coeff = coeff0, touched = touched0; + x < cb->x1; + ++x, ++coeff, ++touched) { + val = *coeff; + if (val != 0) { + shift2 = shift - (cb->nZeroBitPlanes + cb->len + *touched); + if (shift2 > 0) { + cover(94); + if (val < 0) { + val = (val << shift2) - (1 << (shift2 - 1)); + } else { + val = (val << shift2) + (1 << (shift2 - 1)); + } + } else { + cover(95); + val >>= -shift2; + } + if (qStyle == 0) { + cover(96); + if (tileComp->transform == 0) { + cover(97); + val &= -1 << fracBits; + } + } else { + cover(98); + val = (int)((double)val * mu); + } + } + *coeff = val; + } + } + ++cb; + } + } + + //----- IDWT for each level + + for (r = 1; r <= tileComp->nDecompLevels; ++r) { + resLevel = &tileComp->resLevels[r]; + + // (n)LL is already in the upper-left corner of the + // tile-component data array -- interleave with (n)HL/LH/HH + // and inverse transform to get (n-1)LL, which will be stored + // in the upper-left corner of the tile-component data array + inverseTransformLevel(tileComp, r, resLevel); + } +} + +// Do one level of the inverse transform: +// - take (n)LL, (n)HL, (n)LH, and (n)HH from the upper-left corner +// of the tile-component data array +// - leave the resulting (n-1)LL in the same place +void JPXStream::inverseTransformLevel(JPXTileComp *tileComp, + Guint r, JPXResLevel *resLevel) { + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + int *coeff0, *coeff; + char *touched0, *touched; + Guint qStyle, guard, eps, shift, t; + int shift2; + double mu; + int val; + int *dataPtr, *bufPtr; + Guint nx1, nx2, ny1, ny2, offset; + Guint x, y, sb, cbX, cbY; + + //----- fixed-point adjustment and dequantization + + qStyle = tileComp->quantStyle & 0x1f; + guard = (tileComp->quantStyle >> 5) & 7; + precinct = &resLevel->precincts[0]; + for (sb = 0; sb < 3; ++sb) { + + // i-quant parameters + if (qStyle == 0) { + cover(100); + eps = (tileComp->quantSteps[3*r - 2 + sb] >> 3) & 0x1f; + shift = guard + eps - 1; + mu = 0; // make gcc happy + } else { + cover(101); + shift = guard + tileComp->prec; + if (sb == 2) { + cover(102); + ++shift; + } + const Guint stepIndex = qStyle == 1 ? 0 : (3*r - 2 + sb); + if (unlikely(stepIndex >= tileComp->nQuantSteps)) { + error(errSyntaxError, getPos(), + "Wrong index for quantSteps in inverseTransformLevel in JPX stream"); + break; + } + t = tileComp->quantSteps[stepIndex]; + mu = (double)(0x800 + (t & 0x7ff)) / 2048.0; + } + if (tileComp->transform == 0) { + cover(103); + shift += fracBits; + } + + // fixed point adjustment and dequantization + subband = &precinct->subbands[sb]; + cb = subband->cbs; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + for (y = cb->y0, coeff0 = cb->coeffs, touched0 = cb->touched; + y < cb->y1; + ++y, coeff0 += tileComp->w, touched0 += tileComp->cbW) { + for (x = cb->x0, coeff = coeff0, touched = touched0; + x < cb->x1; + ++x, ++coeff, ++touched) { + val = *coeff; + if (val != 0) { + shift2 = shift - (cb->nZeroBitPlanes + cb->len + *touched); + if (shift2 > 0) { + cover(74); + if (val < 0) { + val = (val << shift2) - (1 << (shift2 - 1)); + } else { + val = (val << shift2) + (1 << (shift2 - 1)); + } + } else { + cover(75); + val >>= -shift2; + } + if (qStyle == 0) { + cover(76); + if (tileComp->transform == 0) { + val &= -1 << fracBits; + } + } else { + cover(77); + val = (int)((double)val * mu); + } + } + *coeff = val; + } + } + ++cb; + } + } + } + + //----- inverse transform + + // compute the subband bounds: + // 0 nx1 nx2 + // | | | + // v v v + // +----+----+ + // | LL | HL | <- 0 + // +----+----+ + // | LH | HH | <- ny1 + // +----+----+ + // <- ny2 + nx1 = precinct->subbands[1].x1 - precinct->subbands[1].x0; + nx2 = nx1 + precinct->subbands[0].x1 - precinct->subbands[0].x0; + ny1 = precinct->subbands[0].y1 - precinct->subbands[0].y0; + ny2 = ny1 + precinct->subbands[1].y1 - precinct->subbands[1].y0; + + // horizontal (row) transforms + if (r == tileComp->nDecompLevels) { + offset = 3 + (tileComp->x0 & 1); + } else { + offset = 3 + (tileComp->resLevels[r+1].x0 & 1); + } + for (y = 0, dataPtr = tileComp->data; y < ny2; ++y, dataPtr += tileComp->w) { + if (precinct->subbands[0].x0 == precinct->subbands[1].x0) { + // fetch LL/LH + for (x = 0, bufPtr = tileComp->buf + offset; + x < nx1; + ++x, bufPtr += 2) { + *bufPtr = dataPtr[x]; + } + // fetch HL/HH + for (x = nx1, bufPtr = tileComp->buf + offset + 1; + x < nx2; + ++x, bufPtr += 2) { + *bufPtr = dataPtr[x]; + } + } else { + // fetch LL/LH + for (x = 0, bufPtr = tileComp->buf + offset + 1; + x < nx1; + ++x, bufPtr += 2) { + *bufPtr = dataPtr[x]; + } + // fetch HL/HH + for (x = nx1, bufPtr = tileComp->buf + offset; + x < nx2; + ++x, bufPtr += 2) { + *bufPtr = dataPtr[x]; + } + } + inverseTransform1D(tileComp, tileComp->buf, offset, nx2); + for (x = 0, bufPtr = tileComp->buf + offset; x < nx2; ++x, ++bufPtr) { + dataPtr[x] = *bufPtr; + } + } + + // vertical (column) transforms + if (r == tileComp->nDecompLevels) { + offset = 3 + (tileComp->y0 & 1); + } else { + offset = 3 + (tileComp->resLevels[r+1].y0 & 1); + } + for (x = 0, dataPtr = tileComp->data; x < nx2; ++x, ++dataPtr) { + if (precinct->subbands[1].y0 == precinct->subbands[0].y0) { + // fetch LL/HL + for (y = 0, bufPtr = tileComp->buf + offset; + y < ny1; + ++y, bufPtr += 2) { + *bufPtr = dataPtr[y * tileComp->w]; + } + // fetch LH/HH + for (y = ny1, bufPtr = tileComp->buf + offset + 1; + y < ny2; + ++y, bufPtr += 2) { + *bufPtr = dataPtr[y * tileComp->w]; + } + } else { + // fetch LL/HL + for (y = 0, bufPtr = tileComp->buf + offset + 1; + y < ny1; + ++y, bufPtr += 2) { + *bufPtr = dataPtr[y * tileComp->w]; + } + // fetch LH/HH + for (y = ny1, bufPtr = tileComp->buf + offset; + y < ny2; + ++y, bufPtr += 2) { + *bufPtr = dataPtr[y * tileComp->w]; + } + } + inverseTransform1D(tileComp, tileComp->buf, offset, ny2); + for (y = 0, bufPtr = tileComp->buf + offset; y < ny2; ++y, ++bufPtr) { + dataPtr[y * tileComp->w] = *bufPtr; + } + } +} + +void JPXStream::inverseTransform1D(JPXTileComp *tileComp, int *data, + Guint offset, Guint n) { + Guint end, i; + + //----- special case for length = 1 + if (n == 1) { + cover(79); + if (offset == 4) { + cover(104); + *data >>= 1; + } + + } else { + cover(80); + + end = offset + n; + + //----- extend right + data[end] = data[end - 2]; + if (n == 2) { + cover(81); + data[end+1] = data[offset + 1]; + data[end+2] = data[offset]; + data[end+3] = data[offset + 1]; + } else { + cover(82); + data[end+1] = data[end - 3]; + if (n == 3) { + cover(105); + data[end+2] = data[offset + 1]; + data[end+3] = data[offset + 2]; + } else { + cover(106); + data[end+2] = data[end - 4]; + if (n == 4) { + cover(107); + data[end+3] = data[offset + 1]; + } else { + cover(108); + data[end+3] = data[end - 5]; + } + } + } + + //----- extend left + data[offset - 1] = data[offset + 1]; + data[offset - 2] = data[offset + 2]; + data[offset - 3] = data[offset + 3]; + if (offset == 4) { + cover(83); + data[0] = data[offset + 4]; + } + + //----- 9-7 irreversible filter + + if (tileComp->transform == 0) { + cover(84); + // step 1 (even) + for (i = 1; i <= end + 2; i += 2) { + data[i] = (int)(idwtKappa * data[i]); + } + // step 2 (odd) + for (i = 0; i <= end + 3; i += 2) { + data[i] = (int)(idwtIKappa * data[i]); + } + // step 3 (even) + for (i = 1; i <= end + 2; i += 2) { + data[i] = (int)(data[i] - idwtDelta * (data[i-1] + data[i+1])); + } + // step 4 (odd) + for (i = 2; i <= end + 1; i += 2) { + data[i] = (int)(data[i] - idwtGamma * (data[i-1] + data[i+1])); + } + // step 5 (even) + for (i = 3; i <= end; i += 2) { + data[i] = (int)(data[i] - idwtBeta * (data[i-1] + data[i+1])); + } + // step 6 (odd) + for (i = 4; i <= end - 1; i += 2) { + data[i] = (int)(data[i] - idwtAlpha * (data[i-1] + data[i+1])); + } + + //----- 5-3 reversible filter + + } else { + cover(85); + // step 1 (even) + for (i = 3; i <= end; i += 2) { + data[i] -= (data[i-1] + data[i+1] + 2) >> 2; + } + // step 2 (odd) + for (i = 4; i < end; i += 2) { + data[i] += (data[i-1] + data[i+1]) >> 1; + } + } + } +} + +// Inverse multi-component transform and DC level shift. This also +// converts fixed point samples back to integers. +GBool JPXStream::inverseMultiCompAndDC(JPXTile *tile) { + JPXTileComp *tileComp; + int coeff, d0, d1, d2, t, minVal, maxVal, zeroVal; + int *dataPtr; + Guint j, comp, x, y; + + //----- inverse multi-component transform + + if (tile->multiComp == 1) { + cover(86); + if (img.nComps < 3 || + tile->tileComps[0].hSep != tile->tileComps[1].hSep || + tile->tileComps[0].vSep != tile->tileComps[1].vSep || + tile->tileComps[1].hSep != tile->tileComps[2].hSep || + tile->tileComps[1].vSep != tile->tileComps[2].vSep) { + return gFalse; + } + + // inverse irreversible multiple component transform + if (tile->tileComps[0].transform == 0) { + cover(87); + j = 0; + for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) { + for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) { + d0 = tile->tileComps[0].data[j]; + d1 = tile->tileComps[1].data[j]; + d2 = tile->tileComps[2].data[j]; + tile->tileComps[0].data[j] = (int)(d0 + 1.402 * d2 + 0.5); + tile->tileComps[1].data[j] = + (int)(d0 - 0.34413 * d1 - 0.71414 * d2 + 0.5); + tile->tileComps[2].data[j] = (int)(d0 + 1.772 * d1 + 0.5); + ++j; + } + } + + // inverse reversible multiple component transform + } else { + cover(88); + j = 0; + for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) { + for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) { + d0 = tile->tileComps[0].data[j]; + d1 = tile->tileComps[1].data[j]; + d2 = tile->tileComps[2].data[j]; + tile->tileComps[1].data[j] = t = d0 - ((d2 + d1) >> 2); + tile->tileComps[0].data[j] = d2 + t; + tile->tileComps[2].data[j] = d1 + t; + ++j; + } + } + } + } + + //----- DC level shift + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + + // signed: clip + if (tileComp->sgned) { + cover(89); + minVal = -(1 << (tileComp->prec - 1)); + maxVal = (1 << (tileComp->prec - 1)) - 1; + dataPtr = tileComp->data; + for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) { + for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) { + coeff = *dataPtr; + if (tileComp->transform == 0) { + cover(109); + coeff >>= fracBits; + } + if (coeff < minVal) { + cover(110); + coeff = minVal; + } else if (coeff > maxVal) { + cover(111); + coeff = maxVal; + } + *dataPtr++ = coeff; + } + } + + // unsigned: inverse DC level shift and clip + } else { + cover(90); + maxVal = (1 << tileComp->prec) - 1; + zeroVal = 1 << (tileComp->prec - 1); + dataPtr = tileComp->data; + for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) { + for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) { + coeff = *dataPtr; + if (tileComp->transform == 0) { + cover(112); + coeff >>= fracBits; + } + coeff += zeroVal; + if (coeff < 0) { + cover(113); + coeff = 0; + } else if (coeff > maxVal) { + cover(114); + coeff = maxVal; + } + *dataPtr++ = coeff; + } + } + } + } + + return gTrue; +} + +GBool JPXStream::readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen) { + Guint len, lenH; + + if (!readULong(&len) || + !readULong(boxType)) { + return gFalse; + } + if (len == 1) { + if (!readULong(&lenH) || !readULong(&len)) { + return gFalse; + } + if (lenH) { + error(errSyntaxError, getPos(), + "JPX stream contains a box larger than 2^32 bytes"); + return gFalse; + } + *boxLen = len; + *dataLen = len - 16; + } else if (len == 0) { + *boxLen = 0; + *dataLen = 0; + } else { + *boxLen = len; + *dataLen = len - 8; + } + return gTrue; +} + +int JPXStream::readMarkerHdr(int *segType, Guint *segLen) { + int c; + + do { + do { + if ((c = bufStr->getChar()) == EOF) { + return gFalse; + } + } while (c != 0xff); + do { + if ((c = bufStr->getChar()) == EOF) { + return gFalse; + } + } while (c == 0xff); + } while (c == 0x00); + *segType = c; + if ((c >= 0x30 && c <= 0x3f) || + c == 0x4f || c == 0x92 || c == 0x93 || c == 0xd9) { + *segLen = 0; + return gTrue; + } + return readUWord(segLen); +} + +GBool JPXStream::readUByte(Guint *x) { + int c0; + + if ((c0 = bufStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)c0; + return gTrue; +} + +GBool JPXStream::readByte(int *x) { + int c0; + + if ((c0 = bufStr->getChar()) == EOF) { + return gFalse; + } + *x = c0; + if (c0 & 0x80) { + *x |= -1 - 0xff; + } + return gTrue; +} + +GBool JPXStream::readUWord(Guint *x) { + int c0, c1; + + if ((c0 = bufStr->getChar()) == EOF || + (c1 = bufStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 8) | c1); + return gTrue; +} + +GBool JPXStream::readULong(Guint *x) { + int c0, c1, c2, c3; + + if ((c0 = bufStr->getChar()) == EOF || + (c1 = bufStr->getChar()) == EOF || + (c2 = bufStr->getChar()) == EOF || + (c3 = bufStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); + return gTrue; +} + +GBool JPXStream::readNBytes(int nBytes, GBool signd, int *x) { + int y, c, i; + + y = 0; + for (i = 0; i < nBytes; ++i) { + if ((c = bufStr->getChar()) == EOF) { + return gFalse; + } + y = (y << 8) + c; + } + if (signd) { + if (y & (1 << (8 * nBytes - 1))) { + y |= -1 << (8 * nBytes); + } + } + *x = y; + return gTrue; +} + +void JPXStream::startBitBuf(Guint byteCountA) { + bitBufLen = 0; + bitBufSkip = gFalse; + byteCount = byteCountA; +} + +GBool JPXStream::readBits(int nBits, Guint *x) { + int c; + + while (bitBufLen < nBits) { + if (byteCount == 0 || (c = bufStr->getChar()) == EOF) { + return gFalse; + } + --byteCount; + if (bitBufSkip) { + bitBuf = (bitBuf << 7) | (c & 0x7f); + bitBufLen += 7; + } else { + bitBuf = (bitBuf << 8) | (c & 0xff); + bitBufLen += 8; + } + bitBufSkip = c == 0xff; + } + *x = (bitBuf >> (bitBufLen - nBits)) & ((1 << nBits) - 1); + bitBufLen -= nBits; + return gTrue; +} + +void JPXStream::skipSOP() { + int i; + + // SOP occurs at the start of the packet header, so we don't need to + // worry about bit-stuff prior to it + if (byteCount >= 6 && + bufStr->lookChar(0) == 0xff && + bufStr->lookChar(1) == 0x91) { + for (i = 0; i < 6; ++i) { + bufStr->getChar(); + } + byteCount -= 6; + bitBufLen = 0; + bitBufSkip = gFalse; + } +} + +void JPXStream::skipEPH() { + int i, k; + + k = bitBufSkip ? 1 : 0; + if (byteCount >= (Guint)(k + 2) && + bufStr->lookChar(k) == 0xff && + bufStr->lookChar(k + 1) == 0x92) { + for (i = 0; i < k + 2; ++i) { + bufStr->getChar(); + } + byteCount -= k + 2; + bitBufLen = 0; + bitBufSkip = gFalse; + } +} + +Guint JPXStream::finishBitBuf() { + if (bitBufSkip) { + bufStr->getChar(); + --byteCount; + } + return byteCount; +} diff --git a/poppler/JPXStream.h b/poppler/JPXStream.h new file mode 100644 index 0000000..3085543 --- /dev/null +++ b/poppler/JPXStream.h @@ -0,0 +1,338 @@ +//======================================================================== +// +// JPXStream.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef JPXSTREAM_H +#define JPXSTREAM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" +#include "Stream.h" + +class JArithmeticDecoder; +class JArithmeticDecoderStats; + +//------------------------------------------------------------------------ + +enum JPXColorSpaceType { + jpxCSBiLevel = 0, + jpxCSYCbCr1 = 1, + jpxCSYCbCr2 = 3, + jpxCSYCBCr3 = 4, + jpxCSPhotoYCC = 9, + jpxCSCMY = 11, + jpxCSCMYK = 12, + jpxCSYCCK = 13, + jpxCSCIELab = 14, + jpxCSsRGB = 16, + jpxCSGrayscale = 17, + jpxCSBiLevel2 = 18, + jpxCSCIEJab = 19, + jpxCSCISesRGB = 20, + jpxCSROMMRGB = 21, + jpxCSsRGBYCbCr = 22, + jpxCSYPbPr1125 = 23, + jpxCSYPbPr1250 = 24 +}; + +struct JPXColorSpecCIELab { + Guint rl, ol, ra, oa, rb, ob, il; +}; + +struct JPXColorSpecEnumerated { + JPXColorSpaceType type; // color space type + union { + JPXColorSpecCIELab cieLab; + }; +}; + +struct JPXColorSpec { + Guint meth; // method + int prec; // precedence + union { + JPXColorSpecEnumerated enumerated; + }; +}; + +//------------------------------------------------------------------------ + +struct JPXPalette { + Guint nEntries; // number of entries in the palette + Guint nComps; // number of components in each entry + Guint *bpc; // bits per component, for each component + int *c; // color data: + // c[i*nComps+j] = entry i, component j +}; + +//------------------------------------------------------------------------ + +struct JPXCompMap { + Guint nChannels; // number of channels + Guint *comp; // codestream components mapped to each channel + Guint *type; // 0 for direct use, 1 for palette mapping + Guint *pComp; // palette components to use +}; + +//------------------------------------------------------------------------ + +struct JPXChannelDefn { + Guint nChannels; // number of channels + Guint *idx; // channel indexes + Guint *type; // channel types + Guint *assoc; // channel associations +}; + +//------------------------------------------------------------------------ + +struct JPXTagTreeNode { + GBool finished; // true if this node is finished + Guint val; // current value +}; + +//------------------------------------------------------------------------ + +struct JPXCodeBlock { + //----- size + Guint x0, y0, x1, y1; // bounds + + //----- persistent state + GBool seen; // true if this code-block has already + // been seen + Guint lBlock; // base number of bits used for pkt data length + Guint nextPass; // next coding pass + + //---- info from first packet + Guint nZeroBitPlanes; // number of zero bit planes + + //----- info for the current packet + Guint included; // code-block inclusion in this packet: + // 0=not included, 1=included + Guint nCodingPasses; // number of coding passes in this pkt + Guint *dataLen; // data lengths (one per codeword segment) + Guint dataLenSize; // size of the dataLen array + + //----- coefficient data + int *coeffs; + char *touched; // coefficient 'touched' flags + Gushort len; // coefficient length + JArithmeticDecoder // arithmetic decoder + *arithDecoder; + JArithmeticDecoderStats // arithmetic decoder stats + *stats; +}; + +//------------------------------------------------------------------------ + +struct JPXSubband { + //----- computed + Guint x0, y0, x1, y1; // bounds + Guint nXCBs, nYCBs; // number of code-blocks in the x and y + // directions + + //----- tag trees + Guint maxTTLevel; // max tag tree level + JPXTagTreeNode *inclusion; // inclusion tag tree for each subband + JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each + // subband + + //----- children + JPXCodeBlock *cbs; // the code-blocks (len = nXCBs * nYCBs) +}; + +//------------------------------------------------------------------------ + +struct JPXPrecinct { + //----- computed + Guint x0, y0, x1, y1; // bounds of the precinct + + //----- children + JPXSubband *subbands; // the subbands +}; + +//------------------------------------------------------------------------ + +struct JPXResLevel { + //----- from the COD and COC segments (main and tile) + Guint precinctWidth; // log2(precinct width) + Guint precinctHeight; // log2(precinct height) + + //----- computed + Guint x0, y0, x1, y1; // bounds of the tile-comp (for this res level) + Guint bx0[3], by0[3], // subband bounds + bx1[3], by1[3]; + + //---- children + JPXPrecinct *precincts; // the precincts +}; + +//------------------------------------------------------------------------ + +struct JPXTileComp { + //----- from the SIZ segment + GBool sgned; // 1 for signed, 0 for unsigned + Guint prec; // precision, in bits + Guint hSep; // horizontal separation of samples + Guint vSep; // vertical separation of samples + + //----- from the COD and COC segments (main and tile) + Guint style; // coding style parameter (Scod / Scoc) + Guint nDecompLevels; // number of decomposition levels + Guint codeBlockW; // log2(code-block width) + Guint codeBlockH; // log2(code-block height) + Guint codeBlockStyle; // code-block style + Guint transform; // wavelet transformation + + //----- from the QCD and QCC segments (main and tile) + Guint quantStyle; // quantization style + Guint *quantSteps; // quantization step size for each subband + Guint nQuantSteps; // number of entries in quantSteps + + //----- computed + Guint x0, y0, x1, y1; // bounds of the tile-comp, in ref coords + Guint w; // x1 - x0 + Guint cbW; // code-block width + Guint cbH; // code-block height + + //----- image data + int *data; // the decoded image data + int *buf; // intermediate buffer for the inverse + // transform + + //----- children + JPXResLevel *resLevels; // the resolution levels + // (len = nDecompLevels + 1) +}; + +//------------------------------------------------------------------------ + +struct JPXTile { + GBool init; + + //----- from the COD segments (main and tile) + Guint progOrder; // progression order + Guint nLayers; // number of layers + Guint multiComp; // multiple component transformation + + //----- computed + Guint x0, y0, x1, y1; // bounds of the tile, in ref coords + Guint maxNDecompLevels; // max number of decomposition levels used + // in any component in this tile + + //----- progression order loop counters + Guint comp; // component + Guint res; // resolution level + Guint precinct; // precinct + Guint layer; // layer + + //----- children + JPXTileComp *tileComps; // the tile-components (len = JPXImage.nComps) +}; + +//------------------------------------------------------------------------ + +struct JPXImage { + //----- from the SIZ segment + Guint xSize, ySize; // size of reference grid + Guint xOffset, yOffset; // image offset + Guint xTileSize, yTileSize; // size of tiles + Guint xTileOffset, // offset of first tile + yTileOffset; + Guint nComps; // number of components + + //----- computed + Guint nXTiles; // number of tiles in x direction + Guint nYTiles; // number of tiles in y direction + + //----- children + JPXTile *tiles; // the tiles (len = nXTiles * nYTiles) +}; + +//------------------------------------------------------------------------ + +class JPXStream: public FilterStream { +public: + + JPXStream(Stream *strA); + virtual ~JPXStream(); + virtual StreamKind getKind() { return strJPX; } + virtual void reset(); + virtual void close(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + virtual void getImageParams(int *bitsPerComponent, + StreamColorSpaceMode *csMode); + +private: + + void fillReadBuf(); + void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode); + GBool readBoxes(); + GBool readColorSpecBox(Guint dataLen); + GBool readCodestream(Guint len); + GBool readTilePart(); + GBool readTilePartData(Guint tileIdx, + Guint tilePartLen, GBool tilePartToEOC); + GBool readCodeBlockData(JPXTileComp *tileComp, + JPXResLevel *resLevel, + JPXPrecinct *precinct, + JPXSubband *subband, + Guint res, Guint sb, + JPXCodeBlock *cb); + void inverseTransform(JPXTileComp *tileComp); + void inverseTransformLevel(JPXTileComp *tileComp, + Guint r, JPXResLevel *resLevel); + void inverseTransform1D(JPXTileComp *tileComp, int *data, + Guint offset, Guint n); + GBool inverseMultiCompAndDC(JPXTile *tile); + GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen); + int readMarkerHdr(int *segType, Guint *segLen); + GBool readUByte(Guint *x); + GBool readByte(int *x); + GBool readUWord(Guint *x); + GBool readULong(Guint *x); + GBool readNBytes(int nBytes, GBool signd, int *x); + void startBitBuf(Guint byteCountA); + GBool readBits(int nBits, Guint *x); + void skipSOP(); + void skipEPH(); + Guint finishBitBuf(); + + BufStream *bufStr; // buffered stream (for lookahead) + + Guint nComps; // number of components + Guint *bpc; // bits per component, for each component + Guint width, height; // image size + GBool haveImgHdr; // set if a JP2/JPX image header has been + // found + JPXColorSpec cs; // color specification + GBool haveCS; // set if a color spec has been found + JPXPalette palette; // the palette + GBool havePalette; // set if a palette has been found + JPXCompMap compMap; // the component mapping + GBool haveCompMap; // set if a component mapping has been found + JPXChannelDefn channelDefn; // channel definition + GBool haveChannelDefn; // set if a channel defn has been found + + JPXImage img; // JPEG2000 decoder data + Guint bitBuf; // buffer for bit reads + int bitBufLen; // number of bits in bitBuf + GBool bitBufSkip; // true if next bit should be skipped + // (for bit stuffing) + Guint byteCount; // number of available bytes left + + Guint curX, curY, curComp; // current position for lookChar/getChar + Guint readBuf; // read buffer + Guint readBufLen; // number of valid bits in readBuf +}; + +#endif diff --git a/poppler/Lexer.cc b/poppler/Lexer.cc new file mode 100644 index 0000000..d12e2e8 --- /dev/null +++ b/poppler/Lexer.cc @@ -0,0 +1,598 @@ +//======================================================================== +// +// Lexer.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006-2010 Albert Astals Cid +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2010 Carlos Garcia Campos +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "Lexer.h" +#include "Error.h" +#include "XRef.h" + +//------------------------------------------------------------------------ + +// A '1' in this array means the character is white space. A '1' or +// '2' means the character ends a name or command. +static const char specialChars[256] = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx +}; + +static const int IntegerSafeLimit = (INT_MAX - 9) / 10; + +//------------------------------------------------------------------------ +// Lexer +//------------------------------------------------------------------------ + +Lexer::Lexer(XRef *xrefA, Stream *str) { + Object obj; + + lookCharLastValueCached = LOOK_VALUE_NOT_CACHED; + xref = xrefA; + + curStr.initStream(str); + streams = new Array(xref); + streams->add(curStr.copy(&obj)); + strPtr = 0; + freeArray = gTrue; + curStr.streamReset(); +} + +Lexer::Lexer(XRef *xrefA, Object *obj) { + Object obj2; + + lookCharLastValueCached = LOOK_VALUE_NOT_CACHED; + xref = xrefA; + + if (obj->isStream()) { + streams = new Array(xref); + freeArray = gTrue; + streams->add(obj->copy(&obj2)); + } else { + streams = obj->getArray(); + freeArray = gFalse; + } + strPtr = 0; + if (streams->getLength() > 0) { + streams->get(strPtr, &curStr); + curStr.streamReset(); + } +} + +Lexer::~Lexer() { + if (!curStr.isNone()) { + curStr.streamClose(); + curStr.free(); + } + if (freeArray) { + delete streams; + } +} + +int Lexer::getChar(GBool comesFromLook) { + int c; + + if (LOOK_VALUE_NOT_CACHED != lookCharLastValueCached) { + c = lookCharLastValueCached; + lookCharLastValueCached = LOOK_VALUE_NOT_CACHED; + return c; + } + + c = EOF; + while (!curStr.isNone() && (c = curStr.streamGetChar()) == EOF) { + if (comesFromLook == gTrue) { + return EOF; + } else { + curStr.streamClose(); + curStr.free(); + ++strPtr; + if (strPtr < streams->getLength()) { + streams->get(strPtr, &curStr); + curStr.streamReset(); + } + } + } + return c; +} + +int Lexer::lookChar() { + + if (LOOK_VALUE_NOT_CACHED != lookCharLastValueCached) { + return lookCharLastValueCached; + } + lookCharLastValueCached = getChar(gTrue); + if (lookCharLastValueCached == EOF) { + lookCharLastValueCached = LOOK_VALUE_NOT_CACHED; + return EOF; + } else { + return lookCharLastValueCached; + } +} + +Object *Lexer::getObj(Object *obj, int objNum) { + char *p; + int c, c2; + GBool comment, neg, done, overflownInteger, overflownUnsignedInteger; + int numParen; + int xi; + unsigned int xui = 0; + double xf = 0, scale; + GooString *s; + int n, m; + + // skip whitespace and comments + comment = gFalse; + while (1) { + if ((c = getChar()) == EOF) { + return obj->initEOF(); + } + if (comment) { + if (c == '\r' || c == '\n') + comment = gFalse; + } else if (c == '%') { + comment = gTrue; + } else if (specialChars[c] != 1) { + break; + } + } + + // start reading token + switch (c) { + + // number + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '+': case '-': case '.': + overflownInteger = gFalse; + overflownUnsignedInteger = gFalse; + neg = gFalse; + xi = 0; + if (c == '-') { + neg = gTrue; + } else if (c == '.') { + goto doReal; + } else if (c != '+') { + xi = c - '0'; + } + while (1) { + c = lookChar(); + if (isdigit(c)) { + getChar(); + if (unlikely(overflownInteger)) { + if (overflownUnsignedInteger) { + xf = xf * 10.0 + (c - '0'); + } else { + overflownUnsignedInteger = gTrue; + xf = xui * 10.0 + (c - '0'); + } + } else { + if (unlikely(xi > IntegerSafeLimit) && + (xi > (INT_MAX - (c - '0')) / 10.0)) { + overflownInteger = gTrue; + if (xi > (UINT_MAX - (c - '0')) / 10.0) { + overflownUnsignedInteger = gTrue; + xf = xi * 10.0 + (c - '0'); + } else { + xui = xi * 10.0 + (c - '0'); + } + } else { + xi = xi * 10 + (c - '0'); + } + } + } else if (c == '.') { + getChar(); + goto doReal; + } else { + break; + } + } + if (neg) { + xi = -xi; + xf = -xf; + } + if (unlikely(overflownInteger)) { + if (overflownUnsignedInteger) { + obj->initReal(xf); + } else { + obj->initUint(xui); + } + } else { + obj->initInt(xi); + } + break; + doReal: + if (likely(!overflownInteger)) { + xf = xi; + } else if (!overflownUnsignedInteger) { + xf = xui; + } + scale = 0.1; + while (1) { + c = lookChar(); + if (c == '-') { + // ignore minus signs in the middle of numbers to match + // Adobe's behavior + error(errSyntaxWarning, getPos(), "Badly formatted number"); + getChar(); + continue; + } + if (!isdigit(c)) { + break; + } + getChar(); + xf = xf + scale * (c - '0'); + scale *= 0.1; + } + if (neg) { + xf = -xf; + } + obj->initReal(xf); + break; + + // string + case '(': + p = tokBuf; + n = 0; + numParen = 1; + done = gFalse; + s = NULL; + do { + c2 = EOF; + switch (c = getChar()) { + + case EOF: +#if 0 + // This breaks some PDF files, e.g., ones from Photoshop. + case '\r': + case '\n': +#endif + error(errSyntaxError, getPos(), "Unterminated string"); + done = gTrue; + break; + + case '(': + ++numParen; + c2 = c; + break; + + case ')': + if (--numParen == 0) { + done = gTrue; + } else { + c2 = c; + } + break; + + case '\\': + switch (c = getChar()) { + case 'n': + c2 = '\n'; + break; + case 'r': + c2 = '\r'; + break; + case 't': + c2 = '\t'; + break; + case 'b': + c2 = '\b'; + break; + case 'f': + c2 = '\f'; + break; + case '\\': + case '(': + case ')': + c2 = c; + break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c2 = c - '0'; + c = lookChar(); + if (c >= '0' && c <= '7') { + getChar(); + c2 = (c2 << 3) + (c - '0'); + c = lookChar(); + if (c >= '0' && c <= '7') { + getChar(); + c2 = (c2 << 3) + (c - '0'); + } + } + break; + case '\r': + c = lookChar(); + if (c == '\n') { + getChar(); + } + break; + case '\n': + break; + case EOF: + error(errSyntaxError, getPos(), "Unterminated string"); + done = gTrue; + break; + default: + c2 = c; + break; + } + break; + + default: + c2 = c; + break; + } + + if (c2 != EOF) { + if (n == tokBufSize) { + if (!s) + s = new GooString(tokBuf, tokBufSize); + else + s->append(tokBuf, tokBufSize); + p = tokBuf; + n = 0; + + // we are growing see if the document is not malformed and we are growing too much + if (objNum > 0 && xref != NULL) + { + int newObjNum = xref->getNumEntry(curStr.streamGetPos()); + if (newObjNum != objNum) + { + error(errSyntaxError, getPos(), "Unterminated string"); + done = gTrue; + delete s; + n = -2; + } + } + } + *p++ = (char)c2; + ++n; + } + } while (!done); + if (n >= 0) { + if (!s) + s = new GooString(tokBuf, n); + else + s->append(tokBuf, n); + obj->initString(s); + } else { + obj->initEOF(); + } + break; + + // name + case '/': + p = tokBuf; + n = 0; + s = NULL; + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (c == '#') { + c2 = lookChar(); + if (c2 >= '0' && c2 <= '9') { + c = c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + c = c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + c = c2 - 'a' + 10; + } else { + goto notEscChar; + } + getChar(); + c <<= 4; + c2 = getChar(); + if (c2 >= '0' && c2 <= '9') { + c += c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + c += c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + c += c2 - 'a' + 10; + } else { + error(errSyntaxError, getPos(), "Illegal digit in hex char in name"); + } + } + notEscChar: + // the PDF spec claims that names are limited to 127 chars, but + // Distiller 8 will produce longer names, and Acrobat 8 will + // accept longer names + ++n; + if (n < tokBufSize) { + *p++ = c; + } else if (n == tokBufSize) { + error(errSyntaxError, getPos(), "Warning: name token is longer than what the specification says it can be"); + *p = c; + s = new GooString(tokBuf, n); + } else { + s->append((char)c); + } + } + if (n < tokBufSize) { + *p = '\0'; + obj->initName(tokBuf); + } else { + obj->initName(s->getCString()); + delete s; + } + break; + + // array punctuation + case '[': + case ']': + tokBuf[0] = c; + tokBuf[1] = '\0'; + obj->initCmd(tokBuf); + break; + + // hex string or dict punctuation + case '<': + c = lookChar(); + + // dict punctuation + if (c == '<') { + getChar(); + tokBuf[0] = tokBuf[1] = '<'; + tokBuf[2] = '\0'; + obj->initCmd(tokBuf); + + // hex string + } else { + p = tokBuf; + m = n = 0; + c2 = 0; + s = NULL; + while (1) { + c = getChar(); + if (c == '>') { + break; + } else if (c == EOF) { + error(errSyntaxError, getPos(), "Unterminated hex string"); + break; + } else if (specialChars[c] != 1) { + c2 = c2 << 4; + if (c >= '0' && c <= '9') + c2 += c - '0'; + else if (c >= 'A' && c <= 'F') + c2 += c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + c2 += c - 'a' + 10; + else + error(errSyntaxError, getPos(), "Illegal character <{0:02x}> in hex string", c); + if (++m == 2) { + if (n == tokBufSize) { + if (!s) + s = new GooString(tokBuf, tokBufSize); + else + s->append(tokBuf, tokBufSize); + p = tokBuf; + n = 0; + } + *p++ = (char)c2; + ++n; + c2 = 0; + m = 0; + } + } + } + if (!s) + s = new GooString(tokBuf, n); + else + s->append(tokBuf, n); + if (m == 1) + s->append((char)(c2 << 4)); + obj->initString(s); + } + break; + + // dict punctuation + case '>': + c = lookChar(); + if (c == '>') { + getChar(); + tokBuf[0] = tokBuf[1] = '>'; + tokBuf[2] = '\0'; + obj->initCmd(tokBuf); + } else { + error(errSyntaxError, getPos(), "Illegal character '>'"); + obj->initError(); + } + break; + + // error + case ')': + case '{': + case '}': + error(errSyntaxError, getPos(), "Illegal character '{0:c}'", c); + obj->initError(); + break; + + // command + default: + p = tokBuf; + *p++ = c; + n = 1; + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (++n == tokBufSize) { + error(errSyntaxError, getPos(), "Command token too long"); + break; + } + *p++ = c; + } + *p = '\0'; + if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) { + obj->initBool(gTrue); + } else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) { + obj->initBool(gFalse); + } else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) { + obj->initNull(); + } else { + obj->initCmd(tokBuf); + } + break; + } + + return obj; +} + +void Lexer::skipToNextLine() { + int c; + + while (1) { + c = getChar(); + if (c == EOF || c == '\n') { + return; + } + if (c == '\r') { + if ((c = lookChar()) == '\n') { + getChar(); + } + return; + } + } +} + +GBool Lexer::isSpace(int c) { + return c >= 0 && c <= 0xff && specialChars[c] == 1; +} diff --git a/poppler/Lexer.h b/poppler/Lexer.h new file mode 100644 index 0000000..284479d --- /dev/null +++ b/poppler/Lexer.h @@ -0,0 +1,105 @@ +//======================================================================== +// +// Lexer.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2007, 2010 Albert Astals Cid +// Copyright (C) 2006 Krzysztof Kowalczyk +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef LEXER_H +#define LEXER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" +#include "Stream.h" + +class XRef; + +#define tokBufSize 128 // size of token buffer + +//------------------------------------------------------------------------ +// Lexer +//------------------------------------------------------------------------ + +class Lexer { +public: + + // Construct a lexer for a single stream. Deletes the stream when + // lexer is deleted. + Lexer(XRef *xrefA, Stream *str); + + // Construct a lexer for a stream or array of streams (assumes obj + // is either a stream or array of streams). + Lexer(XRef *xrefA, Object *obj); + + // Destructor. + ~Lexer(); + + // Get the next object from the input stream. + Object *getObj(Object *obj, int objNum = -1); + + // Skip to the beginning of the next line in the input stream. + void skipToNextLine(); + + // Skip over one character. + void skipChar() { getChar(); } + + // Get stream. + Stream *getStream() + { return curStr.isStream() ? curStr.getStream() : (Stream *)NULL; } + + // Get current position in file. This is only used for error + // messages, so it returns an int instead of a Guint. + int getPos() + { return curStr.isStream() ? (int)curStr.streamGetPos() : -1; } + + // Set position in file. + void setPos(Guint pos, int dir = 0) + { if (curStr.isStream()) curStr.streamSetPos(pos, dir); } + + // Returns true if is a whitespace character. + static GBool isSpace(int c); + + + // often (e.g. ~30% on PDF Refernce 1.6 pdf file from Adobe site) getChar + // is called right after lookChar. In order to avoid expensive re-doing + // getChar() of underlying stream, we cache the last value found by + // lookChar() in lookCharLastValueCached. A special value + // LOOK_VALUE_NOT_CACHED that should never be part of stream indicates + // that no value was cached + static const int LOOK_VALUE_NOT_CACHED = -3; + int lookCharLastValueCached; + +private: + + int getChar(GBool comesFromLook = gFalse); + int lookChar(); + + Array *streams; // array of input streams + int strPtr; // index of current stream + Object curStr; // current stream + GBool freeArray; // should lexer free the streams array? + char tokBuf[tokBufSize]; // temporary token buffer + + XRef *xref; +}; + +#endif diff --git a/poppler/Linearization.cc b/poppler/Linearization.cc new file mode 100644 index 0000000..33331d1 --- /dev/null +++ b/poppler/Linearization.cc @@ -0,0 +1,222 @@ +//======================================================================== +// +// Linearization.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010, 2012 Hib Eris +// +//======================================================================== + +#include "Linearization.h" +#include "Parser.h" +#include "Lexer.h" + +//------------------------------------------------------------------------ +// Linearization +//------------------------------------------------------------------------ + +Linearization::Linearization (BaseStream *str) +{ + Parser *parser; + Object obj1, obj2, obj3, obj5; + + linDict.initNull(); + + str->reset(); + obj1.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, str->makeSubStream(str->getStart(), gFalse, 0, &obj1)), + gFalse); + parser->getObj(&obj1); + parser->getObj(&obj2); + parser->getObj(&obj3); + parser->getObj(&linDict); + if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && linDict.isDict()) { + linDict.dictLookup("Linearized", &obj5); + if (!(obj5.isNum() && obj5.getNum() > 0)) { + linDict.free(); + linDict.initNull(); + } + obj5.free(); + } + obj3.free(); + obj2.free(); + obj1.free(); + delete parser; +} + +Linearization:: ~Linearization() +{ + linDict.free(); +} + +Guint Linearization::getLength() +{ + if (!linDict.isDict()) return 0; + + int length; + if (linDict.getDict()->lookupInt("L", NULL, &length) && + length > 0) { + return length; + } else { + error(errSyntaxWarning, -1, "Length in linearization table is invalid"); + return 0; + } +} + +Guint Linearization::getHintsOffset() +{ + int hintsOffset; + + Object obj1, obj2; + if (linDict.isDict() && + linDict.dictLookup("H", &obj1)->isArray() && + obj1.arrayGetLength()>=2 && + obj1.arrayGet(0, &obj2)->isInt() && + obj2.getInt() > 0) { + hintsOffset = obj2.getInt(); + } else { + error(errSyntaxWarning, -1, "Hints table offset in linearization table is invalid"); + hintsOffset = 0; + } + obj2.free(); + obj1.free(); + + return hintsOffset; +} + +Guint Linearization::getHintsLength() +{ + int hintsLength; + + Object obj1, obj2; + if (linDict.isDict() && + linDict.dictLookup("H", &obj1)->isArray() && + obj1.arrayGetLength()>=2 && + obj1.arrayGet(1, &obj2)->isInt() && + obj2.getInt() > 0) { + hintsLength = obj2.getInt(); + } else { + error(errSyntaxWarning, -1, "Hints table length in linearization table is invalid"); + hintsLength = 0; + } + obj2.free(); + obj1.free(); + + return hintsLength; +} + +Guint Linearization::getHintsOffset2() +{ + int hintsOffset2 = 0; // default to 0 + + Object obj1, obj2; + if (linDict.isDict() && + linDict.dictLookup("H", &obj1)->isArray() && + obj1.arrayGetLength()>=4) { + if (obj1.arrayGet(2, &obj2)->isInt() && + obj2.getInt() > 0) { + hintsOffset2 = obj2.getInt(); + } else { + error(errSyntaxWarning, -1, "Second hints table offset in linearization table is invalid"); + hintsOffset2 = 0; + } + } + obj2.free(); + obj1.free(); + + return hintsOffset2; +} + +Guint Linearization::getHintsLength2() +{ + int hintsLength2 = 0; // default to 0 + + Object obj1, obj2; + if (linDict.isDict() && + linDict.dictLookup("H", &obj1)->isArray() && + obj1.arrayGetLength()>=4) { + if (obj1.arrayGet(3, &obj2)->isInt() && + obj2.getInt() > 0) { + hintsLength2 = obj2.getInt(); + } else { + error(errSyntaxWarning, -1, "Second hints table length in linearization table is invalid"); + hintsLength2 = 0; + } + } + obj2.free(); + obj1.free(); + + return hintsLength2; +} + +int Linearization::getObjectNumberFirst() +{ + int objectNumberFirst = 0; + if (linDict.isDict() && + linDict.getDict()->lookupInt("O", NULL, &objectNumberFirst) && + objectNumberFirst > 0) { + return objectNumberFirst; + } else { + error(errSyntaxWarning, -1, "Object number of first page in linearization table is invalid"); + return 0; + } +} + +Guint Linearization::getEndFirst() +{ + int pageEndFirst = 0; + if (linDict.isDict() && + linDict.getDict()->lookupInt("E", NULL, &pageEndFirst) && + pageEndFirst > 0) { + return pageEndFirst; + } else { + error(errSyntaxWarning, -1, "First page end offset in linearization table is invalid"); + return 0; + } +} + +int Linearization::getNumPages() +{ + int numPages = 0; + if (linDict.isDict() && + linDict.getDict()->lookupInt("N", NULL, &numPages) && + numPages > 0) { + return numPages; + } else { + error(errSyntaxWarning, -1, "Page count in linearization table is invalid"); + return 0; + } +} + +Guint Linearization::getMainXRefEntriesOffset() +{ + int mainXRefEntriesOffset = 0; + if (linDict.isDict() && + linDict.getDict()->lookupInt("T", NULL, &mainXRefEntriesOffset) && + mainXRefEntriesOffset > 0) { + return mainXRefEntriesOffset; + } else { + error(errSyntaxWarning, -1, "Main Xref offset in linearization table is invalid"); + return 0; + } +} + +int Linearization::getPageFirst() +{ + int pageFirst = 0; // Optional, defaults to 0. + + if (linDict.isDict()) { + linDict.getDict()->lookupInt("P", NULL, &pageFirst); + } + + if ((pageFirst < 0) || (pageFirst > getNumPages())) { + error(errSyntaxWarning, -1, "First page in linearization table is invalid"); + return 0; + } + + return pageFirst; +} + + diff --git a/poppler/Linearization.h b/poppler/Linearization.h new file mode 100644 index 0000000..6728a75 --- /dev/null +++ b/poppler/Linearization.h @@ -0,0 +1,45 @@ +//======================================================================== +// +// Linearization.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// +//======================================================================== + +#ifndef LINEARIZATION_H +#define LINEARIZATION_H + +#include "goo/gtypes.h" +#include "Object.h" +class BaseStream; + +//------------------------------------------------------------------------ +// Linearization +//------------------------------------------------------------------------ + +class Linearization { +public: + + Linearization(BaseStream *str); + ~Linearization(); + + Guint getLength(); + Guint getHintsOffset(); + Guint getHintsLength(); + Guint getHintsOffset2(); + Guint getHintsLength2(); + int getObjectNumberFirst(); + Guint getEndFirst(); + int getNumPages(); + Guint getMainXRefEntriesOffset(); + int getPageFirst(); + +private: + + Object linDict; + +}; + +#endif diff --git a/poppler/Link.cc b/poppler/Link.cc new file mode 100644 index 0000000..b90b1c1 --- /dev/null +++ b/poppler/Link.cc @@ -0,0 +1,929 @@ +//======================================================================== +// +// Link.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2008 Pino Toscano +// Copyright (C) 2007, 2010, 2011 Carlos Garcia Campos +// Copyright (C) 2008 Hugo Mercier +// Copyright (C) 2008-2010, 2012 Albert Astals Cid +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2009 Ilya Gorenbein +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Link.h" +#include "Sound.h" +#include "FileSpec.h" +#include "Rendition.h" +#include "Annot.h" + +//------------------------------------------------------------------------ +// LinkAction +//------------------------------------------------------------------------ + +LinkAction *LinkAction::parseDest(Object *obj) { + LinkAction *action; + + action = new LinkGoTo(obj); + if (!action->isOk()) { + delete action; + return NULL; + } + return action; +} + +LinkAction *LinkAction::parseAction(Object *obj, GooString *baseURI) { + LinkAction *action; + Object obj2, obj3, obj4; + + if (!obj->isDict()) { + error(errSyntaxWarning, -1, "parseAction: Bad annotation action for URI '{0:s}'", + baseURI ? baseURI->getCString() : "NULL"); + return NULL; + } + + obj->dictLookup("S", &obj2); + + // GoTo action + if (obj2.isName("GoTo")) { + obj->dictLookup("D", &obj3); + action = new LinkGoTo(&obj3); + obj3.free(); + + // GoToR action + } else if (obj2.isName("GoToR")) { + obj->dictLookup("F", &obj3); + obj->dictLookup("D", &obj4); + action = new LinkGoToR(&obj3, &obj4); + obj3.free(); + obj4.free(); + + // Launch action + } else if (obj2.isName("Launch")) { + action = new LinkLaunch(obj); + + // URI action + } else if (obj2.isName("URI")) { + obj->dictLookup("URI", &obj3); + action = new LinkURI(&obj3, baseURI); + obj3.free(); + + // Named action + } else if (obj2.isName("Named")) { + obj->dictLookup("N", &obj3); + action = new LinkNamed(&obj3); + obj3.free(); + + // Movie action + } else if (obj2.isName("Movie")) { + action = new LinkMovie(obj); + + // Rendition action + } else if (obj2.isName("Rendition")) { + action = new LinkRendition(obj); + + // Sound action + } else if (obj2.isName("Sound")) { + action = new LinkSound(obj); + + // JavaScript action + } else if (obj2.isName("JavaScript")) { + obj->dictLookup("JS", &obj3); + action = new LinkJavaScript(&obj3); + obj3.free(); + + // Set-OCG-State action + } else if (obj2.isName("SetOCGState")) { + action = new LinkOCGState(obj); + + // unknown action + } else if (obj2.isName()) { + action = new LinkUnknown(obj2.getName()); + + // action is missing or wrong type + } else { + error(errSyntaxWarning, -1, "parseAction: Unknown annotation action object: URI = '{0:s}'", + baseURI ? baseURI->getCString() : "NULL"); + action = NULL; + } + + obj2.free(); + + if (action && !action->isOk()) { + delete action; + return NULL; + } + return action; +} + +//------------------------------------------------------------------------ +// LinkDest +//------------------------------------------------------------------------ + +LinkDest::LinkDest(Array *a) { + Object obj1, obj2; + + // initialize fields + left = bottom = right = top = zoom = 0; + changeLeft = changeTop = changeZoom = gFalse; + ok = gFalse; + + // get page + if (a->getLength() < 2) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + return; + } + a->getNF(0, &obj1); + if (obj1.isInt()) { + pageNum = obj1.getInt() + 1; + pageIsRef = gFalse; + } else if (obj1.isRef()) { + pageRef.num = obj1.getRefNum(); + pageRef.gen = obj1.getRefGen(); + pageIsRef = gTrue; + } else { + error(errSyntaxWarning, -1, "Bad annotation destination"); + goto err2; + } + obj1.free(); + + // get destination type + a->get(1, &obj1); + + // XYZ link + if (obj1.isName("XYZ")) { + kind = destXYZ; + if (a->getLength() < 3) { + changeLeft = gFalse; + } else { + a->get(2, &obj2); + if (obj2.isNull()) { + changeLeft = gFalse; + } else if (obj2.isNum()) { + changeLeft = gTrue; + left = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + } + if (a->getLength() < 4) { + changeTop = gFalse; + } else { + a->get(3, &obj2); + if (obj2.isNull()) { + changeTop = gFalse; + } else if (obj2.isNum()) { + changeTop = gTrue; + top = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + } + if (a->getLength() < 5) { + changeZoom = gFalse; + } else { + a->get(4, &obj2); + if (obj2.isNull()) { + changeZoom = gFalse; + } else if (obj2.isNum()) { + changeZoom = gTrue; + zoom = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + } + + // Fit link + } else if (obj1.isName("Fit")) { + if (a->getLength() < 2) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFit; + + // FitH link + } else if (obj1.isName("FitH")) { + if (a->getLength() < 3) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitH; + a->get(2, &obj2); + if (obj2.isNull()) { + changeTop = gFalse; + } else if (obj2.isNum()) { + changeTop = gTrue; + top = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + + // FitV link + } else if (obj1.isName("FitV")) { + if (a->getLength() < 3) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitV; + a->get(2, &obj2); + if (obj2.isNull()) { + changeLeft = gFalse; + } else if (obj2.isNum()) { + changeLeft = gTrue; + left = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + + // FitR link + } else if (obj1.isName("FitR")) { + if (a->getLength() < 6) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitR; + if (a->get(2, &obj2)->isNum()) { + left = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + if (a->get(3, &obj2)->isNum()) { + bottom = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + if (a->get(4, &obj2)->isNum()) { + right = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + if (a->get(5, &obj2)->isNum()) { + top = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + + // FitB link + } else if (obj1.isName("FitB")) { + if (a->getLength() < 2) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitB; + + // FitBH link + } else if (obj1.isName("FitBH")) { + if (a->getLength() < 3) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitBH; + a->get(2, &obj2); + if (obj2.isNull()) { + changeTop = gFalse; + } else if (obj2.isNum()) { + changeTop = gTrue; + top = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + + // FitBV link + } else if (obj1.isName("FitBV")) { + if (a->getLength() < 3) { + error(errSyntaxWarning, -1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitBV; + a->get(2, &obj2); + if (obj2.isNull()) { + changeLeft = gFalse; + } else if (obj2.isNum()) { + changeLeft = gTrue; + left = obj2.getNum(); + } else { + error(errSyntaxWarning, -1, "Bad annotation destination position"); + kind = destFit; + } + obj2.free(); + + // unknown link kind + } else { + error(errSyntaxWarning, -1, "Unknown annotation destination type"); + goto err2; + } + + obj1.free(); + ok = gTrue; + return; + + err1: + obj2.free(); + err2: + obj1.free(); +} + +LinkDest::LinkDest(LinkDest *dest) { + kind = dest->kind; + pageIsRef = dest->pageIsRef; + if (pageIsRef) + pageRef = dest->pageRef; + else + pageNum = dest->pageNum; + left = dest->left; + bottom = dest->bottom; + right = dest->right; + top = dest->top; + zoom = dest->zoom; + changeLeft = dest->changeLeft; + changeTop = dest->changeTop; + changeZoom = dest->changeZoom; + ok = gTrue; +} + +//------------------------------------------------------------------------ +// LinkGoTo +//------------------------------------------------------------------------ + +LinkGoTo::LinkGoTo(Object *destObj) { + dest = NULL; + namedDest = NULL; + + // named destination + if (destObj->isName()) { + namedDest = new GooString(destObj->getName()); + } else if (destObj->isString()) { + namedDest = destObj->getString()->copy(); + + // destination dictionary + } else if (destObj->isArray()) { + dest = new LinkDest(destObj->getArray()); + if (!dest->isOk()) { + delete dest; + dest = NULL; + } + + // error + } else { + error(errSyntaxWarning, -1, "Illegal annotation destination"); + } +} + +LinkGoTo::~LinkGoTo() { + if (dest) + delete dest; + if (namedDest) + delete namedDest; +} + +//------------------------------------------------------------------------ +// LinkGoToR +//------------------------------------------------------------------------ + +LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) { + fileName = NULL; + dest = NULL; + namedDest = NULL; + + // get file name + Object obj1; + if (getFileSpecNameForPlatform (fileSpecObj, &obj1)) { + fileName = obj1.getString()->copy(); + obj1.free(); + } + + // named destination + if (destObj->isName()) { + namedDest = new GooString(destObj->getName()); + } else if (destObj->isString()) { + namedDest = destObj->getString()->copy(); + + // destination dictionary + } else if (destObj->isArray()) { + dest = new LinkDest(destObj->getArray()); + if (!dest->isOk()) { + delete dest; + dest = NULL; + } + + // error + } else { + error(errSyntaxWarning, -1, "Illegal annotation destination"); + } +} + +LinkGoToR::~LinkGoToR() { + if (fileName) + delete fileName; + if (dest) + delete dest; + if (namedDest) + delete namedDest; +} + + +//------------------------------------------------------------------------ +// LinkLaunch +//------------------------------------------------------------------------ + +LinkLaunch::LinkLaunch(Object *actionObj) { + Object obj1, obj2, obj3; + + fileName = NULL; + params = NULL; + + if (actionObj->isDict()) { + if (!actionObj->dictLookup("F", &obj1)->isNull()) { + if (getFileSpecNameForPlatform (&obj1, &obj3)) { + fileName = obj3.getString()->copy(); + obj3.free(); + } + } else { + obj1.free(); +#ifdef _WIN32 + if (actionObj->dictLookup("Win", &obj1)->isDict()) { + obj1.dictLookup("F", &obj2); + if (getFileSpecNameForPlatform (&obj2, &obj3)) { + fileName = obj3.getString()->copy(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("P", &obj2)->isString()) { + params = obj2.getString()->copy(); + } + obj2.free(); + } else { + error(errSyntaxWarning, -1, "Bad launch-type link action"); + } +#else + //~ This hasn't been defined by Adobe yet, so assume it looks + //~ just like the Win dictionary until they say otherwise. + if (actionObj->dictLookup("Unix", &obj1)->isDict()) { + obj1.dictLookup("F", &obj2); + if (getFileSpecNameForPlatform (&obj2, &obj3)) { + fileName = obj3.getString()->copy(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("P", &obj2)->isString()) { + params = obj2.getString()->copy(); + } + obj2.free(); + } else { + error(errSyntaxWarning, -1, "Bad launch-type link action"); + } +#endif + } + obj1.free(); + } +} + +LinkLaunch::~LinkLaunch() { + if (fileName) + delete fileName; + if (params) + delete params; +} + +//------------------------------------------------------------------------ +// LinkURI +//------------------------------------------------------------------------ + +LinkURI::LinkURI(Object *uriObj, GooString *baseURI) { + GooString *uri2; + int n; + char c; + + uri = NULL; + if (uriObj->isString()) { + uri2 = uriObj->getString(); + n = (int)strcspn(uri2->getCString(), "/:"); + if (n < uri2->getLength() && uri2->getChar(n) == ':') { + // "http:..." etc. + uri = uri2->copy(); + } else if (!uri2->cmpN("www.", 4)) { + // "www.[...]" without the leading "http://" + uri = new GooString("http://"); + uri->append(uri2); + } else { + // relative URI + if (baseURI) { + uri = baseURI->copy(); + c = uri->getChar(uri->getLength() - 1); + if (c != '/' && c != '?') { + uri->append('/'); + } + if (uri2->getChar(0) == '/') { + uri->append(uri2->getCString() + 1, uri2->getLength() - 1); + } else { + uri->append(uri2); + } + } else { + uri = uri2->copy(); + } + } + } else { + error(errSyntaxWarning, -1, "Illegal URI-type link"); + } +} + +LinkURI::~LinkURI() { + if (uri) + delete uri; +} + +//------------------------------------------------------------------------ +// LinkNamed +//------------------------------------------------------------------------ + +LinkNamed::LinkNamed(Object *nameObj) { + name = NULL; + if (nameObj->isName()) { + name = new GooString(nameObj->getName()); + } +} + +LinkNamed::~LinkNamed() { + if (name) { + delete name; + } +} + +//------------------------------------------------------------------------ +// LinkMovie +//------------------------------------------------------------------------ + +LinkMovie::LinkMovie(Object *obj) { + annotRef.num = -1; + annotTitle = NULL; + + Object tmp; + if (obj->dictLookupNF("Annotation", &tmp)->isRef()) { + annotRef = tmp.getRef(); + } + tmp.free(); + + if (obj->dictLookup("T", &tmp)->isString()) { + annotTitle = tmp.getString()->copy(); + } + tmp.free(); + + if ((annotTitle == NULL) && (annotRef.num == -1)) { + error(errSyntaxError, -1, + "Movie action is missing both the Annot and T keys"); + } + + if (obj->dictLookup("Operation", &tmp)->isName()) { + char *name = tmp.getName(); + + if (!strcmp(name, "Play")) { + operation = operationTypePlay; + } + else if (!strcmp(name, "Stop")) { + operation = operationTypeStop; + } + else if (!strcmp(name, "Pause")) { + operation = operationTypePause; + } + else if (!strcmp(name, "Resume")) { + operation = operationTypeResume; + } + } + tmp.free(); +} + +LinkMovie::~LinkMovie() { + if (annotTitle) { + delete annotTitle; + } +} + +//------------------------------------------------------------------------ +// LinkSound +//------------------------------------------------------------------------ + +LinkSound::LinkSound(Object *soundObj) { + volume = 1.0; + sync = gFalse; + repeat = gFalse; + mix = gFalse; + sound = NULL; + if (soundObj->isDict()) + { + Object tmp; + // volume + soundObj->dictLookup("Volume", &tmp); + if (tmp.isNum()) { + volume = tmp.getNum(); + } + tmp.free(); + // sync + soundObj->dictLookup("Synchronous", &tmp); + if (tmp.isBool()) { + sync = tmp.getBool(); + } + tmp.free(); + // repeat + soundObj->dictLookup("Repeat", &tmp); + if (tmp.isBool()) { + repeat = tmp.getBool(); + } + tmp.free(); + // mix + soundObj->dictLookup("Mix", &tmp); + if (tmp.isBool()) { + mix = tmp.getBool(); + } + tmp.free(); + // 'Sound' object + soundObj->dictLookup("Sound", &tmp); + sound = Sound::parseSound(&tmp); + tmp.free(); + } +} + +LinkSound::~LinkSound() { + delete sound; +} + +//------------------------------------------------------------------------ +// LinkRendition +//------------------------------------------------------------------------ + +LinkRendition::LinkRendition(Object *obj) { + operation = -1; + media = NULL; + js = NULL; + + if (obj->isDict()) { + Object tmp; + + if (!obj->dictLookup("JS", &tmp)->isNull()) { + if (tmp.isString()) { + js = new GooString(tmp.getString()); + } else if (tmp.isStream()) { + Stream *stream = tmp.getStream(); + js = new GooString(); + stream->fillGooString(js); + } else { + error(errSyntaxWarning, -1, "Invalid Rendition Action: JS not string or stream"); + } + } + tmp.free(); + + if (obj->dictLookup("OP", &tmp)->isInt()) { + operation = tmp.getInt(); + if (!js && (operation < 0 || operation > 4)) { + error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized operation valued: {0:d}", operation); + } else { + Object obj1; + + // retrieve rendition object + if (obj->dictLookup("R", &renditionObj)->isDict()) { + media = new MediaRendition(&renditionObj); + } else if (operation == 0 || operation == 4) { + error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field with op = {0:d}", operation); + renditionObj.free(); + } + + if (!obj->dictLookupNF("AN", &screenRef)->isRef() && operation >= 0 && operation <= 4) { + error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field with op = {0:d}", operation); + screenRef.free(); + } + } + } else if (!js) { + error(errSyntaxWarning, -1, "Invalid Rendition action: no OP or JS field defined"); + } + tmp.free(); + } +} + +LinkRendition::~LinkRendition() { + renditionObj.free(); + screenRef.free(); + + if (js) + delete js; + if (media) + delete media; +} + + +//------------------------------------------------------------------------ +// LinkJavaScript +//------------------------------------------------------------------------ + +LinkJavaScript::LinkJavaScript(Object *jsObj) { + js = NULL; + + if (jsObj->isString()) { + js = new GooString(jsObj->getString()); + } + else if (jsObj->isStream()) { + Stream *stream = jsObj->getStream(); + js = new GooString(); + stream->fillGooString(js); + } +} + +LinkJavaScript::~LinkJavaScript() { + if (js) { + delete js; + } +} + +//------------------------------------------------------------------------ +// LinkOCGState +//------------------------------------------------------------------------ +LinkOCGState::LinkOCGState(Object *obj) { + Object obj1; + + stateList = new GooList(); + preserveRB = gTrue; + + if (obj->dictLookup("State", &obj1)->isArray()) { + StateList *stList = NULL; + + for (int i = 0; i < obj1.arrayGetLength(); ++i) { + Object obj2; + + obj1.arrayGetNF(i, &obj2); + if (obj2.isName()) { + if (stList) + stateList->append(stList); + + char *name = obj2.getName(); + stList = new StateList(); + stList->list = new GooList(); + if (!strcmp (name, "ON")) { + stList->st = On; + } else if (!strcmp (name, "OFF")) { + stList->st = Off; + } else if (!strcmp (name, "Toggle")) { + stList->st = Toggle; + } else { + error(errSyntaxWarning, -1, "Invalid name '{0:s}' in OCG Action state array", name); + delete stList; + stList = NULL; + } + } else if (obj2.isRef()) { + if (stList) { + Ref ocgRef = obj2.getRef(); + Ref *item = new Ref(); + item->num = ocgRef.num; + item->gen = ocgRef.gen; + stList->list->append(item); + } else { + error(errSyntaxWarning, -1, "Invalid OCG Action State array, expected name instead of ref"); + } + } else { + error(errSyntaxWarning, -1, "Invalid item in OCG Action State array"); + } + obj2.free(); + } + // Add the last group + if (stList) + stateList->append(stList); + } else { + error(errSyntaxWarning, -1, "Invalid OCGState action"); + delete stateList; + stateList = NULL; + } + obj1.free(); + + if (obj->dictLookup("PreserveRB", &obj1)->isBool()) { + preserveRB = obj1.getBool(); + } + obj1.free(); +} + +LinkOCGState::~LinkOCGState() { + if (stateList) + deleteGooList(stateList, StateList); +} + +LinkOCGState::StateList::~StateList() { + if (list) + deleteGooList(list, Ref); +} + +//------------------------------------------------------------------------ +// LinkUnknown +//------------------------------------------------------------------------ + +LinkUnknown::LinkUnknown(char *actionA) { + action = new GooString(actionA); +} + +LinkUnknown::~LinkUnknown() { + delete action; +} + +//------------------------------------------------------------------------ +// Links +//------------------------------------------------------------------------ + +Links::Links(Annots *annots) { + int size; + int i; + + links = NULL; + size = 0; + numLinks = 0; + + if (!annots) + return; + + for (i = 0; i < annots->getNumAnnots(); ++i) { + Annot *annot = annots->getAnnot(i); + + if (annot->getType() != Annot::typeLink) + continue; + + if (numLinks >= size) { + size += 16; + links = (AnnotLink **)greallocn(links, size, sizeof(AnnotLink *)); + } + annot->incRefCnt(); + links[numLinks++] = static_cast(annot); + } +} + +Links::~Links() { + int i; + + for (i = 0; i < numLinks; ++i) + links[i]->decRefCnt(); + + gfree(links); +} + +LinkAction *Links::find(double x, double y) const { + int i; + + for (i = numLinks - 1; i >= 0; --i) { + if (links[i]->inRect(x, y)) { + return links[i]->getAction(); + } + } + return NULL; +} + +GBool Links::onLink(double x, double y) const { + int i; + + for (i = 0; i < numLinks; ++i) { + if (links[i]->inRect(x, y)) + return gTrue; + } + return gFalse; +} diff --git a/poppler/Link.h b/poppler/Link.h new file mode 100644 index 0000000..8e2df24 --- /dev/null +++ b/poppler/Link.h @@ -0,0 +1,490 @@ +//======================================================================== +// +// Link.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2008 Pino Toscano +// Copyright (C) 2008 Hugo Mercier +// Copyright (C) 2010, 2011 Carlos Garcia Campos +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef LINK_H +#define LINK_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class GooString; +class GooList; +class Array; +class Dict; +class Sound; +class MediaRendition; +class AnnotLink; +class Annots; + +//------------------------------------------------------------------------ +// LinkAction +//------------------------------------------------------------------------ + +enum LinkActionKind { + actionGoTo, // go to destination + actionGoToR, // go to destination in new file + actionLaunch, // launch app (or open document) + actionURI, // URI + actionNamed, // named action + actionMovie, // movie action + actionRendition, + actionSound, // sound action + actionJavaScript, // JavaScript action + actionOCGState, // Set-OCG-State action + actionUnknown // anything else +}; + +class LinkAction { +public: + + // Destructor. + virtual ~LinkAction() {} + + // Was the LinkAction created successfully? + virtual GBool isOk() = 0; + + // Check link action type. + virtual LinkActionKind getKind() = 0; + + // Parse a destination (old-style action) name, string, or array. + static LinkAction *parseDest(Object *obj); + + // Parse an action dictionary. + static LinkAction *parseAction(Object *obj, GooString *baseURI = NULL); +}; + +//------------------------------------------------------------------------ +// LinkDest +//------------------------------------------------------------------------ + +enum LinkDestKind { + destXYZ, + destFit, + destFitH, + destFitV, + destFitR, + destFitB, + destFitBH, + destFitBV +}; + +class LinkDest { +public: + + // Build a LinkDest from the array. + LinkDest(Array *a); + + // Copy a LinkDest. + LinkDest *copy() { return new LinkDest(this); } + + // Was the LinkDest created successfully? + GBool isOk() { return ok; } + + // Accessors. + LinkDestKind getKind() { return kind; } + GBool isPageRef() { return pageIsRef; } + int getPageNum() { return pageNum; } + Ref getPageRef() { return pageRef; } + double getLeft() { return left; } + double getBottom() { return bottom; } + double getRight() { return right; } + double getTop() { return top; } + double getZoom() { return zoom; } + GBool getChangeLeft() { return changeLeft; } + GBool getChangeTop() { return changeTop; } + GBool getChangeZoom() { return changeZoom; } + +private: + + LinkDestKind kind; // destination type + GBool pageIsRef; // is the page a reference or number? + union { + Ref pageRef; // reference to page + int pageNum; // one-relative page number + }; + double left, bottom; // position + double right, top; + double zoom; // zoom factor + GBool changeLeft, changeTop; // which position components to change: + GBool changeZoom; // destXYZ uses all three; + // destFitH/BH use changeTop; + // destFitV/BV use changeLeft + GBool ok; // set if created successfully + + LinkDest(LinkDest *dest); +}; + +//------------------------------------------------------------------------ +// LinkGoTo +//------------------------------------------------------------------------ + +class LinkGoTo: public LinkAction { +public: + + // Build a LinkGoTo from a destination (dictionary, name, or string). + LinkGoTo(Object *destObj); + + // Destructor. + virtual ~LinkGoTo(); + + // Was the LinkGoTo created successfully? + virtual GBool isOk() { return dest || namedDest; } + + // Accessors. + virtual LinkActionKind getKind() { return actionGoTo; } + LinkDest *getDest() { return dest; } + GooString *getNamedDest() { return namedDest; } + +private: + + LinkDest *dest; // regular destination (NULL for remote + // link with bad destination) + GooString *namedDest; // named destination (only one of dest and + // and namedDest may be non-NULL) +}; + +//------------------------------------------------------------------------ +// LinkGoToR +//------------------------------------------------------------------------ + +class LinkGoToR: public LinkAction { +public: + + // Build a LinkGoToR from a file spec (dictionary) and destination + // (dictionary, name, or string). + LinkGoToR(Object *fileSpecObj, Object *destObj); + + // Destructor. + virtual ~LinkGoToR(); + + // Was the LinkGoToR created successfully? + virtual GBool isOk() { return fileName && (dest || namedDest); } + + // Accessors. + virtual LinkActionKind getKind() { return actionGoToR; } + GooString *getFileName() { return fileName; } + LinkDest *getDest() { return dest; } + GooString *getNamedDest() { return namedDest; } + +private: + + GooString *fileName; // file name + LinkDest *dest; // regular destination (NULL for remote + // link with bad destination) + GooString *namedDest; // named destination (only one of dest and + // and namedDest may be non-NULL) +}; + +//------------------------------------------------------------------------ +// LinkLaunch +//------------------------------------------------------------------------ + +class LinkLaunch: public LinkAction { +public: + + // Build a LinkLaunch from an action dictionary. + LinkLaunch(Object *actionObj); + + // Destructor. + virtual ~LinkLaunch(); + + // Was the LinkLaunch created successfully? + virtual GBool isOk() { return fileName != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionLaunch; } + GooString *getFileName() { return fileName; } + GooString *getParams() { return params; } + +private: + + GooString *fileName; // file name + GooString *params; // parameters +}; + +//------------------------------------------------------------------------ +// LinkURI +//------------------------------------------------------------------------ + +class LinkURI: public LinkAction { +public: + + // Build a LinkURI given the URI (string) and base URI. + LinkURI(Object *uriObj, GooString *baseURI); + + // Destructor. + virtual ~LinkURI(); + + // Was the LinkURI created successfully? + virtual GBool isOk() { return uri != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionURI; } + GooString *getURI() { return uri; } + +private: + + GooString *uri; // the URI +}; + +//------------------------------------------------------------------------ +// LinkNamed +//------------------------------------------------------------------------ + +class LinkNamed: public LinkAction { +public: + + // Build a LinkNamed given the action name. + LinkNamed(Object *nameObj); + + virtual ~LinkNamed(); + + virtual GBool isOk() { return name != NULL; } + + virtual LinkActionKind getKind() { return actionNamed; } + GooString *getName() { return name; } + +private: + + GooString *name; +}; + + +//------------------------------------------------------------------------ +// LinkMovie +//------------------------------------------------------------------------ + +class LinkMovie: public LinkAction { +public: + + enum OperationType { + operationTypePlay, + operationTypePause, + operationTypeResume, + operationTypeStop + }; + + LinkMovie(Object *obj); + virtual ~LinkMovie(); + + virtual GBool isOk() { return annotRef.num >= 0 || annotTitle != NULL; } + virtual LinkActionKind getKind() { return actionMovie; } + + // a movie action stores either an indirect reference to a movie annotation + // or the movie annotation title + + GBool hasAnnotRef() { return annotRef.num >= 0; } + GBool hasAnnotTitle() { return annotTitle != NULL; } + Ref *getAnnotRef() { return &annotRef; } + GooString *getAnnotTitle() { return annotTitle; } + + OperationType getOperation() { return operation; } + +private: + + Ref annotRef; // Annotation + GooString *annotTitle; // T + + OperationType operation; // Operation +}; + + +//------------------------------------------------------------------------ +// LinkRendition +//------------------------------------------------------------------------ + +class LinkRendition: public LinkAction { +public: + + LinkRendition(Object *Obj); + + virtual ~LinkRendition(); + + virtual GBool isOk() { return true; } + + virtual LinkActionKind getKind() { return actionRendition; } + + GBool hasRenditionObject() { return renditionObj.isDict(); } + Object* getRenditionObject() { return &renditionObj; } + + GBool hasScreenAnnot() { return screenRef.isRef(); } + Ref getScreenAnnot() { return screenRef.getRef(); } + + int getOperation() { return operation; } + + MediaRendition* getMedia() { return media; } + + GooString *getScript() { return js; } + +private: + + Object screenRef; + Object renditionObj; + int operation; + + MediaRendition* media; + + GooString *js; +}; + +//------------------------------------------------------------------------ +// LinkSound +//------------------------------------------------------------------------ + +class LinkSound: public LinkAction { +public: + + LinkSound(Object *soundObj); + + virtual ~LinkSound(); + + virtual GBool isOk() { return sound != NULL; } + + virtual LinkActionKind getKind() { return actionSound; } + + double getVolume() { return volume; } + GBool getSynchronous() { return sync; } + GBool getRepeat() { return repeat; } + GBool getMix() { return mix; } + Sound *getSound() { return sound; } + +private: + + double volume; + GBool sync; + GBool repeat; + GBool mix; + Sound *sound; +}; + +//------------------------------------------------------------------------ +// LinkJavaScript +//------------------------------------------------------------------------ + +class LinkJavaScript: public LinkAction { +public: + + // Build a LinkJavaScript given the action name. + LinkJavaScript(Object *jsObj); + + virtual ~LinkJavaScript(); + + virtual GBool isOk() { return js != NULL; } + + virtual LinkActionKind getKind() { return actionJavaScript; } + GooString *getScript() { return js; } + +private: + + GooString *js; +}; + +//------------------------------------------------------------------------ +// LinkOCGState +//------------------------------------------------------------------------ +class LinkOCGState: public LinkAction { +public: + LinkOCGState(Object *obj); + + virtual ~LinkOCGState(); + + virtual GBool isOk() { return stateList != NULL; } + + virtual LinkActionKind getKind() { return actionOCGState; } + + enum State { On, Off, Toggle}; + struct StateList { + StateList() { list = NULL; } + ~StateList(); + State st; + GooList *list; + }; + + GooList *getStateList() { return stateList; } + GBool getPreserveRB() { return preserveRB; } + +private: + GooList *stateList; + GBool preserveRB; +}; + +//------------------------------------------------------------------------ +// LinkUnknown +//------------------------------------------------------------------------ + +class LinkUnknown: public LinkAction { +public: + + // Build a LinkUnknown with the specified action type. + LinkUnknown(char *actionA); + + // Destructor. + virtual ~LinkUnknown(); + + // Was the LinkUnknown create successfully? + virtual GBool isOk() { return action != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionUnknown; } + GooString *getAction() { return action; } + +private: + + GooString *action; // action subtype +}; + +//------------------------------------------------------------------------ +// Links +//------------------------------------------------------------------------ + +class Links { +public: + + // Extract links from array of annotations. + Links(Annots *annots); + + // Destructor. + ~Links(); + + // Iterate through list of links. + int getNumLinks() const { return numLinks; } + AnnotLink *getLink(int i) const { return links[i]; } + + // If point , is in a link, return the associated action; + // else return NULL. + LinkAction *find(double x, double y) const; + + // Return true if , is in a link. + GBool onLink(double x, double y) const; + +private: + + AnnotLink **links; + int numLinks; +}; + +#endif diff --git a/poppler/LocalPDFDocBuilder.cc b/poppler/LocalPDFDocBuilder.cc new file mode 100644 index 0000000..6f6f1fc --- /dev/null +++ b/poppler/LocalPDFDocBuilder.cc @@ -0,0 +1,46 @@ +//======================================================================== +// +// LocalPDFDocBuilder.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#include + +#include "LocalPDFDocBuilder.h" + +//------------------------------------------------------------------------ +// LocalPDFDocBuilder +//------------------------------------------------------------------------ + +PDFDoc * +LocalPDFDocBuilder::buildPDFDoc( + const GooString &uri, GooString *ownerPassword, GooString + *userPassword, void *guiDataA) +{ + if (uri.cmpN("file://", 7) == 0) { + GooString *fileName = uri.copy(); + fileName->del(0, 7); + return new PDFDoc(fileName, ownerPassword, userPassword, guiDataA); + } else { + GooString *fileName = uri.copy(); + return new PDFDoc(fileName, ownerPassword, userPassword, guiDataA); + } +} + +GBool LocalPDFDocBuilder::supports(const GooString &uri) +{ + if (uri.cmpN("file://", 7) == 0) { + return gTrue; + } else if (!strstr(uri.getCString(), "://")) { + return gTrue; + } else { + return gFalse; + } +} + + diff --git a/poppler/LocalPDFDocBuilder.h b/poppler/LocalPDFDocBuilder.h new file mode 100644 index 0000000..c2b1d90 --- /dev/null +++ b/poppler/LocalPDFDocBuilder.h @@ -0,0 +1,33 @@ +//======================================================================== +// +// LocalPDFDocBuilder.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef LOCALPDFDOCBUILDER_H +#define LOCALPDFDOCBUILDER_H + +#include "PDFDocBuilder.h" + +//------------------------------------------------------------------------ +// LocalPDFDocBuilder +// +// The LocalPDFDocBuilder implements a PDFDocBuilder for local files. +//------------------------------------------------------------------------ + +class LocalPDFDocBuilder : public PDFDocBuilder { + +public: + + PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); + GBool supports(const GooString &uri); + +}; + +#endif /* LOCALPDFDOCBUILDER_H */ diff --git a/poppler/Makefile.am b/poppler/Makefile.am new file mode 100644 index 0000000..8920f8e --- /dev/null +++ b/poppler/Makefile.am @@ -0,0 +1,331 @@ +if BUILD_SPLASH_OUTPUT + +splash_sources = \ + SplashOutputDev.cc + +splash_headers = \ + SplashOutputDev.h + +splash_includes = \ + $(SPLASH_CFLAGS) + +splash_libs = \ + $(SPLASH_LIBS) \ + $(top_builddir)/splash/libsplash.la + +endif + +if BUILD_POPPLER_QT4 + +poppler_arthur = libpoppler-arthur.la + +libpoppler_arthur_la_SOURCES = \ + ArthurOutputDev.h \ + ArthurOutputDev.cc + +arthur_includes = \ + $(POPPLER_QT4_CFLAGS) + +arthur_libs = \ + $(POPPLER_QT4_LIBS) + +endif + + + +if BUILD_CAIRO_OUTPUT + +poppler_cairo = libpoppler-cairo.la + +cairo_includes = \ + $(CAIRO_CFLAGS) + +cairo_libs = \ + $(CAIRO_LIBS) + +libpoppler_cairo_la_SOURCES = \ + CairoFontEngine.cc \ + CairoFontEngine.h \ + CairoOutputDev.cc \ + CairoOutputDev.h \ + CairoRescaleBox.cc \ + CairoRescaleBox.h + +endif + +if BUILD_LIBJPEG + +libjpeg_sources = \ + DCTStream.h \ + DCTStream.cc + +libjpeg_libs = \ + $(LIBJPEG_LIBS) +libjpeg_includes = \ + $(LIBJPEG_CFLAGS) + +endif + +if BUILD_LIBPNG + +libpng_libs = \ + $(LIBPNG_LIBS) +libpng_includes = \ + $(LIBPNG_CFLAGS) + +endif + +if BUILD_LIBTIFF + +libtiff_libs = \ + $(LIBTIFF_LIBS) +libtiff_includes = \ + $(LIBTIFF_CFLAGS) + +endif + +if BUILD_LIBOPENJPEG + +libjpeg2000_sources = \ + JPEG2000Stream.h \ + JPEG2000Stream.cc + +libjpeg2000_libs = \ + $(LIBOPENJPEG_LIBS) +libjpeg2000_includes = \ + $(LIBOPENJPEG_CFLAGS) + +else + +libjpeg2000_sources = \ + JPXStream.h \ + JPXStream.cc + +endif + + +if BUILD_ZLIB + +zlib_sources = \ + FlateStream.h \ + FlateStream.cc + +zlib_libs = \ + $(ZLIB_LIBS) + +endif + +if BUILD_LIBCURL + +libcurl_libs = \ + $(LIBCURL_LIBS) + +libcurl_includes = \ + $(LIBCURL_CFLAGS) + +curl_headers = \ + CurlCachedFile.h \ + CurlPDFDocBuilder.h + +curl_sources = \ + CurlCachedFile.cc \ + CurlPDFDocBuilder.cc + +endif + +if USE_CMS +cms_includes = $(LCMS_CFLAGS) +cms_libs = $(LCMS_LIBS) +endif + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + $(cms_includes) \ + $(splash_includes) \ + $(cairo_includes) \ + $(arthur_includes) \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) \ + $(libcurl_includes) \ + $(FREETYPE_CFLAGS) \ + $(FONTCONFIG_CFLAGS) + +lib_LTLIBRARIES = libpoppler.la + +noinst_LTLIBRARIES = $(poppler_cairo) \ + $(poppler_arthur) + +CFLAGS+=$(PTHREAD_CFLAGS) +CXXFLAGS+=$(PTHREAD_CFLAGS) + +libpoppler_la_LIBADD = \ + $(top_builddir)/goo/libgoo.la \ + $(top_builddir)/fofi/libfofi.la \ + $(cms_libs) \ + $(splash_libs) \ + $(libtiff_libs) \ + $(libjpeg_libs) \ + $(libpng_libs) \ + $(zlib_libs) \ + $(libcurl_libs) \ + $(libjpeg2000_libs) \ + $(FREETYPE_LIBS) \ + $(FONTCONFIG_LIBS) \ + $(PTHREAD_LIBS) \ + $(win32_libs) + +libpoppler_la_LDFLAGS = -version-info 25:0:0 @create_shared_lib@ @auto_import_flags@ + +if ENABLE_XPDF_HEADERS + +poppler_includedir = $(includedir)/poppler +poppler_include_HEADERS = \ + $(splash_headers) \ + $(curl_headers) \ + Annot.h \ + Array.h \ + BuiltinFont.h \ + BuiltinFontTables.h \ + CachedFile.h \ + Catalog.h \ + CharCodeToUnicode.h \ + CMap.h \ + DateInfo.h \ + Decrypt.h \ + Dict.h \ + Error.h \ + FileSpec.h \ + FontEncodingTables.h \ + FontInfo.h \ + Form.h \ + Function.h \ + Gfx.h \ + GfxFont.h \ + GfxState.h \ + GfxState_helpers.h \ + GlobalParams.h \ + Hints.h \ + JArithmeticDecoder.h \ + JBIG2Stream.h \ + Lexer.h \ + Linearization.h \ + Link.h \ + LocalPDFDocBuilder.h \ + Movie.h \ + NameToCharCode.h \ + Object.h \ + OptionalContent.h \ + Outline.h \ + OutputDev.h \ + Page.h \ + PageTransition.h \ + Parser.h \ + PDFDoc.h \ + PDFDocBuilder.h \ + PDFDocEncoding.h \ + PDFDocFactory.h \ + PopplerCache.h \ + ProfileData.h \ + PreScanOutputDev.h \ + PSTokenizer.h \ + Rendition.h \ + StdinCachedFile.h \ + StdinPDFDocBuilder.h \ + Stream-CCITT.h \ + Stream.h \ + UnicodeMap.h \ + UnicodeMapTables.h \ + UnicodeTypeTable.h \ + UnicodeCClassTables.h \ + UnicodeCompTables.h \ + UnicodeDecompTables.h \ + ViewerPreferences.h \ + XRef.h \ + CharTypes.h \ + CompactFontTables.h \ + ErrorCodes.h \ + NameToUnicodeTable.h \ + PSOutputDev.h \ + TextOutputDev.h \ + SecurityHandler.h \ + UTF8.h \ + XpdfPluginAPI.h \ + Sound.h +nodist_poppler_include_HEADERS = poppler-config.h + +endif + +libpoppler_la_SOURCES = \ + $(splash_sources) \ + $(cairo_sources) \ + $(arthur_sources) \ + $(libjpeg_sources) \ + $(zlib_sources) \ + $(libjpeg2000_sources) \ + $(curl_sources) \ + Annot.cc \ + Array.cc \ + BuiltinFont.cc \ + BuiltinFontTables.cc \ + CachedFile.cc \ + Catalog.cc \ + CharCodeToUnicode.cc \ + CMap.cc \ + DateInfo.cc \ + Decrypt.cc \ + Dict.cc \ + Error.cc \ + FileSpec.cc \ + FontEncodingTables.cc \ + Form.cc \ + FontInfo.cc \ + Function.cc \ + Gfx.cc \ + GfxFont.cc \ + GfxState.cc \ + GlobalParams.cc \ + Hints.cc \ + JArithmeticDecoder.cc \ + JBIG2Stream.cc \ + Lexer.cc \ + Linearization.cc \ + Link.cc \ + LocalPDFDocBuilder.cc \ + Movie.cc \ + NameToCharCode.cc \ + Object.cc \ + OptionalContent.cc \ + Outline.cc \ + OutputDev.cc \ + Page.cc \ + PageTransition.cc \ + Parser.cc \ + PDFDoc.cc \ + PDFDocEncoding.cc \ + PDFDocFactory.cc \ + PopplerCache.cc \ + ProfileData.cc \ + PreScanOutputDev.cc \ + PSTokenizer.cc \ + Rendition.cc \ + StdinCachedFile.cc \ + StdinPDFDocBuilder.cc \ + Stream.cc \ + strtok_r.cpp \ + UnicodeMap.cc \ + UnicodeTypeTable.cc \ + ViewerPreferences.cc \ + XRef.cc \ + PSOutputDev.cc \ + TextOutputDev.cc \ + PageLabelInfo.h \ + PageLabelInfo.cc \ + SecurityHandler.cc \ + Sound.cc \ + XpdfPluginAPI.cc + +EXTRA_DIST = gen-unicode-tables.py \ + GlobalParamsWin.cc diff --git a/poppler/Makefile.in b/poppler/Makefile.in new file mode 100644 index 0000000..a10eb7b --- /dev/null +++ b/poppler/Makefile.in @@ -0,0 +1,1224 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = poppler +DIST_COMMON = $(am__poppler_include_HEADERS_DIST) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/poppler-config.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(poppler_includedir)" \ + "$(DESTDIR)$(poppler_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +libpoppler_arthur_la_LIBADD = +am__libpoppler_arthur_la_SOURCES_DIST = ArthurOutputDev.h \ + ArthurOutputDev.cc +@BUILD_POPPLER_QT4_TRUE@am_libpoppler_arthur_la_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ ArthurOutputDev.lo +libpoppler_arthur_la_OBJECTS = $(am_libpoppler_arthur_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +@BUILD_POPPLER_QT4_TRUE@am_libpoppler_arthur_la_rpath = +libpoppler_cairo_la_LIBADD = +am__libpoppler_cairo_la_SOURCES_DIST = CairoFontEngine.cc \ + CairoFontEngine.h CairoOutputDev.cc CairoOutputDev.h \ + CairoRescaleBox.cc CairoRescaleBox.h +@BUILD_CAIRO_OUTPUT_TRUE@am_libpoppler_cairo_la_OBJECTS = \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoFontEngine.lo CairoOutputDev.lo \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoRescaleBox.lo +libpoppler_cairo_la_OBJECTS = $(am_libpoppler_cairo_la_OBJECTS) +@BUILD_CAIRO_OUTPUT_TRUE@am_libpoppler_cairo_la_rpath = +am__DEPENDENCIES_1 = +@USE_CMS_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +@BUILD_SPLASH_OUTPUT_TRUE@am__DEPENDENCIES_3 = \ +@BUILD_SPLASH_OUTPUT_TRUE@ $(top_builddir)/splash/libsplash.la +@BUILD_LIBTIFF_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) +@BUILD_LIBJPEG_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) +@BUILD_LIBPNG_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) +@BUILD_ZLIB_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1) +@BUILD_LIBCURL_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1) +@BUILD_LIBOPENJPEG_TRUE@am__DEPENDENCIES_9 = $(am__DEPENDENCIES_1) +libpoppler_la_DEPENDENCIES = $(top_builddir)/goo/libgoo.la \ + $(top_builddir)/fofi/libfofi.la $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_4) \ + $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \ + $(am__DEPENDENCIES_7) $(am__DEPENDENCIES_8) \ + $(am__DEPENDENCIES_9) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__libpoppler_la_SOURCES_DIST = SplashOutputDev.cc DCTStream.h \ + DCTStream.cc FlateStream.h FlateStream.cc JPXStream.h \ + JPXStream.cc JPEG2000Stream.h JPEG2000Stream.cc \ + CurlCachedFile.cc CurlPDFDocBuilder.cc Annot.cc Array.cc \ + BuiltinFont.cc BuiltinFontTables.cc CachedFile.cc Catalog.cc \ + CharCodeToUnicode.cc CMap.cc DateInfo.cc Decrypt.cc Dict.cc \ + Error.cc FileSpec.cc FontEncodingTables.cc Form.cc FontInfo.cc \ + Function.cc Gfx.cc GfxFont.cc GfxState.cc GlobalParams.cc \ + Hints.cc JArithmeticDecoder.cc JBIG2Stream.cc Lexer.cc \ + Linearization.cc Link.cc LocalPDFDocBuilder.cc Movie.cc \ + NameToCharCode.cc Object.cc OptionalContent.cc Outline.cc \ + OutputDev.cc Page.cc PageTransition.cc Parser.cc PDFDoc.cc \ + PDFDocEncoding.cc PDFDocFactory.cc PopplerCache.cc \ + ProfileData.cc PreScanOutputDev.cc PSTokenizer.cc Rendition.cc \ + StdinCachedFile.cc StdinPDFDocBuilder.cc Stream.cc \ + strtok_r.cpp UnicodeMap.cc UnicodeTypeTable.cc \ + ViewerPreferences.cc XRef.cc PSOutputDev.cc TextOutputDev.cc \ + PageLabelInfo.h PageLabelInfo.cc SecurityHandler.cc Sound.cc \ + XpdfPluginAPI.cc +@BUILD_SPLASH_OUTPUT_TRUE@am__objects_1 = SplashOutputDev.lo +@BUILD_LIBJPEG_TRUE@am__objects_2 = DCTStream.lo +@BUILD_ZLIB_TRUE@am__objects_3 = FlateStream.lo +@BUILD_LIBOPENJPEG_FALSE@am__objects_4 = JPXStream.lo +@BUILD_LIBOPENJPEG_TRUE@am__objects_4 = JPEG2000Stream.lo +@BUILD_LIBCURL_TRUE@am__objects_5 = CurlCachedFile.lo \ +@BUILD_LIBCURL_TRUE@ CurlPDFDocBuilder.lo +am_libpoppler_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) Annot.lo \ + Array.lo BuiltinFont.lo BuiltinFontTables.lo CachedFile.lo \ + Catalog.lo CharCodeToUnicode.lo CMap.lo DateInfo.lo Decrypt.lo \ + Dict.lo Error.lo FileSpec.lo FontEncodingTables.lo Form.lo \ + FontInfo.lo Function.lo Gfx.lo GfxFont.lo GfxState.lo \ + GlobalParams.lo Hints.lo JArithmeticDecoder.lo JBIG2Stream.lo \ + Lexer.lo Linearization.lo Link.lo LocalPDFDocBuilder.lo \ + Movie.lo NameToCharCode.lo Object.lo OptionalContent.lo \ + Outline.lo OutputDev.lo Page.lo PageTransition.lo Parser.lo \ + PDFDoc.lo PDFDocEncoding.lo PDFDocFactory.lo PopplerCache.lo \ + ProfileData.lo PreScanOutputDev.lo PSTokenizer.lo Rendition.lo \ + StdinCachedFile.lo StdinPDFDocBuilder.lo Stream.lo strtok_r.lo \ + UnicodeMap.lo UnicodeTypeTable.lo ViewerPreferences.lo XRef.lo \ + PSOutputDev.lo TextOutputDev.lo PageLabelInfo.lo \ + SecurityHandler.lo Sound.lo XpdfPluginAPI.lo +libpoppler_la_OBJECTS = $(am_libpoppler_la_OBJECTS) +libpoppler_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(libpoppler_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libpoppler_arthur_la_SOURCES) \ + $(libpoppler_cairo_la_SOURCES) $(libpoppler_la_SOURCES) +DIST_SOURCES = $(am__libpoppler_arthur_la_SOURCES_DIST) \ + $(am__libpoppler_cairo_la_SOURCES_DIST) \ + $(am__libpoppler_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__poppler_include_HEADERS_DIST = SplashOutputDev.h CurlCachedFile.h \ + CurlPDFDocBuilder.h Annot.h Array.h BuiltinFont.h \ + BuiltinFontTables.h CachedFile.h Catalog.h CharCodeToUnicode.h \ + CMap.h DateInfo.h Decrypt.h Dict.h Error.h FileSpec.h \ + FontEncodingTables.h FontInfo.h Form.h Function.h Gfx.h \ + GfxFont.h GfxState.h GfxState_helpers.h GlobalParams.h Hints.h \ + JArithmeticDecoder.h JBIG2Stream.h Lexer.h Linearization.h \ + Link.h LocalPDFDocBuilder.h Movie.h NameToCharCode.h Object.h \ + OptionalContent.h Outline.h OutputDev.h Page.h \ + PageTransition.h Parser.h PDFDoc.h PDFDocBuilder.h \ + PDFDocEncoding.h PDFDocFactory.h PopplerCache.h ProfileData.h \ + PreScanOutputDev.h PSTokenizer.h Rendition.h StdinCachedFile.h \ + StdinPDFDocBuilder.h Stream-CCITT.h Stream.h UnicodeMap.h \ + UnicodeMapTables.h UnicodeTypeTable.h UnicodeCClassTables.h \ + UnicodeCompTables.h UnicodeDecompTables.h ViewerPreferences.h \ + XRef.h CharTypes.h CompactFontTables.h ErrorCodes.h \ + NameToUnicodeTable.h PSOutputDev.h TextOutputDev.h \ + SecurityHandler.h UTF8.h XpdfPluginAPI.h Sound.h +HEADERS = $(nodist_poppler_include_HEADERS) $(poppler_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ $(PTHREAD_CFLAGS) +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ $(PTHREAD_CFLAGS) +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +@BUILD_SPLASH_OUTPUT_TRUE@splash_sources = \ +@BUILD_SPLASH_OUTPUT_TRUE@ SplashOutputDev.cc + +@BUILD_SPLASH_OUTPUT_TRUE@splash_headers = \ +@BUILD_SPLASH_OUTPUT_TRUE@ SplashOutputDev.h + +@BUILD_SPLASH_OUTPUT_TRUE@splash_includes = \ +@BUILD_SPLASH_OUTPUT_TRUE@ $(SPLASH_CFLAGS) + +@BUILD_SPLASH_OUTPUT_TRUE@splash_libs = \ +@BUILD_SPLASH_OUTPUT_TRUE@ $(SPLASH_LIBS) \ +@BUILD_SPLASH_OUTPUT_TRUE@ $(top_builddir)/splash/libsplash.la + +@BUILD_POPPLER_QT4_TRUE@poppler_arthur = libpoppler-arthur.la +@BUILD_POPPLER_QT4_TRUE@libpoppler_arthur_la_SOURCES = \ +@BUILD_POPPLER_QT4_TRUE@ ArthurOutputDev.h \ +@BUILD_POPPLER_QT4_TRUE@ ArthurOutputDev.cc + +@BUILD_POPPLER_QT4_TRUE@arthur_includes = \ +@BUILD_POPPLER_QT4_TRUE@ $(POPPLER_QT4_CFLAGS) + +@BUILD_POPPLER_QT4_TRUE@arthur_libs = \ +@BUILD_POPPLER_QT4_TRUE@ $(POPPLER_QT4_LIBS) + +@BUILD_CAIRO_OUTPUT_TRUE@poppler_cairo = libpoppler-cairo.la +@BUILD_CAIRO_OUTPUT_TRUE@cairo_includes = \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(CAIRO_CFLAGS) + +@BUILD_CAIRO_OUTPUT_TRUE@cairo_libs = \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(CAIRO_LIBS) + +@BUILD_CAIRO_OUTPUT_TRUE@libpoppler_cairo_la_SOURCES = \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoFontEngine.cc \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoFontEngine.h \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoOutputDev.cc \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoOutputDev.h \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoRescaleBox.cc \ +@BUILD_CAIRO_OUTPUT_TRUE@ CairoRescaleBox.h + +@BUILD_LIBJPEG_TRUE@libjpeg_sources = \ +@BUILD_LIBJPEG_TRUE@ DCTStream.h \ +@BUILD_LIBJPEG_TRUE@ DCTStream.cc + +@BUILD_LIBJPEG_TRUE@libjpeg_libs = \ +@BUILD_LIBJPEG_TRUE@ $(LIBJPEG_LIBS) + +@BUILD_LIBJPEG_TRUE@libjpeg_includes = \ +@BUILD_LIBJPEG_TRUE@ $(LIBJPEG_CFLAGS) + +@BUILD_LIBPNG_TRUE@libpng_libs = \ +@BUILD_LIBPNG_TRUE@ $(LIBPNG_LIBS) + +@BUILD_LIBPNG_TRUE@libpng_includes = \ +@BUILD_LIBPNG_TRUE@ $(LIBPNG_CFLAGS) + +@BUILD_LIBTIFF_TRUE@libtiff_libs = \ +@BUILD_LIBTIFF_TRUE@ $(LIBTIFF_LIBS) + +@BUILD_LIBTIFF_TRUE@libtiff_includes = \ +@BUILD_LIBTIFF_TRUE@ $(LIBTIFF_CFLAGS) + +@BUILD_LIBOPENJPEG_FALSE@libjpeg2000_sources = \ +@BUILD_LIBOPENJPEG_FALSE@ JPXStream.h \ +@BUILD_LIBOPENJPEG_FALSE@ JPXStream.cc + +@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_sources = \ +@BUILD_LIBOPENJPEG_TRUE@ JPEG2000Stream.h \ +@BUILD_LIBOPENJPEG_TRUE@ JPEG2000Stream.cc + +@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_libs = \ +@BUILD_LIBOPENJPEG_TRUE@ $(LIBOPENJPEG_LIBS) + +@BUILD_LIBOPENJPEG_TRUE@libjpeg2000_includes = \ +@BUILD_LIBOPENJPEG_TRUE@ $(LIBOPENJPEG_CFLAGS) + +@BUILD_ZLIB_TRUE@zlib_sources = \ +@BUILD_ZLIB_TRUE@ FlateStream.h \ +@BUILD_ZLIB_TRUE@ FlateStream.cc + +@BUILD_ZLIB_TRUE@zlib_libs = \ +@BUILD_ZLIB_TRUE@ $(ZLIB_LIBS) + +@BUILD_LIBCURL_TRUE@libcurl_libs = \ +@BUILD_LIBCURL_TRUE@ $(LIBCURL_LIBS) + +@BUILD_LIBCURL_TRUE@libcurl_includes = \ +@BUILD_LIBCURL_TRUE@ $(LIBCURL_CFLAGS) + +@BUILD_LIBCURL_TRUE@curl_headers = \ +@BUILD_LIBCURL_TRUE@ CurlCachedFile.h \ +@BUILD_LIBCURL_TRUE@ CurlPDFDocBuilder.h + +@BUILD_LIBCURL_TRUE@curl_sources = \ +@BUILD_LIBCURL_TRUE@ CurlCachedFile.cc \ +@BUILD_LIBCURL_TRUE@ CurlPDFDocBuilder.cc + +@USE_CMS_TRUE@cms_includes = $(LCMS_CFLAGS) +@USE_CMS_TRUE@cms_libs = $(LCMS_LIBS) +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + $(cms_includes) \ + $(splash_includes) \ + $(cairo_includes) \ + $(arthur_includes) \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) \ + $(libcurl_includes) \ + $(FREETYPE_CFLAGS) \ + $(FONTCONFIG_CFLAGS) + +lib_LTLIBRARIES = libpoppler.la +noinst_LTLIBRARIES = $(poppler_cairo) \ + $(poppler_arthur) + +libpoppler_la_LIBADD = \ + $(top_builddir)/goo/libgoo.la \ + $(top_builddir)/fofi/libfofi.la \ + $(cms_libs) \ + $(splash_libs) \ + $(libtiff_libs) \ + $(libjpeg_libs) \ + $(libpng_libs) \ + $(zlib_libs) \ + $(libcurl_libs) \ + $(libjpeg2000_libs) \ + $(FREETYPE_LIBS) \ + $(FONTCONFIG_LIBS) \ + $(PTHREAD_LIBS) \ + $(win32_libs) + +libpoppler_la_LDFLAGS = -version-info 25:0:0 @create_shared_lib@ @auto_import_flags@ +@ENABLE_XPDF_HEADERS_TRUE@poppler_includedir = $(includedir)/poppler +@ENABLE_XPDF_HEADERS_TRUE@poppler_include_HEADERS = \ +@ENABLE_XPDF_HEADERS_TRUE@ $(splash_headers) \ +@ENABLE_XPDF_HEADERS_TRUE@ $(curl_headers) \ +@ENABLE_XPDF_HEADERS_TRUE@ Annot.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Array.h \ +@ENABLE_XPDF_HEADERS_TRUE@ BuiltinFont.h \ +@ENABLE_XPDF_HEADERS_TRUE@ BuiltinFontTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ CachedFile.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Catalog.h \ +@ENABLE_XPDF_HEADERS_TRUE@ CharCodeToUnicode.h \ +@ENABLE_XPDF_HEADERS_TRUE@ CMap.h \ +@ENABLE_XPDF_HEADERS_TRUE@ DateInfo.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Decrypt.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Dict.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Error.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FileSpec.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FontEncodingTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ FontInfo.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Form.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Function.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Gfx.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GfxFont.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GfxState.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GfxState_helpers.h \ +@ENABLE_XPDF_HEADERS_TRUE@ GlobalParams.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Hints.h \ +@ENABLE_XPDF_HEADERS_TRUE@ JArithmeticDecoder.h \ +@ENABLE_XPDF_HEADERS_TRUE@ JBIG2Stream.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Lexer.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Linearization.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Link.h \ +@ENABLE_XPDF_HEADERS_TRUE@ LocalPDFDocBuilder.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Movie.h \ +@ENABLE_XPDF_HEADERS_TRUE@ NameToCharCode.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Object.h \ +@ENABLE_XPDF_HEADERS_TRUE@ OptionalContent.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Outline.h \ +@ENABLE_XPDF_HEADERS_TRUE@ OutputDev.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Page.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PageTransition.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Parser.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PDFDoc.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PDFDocBuilder.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PDFDocEncoding.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PDFDocFactory.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PopplerCache.h \ +@ENABLE_XPDF_HEADERS_TRUE@ ProfileData.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PreScanOutputDev.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PSTokenizer.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Rendition.h \ +@ENABLE_XPDF_HEADERS_TRUE@ StdinCachedFile.h \ +@ENABLE_XPDF_HEADERS_TRUE@ StdinPDFDocBuilder.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Stream-CCITT.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Stream.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UnicodeMap.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UnicodeMapTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UnicodeTypeTable.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UnicodeCClassTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UnicodeCompTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UnicodeDecompTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ ViewerPreferences.h \ +@ENABLE_XPDF_HEADERS_TRUE@ XRef.h \ +@ENABLE_XPDF_HEADERS_TRUE@ CharTypes.h \ +@ENABLE_XPDF_HEADERS_TRUE@ CompactFontTables.h \ +@ENABLE_XPDF_HEADERS_TRUE@ ErrorCodes.h \ +@ENABLE_XPDF_HEADERS_TRUE@ NameToUnicodeTable.h \ +@ENABLE_XPDF_HEADERS_TRUE@ PSOutputDev.h \ +@ENABLE_XPDF_HEADERS_TRUE@ TextOutputDev.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SecurityHandler.h \ +@ENABLE_XPDF_HEADERS_TRUE@ UTF8.h \ +@ENABLE_XPDF_HEADERS_TRUE@ XpdfPluginAPI.h \ +@ENABLE_XPDF_HEADERS_TRUE@ Sound.h + +@ENABLE_XPDF_HEADERS_TRUE@nodist_poppler_include_HEADERS = poppler-config.h +libpoppler_la_SOURCES = \ + $(splash_sources) \ + $(cairo_sources) \ + $(arthur_sources) \ + $(libjpeg_sources) \ + $(zlib_sources) \ + $(libjpeg2000_sources) \ + $(curl_sources) \ + Annot.cc \ + Array.cc \ + BuiltinFont.cc \ + BuiltinFontTables.cc \ + CachedFile.cc \ + Catalog.cc \ + CharCodeToUnicode.cc \ + CMap.cc \ + DateInfo.cc \ + Decrypt.cc \ + Dict.cc \ + Error.cc \ + FileSpec.cc \ + FontEncodingTables.cc \ + Form.cc \ + FontInfo.cc \ + Function.cc \ + Gfx.cc \ + GfxFont.cc \ + GfxState.cc \ + GlobalParams.cc \ + Hints.cc \ + JArithmeticDecoder.cc \ + JBIG2Stream.cc \ + Lexer.cc \ + Linearization.cc \ + Link.cc \ + LocalPDFDocBuilder.cc \ + Movie.cc \ + NameToCharCode.cc \ + Object.cc \ + OptionalContent.cc \ + Outline.cc \ + OutputDev.cc \ + Page.cc \ + PageTransition.cc \ + Parser.cc \ + PDFDoc.cc \ + PDFDocEncoding.cc \ + PDFDocFactory.cc \ + PopplerCache.cc \ + ProfileData.cc \ + PreScanOutputDev.cc \ + PSTokenizer.cc \ + Rendition.cc \ + StdinCachedFile.cc \ + StdinPDFDocBuilder.cc \ + Stream.cc \ + strtok_r.cpp \ + UnicodeMap.cc \ + UnicodeTypeTable.cc \ + ViewerPreferences.cc \ + XRef.cc \ + PSOutputDev.cc \ + TextOutputDev.cc \ + PageLabelInfo.h \ + PageLabelInfo.cc \ + SecurityHandler.cc \ + Sound.cc \ + XpdfPluginAPI.cc + +EXTRA_DIST = gen-unicode-tables.py \ + GlobalParamsWin.cc + +all: poppler-config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cc .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign poppler/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign poppler/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +poppler-config.h: stamp-h2 + @if test ! -f $@; then rm -f stamp-h2; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h2; else :; fi + +stamp-h2: $(srcdir)/poppler-config.h.in $(top_builddir)/config.status + @rm -f stamp-h2 + cd $(top_builddir) && $(SHELL) ./config.status poppler/poppler-config.h +$(srcdir)/poppler-config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h2 + touch $@ + +distclean-hdr: + -rm -f poppler-config.h stamp-h2 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libpoppler-arthur.la: $(libpoppler_arthur_la_OBJECTS) $(libpoppler_arthur_la_DEPENDENCIES) $(EXTRA_libpoppler_arthur_la_DEPENDENCIES) + $(AM_V_CXXLD)$(CXXLINK) $(am_libpoppler_arthur_la_rpath) $(libpoppler_arthur_la_OBJECTS) $(libpoppler_arthur_la_LIBADD) $(LIBS) +libpoppler-cairo.la: $(libpoppler_cairo_la_OBJECTS) $(libpoppler_cairo_la_DEPENDENCIES) $(EXTRA_libpoppler_cairo_la_DEPENDENCIES) + $(AM_V_CXXLD)$(CXXLINK) $(am_libpoppler_cairo_la_rpath) $(libpoppler_cairo_la_OBJECTS) $(libpoppler_cairo_la_LIBADD) $(LIBS) +libpoppler.la: $(libpoppler_la_OBJECTS) $(libpoppler_la_DEPENDENCIES) $(EXTRA_libpoppler_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libpoppler_la_LINK) -rpath $(libdir) $(libpoppler_la_OBJECTS) $(libpoppler_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Annot.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Array.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ArthurOutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BuiltinFont.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BuiltinFontTables.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CachedFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CairoFontEngine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CairoOutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CairoRescaleBox.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Catalog.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CharCodeToUnicode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CurlCachedFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CurlPDFDocBuilder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DCTStream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DateInfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Decrypt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Dict.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Error.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileSpec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FlateStream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontEncodingTables.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontInfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Form.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Function.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Gfx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GfxFont.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GfxState.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GlobalParams.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Hints.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JArithmeticDecoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JBIG2Stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JPEG2000Stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JPXStream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Lexer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Linearization.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Link.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LocalPDFDocBuilder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Movie.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NameToCharCode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionalContent.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Outline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFDoc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFDocEncoding.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFDocFactory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSOutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSTokenizer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Page.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageLabelInfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageTransition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PopplerCache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PreScanOutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ProfileData.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Rendition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SecurityHandler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sound.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashOutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdinCachedFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdinPDFDocBuilder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextOutputDev.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnicodeMap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnicodeTypeTable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ViewerPreferences.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XRef.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XpdfPluginAPI.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_poppler_includeHEADERS: $(nodist_poppler_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \ + done + +uninstall-nodist_poppler_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir) +install-poppler_includeHEADERS: $(poppler_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \ + done + +uninstall-poppler_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) poppler-config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) poppler-config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) poppler-config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) poppler-config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) poppler-config.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(poppler_includedir)" "$(DESTDIR)$(poppler_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nodist_poppler_includeHEADERS \ + install-poppler_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES \ + uninstall-nodist_poppler_includeHEADERS \ + uninstall-poppler_includeHEADERS + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-nodist_poppler_includeHEADERS install-pdf \ + install-pdf-am install-poppler_includeHEADERS install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-libLTLIBRARIES \ + uninstall-nodist_poppler_includeHEADERS \ + uninstall-poppler_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/poppler/Movie.cc b/poppler/Movie.cc new file mode 100644 index 0000000..f68b6ad --- /dev/null +++ b/poppler/Movie.cc @@ -0,0 +1,285 @@ +//********************************************************************************* +// Movie.cc +//--------------------------------------------------------------------------------- +// +//--------------------------------------------------------------------------------- +// Hugo Mercier (c) 2008 +// Pino Toscano (c) 2008 +// Carlos Garcia Campos (c) 2010 +// Albert Astals Cid (c) 2010 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//********************************************************************************* + +#include +#include "Movie.h" +#include "FileSpec.h" + +MovieActivationParameters::MovieActivationParameters() { + // default values + floatingWindow = gFalse; + xPosition = 0.5; + yPosition = 0.5; + rate = 1.0; + volume = 100; + showControls = gFalse; + synchronousPlay = gFalse; + repeatMode = repeatModeOnce; + start.units = 0; + duration.units = 0; + znum = 1; + zdenum = 1; +} + +MovieActivationParameters::~MovieActivationParameters() { +} + +void MovieActivationParameters::parseMovieActivation(Object* aDict) { + Object obj1; + + if (!aDict->dictLookup("Start", &obj1)->isNull()) { + if (obj1.isInt()) { + // If it is representable as an integer (subject to the implementation limit for + // integers, as described in Appendix C), it should be specified as such. + + start.units = obj1.getInt(); + } else if (obj1.isString()) { + // If it is not representable as an integer, it should be specified as an 8-byte + // string representing a 64-bit twos-complement integer, most significant + // byte first. + + // UNSUPPORTED + } else if (obj1.isArray()) { + Array* a = obj1.getArray(); + + Object tmp; + a->get(0, &tmp); + if (tmp.isInt()) { + start.units = tmp.getInt(); + } + if (tmp.isString()) { + // UNSUPPORTED + } + tmp.free(); + + a->get(1, &tmp); + if (tmp.isInt()) { + start.units_per_second = tmp.getInt(); + } + tmp.free(); + } + } + obj1.free(); + + if (!aDict->dictLookup("Duration", &obj1)->isNull()) { + if (obj1.isInt()) { + duration.units = obj1.getInt(); + } else if (obj1.isString()) { + // UNSUPPORTED + } else if (obj1.isArray()) { + Array* a = obj1.getArray(); + + Object tmp; + a->get(0, &tmp); + if (tmp.isInt()) { + duration.units = tmp.getInt(); + } + if (tmp.isString()) { + // UNSUPPORTED + } + tmp.free(); + + a->get(1, &tmp); + if (tmp.isInt()) { + duration.units_per_second = tmp.getInt(); + } + tmp.free(); + } + } + obj1.free(); + + if (aDict->dictLookup("Rate", &obj1)->isNum()) { + rate = obj1.getNum(); + } + obj1.free(); + + if (aDict->dictLookup("Volume", &obj1)->isNum()) { + // convert volume to [0 100] + volume = int((obj1.getNum() + 1.0) * 50); + } + obj1.free(); + + if (aDict->dictLookup("ShowControls", &obj1)->isBool()) { + showControls = obj1.getBool(); + } + obj1.free(); + + if (aDict->dictLookup("Synchronous", &obj1)->isBool()) { + synchronousPlay = obj1.getBool(); + } + obj1.free(); + + if (aDict->dictLookup("Mode", &obj1)->isName()) { + char* name = obj1.getName(); + if (!strcmp(name, "Once")) { + repeatMode = repeatModeOnce; + } else if (!strcmp(name, "Open")) { + repeatMode = repeatModeOpen; + } else if (!strcmp(name, "Repeat")) { + repeatMode = repeatModeRepeat; + } else if (!strcmp(name,"Palindrome")) { + repeatMode = repeatModePalindrome; + } + } + obj1.free(); + + if (aDict->dictLookup("FWScale", &obj1)->isArray()) { + // the presence of that entry implies that the movie is to be played + // in a floating window + floatingWindow = gTrue; + + Array* scale = obj1.getArray(); + if (scale->getLength() >= 2) { + Object tmp; + if (scale->get(0, &tmp)->isInt()) { + znum = tmp.getInt(); + } + tmp.free(); + if (scale->get(1, &tmp)->isInt()) { + zdenum = tmp.getInt(); + } + tmp.free(); + } + } + obj1.free(); + + if (aDict->dictLookup("FWPosition", &obj1)->isArray()) { + Array* pos = obj1.getArray(); + if (pos->getLength() >= 2) { + Object tmp; + if (pos->get(0, &tmp)->isNum()) { + xPosition = tmp.getNum(); + } + tmp.free(); + if (pos->get(1, &tmp)->isNum()) { + yPosition = tmp.getNum(); + } + tmp.free(); + } + } + obj1.free(); +} + +void Movie::parseMovie (Object *movieDict) { + fileName = NULL; + rotationAngle = 0; + width = -1; + height = -1; + showPoster = gFalse; + + Object obj1, obj2; + if (getFileSpecNameForPlatform(movieDict->dictLookup("F", &obj1), &obj2)) { + fileName = obj2.getString()->copy(); + obj2.free(); + } else { + error (errSyntaxError, -1, "Invalid Movie"); + ok = gFalse; + obj1.free(); + return; + } + obj1.free(); + + if (movieDict->dictLookup("Aspect", &obj1)->isArray()) { + Array* aspect = obj1.getArray(); + if (aspect->getLength() >= 2) { + Object tmp; + if( aspect->get(0, &tmp)->isNum() ) { + width = (int)floor( aspect->get(0, &tmp)->getNum() + 0.5 ); + } + tmp.free(); + if( aspect->get(1, &tmp)->isNum() ) { + height = (int)floor( aspect->get(1, &tmp)->getNum() + 0.5 ); + } + tmp.free(); + } + } + obj1.free(); + + if (movieDict->dictLookup("Rotate", &obj1)->isInt()) { + // round up to 90° + rotationAngle = (((obj1.getInt() + 360) % 360) % 90) * 90; + } + obj1.free(); + + // + // movie poster + // + if (!movieDict->dictLookupNF("Poster", &poster)->isNull()) { + if (poster.isRef() || poster.isStream()) { + showPoster = gTrue; + } else if (poster.isBool()) { + showPoster = poster.getBool(); + poster.free(); + } else { + poster.free(); + } + } +} + +Movie::~Movie() { + if (fileName) + delete fileName; + poster.free(); +} + +Movie::Movie(Object *movieDict) { + ok = gTrue; + + if (movieDict->isDict()) + parseMovie(movieDict); + else + ok = gFalse; +} + +Movie::Movie(Object *movieDict, Object *aDict) { + ok = gTrue; + + if (movieDict->isDict()) { + parseMovie(movieDict); + if (aDict->isDict()) + MA.parseMovieActivation(aDict); + } else { + ok = gFalse; + } +} + +void Movie::getFloatingWindowSize(int *widthA, int *heightA) +{ + *widthA = int(width * double(MA.znum) / MA.zdenum); + *heightA = int(height * double(MA.znum) / MA.zdenum); +} + +Movie* Movie::copy() { + + // call default copy constructor + Movie* new_movie = new Movie(*this); + + if (fileName) + new_movie->fileName = fileName->copy(); + + poster.copy(&new_movie->poster); + + return new_movie; +} diff --git a/poppler/Movie.h b/poppler/Movie.h new file mode 100644 index 0000000..1a16265 --- /dev/null +++ b/poppler/Movie.h @@ -0,0 +1,110 @@ +//********************************************************************************* +// Movie.h +//--------------------------------------------------------------------------------- +// +//--------------------------------------------------------------------------------- +// Hugo Mercier (c) 2008 +// Carlos Garcia Campos (c) 2010 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//********************************************************************************* + +#ifndef _MOVIE_H_ +#define _MOVIE_H_ + +#include "Object.h" + +struct MovieActivationParameters { + + MovieActivationParameters(); + ~MovieActivationParameters(); + + // parse from a "Movie Activation" dictionary + void parseMovieActivation(Object* actObj); + + enum MovieRepeatMode { + repeatModeOnce, + repeatModeOpen, + repeatModeRepeat, + repeatModePalindrome + }; + + struct MovieTime { + MovieTime() { units_per_second = 0; } + Gulong units; + int units_per_second; // 0 : defined by movie + }; + + MovieTime start; // 0 + MovieTime duration; // 0 + + double rate; // 1.0 + + int volume; // 100 + + GBool showControls; // false + + GBool synchronousPlay; // false + MovieRepeatMode repeatMode; // repeatModeOnce + + // floating window position + GBool floatingWindow; + double xPosition; // 0.5 + double yPosition; // 0.5 + int znum; // 1 + int zdenum; // 1 +}; + +class Movie { + public: + Movie(Object *objMovie, Object *objAct); + Movie(Object *objMovie); + ~Movie(); + + GBool isOk() { return ok; } + MovieActivationParameters* getActivationParameters() { return &MA; } + + GooString* getFileName() { return fileName; } + + Gushort getRotationAngle() { return rotationAngle; } + void getAspect (int *widthA, int *heightA) { *widthA = width; *heightA = height; } + + Object *getPoster(Object *obj) { return poster.copy(obj); } + GBool getShowPoster() { return showPoster; } + + GBool getUseFloatingWindow() { return MA.floatingWindow; } + void getFloatingWindowSize(int *width, int *height); + + Movie* copy(); + + private: + void parseMovie (Object *movieDict); + + GBool ok; + + Gushort rotationAngle; // 0 + int width; // Aspect + int height; // Aspect + + Object poster; + GBool showPoster; + + GooString* fileName; + + MovieActivationParameters MA; +}; + +#endif + diff --git a/poppler/NameToCharCode.cc b/poppler/NameToCharCode.cc new file mode 100644 index 0000000..5448dc4 --- /dev/null +++ b/poppler/NameToCharCode.cc @@ -0,0 +1,116 @@ +//======================================================================== +// +// NameToCharCode.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "goo/gmem.h" +#include "NameToCharCode.h" + +//------------------------------------------------------------------------ + +struct NameToCharCodeEntry { + char *name; + CharCode c; +}; + +//------------------------------------------------------------------------ + +NameToCharCode::NameToCharCode() { + int i; + + size = 31; + len = 0; + tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry)); + for (i = 0; i < size; ++i) { + tab[i].name = NULL; + } +} + +NameToCharCode::~NameToCharCode() { + int i; + + for (i = 0; i < size; ++i) { + if (tab[i].name) { + gfree(tab[i].name); + } + } + gfree(tab); +} + +void NameToCharCode::add(const char *name, CharCode c) { + NameToCharCodeEntry *oldTab; + int h, i, oldSize; + + // expand the table if necessary + if (len >= size / 2) { + oldSize = size; + oldTab = tab; + size = 2*size + 1; + tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry)); + for (h = 0; h < size; ++h) { + tab[h].name = NULL; + } + for (i = 0; i < oldSize; ++i) { + if (oldTab[i].name) { + h = hash(oldTab[i].name); + while (tab[h].name) { + if (++h == size) { + h = 0; + } + } + tab[h] = oldTab[i]; + } + } + gfree(oldTab); + } + + // add the new name + h = hash(name); + while (tab[h].name && strcmp(tab[h].name, name)) { + if (++h == size) { + h = 0; + } + } + if (!tab[h].name) { + tab[h].name = copyString(name); + } + tab[h].c = c; + + ++len; +} + +CharCode NameToCharCode::lookup(const char *name) { + int h; + + h = hash(name); + while (tab[h].name) { + if (!strcmp(tab[h].name, name)) { + return tab[h].c; + } + if (++h == size) { + h = 0; + } + } + return 0; +} + +int NameToCharCode::hash(const char *name) { + const char *p; + unsigned int h; + + h = 0; + for (p = name; *p; ++p) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} diff --git a/poppler/NameToCharCode.h b/poppler/NameToCharCode.h new file mode 100644 index 0000000..5b1092b --- /dev/null +++ b/poppler/NameToCharCode.h @@ -0,0 +1,40 @@ +//======================================================================== +// +// NameToCharCode.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef NAMETOCHARCODE_H +#define NAMETOCHARCODE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "CharTypes.h" + +struct NameToCharCodeEntry; + +//------------------------------------------------------------------------ + +class NameToCharCode { +public: + + NameToCharCode(); + ~NameToCharCode(); + + void add(const char *name, CharCode c); + CharCode lookup(const char *name); + +private: + + int hash(const char *name); + + NameToCharCodeEntry *tab; + int size; + int len; +}; + +#endif diff --git a/poppler/NameToUnicodeTable.h b/poppler/NameToUnicodeTable.h new file mode 100644 index 0000000..74645ab --- /dev/null +++ b/poppler/NameToUnicodeTable.h @@ -0,0 +1,4475 @@ +//======================================================================== +// +// NameToUnicodeTable.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2011, 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "CharTypes.h" + +#include + +static struct { + Unicode u; + const char *name; +} nameToUnicodeTab[] = { + {0x0021, "!"}, + {0x0023, "#"}, + {0x0024, "$"}, + {0x0025, "%"}, + {0x0026, "&"}, + {0x0027, "'"}, + {0x0028, "("}, + {0x0029, ")"}, + {0x002a, "*"}, + {0x002b, "+"}, + {0x002c, ","}, + {0x002d, "-"}, + {0x002e, "."}, + {0x002f, "/"}, + {0x0030, "0"}, + {0x0031, "1"}, + {0x0032, "2"}, + {0x0033, "3"}, + {0x0034, "4"}, + {0x0035, "5"}, + {0x0036, "6"}, + {0x0037, "7"}, + {0x0038, "8"}, + {0x0039, "9"}, + {0x003a, ":"}, + {0x003b, ";"}, + {0x003c, "<"}, + {0x003d, "="}, + {0x003e, ">"}, + {0x003f, "?"}, + {0x0040, "@"}, + {0x0041, "A"}, + {0x00c6, "AE"}, + {0x01fc, "AEacute"}, + {0x01e2, "AEmacron"}, + {0xf7e6, "AEsmall"}, + {0x00c1, "Aacute"}, + {0xf7e1, "Aacutesmall"}, + {0x0102, "Abreve"}, + {0x1eae, "Abreveacute"}, + {0x04d0, "Abrevecyrillic"}, + {0x1eb6, "Abrevedotbelow"}, + {0x1eb0, "Abrevegrave"}, + {0x1eb2, "Abrevehookabove"}, + {0x1eb4, "Abrevetilde"}, + {0x01cd, "Acaron"}, + {0x24b6, "Acircle"}, + {0x00c2, "Acircumflex"}, + {0x1ea4, "Acircumflexacute"}, + {0x1eac, "Acircumflexdotbelow"}, + {0x1ea6, "Acircumflexgrave"}, + {0x1ea8, "Acircumflexhookabove"}, + {0xf7e2, "Acircumflexsmall"}, + {0x1eaa, "Acircumflextilde"}, + {0xf6c9, "Acute"}, + {0xf7b4, "Acutesmall"}, + {0x0410, "Acyrillic"}, + {0x0200, "Adblgrave"}, + {0x00c4, "Adieresis"}, + {0x04d2, "Adieresiscyrillic"}, + {0x01de, "Adieresismacron"}, + {0xf7e4, "Adieresissmall"}, + {0x1ea0, "Adotbelow"}, + {0x01e0, "Adotmacron"}, + {0x00c0, "Agrave"}, + {0xf7e0, "Agravesmall"}, + {0x1ea2, "Ahookabove"}, + {0x04d4, "Aiecyrillic"}, + {0x0202, "Ainvertedbreve"}, + {0x0391, "Alpha"}, + {0x0386, "Alphatonos"}, + {0x0100, "Amacron"}, + {0xff21, "Amonospace"}, + {0x0104, "Aogonek"}, + {0x00c5, "Aring"}, + {0x01fa, "Aringacute"}, + {0x1e00, "Aringbelow"}, + {0xf7e5, "Aringsmall"}, + {0xf761, "Asmall"}, + {0x00c3, "Atilde"}, + {0xf7e3, "Atildesmall"}, + {0x0531, "Aybarmenian"}, + {0x0042, "B"}, + {0x24b7, "Bcircle"}, + {0x1e02, "Bdotaccent"}, + {0x1e04, "Bdotbelow"}, + {0x0411, "Becyrillic"}, + {0x0532, "Benarmenian"}, + {0x0392, "Beta"}, + {0x0181, "Bhook"}, + {0x1e06, "Blinebelow"}, + {0xff22, "Bmonospace"}, + {0xf6f4, "Brevesmall"}, + {0xf762, "Bsmall"}, + {0x0182, "Btopbar"}, + {0x0043, "C"}, + {0x053e, "Caarmenian"}, + {0x0106, "Cacute"}, + {0xf6ca, "Caron"}, + {0xf6f5, "Caronsmall"}, + {0x010c, "Ccaron"}, + {0x00c7, "Ccedilla"}, + {0x1e08, "Ccedillaacute"}, + {0xf7e7, "Ccedillasmall"}, + {0x24b8, "Ccircle"}, + {0x0108, "Ccircumflex"}, + {0x010a, "Cdot"}, + {0x010a, "Cdotaccent"}, + {0xf7b8, "Cedillasmall"}, + {0x0549, "Chaarmenian"}, + {0x04bc, "Cheabkhasiancyrillic"}, + {0x0427, "Checyrillic"}, + {0x04be, "Chedescenderabkhasiancyrillic"}, + {0x04b6, "Chedescendercyrillic"}, + {0x04f4, "Chedieresiscyrillic"}, + {0x0543, "Cheharmenian"}, + {0x04cb, "Chekhakassiancyrillic"}, + {0x04b8, "Cheverticalstrokecyrillic"}, + {0x03a7, "Chi"}, + {0x0187, "Chook"}, + {0xf6f6, "Circumflexsmall"}, + {0xff23, "Cmonospace"}, + {0x0551, "Coarmenian"}, + {0xf763, "Csmall"}, + {0x0044, "D"}, + {0x01f1, "DZ"}, + {0x01c4, "DZcaron"}, + {0x0534, "Daarmenian"}, + {0x0189, "Dafrican"}, + {0x010e, "Dcaron"}, + {0x1e10, "Dcedilla"}, + {0x24b9, "Dcircle"}, + {0x1e12, "Dcircumflexbelow"}, + {0x0110, "Dcroat"}, + {0x1e0a, "Ddotaccent"}, + {0x1e0c, "Ddotbelow"}, + {0x0414, "Decyrillic"}, + {0x03ee, "Deicoptic"}, + {0x2206, "Delta"}, + {0x0394, "Deltagreek"}, + {0x018a, "Dhook"}, + {0xf6cb, "Dieresis"}, + {0xf6cc, "DieresisAcute"}, + {0xf6cd, "DieresisGrave"}, + {0xf7a8, "Dieresissmall"}, + {0x03dc, "Digammagreek"}, + {0x0402, "Djecyrillic"}, + {0x1e0e, "Dlinebelow"}, + {0xff24, "Dmonospace"}, + {0xf6f7, "Dotaccentsmall"}, + {0x0110, "Dslash"}, + {0xf764, "Dsmall"}, + {0x018b, "Dtopbar"}, + {0x01f2, "Dz"}, + {0x01c5, "Dzcaron"}, + {0x04e0, "Dzeabkhasiancyrillic"}, + {0x0405, "Dzecyrillic"}, + {0x040f, "Dzhecyrillic"}, + {0x0045, "E"}, + {0x00c9, "Eacute"}, + {0xf7e9, "Eacutesmall"}, + {0x0114, "Ebreve"}, + {0x011a, "Ecaron"}, + {0x1e1c, "Ecedillabreve"}, + {0x0535, "Echarmenian"}, + {0x24ba, "Ecircle"}, + {0x00ca, "Ecircumflex"}, + {0x1ebe, "Ecircumflexacute"}, + {0x1e18, "Ecircumflexbelow"}, + {0x1ec6, "Ecircumflexdotbelow"}, + {0x1ec0, "Ecircumflexgrave"}, + {0x1ec2, "Ecircumflexhookabove"}, + {0xf7ea, "Ecircumflexsmall"}, + {0x1ec4, "Ecircumflextilde"}, + {0x0404, "Ecyrillic"}, + {0x0204, "Edblgrave"}, + {0x00cb, "Edieresis"}, + {0xf7eb, "Edieresissmall"}, + {0x0116, "Edot"}, + {0x0116, "Edotaccent"}, + {0x1eb8, "Edotbelow"}, + {0x0424, "Efcyrillic"}, + {0x00c8, "Egrave"}, + {0xf7e8, "Egravesmall"}, + {0x0537, "Eharmenian"}, + {0x1eba, "Ehookabove"}, + {0x2167, "Eightroman"}, + {0x0206, "Einvertedbreve"}, + {0x0464, "Eiotifiedcyrillic"}, + {0x041b, "Elcyrillic"}, + {0x216a, "Elevenroman"}, + {0x0112, "Emacron"}, + {0x1e16, "Emacronacute"}, + {0x1e14, "Emacrongrave"}, + {0x041c, "Emcyrillic"}, + {0xff25, "Emonospace"}, + {0x041d, "Encyrillic"}, + {0x04a2, "Endescendercyrillic"}, + {0x014a, "Eng"}, + {0x04a4, "Enghecyrillic"}, + {0x04c7, "Enhookcyrillic"}, + {0x0118, "Eogonek"}, + {0x0190, "Eopen"}, + {0x0395, "Epsilon"}, + {0x0388, "Epsilontonos"}, + {0x0420, "Ercyrillic"}, + {0x018e, "Ereversed"}, + {0x042d, "Ereversedcyrillic"}, + {0x0421, "Escyrillic"}, + {0x04aa, "Esdescendercyrillic"}, + {0x01a9, "Esh"}, + {0xf765, "Esmall"}, + {0x0397, "Eta"}, + {0x0538, "Etarmenian"}, + {0x0389, "Etatonos"}, + {0x00d0, "Eth"}, + {0xf7f0, "Ethsmall"}, + {0x1ebc, "Etilde"}, + {0x1e1a, "Etildebelow"}, + {0x20ac, "Euro"}, + {0x01b7, "Ezh"}, + {0x01ee, "Ezhcaron"}, + {0x01b8, "Ezhreversed"}, + {0x0046, "F"}, + {0x24bb, "Fcircle"}, + {0x1e1e, "Fdotaccent"}, + {0x0556, "Feharmenian"}, + {0x03e4, "Feicoptic"}, + {0x0191, "Fhook"}, + {0x0472, "Fitacyrillic"}, + {0x2164, "Fiveroman"}, + {0xff26, "Fmonospace"}, + {0x2163, "Fourroman"}, + {0xf766, "Fsmall"}, + {0x0047, "G"}, + {0x3387, "GBsquare"}, + {0x01f4, "Gacute"}, + {0x0393, "Gamma"}, + {0x0194, "Gammaafrican"}, + {0x03ea, "Gangiacoptic"}, + {0x011e, "Gbreve"}, + {0x01e6, "Gcaron"}, + {0x0122, "Gcedilla"}, + {0x24bc, "Gcircle"}, + {0x011c, "Gcircumflex"}, + {0x0122, "Gcommaaccent"}, + {0x0120, "Gdot"}, + {0x0120, "Gdotaccent"}, + {0x0413, "Gecyrillic"}, + {0x0542, "Ghadarmenian"}, + {0x0494, "Ghemiddlehookcyrillic"}, + {0x0492, "Ghestrokecyrillic"}, + {0x0490, "Gheupturncyrillic"}, + {0x0193, "Ghook"}, + {0x0533, "Gimarmenian"}, + {0x0403, "Gjecyrillic"}, + {0x1e20, "Gmacron"}, + {0xff27, "Gmonospace"}, + {0xf6ce, "Grave"}, + {0xf760, "Gravesmall"}, + {0xf767, "Gsmall"}, + {0x029b, "Gsmallhook"}, + {0x01e4, "Gstroke"}, + {0x0048, "H"}, + {0x25cf, "H18533"}, + {0x25aa, "H18543"}, + {0x25ab, "H18551"}, + {0x25a1, "H22073"}, + {0x33cb, "HPsquare"}, + {0x04a8, "Haabkhasiancyrillic"}, + {0x04b2, "Hadescendercyrillic"}, + {0x042a, "Hardsigncyrillic"}, + {0x0126, "Hbar"}, + {0x1e2a, "Hbrevebelow"}, + {0x1e28, "Hcedilla"}, + {0x24bd, "Hcircle"}, + {0x0124, "Hcircumflex"}, + {0x1e26, "Hdieresis"}, + {0x1e22, "Hdotaccent"}, + {0x1e24, "Hdotbelow"}, + {0xff28, "Hmonospace"}, + {0x0540, "Hoarmenian"}, + {0x03e8, "Horicoptic"}, + {0xf768, "Hsmall"}, + {0xf6cf, "Hungarumlaut"}, + {0xf6f8, "Hungarumlautsmall"}, + {0x3390, "Hzsquare"}, + {0x0049, "I"}, + {0x042f, "IAcyrillic"}, + {0x0132, "IJ"}, + {0x042e, "IUcyrillic"}, + {0x00cd, "Iacute"}, + {0xf7ed, "Iacutesmall"}, + {0x012c, "Ibreve"}, + {0x01cf, "Icaron"}, + {0x24be, "Icircle"}, + {0x00ce, "Icircumflex"}, + {0xf7ee, "Icircumflexsmall"}, + {0x0406, "Icyrillic"}, + {0x0208, "Idblgrave"}, + {0x00cf, "Idieresis"}, + {0x1e2e, "Idieresisacute"}, + {0x04e4, "Idieresiscyrillic"}, + {0xf7ef, "Idieresissmall"}, + {0x0130, "Idot"}, + {0x0130, "Idotaccent"}, + {0x1eca, "Idotbelow"}, + {0x04d6, "Iebrevecyrillic"}, + {0x0415, "Iecyrillic"}, + {0x2111, "Ifraktur"}, + {0x00cc, "Igrave"}, + {0xf7ec, "Igravesmall"}, + {0x1ec8, "Ihookabove"}, + {0x0418, "Iicyrillic"}, + {0x020a, "Iinvertedbreve"}, + {0x0419, "Iishortcyrillic"}, + {0x012a, "Imacron"}, + {0x04e2, "Imacroncyrillic"}, + {0xff29, "Imonospace"}, + {0x053b, "Iniarmenian"}, + {0x0401, "Iocyrillic"}, + {0x012e, "Iogonek"}, + {0x0399, "Iota"}, + {0x0196, "Iotaafrican"}, + {0x03aa, "Iotadieresis"}, + {0x038a, "Iotatonos"}, + {0xf769, "Ismall"}, + {0x0197, "Istroke"}, + {0x0128, "Itilde"}, + {0x1e2c, "Itildebelow"}, + {0x0474, "Izhitsacyrillic"}, + {0x0476, "Izhitsadblgravecyrillic"}, + {0x004a, "J"}, + {0x0541, "Jaarmenian"}, + {0x24bf, "Jcircle"}, + {0x0134, "Jcircumflex"}, + {0x0408, "Jecyrillic"}, + {0x054b, "Jheharmenian"}, + {0xff2a, "Jmonospace"}, + {0xf76a, "Jsmall"}, + {0x004b, "K"}, + {0x3385, "KBsquare"}, + {0x33cd, "KKsquare"}, + {0x04a0, "Kabashkircyrillic"}, + {0x1e30, "Kacute"}, + {0x041a, "Kacyrillic"}, + {0x049a, "Kadescendercyrillic"}, + {0x04c3, "Kahookcyrillic"}, + {0x039a, "Kappa"}, + {0x049e, "Kastrokecyrillic"}, + {0x049c, "Kaverticalstrokecyrillic"}, + {0x01e8, "Kcaron"}, + {0x0136, "Kcedilla"}, + {0x24c0, "Kcircle"}, + {0x0136, "Kcommaaccent"}, + {0x1e32, "Kdotbelow"}, + {0x0554, "Keharmenian"}, + {0x053f, "Kenarmenian"}, + {0x0425, "Khacyrillic"}, + {0x03e6, "Kheicoptic"}, + {0x0198, "Khook"}, + {0x040c, "Kjecyrillic"}, + {0x1e34, "Klinebelow"}, + {0xff2b, "Kmonospace"}, + {0x0480, "Koppacyrillic"}, + {0x03de, "Koppagreek"}, + {0x046e, "Ksicyrillic"}, + {0xf76b, "Ksmall"}, + {0x004c, "L"}, + {0x01c7, "LJ"}, + {0xf6bf, "LL"}, + {0x0139, "Lacute"}, + {0x039b, "Lambda"}, + {0x013d, "Lcaron"}, + {0x013b, "Lcedilla"}, + {0x24c1, "Lcircle"}, + {0x1e3c, "Lcircumflexbelow"}, + {0x013b, "Lcommaaccent"}, + {0x013f, "Ldot"}, + {0x013f, "Ldotaccent"}, + {0x1e36, "Ldotbelow"}, + {0x1e38, "Ldotbelowmacron"}, + {0x053c, "Liwnarmenian"}, + {0x01c8, "Lj"}, + {0x0409, "Ljecyrillic"}, + {0x1e3a, "Llinebelow"}, + {0xff2c, "Lmonospace"}, + {0x0141, "Lslash"}, + {0xf6f9, "Lslashsmall"}, + {0xf76c, "Lsmall"}, + {0x004d, "M"}, + {0x3386, "MBsquare"}, + {0xf6d0, "Macron"}, + {0xf7af, "Macronsmall"}, + {0x1e3e, "Macute"}, + {0x24c2, "Mcircle"}, + {0x1e40, "Mdotaccent"}, + {0x1e42, "Mdotbelow"}, + {0x0544, "Menarmenian"}, + {0xff2d, "Mmonospace"}, + {0xf76d, "Msmall"}, + {0x019c, "Mturned"}, + {0x039c, "Mu"}, + {0x004e, "N"}, + {0x01ca, "NJ"}, + {0x0143, "Nacute"}, + {0x0147, "Ncaron"}, + {0x0145, "Ncedilla"}, + {0x24c3, "Ncircle"}, + {0x1e4a, "Ncircumflexbelow"}, + {0x0145, "Ncommaaccent"}, + {0x1e44, "Ndotaccent"}, + {0x1e46, "Ndotbelow"}, + {0x019d, "Nhookleft"}, + {0x2168, "Nineroman"}, + {0x01cb, "Nj"}, + {0x040a, "Njecyrillic"}, + {0x1e48, "Nlinebelow"}, + {0xff2e, "Nmonospace"}, + {0x0546, "Nowarmenian"}, + {0xf76e, "Nsmall"}, + {0x00d1, "Ntilde"}, + {0xf7f1, "Ntildesmall"}, + {0x039d, "Nu"}, + {0x004f, "O"}, + {0x0152, "OE"}, + {0xf6fa, "OEsmall"}, + {0x00d3, "Oacute"}, + {0xf7f3, "Oacutesmall"}, + {0x04e8, "Obarredcyrillic"}, + {0x04ea, "Obarreddieresiscyrillic"}, + {0x014e, "Obreve"}, + {0x01d1, "Ocaron"}, + {0x019f, "Ocenteredtilde"}, + {0x24c4, "Ocircle"}, + {0x00d4, "Ocircumflex"}, + {0x1ed0, "Ocircumflexacute"}, + {0x1ed8, "Ocircumflexdotbelow"}, + {0x1ed2, "Ocircumflexgrave"}, + {0x1ed4, "Ocircumflexhookabove"}, + {0xf7f4, "Ocircumflexsmall"}, + {0x1ed6, "Ocircumflextilde"}, + {0x041e, "Ocyrillic"}, + {0x0150, "Odblacute"}, + {0x020c, "Odblgrave"}, + {0x00d6, "Odieresis"}, + {0x04e6, "Odieresiscyrillic"}, + {0xf7f6, "Odieresissmall"}, + {0x1ecc, "Odotbelow"}, + {0xf6fb, "Ogoneksmall"}, + {0x00d2, "Ograve"}, + {0xf7f2, "Ogravesmall"}, + {0x0555, "Oharmenian"}, + {0x2126, "Ohm"}, + {0x1ece, "Ohookabove"}, + {0x01a0, "Ohorn"}, + {0x1eda, "Ohornacute"}, + {0x1ee2, "Ohorndotbelow"}, + {0x1edc, "Ohorngrave"}, + {0x1ede, "Ohornhookabove"}, + {0x1ee0, "Ohorntilde"}, + {0x0150, "Ohungarumlaut"}, + {0x01a2, "Oi"}, + {0x020e, "Oinvertedbreve"}, + {0x014c, "Omacron"}, + {0x1e52, "Omacronacute"}, + {0x1e50, "Omacrongrave"}, + {0x2126, "Omega"}, + {0x0460, "Omegacyrillic"}, + {0x03a9, "Omegagreek"}, + {0x047a, "Omegaroundcyrillic"}, + {0x047c, "Omegatitlocyrillic"}, + {0x038f, "Omegatonos"}, + {0x039f, "Omicron"}, + {0x038c, "Omicrontonos"}, + {0xff2f, "Omonospace"}, + {0x2160, "Oneroman"}, + {0x01ea, "Oogonek"}, + {0x01ec, "Oogonekmacron"}, + {0x0186, "Oopen"}, + {0x00d8, "Oslash"}, + {0x01fe, "Oslashacute"}, + {0xf7f8, "Oslashsmall"}, + {0xf76f, "Osmall"}, + {0x01fe, "Ostrokeacute"}, + {0x047e, "Otcyrillic"}, + {0x00d5, "Otilde"}, + {0x1e4c, "Otildeacute"}, + {0x1e4e, "Otildedieresis"}, + {0xf7f5, "Otildesmall"}, + {0x0050, "P"}, + {0x1e54, "Pacute"}, + {0x24c5, "Pcircle"}, + {0x1e56, "Pdotaccent"}, + {0x041f, "Pecyrillic"}, + {0x054a, "Peharmenian"}, + {0x04a6, "Pemiddlehookcyrillic"}, + {0x03a6, "Phi"}, + {0x01a4, "Phook"}, + {0x03a0, "Pi"}, + {0x0553, "Piwrarmenian"}, + {0xff30, "Pmonospace"}, + {0x03a8, "Psi"}, + {0x0470, "Psicyrillic"}, + {0xf770, "Psmall"}, + {0x0051, "Q"}, + {0x24c6, "Qcircle"}, + {0xff31, "Qmonospace"}, + {0xf771, "Qsmall"}, + {0x0052, "R"}, + {0x054c, "Raarmenian"}, + {0x0154, "Racute"}, + {0x0158, "Rcaron"}, + {0x0156, "Rcedilla"}, + {0x24c7, "Rcircle"}, + {0x0156, "Rcommaaccent"}, + {0x0210, "Rdblgrave"}, + {0x1e58, "Rdotaccent"}, + {0x1e5a, "Rdotbelow"}, + {0x1e5c, "Rdotbelowmacron"}, + {0x0550, "Reharmenian"}, + {0x211c, "Rfraktur"}, + {0x03a1, "Rho"}, + {0xf6fc, "Ringsmall"}, + {0x0212, "Rinvertedbreve"}, + {0x1e5e, "Rlinebelow"}, + {0xff32, "Rmonospace"}, + {0xf772, "Rsmall"}, + {0x0281, "Rsmallinverted"}, + {0x02b6, "Rsmallinvertedsuperior"}, + {0x0053, "S"}, + {0x250c, "SF010000"}, + {0x2514, "SF020000"}, + {0x2510, "SF030000"}, + {0x2518, "SF040000"}, + {0x253c, "SF050000"}, + {0x252c, "SF060000"}, + {0x2534, "SF070000"}, + {0x251c, "SF080000"}, + {0x2524, "SF090000"}, + {0x2500, "SF100000"}, + {0x2502, "SF110000"}, + {0x2561, "SF190000"}, + {0x2562, "SF200000"}, + {0x2556, "SF210000"}, + {0x2555, "SF220000"}, + {0x2563, "SF230000"}, + {0x2551, "SF240000"}, + {0x2557, "SF250000"}, + {0x255d, "SF260000"}, + {0x255c, "SF270000"}, + {0x255b, "SF280000"}, + {0x255e, "SF360000"}, + {0x255f, "SF370000"}, + {0x255a, "SF380000"}, + {0x2554, "SF390000"}, + {0x2569, "SF400000"}, + {0x2566, "SF410000"}, + {0x2560, "SF420000"}, + {0x2550, "SF430000"}, + {0x256c, "SF440000"}, + {0x2567, "SF450000"}, + {0x2568, "SF460000"}, + {0x2564, "SF470000"}, + {0x2565, "SF480000"}, + {0x2559, "SF490000"}, + {0x2558, "SF500000"}, + {0x2552, "SF510000"}, + {0x2553, "SF520000"}, + {0x256b, "SF530000"}, + {0x256a, "SF540000"}, + {0x015a, "Sacute"}, + {0x1e64, "Sacutedotaccent"}, + {0x03e0, "Sampigreek"}, + {0x0160, "Scaron"}, + {0x1e66, "Scarondotaccent"}, + {0xf6fd, "Scaronsmall"}, + {0x015e, "Scedilla"}, + {0x018f, "Schwa"}, + {0x04d8, "Schwacyrillic"}, + {0x04da, "Schwadieresiscyrillic"}, + {0x24c8, "Scircle"}, + {0x015c, "Scircumflex"}, + {0x0218, "Scommaaccent"}, + {0x1e60, "Sdotaccent"}, + {0x1e62, "Sdotbelow"}, + {0x1e68, "Sdotbelowdotaccent"}, + {0x054d, "Seharmenian"}, + {0x2166, "Sevenroman"}, + {0x0547, "Shaarmenian"}, + {0x0428, "Shacyrillic"}, + {0x0429, "Shchacyrillic"}, + {0x03e2, "Sheicoptic"}, + {0x04ba, "Shhacyrillic"}, + {0x03ec, "Shimacoptic"}, + {0x03a3, "Sigma"}, + {0x2165, "Sixroman"}, + {0xff33, "Smonospace"}, + {0x042c, "Softsigncyrillic"}, + {0xf773, "Ssmall"}, + {0x03da, "Stigmagreek"}, + {0x0054, "T"}, + {0x03a4, "Tau"}, + {0x0166, "Tbar"}, + {0x0164, "Tcaron"}, + {0x0162, "Tcedilla"}, + {0x24c9, "Tcircle"}, + {0x1e70, "Tcircumflexbelow"}, + {0x0162, "Tcommaaccent"}, + {0x1e6a, "Tdotaccent"}, + {0x1e6c, "Tdotbelow"}, + {0x0422, "Tecyrillic"}, + {0x04ac, "Tedescendercyrillic"}, + {0x2169, "Tenroman"}, + {0x04b4, "Tetsecyrillic"}, + {0x0398, "Theta"}, + {0x01ac, "Thook"}, + {0x00de, "Thorn"}, + {0xf7fe, "Thornsmall"}, + {0x2162, "Threeroman"}, + {0xf6fe, "Tildesmall"}, + {0x054f, "Tiwnarmenian"}, + {0x1e6e, "Tlinebelow"}, + {0xff34, "Tmonospace"}, + {0x0539, "Toarmenian"}, + {0x01bc, "Tonefive"}, + {0x0184, "Tonesix"}, + {0x01a7, "Tonetwo"}, + {0x01ae, "Tretroflexhook"}, + {0x0426, "Tsecyrillic"}, + {0x040b, "Tshecyrillic"}, + {0xf774, "Tsmall"}, + {0x216b, "Twelveroman"}, + {0x2161, "Tworoman"}, + {0x0055, "U"}, + {0x00da, "Uacute"}, + {0xf7fa, "Uacutesmall"}, + {0x016c, "Ubreve"}, + {0x01d3, "Ucaron"}, + {0x24ca, "Ucircle"}, + {0x00db, "Ucircumflex"}, + {0x1e76, "Ucircumflexbelow"}, + {0xf7fb, "Ucircumflexsmall"}, + {0x0423, "Ucyrillic"}, + {0x0170, "Udblacute"}, + {0x0214, "Udblgrave"}, + {0x00dc, "Udieresis"}, + {0x01d7, "Udieresisacute"}, + {0x1e72, "Udieresisbelow"}, + {0x01d9, "Udieresiscaron"}, + {0x04f0, "Udieresiscyrillic"}, + {0x01db, "Udieresisgrave"}, + {0x01d5, "Udieresismacron"}, + {0xf7fc, "Udieresissmall"}, + {0x1ee4, "Udotbelow"}, + {0x00d9, "Ugrave"}, + {0xf7f9, "Ugravesmall"}, + {0x1ee6, "Uhookabove"}, + {0x01af, "Uhorn"}, + {0x1ee8, "Uhornacute"}, + {0x1ef0, "Uhorndotbelow"}, + {0x1eea, "Uhorngrave"}, + {0x1eec, "Uhornhookabove"}, + {0x1eee, "Uhorntilde"}, + {0x0170, "Uhungarumlaut"}, + {0x04f2, "Uhungarumlautcyrillic"}, + {0x0216, "Uinvertedbreve"}, + {0x0478, "Ukcyrillic"}, + {0x016a, "Umacron"}, + {0x04ee, "Umacroncyrillic"}, + {0x1e7a, "Umacrondieresis"}, + {0xff35, "Umonospace"}, + {0x0172, "Uogonek"}, + {0x03a5, "Upsilon"}, + {0x03d2, "Upsilon1"}, + {0x03d3, "Upsilonacutehooksymbolgreek"}, + {0x01b1, "Upsilonafrican"}, + {0x03ab, "Upsilondieresis"}, + {0x03d4, "Upsilondieresishooksymbolgreek"}, + {0x03d2, "Upsilonhooksymbol"}, + {0x038e, "Upsilontonos"}, + {0x016e, "Uring"}, + {0x040e, "Ushortcyrillic"}, + {0xf775, "Usmall"}, + {0x04ae, "Ustraightcyrillic"}, + {0x04b0, "Ustraightstrokecyrillic"}, + {0x0168, "Utilde"}, + {0x1e78, "Utildeacute"}, + {0x1e74, "Utildebelow"}, + {0x0056, "V"}, + {0x24cb, "Vcircle"}, + {0x1e7e, "Vdotbelow"}, + {0x0412, "Vecyrillic"}, + {0x054e, "Vewarmenian"}, + {0x01b2, "Vhook"}, + {0xff36, "Vmonospace"}, + {0x0548, "Voarmenian"}, + {0xf776, "Vsmall"}, + {0x1e7c, "Vtilde"}, + {0x0057, "W"}, + {0x1e82, "Wacute"}, + {0x24cc, "Wcircle"}, + {0x0174, "Wcircumflex"}, + {0x1e84, "Wdieresis"}, + {0x1e86, "Wdotaccent"}, + {0x1e88, "Wdotbelow"}, + {0x1e80, "Wgrave"}, + {0xff37, "Wmonospace"}, + {0xf777, "Wsmall"}, + {0x0058, "X"}, + {0x24cd, "Xcircle"}, + {0x1e8c, "Xdieresis"}, + {0x1e8a, "Xdotaccent"}, + {0x053d, "Xeharmenian"}, + {0x039e, "Xi"}, + {0xff38, "Xmonospace"}, + {0xf778, "Xsmall"}, + {0x0059, "Y"}, + {0x00dd, "Yacute"}, + {0xf7fd, "Yacutesmall"}, + {0x0462, "Yatcyrillic"}, + {0x24ce, "Ycircle"}, + {0x0176, "Ycircumflex"}, + {0x0178, "Ydieresis"}, + {0xf7ff, "Ydieresissmall"}, + {0x1e8e, "Ydotaccent"}, + {0x1ef4, "Ydotbelow"}, + {0x042b, "Yericyrillic"}, + {0x04f8, "Yerudieresiscyrillic"}, + {0x1ef2, "Ygrave"}, + {0x01b3, "Yhook"}, + {0x1ef6, "Yhookabove"}, + {0x0545, "Yiarmenian"}, + {0x0407, "Yicyrillic"}, + {0x0552, "Yiwnarmenian"}, + {0xff39, "Ymonospace"}, + {0xf779, "Ysmall"}, + {0x1ef8, "Ytilde"}, + {0x046a, "Yusbigcyrillic"}, + {0x046c, "Yusbigiotifiedcyrillic"}, + {0x0466, "Yuslittlecyrillic"}, + {0x0468, "Yuslittleiotifiedcyrillic"}, + {0x005a, "Z"}, + {0x0536, "Zaarmenian"}, + {0x0179, "Zacute"}, + {0x017d, "Zcaron"}, + {0xf6ff, "Zcaronsmall"}, + {0x24cf, "Zcircle"}, + {0x1e90, "Zcircumflex"}, + {0x017b, "Zdot"}, + {0x017b, "Zdotaccent"}, + {0x1e92, "Zdotbelow"}, + {0x0417, "Zecyrillic"}, + {0x0498, "Zedescendercyrillic"}, + {0x04de, "Zedieresiscyrillic"}, + {0x0396, "Zeta"}, + {0x053a, "Zhearmenian"}, + {0x04c1, "Zhebrevecyrillic"}, + {0x0416, "Zhecyrillic"}, + {0x0496, "Zhedescendercyrillic"}, + {0x04dc, "Zhedieresiscyrillic"}, + {0x1e94, "Zlinebelow"}, + {0xff3a, "Zmonospace"}, + {0xf77a, "Zsmall"}, + {0x01b5, "Zstroke"}, + {0x0022, "\""}, + {0x005c, "\\"}, + {0x005d, "]"}, + {0x005e, "^"}, + {0x005f, "_"}, + {0x0060, "`"}, + {0x0061, "a"}, + {0x275e, "a100"}, + {0x2761, "a101"}, + {0x2762, "a102"}, + {0x2763, "a103"}, + {0x2764, "a104"}, + {0x2710, "a105"}, + {0x2765, "a106"}, + {0x2766, "a107"}, + {0x2767, "a108"}, + {0x2660, "a109"}, + {0x2721, "a10"}, + {0x2665, "a110"}, + {0x2666, "a111"}, + {0x2663, "a112"}, + {0x2709, "a117"}, + {0x2708, "a118"}, + {0x2707, "a119"}, + {0x261b, "a11"}, + {0x2460, "a120"}, + {0x2461, "a121"}, + {0x2462, "a122"}, + {0x2463, "a123"}, + {0x2464, "a124"}, + {0x2465, "a125"}, + {0x2466, "a126"}, + {0x2467, "a127"}, + {0x2468, "a128"}, + {0x2469, "a129"}, + {0x261e, "a12"}, + {0x2776, "a130"}, + {0x2777, "a131"}, + {0x2778, "a132"}, + {0x2779, "a133"}, + {0x277a, "a134"}, + {0x277b, "a135"}, + {0x277c, "a136"}, + {0x277d, "a137"}, + {0x277e, "a138"}, + {0x277f, "a139"}, + {0x270c, "a13"}, + {0x2780, "a140"}, + {0x2781, "a141"}, + {0x2782, "a142"}, + {0x2783, "a143"}, + {0x2784, "a144"}, + {0x2785, "a145"}, + {0x2786, "a146"}, + {0x2787, "a147"}, + {0x2788, "a148"}, + {0x2789, "a149"}, + {0x270d, "a14"}, + {0x278a, "a150"}, + {0x278b, "a151"}, + {0x278c, "a152"}, + {0x278d, "a153"}, + {0x278e, "a154"}, + {0x278f, "a155"}, + {0x2790, "a156"}, + {0x2791, "a157"}, + {0x2792, "a158"}, + {0x2793, "a159"}, + {0x270e, "a15"}, + {0x2794, "a160"}, + {0x2192, "a161"}, + {0x27a3, "a162"}, + {0x2194, "a163"}, + {0x2195, "a164"}, + {0x2799, "a165"}, + {0x279b, "a166"}, + {0x279c, "a167"}, + {0x279d, "a168"}, + {0x279e, "a169"}, + {0x270f, "a16"}, + {0x279f, "a170"}, + {0x27a0, "a171"}, + {0x27a1, "a172"}, + {0x27a2, "a173"}, + {0x27a4, "a174"}, + {0x27a5, "a175"}, + {0x27a6, "a176"}, + {0x27a7, "a177"}, + {0x27a8, "a178"}, + {0x27a9, "a179"}, + {0x2711, "a17"}, + {0x27ab, "a180"}, + {0x27ad, "a181"}, + {0x27af, "a182"}, + {0x27b2, "a183"}, + {0x27b3, "a184"}, + {0x27b5, "a185"}, + {0x27b8, "a186"}, + {0x27ba, "a187"}, + {0x27bb, "a188"}, + {0x27bc, "a189"}, + {0x2712, "a18"}, + {0x27bd, "a190"}, + {0x27be, "a191"}, + {0x279a, "a192"}, + {0x27aa, "a193"}, + {0x27b6, "a194"}, + {0x27b9, "a195"}, + {0x2798, "a196"}, + {0x27b4, "a197"}, + {0x27b7, "a198"}, + {0x27ac, "a199"}, + {0x2713, "a19"}, + {0x2701, "a1"}, + {0x27ae, "a200"}, + {0x27b1, "a201"}, + {0x2703, "a202"}, + {0x2750, "a203"}, + {0x2752, "a204"}, + {0x276e, "a205"}, + {0x2770, "a206"}, + {0x2714, "a20"}, + {0x2715, "a21"}, + {0x2716, "a22"}, + {0x2717, "a23"}, + {0x2718, "a24"}, + {0x2719, "a25"}, + {0x271a, "a26"}, + {0x271b, "a27"}, + {0x271c, "a28"}, + {0x2722, "a29"}, + {0x2702, "a2"}, + {0x2723, "a30"}, + {0x2724, "a31"}, + {0x2725, "a32"}, + {0x2726, "a33"}, + {0x2727, "a34"}, + {0x2605, "a35"}, + {0x2729, "a36"}, + {0x272a, "a37"}, + {0x272b, "a38"}, + {0x272c, "a39"}, + {0x2704, "a3"}, + {0x272d, "a40"}, + {0x272e, "a41"}, + {0x272f, "a42"}, + {0x2730, "a43"}, + {0x2731, "a44"}, + {0x2732, "a45"}, + {0x2733, "a46"}, + {0x2734, "a47"}, + {0x2735, "a48"}, + {0x2736, "a49"}, + {0x260e, "a4"}, + {0x2737, "a50"}, + {0x2738, "a51"}, + {0x2739, "a52"}, + {0x273a, "a53"}, + {0x273b, "a54"}, + {0x273c, "a55"}, + {0x273d, "a56"}, + {0x273e, "a57"}, + {0x273f, "a58"}, + {0x2740, "a59"}, + {0x2706, "a5"}, + {0x2741, "a60"}, + {0x2742, "a61"}, + {0x2743, "a62"}, + {0x2744, "a63"}, + {0x2745, "a64"}, + {0x2746, "a65"}, + {0x2747, "a66"}, + {0x2748, "a67"}, + {0x2749, "a68"}, + {0x274a, "a69"}, + {0x271d, "a6"}, + {0x274b, "a70"}, + {0x25cf, "a71"}, + {0x274d, "a72"}, + {0x25a0, "a73"}, + {0x274f, "a74"}, + {0x2751, "a75"}, + {0x25b2, "a76"}, + {0x25bc, "a77"}, + {0x25c6, "a78"}, + {0x2756, "a79"}, + {0x271e, "a7"}, + {0x25d7, "a81"}, + {0x2758, "a82"}, + {0x2759, "a83"}, + {0x275a, "a84"}, + {0x276f, "a85"}, + {0x2771, "a86"}, + {0x2772, "a87"}, + {0x2773, "a88"}, + {0x2768, "a89"}, + {0x271f, "a8"}, + {0x2769, "a90"}, + {0x276c, "a91"}, + {0x276d, "a92"}, + {0x276a, "a93"}, + {0x276b, "a94"}, + {0x2774, "a95"}, + {0x2775, "a96"}, + {0x275b, "a97"}, + {0x275c, "a98"}, + {0x275d, "a99"}, + {0x2720, "a9"}, + {0x0986, "aabengali"}, + {0x00e1, "aacute"}, + {0x0906, "aadeva"}, + {0x0a86, "aagujarati"}, + {0x0a06, "aagurmukhi"}, + {0x0a3e, "aamatragurmukhi"}, + {0x3303, "aarusquare"}, + {0x09be, "aavowelsignbengali"}, + {0x093e, "aavowelsigndeva"}, + {0x0abe, "aavowelsigngujarati"}, + {0x055f, "abbreviationmarkarmenian"}, + {0x0970, "abbreviationsigndeva"}, + {0x0985, "abengali"}, + {0x311a, "abopomofo"}, + {0x0103, "abreve"}, + {0x1eaf, "abreveacute"}, + {0x04d1, "abrevecyrillic"}, + {0x1eb7, "abrevedotbelow"}, + {0x1eb1, "abrevegrave"}, + {0x1eb3, "abrevehookabove"}, + {0x1eb5, "abrevetilde"}, + {0x01ce, "acaron"}, + {0x24d0, "acircle"}, + {0x00e2, "acircumflex"}, + {0x1ea5, "acircumflexacute"}, + {0x1ead, "acircumflexdotbelow"}, + {0x1ea7, "acircumflexgrave"}, + {0x1ea9, "acircumflexhookabove"}, + {0x1eab, "acircumflextilde"}, + {0x00b4, "acute"}, + {0x0317, "acutebelowcmb"}, + {0x0301, "acutecmb"}, + {0x0301, "acutecomb"}, + {0x0954, "acutedeva"}, + {0x02cf, "acutelowmod"}, + {0x0341, "acutetonecmb"}, + {0x0430, "acyrillic"}, + {0x0201, "adblgrave"}, + {0x0a71, "addakgurmukhi"}, + {0x0905, "adeva"}, + {0x00e4, "adieresis"}, + {0x04d3, "adieresiscyrillic"}, + {0x01df, "adieresismacron"}, + {0x1ea1, "adotbelow"}, + {0x01e1, "adotmacron"}, + {0x00e6, "ae"}, + {0x01fd, "aeacute"}, + {0x3150, "aekorean"}, + {0x01e3, "aemacron"}, + {0x2015, "afii00208"}, + {0x20a4, "afii08941"}, + {0x0410, "afii10017"}, + {0x0411, "afii10018"}, + {0x0412, "afii10019"}, + {0x0413, "afii10020"}, + {0x0414, "afii10021"}, + {0x0415, "afii10022"}, + {0x0401, "afii10023"}, + {0x0416, "afii10024"}, + {0x0417, "afii10025"}, + {0x0418, "afii10026"}, + {0x0419, "afii10027"}, + {0x041a, "afii10028"}, + {0x041b, "afii10029"}, + {0x041c, "afii10030"}, + {0x041d, "afii10031"}, + {0x041e, "afii10032"}, + {0x041f, "afii10033"}, + {0x0420, "afii10034"}, + {0x0421, "afii10035"}, + {0x0422, "afii10036"}, + {0x0423, "afii10037"}, + {0x0424, "afii10038"}, + {0x0425, "afii10039"}, + {0x0426, "afii10040"}, + {0x0427, "afii10041"}, + {0x0428, "afii10042"}, + {0x0429, "afii10043"}, + {0x042a, "afii10044"}, + {0x042b, "afii10045"}, + {0x042c, "afii10046"}, + {0x042d, "afii10047"}, + {0x042e, "afii10048"}, + {0x042f, "afii10049"}, + {0x0490, "afii10050"}, + {0x0402, "afii10051"}, + {0x0403, "afii10052"}, + {0x0404, "afii10053"}, + {0x0405, "afii10054"}, + {0x0406, "afii10055"}, + {0x0407, "afii10056"}, + {0x0408, "afii10057"}, + {0x0409, "afii10058"}, + {0x040a, "afii10059"}, + {0x040b, "afii10060"}, + {0x040c, "afii10061"}, + {0x040e, "afii10062"}, + {0xf6c4, "afii10063"}, + {0xf6c5, "afii10064"}, + {0x0430, "afii10065"}, + {0x0431, "afii10066"}, + {0x0432, "afii10067"}, + {0x0433, "afii10068"}, + {0x0434, "afii10069"}, + {0x0435, "afii10070"}, + {0x0451, "afii10071"}, + {0x0436, "afii10072"}, + {0x0437, "afii10073"}, + {0x0438, "afii10074"}, + {0x0439, "afii10075"}, + {0x043a, "afii10076"}, + {0x043b, "afii10077"}, + {0x043c, "afii10078"}, + {0x043d, "afii10079"}, + {0x043e, "afii10080"}, + {0x043f, "afii10081"}, + {0x0440, "afii10082"}, + {0x0441, "afii10083"}, + {0x0442, "afii10084"}, + {0x0443, "afii10085"}, + {0x0444, "afii10086"}, + {0x0445, "afii10087"}, + {0x0446, "afii10088"}, + {0x0447, "afii10089"}, + {0x0448, "afii10090"}, + {0x0449, "afii10091"}, + {0x044a, "afii10092"}, + {0x044b, "afii10093"}, + {0x044c, "afii10094"}, + {0x044d, "afii10095"}, + {0x044e, "afii10096"}, + {0x044f, "afii10097"}, + {0x0491, "afii10098"}, + {0x0452, "afii10099"}, + {0x0453, "afii10100"}, + {0x0454, "afii10101"}, + {0x0455, "afii10102"}, + {0x0456, "afii10103"}, + {0x0457, "afii10104"}, + {0x0458, "afii10105"}, + {0x0459, "afii10106"}, + {0x045a, "afii10107"}, + {0x045b, "afii10108"}, + {0x045c, "afii10109"}, + {0x045e, "afii10110"}, + {0x040f, "afii10145"}, + {0x0462, "afii10146"}, + {0x0472, "afii10147"}, + {0x0474, "afii10148"}, + {0xf6c6, "afii10192"}, + {0x045f, "afii10193"}, + {0x0463, "afii10194"}, + {0x0473, "afii10195"}, + {0x0475, "afii10196"}, + {0xf6c7, "afii10831"}, + {0xf6c8, "afii10832"}, + {0x04d9, "afii10846"}, + {0x200e, "afii299"}, + {0x200f, "afii300"}, + {0x200d, "afii301"}, + {0x066a, "afii57381"}, + {0x060c, "afii57388"}, + {0x0660, "afii57392"}, + {0x0661, "afii57393"}, + {0x0662, "afii57394"}, + {0x0663, "afii57395"}, + {0x0664, "afii57396"}, + {0x0665, "afii57397"}, + {0x0666, "afii57398"}, + {0x0667, "afii57399"}, + {0x0668, "afii57400"}, + {0x0669, "afii57401"}, + {0x061b, "afii57403"}, + {0x061f, "afii57407"}, + {0x0621, "afii57409"}, + {0x0622, "afii57410"}, + {0x0623, "afii57411"}, + {0x0624, "afii57412"}, + {0x0625, "afii57413"}, + {0x0626, "afii57414"}, + {0x0627, "afii57415"}, + {0x0628, "afii57416"}, + {0x0629, "afii57417"}, + {0x062a, "afii57418"}, + {0x062b, "afii57419"}, + {0x062c, "afii57420"}, + {0x062d, "afii57421"}, + {0x062e, "afii57422"}, + {0x062f, "afii57423"}, + {0x0630, "afii57424"}, + {0x0631, "afii57425"}, + {0x0632, "afii57426"}, + {0x0633, "afii57427"}, + {0x0634, "afii57428"}, + {0x0635, "afii57429"}, + {0x0636, "afii57430"}, + {0x0637, "afii57431"}, + {0x0638, "afii57432"}, + {0x0639, "afii57433"}, + {0x063a, "afii57434"}, + {0x0640, "afii57440"}, + {0x0641, "afii57441"}, + {0x0642, "afii57442"}, + {0x0643, "afii57443"}, + {0x0644, "afii57444"}, + {0x0645, "afii57445"}, + {0x0646, "afii57446"}, + {0x0648, "afii57448"}, + {0x0649, "afii57449"}, + {0x064a, "afii57450"}, + {0x064b, "afii57451"}, + {0x064c, "afii57452"}, + {0x064d, "afii57453"}, + {0x064e, "afii57454"}, + {0x064f, "afii57455"}, + {0x0650, "afii57456"}, + {0x0651, "afii57457"}, + {0x0652, "afii57458"}, + {0x0647, "afii57470"}, + {0x06a4, "afii57505"}, + {0x067e, "afii57506"}, + {0x0686, "afii57507"}, + {0x0698, "afii57508"}, + {0x06af, "afii57509"}, + {0x0679, "afii57511"}, + {0x0688, "afii57512"}, + {0x0691, "afii57513"}, + {0x06ba, "afii57514"}, + {0x06d2, "afii57519"}, + {0x06d5, "afii57534"}, + {0x20aa, "afii57636"}, + {0x05be, "afii57645"}, + {0x05c3, "afii57658"}, + {0x05d0, "afii57664"}, + {0x05d1, "afii57665"}, + {0x05d2, "afii57666"}, + {0x05d3, "afii57667"}, + {0x05d4, "afii57668"}, + {0x05d5, "afii57669"}, + {0x05d6, "afii57670"}, + {0x05d7, "afii57671"}, + {0x05d8, "afii57672"}, + {0x05d9, "afii57673"}, + {0x05da, "afii57674"}, + {0x05db, "afii57675"}, + {0x05dc, "afii57676"}, + {0x05dd, "afii57677"}, + {0x05de, "afii57678"}, + {0x05df, "afii57679"}, + {0x05e0, "afii57680"}, + {0x05e1, "afii57681"}, + {0x05e2, "afii57682"}, + {0x05e3, "afii57683"}, + {0x05e4, "afii57684"}, + {0x05e5, "afii57685"}, + {0x05e6, "afii57686"}, + {0x05e7, "afii57687"}, + {0x05e8, "afii57688"}, + {0x05e9, "afii57689"}, + {0x05ea, "afii57690"}, + {0xfb2a, "afii57694"}, + {0xfb2b, "afii57695"}, + {0xfb4b, "afii57700"}, + {0xfb1f, "afii57705"}, + {0x05f0, "afii57716"}, + {0x05f1, "afii57717"}, + {0x05f2, "afii57718"}, + {0xfb35, "afii57723"}, + {0x05b4, "afii57793"}, + {0x05b5, "afii57794"}, + {0x05b6, "afii57795"}, + {0x05bb, "afii57796"}, + {0x05b8, "afii57797"}, + {0x05b7, "afii57798"}, + {0x05b0, "afii57799"}, + {0x05b2, "afii57800"}, + {0x05b1, "afii57801"}, + {0x05b3, "afii57802"}, + {0x05c2, "afii57803"}, + {0x05c1, "afii57804"}, + {0x05b9, "afii57806"}, + {0x05bc, "afii57807"}, + {0x05bd, "afii57839"}, + {0x05bf, "afii57841"}, + {0x05c0, "afii57842"}, + {0x02bc, "afii57929"}, + {0x2105, "afii61248"}, + {0x2113, "afii61289"}, + {0x2116, "afii61352"}, + {0x202c, "afii61573"}, + {0x202d, "afii61574"}, + {0x202e, "afii61575"}, + {0x200c, "afii61664"}, + {0x066d, "afii63167"}, + {0x02bd, "afii64937"}, + {0x00e0, "agrave"}, + {0x0a85, "agujarati"}, + {0x0a05, "agurmukhi"}, + {0x3042, "ahiragana"}, + {0x1ea3, "ahookabove"}, + {0x0990, "aibengali"}, + {0x311e, "aibopomofo"}, + {0x0910, "aideva"}, + {0x04d5, "aiecyrillic"}, + {0x0a90, "aigujarati"}, + {0x0a10, "aigurmukhi"}, + {0x0a48, "aimatragurmukhi"}, + {0x0639, "ainarabic"}, + {0xfeca, "ainfinalarabic"}, + {0xfecb, "aininitialarabic"}, + {0xfecc, "ainmedialarabic"}, + {0x0203, "ainvertedbreve"}, + {0x09c8, "aivowelsignbengali"}, + {0x0948, "aivowelsigndeva"}, + {0x0ac8, "aivowelsigngujarati"}, + {0x30a2, "akatakana"}, + {0xff71, "akatakanahalfwidth"}, + {0x314f, "akorean"}, + {0x05d0, "alef"}, + {0x0627, "alefarabic"}, + {0xfb30, "alefdageshhebrew"}, + {0xfe8e, "aleffinalarabic"}, + {0x0623, "alefhamzaabovearabic"}, + {0xfe84, "alefhamzaabovefinalarabic"}, + {0x0625, "alefhamzabelowarabic"}, + {0xfe88, "alefhamzabelowfinalarabic"}, + {0x05d0, "alefhebrew"}, + {0xfb4f, "aleflamedhebrew"}, + {0x0622, "alefmaddaabovearabic"}, + {0xfe82, "alefmaddaabovefinalarabic"}, + {0x0649, "alefmaksuraarabic"}, + {0xfef0, "alefmaksurafinalarabic"}, + {0xfef3, "alefmaksurainitialarabic"}, + {0xfef4, "alefmaksuramedialarabic"}, + {0xfb2e, "alefpatahhebrew"}, + {0xfb2f, "alefqamatshebrew"}, + {0x2135, "aleph"}, + {0x224c, "allequal"}, + {0x03b1, "alpha"}, + {0x03ac, "alphatonos"}, + {0x0101, "amacron"}, + {0xff41, "amonospace"}, + {0x0026, "ampersand"}, + {0xff06, "ampersandmonospace"}, + {0xf726, "ampersandsmall"}, + {0x33c2, "amsquare"}, + {0x3122, "anbopomofo"}, + {0x3124, "angbopomofo"}, + {0x0e5a, "angkhankhuthai"}, + {0x2220, "angle"}, + {0x3008, "anglebracketleft"}, + {0xfe3f, "anglebracketleftvertical"}, + {0x3009, "anglebracketright"}, + {0xfe40, "anglebracketrightvertical"}, + {0x2329, "angleleft"}, + {0x232a, "angleright"}, + {0x212b, "angstrom"}, + {0x0387, "anoteleia"}, + {0x0952, "anudattadeva"}, + {0x0982, "anusvarabengali"}, + {0x0902, "anusvaradeva"}, + {0x0a82, "anusvaragujarati"}, + {0x0105, "aogonek"}, + {0x3300, "apaatosquare"}, + {0x249c, "aparen"}, + {0x055a, "apostrophearmenian"}, + {0x02bc, "apostrophemod"}, + {0xf8ff, "apple"}, + {0x2250, "approaches"}, + {0x2248, "approxequal"}, + {0x2252, "approxequalorimage"}, + {0x2245, "approximatelyequal"}, + {0x318e, "araeaekorean"}, + {0x318d, "araeakorean"}, + {0x2312, "arc"}, + {0x1e9a, "arighthalfring"}, + {0x00e5, "aring"}, + {0x01fb, "aringacute"}, + {0x1e01, "aringbelow"}, + {0x2194, "arrowboth"}, + {0x21e3, "arrowdashdown"}, + {0x21e0, "arrowdashleft"}, + {0x21e2, "arrowdashright"}, + {0x21e1, "arrowdashup"}, + {0x21d4, "arrowdblboth"}, + {0x21d3, "arrowdbldown"}, + {0x21d0, "arrowdblleft"}, + {0x21d2, "arrowdblright"}, + {0x21d1, "arrowdblup"}, + {0x2193, "arrowdown"}, + {0x2199, "arrowdownleft"}, + {0x2198, "arrowdownright"}, + {0x21e9, "arrowdownwhite"}, + {0x02c5, "arrowheaddownmod"}, + {0x02c2, "arrowheadleftmod"}, + {0x02c3, "arrowheadrightmod"}, + {0x02c4, "arrowheadupmod"}, + {0xf8e7, "arrowhorizex"}, + {0x2190, "arrowleft"}, + {0x21d0, "arrowleftdbl"}, + {0x21cd, "arrowleftdblstroke"}, + {0x21c6, "arrowleftoverright"}, + {0x21e6, "arrowleftwhite"}, + {0x2192, "arrowright"}, + {0x21cf, "arrowrightdblstroke"}, + {0x279e, "arrowrightheavy"}, + {0x21c4, "arrowrightoverleft"}, + {0x21e8, "arrowrightwhite"}, + {0x21e4, "arrowtableft"}, + {0x21e5, "arrowtabright"}, + {0x2191, "arrowup"}, + {0x2195, "arrowupdn"}, + {0x21a8, "arrowupdnbse"}, + {0x21a8, "arrowupdownbase"}, + {0x2196, "arrowupleft"}, + {0x21c5, "arrowupleftofdown"}, + {0x2197, "arrowupright"}, + {0x21e7, "arrowupwhite"}, + {0xf8e6, "arrowvertex"}, + {0x005e, "asciicircum"}, + {0xff3e, "asciicircummonospace"}, + {0x007e, "asciitilde"}, + {0xff5e, "asciitildemonospace"}, + {0x0251, "ascript"}, + {0x0252, "ascriptturned"}, + {0x3041, "asmallhiragana"}, + {0x30a1, "asmallkatakana"}, + {0xff67, "asmallkatakanahalfwidth"}, + {0x002a, "asterisk"}, + {0x066d, "asteriskaltonearabic"}, + {0x066d, "asteriskarabic"}, + {0x2217, "asteriskmath"}, + {0xff0a, "asteriskmonospace"}, + {0xfe61, "asterisksmall"}, + {0x2042, "asterism"}, + {0xf6e9, "asuperior"}, + {0x2243, "asymptoticallyequal"}, + {0x0040, "at"}, + {0x00e3, "atilde"}, + {0xff20, "atmonospace"}, + {0xfe6b, "atsmall"}, + {0x0250, "aturned"}, + {0x0994, "aubengali"}, + {0x3120, "aubopomofo"}, + {0x0914, "audeva"}, + {0x0a94, "augujarati"}, + {0x0a14, "augurmukhi"}, + {0x09d7, "aulengthmarkbengali"}, + {0x0a4c, "aumatragurmukhi"}, + {0x09cc, "auvowelsignbengali"}, + {0x094c, "auvowelsigndeva"}, + {0x0acc, "auvowelsigngujarati"}, + {0x093d, "avagrahadeva"}, + {0x0561, "aybarmenian"}, + {0x05e2, "ayin"}, + {0xfb20, "ayinaltonehebrew"}, + {0x05e2, "ayinhebrew"}, + {0x0062, "b"}, + {0x09ac, "babengali"}, + {0x005c, "backslash"}, + {0xff3c, "backslashmonospace"}, + {0x092c, "badeva"}, + {0x0aac, "bagujarati"}, + {0x0a2c, "bagurmukhi"}, + {0x3070, "bahiragana"}, + {0x0e3f, "bahtthai"}, + {0x30d0, "bakatakana"}, + {0x007c, "bar"}, + {0xff5c, "barmonospace"}, + {0x3105, "bbopomofo"}, + {0x24d1, "bcircle"}, + {0x1e03, "bdotaccent"}, + {0x1e05, "bdotbelow"}, + {0x266c, "beamedsixteenthnotes"}, + {0x2235, "because"}, + {0x0431, "becyrillic"}, + {0x0628, "beharabic"}, + {0xfe90, "behfinalarabic"}, + {0xfe91, "behinitialarabic"}, + {0x3079, "behiragana"}, + {0xfe92, "behmedialarabic"}, + {0xfc9f, "behmeeminitialarabic"}, + {0xfc08, "behmeemisolatedarabic"}, + {0xfc6d, "behnoonfinalarabic"}, + {0x30d9, "bekatakana"}, + {0x0562, "benarmenian"}, + {0x05d1, "bet"}, + {0x03b2, "beta"}, + {0x03d0, "betasymbolgreek"}, + {0xfb31, "betdagesh"}, + {0xfb31, "betdageshhebrew"}, + {0x05d1, "bethebrew"}, + {0xfb4c, "betrafehebrew"}, + {0x09ad, "bhabengali"}, + {0x092d, "bhadeva"}, + {0x0aad, "bhagujarati"}, + {0x0a2d, "bhagurmukhi"}, + {0x0253, "bhook"}, + {0x3073, "bihiragana"}, + {0x30d3, "bikatakana"}, + {0x0298, "bilabialclick"}, + {0x0a02, "bindigurmukhi"}, + {0x3331, "birusquare"}, + {0x25cf, "blackcircle"}, + {0x25c6, "blackdiamond"}, + {0x25bc, "blackdownpointingtriangle"}, + {0x25c4, "blackleftpointingpointer"}, + {0x25c0, "blackleftpointingtriangle"}, + {0x3010, "blacklenticularbracketleft"}, + {0xfe3b, "blacklenticularbracketleftvertical"}, + {0x3011, "blacklenticularbracketright"}, + {0xfe3c, "blacklenticularbracketrightvertical"}, + {0x25e3, "blacklowerlefttriangle"}, + {0x25e2, "blacklowerrighttriangle"}, + {0x25ac, "blackrectangle"}, + {0x25ba, "blackrightpointingpointer"}, + {0x25b6, "blackrightpointingtriangle"}, + {0x25aa, "blacksmallsquare"}, + {0x263b, "blacksmilingface"}, + {0x25a0, "blacksquare"}, + {0x2605, "blackstar"}, + {0x25e4, "blackupperlefttriangle"}, + {0x25e5, "blackupperrighttriangle"}, + {0x25b4, "blackuppointingsmalltriangle"}, + {0x25b2, "blackuppointingtriangle"}, + {0x2423, "blank"}, + {0x1e07, "blinebelow"}, + {0x2588, "block"}, + {0xff42, "bmonospace"}, + {0x0e1a, "bobaimaithai"}, + {0x307c, "bohiragana"}, + {0x30dc, "bokatakana"}, + {0x249d, "bparen"}, + {0x33c3, "bqsquare"}, + {0xf8f4, "braceex"}, + {0x007b, "braceleft"}, + {0xf8f3, "braceleftbt"}, + {0xf8f2, "braceleftmid"}, + {0xff5b, "braceleftmonospace"}, + {0xfe5b, "braceleftsmall"}, + {0xf8f1, "bracelefttp"}, + {0xfe37, "braceleftvertical"}, + {0x007d, "braceright"}, + {0xf8fe, "bracerightbt"}, + {0xf8fd, "bracerightmid"}, + {0xff5d, "bracerightmonospace"}, + {0xfe5c, "bracerightsmall"}, + {0xf8fc, "bracerighttp"}, + {0xfe38, "bracerightvertical"}, + {0x005b, "bracketleft"}, + {0xf8f0, "bracketleftbt"}, + {0xf8ef, "bracketleftex"}, + {0xff3b, "bracketleftmonospace"}, + {0xf8ee, "bracketlefttp"}, + {0x005d, "bracketright"}, + {0xf8fb, "bracketrightbt"}, + {0xf8fa, "bracketrightex"}, + {0xff3d, "bracketrightmonospace"}, + {0xf8f9, "bracketrighttp"}, + {0x02d8, "breve"}, + {0x032e, "brevebelowcmb"}, + {0x0306, "brevecmb"}, + {0x032f, "breveinvertedbelowcmb"}, + {0x0311, "breveinvertedcmb"}, + {0x0361, "breveinverteddoublecmb"}, + {0x032a, "bridgebelowcmb"}, + {0x033a, "bridgeinvertedbelowcmb"}, + {0x00a6, "brokenbar"}, + {0x0180, "bstroke"}, + {0xf6ea, "bsuperior"}, + {0x0183, "btopbar"}, + {0x3076, "buhiragana"}, + {0x30d6, "bukatakana"}, + {0x2022, "bullet"}, + {0x25d8, "bulletinverse"}, + {0x2219, "bulletoperator"}, + {0x25ce, "bullseye"}, + {0x0063, "c"}, + {0x056e, "caarmenian"}, + {0x099a, "cabengali"}, + {0x0107, "cacute"}, + {0x091a, "cadeva"}, + {0x0a9a, "cagujarati"}, + {0x0a1a, "cagurmukhi"}, + {0x3388, "calsquare"}, + {0x0981, "candrabindubengali"}, + {0x0310, "candrabinducmb"}, + {0x0901, "candrabindudeva"}, + {0x0a81, "candrabindugujarati"}, + {0x21ea, "capslock"}, + {0x2105, "careof"}, + {0x02c7, "caron"}, + {0x032c, "caronbelowcmb"}, + {0x030c, "caroncmb"}, + {0x21b5, "carriagereturn"}, + {0x3118, "cbopomofo"}, + {0x010d, "ccaron"}, + {0x00e7, "ccedilla"}, + {0x1e09, "ccedillaacute"}, + {0x24d2, "ccircle"}, + {0x0109, "ccircumflex"}, + {0x0255, "ccurl"}, + {0x010b, "cdot"}, + {0x010b, "cdotaccent"}, + {0x33c5, "cdsquare"}, + {0x00b8, "cedilla"}, + {0x0327, "cedillacmb"}, + {0x00a2, "cent"}, + {0x2103, "centigrade"}, + {0xf6df, "centinferior"}, + {0xffe0, "centmonospace"}, + {0xf7a2, "centoldstyle"}, + {0xf6e0, "centsuperior"}, + {0x0579, "chaarmenian"}, + {0x099b, "chabengali"}, + {0x091b, "chadeva"}, + {0x0a9b, "chagujarati"}, + {0x0a1b, "chagurmukhi"}, + {0x3114, "chbopomofo"}, + {0x04bd, "cheabkhasiancyrillic"}, + {0x2713, "checkmark"}, + {0x0447, "checyrillic"}, + {0x04bf, "chedescenderabkhasiancyrillic"}, + {0x04b7, "chedescendercyrillic"}, + {0x04f5, "chedieresiscyrillic"}, + {0x0573, "cheharmenian"}, + {0x04cc, "chekhakassiancyrillic"}, + {0x04b9, "cheverticalstrokecyrillic"}, + {0x03c7, "chi"}, + {0x3277, "chieuchacirclekorean"}, + {0x3217, "chieuchaparenkorean"}, + {0x3269, "chieuchcirclekorean"}, + {0x314a, "chieuchkorean"}, + {0x3209, "chieuchparenkorean"}, + {0x0e0a, "chochangthai"}, + {0x0e08, "chochanthai"}, + {0x0e09, "chochingthai"}, + {0x0e0c, "chochoethai"}, + {0x0188, "chook"}, + {0x3276, "cieucacirclekorean"}, + {0x3216, "cieucaparenkorean"}, + {0x3268, "cieuccirclekorean"}, + {0x3148, "cieuckorean"}, + {0x3208, "cieucparenkorean"}, + {0x321c, "cieucuparenkorean"}, + {0x25cb, "circle"}, + {0x2297, "circlemultiply"}, + {0x2299, "circleot"}, + {0x2295, "circleplus"}, + {0x3036, "circlepostalmark"}, + {0x25d0, "circlewithlefthalfblack"}, + {0x25d1, "circlewithrighthalfblack"}, + {0x02c6, "circumflex"}, + {0x032d, "circumflexbelowcmb"}, + {0x0302, "circumflexcmb"}, + {0x2327, "clear"}, + {0x01c2, "clickalveolar"}, + {0x01c0, "clickdental"}, + {0x01c1, "clicklateral"}, + {0x01c3, "clickretroflex"}, + {0x2663, "club"}, + {0x2663, "clubsuitblack"}, + {0x2667, "clubsuitwhite"}, + {0x33a4, "cmcubedsquare"}, + {0xff43, "cmonospace"}, + {0x33a0, "cmsquaredsquare"}, + {0x0581, "coarmenian"}, + {0x003a, "colon"}, + {0x20a1, "colonmonetary"}, + {0xff1a, "colonmonospace"}, + {0x20a1, "colonsign"}, + {0xfe55, "colonsmall"}, + {0x02d1, "colontriangularhalfmod"}, + {0x02d0, "colontriangularmod"}, + {0x002c, "comma"}, + {0x0313, "commaabovecmb"}, + {0x0315, "commaaboverightcmb"}, + {0xf6c3, "commaaccent"}, + {0x060c, "commaarabic"}, + {0x055d, "commaarmenian"}, + {0xf6e1, "commainferior"}, + {0xff0c, "commamonospace"}, + {0x0314, "commareversedabovecmb"}, + {0x02bd, "commareversedmod"}, + {0xfe50, "commasmall"}, + {0xf6e2, "commasuperior"}, + {0x0312, "commaturnedabovecmb"}, + {0x02bb, "commaturnedmod"}, + {0x263c, "compass"}, + {0x2245, "congruent"}, + {0x222e, "contourintegral"}, + {0x2303, "control"}, + {0x0006, "controlACK"}, + {0x0007, "controlBEL"}, + {0x0008, "controlBS"}, + {0x0018, "controlCAN"}, + {0x000d, "controlCR"}, + {0x0011, "controlDC1"}, + {0x0012, "controlDC2"}, + {0x0013, "controlDC3"}, + {0x0014, "controlDC4"}, + {0x007f, "controlDEL"}, + {0x0010, "controlDLE"}, + {0x0019, "controlEM"}, + {0x0005, "controlENQ"}, + {0x0004, "controlEOT"}, + {0x001b, "controlESC"}, + {0x0017, "controlETB"}, + {0x0003, "controlETX"}, + {0x000c, "controlFF"}, + {0x001c, "controlFS"}, + {0x001d, "controlGS"}, + {0x0009, "controlHT"}, + {0x000a, "controlLF"}, + {0x0015, "controlNAK"}, + {0x001e, "controlRS"}, + {0x000f, "controlSI"}, + {0x000e, "controlSO"}, + {0x0002, "controlSOT"}, + {0x0001, "controlSTX"}, + {0x001a, "controlSUB"}, + {0x0016, "controlSYN"}, + {0x001f, "controlUS"}, + {0x000b, "controlVT"}, + {0x00a9, "copyright"}, + {0xf8e9, "copyrightsans"}, + {0xf6d9, "copyrightserif"}, + {0x300c, "cornerbracketleft"}, + {0xff62, "cornerbracketlefthalfwidth"}, + {0xfe41, "cornerbracketleftvertical"}, + {0x300d, "cornerbracketright"}, + {0xff63, "cornerbracketrighthalfwidth"}, + {0xfe42, "cornerbracketrightvertical"}, + {0x337f, "corporationsquare"}, + {0x33c7, "cosquare"}, + {0x33c6, "coverkgsquare"}, + {0x249e, "cparen"}, + {0x20a2, "cruzeiro"}, + {0x0297, "cstretched"}, + {0x22cf, "curlyand"}, + {0x22ce, "curlyor"}, + {0x00a4, "currency"}, + {0xf6d1, "cyrBreve"}, + {0xf6d2, "cyrFlex"}, + {0xf6d4, "cyrbreve"}, + {0xf6d5, "cyrflex"}, + {0x0064, "d"}, + {0x0564, "daarmenian"}, + {0x09a6, "dabengali"}, + {0x0636, "dadarabic"}, + {0x0926, "dadeva"}, + {0xfebe, "dadfinalarabic"}, + {0xfebf, "dadinitialarabic"}, + {0xfec0, "dadmedialarabic"}, + {0x05bc, "dagesh"}, + {0x05bc, "dageshhebrew"}, + {0x2020, "dagger"}, + {0x2021, "daggerdbl"}, + {0x0aa6, "dagujarati"}, + {0x0a26, "dagurmukhi"}, + {0x3060, "dahiragana"}, + {0x30c0, "dakatakana"}, + {0x062f, "dalarabic"}, + {0x05d3, "dalet"}, + {0xfb33, "daletdagesh"}, + {0xfb33, "daletdageshhebrew"}, + {0x05d3, "dalethebrew"}, + {0xfeaa, "dalfinalarabic"}, + {0x064f, "dammaarabic"}, + {0x064f, "dammalowarabic"}, + {0x064c, "dammatanaltonearabic"}, + {0x064c, "dammatanarabic"}, + {0x0964, "danda"}, + {0x05a7, "dargahebrew"}, + {0x05a7, "dargalefthebrew"}, + {0x0485, "dasiapneumatacyrilliccmb"}, + {0xf6d3, "dblGrave"}, + {0x300a, "dblanglebracketleft"}, + {0xfe3d, "dblanglebracketleftvertical"}, + {0x300b, "dblanglebracketright"}, + {0xfe3e, "dblanglebracketrightvertical"}, + {0x032b, "dblarchinvertedbelowcmb"}, + {0x21d4, "dblarrowleft"}, + {0x21d2, "dblarrowright"}, + {0x0965, "dbldanda"}, + {0xf6d6, "dblgrave"}, + {0x030f, "dblgravecmb"}, + {0x222c, "dblintegral"}, + {0x2017, "dbllowline"}, + {0x0333, "dbllowlinecmb"}, + {0x033f, "dbloverlinecmb"}, + {0x02ba, "dblprimemod"}, + {0x2016, "dblverticalbar"}, + {0x030e, "dblverticallineabovecmb"}, + {0x3109, "dbopomofo"}, + {0x33c8, "dbsquare"}, + {0x010f, "dcaron"}, + {0x1e11, "dcedilla"}, + {0x24d3, "dcircle"}, + {0x1e13, "dcircumflexbelow"}, + {0x0111, "dcroat"}, + {0x09a1, "ddabengali"}, + {0x0921, "ddadeva"}, + {0x0aa1, "ddagujarati"}, + {0x0a21, "ddagurmukhi"}, + {0x0688, "ddalarabic"}, + {0xfb89, "ddalfinalarabic"}, + {0x095c, "dddhadeva"}, + {0x09a2, "ddhabengali"}, + {0x0922, "ddhadeva"}, + {0x0aa2, "ddhagujarati"}, + {0x0a22, "ddhagurmukhi"}, + {0x1e0b, "ddotaccent"}, + {0x1e0d, "ddotbelow"}, + {0x066b, "decimalseparatorarabic"}, + {0x066b, "decimalseparatorpersian"}, + {0x0434, "decyrillic"}, + {0x00b0, "degree"}, + {0x05ad, "dehihebrew"}, + {0x3067, "dehiragana"}, + {0x03ef, "deicoptic"}, + {0x30c7, "dekatakana"}, + {0x232b, "deleteleft"}, + {0x2326, "deleteright"}, + {0x03b4, "delta"}, + {0x018d, "deltaturned"}, + {0x09f8, "denominatorminusonenumeratorbengali"}, + {0x02a4, "dezh"}, + {0x09a7, "dhabengali"}, + {0x0927, "dhadeva"}, + {0x0aa7, "dhagujarati"}, + {0x0a27, "dhagurmukhi"}, + {0x0257, "dhook"}, + {0x0385, "dialytikatonos"}, + {0x0344, "dialytikatonoscmb"}, + {0x2666, "diamond"}, + {0x2662, "diamondsuitwhite"}, + {0x00a8, "dieresis"}, + {0xf6d7, "dieresisacute"}, + {0x0324, "dieresisbelowcmb"}, + {0x0308, "dieresiscmb"}, + {0xf6d8, "dieresisgrave"}, + {0x0385, "dieresistonos"}, + {0x3062, "dihiragana"}, + {0x30c2, "dikatakana"}, + {0x3003, "dittomark"}, + {0x00f7, "divide"}, + {0x2223, "divides"}, + {0x2215, "divisionslash"}, + {0x0452, "djecyrillic"}, + {0x2593, "dkshade"}, + {0x1e0f, "dlinebelow"}, + {0x3397, "dlsquare"}, + {0x0111, "dmacron"}, + {0xff44, "dmonospace"}, + {0x2584, "dnblock"}, + {0x0e0e, "dochadathai"}, + {0x0e14, "dodekthai"}, + {0x3069, "dohiragana"}, + {0x30c9, "dokatakana"}, + {0x0024, "dollar"}, + {0xf6e3, "dollarinferior"}, + {0xff04, "dollarmonospace"}, + {0xf724, "dollaroldstyle"}, + {0xfe69, "dollarsmall"}, + {0xf6e4, "dollarsuperior"}, + {0x20ab, "dong"}, + {0x3326, "dorusquare"}, + {0x02d9, "dotaccent"}, + {0x0307, "dotaccentcmb"}, + {0x0323, "dotbelowcmb"}, + {0x0323, "dotbelowcomb"}, + {0x30fb, "dotkatakana"}, + {0x0131, "dotlessi"}, + {0xf6be, "dotlessj"}, + {0x0284, "dotlessjstrokehook"}, + {0x22c5, "dotmath"}, + {0x25cc, "dottedcircle"}, + {0xfb1f, "doubleyodpatah"}, + {0xfb1f, "doubleyodpatahhebrew"}, + {0x031e, "downtackbelowcmb"}, + {0x02d5, "downtackmod"}, + {0x249f, "dparen"}, + {0xf6eb, "dsuperior"}, + {0x0256, "dtail"}, + {0x018c, "dtopbar"}, + {0x3065, "duhiragana"}, + {0x30c5, "dukatakana"}, + {0x01f3, "dz"}, + {0x02a3, "dzaltone"}, + {0x01c6, "dzcaron"}, + {0x02a5, "dzcurl"}, + {0x04e1, "dzeabkhasiancyrillic"}, + {0x0455, "dzecyrillic"}, + {0x045f, "dzhecyrillic"}, + {0x0065, "e"}, + {0x00e9, "eacute"}, + {0x2641, "earth"}, + {0x098f, "ebengali"}, + {0x311c, "ebopomofo"}, + {0x0115, "ebreve"}, + {0x090d, "ecandradeva"}, + {0x0a8d, "ecandragujarati"}, + {0x0945, "ecandravowelsigndeva"}, + {0x0ac5, "ecandravowelsigngujarati"}, + {0x011b, "ecaron"}, + {0x1e1d, "ecedillabreve"}, + {0x0565, "echarmenian"}, + {0x0587, "echyiwnarmenian"}, + {0x24d4, "ecircle"}, + {0x00ea, "ecircumflex"}, + {0x1ebf, "ecircumflexacute"}, + {0x1e19, "ecircumflexbelow"}, + {0x1ec7, "ecircumflexdotbelow"}, + {0x1ec1, "ecircumflexgrave"}, + {0x1ec3, "ecircumflexhookabove"}, + {0x1ec5, "ecircumflextilde"}, + {0x0454, "ecyrillic"}, + {0x0205, "edblgrave"}, + {0x090f, "edeva"}, + {0x00eb, "edieresis"}, + {0x0117, "edot"}, + {0x0117, "edotaccent"}, + {0x1eb9, "edotbelow"}, + {0x0a0f, "eegurmukhi"}, + {0x0a47, "eematragurmukhi"}, + {0x0444, "efcyrillic"}, + {0x00e8, "egrave"}, + {0x0a8f, "egujarati"}, + {0x0567, "eharmenian"}, + {0x311d, "ehbopomofo"}, + {0x3048, "ehiragana"}, + {0x1ebb, "ehookabove"}, + {0x311f, "eibopomofo"}, + {0x0038, "eight"}, + {0x0668, "eightarabic"}, + {0x09ee, "eightbengali"}, + {0x2467, "eightcircle"}, + {0x2791, "eightcircleinversesansserif"}, + {0x096e, "eightdeva"}, + {0x2471, "eighteencircle"}, + {0x2485, "eighteenparen"}, + {0x2499, "eighteenperiod"}, + {0x0aee, "eightgujarati"}, + {0x0a6e, "eightgurmukhi"}, + {0x0668, "eighthackarabic"}, + {0x3028, "eighthangzhou"}, + {0x266b, "eighthnotebeamed"}, + {0x3227, "eightideographicparen"}, + {0x2088, "eightinferior"}, + {0xff18, "eightmonospace"}, + {0xf738, "eightoldstyle"}, + {0x247b, "eightparen"}, + {0x248f, "eightperiod"}, + {0x06f8, "eightpersian"}, + {0x2177, "eightroman"}, + {0x2078, "eightsuperior"}, + {0x0e58, "eightthai"}, + {0x0207, "einvertedbreve"}, + {0x0465, "eiotifiedcyrillic"}, + {0x30a8, "ekatakana"}, + {0xff74, "ekatakanahalfwidth"}, + {0x0a74, "ekonkargurmukhi"}, + {0x3154, "ekorean"}, + {0x043b, "elcyrillic"}, + {0x2208, "element"}, + {0x246a, "elevencircle"}, + {0x247e, "elevenparen"}, + {0x2492, "elevenperiod"}, + {0x217a, "elevenroman"}, + {0x2026, "ellipsis"}, + {0x22ee, "ellipsisvertical"}, + {0x0113, "emacron"}, + {0x1e17, "emacronacute"}, + {0x1e15, "emacrongrave"}, + {0x043c, "emcyrillic"}, + {0x2014, "emdash"}, + {0xfe31, "emdashvertical"}, + {0xff45, "emonospace"}, + {0x055b, "emphasismarkarmenian"}, + {0x2205, "emptyset"}, + {0x3123, "enbopomofo"}, + {0x043d, "encyrillic"}, + {0x2013, "endash"}, + {0xfe32, "endashvertical"}, + {0x04a3, "endescendercyrillic"}, + {0x014b, "eng"}, + {0x3125, "engbopomofo"}, + {0x04a5, "enghecyrillic"}, + {0x04c8, "enhookcyrillic"}, + {0x2002, "enspace"}, + {0x0119, "eogonek"}, + {0x3153, "eokorean"}, + {0x025b, "eopen"}, + {0x029a, "eopenclosed"}, + {0x025c, "eopenreversed"}, + {0x025e, "eopenreversedclosed"}, + {0x025d, "eopenreversedhook"}, + {0x24a0, "eparen"}, + {0x03b5, "epsilon"}, + {0x03ad, "epsilontonos"}, + {0x003d, "equal"}, + {0xff1d, "equalmonospace"}, + {0xfe66, "equalsmall"}, + {0x207c, "equalsuperior"}, + {0x2261, "equivalence"}, + {0x3126, "erbopomofo"}, + {0x0440, "ercyrillic"}, + {0x0258, "ereversed"}, + {0x044d, "ereversedcyrillic"}, + {0x0441, "escyrillic"}, + {0x04ab, "esdescendercyrillic"}, + {0x0283, "esh"}, + {0x0286, "eshcurl"}, + {0x090e, "eshortdeva"}, + {0x0946, "eshortvowelsigndeva"}, + {0x01aa, "eshreversedloop"}, + {0x0285, "eshsquatreversed"}, + {0x3047, "esmallhiragana"}, + {0x30a7, "esmallkatakana"}, + {0xff6a, "esmallkatakanahalfwidth"}, + {0x212e, "estimated"}, + {0xf6ec, "esuperior"}, + {0x03b7, "eta"}, + {0x0568, "etarmenian"}, + {0x03ae, "etatonos"}, + {0x00f0, "eth"}, + {0x1ebd, "etilde"}, + {0x1e1b, "etildebelow"}, + {0x0591, "etnahtafoukhhebrew"}, + {0x0591, "etnahtafoukhlefthebrew"}, + {0x0591, "etnahtahebrew"}, + {0x0591, "etnahtalefthebrew"}, + {0x01dd, "eturned"}, + {0x3161, "eukorean"}, + {0x20ac, "euro"}, + {0x09c7, "evowelsignbengali"}, + {0x0947, "evowelsigndeva"}, + {0x0ac7, "evowelsigngujarati"}, + {0x0021, "exclam"}, + {0x055c, "exclamarmenian"}, + {0x203c, "exclamdbl"}, + {0x00a1, "exclamdown"}, + {0xf7a1, "exclamdownsmall"}, + {0x0021, "exclamleft"}, + {0xff01, "exclammonospace"}, + {0xf721, "exclamsmall"}, + {0x2203, "existential"}, + {0x0292, "ezh"}, + {0x01ef, "ezhcaron"}, + {0x0293, "ezhcurl"}, + {0x01b9, "ezhreversed"}, + {0x01ba, "ezhtail"}, + {0x0066, "f"}, + {0x095e, "fadeva"}, + {0x0a5e, "fagurmukhi"}, + {0x2109, "fahrenheit"}, + {0x064e, "fathaarabic"}, + {0x064e, "fathalowarabic"}, + {0x064b, "fathatanarabic"}, + {0x3108, "fbopomofo"}, + {0x24d5, "fcircle"}, + {0x1e1f, "fdotaccent"}, + {0x0641, "feharabic"}, + {0x0586, "feharmenian"}, + {0xfed2, "fehfinalarabic"}, + {0xfed3, "fehinitialarabic"}, + {0xfed4, "fehmedialarabic"}, + {0x03e5, "feicoptic"}, + {0x2640, "female"}, + {0xfb00, "ff"}, + {0xfb03, "ffi"}, + {0xfb04, "ffl"}, + {0xfb01, "fi"}, + {0x246e, "fifteencircle"}, + {0x2482, "fifteenparen"}, + {0x2496, "fifteenperiod"}, + {0x2012, "figuredash"}, + {0x25a0, "filledbox"}, + {0x25ac, "filledrect"}, + {0x05da, "finalkaf"}, + {0xfb3a, "finalkafdagesh"}, + {0xfb3a, "finalkafdageshhebrew"}, + {0x05da, "finalkafhebrew"}, + {0x05dd, "finalmem"}, + {0x05dd, "finalmemhebrew"}, + {0x05df, "finalnun"}, + {0x05df, "finalnunhebrew"}, + {0x05e3, "finalpe"}, + {0x05e3, "finalpehebrew"}, + {0x05e5, "finaltsadi"}, + {0x05e5, "finaltsadihebrew"}, + {0x02c9, "firsttonechinese"}, + {0x25c9, "fisheye"}, + {0x0473, "fitacyrillic"}, + {0x0035, "five"}, + {0x0665, "fivearabic"}, + {0x09eb, "fivebengali"}, + {0x2464, "fivecircle"}, + {0x278e, "fivecircleinversesansserif"}, + {0x096b, "fivedeva"}, + {0x215d, "fiveeighths"}, + {0x0aeb, "fivegujarati"}, + {0x0a6b, "fivegurmukhi"}, + {0x0665, "fivehackarabic"}, + {0x3025, "fivehangzhou"}, + {0x3224, "fiveideographicparen"}, + {0x2085, "fiveinferior"}, + {0xff15, "fivemonospace"}, + {0xf735, "fiveoldstyle"}, + {0x2478, "fiveparen"}, + {0x248c, "fiveperiod"}, + {0x06f5, "fivepersian"}, + {0x2174, "fiveroman"}, + {0x2075, "fivesuperior"}, + {0x0e55, "fivethai"}, + {0xfb02, "fl"}, + {0x0192, "florin"}, + {0xff46, "fmonospace"}, + {0x3399, "fmsquare"}, + {0x0e1f, "fofanthai"}, + {0x0e1d, "fofathai"}, + {0x0e4f, "fongmanthai"}, + {0x2200, "forall"}, + {0x0034, "four"}, + {0x0664, "fourarabic"}, + {0x09ea, "fourbengali"}, + {0x2463, "fourcircle"}, + {0x278d, "fourcircleinversesansserif"}, + {0x096a, "fourdeva"}, + {0x0aea, "fourgujarati"}, + {0x0a6a, "fourgurmukhi"}, + {0x0664, "fourhackarabic"}, + {0x3024, "fourhangzhou"}, + {0x3223, "fourideographicparen"}, + {0x2084, "fourinferior"}, + {0xff14, "fourmonospace"}, + {0x09f7, "fournumeratorbengali"}, + {0xf734, "fouroldstyle"}, + {0x2477, "fourparen"}, + {0x248b, "fourperiod"}, + {0x06f4, "fourpersian"}, + {0x2173, "fourroman"}, + {0x2074, "foursuperior"}, + {0x246d, "fourteencircle"}, + {0x2481, "fourteenparen"}, + {0x2495, "fourteenperiod"}, + {0x0e54, "fourthai"}, + {0x02cb, "fourthtonechinese"}, + {0x24a1, "fparen"}, + {0x2044, "fraction"}, + {0x20a3, "franc"}, + {0x0067, "g"}, + {0x0997, "gabengali"}, + {0x01f5, "gacute"}, + {0x0917, "gadeva"}, + {0x06af, "gafarabic"}, + {0xfb93, "gaffinalarabic"}, + {0xfb94, "gafinitialarabic"}, + {0xfb95, "gafmedialarabic"}, + {0x0a97, "gagujarati"}, + {0x0a17, "gagurmukhi"}, + {0x304c, "gahiragana"}, + {0x30ac, "gakatakana"}, + {0x03b3, "gamma"}, + {0x0263, "gammalatinsmall"}, + {0x02e0, "gammasuperior"}, + {0x03eb, "gangiacoptic"}, + {0x310d, "gbopomofo"}, + {0x011f, "gbreve"}, + {0x01e7, "gcaron"}, + {0x0123, "gcedilla"}, + {0x24d6, "gcircle"}, + {0x011d, "gcircumflex"}, + {0x0123, "gcommaaccent"}, + {0x0121, "gdot"}, + {0x0121, "gdotaccent"}, + {0x0433, "gecyrillic"}, + {0x3052, "gehiragana"}, + {0x30b2, "gekatakana"}, + {0x2251, "geometricallyequal"}, + {0x059c, "gereshaccenthebrew"}, + {0x05f3, "gereshhebrew"}, + {0x059d, "gereshmuqdamhebrew"}, + {0x00df, "germandbls"}, + {0x059e, "gershayimaccenthebrew"}, + {0x05f4, "gershayimhebrew"}, + {0x3013, "getamark"}, + {0x0998, "ghabengali"}, + {0x0572, "ghadarmenian"}, + {0x0918, "ghadeva"}, + {0x0a98, "ghagujarati"}, + {0x0a18, "ghagurmukhi"}, + {0x063a, "ghainarabic"}, + {0xfece, "ghainfinalarabic"}, + {0xfecf, "ghaininitialarabic"}, + {0xfed0, "ghainmedialarabic"}, + {0x0495, "ghemiddlehookcyrillic"}, + {0x0493, "ghestrokecyrillic"}, + {0x0491, "gheupturncyrillic"}, + {0x095a, "ghhadeva"}, + {0x0a5a, "ghhagurmukhi"}, + {0x0260, "ghook"}, + {0x3393, "ghzsquare"}, + {0x304e, "gihiragana"}, + {0x30ae, "gikatakana"}, + {0x0563, "gimarmenian"}, + {0x05d2, "gimel"}, + {0xfb32, "gimeldagesh"}, + {0xfb32, "gimeldageshhebrew"}, + {0x05d2, "gimelhebrew"}, + {0x0453, "gjecyrillic"}, + {0x01be, "glottalinvertedstroke"}, + {0x0294, "glottalstop"}, + {0x0296, "glottalstopinverted"}, + {0x02c0, "glottalstopmod"}, + {0x0295, "glottalstopreversed"}, + {0x02c1, "glottalstopreversedmod"}, + {0x02e4, "glottalstopreversedsuperior"}, + {0x02a1, "glottalstopstroke"}, + {0x02a2, "glottalstopstrokereversed"}, + {0x1e21, "gmacron"}, + {0xff47, "gmonospace"}, + {0x3054, "gohiragana"}, + {0x30b4, "gokatakana"}, + {0x24a2, "gparen"}, + {0x33ac, "gpasquare"}, + {0x2207, "gradient"}, + {0x0060, "grave"}, + {0x0316, "gravebelowcmb"}, + {0x0300, "gravecmb"}, + {0x0300, "gravecomb"}, + {0x0953, "gravedeva"}, + {0x02ce, "gravelowmod"}, + {0xff40, "gravemonospace"}, + {0x0340, "gravetonecmb"}, + {0x003e, "greater"}, + {0x2265, "greaterequal"}, + {0x22db, "greaterequalorless"}, + {0xff1e, "greatermonospace"}, + {0x2273, "greaterorequivalent"}, + {0x2277, "greaterorless"}, + {0x2267, "greateroverequal"}, + {0xfe65, "greatersmall"}, + {0x0261, "gscript"}, + {0x01e5, "gstroke"}, + {0x3050, "guhiragana"}, + {0x00ab, "guillemotleft"}, + {0x00bb, "guillemotright"}, + {0x2039, "guilsinglleft"}, + {0x203a, "guilsinglright"}, + {0x30b0, "gukatakana"}, + {0x3318, "guramusquare"}, + {0x33c9, "gysquare"}, + {0x0068, "h"}, + {0x04a9, "haabkhasiancyrillic"}, + {0x06c1, "haaltonearabic"}, + {0x09b9, "habengali"}, + {0x04b3, "hadescendercyrillic"}, + {0x0939, "hadeva"}, + {0x0ab9, "hagujarati"}, + {0x0a39, "hagurmukhi"}, + {0x062d, "haharabic"}, + {0xfea2, "hahfinalarabic"}, + {0xfea3, "hahinitialarabic"}, + {0x306f, "hahiragana"}, + {0xfea4, "hahmedialarabic"}, + {0x332a, "haitusquare"}, + {0x30cf, "hakatakana"}, + {0xff8a, "hakatakanahalfwidth"}, + {0x0a4d, "halantgurmukhi"}, + {0x0621, "hamzaarabic"}, + {0x0621, "hamzalowarabic"}, + {0x3164, "hangulfiller"}, + {0x044a, "hardsigncyrillic"}, + {0x21bc, "harpoonleftbarbup"}, + {0x21c0, "harpoonrightbarbup"}, + {0x33ca, "hasquare"}, + {0x05b2, "hatafpatah"}, + {0x05b2, "hatafpatah16"}, + {0x05b2, "hatafpatah23"}, + {0x05b2, "hatafpatah2f"}, + {0x05b2, "hatafpatahhebrew"}, + {0x05b2, "hatafpatahnarrowhebrew"}, + {0x05b2, "hatafpatahquarterhebrew"}, + {0x05b2, "hatafpatahwidehebrew"}, + {0x05b3, "hatafqamats"}, + {0x05b3, "hatafqamats1b"}, + {0x05b3, "hatafqamats28"}, + {0x05b3, "hatafqamats34"}, + {0x05b3, "hatafqamatshebrew"}, + {0x05b3, "hatafqamatsnarrowhebrew"}, + {0x05b3, "hatafqamatsquarterhebrew"}, + {0x05b3, "hatafqamatswidehebrew"}, + {0x05b1, "hatafsegol"}, + {0x05b1, "hatafsegol17"}, + {0x05b1, "hatafsegol24"}, + {0x05b1, "hatafsegol30"}, + {0x05b1, "hatafsegolhebrew"}, + {0x05b1, "hatafsegolnarrowhebrew"}, + {0x05b1, "hatafsegolquarterhebrew"}, + {0x05b1, "hatafsegolwidehebrew"}, + {0x0127, "hbar"}, + {0x310f, "hbopomofo"}, + {0x1e2b, "hbrevebelow"}, + {0x1e29, "hcedilla"}, + {0x24d7, "hcircle"}, + {0x0125, "hcircumflex"}, + {0x1e27, "hdieresis"}, + {0x1e23, "hdotaccent"}, + {0x1e25, "hdotbelow"}, + {0x05d4, "he"}, + {0x2665, "heart"}, + {0x2665, "heartsuitblack"}, + {0x2661, "heartsuitwhite"}, + {0xfb34, "hedagesh"}, + {0xfb34, "hedageshhebrew"}, + {0x06c1, "hehaltonearabic"}, + {0x0647, "heharabic"}, + {0x05d4, "hehebrew"}, + {0xfba7, "hehfinalaltonearabic"}, + {0xfeea, "hehfinalalttwoarabic"}, + {0xfeea, "hehfinalarabic"}, + {0xfba5, "hehhamzaabovefinalarabic"}, + {0xfba4, "hehhamzaaboveisolatedarabic"}, + {0xfba8, "hehinitialaltonearabic"}, + {0xfeeb, "hehinitialarabic"}, + {0x3078, "hehiragana"}, + {0xfba9, "hehmedialaltonearabic"}, + {0xfeec, "hehmedialarabic"}, + {0x337b, "heiseierasquare"}, + {0x30d8, "hekatakana"}, + {0xff8d, "hekatakanahalfwidth"}, + {0x3336, "hekutaarusquare"}, + {0x0267, "henghook"}, + {0x3339, "herutusquare"}, + {0x05d7, "het"}, + {0x05d7, "hethebrew"}, + {0x0266, "hhook"}, + {0x02b1, "hhooksuperior"}, + {0x327b, "hieuhacirclekorean"}, + {0x321b, "hieuhaparenkorean"}, + {0x326d, "hieuhcirclekorean"}, + {0x314e, "hieuhkorean"}, + {0x320d, "hieuhparenkorean"}, + {0x3072, "hihiragana"}, + {0x30d2, "hikatakana"}, + {0xff8b, "hikatakanahalfwidth"}, + {0x05b4, "hiriq"}, + {0x05b4, "hiriq14"}, + {0x05b4, "hiriq21"}, + {0x05b4, "hiriq2d"}, + {0x05b4, "hiriqhebrew"}, + {0x05b4, "hiriqnarrowhebrew"}, + {0x05b4, "hiriqquarterhebrew"}, + {0x05b4, "hiriqwidehebrew"}, + {0x1e96, "hlinebelow"}, + {0xff48, "hmonospace"}, + {0x0570, "hoarmenian"}, + {0x0e2b, "hohipthai"}, + {0x307b, "hohiragana"}, + {0x30db, "hokatakana"}, + {0xff8e, "hokatakanahalfwidth"}, + {0x05b9, "holam"}, + {0x05b9, "holam19"}, + {0x05b9, "holam26"}, + {0x05b9, "holam32"}, + {0x05b9, "holamhebrew"}, + {0x05b9, "holamnarrowhebrew"}, + {0x05b9, "holamquarterhebrew"}, + {0x05b9, "holamwidehebrew"}, + {0x0e2e, "honokhukthai"}, + {0x0309, "hookabovecomb"}, + {0x0309, "hookcmb"}, + {0x0321, "hookpalatalizedbelowcmb"}, + {0x0322, "hookretroflexbelowcmb"}, + {0x3342, "hoonsquare"}, + {0x03e9, "horicoptic"}, + {0x2015, "horizontalbar"}, + {0x031b, "horncmb"}, + {0x2668, "hotsprings"}, + {0x2302, "house"}, + {0x24a3, "hparen"}, + {0x02b0, "hsuperior"}, + {0x0265, "hturned"}, + {0x3075, "huhiragana"}, + {0x3333, "huiitosquare"}, + {0x30d5, "hukatakana"}, + {0xff8c, "hukatakanahalfwidth"}, + {0x02dd, "hungarumlaut"}, + {0x030b, "hungarumlautcmb"}, + {0x0195, "hv"}, + {0x002d, "hyphen"}, + {0xf6e5, "hypheninferior"}, + {0xff0d, "hyphenmonospace"}, + {0xfe63, "hyphensmall"}, + {0xf6e6, "hyphensuperior"}, + {0x2010, "hyphentwo"}, + {0x0069, "i"}, + {0x00ed, "iacute"}, + {0x044f, "iacyrillic"}, + {0x0987, "ibengali"}, + {0x3127, "ibopomofo"}, + {0x012d, "ibreve"}, + {0x01d0, "icaron"}, + {0x24d8, "icircle"}, + {0x00ee, "icircumflex"}, + {0x0456, "icyrillic"}, + {0x0209, "idblgrave"}, + {0x328f, "ideographearthcircle"}, + {0x328b, "ideographfirecircle"}, + {0x323f, "ideographicallianceparen"}, + {0x323a, "ideographiccallparen"}, + {0x32a5, "ideographiccentrecircle"}, + {0x3006, "ideographicclose"}, + {0x3001, "ideographiccomma"}, + {0xff64, "ideographiccommaleft"}, + {0x3237, "ideographiccongratulationparen"}, + {0x32a3, "ideographiccorrectcircle"}, + {0x322f, "ideographicearthparen"}, + {0x323d, "ideographicenterpriseparen"}, + {0x329d, "ideographicexcellentcircle"}, + {0x3240, "ideographicfestivalparen"}, + {0x3296, "ideographicfinancialcircle"}, + {0x3236, "ideographicfinancialparen"}, + {0x322b, "ideographicfireparen"}, + {0x3232, "ideographichaveparen"}, + {0x32a4, "ideographichighcircle"}, + {0x3005, "ideographiciterationmark"}, + {0x3298, "ideographiclaborcircle"}, + {0x3238, "ideographiclaborparen"}, + {0x32a7, "ideographicleftcircle"}, + {0x32a6, "ideographiclowcircle"}, + {0x32a9, "ideographicmedicinecircle"}, + {0x322e, "ideographicmetalparen"}, + {0x322a, "ideographicmoonparen"}, + {0x3234, "ideographicnameparen"}, + {0x3002, "ideographicperiod"}, + {0x329e, "ideographicprintcircle"}, + {0x3243, "ideographicreachparen"}, + {0x3239, "ideographicrepresentparen"}, + {0x323e, "ideographicresourceparen"}, + {0x32a8, "ideographicrightcircle"}, + {0x3299, "ideographicsecretcircle"}, + {0x3242, "ideographicselfparen"}, + {0x3233, "ideographicsocietyparen"}, + {0x3000, "ideographicspace"}, + {0x3235, "ideographicspecialparen"}, + {0x3231, "ideographicstockparen"}, + {0x323b, "ideographicstudyparen"}, + {0x3230, "ideographicsunparen"}, + {0x323c, "ideographicsuperviseparen"}, + {0x322c, "ideographicwaterparen"}, + {0x322d, "ideographicwoodparen"}, + {0x3007, "ideographiczero"}, + {0x328e, "ideographmetalcircle"}, + {0x328a, "ideographmooncircle"}, + {0x3294, "ideographnamecircle"}, + {0x3290, "ideographsuncircle"}, + {0x328c, "ideographwatercircle"}, + {0x328d, "ideographwoodcircle"}, + {0x0907, "ideva"}, + {0x00ef, "idieresis"}, + {0x1e2f, "idieresisacute"}, + {0x04e5, "idieresiscyrillic"}, + {0x1ecb, "idotbelow"}, + {0x04d7, "iebrevecyrillic"}, + {0x0435, "iecyrillic"}, + {0x3275, "ieungacirclekorean"}, + {0x3215, "ieungaparenkorean"}, + {0x3267, "ieungcirclekorean"}, + {0x3147, "ieungkorean"}, + {0x3207, "ieungparenkorean"}, + {0x00ec, "igrave"}, + {0x0a87, "igujarati"}, + {0x0a07, "igurmukhi"}, + {0x3044, "ihiragana"}, + {0x1ec9, "ihookabove"}, + {0x0988, "iibengali"}, + {0x0438, "iicyrillic"}, + {0x0908, "iideva"}, + {0x0a88, "iigujarati"}, + {0x0a08, "iigurmukhi"}, + {0x0a40, "iimatragurmukhi"}, + {0x020b, "iinvertedbreve"}, + {0x0439, "iishortcyrillic"}, + {0x09c0, "iivowelsignbengali"}, + {0x0940, "iivowelsigndeva"}, + {0x0ac0, "iivowelsigngujarati"}, + {0x0133, "ij"}, + {0x30a4, "ikatakana"}, + {0xff72, "ikatakanahalfwidth"}, + {0x3163, "ikorean"}, + {0x02dc, "ilde"}, + {0x05ac, "iluyhebrew"}, + {0x012b, "imacron"}, + {0x04e3, "imacroncyrillic"}, + {0x2253, "imageorapproximatelyequal"}, + {0x0a3f, "imatragurmukhi"}, + {0xff49, "imonospace"}, + {0x2206, "increment"}, + {0x221e, "infinity"}, + {0x056b, "iniarmenian"}, + {0x222b, "integral"}, + {0x2321, "integralbottom"}, + {0x2321, "integralbt"}, + {0xf8f5, "integralex"}, + {0x2320, "integraltop"}, + {0x2320, "integraltp"}, + {0x2229, "intersection"}, + {0x3305, "intisquare"}, + {0x25d8, "invbullet"}, + {0x25d9, "invcircle"}, + {0x263b, "invsmileface"}, + {0x0451, "iocyrillic"}, + {0x012f, "iogonek"}, + {0x03b9, "iota"}, + {0x03ca, "iotadieresis"}, + {0x0390, "iotadieresistonos"}, + {0x0269, "iotalatin"}, + {0x03af, "iotatonos"}, + {0x24a4, "iparen"}, + {0x0a72, "irigurmukhi"}, + {0x3043, "ismallhiragana"}, + {0x30a3, "ismallkatakana"}, + {0xff68, "ismallkatakanahalfwidth"}, + {0x09fa, "issharbengali"}, + {0x0268, "istroke"}, + {0xf6ed, "isuperior"}, + {0x309d, "iterationhiragana"}, + {0x30fd, "iterationkatakana"}, + {0x0129, "itilde"}, + {0x1e2d, "itildebelow"}, + {0x3129, "iubopomofo"}, + {0x044e, "iucyrillic"}, + {0x09bf, "ivowelsignbengali"}, + {0x093f, "ivowelsigndeva"}, + {0x0abf, "ivowelsigngujarati"}, + {0x0475, "izhitsacyrillic"}, + {0x0477, "izhitsadblgravecyrillic"}, + {0x006a, "j"}, + {0x0571, "jaarmenian"}, + {0x099c, "jabengali"}, + {0x091c, "jadeva"}, + {0x0a9c, "jagujarati"}, + {0x0a1c, "jagurmukhi"}, + {0x3110, "jbopomofo"}, + {0x01f0, "jcaron"}, + {0x24d9, "jcircle"}, + {0x0135, "jcircumflex"}, + {0x029d, "jcrossedtail"}, + {0x025f, "jdotlessstroke"}, + {0x0458, "jecyrillic"}, + {0x062c, "jeemarabic"}, + {0xfe9e, "jeemfinalarabic"}, + {0xfe9f, "jeeminitialarabic"}, + {0xfea0, "jeemmedialarabic"}, + {0x0698, "jeharabic"}, + {0xfb8b, "jehfinalarabic"}, + {0x099d, "jhabengali"}, + {0x091d, "jhadeva"}, + {0x0a9d, "jhagujarati"}, + {0x0a1d, "jhagurmukhi"}, + {0x057b, "jheharmenian"}, + {0x3004, "jis"}, + {0xff4a, "jmonospace"}, + {0x24a5, "jparen"}, + {0x02b2, "jsuperior"}, + {0x006b, "k"}, + {0x04a1, "kabashkircyrillic"}, + {0x0995, "kabengali"}, + {0x1e31, "kacute"}, + {0x043a, "kacyrillic"}, + {0x049b, "kadescendercyrillic"}, + {0x0915, "kadeva"}, + {0x05db, "kaf"}, + {0x0643, "kafarabic"}, + {0xfb3b, "kafdagesh"}, + {0xfb3b, "kafdageshhebrew"}, + {0xfeda, "kaffinalarabic"}, + {0x05db, "kafhebrew"}, + {0xfedb, "kafinitialarabic"}, + {0xfedc, "kafmedialarabic"}, + {0xfb4d, "kafrafehebrew"}, + {0x0a95, "kagujarati"}, + {0x0a15, "kagurmukhi"}, + {0x304b, "kahiragana"}, + {0x04c4, "kahookcyrillic"}, + {0x30ab, "kakatakana"}, + {0xff76, "kakatakanahalfwidth"}, + {0x03ba, "kappa"}, + {0x03f0, "kappasymbolgreek"}, + {0x3171, "kapyeounmieumkorean"}, + {0x3184, "kapyeounphieuphkorean"}, + {0x3178, "kapyeounpieupkorean"}, + {0x3179, "kapyeounssangpieupkorean"}, + {0x330d, "karoriisquare"}, + {0x0640, "kashidaautoarabic"}, + {0x0640, "kashidaautonosidebearingarabic"}, + {0x30f5, "kasmallkatakana"}, + {0x3384, "kasquare"}, + {0x0650, "kasraarabic"}, + {0x064d, "kasratanarabic"}, + {0x049f, "kastrokecyrillic"}, + {0xff70, "katahiraprolongmarkhalfwidth"}, + {0x049d, "kaverticalstrokecyrillic"}, + {0x310e, "kbopomofo"}, + {0x3389, "kcalsquare"}, + {0x01e9, "kcaron"}, + {0x0137, "kcedilla"}, + {0x24da, "kcircle"}, + {0x0137, "kcommaaccent"}, + {0x1e33, "kdotbelow"}, + {0x0584, "keharmenian"}, + {0x3051, "kehiragana"}, + {0x30b1, "kekatakana"}, + {0xff79, "kekatakanahalfwidth"}, + {0x056f, "kenarmenian"}, + {0x30f6, "kesmallkatakana"}, + {0x0138, "kgreenlandic"}, + {0x0996, "khabengali"}, + {0x0445, "khacyrillic"}, + {0x0916, "khadeva"}, + {0x0a96, "khagujarati"}, + {0x0a16, "khagurmukhi"}, + {0x062e, "khaharabic"}, + {0xfea6, "khahfinalarabic"}, + {0xfea7, "khahinitialarabic"}, + {0xfea8, "khahmedialarabic"}, + {0x03e7, "kheicoptic"}, + {0x0959, "khhadeva"}, + {0x0a59, "khhagurmukhi"}, + {0x3278, "khieukhacirclekorean"}, + {0x3218, "khieukhaparenkorean"}, + {0x326a, "khieukhcirclekorean"}, + {0x314b, "khieukhkorean"}, + {0x320a, "khieukhparenkorean"}, + {0x0e02, "khokhaithai"}, + {0x0e05, "khokhonthai"}, + {0x0e03, "khokhuatthai"}, + {0x0e04, "khokhwaithai"}, + {0x0e5b, "khomutthai"}, + {0x0199, "khook"}, + {0x0e06, "khorakhangthai"}, + {0x3391, "khzsquare"}, + {0x304d, "kihiragana"}, + {0x30ad, "kikatakana"}, + {0xff77, "kikatakanahalfwidth"}, + {0x3315, "kiroguramusquare"}, + {0x3316, "kiromeetorusquare"}, + {0x3314, "kirosquare"}, + {0x326e, "kiyeokacirclekorean"}, + {0x320e, "kiyeokaparenkorean"}, + {0x3260, "kiyeokcirclekorean"}, + {0x3131, "kiyeokkorean"}, + {0x3200, "kiyeokparenkorean"}, + {0x3133, "kiyeoksioskorean"}, + {0x045c, "kjecyrillic"}, + {0x1e35, "klinebelow"}, + {0x3398, "klsquare"}, + {0x33a6, "kmcubedsquare"}, + {0xff4b, "kmonospace"}, + {0x33a2, "kmsquaredsquare"}, + {0x3053, "kohiragana"}, + {0x33c0, "kohmsquare"}, + {0x0e01, "kokaithai"}, + {0x30b3, "kokatakana"}, + {0xff7a, "kokatakanahalfwidth"}, + {0x331e, "kooposquare"}, + {0x0481, "koppacyrillic"}, + {0x327f, "koreanstandardsymbol"}, + {0x0343, "koroniscmb"}, + {0x24a6, "kparen"}, + {0x33aa, "kpasquare"}, + {0x046f, "ksicyrillic"}, + {0x33cf, "ktsquare"}, + {0x029e, "kturned"}, + {0x304f, "kuhiragana"}, + {0x30af, "kukatakana"}, + {0xff78, "kukatakanahalfwidth"}, + {0x33b8, "kvsquare"}, + {0x33be, "kwsquare"}, + {0x006c, "l"}, + {0x09b2, "labengali"}, + {0x013a, "lacute"}, + {0x0932, "ladeva"}, + {0x0ab2, "lagujarati"}, + {0x0a32, "lagurmukhi"}, + {0x0e45, "lakkhangyaothai"}, + {0xfefc, "lamaleffinalarabic"}, + {0xfef8, "lamalefhamzaabovefinalarabic"}, + {0xfef7, "lamalefhamzaaboveisolatedarabic"}, + {0xfefa, "lamalefhamzabelowfinalarabic"}, + {0xfef9, "lamalefhamzabelowisolatedarabic"}, + {0xfefb, "lamalefisolatedarabic"}, + {0xfef6, "lamalefmaddaabovefinalarabic"}, + {0xfef5, "lamalefmaddaaboveisolatedarabic"}, + {0x0644, "lamarabic"}, + {0x03bb, "lambda"}, + {0x019b, "lambdastroke"}, + {0x05dc, "lamed"}, + {0xfb3c, "lameddagesh"}, + {0xfb3c, "lameddageshhebrew"}, + {0x05dc, "lamedhebrew"}, + {0xfede, "lamfinalarabic"}, + {0xfcca, "lamhahinitialarabic"}, + {0xfedf, "laminitialarabic"}, + {0xfcc9, "lamjeeminitialarabic"}, + {0xfccb, "lamkhahinitialarabic"}, + {0xfdf2, "lamlamhehisolatedarabic"}, + {0xfee0, "lammedialarabic"}, + {0xfd88, "lammeemhahinitialarabic"}, + {0xfccc, "lammeeminitialarabic"}, + {0x25ef, "largecircle"}, + {0x019a, "lbar"}, + {0x026c, "lbelt"}, + {0x310c, "lbopomofo"}, + {0x013e, "lcaron"}, + {0x013c, "lcedilla"}, + {0x24db, "lcircle"}, + {0x1e3d, "lcircumflexbelow"}, + {0x013c, "lcommaaccent"}, + {0x0140, "ldot"}, + {0x0140, "ldotaccent"}, + {0x1e37, "ldotbelow"}, + {0x1e39, "ldotbelowmacron"}, + {0x031a, "leftangleabovecmb"}, + {0x0318, "lefttackbelowcmb"}, + {0x003c, "less"}, + {0x2264, "lessequal"}, + {0x22da, "lessequalorgreater"}, + {0xff1c, "lessmonospace"}, + {0x2272, "lessorequivalent"}, + {0x2276, "lessorgreater"}, + {0x2266, "lessoverequal"}, + {0xfe64, "lesssmall"}, + {0x026e, "lezh"}, + {0x258c, "lfblock"}, + {0x026d, "lhookretroflex"}, + {0x20a4, "lira"}, + {0x056c, "liwnarmenian"}, + {0x01c9, "lj"}, + {0x0459, "ljecyrillic"}, + {0xf6c0, "ll"}, + {0x0933, "lladeva"}, + {0x0ab3, "llagujarati"}, + {0x1e3b, "llinebelow"}, + {0x0934, "llladeva"}, + {0x09e1, "llvocalicbengali"}, + {0x0961, "llvocalicdeva"}, + {0x09e3, "llvocalicvowelsignbengali"}, + {0x0963, "llvocalicvowelsigndeva"}, + {0x026b, "lmiddletilde"}, + {0xff4c, "lmonospace"}, + {0x33d0, "lmsquare"}, + {0x0e2c, "lochulathai"}, + {0x2227, "logicaland"}, + {0x00ac, "logicalnot"}, + {0x2310, "logicalnotreversed"}, + {0x2228, "logicalor"}, + {0x0e25, "lolingthai"}, + {0x017f, "longs"}, + {0xfe4e, "lowlinecenterline"}, + {0x0332, "lowlinecmb"}, + {0xfe4d, "lowlinedashed"}, + {0x25ca, "lozenge"}, + {0x24a7, "lparen"}, + {0x0142, "lslash"}, + {0x2113, "lsquare"}, + {0xf6ee, "lsuperior"}, + {0x2591, "ltshade"}, + {0x0e26, "luthai"}, + {0x098c, "lvocalicbengali"}, + {0x090c, "lvocalicdeva"}, + {0x09e2, "lvocalicvowelsignbengali"}, + {0x0962, "lvocalicvowelsigndeva"}, + {0x33d3, "lxsquare"}, + {0x006d, "m"}, + {0x09ae, "mabengali"}, + {0x00af, "macron"}, + {0x0331, "macronbelowcmb"}, + {0x0304, "macroncmb"}, + {0x02cd, "macronlowmod"}, + {0xffe3, "macronmonospace"}, + {0x1e3f, "macute"}, + {0x092e, "madeva"}, + {0x0aae, "magujarati"}, + {0x0a2e, "magurmukhi"}, + {0x05a4, "mahapakhhebrew"}, + {0x05a4, "mahapakhlefthebrew"}, + {0x307e, "mahiragana"}, + {0xf895, "maichattawalowleftthai"}, + {0xf894, "maichattawalowrightthai"}, + {0x0e4b, "maichattawathai"}, + {0xf893, "maichattawaupperleftthai"}, + {0xf88c, "maieklowleftthai"}, + {0xf88b, "maieklowrightthai"}, + {0x0e48, "maiekthai"}, + {0xf88a, "maiekupperleftthai"}, + {0xf884, "maihanakatleftthai"}, + {0x0e31, "maihanakatthai"}, + {0xf889, "maitaikhuleftthai"}, + {0x0e47, "maitaikhuthai"}, + {0xf88f, "maitholowleftthai"}, + {0xf88e, "maitholowrightthai"}, + {0x0e49, "maithothai"}, + {0xf88d, "maithoupperleftthai"}, + {0xf892, "maitrilowleftthai"}, + {0xf891, "maitrilowrightthai"}, + {0x0e4a, "maitrithai"}, + {0xf890, "maitriupperleftthai"}, + {0x0e46, "maiyamokthai"}, + {0x30de, "makatakana"}, + {0xff8f, "makatakanahalfwidth"}, + {0x2642, "male"}, + {0x3347, "mansyonsquare"}, + {0x05be, "maqafhebrew"}, + {0x2642, "mars"}, + {0x05af, "masoracirclehebrew"}, + {0x3383, "masquare"}, + {0x3107, "mbopomofo"}, + {0x33d4, "mbsquare"}, + {0x24dc, "mcircle"}, + {0x33a5, "mcubedsquare"}, + {0x1e41, "mdotaccent"}, + {0x1e43, "mdotbelow"}, + {0x0645, "meemarabic"}, + {0xfee2, "meemfinalarabic"}, + {0xfee3, "meeminitialarabic"}, + {0xfee4, "meemmedialarabic"}, + {0xfcd1, "meemmeeminitialarabic"}, + {0xfc48, "meemmeemisolatedarabic"}, + {0x334d, "meetorusquare"}, + {0x3081, "mehiragana"}, + {0x337e, "meizierasquare"}, + {0x30e1, "mekatakana"}, + {0xff92, "mekatakanahalfwidth"}, + {0x05de, "mem"}, + {0xfb3e, "memdagesh"}, + {0xfb3e, "memdageshhebrew"}, + {0x05de, "memhebrew"}, + {0x0574, "menarmenian"}, + {0x05a5, "merkhahebrew"}, + {0x05a6, "merkhakefulahebrew"}, + {0x05a6, "merkhakefulalefthebrew"}, + {0x05a5, "merkhalefthebrew"}, + {0x0271, "mhook"}, + {0x3392, "mhzsquare"}, + {0xff65, "middledotkatakanahalfwidth"}, + {0x00b7, "middot"}, + {0x3272, "mieumacirclekorean"}, + {0x3212, "mieumaparenkorean"}, + {0x3264, "mieumcirclekorean"}, + {0x3141, "mieumkorean"}, + {0x3170, "mieumpansioskorean"}, + {0x3204, "mieumparenkorean"}, + {0x316e, "mieumpieupkorean"}, + {0x316f, "mieumsioskorean"}, + {0x307f, "mihiragana"}, + {0x30df, "mikatakana"}, + {0xff90, "mikatakanahalfwidth"}, + {0x2212, "minus"}, + {0x0320, "minusbelowcmb"}, + {0x2296, "minuscircle"}, + {0x02d7, "minusmod"}, + {0x2213, "minusplus"}, + {0x2032, "minute"}, + {0x334a, "miribaarusquare"}, + {0x3349, "mirisquare"}, + {0x0270, "mlonglegturned"}, + {0x3396, "mlsquare"}, + {0x33a3, "mmcubedsquare"}, + {0xff4d, "mmonospace"}, + {0x339f, "mmsquaredsquare"}, + {0x3082, "mohiragana"}, + {0x33c1, "mohmsquare"}, + {0x30e2, "mokatakana"}, + {0xff93, "mokatakanahalfwidth"}, + {0x33d6, "molsquare"}, + {0x0e21, "momathai"}, + {0x33a7, "moverssquare"}, + {0x33a8, "moverssquaredsquare"}, + {0x24a8, "mparen"}, + {0x33ab, "mpasquare"}, + {0x33b3, "mssquare"}, + {0xf6ef, "msuperior"}, + {0x026f, "mturned"}, + {0x00b5, "mu"}, + {0x00b5, "mu1"}, + {0x3382, "muasquare"}, + {0x226b, "muchgreater"}, + {0x226a, "muchless"}, + {0x338c, "mufsquare"}, + {0x03bc, "mugreek"}, + {0x338d, "mugsquare"}, + {0x3080, "muhiragana"}, + {0x30e0, "mukatakana"}, + {0xff91, "mukatakanahalfwidth"}, + {0x3395, "mulsquare"}, + {0x00d7, "multiply"}, + {0x339b, "mumsquare"}, + {0x05a3, "munahhebrew"}, + {0x05a3, "munahlefthebrew"}, + {0x266a, "musicalnote"}, + {0x266b, "musicalnotedbl"}, + {0x266d, "musicflatsign"}, + {0x266f, "musicsharpsign"}, + {0x33b2, "mussquare"}, + {0x33b6, "muvsquare"}, + {0x33bc, "muwsquare"}, + {0x33b9, "mvmegasquare"}, + {0x33b7, "mvsquare"}, + {0x33bf, "mwmegasquare"}, + {0x33bd, "mwsquare"}, + {0x006e, "n"}, + {0x09a8, "nabengali"}, + {0x2207, "nabla"}, + {0x0144, "nacute"}, + {0x0928, "nadeva"}, + {0x0aa8, "nagujarati"}, + {0x0a28, "nagurmukhi"}, + {0x306a, "nahiragana"}, + {0x30ca, "nakatakana"}, + {0xff85, "nakatakanahalfwidth"}, + {0x0149, "napostrophe"}, + {0x3381, "nasquare"}, + {0x310b, "nbopomofo"}, + {0x00a0, "nbspace"}, + {0x0148, "ncaron"}, + {0x0146, "ncedilla"}, + {0x24dd, "ncircle"}, + {0x1e4b, "ncircumflexbelow"}, + {0x0146, "ncommaaccent"}, + {0x1e45, "ndotaccent"}, + {0x1e47, "ndotbelow"}, + {0x306d, "nehiragana"}, + {0x30cd, "nekatakana"}, + {0xff88, "nekatakanahalfwidth"}, + {0x20aa, "newsheqelsign"}, + {0x338b, "nfsquare"}, + {0x0999, "ngabengali"}, + {0x0919, "ngadeva"}, + {0x0a99, "ngagujarati"}, + {0x0a19, "ngagurmukhi"}, + {0x0e07, "ngonguthai"}, + {0x3093, "nhiragana"}, + {0x0272, "nhookleft"}, + {0x0273, "nhookretroflex"}, + {0x326f, "nieunacirclekorean"}, + {0x320f, "nieunaparenkorean"}, + {0x3135, "nieuncieuckorean"}, + {0x3261, "nieuncirclekorean"}, + {0x3136, "nieunhieuhkorean"}, + {0x3134, "nieunkorean"}, + {0x3168, "nieunpansioskorean"}, + {0x3201, "nieunparenkorean"}, + {0x3167, "nieunsioskorean"}, + {0x3166, "nieuntikeutkorean"}, + {0x306b, "nihiragana"}, + {0x30cb, "nikatakana"}, + {0xff86, "nikatakanahalfwidth"}, + {0xf899, "nikhahitleftthai"}, + {0x0e4d, "nikhahitthai"}, + {0x0039, "nine"}, + {0x0669, "ninearabic"}, + {0x09ef, "ninebengali"}, + {0x2468, "ninecircle"}, + {0x2792, "ninecircleinversesansserif"}, + {0x096f, "ninedeva"}, + {0x0aef, "ninegujarati"}, + {0x0a6f, "ninegurmukhi"}, + {0x0669, "ninehackarabic"}, + {0x3029, "ninehangzhou"}, + {0x3228, "nineideographicparen"}, + {0x2089, "nineinferior"}, + {0xff19, "ninemonospace"}, + {0xf739, "nineoldstyle"}, + {0x247c, "nineparen"}, + {0x2490, "nineperiod"}, + {0x06f9, "ninepersian"}, + {0x2178, "nineroman"}, + {0x2079, "ninesuperior"}, + {0x2472, "nineteencircle"}, + {0x2486, "nineteenparen"}, + {0x249a, "nineteenperiod"}, + {0x0e59, "ninethai"}, + {0x01cc, "nj"}, + {0x045a, "njecyrillic"}, + {0x30f3, "nkatakana"}, + {0xff9d, "nkatakanahalfwidth"}, + {0x019e, "nlegrightlong"}, + {0x1e49, "nlinebelow"}, + {0xff4e, "nmonospace"}, + {0x339a, "nmsquare"}, + {0x09a3, "nnabengali"}, + {0x0923, "nnadeva"}, + {0x0aa3, "nnagujarati"}, + {0x0a23, "nnagurmukhi"}, + {0x0929, "nnnadeva"}, + {0x306e, "nohiragana"}, + {0x30ce, "nokatakana"}, + {0xff89, "nokatakanahalfwidth"}, + {0x00a0, "nonbreakingspace"}, + {0x0e13, "nonenthai"}, + {0x0e19, "nonuthai"}, + {0x0646, "noonarabic"}, + {0xfee6, "noonfinalarabic"}, + {0x06ba, "noonghunnaarabic"}, + {0xfb9f, "noonghunnafinalarabic"}, + {0xfee7, "nooninitialarabic"}, + {0xfcd2, "noonjeeminitialarabic"}, + {0xfc4b, "noonjeemisolatedarabic"}, + {0xfee8, "noonmedialarabic"}, + {0xfcd5, "noonmeeminitialarabic"}, + {0xfc4e, "noonmeemisolatedarabic"}, + {0xfc8d, "noonnoonfinalarabic"}, + {0x220c, "notcontains"}, + {0x2209, "notelement"}, + {0x2209, "notelementof"}, + {0x2260, "notequal"}, + {0x226f, "notgreater"}, + {0x2271, "notgreaternorequal"}, + {0x2279, "notgreaternorless"}, + {0x2262, "notidentical"}, + {0x226e, "notless"}, + {0x2270, "notlessnorequal"}, + {0x2226, "notparallel"}, + {0x2280, "notprecedes"}, + {0x2284, "notsubset"}, + {0x2281, "notsucceeds"}, + {0x2285, "notsuperset"}, + {0x0576, "nowarmenian"}, + {0x24a9, "nparen"}, + {0x33b1, "nssquare"}, + {0x207f, "nsuperior"}, + {0x00f1, "ntilde"}, + {0x03bd, "nu"}, + {0x306c, "nuhiragana"}, + {0x30cc, "nukatakana"}, + {0xff87, "nukatakanahalfwidth"}, + {0x09bc, "nuktabengali"}, + {0x093c, "nuktadeva"}, + {0x0abc, "nuktagujarati"}, + {0x0a3c, "nuktagurmukhi"}, + {0x0023, "numbersign"}, + {0xff03, "numbersignmonospace"}, + {0xfe5f, "numbersignsmall"}, + {0x0374, "numeralsigngreek"}, + {0x0375, "numeralsignlowergreek"}, + {0x2116, "numero"}, + {0x05e0, "nun"}, + {0xfb40, "nundagesh"}, + {0xfb40, "nundageshhebrew"}, + {0x05e0, "nunhebrew"}, + {0x33b5, "nvsquare"}, + {0x33bb, "nwsquare"}, + {0x099e, "nyabengali"}, + {0x091e, "nyadeva"}, + {0x0a9e, "nyagujarati"}, + {0x0a1e, "nyagurmukhi"}, + {0x006f, "o"}, + {0x00f3, "oacute"}, + {0x0e2d, "oangthai"}, + {0x0275, "obarred"}, + {0x04e9, "obarredcyrillic"}, + {0x04eb, "obarreddieresiscyrillic"}, + {0x0993, "obengali"}, + {0x311b, "obopomofo"}, + {0x014f, "obreve"}, + {0x0911, "ocandradeva"}, + {0x0a91, "ocandragujarati"}, + {0x0949, "ocandravowelsigndeva"}, + {0x0ac9, "ocandravowelsigngujarati"}, + {0x01d2, "ocaron"}, + {0x24de, "ocircle"}, + {0x00f4, "ocircumflex"}, + {0x1ed1, "ocircumflexacute"}, + {0x1ed9, "ocircumflexdotbelow"}, + {0x1ed3, "ocircumflexgrave"}, + {0x1ed5, "ocircumflexhookabove"}, + {0x1ed7, "ocircumflextilde"}, + {0x043e, "ocyrillic"}, + {0x0151, "odblacute"}, + {0x020d, "odblgrave"}, + {0x0913, "odeva"}, + {0x00f6, "odieresis"}, + {0x04e7, "odieresiscyrillic"}, + {0x1ecd, "odotbelow"}, + {0x0153, "oe"}, + {0x315a, "oekorean"}, + {0x02db, "ogonek"}, + {0x0328, "ogonekcmb"}, + {0x00f2, "ograve"}, + {0x0a93, "ogujarati"}, + {0x0585, "oharmenian"}, + {0x304a, "ohiragana"}, + {0x1ecf, "ohookabove"}, + {0x01a1, "ohorn"}, + {0x1edb, "ohornacute"}, + {0x1ee3, "ohorndotbelow"}, + {0x1edd, "ohorngrave"}, + {0x1edf, "ohornhookabove"}, + {0x1ee1, "ohorntilde"}, + {0x0151, "ohungarumlaut"}, + {0x01a3, "oi"}, + {0x020f, "oinvertedbreve"}, + {0x30aa, "okatakana"}, + {0xff75, "okatakanahalfwidth"}, + {0x3157, "okorean"}, + {0x05ab, "olehebrew"}, + {0x014d, "omacron"}, + {0x1e53, "omacronacute"}, + {0x1e51, "omacrongrave"}, + {0x0950, "omdeva"}, + {0x03c9, "omega"}, + {0x03d6, "omega1"}, + {0x0461, "omegacyrillic"}, + {0x0277, "omegalatinclosed"}, + {0x047b, "omegaroundcyrillic"}, + {0x047d, "omegatitlocyrillic"}, + {0x03ce, "omegatonos"}, + {0x0ad0, "omgujarati"}, + {0x03bf, "omicron"}, + {0x03cc, "omicrontonos"}, + {0xff4f, "omonospace"}, + {0x0031, "one"}, + {0x0661, "onearabic"}, + {0x09e7, "onebengali"}, + {0x2460, "onecircle"}, + {0x278a, "onecircleinversesansserif"}, + {0x0967, "onedeva"}, + {0x2024, "onedotenleader"}, + {0x215b, "oneeighth"}, + {0xf6dc, "onefitted"}, + {0x0ae7, "onegujarati"}, + {0x0a67, "onegurmukhi"}, + {0x0661, "onehackarabic"}, + {0x00bd, "onehalf"}, + {0x3021, "onehangzhou"}, + {0x3220, "oneideographicparen"}, + {0x2081, "oneinferior"}, + {0xff11, "onemonospace"}, + {0x09f4, "onenumeratorbengali"}, + {0xf731, "oneoldstyle"}, + {0x2474, "oneparen"}, + {0x2488, "oneperiod"}, + {0x06f1, "onepersian"}, + {0x00bc, "onequarter"}, + {0x2170, "oneroman"}, + {0x00b9, "onesuperior"}, + {0x0e51, "onethai"}, + {0x2153, "onethird"}, + {0x01eb, "oogonek"}, + {0x01ed, "oogonekmacron"}, + {0x0a13, "oogurmukhi"}, + {0x0a4b, "oomatragurmukhi"}, + {0x0254, "oopen"}, + {0x24aa, "oparen"}, + {0x25e6, "openbullet"}, + {0x2325, "option"}, + {0x00aa, "ordfeminine"}, + {0x00ba, "ordmasculine"}, + {0x221f, "orthogonal"}, + {0x0912, "oshortdeva"}, + {0x094a, "oshortvowelsigndeva"}, + {0x00f8, "oslash"}, + {0x01ff, "oslashacute"}, + {0x3049, "osmallhiragana"}, + {0x30a9, "osmallkatakana"}, + {0xff6b, "osmallkatakanahalfwidth"}, + {0x01ff, "ostrokeacute"}, + {0xf6f0, "osuperior"}, + {0x047f, "otcyrillic"}, + {0x00f5, "otilde"}, + {0x1e4d, "otildeacute"}, + {0x1e4f, "otildedieresis"}, + {0x3121, "oubopomofo"}, + {0x203e, "overline"}, + {0xfe4a, "overlinecenterline"}, + {0x0305, "overlinecmb"}, + {0xfe49, "overlinedashed"}, + {0xfe4c, "overlinedblwavy"}, + {0xfe4b, "overlinewavy"}, + {0x00af, "overscore"}, + {0x09cb, "ovowelsignbengali"}, + {0x094b, "ovowelsigndeva"}, + {0x0acb, "ovowelsigngujarati"}, + {0x0070, "p"}, + {0x3380, "paampssquare"}, + {0x332b, "paasentosquare"}, + {0x09aa, "pabengali"}, + {0x1e55, "pacute"}, + {0x092a, "padeva"}, + {0x21df, "pagedown"}, + {0x21de, "pageup"}, + {0x0aaa, "pagujarati"}, + {0x0a2a, "pagurmukhi"}, + {0x3071, "pahiragana"}, + {0x0e2f, "paiyannoithai"}, + {0x30d1, "pakatakana"}, + {0x0484, "palatalizationcyrilliccmb"}, + {0x04c0, "palochkacyrillic"}, + {0x317f, "pansioskorean"}, + {0x00b6, "paragraph"}, + {0x2225, "parallel"}, + {0x0028, "parenleft"}, + {0xfd3e, "parenleftaltonearabic"}, + {0xf8ed, "parenleftbt"}, + {0xf8ec, "parenleftex"}, + {0x208d, "parenleftinferior"}, + {0xff08, "parenleftmonospace"}, + {0xfe59, "parenleftsmall"}, + {0x207d, "parenleftsuperior"}, + {0xf8eb, "parenlefttp"}, + {0xfe35, "parenleftvertical"}, + {0x0029, "parenright"}, + {0xfd3f, "parenrightaltonearabic"}, + {0xf8f8, "parenrightbt"}, + {0xf8f7, "parenrightex"}, + {0x208e, "parenrightinferior"}, + {0xff09, "parenrightmonospace"}, + {0xfe5a, "parenrightsmall"}, + {0x207e, "parenrightsuperior"}, + {0xf8f6, "parenrighttp"}, + {0xfe36, "parenrightvertical"}, + {0x2202, "partialdiff"}, + {0x05c0, "paseqhebrew"}, + {0x0599, "pashtahebrew"}, + {0x33a9, "pasquare"}, + {0x05b7, "patah"}, + {0x05b7, "patah11"}, + {0x05b7, "patah1d"}, + {0x05b7, "patah2a"}, + {0x05b7, "patahhebrew"}, + {0x05b7, "patahnarrowhebrew"}, + {0x05b7, "patahquarterhebrew"}, + {0x05b7, "patahwidehebrew"}, + {0x05a1, "pazerhebrew"}, + {0x3106, "pbopomofo"}, + {0x24df, "pcircle"}, + {0x1e57, "pdotaccent"}, + {0x05e4, "pe"}, + {0x043f, "pecyrillic"}, + {0xfb44, "pedagesh"}, + {0xfb44, "pedageshhebrew"}, + {0x333b, "peezisquare"}, + {0xfb43, "pefinaldageshhebrew"}, + {0x067e, "peharabic"}, + {0x057a, "peharmenian"}, + {0x05e4, "pehebrew"}, + {0xfb57, "pehfinalarabic"}, + {0xfb58, "pehinitialarabic"}, + {0x307a, "pehiragana"}, + {0xfb59, "pehmedialarabic"}, + {0x30da, "pekatakana"}, + {0x04a7, "pemiddlehookcyrillic"}, + {0xfb4e, "perafehebrew"}, + {0x0025, "percent"}, + {0x066a, "percentarabic"}, + {0xff05, "percentmonospace"}, + {0xfe6a, "percentsmall"}, + {0x002e, "period"}, + {0x0589, "periodarmenian"}, + {0x00b7, "periodcentered"}, + {0xff61, "periodhalfwidth"}, + {0xf6e7, "periodinferior"}, + {0xff0e, "periodmonospace"}, + {0xfe52, "periodsmall"}, + {0xf6e8, "periodsuperior"}, + {0x0342, "perispomenigreekcmb"}, + {0x22a5, "perpendicular"}, + {0x2030, "perthousand"}, + {0x20a7, "peseta"}, + {0x338a, "pfsquare"}, + {0x09ab, "phabengali"}, + {0x092b, "phadeva"}, + {0x0aab, "phagujarati"}, + {0x0a2b, "phagurmukhi"}, + {0x03c6, "phi"}, + {0x03d5, "phi1"}, + {0x327a, "phieuphacirclekorean"}, + {0x321a, "phieuphaparenkorean"}, + {0x326c, "phieuphcirclekorean"}, + {0x314d, "phieuphkorean"}, + {0x320c, "phieuphparenkorean"}, + {0x0278, "philatin"}, + {0x0e3a, "phinthuthai"}, + {0x03d5, "phisymbolgreek"}, + {0x01a5, "phook"}, + {0x0e1e, "phophanthai"}, + {0x0e1c, "phophungthai"}, + {0x0e20, "phosamphaothai"}, + {0x03c0, "pi"}, + {0x3273, "pieupacirclekorean"}, + {0x3213, "pieupaparenkorean"}, + {0x3176, "pieupcieuckorean"}, + {0x3265, "pieupcirclekorean"}, + {0x3172, "pieupkiyeokkorean"}, + {0x3142, "pieupkorean"}, + {0x3205, "pieupparenkorean"}, + {0x3174, "pieupsioskiyeokkorean"}, + {0x3144, "pieupsioskorean"}, + {0x3175, "pieupsiostikeutkorean"}, + {0x3177, "pieupthieuthkorean"}, + {0x3173, "pieuptikeutkorean"}, + {0x3074, "pihiragana"}, + {0x30d4, "pikatakana"}, + {0x03d6, "pisymbolgreek"}, + {0x0583, "piwrarmenian"}, + {0x002b, "plus"}, + {0x031f, "plusbelowcmb"}, + {0x2295, "pluscircle"}, + {0x00b1, "plusminus"}, + {0x02d6, "plusmod"}, + {0xff0b, "plusmonospace"}, + {0xfe62, "plussmall"}, + {0x207a, "plussuperior"}, + {0xff50, "pmonospace"}, + {0x33d8, "pmsquare"}, + {0x307d, "pohiragana"}, + {0x261f, "pointingindexdownwhite"}, + {0x261c, "pointingindexleftwhite"}, + {0x261e, "pointingindexrightwhite"}, + {0x261d, "pointingindexupwhite"}, + {0x30dd, "pokatakana"}, + {0x0e1b, "poplathai"}, + {0x3012, "postalmark"}, + {0x3020, "postalmarkface"}, + {0x24ab, "pparen"}, + {0x227a, "precedes"}, + {0x211e, "prescription"}, + {0x02b9, "primemod"}, + {0x2035, "primereversed"}, + {0x220f, "product"}, + {0x2305, "projective"}, + {0x30fc, "prolongedkana"}, + {0x2318, "propellor"}, + {0x2282, "propersubset"}, + {0x2283, "propersuperset"}, + {0x2237, "proportion"}, + {0x221d, "proportional"}, + {0x03c8, "psi"}, + {0x0471, "psicyrillic"}, + {0x0486, "psilipneumatacyrilliccmb"}, + {0x33b0, "pssquare"}, + {0x3077, "puhiragana"}, + {0x30d7, "pukatakana"}, + {0x33b4, "pvsquare"}, + {0x33ba, "pwsquare"}, + {0x0071, "q"}, + {0x0958, "qadeva"}, + {0x05a8, "qadmahebrew"}, + {0x0642, "qafarabic"}, + {0xfed6, "qaffinalarabic"}, + {0xfed7, "qafinitialarabic"}, + {0xfed8, "qafmedialarabic"}, + {0x05b8, "qamats"}, + {0x05b8, "qamats10"}, + {0x05b8, "qamats1a"}, + {0x05b8, "qamats1c"}, + {0x05b8, "qamats27"}, + {0x05b8, "qamats29"}, + {0x05b8, "qamats33"}, + {0x05b8, "qamatsde"}, + {0x05b8, "qamatshebrew"}, + {0x05b8, "qamatsnarrowhebrew"}, + {0x05b8, "qamatsqatanhebrew"}, + {0x05b8, "qamatsqatannarrowhebrew"}, + {0x05b8, "qamatsqatanquarterhebrew"}, + {0x05b8, "qamatsqatanwidehebrew"}, + {0x05b8, "qamatsquarterhebrew"}, + {0x05b8, "qamatswidehebrew"}, + {0x059f, "qarneyparahebrew"}, + {0x3111, "qbopomofo"}, + {0x24e0, "qcircle"}, + {0x02a0, "qhook"}, + {0xff51, "qmonospace"}, + {0x05e7, "qof"}, + {0xfb47, "qofdagesh"}, + {0xfb47, "qofdageshhebrew"}, + {0x05e7, "qofhebrew"}, + {0x24ac, "qparen"}, + {0x2669, "quarternote"}, + {0x05bb, "qubuts"}, + {0x05bb, "qubuts18"}, + {0x05bb, "qubuts25"}, + {0x05bb, "qubuts31"}, + {0x05bb, "qubutshebrew"}, + {0x05bb, "qubutsnarrowhebrew"}, + {0x05bb, "qubutsquarterhebrew"}, + {0x05bb, "qubutswidehebrew"}, + {0x003f, "question"}, + {0x061f, "questionarabic"}, + {0x055e, "questionarmenian"}, + {0x00bf, "questiondown"}, + {0xf7bf, "questiondownsmall"}, + {0x037e, "questiongreek"}, + {0xff1f, "questionmonospace"}, + {0xf73f, "questionsmall"}, + {0x0022, "quotedbl"}, + {0x201e, "quotedblbase"}, + {0x201c, "quotedblleft"}, + {0xff02, "quotedblmonospace"}, + {0x301e, "quotedblprime"}, + {0x301d, "quotedblprimereversed"}, + {0x201d, "quotedblright"}, + {0x2018, "quoteleft"}, + {0x201b, "quoteleftreversed"}, + {0x201b, "quotereversed"}, + {0x2019, "quoteright"}, + {0x0149, "quoterightn"}, + {0x201a, "quotesinglbase"}, + {0x0027, "quotesingle"}, + {0xff07, "quotesinglemonospace"}, + {0x0072, "r"}, + {0x057c, "raarmenian"}, + {0x09b0, "rabengali"}, + {0x0155, "racute"}, + {0x0930, "radeva"}, + {0x221a, "radical"}, + {0xf8e5, "radicalex"}, + {0x33ae, "radoverssquare"}, + {0x33af, "radoverssquaredsquare"}, + {0x33ad, "radsquare"}, + {0x05bf, "rafe"}, + {0x05bf, "rafehebrew"}, + {0x0ab0, "ragujarati"}, + {0x0a30, "ragurmukhi"}, + {0x3089, "rahiragana"}, + {0x30e9, "rakatakana"}, + {0xff97, "rakatakanahalfwidth"}, + {0x09f1, "ralowerdiagonalbengali"}, + {0x09f0, "ramiddlediagonalbengali"}, + {0x0264, "ramshorn"}, + {0x2236, "ratio"}, + {0x3116, "rbopomofo"}, + {0x0159, "rcaron"}, + {0x0157, "rcedilla"}, + {0x24e1, "rcircle"}, + {0x0157, "rcommaaccent"}, + {0x0211, "rdblgrave"}, + {0x1e59, "rdotaccent"}, + {0x1e5b, "rdotbelow"}, + {0x1e5d, "rdotbelowmacron"}, + {0x203b, "referencemark"}, + {0x2286, "reflexsubset"}, + {0x2287, "reflexsuperset"}, + {0x00ae, "registered"}, + {0xf8e8, "registersans"}, + {0xf6da, "registerserif"}, + {0x0631, "reharabic"}, + {0x0580, "reharmenian"}, + {0xfeae, "rehfinalarabic"}, + {0x308c, "rehiragana"}, + {0x30ec, "rekatakana"}, + {0xff9a, "rekatakanahalfwidth"}, + {0x05e8, "resh"}, + {0xfb48, "reshdageshhebrew"}, + {0x05e8, "reshhebrew"}, + {0x223d, "reversedtilde"}, + {0x0597, "reviahebrew"}, + {0x0597, "reviamugrashhebrew"}, + {0x2310, "revlogicalnot"}, + {0x027e, "rfishhook"}, + {0x027f, "rfishhookreversed"}, + {0x09dd, "rhabengali"}, + {0x095d, "rhadeva"}, + {0x03c1, "rho"}, + {0x027d, "rhook"}, + {0x027b, "rhookturned"}, + {0x02b5, "rhookturnedsuperior"}, + {0x03f1, "rhosymbolgreek"}, + {0x02de, "rhotichookmod"}, + {0x3271, "rieulacirclekorean"}, + {0x3211, "rieulaparenkorean"}, + {0x3263, "rieulcirclekorean"}, + {0x3140, "rieulhieuhkorean"}, + {0x313a, "rieulkiyeokkorean"}, + {0x3169, "rieulkiyeoksioskorean"}, + {0x3139, "rieulkorean"}, + {0x313b, "rieulmieumkorean"}, + {0x316c, "rieulpansioskorean"}, + {0x3203, "rieulparenkorean"}, + {0x313f, "rieulphieuphkorean"}, + {0x313c, "rieulpieupkorean"}, + {0x316b, "rieulpieupsioskorean"}, + {0x313d, "rieulsioskorean"}, + {0x313e, "rieulthieuthkorean"}, + {0x316a, "rieultikeutkorean"}, + {0x316d, "rieulyeorinhieuhkorean"}, + {0x221f, "rightangle"}, + {0x0319, "righttackbelowcmb"}, + {0x22bf, "righttriangle"}, + {0x308a, "rihiragana"}, + {0x30ea, "rikatakana"}, + {0xff98, "rikatakanahalfwidth"}, + {0x02da, "ring"}, + {0x0325, "ringbelowcmb"}, + {0x030a, "ringcmb"}, + {0x02bf, "ringhalfleft"}, + {0x0559, "ringhalfleftarmenian"}, + {0x031c, "ringhalfleftbelowcmb"}, + {0x02d3, "ringhalfleftcentered"}, + {0x02be, "ringhalfright"}, + {0x0339, "ringhalfrightbelowcmb"}, + {0x02d2, "ringhalfrightcentered"}, + {0x0213, "rinvertedbreve"}, + {0x3351, "rittorusquare"}, + {0x1e5f, "rlinebelow"}, + {0x027c, "rlongleg"}, + {0x027a, "rlonglegturned"}, + {0xff52, "rmonospace"}, + {0x308d, "rohiragana"}, + {0x30ed, "rokatakana"}, + {0xff9b, "rokatakanahalfwidth"}, + {0x0e23, "roruathai"}, + {0x24ad, "rparen"}, + {0x09dc, "rrabengali"}, + {0x0931, "rradeva"}, + {0x0a5c, "rragurmukhi"}, + {0x0691, "rreharabic"}, + {0xfb8d, "rrehfinalarabic"}, + {0x09e0, "rrvocalicbengali"}, + {0x0960, "rrvocalicdeva"}, + {0x0ae0, "rrvocalicgujarati"}, + {0x09c4, "rrvocalicvowelsignbengali"}, + {0x0944, "rrvocalicvowelsigndeva"}, + {0x0ac4, "rrvocalicvowelsigngujarati"}, + {0xf6f1, "rsuperior"}, + {0x2590, "rtblock"}, + {0x0279, "rturned"}, + {0x02b4, "rturnedsuperior"}, + {0x308b, "ruhiragana"}, + {0x30eb, "rukatakana"}, + {0xff99, "rukatakanahalfwidth"}, + {0x09f2, "rupeemarkbengali"}, + {0x09f3, "rupeesignbengali"}, + {0xf6dd, "rupiah"}, + {0x0e24, "ruthai"}, + {0x098b, "rvocalicbengali"}, + {0x090b, "rvocalicdeva"}, + {0x0a8b, "rvocalicgujarati"}, + {0x09c3, "rvocalicvowelsignbengali"}, + {0x0943, "rvocalicvowelsigndeva"}, + {0x0ac3, "rvocalicvowelsigngujarati"}, + {0x0073, "s"}, + {0x09b8, "sabengali"}, + {0x015b, "sacute"}, + {0x1e65, "sacutedotaccent"}, + {0x0635, "sadarabic"}, + {0x0938, "sadeva"}, + {0xfeba, "sadfinalarabic"}, + {0xfebb, "sadinitialarabic"}, + {0xfebc, "sadmedialarabic"}, + {0x0ab8, "sagujarati"}, + {0x0a38, "sagurmukhi"}, + {0x3055, "sahiragana"}, + {0x30b5, "sakatakana"}, + {0xff7b, "sakatakanahalfwidth"}, + {0xfdfa, "sallallahoualayhewasallamarabic"}, + {0x05e1, "samekh"}, + {0xfb41, "samekhdagesh"}, + {0xfb41, "samekhdageshhebrew"}, + {0x05e1, "samekhhebrew"}, + {0x0e32, "saraaathai"}, + {0x0e41, "saraaethai"}, + {0x0e44, "saraaimaimalaithai"}, + {0x0e43, "saraaimaimuanthai"}, + {0x0e33, "saraamthai"}, + {0x0e30, "saraathai"}, + {0x0e40, "saraethai"}, + {0xf886, "saraiileftthai"}, + {0x0e35, "saraiithai"}, + {0xf885, "saraileftthai"}, + {0x0e34, "saraithai"}, + {0x0e42, "saraothai"}, + {0xf888, "saraueeleftthai"}, + {0x0e37, "saraueethai"}, + {0xf887, "saraueleftthai"}, + {0x0e36, "sarauethai"}, + {0x0e38, "sarauthai"}, + {0x0e39, "sarauuthai"}, + {0x3119, "sbopomofo"}, + {0x0161, "scaron"}, + {0x1e67, "scarondotaccent"}, + {0x015f, "scedilla"}, + {0x0259, "schwa"}, + {0x04d9, "schwacyrillic"}, + {0x04db, "schwadieresiscyrillic"}, + {0x025a, "schwahook"}, + {0x24e2, "scircle"}, + {0x015d, "scircumflex"}, + {0x0219, "scommaaccent"}, + {0x1e61, "sdotaccent"}, + {0x1e63, "sdotbelow"}, + {0x1e69, "sdotbelowdotaccent"}, + {0x033c, "seagullbelowcmb"}, + {0x2033, "second"}, + {0x02ca, "secondtonechinese"}, + {0x00a7, "section"}, + {0x0633, "seenarabic"}, + {0xfeb2, "seenfinalarabic"}, + {0xfeb3, "seeninitialarabic"}, + {0xfeb4, "seenmedialarabic"}, + {0x05b6, "segol"}, + {0x05b6, "segol13"}, + {0x05b6, "segol1f"}, + {0x05b6, "segol2c"}, + {0x05b6, "segolhebrew"}, + {0x05b6, "segolnarrowhebrew"}, + {0x05b6, "segolquarterhebrew"}, + {0x0592, "segoltahebrew"}, + {0x05b6, "segolwidehebrew"}, + {0x057d, "seharmenian"}, + {0x305b, "sehiragana"}, + {0x30bb, "sekatakana"}, + {0xff7e, "sekatakanahalfwidth"}, + {0x003b, "semicolon"}, + {0x061b, "semicolonarabic"}, + {0xff1b, "semicolonmonospace"}, + {0xfe54, "semicolonsmall"}, + {0x309c, "semivoicedmarkkana"}, + {0xff9f, "semivoicedmarkkanahalfwidth"}, + {0x3322, "sentisquare"}, + {0x3323, "sentosquare"}, + {0x0037, "seven"}, + {0x0667, "sevenarabic"}, + {0x09ed, "sevenbengali"}, + {0x2466, "sevencircle"}, + {0x2790, "sevencircleinversesansserif"}, + {0x096d, "sevendeva"}, + {0x215e, "seveneighths"}, + {0x0aed, "sevengujarati"}, + {0x0a6d, "sevengurmukhi"}, + {0x0667, "sevenhackarabic"}, + {0x3027, "sevenhangzhou"}, + {0x3226, "sevenideographicparen"}, + {0x2087, "seveninferior"}, + {0xff17, "sevenmonospace"}, + {0xf737, "sevenoldstyle"}, + {0x247a, "sevenparen"}, + {0x248e, "sevenperiod"}, + {0x06f7, "sevenpersian"}, + {0x2176, "sevenroman"}, + {0x2077, "sevensuperior"}, + {0x2470, "seventeencircle"}, + {0x2484, "seventeenparen"}, + {0x2498, "seventeenperiod"}, + {0x0e57, "seventhai"}, + {0x00ad, "sfthyphen"}, + {0x0577, "shaarmenian"}, + {0x09b6, "shabengali"}, + {0x0448, "shacyrillic"}, + {0x0651, "shaddaarabic"}, + {0xfc61, "shaddadammaarabic"}, + {0xfc5e, "shaddadammatanarabic"}, + {0xfc60, "shaddafathaarabic"}, + {0xfc62, "shaddakasraarabic"}, + {0xfc5f, "shaddakasratanarabic"}, + {0x2592, "shade"}, + {0x2593, "shadedark"}, + {0x2591, "shadelight"}, + {0x2592, "shademedium"}, + {0x0936, "shadeva"}, + {0x0ab6, "shagujarati"}, + {0x0a36, "shagurmukhi"}, + {0x0593, "shalshelethebrew"}, + {0x3115, "shbopomofo"}, + {0x0449, "shchacyrillic"}, + {0x0634, "sheenarabic"}, + {0xfeb6, "sheenfinalarabic"}, + {0xfeb7, "sheeninitialarabic"}, + {0xfeb8, "sheenmedialarabic"}, + {0x03e3, "sheicoptic"}, + {0x20aa, "sheqel"}, + {0x20aa, "sheqelhebrew"}, + {0x05b0, "sheva"}, + {0x05b0, "sheva115"}, + {0x05b0, "sheva15"}, + {0x05b0, "sheva22"}, + {0x05b0, "sheva2e"}, + {0x05b0, "shevahebrew"}, + {0x05b0, "shevanarrowhebrew"}, + {0x05b0, "shevaquarterhebrew"}, + {0x05b0, "shevawidehebrew"}, + {0x04bb, "shhacyrillic"}, + {0x03ed, "shimacoptic"}, + {0x05e9, "shin"}, + {0xfb49, "shindagesh"}, + {0xfb49, "shindageshhebrew"}, + {0xfb2c, "shindageshshindot"}, + {0xfb2c, "shindageshshindothebrew"}, + {0xfb2d, "shindageshsindot"}, + {0xfb2d, "shindageshsindothebrew"}, + {0x05c1, "shindothebrew"}, + {0x05e9, "shinhebrew"}, + {0xfb2a, "shinshindot"}, + {0xfb2a, "shinshindothebrew"}, + {0xfb2b, "shinsindot"}, + {0xfb2b, "shinsindothebrew"}, + {0x0282, "shook"}, + {0x03c3, "sigma"}, + {0x03c2, "sigma1"}, + {0x03c2, "sigmafinal"}, + {0x03f2, "sigmalunatesymbolgreek"}, + {0x3057, "sihiragana"}, + {0x30b7, "sikatakana"}, + {0xff7c, "sikatakanahalfwidth"}, + {0x05bd, "siluqhebrew"}, + {0x05bd, "siluqlefthebrew"}, + {0x223c, "similar"}, + {0x05c2, "sindothebrew"}, + {0x3274, "siosacirclekorean"}, + {0x3214, "siosaparenkorean"}, + {0x317e, "sioscieuckorean"}, + {0x3266, "sioscirclekorean"}, + {0x317a, "sioskiyeokkorean"}, + {0x3145, "sioskorean"}, + {0x317b, "siosnieunkorean"}, + {0x3206, "siosparenkorean"}, + {0x317d, "siospieupkorean"}, + {0x317c, "siostikeutkorean"}, + {0x0036, "six"}, + {0x0666, "sixarabic"}, + {0x09ec, "sixbengali"}, + {0x2465, "sixcircle"}, + {0x278f, "sixcircleinversesansserif"}, + {0x096c, "sixdeva"}, + {0x0aec, "sixgujarati"}, + {0x0a6c, "sixgurmukhi"}, + {0x0666, "sixhackarabic"}, + {0x3026, "sixhangzhou"}, + {0x3225, "sixideographicparen"}, + {0x2086, "sixinferior"}, + {0xff16, "sixmonospace"}, + {0xf736, "sixoldstyle"}, + {0x2479, "sixparen"}, + {0x248d, "sixperiod"}, + {0x06f6, "sixpersian"}, + {0x2175, "sixroman"}, + {0x2076, "sixsuperior"}, + {0x246f, "sixteencircle"}, + {0x09f9, "sixteencurrencydenominatorbengali"}, + {0x2483, "sixteenparen"}, + {0x2497, "sixteenperiod"}, + {0x0e56, "sixthai"}, + {0x002f, "slash"}, + {0xff0f, "slashmonospace"}, + {0x017f, "slong"}, + {0x1e9b, "slongdotaccent"}, + {0x263a, "smileface"}, + {0xff53, "smonospace"}, + {0x05c3, "sofpasuqhebrew"}, + {0x00ad, "softhyphen"}, + {0x044c, "softsigncyrillic"}, + {0x305d, "sohiragana"}, + {0x30bd, "sokatakana"}, + {0xff7f, "sokatakanahalfwidth"}, + {0x0338, "soliduslongoverlaycmb"}, + {0x0337, "solidusshortoverlaycmb"}, + {0x0e29, "sorusithai"}, + {0x0e28, "sosalathai"}, + {0x0e0b, "sosothai"}, + {0x0e2a, "sosuathai"}, + {0x0020, "space"}, + {0x0020, "spacehackarabic"}, + {0x2660, "spade"}, + {0x2660, "spadesuitblack"}, + {0x2664, "spadesuitwhite"}, + {0x24ae, "sparen"}, + {0x033b, "squarebelowcmb"}, + {0x33c4, "squarecc"}, + {0x339d, "squarecm"}, + {0x25a9, "squarediagonalcrosshatchfill"}, + {0x25a4, "squarehorizontalfill"}, + {0x338f, "squarekg"}, + {0x339e, "squarekm"}, + {0x33ce, "squarekmcapital"}, + {0x33d1, "squareln"}, + {0x33d2, "squarelog"}, + {0x338e, "squaremg"}, + {0x33d5, "squaremil"}, + {0x339c, "squaremm"}, + {0x33a1, "squaremsquared"}, + {0x25a6, "squareorthogonalcrosshatchfill"}, + {0x25a7, "squareupperlefttolowerrightfill"}, + {0x25a8, "squareupperrighttolowerleftfill"}, + {0x25a5, "squareverticalfill"}, + {0x25a3, "squarewhitewithsmallblack"}, + {0x33db, "srsquare"}, + {0x09b7, "ssabengali"}, + {0x0937, "ssadeva"}, + {0x0ab7, "ssagujarati"}, + {0x3149, "ssangcieuckorean"}, + {0x3185, "ssanghieuhkorean"}, + {0x3180, "ssangieungkorean"}, + {0x3132, "ssangkiyeokkorean"}, + {0x3165, "ssangnieunkorean"}, + {0x3143, "ssangpieupkorean"}, + {0x3146, "ssangsioskorean"}, + {0x3138, "ssangtikeutkorean"}, + {0xf6f2, "ssuperior"}, + {0x00a3, "sterling"}, + {0xffe1, "sterlingmonospace"}, + {0x0336, "strokelongoverlaycmb"}, + {0x0335, "strokeshortoverlaycmb"}, + {0x2282, "subset"}, + {0x228a, "subsetnotequal"}, + {0x2286, "subsetorequal"}, + {0x227b, "succeeds"}, + {0x220b, "suchthat"}, + {0x3059, "suhiragana"}, + {0x30b9, "sukatakana"}, + {0xff7d, "sukatakanahalfwidth"}, + {0x0652, "sukunarabic"}, + {0x2211, "summation"}, + {0x263c, "sun"}, + {0x2283, "superset"}, + {0x228b, "supersetnotequal"}, + {0x2287, "supersetorequal"}, + {0x33dc, "svsquare"}, + {0x337c, "syouwaerasquare"}, + {0x0074, "t"}, + {0x09a4, "tabengali"}, + {0x22a4, "tackdown"}, + {0x22a3, "tackleft"}, + {0x0924, "tadeva"}, + {0x0aa4, "tagujarati"}, + {0x0a24, "tagurmukhi"}, + {0x0637, "taharabic"}, + {0xfec2, "tahfinalarabic"}, + {0xfec3, "tahinitialarabic"}, + {0x305f, "tahiragana"}, + {0xfec4, "tahmedialarabic"}, + {0x337d, "taisyouerasquare"}, + {0x30bf, "takatakana"}, + {0xff80, "takatakanahalfwidth"}, + {0x0640, "tatweelarabic"}, + {0x03c4, "tau"}, + {0x05ea, "tav"}, + {0xfb4a, "tavdages"}, + {0xfb4a, "tavdagesh"}, + {0xfb4a, "tavdageshhebrew"}, + {0x05ea, "tavhebrew"}, + {0x0167, "tbar"}, + {0x310a, "tbopomofo"}, + {0x0165, "tcaron"}, + {0x02a8, "tccurl"}, + {0x0163, "tcedilla"}, + {0x0686, "tcheharabic"}, + {0xfb7b, "tchehfinalarabic"}, + {0xfb7c, "tchehinitialarabic"}, + {0xfb7d, "tchehmedialarabic"}, + {0x24e3, "tcircle"}, + {0x1e71, "tcircumflexbelow"}, + {0x0163, "tcommaaccent"}, + {0x1e97, "tdieresis"}, + {0x1e6b, "tdotaccent"}, + {0x1e6d, "tdotbelow"}, + {0x0442, "tecyrillic"}, + {0x04ad, "tedescendercyrillic"}, + {0x062a, "teharabic"}, + {0xfe96, "tehfinalarabic"}, + {0xfca2, "tehhahinitialarabic"}, + {0xfc0c, "tehhahisolatedarabic"}, + {0xfe97, "tehinitialarabic"}, + {0x3066, "tehiragana"}, + {0xfca1, "tehjeeminitialarabic"}, + {0xfc0b, "tehjeemisolatedarabic"}, + {0x0629, "tehmarbutaarabic"}, + {0xfe94, "tehmarbutafinalarabic"}, + {0xfe98, "tehmedialarabic"}, + {0xfca4, "tehmeeminitialarabic"}, + {0xfc0e, "tehmeemisolatedarabic"}, + {0xfc73, "tehnoonfinalarabic"}, + {0x30c6, "tekatakana"}, + {0xff83, "tekatakanahalfwidth"}, + {0x2121, "telephone"}, + {0x260e, "telephoneblack"}, + {0x05a0, "telishagedolahebrew"}, + {0x05a9, "telishaqetanahebrew"}, + {0x2469, "tencircle"}, + {0x3229, "tenideographicparen"}, + {0x247d, "tenparen"}, + {0x2491, "tenperiod"}, + {0x2179, "tenroman"}, + {0x02a7, "tesh"}, + {0x05d8, "tet"}, + {0xfb38, "tetdagesh"}, + {0xfb38, "tetdageshhebrew"}, + {0x05d8, "tethebrew"}, + {0x04b5, "tetsecyrillic"}, + {0x059b, "tevirhebrew"}, + {0x059b, "tevirlefthebrew"}, + {0x09a5, "thabengali"}, + {0x0925, "thadeva"}, + {0x0aa5, "thagujarati"}, + {0x0a25, "thagurmukhi"}, + {0x0630, "thalarabic"}, + {0xfeac, "thalfinalarabic"}, + {0xf898, "thanthakhatlowleftthai"}, + {0xf897, "thanthakhatlowrightthai"}, + {0x0e4c, "thanthakhatthai"}, + {0xf896, "thanthakhatupperleftthai"}, + {0x062b, "theharabic"}, + {0xfe9a, "thehfinalarabic"}, + {0xfe9b, "thehinitialarabic"}, + {0xfe9c, "thehmedialarabic"}, + {0x2203, "thereexists"}, + {0x2234, "therefore"}, + {0x03b8, "theta"}, + {0x03d1, "theta1"}, + {0x03d1, "thetasymbolgreek"}, + {0x3279, "thieuthacirclekorean"}, + {0x3219, "thieuthaparenkorean"}, + {0x326b, "thieuthcirclekorean"}, + {0x314c, "thieuthkorean"}, + {0x320b, "thieuthparenkorean"}, + {0x246c, "thirteencircle"}, + {0x2480, "thirteenparen"}, + {0x2494, "thirteenperiod"}, + {0x0e11, "thonangmonthothai"}, + {0x01ad, "thook"}, + {0x0e12, "thophuthaothai"}, + {0x00fe, "thorn"}, + {0x0e17, "thothahanthai"}, + {0x0e10, "thothanthai"}, + {0x0e18, "thothongthai"}, + {0x0e16, "thothungthai"}, + {0x0482, "thousandcyrillic"}, + {0x066c, "thousandsseparatorarabic"}, + {0x066c, "thousandsseparatorpersian"}, + {0x0033, "three"}, + {0x0663, "threearabic"}, + {0x09e9, "threebengali"}, + {0x2462, "threecircle"}, + {0x278c, "threecircleinversesansserif"}, + {0x0969, "threedeva"}, + {0x215c, "threeeighths"}, + {0x0ae9, "threegujarati"}, + {0x0a69, "threegurmukhi"}, + {0x0663, "threehackarabic"}, + {0x3023, "threehangzhou"}, + {0x3222, "threeideographicparen"}, + {0x2083, "threeinferior"}, + {0xff13, "threemonospace"}, + {0x09f6, "threenumeratorbengali"}, + {0xf733, "threeoldstyle"}, + {0x2476, "threeparen"}, + {0x248a, "threeperiod"}, + {0x06f3, "threepersian"}, + {0x00be, "threequarters"}, + {0xf6de, "threequartersemdash"}, + {0x2172, "threeroman"}, + {0x00b3, "threesuperior"}, + {0x0e53, "threethai"}, + {0x3394, "thzsquare"}, + {0x3061, "tihiragana"}, + {0x30c1, "tikatakana"}, + {0xff81, "tikatakanahalfwidth"}, + {0x3270, "tikeutacirclekorean"}, + {0x3210, "tikeutaparenkorean"}, + {0x3262, "tikeutcirclekorean"}, + {0x3137, "tikeutkorean"}, + {0x3202, "tikeutparenkorean"}, + {0x02dc, "tilde"}, + {0x0330, "tildebelowcmb"}, + {0x0303, "tildecmb"}, + {0x0303, "tildecomb"}, + {0x0360, "tildedoublecmb"}, + {0x223c, "tildeoperator"}, + {0x0334, "tildeoverlaycmb"}, + {0x033e, "tildeverticalcmb"}, + {0x2297, "timescircle"}, + {0x0596, "tipehahebrew"}, + {0x0596, "tipehalefthebrew"}, + {0x0a70, "tippigurmukhi"}, + {0x0483, "titlocyrilliccmb"}, + {0x057f, "tiwnarmenian"}, + {0x1e6f, "tlinebelow"}, + {0xff54, "tmonospace"}, + {0x0569, "toarmenian"}, + {0x3068, "tohiragana"}, + {0x30c8, "tokatakana"}, + {0xff84, "tokatakanahalfwidth"}, + {0x02e5, "tonebarextrahighmod"}, + {0x02e9, "tonebarextralowmod"}, + {0x02e6, "tonebarhighmod"}, + {0x02e8, "tonebarlowmod"}, + {0x02e7, "tonebarmidmod"}, + {0x01bd, "tonefive"}, + {0x0185, "tonesix"}, + {0x01a8, "tonetwo"}, + {0x0384, "tonos"}, + {0x3327, "tonsquare"}, + {0x0e0f, "topatakthai"}, + {0x3014, "tortoiseshellbracketleft"}, + {0xfe5d, "tortoiseshellbracketleftsmall"}, + {0xfe39, "tortoiseshellbracketleftvertical"}, + {0x3015, "tortoiseshellbracketright"}, + {0xfe5e, "tortoiseshellbracketrightsmall"}, + {0xfe3a, "tortoiseshellbracketrightvertical"}, + {0x0e15, "totaothai"}, + {0x01ab, "tpalatalhook"}, + {0x24af, "tparen"}, + {0x2122, "trademark"}, + {0xf8ea, "trademarksans"}, + {0xf6db, "trademarkserif"}, + {0x0288, "tretroflexhook"}, + {0x25bc, "triagdn"}, + {0x25c4, "triaglf"}, + {0x25ba, "triagrt"}, + {0x25b2, "triagup"}, + {0x02a6, "ts"}, + {0x05e6, "tsadi"}, + {0xfb46, "tsadidagesh"}, + {0xfb46, "tsadidageshhebrew"}, + {0x05e6, "tsadihebrew"}, + {0x0446, "tsecyrillic"}, + {0x05b5, "tsere"}, + {0x05b5, "tsere12"}, + {0x05b5, "tsere1e"}, + {0x05b5, "tsere2b"}, + {0x05b5, "tserehebrew"}, + {0x05b5, "tserenarrowhebrew"}, + {0x05b5, "tserequarterhebrew"}, + {0x05b5, "tserewidehebrew"}, + {0x045b, "tshecyrillic"}, + {0xf6f3, "tsuperior"}, + {0x099f, "ttabengali"}, + {0x091f, "ttadeva"}, + {0x0a9f, "ttagujarati"}, + {0x0a1f, "ttagurmukhi"}, + {0x0679, "tteharabic"}, + {0xfb67, "ttehfinalarabic"}, + {0xfb68, "ttehinitialarabic"}, + {0xfb69, "ttehmedialarabic"}, + {0x09a0, "tthabengali"}, + {0x0920, "tthadeva"}, + {0x0aa0, "tthagujarati"}, + {0x0a20, "tthagurmukhi"}, + {0x0287, "tturned"}, + {0x3064, "tuhiragana"}, + {0x30c4, "tukatakana"}, + {0xff82, "tukatakanahalfwidth"}, + {0x3063, "tusmallhiragana"}, + {0x30c3, "tusmallkatakana"}, + {0xff6f, "tusmallkatakanahalfwidth"}, + {0x246b, "twelvecircle"}, + {0x247f, "twelveparen"}, + {0x2493, "twelveperiod"}, + {0x217b, "twelveroman"}, + {0x2473, "twentycircle"}, + {0x5344, "twentyhangzhou"}, + {0x2487, "twentyparen"}, + {0x249b, "twentyperiod"}, + {0x0032, "two"}, + {0x0662, "twoarabic"}, + {0x09e8, "twobengali"}, + {0x2461, "twocircle"}, + {0x278b, "twocircleinversesansserif"}, + {0x0968, "twodeva"}, + {0x2025, "twodotenleader"}, + {0x2025, "twodotleader"}, + {0xfe30, "twodotleadervertical"}, + {0x0ae8, "twogujarati"}, + {0x0a68, "twogurmukhi"}, + {0x0662, "twohackarabic"}, + {0x3022, "twohangzhou"}, + {0x3221, "twoideographicparen"}, + {0x2082, "twoinferior"}, + {0xff12, "twomonospace"}, + {0x09f5, "twonumeratorbengali"}, + {0xf732, "twooldstyle"}, + {0x2475, "twoparen"}, + {0x2489, "twoperiod"}, + {0x06f2, "twopersian"}, + {0x2171, "tworoman"}, + {0x01bb, "twostroke"}, + {0x00b2, "twosuperior"}, + {0x0e52, "twothai"}, + {0x2154, "twothirds"}, + {0x0075, "u"}, + {0x00fa, "uacute"}, + {0x0289, "ubar"}, + {0x0989, "ubengali"}, + {0x3128, "ubopomofo"}, + {0x016d, "ubreve"}, + {0x01d4, "ucaron"}, + {0x24e4, "ucircle"}, + {0x00fb, "ucircumflex"}, + {0x1e77, "ucircumflexbelow"}, + {0x0443, "ucyrillic"}, + {0x0951, "udattadeva"}, + {0x0171, "udblacute"}, + {0x0215, "udblgrave"}, + {0x0909, "udeva"}, + {0x00fc, "udieresis"}, + {0x01d8, "udieresisacute"}, + {0x1e73, "udieresisbelow"}, + {0x01da, "udieresiscaron"}, + {0x04f1, "udieresiscyrillic"}, + {0x01dc, "udieresisgrave"}, + {0x01d6, "udieresismacron"}, + {0x1ee5, "udotbelow"}, + {0x00f9, "ugrave"}, + {0x0a89, "ugujarati"}, + {0x0a09, "ugurmukhi"}, + {0x3046, "uhiragana"}, + {0x1ee7, "uhookabove"}, + {0x01b0, "uhorn"}, + {0x1ee9, "uhornacute"}, + {0x1ef1, "uhorndotbelow"}, + {0x1eeb, "uhorngrave"}, + {0x1eed, "uhornhookabove"}, + {0x1eef, "uhorntilde"}, + {0x0171, "uhungarumlaut"}, + {0x04f3, "uhungarumlautcyrillic"}, + {0x0217, "uinvertedbreve"}, + {0x30a6, "ukatakana"}, + {0xff73, "ukatakanahalfwidth"}, + {0x0479, "ukcyrillic"}, + {0x315c, "ukorean"}, + {0x016b, "umacron"}, + {0x04ef, "umacroncyrillic"}, + {0x1e7b, "umacrondieresis"}, + {0x0a41, "umatragurmukhi"}, + {0xff55, "umonospace"}, + {0x005f, "underscore"}, + {0x2017, "underscoredbl"}, + {0xff3f, "underscoremonospace"}, + {0xfe33, "underscorevertical"}, + {0xfe4f, "underscorewavy"}, + {0x222a, "union"}, + {0x2200, "universal"}, + {0x0173, "uogonek"}, + {0x24b0, "uparen"}, + {0x2580, "upblock"}, + {0x05c4, "upperdothebrew"}, + {0x03c5, "upsilon"}, + {0x03cb, "upsilondieresis"}, + {0x03b0, "upsilondieresistonos"}, + {0x028a, "upsilonlatin"}, + {0x03cd, "upsilontonos"}, + {0x031d, "uptackbelowcmb"}, + {0x02d4, "uptackmod"}, + {0x0a73, "uragurmukhi"}, + {0x016f, "uring"}, + {0x045e, "ushortcyrillic"}, + {0x3045, "usmallhiragana"}, + {0x30a5, "usmallkatakana"}, + {0xff69, "usmallkatakanahalfwidth"}, + {0x04af, "ustraightcyrillic"}, + {0x04b1, "ustraightstrokecyrillic"}, + {0x0169, "utilde"}, + {0x1e79, "utildeacute"}, + {0x1e75, "utildebelow"}, + {0x098a, "uubengali"}, + {0x090a, "uudeva"}, + {0x0a8a, "uugujarati"}, + {0x0a0a, "uugurmukhi"}, + {0x0a42, "uumatragurmukhi"}, + {0x09c2, "uuvowelsignbengali"}, + {0x0942, "uuvowelsigndeva"}, + {0x0ac2, "uuvowelsigngujarati"}, + {0x09c1, "uvowelsignbengali"}, + {0x0941, "uvowelsigndeva"}, + {0x0ac1, "uvowelsigngujarati"}, + {0x0076, "v"}, + {0x0935, "vadeva"}, + {0x0ab5, "vagujarati"}, + {0x0a35, "vagurmukhi"}, + {0x30f7, "vakatakana"}, + {0x05d5, "vav"}, + {0xfb35, "vavdagesh"}, + {0xfb35, "vavdagesh65"}, + {0xfb35, "vavdageshhebrew"}, + {0x05d5, "vavhebrew"}, + {0xfb4b, "vavholam"}, + {0xfb4b, "vavholamhebrew"}, + {0x05f0, "vavvavhebrew"}, + {0x05f1, "vavyodhebrew"}, + {0x24e5, "vcircle"}, + {0x1e7f, "vdotbelow"}, + {0x0432, "vecyrillic"}, + {0x06a4, "veharabic"}, + {0xfb6b, "vehfinalarabic"}, + {0xfb6c, "vehinitialarabic"}, + {0xfb6d, "vehmedialarabic"}, + {0x30f9, "vekatakana"}, + {0x2640, "venus"}, + {0x007c, "verticalbar"}, + {0x030d, "verticallineabovecmb"}, + {0x0329, "verticallinebelowcmb"}, + {0x02cc, "verticallinelowmod"}, + {0x02c8, "verticallinemod"}, + {0x057e, "vewarmenian"}, + {0x028b, "vhook"}, + {0x30f8, "vikatakana"}, + {0x09cd, "viramabengali"}, + {0x094d, "viramadeva"}, + {0x0acd, "viramagujarati"}, + {0x0983, "visargabengali"}, + {0x0903, "visargadeva"}, + {0x0a83, "visargagujarati"}, + {0xff56, "vmonospace"}, + {0x0578, "voarmenian"}, + {0x309e, "voicediterationhiragana"}, + {0x30fe, "voicediterationkatakana"}, + {0x309b, "voicedmarkkana"}, + {0xff9e, "voicedmarkkanahalfwidth"}, + {0x30fa, "vokatakana"}, + {0x24b1, "vparen"}, + {0x1e7d, "vtilde"}, + {0x028c, "vturned"}, + {0x3094, "vuhiragana"}, + {0x30f4, "vukatakana"}, + {0x0077, "w"}, + {0x1e83, "wacute"}, + {0x3159, "waekorean"}, + {0x308f, "wahiragana"}, + {0x30ef, "wakatakana"}, + {0xff9c, "wakatakanahalfwidth"}, + {0x3158, "wakorean"}, + {0x308e, "wasmallhiragana"}, + {0x30ee, "wasmallkatakana"}, + {0x3357, "wattosquare"}, + {0x301c, "wavedash"}, + {0xfe34, "wavyunderscorevertical"}, + {0x0648, "wawarabic"}, + {0xfeee, "wawfinalarabic"}, + {0x0624, "wawhamzaabovearabic"}, + {0xfe86, "wawhamzaabovefinalarabic"}, + {0x33dd, "wbsquare"}, + {0x24e6, "wcircle"}, + {0x0175, "wcircumflex"}, + {0x1e85, "wdieresis"}, + {0x1e87, "wdotaccent"}, + {0x1e89, "wdotbelow"}, + {0x3091, "wehiragana"}, + {0x2118, "weierstrass"}, + {0x30f1, "wekatakana"}, + {0x315e, "wekorean"}, + {0x315d, "weokorean"}, + {0x1e81, "wgrave"}, + {0x25e6, "whitebullet"}, + {0x25cb, "whitecircle"}, + {0x25d9, "whitecircleinverse"}, + {0x300e, "whitecornerbracketleft"}, + {0xfe43, "whitecornerbracketleftvertical"}, + {0x300f, "whitecornerbracketright"}, + {0xfe44, "whitecornerbracketrightvertical"}, + {0x25c7, "whitediamond"}, + {0x25c8, "whitediamondcontainingblacksmalldiamond"}, + {0x25bf, "whitedownpointingsmalltriangle"}, + {0x25bd, "whitedownpointingtriangle"}, + {0x25c3, "whiteleftpointingsmalltriangle"}, + {0x25c1, "whiteleftpointingtriangle"}, + {0x3016, "whitelenticularbracketleft"}, + {0x3017, "whitelenticularbracketright"}, + {0x25b9, "whiterightpointingsmalltriangle"}, + {0x25b7, "whiterightpointingtriangle"}, + {0x25ab, "whitesmallsquare"}, + {0x263a, "whitesmilingface"}, + {0x25a1, "whitesquare"}, + {0x2606, "whitestar"}, + {0x260f, "whitetelephone"}, + {0x3018, "whitetortoiseshellbracketleft"}, + {0x3019, "whitetortoiseshellbracketright"}, + {0x25b5, "whiteuppointingsmalltriangle"}, + {0x25b3, "whiteuppointingtriangle"}, + {0x3090, "wihiragana"}, + {0x30f0, "wikatakana"}, + {0x315f, "wikorean"}, + {0xff57, "wmonospace"}, + {0x3092, "wohiragana"}, + {0x30f2, "wokatakana"}, + {0xff66, "wokatakanahalfwidth"}, + {0x20a9, "won"}, + {0xffe6, "wonmonospace"}, + {0x0e27, "wowaenthai"}, + {0x24b2, "wparen"}, + {0x1e98, "wring"}, + {0x02b7, "wsuperior"}, + {0x028d, "wturned"}, + {0x01bf, "wynn"}, + {0x0078, "x"}, + {0x033d, "xabovecmb"}, + {0x3112, "xbopomofo"}, + {0x24e7, "xcircle"}, + {0x1e8d, "xdieresis"}, + {0x1e8b, "xdotaccent"}, + {0x056d, "xeharmenian"}, + {0x03be, "xi"}, + {0xff58, "xmonospace"}, + {0x24b3, "xparen"}, + {0x02e3, "xsuperior"}, + {0x0079, "y"}, + {0x334e, "yaadosquare"}, + {0x09af, "yabengali"}, + {0x00fd, "yacute"}, + {0x092f, "yadeva"}, + {0x3152, "yaekorean"}, + {0x0aaf, "yagujarati"}, + {0x0a2f, "yagurmukhi"}, + {0x3084, "yahiragana"}, + {0x30e4, "yakatakana"}, + {0xff94, "yakatakanahalfwidth"}, + {0x3151, "yakorean"}, + {0x0e4e, "yamakkanthai"}, + {0x3083, "yasmallhiragana"}, + {0x30e3, "yasmallkatakana"}, + {0xff6c, "yasmallkatakanahalfwidth"}, + {0x0463, "yatcyrillic"}, + {0x24e8, "ycircle"}, + {0x0177, "ycircumflex"}, + {0x00ff, "ydieresis"}, + {0x1e8f, "ydotaccent"}, + {0x1ef5, "ydotbelow"}, + {0x064a, "yeharabic"}, + {0x06d2, "yehbarreearabic"}, + {0xfbaf, "yehbarreefinalarabic"}, + {0xfef2, "yehfinalarabic"}, + {0x0626, "yehhamzaabovearabic"}, + {0xfe8a, "yehhamzaabovefinalarabic"}, + {0xfe8b, "yehhamzaaboveinitialarabic"}, + {0xfe8c, "yehhamzaabovemedialarabic"}, + {0xfef3, "yehinitialarabic"}, + {0xfef4, "yehmedialarabic"}, + {0xfcdd, "yehmeeminitialarabic"}, + {0xfc58, "yehmeemisolatedarabic"}, + {0xfc94, "yehnoonfinalarabic"}, + {0x06d1, "yehthreedotsbelowarabic"}, + {0x3156, "yekorean"}, + {0x00a5, "yen"}, + {0xffe5, "yenmonospace"}, + {0x3155, "yeokorean"}, + {0x3186, "yeorinhieuhkorean"}, + {0x05aa, "yerahbenyomohebrew"}, + {0x05aa, "yerahbenyomolefthebrew"}, + {0x044b, "yericyrillic"}, + {0x04f9, "yerudieresiscyrillic"}, + {0x3181, "yesieungkorean"}, + {0x3183, "yesieungpansioskorean"}, + {0x3182, "yesieungsioskorean"}, + {0x059a, "yetivhebrew"}, + {0x1ef3, "ygrave"}, + {0x01b4, "yhook"}, + {0x1ef7, "yhookabove"}, + {0x0575, "yiarmenian"}, + {0x0457, "yicyrillic"}, + {0x3162, "yikorean"}, + {0x262f, "yinyang"}, + {0x0582, "yiwnarmenian"}, + {0xff59, "ymonospace"}, + {0x05d9, "yod"}, + {0xfb39, "yoddagesh"}, + {0xfb39, "yoddageshhebrew"}, + {0x05d9, "yodhebrew"}, + {0x05f2, "yodyodhebrew"}, + {0xfb1f, "yodyodpatahhebrew"}, + {0x3088, "yohiragana"}, + {0x3189, "yoikorean"}, + {0x30e8, "yokatakana"}, + {0xff96, "yokatakanahalfwidth"}, + {0x315b, "yokorean"}, + {0x3087, "yosmallhiragana"}, + {0x30e7, "yosmallkatakana"}, + {0xff6e, "yosmallkatakanahalfwidth"}, + {0x03f3, "yotgreek"}, + {0x3188, "yoyaekorean"}, + {0x3187, "yoyakorean"}, + {0x0e22, "yoyakthai"}, + {0x0e0d, "yoyingthai"}, + {0x24b4, "yparen"}, + {0x037a, "ypogegrammeni"}, + {0x0345, "ypogegrammenigreekcmb"}, + {0x01a6, "yr"}, + {0x1e99, "yring"}, + {0x02b8, "ysuperior"}, + {0x1ef9, "ytilde"}, + {0x028e, "yturned"}, + {0x3086, "yuhiragana"}, + {0x318c, "yuikorean"}, + {0x30e6, "yukatakana"}, + {0xff95, "yukatakanahalfwidth"}, + {0x3160, "yukorean"}, + {0x046b, "yusbigcyrillic"}, + {0x046d, "yusbigiotifiedcyrillic"}, + {0x0467, "yuslittlecyrillic"}, + {0x0469, "yuslittleiotifiedcyrillic"}, + {0x3085, "yusmallhiragana"}, + {0x30e5, "yusmallkatakana"}, + {0xff6d, "yusmallkatakanahalfwidth"}, + {0x318b, "yuyekorean"}, + {0x318a, "yuyeokorean"}, + {0x09df, "yyabengali"}, + {0x095f, "yyadeva"}, + {0x007a, "z"}, + {0x0566, "zaarmenian"}, + {0x017a, "zacute"}, + {0x095b, "zadeva"}, + {0x0a5b, "zagurmukhi"}, + {0x0638, "zaharabic"}, + {0xfec6, "zahfinalarabic"}, + {0xfec7, "zahinitialarabic"}, + {0x3056, "zahiragana"}, + {0xfec8, "zahmedialarabic"}, + {0x0632, "zainarabic"}, + {0xfeb0, "zainfinalarabic"}, + {0x30b6, "zakatakana"}, + {0x0595, "zaqefgadolhebrew"}, + {0x0594, "zaqefqatanhebrew"}, + {0x0598, "zarqahebrew"}, + {0x05d6, "zayin"}, + {0xfb36, "zayindagesh"}, + {0xfb36, "zayindageshhebrew"}, + {0x05d6, "zayinhebrew"}, + {0x3117, "zbopomofo"}, + {0x017e, "zcaron"}, + {0x24e9, "zcircle"}, + {0x1e91, "zcircumflex"}, + {0x0291, "zcurl"}, + {0x017c, "zdot"}, + {0x017c, "zdotaccent"}, + {0x1e93, "zdotbelow"}, + {0x0437, "zecyrillic"}, + {0x0499, "zedescendercyrillic"}, + {0x04df, "zedieresiscyrillic"}, + {0x305c, "zehiragana"}, + {0x30bc, "zekatakana"}, + {0x0030, "zero"}, + {0x0660, "zeroarabic"}, + {0x09e6, "zerobengali"}, + {0x0966, "zerodeva"}, + {0x0ae6, "zerogujarati"}, + {0x0a66, "zerogurmukhi"}, + {0x0660, "zerohackarabic"}, + {0x2080, "zeroinferior"}, + {0xff10, "zeromonospace"}, + {0xf730, "zerooldstyle"}, + {0x06f0, "zeropersian"}, + {0x2070, "zerosuperior"}, + {0x0e50, "zerothai"}, + {0xfeff, "zerowidthjoiner"}, + {0x200c, "zerowidthnonjoiner"}, + {0x200b, "zerowidthspace"}, + {0x03b6, "zeta"}, + {0x3113, "zhbopomofo"}, + {0x056a, "zhearmenian"}, + {0x04c2, "zhebrevecyrillic"}, + {0x0436, "zhecyrillic"}, + {0x0497, "zhedescendercyrillic"}, + {0x04dd, "zhedieresiscyrillic"}, + {0x3058, "zihiragana"}, + {0x30b8, "zikatakana"}, + {0x05ae, "zinorhebrew"}, + {0x1e95, "zlinebelow"}, + {0xff5a, "zmonospace"}, + {0x305e, "zohiragana"}, + {0x30be, "zokatakana"}, + {0x24b5, "zparen"}, + {0x0290, "zretroflexhook"}, + {0x01b6, "zstroke"}, + {0x305a, "zuhiragana"}, + {0x30ba, "zukatakana"}, + {0x007b, "{"}, + {0x007c, "|"}, + {0x007d, "}"}, + {0x007e, "~"}, + { 0, NULL } +}; diff --git a/poppler/Object.cc b/poppler/Object.cc new file mode 100644 index 0000000..1963b7f --- /dev/null +++ b/poppler/Object.cc @@ -0,0 +1,251 @@ +//======================================================================== +// +// Object.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008, 2010, 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Error.h" +#include "Stream.h" +#include "XRef.h" + +//------------------------------------------------------------------------ +// Object +//------------------------------------------------------------------------ + +static const char *objTypeNames[numObjTypes] = { + "boolean", + "integer", + "real", + "string", + "name", + "null", + "array", + "dictionary", + "stream", + "ref", + "cmd", + "error", + "eof", + "none", + "unsigned integer" +}; + +#ifdef DEBUG_MEM +int Object::numAlloc[numObjTypes] = + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif + +Object *Object::initArray(XRef *xref) { + initObj(objArray); + array = new Array(xref); + return this; +} + +Object *Object::initDict(XRef *xref) { + initObj(objDict); + dict = new Dict(xref); + return this; +} + +Object *Object::initDict(Dict *dictA) { + initObj(objDict); + dict = dictA; + dict->incRef(); + return this; +} + +Object *Object::initStream(Stream *streamA) { + initObj(objStream); + stream = streamA; + return this; +} + +Object *Object::copy(Object *obj) { + *obj = *this; + switch (type) { + case objString: + obj->string = string->copy(); + break; + case objName: + obj->name = copyString(name); + break; + case objArray: + array->incRef(); + break; + case objDict: + dict->incRef(); + break; + case objStream: + stream->incRef(); + break; + case objCmd: + obj->cmd = copyString(cmd); + break; + default: + break; + } +#ifdef DEBUG_MEM + ++numAlloc[type]; +#endif + return obj; +} + +Object *Object::fetch(XRef *xref, Object *obj, int recursion) { + return (type == objRef && xref) ? + xref->fetch(ref.num, ref.gen, obj, recursion) : copy(obj); +} + +void Object::free() { + switch (type) { + case objString: + delete string; + break; + case objName: + gfree(name); + break; + case objArray: + if (!array->decRef()) { + delete array; + } + break; + case objDict: + if (!dict->decRef()) { + delete dict; + } + break; + case objStream: + if (!stream->decRef()) { + delete stream; + } + break; + case objCmd: + gfree(cmd); + break; + default: + break; + } +#ifdef DEBUG_MEM + --numAlloc[type]; +#endif + type = objNone; +} + +const char *Object::getTypeName() { + return objTypeNames[type]; +} + +void Object::print(FILE *f) { + Object obj; + int i; + + switch (type) { + case objBool: + fprintf(f, "%s", booln ? "true" : "false"); + break; + case objInt: + fprintf(f, "%d", intg); + break; + case objReal: + fprintf(f, "%g", real); + break; + case objString: + fprintf(f, "("); + fwrite(string->getCString(), 1, string->getLength(), f); + fprintf(f, ")"); + break; + case objName: + fprintf(f, "/%s", name); + break; + case objNull: + fprintf(f, "null"); + break; + case objArray: + fprintf(f, "["); + for (i = 0; i < arrayGetLength(); ++i) { + if (i > 0) + fprintf(f, " "); + arrayGetNF(i, &obj); + obj.print(f); + obj.free(); + } + fprintf(f, "]"); + break; + case objDict: + fprintf(f, "<<"); + for (i = 0; i < dictGetLength(); ++i) { + fprintf(f, " /%s ", dictGetKey(i)); + dictGetValNF(i, &obj); + obj.print(f); + obj.free(); + } + fprintf(f, " >>"); + break; + case objStream: + fprintf(f, ""); + break; + case objRef: + fprintf(f, "%d %d R", ref.num, ref.gen); + break; + case objCmd: + fprintf(f, "%s", cmd); + break; + case objError: + fprintf(f, ""); + break; + case objEOF: + fprintf(f, ""); + break; + case objNone: + fprintf(f, ""); + break; + case objUint: + fprintf(f, "%u", uintg); + break; + } +} + +void Object::memCheck(FILE *f) { +#ifdef DEBUG_MEM + int i; + int t; + + t = 0; + for (i = 0; i < numObjTypes; ++i) + t += numAlloc[i]; + if (t > 0) { + fprintf(f, "Allocated objects:\n"); + for (i = 0; i < numObjTypes; ++i) { + if (numAlloc[i] > 0) + fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]); + } + } +#else + (void)f; +#endif +} diff --git a/poppler/Object.h b/poppler/Object.h new file mode 100644 index 0000000..c885d73 --- /dev/null +++ b/poppler/Object.h @@ -0,0 +1,362 @@ +//======================================================================== +// +// Object.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2008 Kees Cook +// Copyright (C) 2008, 2010 Albert Astals Cid +// Copyright (C) 2009 Jakub Wilk +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef OBJECT_H +#define OBJECT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include +#include +#include "goo/gtypes.h" +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooLikely.h" +#include "Error.h" + +#define OBJECT_TYPE_CHECK(wanted_type) \ + if (unlikely(type != wanted_type)) { \ + error(errInternal, 0, (char *) "Call to Object where the object was type {0:d}, " \ + "not the expected type {1:d}", type, wanted_type); \ + abort(); \ + } + +#define OBJECT_2TYPES_CHECK(wanted_type1, wanted_type2) \ + if (unlikely(type != wanted_type1) && unlikely(type != wanted_type2)) { \ + error(errInternal, 0, (char *) "Call to Object where the object was type {0:d}, " \ + "not the expected type {1:d} or {2:d}", type, wanted_type1, wanted_type2); \ + abort(); \ + } + +class XRef; +class Array; +class Dict; +class Stream; + +//------------------------------------------------------------------------ +// Ref +//------------------------------------------------------------------------ + +struct Ref { + int num; // object number + int gen; // generation number +}; + +//------------------------------------------------------------------------ +// object types +//------------------------------------------------------------------------ + +enum ObjType { + // simple objects + objBool, // boolean + objInt, // integer + objReal, // real + objString, // string + objName, // name + objNull, // null + + // complex objects + objArray, // array + objDict, // dictionary + objStream, // stream + objRef, // indirect reference + + // special objects + objCmd, // command name + objError, // error return from Lexer + objEOF, // end of file return from Lexer + objNone, // uninitialized object + + // poppler-only objects + objUint // overflown integer that still fits in a unsigned integer +}; + +#define numObjTypes 15 // total number of object types + +//------------------------------------------------------------------------ +// Object +//------------------------------------------------------------------------ + +#ifdef DEBUG_MEM +#define initObj(t) zeroUnion(); ++numAlloc[type = t] +#else +#define initObj(t) zeroUnion(); type = t +#endif + +class Object { +public: + // clear the anonymous union as best we can -- clear at least a pointer + void zeroUnion() { this->name = NULL; } + + // Default constructor. + Object(): + type(objNone) { zeroUnion(); } + + // Initialize an object. + Object *initBool(GBool boolnA) + { initObj(objBool); booln = boolnA; return this; } + Object *initInt(int intgA) + { initObj(objInt); intg = intgA; return this; } + Object *initReal(double realA) + { initObj(objReal); real = realA; return this; } + Object *initString(GooString *stringA) + { initObj(objString); string = stringA; return this; } + Object *initName(const char *nameA) + { initObj(objName); name = copyString(nameA); return this; } + Object *initNull() + { initObj(objNull); return this; } + Object *initArray(XRef *xref); + Object *initDict(XRef *xref); + Object *initDict(Dict *dictA); + Object *initStream(Stream *streamA); + Object *initRef(int numA, int genA) + { initObj(objRef); ref.num = numA; ref.gen = genA; return this; } + Object *initCmd(char *cmdA) + { initObj(objCmd); cmd = copyString(cmdA); return this; } + Object *initError() + { initObj(objError); return this; } + Object *initEOF() + { initObj(objEOF); return this; } + Object *initUint(unsigned int uintgA) + { initObj(objUint); uintg = uintgA; return this; } + + // Copy an object. + Object *copy(Object *obj); + Object *shallowCopy(Object *obj) { + *obj = *this; + return obj; + } + + // If object is a Ref, fetch and return the referenced object. + // Otherwise, return a copy of the object. + Object *fetch(XRef *xref, Object *obj, int recursion = 0); + + // Free object contents. + void free(); + + // Type checking. + ObjType getType() { return type; } + GBool isBool() { return type == objBool; } + GBool isInt() { return type == objInt; } + GBool isReal() { return type == objReal; } + GBool isNum() { return type == objInt || type == objReal; } + GBool isString() { return type == objString; } + GBool isName() { return type == objName; } + GBool isNull() { return type == objNull; } + GBool isArray() { return type == objArray; } + GBool isDict() { return type == objDict; } + GBool isStream() { return type == objStream; } + GBool isRef() { return type == objRef; } + GBool isCmd() { return type == objCmd; } + GBool isError() { return type == objError; } + GBool isEOF() { return type == objEOF; } + GBool isNone() { return type == objNone; } + GBool isUint() { return type == objUint; } + + // Special type checking. + GBool isName(const char *nameA) + { return type == objName && !strcmp(name, nameA); } + GBool isDict(const char *dictType); + GBool isStream(char *dictType); + GBool isCmd(const char *cmdA) + { return type == objCmd && !strcmp(cmd, cmdA); } + + // Accessors. + GBool getBool() { OBJECT_TYPE_CHECK(objBool); return booln; } + int getInt() { OBJECT_TYPE_CHECK(objInt); return intg; } + double getReal() { OBJECT_TYPE_CHECK(objReal); return real; } + double getNum() { OBJECT_2TYPES_CHECK(objInt, objReal); return type == objInt ? (double)intg : real; } + GooString *getString() { OBJECT_TYPE_CHECK(objString); return string; } + char *getName() { OBJECT_TYPE_CHECK(objName); return name; } + Array *getArray() { OBJECT_TYPE_CHECK(objArray); return array; } + Dict *getDict() { OBJECT_TYPE_CHECK(objDict); return dict; } + Stream *getStream() { OBJECT_TYPE_CHECK(objStream); return stream; } + Ref getRef() { OBJECT_TYPE_CHECK(objRef); return ref; } + int getRefNum() { OBJECT_TYPE_CHECK(objRef); return ref.num; } + int getRefGen() { OBJECT_TYPE_CHECK(objRef); return ref.gen; } + char *getCmd() { OBJECT_TYPE_CHECK(objCmd); return cmd; } + unsigned int getUint() { OBJECT_TYPE_CHECK(objUint); return uintg; } + + // Array accessors. + int arrayGetLength(); + void arrayAdd(Object *elem); + void arrayRemove(int i); + Object *arrayGet(int i, Object *obj); + Object *arrayGetNF(int i, Object *obj); + + // Dict accessors. + int dictGetLength(); + void dictAdd(char *key, Object *val); + void dictSet(const char *key, Object *val); + GBool dictIs(const char *dictType); + Object *dictLookup(const char *key, Object *obj, int recursion = 0); + Object *dictLookupNF(const char *key, Object *obj); + char *dictGetKey(int i); + Object *dictGetVal(int i, Object *obj); + Object *dictGetValNF(int i, Object *obj); + + // Stream accessors. + GBool streamIs(char *dictType); + void streamReset(); + void streamClose(); + int streamGetChar(); + int streamGetChars(int nChars, Guchar *buffer); + int streamLookChar(); + char *streamGetLine(char *buf, int size); + Guint streamGetPos(); + void streamSetPos(Guint pos, int dir = 0); + Dict *streamGetDict(); + + // Output. + const char *getTypeName(); + void print(FILE *f = stdout); + + // Memory testing. + static void memCheck(FILE *f); + +private: + + ObjType type; // object type + union { // value for each type: + GBool booln; // boolean + int intg; // integer + unsigned int uintg; // unsigned integer + double real; // real + GooString *string; // string + char *name; // name + Array *array; // array + Dict *dict; // dictionary + Stream *stream; // stream + Ref ref; // indirect reference + char *cmd; // command + }; + +#ifdef DEBUG_MEM + static int // number of each type of object + numAlloc[numObjTypes]; // currently allocated +#endif +}; + +//------------------------------------------------------------------------ +// Array accessors. +//------------------------------------------------------------------------ + +#include "Array.h" + +inline int Object::arrayGetLength() + { OBJECT_TYPE_CHECK(objArray); return array->getLength(); } + +inline void Object::arrayAdd(Object *elem) + { OBJECT_TYPE_CHECK(objArray); array->add(elem); } + +inline void Object::arrayRemove(int i) + { OBJECT_TYPE_CHECK(objArray); array->remove(i); } + +inline Object *Object::arrayGet(int i, Object *obj) + { OBJECT_TYPE_CHECK(objArray); return array->get(i, obj); } + +inline Object *Object::arrayGetNF(int i, Object *obj) + { OBJECT_TYPE_CHECK(objArray); return array->getNF(i, obj); } + +//------------------------------------------------------------------------ +// Dict accessors. +//------------------------------------------------------------------------ + +#include "Dict.h" + +inline int Object::dictGetLength() + { OBJECT_TYPE_CHECK(objDict); return dict->getLength(); } + +inline void Object::dictAdd(char *key, Object *val) + { OBJECT_TYPE_CHECK(objDict); dict->add(key, val); } + +inline void Object::dictSet(const char *key, Object *val) + { OBJECT_TYPE_CHECK(objDict); dict->set(key, val); } + +inline GBool Object::dictIs(const char *dictType) + { OBJECT_TYPE_CHECK(objDict); return dict->is(dictType); } + +inline GBool Object::isDict(const char *dictType) + { return type == objDict && dictIs(dictType); } + +inline Object *Object::dictLookup(const char *key, Object *obj, int recursion) + { OBJECT_TYPE_CHECK(objDict); return dict->lookup(key, obj, recursion); } + +inline Object *Object::dictLookupNF(const char *key, Object *obj) + { OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key, obj); } + +inline char *Object::dictGetKey(int i) + { OBJECT_TYPE_CHECK(objDict); return dict->getKey(i); } + +inline Object *Object::dictGetVal(int i, Object *obj) + { OBJECT_TYPE_CHECK(objDict); return dict->getVal(i, obj); } + +inline Object *Object::dictGetValNF(int i, Object *obj) + { OBJECT_TYPE_CHECK(objDict); return dict->getValNF(i, obj); } + +//------------------------------------------------------------------------ +// Stream accessors. +//------------------------------------------------------------------------ + +#include "Stream.h" + +inline GBool Object::streamIs(char *dictType) + { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } + +inline GBool Object::isStream(char *dictType) + { return type == objStream && streamIs(dictType); } + +inline void Object::streamReset() + { OBJECT_TYPE_CHECK(objStream); stream->reset(); } + +inline void Object::streamClose() + { OBJECT_TYPE_CHECK(objStream); stream->close(); } + +inline int Object::streamGetChar() + { OBJECT_TYPE_CHECK(objStream); return stream->getChar(); } + +inline int Object::streamGetChars(int nChars, Guchar *buffer) + { OBJECT_TYPE_CHECK(objStream); return stream->doGetChars(nChars, buffer); } + +inline int Object::streamLookChar() + { OBJECT_TYPE_CHECK(objStream); return stream->lookChar(); } + +inline char *Object::streamGetLine(char *buf, int size) + { OBJECT_TYPE_CHECK(objStream); return stream->getLine(buf, size); } + +inline Guint Object::streamGetPos() + { OBJECT_TYPE_CHECK(objStream); return stream->getPos(); } + +inline void Object::streamSetPos(Guint pos, int dir) + { OBJECT_TYPE_CHECK(objStream); stream->setPos(pos, dir); } + +inline Dict *Object::streamGetDict() + { OBJECT_TYPE_CHECK(objStream); return stream->getDict(); } + +#endif diff --git a/poppler/OptionalContent.cc b/poppler/OptionalContent.cc new file mode 100644 index 0000000..e0d49bc --- /dev/null +++ b/poppler/OptionalContent.cc @@ -0,0 +1,553 @@ +//======================================================================== +// +// OptionalContent.cc +// +// Copyright 2007 Brad Hards +// Copyright 2008 Pino Toscano +// Copyright 2008, 2010 Carlos Garcia Campos +// Copyright 2008, 2010, 2011 Albert Astals Cid +// Copyright 2008 Mark Kaplan +// +// Released under the GPL (version 2, or later, at your option) +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "Error.h" +// #include "PDFDocEncoding.h" +#include "OptionalContent.h" + +// Max depth of nested visibility expressions. This is used to catch +// infinite loops in the visibility expression object structure. +#define visibilityExprRecursionLimit 50 + +// Max depth of nested display nodes. This is used to catch infinite +// loops in the "Order" object structure. +#define displayNodeRecursionLimit 50 + +//------------------------------------------------------------------------ + +OCGs::OCGs(Object *ocgObject, XRef *xref) : + m_xref(xref) +{ + // we need to parse the dictionary here, and build optionalContentGroups + ok = gTrue; + optionalContentGroups = new GooList(); + display = NULL; + + Object ocgList; + ocgObject->dictLookup("OCGs", &ocgList); + if (!ocgList.isArray()) { + error(errSyntaxError, -1, "Expected the optional content group list, but wasn't able to find it, or it isn't an Array"); + ocgList.free(); + ok = gFalse; + return; + } + + // we now enumerate over the ocgList, and build up the optionalContentGroups list. + for(int i = 0; i < ocgList.arrayGetLength(); ++i) { + Object ocg; + ocgList.arrayGet(i, &ocg); + if (!ocg.isDict()) { + ocg.free(); + break; + } + OptionalContentGroup *thisOptionalContentGroup = new OptionalContentGroup(ocg.getDict()); + ocg.free(); + ocgList.arrayGetNF(i, &ocg); + // TODO: we should create a lookup map from Ref to the OptionalContentGroup + thisOptionalContentGroup->setRef( ocg.getRef() ); + ocg.free(); + // the default is ON - we change state later, depending on BaseState, ON and OFF + thisOptionalContentGroup->setState(OptionalContentGroup::On); + optionalContentGroups->append(thisOptionalContentGroup); + } + + Object defaultOcgConfig; + ocgObject->dictLookup("D", &defaultOcgConfig); + if (!defaultOcgConfig.isDict()) { + error(errSyntaxError, -1, "Expected the default config, but wasn't able to find it, or it isn't a Dictionary"); + defaultOcgConfig.free(); + ocgList.free(); + ok = gFalse; + return; + } + + Object baseState; + defaultOcgConfig.dictLookup("BaseState", &baseState); + if (baseState.isName("OFF")) { + for (int i = 0; i < optionalContentGroups->getLength(); ++i) { + OptionalContentGroup *group; + + group = (OptionalContentGroup *)optionalContentGroups->get(i); + group->setState(OptionalContentGroup::Off); + } + } + baseState.free(); + + Object on; + defaultOcgConfig.dictLookup("ON", &on); + if (on.isArray()) { + // ON is an optional element + for (int i = 0; i < on.arrayGetLength(); ++i) { + Object reference; + on.arrayGetNF(i, &reference); + if (!reference.isRef()) { + // there can be null entries + reference.free(); + break; + } + OptionalContentGroup *group = findOcgByRef( reference.getRef() ); + reference.free(); + if (!group) { + error(errSyntaxWarning, -1, "Couldn't find group for reference"); + break; + } + group->setState(OptionalContentGroup::On); + } + } + on.free(); + + Object off; + defaultOcgConfig.dictLookup("OFF", &off); + if (off.isArray()) { + // OFF is an optional element + for (int i = 0; i < off.arrayGetLength(); ++i) { + Object reference; + off.arrayGetNF(i, &reference); + if (!reference.isRef()) { + // there can be null entries + reference.free(); + break; + } + OptionalContentGroup *group = findOcgByRef( reference.getRef() ); + reference.free(); + if (!group) { + error(errSyntaxWarning, -1, "Couldn't find group for reference to set OFF"); + break; + } + group->setState(OptionalContentGroup::Off); + } + } + off.free(); + + defaultOcgConfig.dictLookup("Order", &order); + defaultOcgConfig.dictLookup("RBGroups", &rbgroups); + + ocgList.free(); + defaultOcgConfig.free(); +} + +OCGs::~OCGs() +{ + deleteGooList(optionalContentGroups, OptionalContentGroup); + order.free(); + if (display) + delete display; + rbgroups.free(); +} + + +bool OCGs::hasOCGs() +{ + return ( optionalContentGroups->getLength() > 0 ); +} + +OptionalContentGroup* OCGs::findOcgByRef( const Ref &ref) +{ + //TODO: make this more efficient + OptionalContentGroup *ocg = NULL; + for (int i=0; i < optionalContentGroups->getLength(); ++i) { + ocg = (OptionalContentGroup*)optionalContentGroups->get(i); + if ( (ocg->getRef().num == ref.num) && (ocg->getRef().gen == ref.gen) ) { + return ocg; + } + } + + // not found + return NULL; +} + +OCDisplayNode *OCGs::getDisplayRoot() +{ + if (display) + return display; + + if (order.isArray()) + display = OCDisplayNode::parse(&order, this, m_xref); + + return display; +} + +bool OCGs::optContentIsVisible( Object *dictRef ) +{ + Object dictObj; + Dict *dict; + Object dictType; + Object ocg; + Object policy; + Object ve; + bool result = true; + + if (dictRef->isNull()) + return result; + + if (dictRef->isRef()) { + OptionalContentGroup *oc = findOcgByRef(dictRef->getRef()); + if (oc) + return oc->getState() == OptionalContentGroup::On; + } + + dictRef->fetch( m_xref, &dictObj ); + if ( ! dictObj.isDict() ) { + error(errSyntaxWarning, -1, "Unexpected oc reference target: {0:d}", dictObj.getType() ); + dictObj.free(); + return result; + } + dict = dictObj.getDict(); + // printf("checking if optContent is visible\n"); + dict->lookup("Type", &dictType); + if (dictType.isName("OCMD")) { + if (dict->lookup("VE", &ve)->isArray()) { + result = evalOCVisibilityExpr(&ve, 0); + } else { + dict->lookupNF("OCGs", &ocg); + if (ocg.isArray()) { + dict->lookup("P", &policy); + if (policy.isName("AllOn")) { + result = allOn( ocg.getArray() ); + } else if (policy.isName("AllOff")) { + result = allOff( ocg.getArray() ); + } else if (policy.isName("AnyOff")) { + result = anyOff( ocg.getArray() ); + } else if ( (!policy.isName()) || (policy.isName("AnyOn") ) ) { + // this is the default + result = anyOn( ocg.getArray() ); + } + policy.free(); + } else if (ocg.isRef()) { + OptionalContentGroup *oc = findOcgByRef( ocg.getRef() ); + if ( oc && oc->getState() == OptionalContentGroup::Off ) { + result = false; + } else { + result = true ; + } + } + ocg.free(); + } + ve.free(); + } else if ( dictType.isName("OCG") ) { + OptionalContentGroup* oc = findOcgByRef( dictRef->getRef() ); + if ( oc && oc->getState() == OptionalContentGroup::Off ) { + result=false; + } + } + dictType.free(); + dictObj.free(); + // printf("visibility: %s\n", result? "on" : "off"); + return result; +} + +GBool OCGs::evalOCVisibilityExpr(Object *expr, int recursion) { + OptionalContentGroup *ocg; + Object expr2, op, obj; + GBool ret; + int i; + + if (recursion > visibilityExprRecursionLimit) { + error(errSyntaxError, -1, + "Loop detected in optional content visibility expression"); + return gTrue; + } + if (expr->isRef()) { + if ((ocg = findOcgByRef(expr->getRef()))) { + return ocg->getState() == OptionalContentGroup::On; + } + } + expr->fetch(m_xref, &expr2); + if (!expr2.isArray() || expr2.arrayGetLength() < 1) { + error(errSyntaxError, -1, + "Invalid optional content visibility expression"); + expr2.free(); + return gTrue; + } + expr2.arrayGet(0, &op); + if (op.isName("Not")) { + if (expr2.arrayGetLength() == 2) { + expr2.arrayGetNF(1, &obj); + ret = !evalOCVisibilityExpr(&obj, recursion + 1); + obj.free(); + } else { + error(errSyntaxError, -1, + "Invalid optional content visibility expression"); + ret = gTrue; + } + } else if (op.isName("And")) { + ret = gTrue; + for (i = 1; i < expr2.arrayGetLength() && ret; ++i) { + expr2.arrayGetNF(i, &obj); + ret = evalOCVisibilityExpr(&obj, recursion + 1); + obj.free(); + } + } else if (op.isName("Or")) { + ret = gFalse; + for (i = 1; i < expr2.arrayGetLength() && !ret; ++i) { + expr2.arrayGetNF(i, &obj); + ret = evalOCVisibilityExpr(&obj, recursion + 1); + obj.free(); + } + } else { + error(errSyntaxError, -1, + "Invalid optional content visibility expression"); + ret = gTrue; + } + op.free(); + expr2.free(); + return ret; +} + +bool OCGs::allOn( Array *ocgArray ) +{ + for (int i = 0; i < ocgArray->getLength(); ++i) { + Object ocgItem; + ocgArray->getNF(i, &ocgItem); + if (ocgItem.isRef()) { + OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() ); + if ( oc && oc->getState() == OptionalContentGroup::Off ) { + return false; + } + } + } + return true; +} + +bool OCGs::allOff( Array *ocgArray ) +{ + for (int i = 0; i < ocgArray->getLength(); ++i) { + Object ocgItem; + ocgArray->getNF(i, &ocgItem); + if (ocgItem.isRef()) { + OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() ); + if ( oc && oc->getState() == OptionalContentGroup::On ) { + return false; + } + } + } + return true; +} + +bool OCGs::anyOn( Array *ocgArray ) +{ + for (int i = 0; i < ocgArray->getLength(); ++i) { + Object ocgItem; + ocgArray->getNF(i, &ocgItem); + if (ocgItem.isRef()) { + OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() ); + if ( oc && oc->getState() == OptionalContentGroup::On ) { + return true; + } + } + } + return false; +} + +bool OCGs::anyOff( Array *ocgArray ) +{ + for (int i = 0; i < ocgArray->getLength(); ++i) { + Object ocgItem; + ocgArray->getNF(i, &ocgItem); + if (ocgItem.isRef()) { + OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() ); + if ( oc && oc->getState() == OptionalContentGroup::Off ) { + return true; + } + } + } + return false; +} + +//------------------------------------------------------------------------ + +OptionalContentGroup::OptionalContentGroup(Dict *ocgDict) : m_name(NULL) +{ + Object obj1, obj2, obj3; + Object ocgName; + ocgDict->lookup("Name", &ocgName); + if (!ocgName.isString()) { + error(errSyntaxWarning, -1, "Expected the name of the OCG, but wasn't able to find it, or it isn't a String"); + } else { + m_name = new GooString( ocgName.getString() ); + } + ocgName.free(); + + viewState = printState = ocUsageUnset; + if (ocgDict->lookup("Usage", &obj1)->isDict()) { + if (obj1.dictLookup("View", &obj2)->isDict()) { + if (obj2.dictLookup("ViewState", &obj3)->isName()) { + if (obj3.isName("ON")) { + viewState = ocUsageOn; + } else { + viewState = ocUsageOff; + } + } + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Print", &obj2)->isDict()) { + if (obj2.dictLookup("PrintState", &obj3)->isName()) { + if (obj3.isName("ON")) { + printState = ocUsageOn; + } else { + printState = ocUsageOff; + } + } + obj3.free(); + } + obj2.free(); + } + obj1.free(); +} + +OptionalContentGroup::OptionalContentGroup(GooString *label) +{ + m_name = label; + m_state = On; +} + +GooString* OptionalContentGroup::getName() const +{ + return m_name; +} + +void OptionalContentGroup::setRef(const Ref ref) +{ + m_ref = ref; +} + +Ref OptionalContentGroup::getRef() const +{ + return m_ref; +} + +OptionalContentGroup::~OptionalContentGroup() +{ + delete m_name; +} + +//------------------------------------------------------------------------ + +OCDisplayNode *OCDisplayNode::parse(Object *obj, OCGs *oc, + XRef *xref, int recursion) { + Object obj2, obj3; + OptionalContentGroup *ocgA; + OCDisplayNode *node, *child; + int i; + + if (recursion > displayNodeRecursionLimit) { + error(errSyntaxError, -1, "Loop detected in optional content order"); + return NULL; + } + if (obj->isRef()) { + if ((ocgA = oc->findOcgByRef(obj->getRef()))) { + return new OCDisplayNode(ocgA); + } + } + obj->fetch(xref, &obj2); + if (!obj2.isArray()) { + obj2.free(); + return NULL; + } + i = 0; + if (obj2.arrayGetLength() >= 1) { + if (obj2.arrayGet(0, &obj3)->isString()) { + node = new OCDisplayNode(obj3.getString()); + i = 1; + } else { + node = new OCDisplayNode(); + } + obj3.free(); + } else { + node = new OCDisplayNode(); + } + for (; i < obj2.arrayGetLength(); ++i) { + obj2.arrayGetNF(i, &obj3); + if ((child = OCDisplayNode::parse(&obj3, oc, xref, recursion + 1))) { + if (!child->ocg && !child->name && node->getNumChildren() > 0) { + node->getChild(node->getNumChildren() - 1)->addChildren(child->takeChildren()); + delete child; + } else { + node->addChild(child); + } + } + obj3.free(); + } + obj2.free(); + return node; +} + +OCDisplayNode::OCDisplayNode() { + name = NULL; + ocg = NULL; + children = NULL; +} + +OCDisplayNode::OCDisplayNode(GooString *nameA) { + name = new GooString(nameA); + ocg = NULL; + children = NULL; +} + +OCDisplayNode::OCDisplayNode(OptionalContentGroup *ocgA) { + name = (ocgA->getName()) ? ocgA->getName()->copy() : NULL; + ocg = ocgA; + children = NULL; +} + +void OCDisplayNode::addChild(OCDisplayNode *child) { + if (!children) { + children = new GooList(); + } + children->append(child); +} + +void OCDisplayNode::addChildren(GooList *childrenA) { + if (!children) { + children = new GooList(); + } + children->append(childrenA); + delete childrenA; +} + +GooList *OCDisplayNode::takeChildren() { + GooList *childrenA; + + childrenA = children; + children = NULL; + return childrenA; +} + +OCDisplayNode::~OCDisplayNode() { + gfree(name); + if (children) { + deleteGooList(children, OCDisplayNode); + } +} + +int OCDisplayNode::getNumChildren() { + if (!children) { + return 0; + } + return children->getLength(); +} + +OCDisplayNode *OCDisplayNode::getChild(int idx) { + return (OCDisplayNode *)children->get(idx); +} diff --git a/poppler/OptionalContent.h b/poppler/OptionalContent.h new file mode 100644 index 0000000..02c9a47 --- /dev/null +++ b/poppler/OptionalContent.h @@ -0,0 +1,140 @@ +//======================================================================== +// +// OptionalContent.h +// +// Copyright 2007 Brad Hards +// Copyright 2008 Carlos Garcia Campos +// +// Released under the GPL (version 2, or later, at your option) +// +//======================================================================== + +#ifndef OPTIONALCONTENT_H +#define OPTIONALCONTENT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" +#include "CharTypes.h" + +class GooString; +class GooList; +class XRef; + +class OptionalContentGroup; +class OCDisplayNode; + +//------------------------------------------------------------------------ + +class OCGs { +public: + + OCGs(Object *ocgObject, XRef *xref); + ~OCGs(); + + // Is OCGS valid? + GBool isOk() { return ok; } + + bool hasOCGs(); + GooList *getOCGs() const { return optionalContentGroups; } + + OptionalContentGroup* findOcgByRef( const Ref &ref); + + // Get the root node of the optional content group display tree + // (which does not necessarily include all of the OCGs). + OCDisplayNode *getDisplayRoot(); + + Array* getOrderArray() + { return (order.isArray() && order.arrayGetLength() > 0) ? order.getArray() : NULL; } + Array* getRBGroupsArray() + { return (rbgroups.isArray() && rbgroups.arrayGetLength()) ? rbgroups.getArray() : NULL; } + + bool optContentIsVisible( Object *dictRef ); + +private: + GBool ok; + + GBool evalOCVisibilityExpr(Object *expr, int recursion); + bool allOn( Array *ocgArray ); + bool allOff( Array *ocgArray ); + bool anyOn( Array *ocgArray ); + bool anyOff( Array *ocgArray ); + + GooList *optionalContentGroups; + + Object order; + Object rbgroups; + XRef *m_xref; + OCDisplayNode *display; // root node of display tree +}; + +//------------------------------------------------------------------------ + +class OptionalContentGroup { +public: + enum State { On, Off }; + + // Values from the optional content usage dictionary. + enum UsageState { + ocUsageOn, + ocUsageOff, + ocUsageUnset + }; + + OptionalContentGroup(Dict *dict); + + OptionalContentGroup(GooString *label); + + ~OptionalContentGroup(); + + GooString* getName() const; + + Ref getRef() const; + void setRef(const Ref ref); + + State getState() { return m_state; }; + void setState(State state) { m_state = state; }; + + UsageState getViewState() { return viewState; } + UsageState getPrintState() { return printState; } + +private: + XRef *xref; + GooString *m_name; + Ref m_ref; + State m_state; + UsageState viewState; // suggested state when viewing + UsageState printState; // suggested state when printing +}; + +//------------------------------------------------------------------------ + +class OCDisplayNode { +public: + + static OCDisplayNode *parse(Object *obj, OCGs *oc, XRef *xref, int recursion = 0); + OCDisplayNode(); + ~OCDisplayNode(); + + GooString *getName() { return name; } + OptionalContentGroup *getOCG() { return ocg; } + int getNumChildren(); + OCDisplayNode *getChild(int idx); + +private: + + OCDisplayNode(GooString *nameA); + OCDisplayNode(OptionalContentGroup *ocgA); + void addChild(OCDisplayNode *child); + void addChildren(GooList *childrenA); + GooList *takeChildren(); + + GooString *name; // display name (may be NULL) + OptionalContentGroup *ocg; // NULL for display labels + GooList *children; // NULL if there are no children + // [OCDisplayNode] +}; + +#endif diff --git a/poppler/Outline.cc b/poppler/Outline.cc new file mode 100644 index 0000000..bd4e6d0 --- /dev/null +++ b/poppler/Outline.cc @@ -0,0 +1,188 @@ +//======================================================================== +// +// Outline.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Marco Pesenti Gritti +// Copyright (C) 2008 Albert Astals Cid +// Copyright (C) 2009 Nick Jones +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "XRef.h" +#include "Link.h" +#include "PDFDocEncoding.h" +#include "Outline.h" + +//------------------------------------------------------------------------ + +Outline::Outline(Object *outlineObj, XRef *xref) { + Object first, last; + + items = NULL; + if (!outlineObj->isDict()) { + return; + } + items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first), + outlineObj->dictLookupNF("Last", &last), + xref); + first.free(); + last.free(); +} + +Outline::~Outline() { + if (items) { + deleteGooList(items, OutlineItem); + } +} + +//------------------------------------------------------------------------ + +OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) { + Object obj1; + GooString *s; + int i; + + xref = xrefA; + title = NULL; + action = NULL; + kids = NULL; + + if (dict->lookup("Title", &obj1)->isString()) { + s = obj1.getString(); + if ((s->getChar(0) & 0xff) == 0xfe && + (s->getChar(1) & 0xff) == 0xff) { + titleLen = (s->getLength() - 2) / 2; + title = (Unicode *)gmallocn(titleLen, sizeof(Unicode)); + for (i = 0; i < titleLen; ++i) { + title[i] = ((s->getChar(2 + 2*i) & 0xff) << 8) | + (s->getChar(3 + 2*i) & 0xff); + } + } else { + titleLen = s->getLength(); + title = (Unicode *)gmallocn(titleLen, sizeof(Unicode)); + for (i = 0; i < titleLen; ++i) { + title[i] = pdfDocEncoding[s->getChar(i) & 0xff]; + } + } + } else { + titleLen = 0; + } + obj1.free(); + + if (!dict->lookup("Dest", &obj1)->isNull()) { + action = LinkAction::parseDest(&obj1); + } else { + obj1.free(); + if (!dict->lookup("A", &obj1)->isNull()) { + action = LinkAction::parseAction(&obj1); + } + } + obj1.free(); + + dict->lookupNF("First", &firstRef); + dict->lookupNF("Last", &lastRef); + dict->lookupNF("Next", &nextRef); + + startsOpen = gFalse; + if (dict->lookup("Count", &obj1)->isInt()) { + if (obj1.getInt() > 0) { + startsOpen = gTrue; + } + } + obj1.free(); +} + +OutlineItem::~OutlineItem() { + close(); + if (title) { + gfree(title); + } + if (action) { + delete action; + } + firstRef.free(); + lastRef.free(); + nextRef.free(); +} + +GooList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef, + XRef *xrefA) { + GooList *items; + char* alreadyRead; + OutlineItem *item; + Object obj; + Object *p; + + if (!lastItemRef->isRef()) + return NULL; + + items = new GooList(); + + alreadyRead = (char *)gmalloc(xrefA->getNumObjects()); + memset(alreadyRead, 0, xrefA->getNumObjects()); + + p = firstItemRef; + while (p->isRef() && + (p->getRefNum() >= 0) && + (p->getRefNum() < xrefA->getNumObjects()) && + !alreadyRead[p->getRefNum()]) { + if (!p->fetch(xrefA, &obj)->isDict()) { + obj.free(); + break; + } + alreadyRead[p->getRefNum()] = 1; + item = new OutlineItem(obj.getDict(), xrefA); + obj.free(); + items->append(item); + if (p->getRef().num == lastItemRef->getRef().num && + p->getRef().gen == lastItemRef->getRef().gen) { + break; + } + p = &item->nextRef; + } + + gfree(alreadyRead); + + if (!items->getLength()) { + delete items; + items = NULL; + } + + return items; +} + +void OutlineItem::open() { + if (!kids) { + kids = readItemList(&firstRef, &lastRef, xref); + } +} + +void OutlineItem::close() { + if (kids) { + deleteGooList(kids, OutlineItem); + kids = NULL; + } +} diff --git a/poppler/Outline.h b/poppler/Outline.h new file mode 100644 index 0000000..90190e6 --- /dev/null +++ b/poppler/Outline.h @@ -0,0 +1,89 @@ +//======================================================================== +// +// Outline.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Marco Pesenti Gritti +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef OUTLINE_H +#define OUTLINE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" +#include "CharTypes.h" + +class GooString; +class GooList; +class XRef; +class LinkAction; + +//------------------------------------------------------------------------ + +class Outline { +public: + + Outline(Object *outlineObj, XRef *xref); + ~Outline(); + + GooList *getItems() { return items; } + +private: + + GooList *items; // NULL if document has no outline, + // otherwise, a list of OutlineItem +}; + +//------------------------------------------------------------------------ + +class OutlineItem { +public: + + OutlineItem(Dict *dict, XRef *xrefA); + ~OutlineItem(); + + static GooList *readItemList(Object *firstItemRef, Object *lastItemRef, + XRef *xrefA); + + void open(); + void close(); + + Unicode *getTitle() { return title; } + int getTitleLength() { return titleLen; } + LinkAction *getAction() { return action; } + GBool isOpen() { return startsOpen; } + GBool hasKids() { return firstRef.isRef(); } + GooList *getKids() { return kids; } + +private: + + XRef *xref; + Unicode *title; + int titleLen; + LinkAction *action; + Object firstRef; + Object lastRef; + Object nextRef; + GBool startsOpen; + GooList *kids; // NULL if this item is closed or has no kids, + // otherwise a list of OutlineItem +}; + +#endif diff --git a/poppler/OutputDev.cc b/poppler/OutputDev.cc new file mode 100644 index 0000000..54580d0 --- /dev/null +++ b/poppler/OutputDev.cc @@ -0,0 +1,195 @@ +//======================================================================== +// +// OutputDev.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2006 Thorkild Stray +// Copyright (C) 2007 Adrian Johnson +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009, 2012 Albert Astals Cid +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Stream.h" +#include "GfxState.h" +#include "OutputDev.h" +#include "goo/GooHash.h" + +//------------------------------------------------------------------------ +// OutputDev +//------------------------------------------------------------------------ + +void OutputDev::setDefaultCTM(double *ctm) { + int i; + double det; + + for (i = 0; i < 6; ++i) { + defCTM[i] = ctm[i]; + } + det = 1 / (defCTM[0] * defCTM[3] - defCTM[1] * defCTM[2]); + defICTM[0] = defCTM[3] * det; + defICTM[1] = -defCTM[1] * det; + defICTM[2] = -defCTM[2] * det; + defICTM[3] = defCTM[0] * det; + defICTM[4] = (defCTM[2] * defCTM[5] - defCTM[3] * defCTM[4]) * det; + defICTM[5] = (defCTM[1] * defCTM[4] - defCTM[0] * defCTM[5]) * det; +} + +void OutputDev::cvtDevToUser(double dx, double dy, double *ux, double *uy) { + *ux = defICTM[0] * dx + defICTM[2] * dy + defICTM[4]; + *uy = defICTM[1] * dx + defICTM[3] * dy + defICTM[5]; +} + +void OutputDev::cvtUserToDev(double ux, double uy, int *dx, int *dy) { + *dx = (int)(defCTM[0] * ux + defCTM[2] * uy + defCTM[4] + 0.5); + *dy = (int)(defCTM[1] * ux + defCTM[3] * uy + defCTM[5] + 0.5); +} + +void OutputDev::updateAll(GfxState *state) { + updateLineDash(state); + updateFlatness(state); + updateLineJoin(state); + updateLineCap(state); + updateMiterLimit(state); + updateLineWidth(state); + updateStrokeAdjust(state); + updateFillColorSpace(state); + updateFillColor(state); + updateStrokeColorSpace(state); + updateStrokeColor(state); + updateBlendMode(state); + updateFillOpacity(state); + updateStrokeOpacity(state); + updateFillOverprint(state); + updateStrokeOverprint(state); + updateTransfer(state); + updateFont(state); +} + +GBool OutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) { + return gFalse; +} + +void OutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + int i, j; + + if (inlineImg) { + str->reset(); + j = height * ((width + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + str->close(); + } +} + +void OutputDev::setSoftMaskFromImageMask(GfxState *state, + Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix) { + drawImageMask(state, ref, str, width, height, invert, gFalse, inlineImg); +} + +void OutputDev::unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix) { + return; +} + +void OutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) { + int i, j; + + if (inlineImg) { + str->reset(); + j = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + str->close(); + } +} + +void OutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert, + GBool maskInterpolate) { + drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse); +} + +void OutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate) { + drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse); +} + +void OutputDev::endMarkedContent(GfxState *state) { +} + +void OutputDev::beginMarkedContent(char *name, Dict *properties) { +} + +void OutputDev::markPoint(char *name) { +} + +void OutputDev::markPoint(char *name, Dict *properties) { +} + + +#if OPI_SUPPORT +void OutputDev::opiBegin(GfxState *state, Dict *opiDict) { +} + +void OutputDev::opiEnd(GfxState *state, Dict *opiDict) { +} +#endif + +void OutputDev::startProfile() { + if (profileHash) + delete profileHash; + + profileHash = new GooHash (true); +} + +GooHash *OutputDev::endProfile() { + GooHash *profile = profileHash; + + profileHash = NULL; + + return profile; +} + diff --git a/poppler/OutputDev.h b/poppler/OutputDev.h new file mode 100644 index 0000000..15af90a --- /dev/null +++ b/poppler/OutputDev.h @@ -0,0 +1,331 @@ +//======================================================================== +// +// OutputDev.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Jonathan Blandford +// Copyright (C) 2006 Thorkild Stray +// Copyright (C) 2007 Jeff Muizelaar +// Copyright (C) 2007, 2011 Adrian Johnson +// Copyright (C) 2009-2012 Thomas Freitag +// Copyright (C) 2009, 2011 Carlos Garcia Campos +// Copyright (C) 2009, 2012 Albert Astals Cid +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef OUTPUTDEV_H +#define OUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "goo/gtypes.h" +#include "CharTypes.h" +#include "Object.h" + +class Annot; +class Dict; +class GooHash; +class GooString; +class GfxState; +class Gfx; +struct GfxColor; +class GfxColorSpace; +class GfxImageColorMap; +class GfxFunctionShading; +class GfxAxialShading; +class GfxGouraudTriangleShading; +class GfxPatchMeshShading; +class GfxRadialShading; +class GfxGouraudTriangleShading; +class GfxPatchMeshShading; +class Stream; +class Links; +class AnnotLink; +class Catalog; +class Page; +class Function; + +//------------------------------------------------------------------------ +// OutputDev +//------------------------------------------------------------------------ + +class OutputDev { +public: + + // Constructor. + OutputDev() { profileHash = NULL; } + + // Destructor. + virtual ~OutputDev() {} + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() = 0; + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() = 0; + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gFalse; } + + // Does this device support specific shading types? + // see gouraudTriangleShadedFill() and patchMeshShadedFill() + virtual GBool useShadedFills(int type) { return gFalse; } + + // Does this device use FillColorStop()? + virtual GBool useFillColorStop() { return gFalse; } + + // Does this device use drawForm()? If this returns false, + // form-type XObjects will be interpreted (i.e., unrolled). + virtual GBool useDrawForm() { return gFalse; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() = 0; + + // Does this device need non-text content? + virtual GBool needNonText() { return gTrue; } + + // Does this device require incCharCount to be called for text on + // non-shown layers? + virtual GBool needCharCount() { return gFalse; } + + //----- initialization and control + + // Set default transform matrix. + virtual void setDefaultCTM(double *ctm); + + // Check to see if a page slice should be displayed. If this + // returns false, the page display is aborted. Typically, an + // OutputDev will use some alternate means to display the page + // before returning false. + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (* abortCheckCbk)(void *data) = NULL, + void * abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL) + { return gTrue; } + + // Start a page. + virtual void startPage(int pageNum, GfxState *state) {} + + // End a page. + virtual void endPage() {} + + // Dump page contents to display. + virtual void dump() {} + + //----- coordinate conversion + + // Convert between device and user coordinates. + virtual void cvtDevToUser(double dx, double dy, double *ux, double *uy); + virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy); + + double *getDefCTM() { return defCTM; } + double *getDefICTM() { return defICTM; } + + //----- save/restore graphics state + virtual void saveState(GfxState * /*state*/) {} + virtual void restoreState(GfxState * /*state*/) {} + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState * /*state*/, double /*m11*/, double /*m12*/, + double /*m21*/, double /*m22*/, double /*m31*/, double /*m32*/) {} + virtual void updateLineDash(GfxState * /*state*/) {} + virtual void updateFlatness(GfxState * /*state*/) {} + virtual void updateLineJoin(GfxState * /*state*/) {} + virtual void updateLineCap(GfxState * /*state*/) {} + virtual void updateMiterLimit(GfxState * /*state*/) {} + virtual void updateLineWidth(GfxState * /*state*/) {} + virtual void updateStrokeAdjust(GfxState * /*state*/) {} + virtual void updateAlphaIsShape(GfxState * /*state*/) {} + virtual void updateTextKnockout(GfxState * /*state*/) {} + virtual void updateFillColorSpace(GfxState * /*state*/) {} + virtual void updateStrokeColorSpace(GfxState * /*state*/) {} + virtual void updateFillColor(GfxState * /*state*/) {} + virtual void updateStrokeColor(GfxState * /*state*/) {} + virtual void updateBlendMode(GfxState * /*state*/) {} + virtual void updateFillOpacity(GfxState * /*state*/) {} + virtual void updateStrokeOpacity(GfxState * /*state*/) {} + virtual void updateFillOverprint(GfxState * /*state*/) {} + virtual void updateStrokeOverprint(GfxState * /*state*/) {} + virtual void updateOverprintMode(GfxState * /*state*/) {} + virtual void updateTransfer(GfxState * /*state*/) {} + virtual void updateFillColorStop(GfxState * /*state*/, double /*offset*/) {} + + //----- update text state + virtual void updateFont(GfxState * /*state*/) {} + virtual void updateTextMat(GfxState * /*state*/) {} + virtual void updateCharSpace(GfxState * /*state*/) {} + virtual void updateRender(GfxState * /*state*/) {} + virtual void updateRise(GfxState * /*state*/) {} + virtual void updateWordSpace(GfxState * /*state*/) {} + virtual void updateHorizScaling(GfxState * /*state*/) {} + virtual void updateTextPos(GfxState * /*state*/) {} + virtual void updateTextShift(GfxState * /*state*/, double /*shift*/) {} + virtual void saveTextPos(GfxState * /*state*/) {} + virtual void restoreTextPos(GfxState * /*state*/) {} + + //----- path painting + virtual void stroke(GfxState * /*state*/) {} + virtual void fill(GfxState * /*state*/) {} + virtual void eoFill(GfxState * /*state*/) {} + virtual GBool tilingPatternFill(GfxState * /*state*/, Gfx * /*gfx*/, Catalog * /*cat*/, Object * /*str*/, + double * /*pmat*/, int /*paintType*/, int /*tilingType*/, Dict * /*resDict*/, + double * /*mat*/, double * /*bbox*/, + int /*x0*/, int /*y0*/, int /*x1*/, int /*y1*/, + double /*xStep*/, double /*yStep*/) + { return gFalse; } + virtual GBool functionShadedFill(GfxState * /*state*/, + GfxFunctionShading * /*shading*/) + { return gFalse; } + virtual GBool axialShadedFill(GfxState * /*state*/, GfxAxialShading * /*shading*/, double /*tMin*/, double /*tMax*/) + { return gFalse; } + virtual GBool axialShadedSupportExtend(GfxState * /*state*/, GfxAxialShading * /*shading*/) + { return gFalse; } + virtual GBool radialShadedFill(GfxState * /*state*/, GfxRadialShading * /*shading*/, double /*sMin*/, double /*sMax*/) + { return gFalse; } + virtual GBool radialShadedSupportExtend(GfxState * /*state*/, GfxRadialShading * /*shading*/) + { return gFalse; } + virtual GBool gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading) + { return gFalse; } + virtual GBool patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading) + { return gFalse; } + + //----- path clipping + virtual void clip(GfxState * /*state*/) {} + virtual void eoClip(GfxState * /*state*/) {} + virtual void clipToStrokePath(GfxState * /*state*/) {} + + //----- text drawing + virtual void beginStringOp(GfxState * /*state*/) {} + virtual void endStringOp(GfxState * /*state*/) {} + virtual void beginString(GfxState * /*state*/, GooString * /*s*/) {} + virtual void endString(GfxState * /*state*/) {} + virtual void drawChar(GfxState * /*state*/, double /*x*/, double /*y*/, + double /*dx*/, double /*dy*/, + double /*originX*/, double /*originY*/, + CharCode /*code*/, int /*nBytes*/, Unicode * /*u*/, int /*uLen*/) {} + virtual void drawString(GfxState * /*state*/, GooString * /*s*/) {} + virtual GBool beginType3Char(GfxState * /*state*/, double /*x*/, double /*y*/, + double /*dx*/, double /*dy*/, + CharCode /*code*/, Unicode * /*u*/, int /*uLen*/); + virtual void endType3Char(GfxState * /*state*/) {} + virtual void beginTextObject(GfxState * /*state*/) {} + virtual GBool deviceHasTextClip(GfxState * /*state*/) { return gFalse; } + virtual void endTextObject(GfxState * /*state*/) {} + virtual void incCharCount(int /*nChars*/) {} + virtual void beginActualText(GfxState * /*state*/, GooString * /*text*/ ) {} + virtual void endActualText(GfxState * /*state*/) {} + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, GBool interpolate, + GBool inlineImg); + virtual void setSoftMaskFromImageMask(GfxState *state, + Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix); + virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate); + + //----- grouping operators + + virtual void endMarkedContent(GfxState *state); + virtual void beginMarkedContent(char *name, Dict *properties); + virtual void markPoint(char *name); + virtual void markPoint(char *name, Dict *properties); + + + +#if OPI_SUPPORT + //----- OPI functions + virtual void opiBegin(GfxState *state, Dict *opiDict); + virtual void opiEnd(GfxState *state, Dict *opiDict); +#endif + + //----- Type 3 font operators + virtual void type3D0(GfxState * /*state*/, double /*wx*/, double /*wy*/) {} + virtual void type3D1(GfxState * /*state*/, double /*wx*/, double /*wy*/, + double /*llx*/, double /*lly*/, double /*urx*/, double /*ury*/) {} + + //----- form XObjects + virtual void drawForm(Ref /*id*/) {} + + //----- PostScript XObjects + virtual void psXObject(Stream * /*psStream*/, Stream * /*level1Stream*/) {} + + //----- Profiling + virtual void startProfile(); + virtual GooHash *getProfileHash() {return profileHash; } + virtual GooHash *endProfile(); + + //----- transparency groups and soft masks + virtual GBool checkTransparencyGroup(GfxState * /*state*/, GBool /*knockout*/) { return gTrue; } + virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/, + GfxColorSpace * /*blendingColorSpace*/, + GBool /*isolated*/, GBool /*knockout*/, + GBool /*forSoftMask*/) {} + virtual void endTransparencyGroup(GfxState * /*state*/) {} + virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {} + virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/, + Function * /*transferFunc*/, GfxColor * /*backdropColor*/) {} + virtual void clearSoftMask(GfxState * /*state*/) {} + + //----- links + virtual void processLink(AnnotLink * /*link*/) {} + +#if 1 //~tmp: turn off anti-aliasing temporarily + virtual GBool getVectorAntialias() { return gFalse; } + virtual void setVectorAntialias(GBool /*vaa*/) {} +#endif + +private: + + double defCTM[6]; // default coordinate transform matrix + double defICTM[6]; // inverse of default CTM + GooHash *profileHash; +}; + +#endif diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc new file mode 100644 index 0000000..ce01ca3 --- /dev/null +++ b/poppler/PDFDoc.cc @@ -0,0 +1,1644 @@ +//======================================================================== +// +// PDFDoc.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2006, 2008 Brad Hards +// Copyright (C) 2005, 2007-2009, 2011, 2012 Albert Astals Cid +// Copyright (C) 2008 Julien Rebetez +// Copyright (C) 2008, 2010 Pino Toscano +// Copyright (C) 2008, 2010, 2011 Carlos Garcia Campos +// Copyright (C) 2009 Eric Toombs +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2009, 2011 Axel Struebing +// Copyright (C) 2010, 2011 Hib Eris +// Copyright (C) 2010 Jakub Wilk +// Copyright (C) 2010 Ilya Gorenbein +// Copyright (C) 2010 Srinivas Adicherla +// Copyright (C) 2010 Philip Lorenz +// Copyright (C) 2011, 2012 Thomas Freitag +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +# include +#endif +#include +#include "goo/gstrtod.h" +#include "goo/GooString.h" +#include "poppler-config.h" +#include "GlobalParams.h" +#include "Page.h" +#include "Catalog.h" +#include "Stream.h" +#include "XRef.h" +#include "Linearization.h" +#include "Link.h" +#include "OutputDev.h" +#include "Error.h" +#include "ErrorCodes.h" +#include "Lexer.h" +#include "Parser.h" +#include "SecurityHandler.h" +#include "Decrypt.h" +#ifndef DISABLE_OUTLINE +#include "Outline.h" +#endif +#include "PDFDoc.h" +#include "Hints.h" + +//------------------------------------------------------------------------ + +#define headerSearchSize 1024 // read this many bytes at beginning of + // file to look for '%PDF' +#define pdfIdLength 32 // PDF Document IDs (PermanentId, UpdateId) length + +#define linearizationSearchSize 1024 // read this many bytes at beginning of + // file to look for linearization + // dictionary + +#define xrefSearchSize 1024 // read this many bytes at end of file + // to look for 'startxref' + +//------------------------------------------------------------------------ +// PDFDoc +//------------------------------------------------------------------------ + +void PDFDoc::init() +{ + ok = gFalse; + errCode = errNone; + fileName = NULL; + file = NULL; + str = NULL; + xref = NULL; + linearization = NULL; + catalog = NULL; + hints = NULL; +#ifndef DISABLE_OUTLINE + outline = NULL; +#endif + startXRefPos = ~(Guint)0; + secHdlr = NULL; + pageCache = NULL; +} + +PDFDoc::PDFDoc() +{ + init(); +} + +PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword, + GooString *userPassword, void *guiDataA) { + Object obj; + int size = 0; +#ifdef _WIN32 + int n, i; +#endif + + init(); + + fileName = fileNameA; + guiData = guiDataA; +#ifdef _WIN32 + n = fileName->getLength(); + fileNameU = (wchar_t *)gmallocn(n + 1, sizeof(wchar_t)); + for (i = 0; i < n; ++i) { + fileNameU[i] = (wchar_t)(fileName->getChar(i) & 0xff); + } + fileNameU[n] = L'\0'; +#endif + + struct stat buf; + if (stat(fileName->getCString(), &buf) == 0) { + size = buf.st_size; + } + + // try to open file +#ifdef VMS + file = fopen(fileName->getCString(), "rb", "ctx=stm"); +#else + file = fopen(fileName->getCString(), "rb"); +#endif + if (file == NULL) { + // fopen() has failed. + // Keep a copy of the errno returned by fopen so that it can be + // referred to later. + fopenErrno = errno; + error(errIO, -1, "Couldn't open file '{0:t}': {0:s}.", fileName, strerror(errno)); + errCode = errOpenFile; + return; + } + + // create stream + obj.initNull(); + str = new FileStream(file, 0, gFalse, size, &obj); + + ok = setup(ownerPassword, userPassword); +} + +#ifdef _WIN32 +PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword, + GooString *userPassword, void *guiDataA) { + OSVERSIONINFO version; + Object obj; + int i; + + init(); + + guiData = guiDataA; + + // save both Unicode and 8-bit copies of the file name + fileName = new GooString(); + fileNameU = (wchar_t *)gmallocn(fileNameLen + 1, sizeof(wchar_t)); + for (i = 0; i < fileNameLen; ++i) { + fileName->append((char)fileNameA[i]); + fileNameU[i] = fileNameA[i]; + } + fileNameU[fileNameLen] = L'\0'; + + + // try to open file + // NB: _wfopen is only available in NT + struct _stat buf; + int size; + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + if (_wstat(fileNameU, &buf) == 0) { + size = buf.st_size; + } + file = _wfopen(fileNameU, L"rb"); + } else { + if (_stat(fileName->getCString(), &buf) == 0) { + size = buf.st_size; + } + file = fopen(fileName->getCString(), "rb"); + } + if (!file) { + error(errIO, -1, "Couldn't open file '{0:t}'", fileName); + errCode = errOpenFile; + return; + } + + // create stream + obj.initNull(); + str = new FileStream(file, 0, gFalse, size, &obj); + + ok = setup(ownerPassword, userPassword); +} +#endif + +PDFDoc::PDFDoc(BaseStream *strA, GooString *ownerPassword, + GooString *userPassword, void *guiDataA) { +#ifdef _WIN32 + int n, i; +#endif + + init(); + guiData = guiDataA; + if (strA->getFileName()) { + fileName = strA->getFileName()->copy(); +#ifdef _WIN32 + n = fileName->getLength(); + fileNameU = (wchar_t *)gmallocn(n + 1, sizeof(wchar_t)); + for (i = 0; i < n; ++i) { + fileNameU[i] = (wchar_t)(fileName->getChar(i) & 0xff); + } + fileNameU[n] = L'\0'; +#endif + } else { + fileName = NULL; +#ifdef _WIN32 + fileNameU = NULL; +#endif + } + str = strA; + ok = setup(ownerPassword, userPassword); +} + +GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) { + str->setPos(0, -1); + if (str->getPos() < 0) + { + error(errSyntaxError, -1, "Document base stream is not seekable"); + return gFalse; + } + + str->reset(); + + // check footer + // Adobe does not seem to enforce %%EOF, so we do the same +// if (!checkFooter()) return gFalse; + + // check header + checkHeader(); + + GBool wasReconstructed = false; + + // read xref table + xref = new XRef(str, getStartXRef(), getMainXRefEntriesOffset(), &wasReconstructed); + if (!xref->isOk()) { + error(errSyntaxError, -1, "Couldn't read xref table"); + errCode = xref->getErrorCode(); + return gFalse; + } + + // check for encryption + if (!checkEncryption(ownerPassword, userPassword)) { + errCode = errEncrypted; + return gFalse; + } + + // read catalog + catalog = new Catalog(this); + if (catalog && !catalog->isOk()) { + if (!wasReconstructed) + { + // try one more time to contruct the Catalog, maybe the problem is damaged XRef + delete catalog; + delete xref; + xref = new XRef(str, 0, 0, NULL, true); + catalog = new Catalog(this); + } + + if (catalog && !catalog->isOk()) { + error(errSyntaxError, -1, "Couldn't read page catalog"); + errCode = errBadCatalog; + return gFalse; + } + } + + // done + return gTrue; +} + +PDFDoc::~PDFDoc() { + if (pageCache) { + for (int i = 0; i < getNumPages(); i++) { + if (pageCache[i]) { + delete pageCache[i]; + } + } + gfree(pageCache); + } + delete secHdlr; +#ifndef DISABLE_OUTLINE + if (outline) { + delete outline; + } +#endif + if (catalog) { + delete catalog; + } + if (xref) { + delete xref; + } + if (hints) { + delete hints; + } + if (linearization) { + delete linearization; + } + if (str) { + delete str; + } + if (file) { + fclose(file); + } + if (fileName) { + delete fileName; + } +#ifdef _WIN32 + if (fileNameU) { + gfree(fileNameU); + } +#endif +} + + +// Check for a %%EOF at the end of this stream +GBool PDFDoc::checkFooter() { + // we look in the last 1024 chars because Adobe does the same + char *eof = new char[1025]; + int pos = str->getPos(); + str->setPos(1024, -1); + int i, ch; + for (i = 0; i < 1024; i++) + { + ch = str->getChar(); + if (ch == EOF) + break; + eof[i] = ch; + } + eof[i] = '\0'; + + bool found = false; + for (i = i - 5; i >= 0; i--) { + if (strncmp (&eof[i], "%%EOF", 5) == 0) { + found = true; + break; + } + } + if (!found) + { + error(errSyntaxError, -1, "Document has not the mandatory ending %%EOF"); + errCode = errDamaged; + delete[] eof; + return gFalse; + } + delete[] eof; + str->setPos(pos); + return gTrue; +} + +// Check for a PDF header on this stream. Skip past some garbage +// if necessary. +void PDFDoc::checkHeader() { + char hdrBuf[headerSearchSize+1]; + char *p; + char *tokptr; + int i; + + pdfMajorVersion = 0; + pdfMinorVersion = 0; + for (i = 0; i < headerSearchSize; ++i) { + hdrBuf[i] = str->getChar(); + } + hdrBuf[headerSearchSize] = '\0'; + for (i = 0; i < headerSearchSize - 5; ++i) { + if (!strncmp(&hdrBuf[i], "%PDF-", 5)) { + break; + } + } + if (i >= headerSearchSize - 5) { + error(errSyntaxWarning, -1, "May not be a PDF file (continuing anyway)"); + return; + } + str->moveStart(i); + if (!(p = strtok_r(&hdrBuf[i+5], " \t\n\r", &tokptr))) { + error(errSyntaxWarning, -1, "May not be a PDF file (continuing anyway)"); + return; + } + sscanf(p, "%d.%d", &pdfMajorVersion, &pdfMinorVersion); + // We don't do the version check. Don't add it back in. +} + +GBool PDFDoc::checkEncryption(GooString *ownerPassword, GooString *userPassword) { + Object encrypt; + GBool encrypted; + GBool ret; + + xref->getTrailerDict()->dictLookup("Encrypt", &encrypt); + if ((encrypted = encrypt.isDict())) { + if ((secHdlr = SecurityHandler::make(this, &encrypt))) { + if (secHdlr->isUnencrypted()) { + // no encryption + ret = gTrue; + } else if (secHdlr->checkEncryption(ownerPassword, userPassword)) { + // authorization succeeded + xref->setEncryption(secHdlr->getPermissionFlags(), + secHdlr->getOwnerPasswordOk(), + secHdlr->getFileKey(), + secHdlr->getFileKeyLength(), + secHdlr->getEncVersion(), + secHdlr->getEncRevision(), + secHdlr->getEncAlgorithm()); + ret = gTrue; + } else { + // authorization failed + ret = gFalse; + } + } else { + // couldn't find the matching security handler + ret = gFalse; + } + } else { + // document is not encrypted + ret = gTrue; + } + encrypt.free(); + return ret; +} + +void PDFDoc::displayPage(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data), + void *annotDisplayDecideCbkData) { + if (globalParams->getPrintCommands()) { + printf("***** page %d *****\n", page); + } + + if (getPage(page)) + getPage(page)->display(out, hDPI, vDPI, + rotate, useMediaBox, crop, printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData); + +} + +void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data), + void *annotDisplayDecideCbkData) { + int page; + + for (page = firstPage; page <= lastPage; ++page) { + displayPage(out, page, hDPI, vDPI, rotate, useMediaBox, crop, printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData); + } +} + +void PDFDoc::displayPageSlice(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data), + void *annotDisplayDecideCbkData) { + if (getPage(page)) + getPage(page)->displaySlice(out, hDPI, vDPI, + rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData); +} + +Links *PDFDoc::getLinks(int page) { + Page *p = getPage(page); + if (!p) { + return new Links (NULL); + } + return p->getLinks(); +} + +void PDFDoc::processLinks(OutputDev *out, int page) { + if (getPage(page)) + getPage(page)->processLinks(out); +} + +Linearization *PDFDoc::getLinearization() +{ + if (!linearization) { + linearization = new Linearization(str); + } + return linearization; +} + +GBool PDFDoc::isLinearized() { + if ((str->getLength()) && + (getLinearization()->getLength() == str->getLength())) + return gTrue; + else + return gFalse; +} + +static GBool +get_id (GooString *encodedidstring, GooString *id) { + const char *encodedid = encodedidstring->getCString(); + char pdfid[pdfIdLength + 1]; + int n; + + if (encodedidstring->getLength() != pdfIdLength / 2) + return gFalse; + + n = sprintf(pdfid, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + encodedid[0] & 0xff, encodedid[1] & 0xff, encodedid[2] & 0xff, encodedid[3] & 0xff, + encodedid[4] & 0xff, encodedid[5] & 0xff, encodedid[6] & 0xff, encodedid[7] & 0xff, + encodedid[8] & 0xff, encodedid[9] & 0xff, encodedid[10] & 0xff, encodedid[11] & 0xff, + encodedid[12] & 0xff, encodedid[13] & 0xff, encodedid[14] & 0xff, encodedid[15] & 0xff); + if (n != pdfIdLength) + return gFalse; + + id->Set(pdfid, pdfIdLength); + return gTrue; +} + +GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) { + Object obj; + xref->getTrailerDict()->dictLookup ("ID", &obj); + + if (obj.isArray() && obj.arrayGetLength() == 2) { + Object obj2; + + if (permanent_id) { + if (obj.arrayGet(0, &obj2)->isString()) { + if (!get_id (obj2.getString(), permanent_id)) { + obj2.free(); + return gFalse; + } + } else { + error(errSyntaxError, -1, "Invalid permanent ID"); + obj2.free(); + return gFalse; + } + obj2.free(); + } + + if (update_id) { + if (obj.arrayGet(1, &obj2)->isString()) { + if (!get_id (obj2.getString(), update_id)) { + obj2.free(); + return gFalse; + } + } else { + error(errSyntaxError, -1, "Invalid update ID"); + obj2.free(); + return gFalse; + } + obj2.free(); + } + + obj.free(); + + return gTrue; + } + obj.free(); + + return gFalse; +} + +Hints *PDFDoc::getHints() +{ + if (!hints && isLinearized()) { + hints = new Hints(str, getLinearization(), getXRef(), secHdlr); + } + + return hints; +} + +int PDFDoc::savePageAs(GooString *name, int pageNo) +{ + FILE *f; + OutStream *outStr; + XRef *yRef, *countRef; + int rootNum = getXRef()->getNumObjects() + 1; + + if (pageNo < 1 || pageNo > getNumPages()) { + error(errInternal, -1, "Illegal pageNo: {0:d}({1:d})", pageNo, getNumPages() ); + return errOpenFile; + } + PDFRectangle *cropBox = NULL; + if (getCatalog()->getPage(pageNo)->isCropped()) { + cropBox = getCatalog()->getPage(pageNo)->getCropBox(); + } + replacePageDict(pageNo, + getCatalog()->getPage(pageNo)->getRotate(), + getCatalog()->getPage(pageNo)->getMediaBox(), + cropBox, NULL); + Ref *refPage = getCatalog()->getPageRef(pageNo); + Object page; + getXRef()->fetch(refPage->num, refPage->gen, &page); + + if (!(f = fopen(name->getCString(), "wb"))) { + error(errIO, -1, "Couldn't open file '{0:t}'", name); + return errOpenFile; + } + outStr = new FileOutStream(f,0); + + yRef = new XRef(getXRef()->getTrailerDict()); + countRef = new XRef(); + yRef->add(0, 65535, 0, gFalse); + writeHeader(outStr, getPDFMajorVersion(), getPDFMinorVersion()); + + // get and mark info dict + Object infoObj; + getXRef()->getDocInfo(&infoObj); + if (infoObj.isDict()) { + Dict *infoDict = infoObj.getDict(); + markPageObjects(infoDict, yRef, countRef, 0); + Object *trailerObj = getXRef()->getTrailerDict(); + if (trailerObj->isDict()) { + Dict *trailerDict = trailerObj->getDict(); + Object ref; + trailerDict->lookupNF("Info", &ref); + if (ref.isRef()) { + yRef->add(ref.getRef().num, ref.getRef().gen, 0, gTrue); + if (getXRef()->getEntry(ref.getRef().num)->type == xrefEntryCompressed) { + yRef->getEntry(ref.getRef().num)->type = xrefEntryCompressed; + } + } + ref.free(); + } + } + infoObj.free(); + + // get and mark output intents etc. + Object catObj, pagesObj, resourcesObj; + getXRef()->getCatalog(&catObj); + Dict *catDict = catObj.getDict(); + catDict->lookup("Pages", &pagesObj); + Dict *pagesDict = pagesObj.getDict(); + pagesDict->lookup("Resources", &resourcesObj); + if (resourcesObj.isDict()) + markPageObjects(resourcesObj.getDict(), yRef, countRef, 0); + markPageObjects(catDict, yRef, countRef, 0); + + Dict *pageDict = page.getDict(); + markPageObjects(pageDict, yRef, countRef, 0); + Guint objectsCount = writePageObjects(outStr, yRef, 0); + + yRef->add(rootNum,0,outStr->getPos(),gTrue); + outStr->printf("%d 0 obj\n", rootNum); + outStr->printf("<< /Type /Catalog /Pages %d 0 R", rootNum + 1); + for (int j = 0; j < catDict->getLength(); j++) { + const char *key = catDict->getKey(j); + if (strcmp(key, "Type") != 0 && + strcmp(key, "Catalog") != 0 && + strcmp(key, "Pages") != 0) + { + if (j > 0) outStr->printf(" "); + Object value; catDict->getValNF(j, &value); + outStr->printf("/%s ", key); + writeObject(&value, NULL, outStr, getXRef(), 0); + value.free(); + } + } + catObj.free(); + pagesObj.free(); + outStr->printf(">>\nendobj\n"); + objectsCount++; + + yRef->add(rootNum + 1,0,outStr->getPos(),gTrue); + outStr->printf("%d 0 obj\n", rootNum + 1); + outStr->printf("<< /Type /Pages /Kids [ %d 0 R ] /Count 1 ", rootNum + 2); + if (resourcesObj.isDict()) { + outStr->printf("/Resources "); + writeObject(&resourcesObj, NULL, outStr, getXRef(), 0); + resourcesObj.free(); + } + outStr->printf(">>\n"); + outStr->printf("endobj\n"); + objectsCount++; + + yRef->add(rootNum + 2,0,outStr->getPos(),gTrue); + outStr->printf("%d 0 obj\n", rootNum + 2); + outStr->printf("<< "); + for (int n = 0; n < pageDict->getLength(); n++) { + if (n > 0) outStr->printf(" "); + const char *key = pageDict->getKey(n); + Object value; pageDict->getValNF(n, &value); + if (strcmp(key, "Parent") == 0) { + outStr->printf("/Parent %d 0 R", rootNum + 1); + } else { + outStr->printf("/%s ", key); + writeObject(&value, NULL, outStr, getXRef(), 0); + } + value.free(); + } + outStr->printf(" >>\nendobj\n"); + objectsCount++; + page.free(); + + Guint uxrefOffset = outStr->getPos(); + Ref ref; + ref.num = rootNum; + ref.gen = 0; + Dict *trailerDict = createTrailerDict(objectsCount, gFalse, 0, &ref, getXRef(), + name->getCString(), uxrefOffset); + writeXRefTableTrailer(trailerDict, yRef, gFalse /* do not write unnecessary entries */, + uxrefOffset, outStr, getXRef()); + delete trailerDict; + + outStr->close(); + fclose(f); + delete yRef; + delete countRef; + + return errNone; +} + +int PDFDoc::saveAs(GooString *name, PDFWriteMode mode) { + FILE *f; + OutStream *outStr; + int res; + + if (!(f = fopen(name->getCString(), "wb"))) { + error(errIO, -1, "Couldn't open file '{0:t}'", name); + return errOpenFile; + } + outStr = new FileOutStream(f,0); + res = saveAs(outStr, mode); + delete outStr; + fclose(f); + return res; +} + +int PDFDoc::saveAs(OutStream *outStr, PDFWriteMode mode) { + + // find if we have updated objects + GBool updated = gFalse; + for(int i=0; igetNumObjects(); i++) { + if (xref->getEntry(i)->updated) { + updated = gTrue; + break; + } + } + + // we don't support rewriting files with Encrypt at the moment + Object obj; + xref->getTrailerDict()->getDict()->lookupNF("Encrypt", &obj); + if (!obj.isNull()) + { + obj.free(); + if (!updated && mode == writeStandard) { + // simply copy the original file + saveWithoutChangesAs (outStr); + } else { + return errEncrypted; + } + } + else + { + obj.free(); + + if (mode == writeForceRewrite) { + saveCompleteRewrite(outStr); + } else if (mode == writeForceIncremental) { + saveIncrementalUpdate(outStr); + } else { // let poppler decide + if(updated) { + saveIncrementalUpdate(outStr); + } else { + // simply copy the original file + saveWithoutChangesAs (outStr); + } + } + } + + return errNone; +} + +int PDFDoc::saveWithoutChangesAs(GooString *name) { + FILE *f; + OutStream *outStr; + int res; + + if (!(f = fopen(name->getCString(), "wb"))) { + error(errIO, -1, "Couldn't open file '{0:t}'", name); + return errOpenFile; + } + + outStr = new FileOutStream(f,0); + res = saveWithoutChangesAs(outStr); + delete outStr; + + fclose(f); + + return res; +} + +int PDFDoc::saveWithoutChangesAs(OutStream *outStr) { + int c; + + str->reset(); + while ((c = str->getChar()) != EOF) { + outStr->put(c); + } + str->close(); + + return errNone; +} + +void PDFDoc::saveIncrementalUpdate (OutStream* outStr) +{ + XRef *uxref; + int c; + //copy the original file + str->reset(); + while ((c = str->getChar()) != EOF) { + outStr->put(c); + } + str->close(); + + uxref = new XRef(); + uxref->add(0, 65535, 0, gFalse); + for(int i=0; igetNumObjects(); i++) { + if ((xref->getEntry(i)->type == xrefEntryFree) && + (xref->getEntry(i)->gen == 0)) //we skip the irrelevant free objects + continue; + + if (xref->getEntry(i)->updated) { //we have an updated object + Ref ref; + ref.num = i; + ref.gen = xref->getEntry(i)->type == xrefEntryCompressed ? 0 : xref->getEntry(i)->gen; + if (xref->getEntry(i)->type != xrefEntryFree) { + Object obj1; + xref->fetch(ref.num, ref.gen, &obj1); + Guint offset = writeObject(&obj1, &ref, outStr); + uxref->add(ref.num, ref.gen, offset, gTrue); + obj1.free(); + } else { + uxref->add(ref.num, ref.gen, 0, gFalse); + } + } + } + if (uxref->getNumObjects() == 0) { //we have nothing to update + delete uxref; + return; + } + + Guint uxrefOffset = outStr->getPos(); + int numobjects = xref->getNumObjects(); + const char *fileNameA = fileName ? fileName->getCString() : NULL; + Ref rootRef, uxrefStreamRef; + rootRef.num = getXRef()->getRootNum(); + rootRef.gen = getXRef()->getRootGen(); + + // Output a xref stream if there is a xref stream already + GBool xRefStream = xref->isXRefStream(); + + if (xRefStream) { + // Append an entry for the xref stream itself + uxrefStreamRef.num = numobjects++; + uxrefStreamRef.gen = 0; + uxref->add(uxrefStreamRef.num, uxrefStreamRef.gen, uxrefOffset, gTrue); + } + + Dict *trailerDict = createTrailerDict(numobjects, gTrue, getStartXRef(), &rootRef, getXRef(), fileNameA, uxrefOffset); + if (xRefStream) { + writeXRefStreamTrailer(trailerDict, uxref, &uxrefStreamRef, uxrefOffset, outStr, getXRef()); + } else { + writeXRefTableTrailer(trailerDict, uxref, gFalse, uxrefOffset, outStr, getXRef()); + } + + delete trailerDict; + delete uxref; +} + +void PDFDoc::saveCompleteRewrite (OutStream* outStr) +{ + outStr->printf("%%PDF-%d.%d\r\n",pdfMajorVersion,pdfMinorVersion); + XRef *uxref = new XRef(); + uxref->add(0, 65535, 0, gFalse); + for(int i=0; igetNumObjects(); i++) { + Object obj1; + Ref ref; + XRefEntryType type = xref->getEntry(i)->type; + if (type == xrefEntryFree) { + ref.num = i; + ref.gen = xref->getEntry(i)->gen; + /* the XRef class adds a lot of irrelevant free entries, we only want the significant one + and we don't want the one with num=0 because it has already been added (gen = 65535)*/ + if (ref.gen > 0 && ref.num > 0) + uxref->add(ref.num, ref.gen, 0, gFalse); + } else if (type == xrefEntryUncompressed){ + ref.num = i; + ref.gen = xref->getEntry(i)->gen; + xref->fetch(ref.num, ref.gen, &obj1); + Guint offset = writeObject(&obj1, &ref, outStr); + uxref->add(ref.num, ref.gen, offset, gTrue); + obj1.free(); + } else if (type == xrefEntryCompressed) { + ref.num = i; + ref.gen = 0; //compressed entries have gen == 0 + xref->fetch(ref.num, ref.gen, &obj1); + Guint offset = writeObject(&obj1, &ref, outStr); + uxref->add(ref.num, ref.gen, offset, gTrue); + obj1.free(); + } + } + Guint uxrefOffset = outStr->getPos(); + writeXRefTableTrailer(uxrefOffset, uxref, gTrue /* write all entries */, + uxref->getNumObjects(), outStr, gFalse /* complete rewrite */); + delete uxref; +} + +void PDFDoc::writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset) +{ + Object obj1; + outStr->printf("<<"); + for (int i=0; igetLength(); i++) { + GooString keyName(dict->getKey(i)); + GooString *keyNameToPrint = keyName.sanitizedName(gFalse /* non ps mode */); + outStr->printf("/%s ", keyNameToPrint->getCString()); + delete keyNameToPrint; + writeObject(dict->getValNF(i, &obj1), NULL, outStr, xRef, numOffset); + obj1.free(); + } + outStr->printf(">> "); +} + +void PDFDoc::writeStream (Stream* str, OutStream* outStr) +{ + outStr->printf("stream\r\n"); + str->reset(); + for (int c=str->getChar(); c!= EOF; c=str->getChar()) { + outStr->printf("%c", c); + } + outStr->printf("\r\nendstream\r\n"); +} + +void PDFDoc::writeRawStream (Stream* str, OutStream* outStr) +{ + Object obj1; + str->getDict()->lookup("Length", &obj1); + if (!obj1.isInt()) { + error (errSyntaxError, -1, "PDFDoc::writeRawStream, no Length in stream dict"); + return; + } + + const int length = obj1.getInt(); + obj1.free(); + + outStr->printf("stream\r\n"); + str->unfilteredReset(); + for (int i=0; igetUnfilteredChar(); + outStr->printf("%c", c); + } + str->reset(); + outStr->printf("\r\nendstream\r\n"); +} + +void PDFDoc::writeString (GooString* s, OutStream* outStr) +{ + if (s->hasUnicodeMarker()) { + //unicode string don't necessary end with \0 + const char* c = s->getCString(); + outStr->printf("("); + for(int i=0; igetLength(); i++) { + char unescaped = *(c+i)&0x000000ff; + //escape if needed + if (unescaped == '(' || unescaped == ')' || unescaped == '\\') + outStr->printf("%c", '\\'); + outStr->printf("%c", unescaped); + } + outStr->printf(") "); + } else { + const char* c = s->getCString(); + outStr->printf("("); + for(int i=0; igetLength(); i++) { + char unescaped = *(c+i)&0x000000ff; + //escape if needed + if (unescaped == '\r') + outStr->printf("\\r"); + else if (unescaped == '\n') + outStr->printf("\\n"); + else { + if (unescaped == '(' || unescaped == ')' || unescaped == '\\') { + outStr->printf("%c", '\\'); + } + outStr->printf("%c", unescaped); + } + } + outStr->printf(") "); + } +} + +Guint PDFDoc::writeObject (Object* obj, Ref* ref, OutStream* outStr, XRef *xRef, Guint numOffset) +{ + Array *array; + Object obj1; + Guint offset = outStr->getPos(); + int tmp; + + if(ref) + outStr->printf("%i %i obj ", ref->num, ref->gen); + + switch (obj->getType()) { + case objBool: + outStr->printf("%s ", obj->getBool()?"true":"false"); + break; + case objInt: + outStr->printf("%i ", obj->getInt()); + break; + case objReal: + { + GooString s; + s.appendf("{0:.10g}", obj->getReal()); + outStr->printf("%s ", s.getCString()); + break; + } + case objString: + writeString(obj->getString(), outStr); + break; + case objName: + { + GooString name(obj->getName()); + GooString *nameToPrint = name.sanitizedName(gFalse /* non ps mode */); + outStr->printf("/%s ", nameToPrint->getCString()); + delete nameToPrint; + break; + } + case objNull: + outStr->printf( "null "); + break; + case objArray: + array = obj->getArray(); + outStr->printf("["); + for (int i=0; igetLength(); i++) { + writeObject(array->getNF(i, &obj1), NULL,outStr, xRef, numOffset); + obj1.free(); + } + outStr->printf("] "); + break; + case objDict: + writeDictionnary (obj->getDict(),outStr, xRef, numOffset); + break; + case objStream: + { + //We can't modify stream with the current implementation (no write functions in Stream API) + // => the only type of streams which that have been modified are internal streams (=strWeird) + Stream *stream = obj->getStream(); + if (stream->getKind() == strWeird) { + //we write the stream unencoded => TODO: write stream encoder + stream->reset(); + //recalculate stream length + tmp = 0; + for (int c=stream->getChar(); c!=EOF; c=stream->getChar()) { + tmp++; + } + obj1.initInt(tmp); + stream->getDict()->set("Length", &obj1); + + //Remove Stream encoding + stream->getDict()->remove("Filter"); + stream->getDict()->remove("DecodeParms"); + + writeDictionnary (stream->getDict(),outStr, xRef, numOffset); + writeStream (stream,outStr); + obj1.free(); + } else { + //raw stream copy + FilterStream *fs = dynamic_cast(stream); + if (fs) { + BaseStream *bs = fs->getBaseStream(); + if (bs) { + Guint streamEnd; + if (xRef->getStreamEnd(bs->getStart(), &streamEnd)) { + Object val; + val.initInt(streamEnd - bs->getStart()); + stream->getDict()->set("Length", &val); + } + } + } + writeDictionnary (stream->getDict(), outStr, xRef, numOffset); + writeRawStream (stream, outStr); + } + break; + } + case objRef: + outStr->printf("%i %i R ", obj->getRef().num + numOffset, obj->getRef().gen); + break; + case objCmd: + outStr->printf("%s\n", obj->getCmd()); + break; + case objError: + outStr->printf("error\r\n"); + break; + case objEOF: + outStr->printf("eof\r\n"); + break; + case objNone: + outStr->printf("none\r\n"); + break; + default: + error(errUnimplemented, -1,"Unhandled objType : {0:d}, please report a bug with a testcase\r\n", obj->getType()); + break; + } + if (ref) + outStr->printf("endobj\r\n"); + return offset; +} + +Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Guint startxRef, + Ref *root, XRef *xRef, const char *fileName, Guint fileSize) +{ + Dict *trailerDict = new Dict(xRef); + Object obj1; + obj1.initInt(uxrefSize); + trailerDict->set("Size", &obj1); + obj1.free(); + + //build a new ID, as recommended in the reference, uses: + // - current time + // - file name + // - file size + // - values of entry in information dictionnary + GooString message; + char buffer[256]; + sprintf(buffer, "%i", (int)time(NULL)); + message.append(buffer); + + if (fileName) + message.append(fileName); + + sprintf(buffer, "%i", fileSize); + message.append(buffer); + + //info dict -- only use text string + if (!xRef->getTrailerDict()->isNone() && xRef->getDocInfo(&obj1)->isDict()) { + for(int i=0; igetLength(); i++) { + Object obj2; + obj1.getDict()->getVal(i, &obj2); + if (obj2.isString()) { + message.append(obj2.getString()); + } + obj2.free(); + } + } + obj1.free(); + + //calculate md5 digest + Guchar digest[16]; + md5((Guchar*)message.getCString(), message.getLength(), digest); + obj1.initString(new GooString((const char*)digest, 16)); + + //create ID array + Object obj2,obj3,obj5; + obj2.initArray(xRef); + + if (incrUpdate) { + Object obj4; + //only update the second part of the array + xRef->getTrailerDict()->getDict()->lookup("ID", &obj4); + if (!obj4.isArray()) { + error(errSyntaxWarning, -1, "PDFDoc::createTrailerDict original file's ID entry isn't an array. Trying to continue"); + } else { + //Get the first part of the ID + obj4.arrayGet(0,&obj3); + + obj2.arrayAdd(&obj3); + obj2.arrayAdd(&obj1); + trailerDict->set("ID", &obj2); + } + obj4.free(); + } else { + //new file => same values for the two identifiers + obj2.arrayAdd(&obj1); + obj1.initString(new GooString((const char*)digest, 16)); + obj2.arrayAdd(&obj1); + trailerDict->set("ID", &obj2); + } + + obj1.initRef(root->num, root->gen); + trailerDict->set("Root", &obj1); + + if (incrUpdate) { + obj1.initInt(startxRef); + trailerDict->set("Prev", &obj1); + } + + if (!xRef->getTrailerDict()->isNone()) { + xRef->getDocInfoNF(&obj5); + if (!obj5.isNull()) { + trailerDict->set("Info", &obj5); + } + } + + return trailerDict; +} + +void PDFDoc::writeXRefTableTrailer(Dict *trailerDict, XRef *uxref, GBool writeAllEntries, Guint uxrefOffset, OutStream* outStr, XRef *xRef) +{ + uxref->writeTableToFile( outStr, writeAllEntries ); + outStr->printf( "trailer\r\n"); + writeDictionnary(trailerDict, outStr, xRef, 0); + outStr->printf( "\r\nstartxref\r\n"); + outStr->printf( "%i\r\n", uxrefOffset); + outStr->printf( "%%%%EOF\r\n"); +} + +void PDFDoc::writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, Guint uxrefOffset, OutStream* outStr, XRef *xRef) +{ + GooString stmData; + + // Fill stmData and some trailerDict fields + uxref->writeStreamToBuffer(&stmData, trailerDict, xRef); + + // Create XRef stream object and write it + Object obj1; + MemStream *mStream = new MemStream( stmData.getCString(), 0, + stmData.getLength(), obj1.initDict(trailerDict) ); + writeObject(obj1.initStream(mStream), uxrefStreamRef, outStr, xRef, 0); + obj1.free(); + + outStr->printf( "startxref\r\n"); + outStr->printf( "%i\r\n", uxrefOffset); + outStr->printf( "%%%%EOF\r\n"); +} + +void PDFDoc::writeXRefTableTrailer(Guint uxrefOffset, XRef *uxref, GBool writeAllEntries, + int uxrefSize, OutStream* outStr, GBool incrUpdate) +{ + const char *fileNameA = fileName ? fileName->getCString() : NULL; + // file size (doesn't include the trailer) + unsigned int fileSize = 0; + int c; + str->reset(); + while ((c = str->getChar()) != EOF) { + fileSize++; + } + str->close(); + Ref ref; + ref.num = getXRef()->getRootNum(); + ref.gen = getXRef()->getRootGen(); + Dict * trailerDict = createTrailerDict(uxrefSize, incrUpdate, getStartXRef(), &ref, + getXRef(), fileNameA, fileSize); + writeXRefTableTrailer(trailerDict, uxref, writeAllEntries, uxrefOffset, outStr, getXRef()); + delete trailerDict; +} + +void PDFDoc::writeHeader(OutStream *outStr, int major, int minor) +{ + outStr->printf("%%PDF-%d.%d\n", major, minor); + outStr->printf("%%\xE2\xE3\xCF\xD3\n"); +} + +void PDFDoc::markDictionnary (Dict* dict, XRef * xRef, XRef *countRef, Guint numOffset) +{ + Object obj1; + for (int i=0; igetLength(); i++) { + markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset); + obj1.free(); + } +} + +void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset) +{ + Array *array; + Object obj1; + + switch (obj->getType()) { + case objArray: + array = obj->getArray(); + for (int i=0; igetLength(); i++) { + markObject(array->getNF(i, &obj1), xRef, countRef, numOffset); + obj1.free(); + } + break; + case objDict: + markDictionnary (obj->getDict(), xRef, countRef, numOffset); + break; + case objStream: + { + Stream *stream = obj->getStream(); + markDictionnary (stream->getDict(), xRef, countRef, numOffset); + } + break; + case objRef: + { + if (obj->getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(obj->getRef().num + numOffset)->type == xrefEntryFree) { + if (getXRef()->getEntry(obj->getRef().num)->type == xrefEntryFree) { + return; // already marked as free => should be replaced + } + xRef->add(obj->getRef().num + numOffset, obj->getRef().gen, 0, gTrue); + if (getXRef()->getEntry(obj->getRef().num)->type == xrefEntryCompressed) { + xRef->getEntry(obj->getRef().num + numOffset)->type = xrefEntryCompressed; + } + } + if (obj->getRef().num + (int) numOffset >= countRef->getNumObjects() || + countRef->getEntry(obj->getRef().num + numOffset)->type == xrefEntryFree) + { + countRef->add(obj->getRef().num + numOffset, 1, 0, gTrue); + } else { + XRefEntry *entry = countRef->getEntry(obj->getRef().num + numOffset); + entry->gen++; + if (entry->gen > 9) + break; + } + Object obj1; + getXRef()->fetch(obj->getRef().num, obj->getRef().gen, &obj1); + markObject(&obj1, xRef, countRef, numOffset); + obj1.free(); + } + break; + default: + break; + } +} + +void PDFDoc::replacePageDict(int pageNo, int rotate, + PDFRectangle *mediaBox, + PDFRectangle *cropBox, Object *pageCTM) +{ + Ref *refPage = getCatalog()->getPageRef(pageNo); + Object page; + getXRef()->fetch(refPage->num, refPage->gen, &page); + Dict *pageDict = page.getDict(); + pageDict->remove("MediaBox"); + pageDict->remove("CropBox"); + pageDict->remove("ArtBox"); + pageDict->remove("BleedBox"); + pageDict->remove("TrimBox"); + pageDict->remove("Rotate"); + Object *mediaBoxObj = new Object(); + mediaBoxObj->initArray(getXRef()); + Object *murx = new Object(); + murx->initReal(mediaBox->x1); + Object *mury = new Object(); + mury->initReal(mediaBox->y1); + Object *mllx = new Object(); + mllx->initReal(mediaBox->x2); + Object *mlly = new Object(); + mlly->initReal(mediaBox->y2); + mediaBoxObj->arrayAdd(murx); + mediaBoxObj->arrayAdd(mury); + mediaBoxObj->arrayAdd(mllx); + mediaBoxObj->arrayAdd(mlly); + pageDict->add(copyString("MediaBox"), mediaBoxObj); + if (cropBox != NULL) { + Object *cropBoxObj = new Object(); + cropBoxObj->initArray(getXRef()); + Object *curx = new Object(); + curx->initReal(cropBox->x1); + Object *cury = new Object(); + cury->initReal(cropBox->y1); + Object *cllx = new Object(); + cllx->initReal(cropBox->x2); + Object *clly = new Object(); + clly->initReal(cropBox->y2); + cropBoxObj->arrayAdd(curx); + cropBoxObj->arrayAdd(cury); + cropBoxObj->arrayAdd(cllx); + cropBoxObj->arrayAdd(clly); + pageDict->add(copyString("CropBox"), cropBoxObj); + pageDict->add(copyString("TrimBox"), cropBoxObj); + } else { + pageDict->add(copyString("TrimBox"), mediaBoxObj); + } + Object *rotateObj = new Object(); + rotateObj->initInt(rotate); + pageDict->add(copyString("Rotate"), rotateObj); + if (pageCTM != NULL) { + Object *contents = new Object(); + Ref cmRef = getXRef()->addIndirectObject(pageCTM); + Object *ref = new Object(); + ref->initRef(cmRef.num, cmRef.gen); + pageDict->lookupNF("Contents", contents); + Object *newContents = new Object(); + newContents->initArray(getXRef()); + if (contents->getType() == objRef) { + newContents->arrayAdd(ref); + newContents->arrayAdd(contents); + } else { + newContents->arrayAdd(ref); + for (int i = 0; i < contents->arrayGetLength(); i++) { + Object *contentEle = new Object(); + contents->arrayGetNF(i, contentEle); + newContents->arrayAdd(contentEle); + } + } + pageDict->remove("Contents"); + pageDict->add(copyString("Contents"), newContents); + } + getXRef()->setModifiedObject(&page, *refPage); + page.free(); +} + +void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset) +{ + pageDict->remove("Names"); + pageDict->remove("OpenAction"); + pageDict->remove("Outlines"); + pageDict->remove("StructTreeRoot"); + + for (int n = 0; n < pageDict->getLength(); n++) { + const char *key = pageDict->getKey(n); + Object value; pageDict->getValNF(n, &value); + if (strcmp(key, "Parent") != 0 && + strcmp(key, "Pages") != 0) { + markObject(&value, xRef, countRef, numOffset); + } + value.free(); + } +} + +Guint PDFDoc::writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset) +{ + Guint objectsCount = 0; //count the number of objects in the XRef(s) + + for (int n = numOffset; n < xRef->getNumObjects(); n++) { + if (xRef->getEntry(n)->type != xrefEntryFree) { + Object obj; + Ref ref; + ref.num = n; + ref.gen = xRef->getEntry(n)->gen; + objectsCount++; + getXRef()->fetch(ref.num - numOffset, ref.gen, &obj); + Guint offset = writeObject(&obj, &ref, outStr, xRef, numOffset); + xRef->add(ref.num, ref.gen, offset, gTrue); + obj.free(); + } + } + return objectsCount; +} + +#ifndef DISABLE_OUTLINE +Outline *PDFDoc::getOutline() +{ + if (!outline) { + // read outline + outline = new Outline(catalog->getOutline(), xref); + } + + return outline; +} +#endif + +PDFDoc *PDFDoc::ErrorPDFDoc(int errorCode, GooString *fileNameA) +{ + PDFDoc *doc = new PDFDoc(); + doc->errCode = errorCode; + doc->fileName = fileNameA; + + return doc; +} + +Guint PDFDoc::strToUnsigned(char *s) { + Guint x, d; + char *p; + + x = 0; + for (p = s; *p && isdigit(*p & 0xff); ++p) { + d = *p - '0'; + if (x > (UINT_MAX - d) / 10) { + break; + } + x = 10 * x + d; + } + return x; +} + +// Read the 'startxref' position. +Guint PDFDoc::getStartXRef() +{ + if (startXRefPos == ~(Guint)0) { + + if (isLinearized()) { + char buf[linearizationSearchSize+1]; + int c, n, i; + + str->setPos(0); + for (n = 0; n < linearizationSearchSize; ++n) { + if ((c = str->getChar()) == EOF) { + break; + } + buf[n] = c; + } + buf[n] = '\0'; + + // find end of first obj (linearization dictionary) + startXRefPos = 0; + for (i = 0; i < n; i++) { + if (!strncmp("endobj", &buf[i], 6)) { + i += 6; + //skip whitespace + while (buf[i] && Lexer::isSpace(buf[i])) ++i; + startXRefPos = i; + break; + } + } + } else { + char buf[xrefSearchSize+1]; + char *p; + int c, n, i; + + // read last xrefSearchSize bytes + str->setPos(xrefSearchSize, -1); + for (n = 0; n < xrefSearchSize; ++n) { + if ((c = str->getChar()) == EOF) { + break; + } + buf[n] = c; + } + buf[n] = '\0'; + + // find startxref + for (i = n - 9; i >= 0; --i) { + if (!strncmp(&buf[i], "startxref", 9)) { + break; + } + } + if (i < 0) { + startXRefPos = 0; + } else { + for (p = &buf[i+9]; isspace(*p); ++p) ; + startXRefPos = strToUnsigned(p); + } + } + + } + + return startXRefPos; +} + +Guint PDFDoc::getMainXRefEntriesOffset() +{ + Guint mainXRefEntriesOffset = 0; + + if (isLinearized()) { + mainXRefEntriesOffset = getLinearization()->getMainXRefEntriesOffset(); + } + + return mainXRefEntriesOffset; +} + +int PDFDoc::getNumPages() +{ + if (isLinearized()) { + int n; + if ((n = getLinearization()->getNumPages())) { + return n; + } + } + + return catalog->getNumPages(); +} + +Page *PDFDoc::parsePage(int page) +{ + Page *p = NULL; + Object obj; + Ref pageRef; + Dict *pageDict; + + pageRef.num = getHints()->getPageObjectNum(page); + if (!pageRef.num) { + error(errSyntaxWarning, -1, "Failed to get object num from hint tables for page {0:d}", page); + return NULL; + } + + // check for bogus ref - this can happen in corrupted PDF files + if (pageRef.num < 0 || pageRef.num >= xref->getNumObjects()) { + error(errSyntaxWarning, -1, "Invalid object num ({0:d}) for page {1:d}", pageRef.num, page); + return NULL; + } + + pageRef.gen = xref->getEntry(pageRef.num)->gen; + xref->fetch(pageRef.num, pageRef.gen, &obj); + if (!obj.isDict("Page")) { + obj.free(); + error(errSyntaxWarning, -1, "Object ({0:d} {1:d}) is not a pageDict", pageRef.num, pageRef.gen); + return NULL; + } + pageDict = obj.getDict(); + + p = new Page(this, page, pageDict, pageRef, + new PageAttrs(NULL, pageDict), catalog->getForm()); + obj.free(); + + return p; +} + +Page *PDFDoc::getPage(int page) +{ + if ((page < 1) || page > getNumPages()) return NULL; + + if (isLinearized()) { + if (!pageCache) { + pageCache = (Page **) gmallocn(getNumPages(), sizeof(Page *)); + for (int i = 0; i < getNumPages(); i++) { + pageCache[i] = NULL; + } + } + if (!pageCache[page-1]) { + pageCache[page-1] = parsePage(page); + } + if (pageCache[page-1]) { + return pageCache[page-1]; + } else { + error(errSyntaxWarning, -1, "Failed parsing page {0:d} using hint tables", page); + } + } + + return catalog->getPage(page); +} diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h new file mode 100644 index 0000000..468f698 --- /dev/null +++ b/poppler/PDFDoc.h @@ -0,0 +1,322 @@ +//======================================================================== +// +// PDFDoc.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2006, 2008 Brad Hards +// Copyright (C) 2005, 2009 Albert Astals Cid +// Copyright (C) 2008 Julien Rebetez +// Copyright (C) 2008 Pino Toscano +// Copyright (C) 2008 Carlos Garcia Campos +// Copyright (C) 2009 Eric Toombs +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Srinivas Adicherla +// Copyright (C) 2011 Thomas Freitag +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PDFDOC_H +#define PDFDOC_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "Annot.h" +#include "OptionalContent.h" + +class GooString; +class BaseStream; +class OutputDev; +class Links; +class LinkAction; +class LinkDest; +class Outline; +class Linearization; +class SecurityHandler; +class Hints; + +enum PDFWriteMode { + writeStandard, + writeForceRewrite, + writeForceIncremental +}; + +//------------------------------------------------------------------------ +// PDFDoc +//------------------------------------------------------------------------ + +class PDFDoc { +public: + + PDFDoc(GooString *fileNameA, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); + +#ifdef _WIN32 + PDFDoc(wchar_t *fileNameA, int fileNameLen, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); +#endif + + PDFDoc(BaseStream *strA, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); + ~PDFDoc(); + + static PDFDoc *ErrorPDFDoc(int errorCode, GooString *fileNameA = NULL); + + // Was PDF document successfully opened? + GBool isOk() { return ok; } + + // Get the error code (if isOk() returns false). + int getErrorCode() { return errCode; } + + // Get the error code returned by fopen() (if getErrorCode() == + // errOpenFile). + int getFopenErrno() { return fopenErrno; } + + // Get file name. + GooString *getFileName() { return fileName; } +#ifdef _WIN32 + wchar_t *getFileNameU() { return fileNameU; } +#endif + + // Get the linearization table. + Linearization *getLinearization(); + + // Get the xref table. + XRef *getXRef() { return xref; } + + // Get catalog. + Catalog *getCatalog() { return catalog; } + + // Get optional content configuration + OCGs *getOptContentConfig() { return catalog->getOptContentConfig(); } + + // Get base stream. + BaseStream *getBaseStream() { return str; } + + // Get page parameters. + double getPageMediaWidth(int page) + { return getPage(page) ? getPage(page)->getMediaWidth() : 0.0 ; } + double getPageMediaHeight(int page) + { return getPage(page) ? getPage(page)->getMediaHeight() : 0.0 ; } + double getPageCropWidth(int page) + { return getPage(page) ? getPage(page)->getCropWidth() : 0.0 ; } + double getPageCropHeight(int page) + { return getPage(page) ? getPage(page)->getCropHeight() : 0.0 ; } + int getPageRotate(int page) + { return getPage(page) ? getPage(page)->getRotate() : 0 ; } + + // Get number of pages. + int getNumPages(); + + // Return the contents of the metadata stream, or NULL if there is + // no metadata. + GooString *readMetadata() { return catalog->readMetadata(); } + + // Return the structure tree root object. + Object *getStructTreeRoot() { return catalog->getStructTreeRoot(); } + + // Get page. + Page *getPage(int page); + + // Display a page. + void displayPage(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL); + + // Display a range of pages. + void displayPages(OutputDev *out, int firstPage, int lastPage, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL); + + // Display part of a page. + void displayPageSlice(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL); + + // Find a page, given its object ID. Returns page number, or 0 if + // not found. + int findPage(int num, int gen) { return catalog->findPage(num, gen); } + + // Returns the links for the current page, transferring ownership to + // the caller. + Links *getLinks(int page); + + // Find a named destination. Returns the link destination, or + // NULL if is not a destination. + LinkDest *findDest(GooString *name) + { return catalog->findDest(name); } + + // Process the links for a page. + void processLinks(OutputDev *out, int page); + + +#ifndef DISABLE_OUTLINE + // Return the outline object. + Outline *getOutline(); +#endif + + // Is the file encrypted? + GBool isEncrypted() { return xref->isEncrypted(); } + + // Check various permissions. + GBool okToPrint(GBool ignoreOwnerPW = gFalse) + { return xref->okToPrint(ignoreOwnerPW); } + GBool okToPrintHighRes(GBool ignoreOwnerPW = gFalse) + { return xref->okToPrintHighRes(ignoreOwnerPW); } + GBool okToChange(GBool ignoreOwnerPW = gFalse) + { return xref->okToChange(ignoreOwnerPW); } + GBool okToCopy(GBool ignoreOwnerPW = gFalse) + { return xref->okToCopy(ignoreOwnerPW); } + GBool okToAddNotes(GBool ignoreOwnerPW = gFalse) + { return xref->okToAddNotes(ignoreOwnerPW); } + GBool okToFillForm(GBool ignoreOwnerPW = gFalse) + { return xref->okToFillForm(ignoreOwnerPW); } + GBool okToAccessibility(GBool ignoreOwnerPW = gFalse) + { return xref->okToAccessibility(ignoreOwnerPW); } + GBool okToAssemble(GBool ignoreOwnerPW = gFalse) + { return xref->okToAssemble(ignoreOwnerPW); } + + + // Is this document linearized? + GBool isLinearized(); + + // Return the document's Info dictionary (if any). + Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); } + Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); } + + // Return the PDF version specified by the file. + int getPDFMajorVersion() { return pdfMajorVersion; } + int getPDFMinorVersion() { return pdfMinorVersion; } + + //Return the PDF ID in the trailer dictionary (if any). + GBool getID(GooString *permanent_id, GooString *update_id); + + // Save one page with another name. + int savePageAs(GooString *name, int pageNo); + // Save this file with another name. + int saveAs(GooString *name, PDFWriteMode mode=writeStandard); + // Save this file in the given output stream. + int saveAs(OutStream *outStr, PDFWriteMode mode=writeStandard); + // Save this file with another name without saving changes + int saveWithoutChangesAs(GooString *name); + // Save this file in the given output stream without saving changes + int saveWithoutChangesAs(OutStream *outStr); + + // Return a pointer to the GUI (XPDFCore or WinPDFCore object). + void *getGUIData() { return guiData; } + + // rewrite pageDict with MediaBox, CropBox and new page CTM + void replacePageDict(int pageNo, int rotate, PDFRectangle *mediaBox, PDFRectangle *cropBox, Object *pageCTM); + void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset); + // write all objects used by pageDict to outStr + Guint writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset); + static Guint writeObject (Object *obj, Ref *ref, OutStream* outStr, XRef *xref, Guint numOffset); + static void writeHeader(OutStream *outStr, int major, int minor); + + // Ownership goes to the caller + static Dict *createTrailerDict (int uxrefSize, GBool incrUpdate, Guint startxRef, + Ref *root, XRef *xRef, const char *fileName, Guint fileSize); + static void writeXRefTableTrailer (Dict *trailerDict, XRef *uxref, GBool writeAllEntries, + Guint uxrefOffset, OutStream* outStr, XRef *xRef); + static void writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, + Guint uxrefOffset, OutStream* outStr, XRef *xRef); + +private: + // insert referenced objects in XRef + void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, Guint numOffset); + void markObject (Object *obj, XRef *xRef, XRef *countRef, Guint numOffset); + static void writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset); + + // Add object to current file stream and return the offset of the beginning of the object + Guint writeObject (Object *obj, Ref *ref, OutStream* outStr) + { return writeObject(obj, ref, outStr, getXRef(), 0); } + void writeDictionnary (Dict* dict, OutStream* outStr) + { writeDictionnary(dict, outStr, getXRef(), 0); } + static void writeStream (Stream* str, OutStream* outStr); + static void writeRawStream (Stream* str, OutStream* outStr); + void writeXRefTableTrailer (Guint uxrefOffset, XRef *uxref, GBool writeAllEntries, + int uxrefSize, OutStream* outStr, GBool incrUpdate); + static void writeString (GooString* s, OutStream* outStr); + void saveIncrementalUpdate (OutStream* outStr); + void saveCompleteRewrite (OutStream* outStr); + + Page *parsePage(int page); + + // Get hints. + Hints *getHints(); + + PDFDoc(); + void init(); + GBool setup(GooString *ownerPassword, GooString *userPassword); + GBool checkFooter(); + void checkHeader(); + GBool checkEncryption(GooString *ownerPassword, GooString *userPassword); + // Get the offset of the start xref table. + Guint getStartXRef(); + // Get the offset of the entries in the main XRef table of a + // linearized document (0 for non linearized documents). + Guint getMainXRefEntriesOffset(); + Guint strToUnsigned(char *s); + + GooString *fileName; +#ifdef _WIN32 + wchar_t *fileNameU; +#endif + FILE *file; + BaseStream *str; + void *guiData; + int pdfMajorVersion; + int pdfMinorVersion; + Linearization *linearization; + XRef *xref; + SecurityHandler *secHdlr; + Catalog *catalog; + Hints *hints; +#ifndef DISABLE_OUTLINE + Outline *outline; +#endif + Page **pageCache; + + GBool ok; + int errCode; + //If there is an error opening the PDF file with fopen() in the constructor, + //then the POSIX errno will be here. + int fopenErrno; + + Guint startXRefPos; // offset of last xref table +}; + +#endif diff --git a/poppler/PDFDocBuilder.h b/poppler/PDFDocBuilder.h new file mode 100644 index 0000000..d6eccf5 --- /dev/null +++ b/poppler/PDFDocBuilder.h @@ -0,0 +1,42 @@ +//======================================================================== +// +// PDFDocBuilder.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef PDFDOCBUILDER_H +#define PDFDOCBUILDER_H + +#include "PDFDoc.h" +class GooString; + +//------------------------------------------------------------------------ +// PDFDocBuilder +// +// PDFDocBuilder is an abstract class that specifies the interface for +// constructing PDFDocs. +//------------------------------------------------------------------------ + +class PDFDocBuilder { + +public: + + virtual ~PDFDocBuilder() {}; + + // Builds a new PDFDoc. Returns a PDFDoc. You should check this PDFDoc + // with PDFDoc::isOk() for failures. + // The caller is responsible for deleting ownerPassword, userPassWord and guiData. + virtual PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL) = 0; + + // Returns gTrue if the builder supports building a PDFDoc from the URI. + virtual GBool supports(const GooString &uri) = 0; + +}; + +#endif /* PDFDOCBUILDER_H */ diff --git a/poppler/PDFDocEncoding.cc b/poppler/PDFDocEncoding.cc new file mode 100644 index 0000000..7940834 --- /dev/null +++ b/poppler/PDFDocEncoding.cc @@ -0,0 +1,69 @@ +//======================================================================== +// +// PDFDocEncoding.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Michael Vrable +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "PDFDocEncoding.h" + +// Mapping of PDFDocEncoding (used to represent text values such as document +// metadata or annotation text) to Unicode codepoints. Not all 8-bit values in +// PDFDocEncoding are defined; undefined bytes are mapped to U+FFFD (Unicode +// replacement character). +// +// PDFDocEncoding is only directly defined for printable characters, but some +// control characters such as carriage return will still be used. We define +// mappings of the standard whitespace control characters (tabs, newlines) to +// the corresponding Unicode values. Other control characters are left +// undefined. + +Unicode pdfDocEncoding[256] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, // 00 + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, // 10 + 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, // 20 + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 30 + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 40 + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 50 + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 60 + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // 70 + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0xfffd, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, // 80 + 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, // 90 + 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0xfffd, + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0 + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0xfffd, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0 + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0 + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0 + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0 + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0 + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}; diff --git a/poppler/PDFDocEncoding.h b/poppler/PDFDocEncoding.h new file mode 100644 index 0000000..4f0840b --- /dev/null +++ b/poppler/PDFDocEncoding.h @@ -0,0 +1,34 @@ +//======================================================================== +// +// PDFDocEncoding.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PDFDOCENCODING_H +#define PDFDOCENCODING_H + +#include "CharTypes.h" + +class GooString; + +extern Unicode pdfDocEncoding[256]; + +char* pdfDocEncodingToUTF16 (GooString* orig, int* length); + +#endif diff --git a/poppler/PDFDocFactory.cc b/poppler/PDFDocFactory.cc new file mode 100644 index 0000000..1ec4647 --- /dev/null +++ b/poppler/PDFDocFactory.cc @@ -0,0 +1,72 @@ +//======================================================================== +// +// PDFDocFactory.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#include + +#include "PDFDocFactory.h" + +#include "goo/GooList.h" +#include "goo/GooString.h" +#include "PDFDoc.h" +#include "LocalPDFDocBuilder.h" +#include "StdinPDFDocBuilder.h" +#if ENABLE_LIBCURL +#include "CurlPDFDocBuilder.h" +#endif +#include "ErrorCodes.h" + +//------------------------------------------------------------------------ +// PDFDocFactory +//------------------------------------------------------------------------ + +PDFDocFactory::PDFDocFactory(GooList *pdfDocBuilders) +{ + if (pdfDocBuilders) { + builders = pdfDocBuilders; + } else { + builders = new GooList(); + } +#if ENABLE_LIBCURL + builders->insert(0, new CurlPDFDocBuilder()); +#endif + builders->insert(0, new StdinPDFDocBuilder()); + builders->insert(0, new LocalPDFDocBuilder()); +} + +PDFDocFactory::~PDFDocFactory() +{ + if (builders) { + deleteGooList(builders, PDFDocBuilder); + } +} + +PDFDoc * +PDFDocFactory::createPDFDoc(const GooString &uri, GooString *ownerPassword, + GooString *userPassword, void *guiDataA) +{ + for (int i = builders->getLength() - 1; i >= 0 ; i--) { + PDFDocBuilder *builder = (PDFDocBuilder *) builders->get(i); + if (builder->supports(uri)) { + return builder->buildPDFDoc(uri, ownerPassword, userPassword, guiDataA); + } + } + + error(errInternal, -1, "Cannot handle URI '{0:t}'.", &uri); + GooString *fileName = uri.copy(); + return PDFDoc::ErrorPDFDoc(errOpenFile, fileName); +} + +void PDFDocFactory::registerPDFDocBuilder(PDFDocBuilder *pdfDocBuilder) +{ + builders->append(pdfDocBuilder); +} + + diff --git a/poppler/PDFDocFactory.h b/poppler/PDFDocFactory.h new file mode 100644 index 0000000..dbceaa5 --- /dev/null +++ b/poppler/PDFDocFactory.h @@ -0,0 +1,55 @@ +//======================================================================== +// +// PDFDocFactory.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef PDFDOCFACTORY_H +#define PDFDOCFACTORY_H + +#include "PDFDoc.h" + +class GooList; +class GooString; +class PDFDocBuilder; + +//------------------------------------------------------------------------ +// PDFDocFactory +// +// PDFDocFactory allows the construction of PDFDocs from different URIs. +// +// By default, it supports local files, 'file://' and 'fd:0' (stdin). When +// compiled with libcurl, it also supports 'http://' and 'https://'. +// +// You can extend the supported URIs by giving a list of PDFDocBuilders to +// the constructor, or by registering a new PDFDocBuilder afterwards. +//------------------------------------------------------------------------ + +class PDFDocFactory { + +public: + + PDFDocFactory(GooList *pdfDocBuilders = NULL); + ~PDFDocFactory(); + + // Create a PDFDoc. Returns a PDFDoc. You should check this PDFDoc + // with PDFDoc::isOk() for failures. + // The caller is responsible for deleting ownerPassword, userPassWord and guiData. + PDFDoc *createPDFDoc(const GooString &uri, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); + + // Extend supported URIs with the ones from the PDFDocBuilder. + void registerPDFDocBuilder(PDFDocBuilder *pdfDocBuilder); + +private: + + GooList *builders; + +}; + +#endif /* PDFDOCFACTORY_H */ diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc new file mode 100644 index 0000000..f414897 --- /dev/null +++ b/poppler/PSOutputDev.cc @@ -0,0 +1,7391 @@ +//======================================================================== +// +// PSOutputDev.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Martin Kretzschmar +// Copyright (C) 2005, 2006 Kristian Høgsberg +// Copyright (C) 2006-2009, 2011 Albert Astals Cid +// Copyright (C) 2006 Jeff Muizelaar +// Copyright (C) 2007, 2008 Brad Hards +// Copyright (C) 2008, 2009 Koji Otani +// Copyright (C) 2008, 2010 Hib Eris +// Copyright (C) 2009-2012 Thomas Freitag +// Copyright (C) 2009 Till Kamppeter +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009, 2011, 2012 William Bader +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2009-2011 Adrian Johnson +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "goo/GooHash.h" +#include "poppler-config.h" +#include "GlobalParams.h" +#include "Object.h" +#include "Error.h" +#include "Function.h" +#include "Gfx.h" +#include "GfxState.h" +#include "GfxFont.h" +#include "UnicodeMap.h" +#include +#include +#include "Catalog.h" +#include "Page.h" +#include "Stream.h" +#include "Annot.h" +#include "XRef.h" +#include "PreScanOutputDev.h" +#include "FileSpec.h" +#include "CharCodeToUnicode.h" +#if HAVE_SPLASH +# include "splash/Splash.h" +# include "splash/SplashBitmap.h" +# include "SplashOutputDev.h" +#endif +#include "PSOutputDev.h" +#include "PDFDoc.h" + +#ifdef MACOS +// needed for setting type/creator of MacOS files +#include "ICSupport.h" +#endif + +// the MSVC math.h doesn't define this +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +//------------------------------------------------------------------------ + +// Max size of a slice when rasterizing pages, in pixels. +#define rasterizationSliceSize 20000000 + +//------------------------------------------------------------------------ +// PostScript prolog and setup +//------------------------------------------------------------------------ + +// The '~' escapes mark prolog code that is emitted only in certain +// levels: +// +// ~[123][sn] +// ^ ^----- s=psLevel*Sep, n=psLevel* +// +----- 1=psLevel1*, 2=psLevel2*, 3=psLevel3* + +static const char *prolog[] = { + "/xpdf 75 dict def xpdf begin", + "% PDF special state", + "/pdfDictSize 15 def", + "~1sn", + "/pdfStates 64 array def", + " 0 1 63 {", + " pdfStates exch pdfDictSize dict", + " dup /pdfStateIdx 3 index put", + " put", + " } for", + "~123sn", + "/pdfSetup {", + " /setpagedevice where {", + " pop 2 dict begin", + " /Policies 1 dict dup begin /PageSize 6 def end def", + " { /Duplex true def } if", + " currentdict end setpagedevice", + " } {", + " pop", + " } ifelse", + "} def", + "/pdfSetupPaper {", + " 2 array astore", + " /setpagedevice where {", + " pop 2 dict begin", + " /PageSize exch def", + " /ImagingBBox null def", + " currentdict end setpagedevice", + " } {", + " pop", + " } ifelse", + "} def", + "~1sn", + "/pdfOpNames [", + " /pdfFill /pdfStroke /pdfLastFill /pdfLastStroke", + " /pdfTextMat /pdfFontSize /pdfCharSpacing /pdfTextRender /pdfPatternCS", + " /pdfTextRise /pdfWordSpacing /pdfHorizScaling /pdfTextClipPath", + "] def", + "~123sn", + "/pdfStartPage {", + "~1sn", + " pdfStates 0 get begin", + "~23sn", + " pdfDictSize dict begin", + "~23n", + " /pdfFillCS [] def", + " /pdfFillXform {} def", + " /pdfStrokeCS [] def", + " /pdfStrokeXform {} def", + "~1n", + " /pdfFill 0 def", + " /pdfStroke 0 def", + "~1s", + " /pdfFill [0 0 0 1] def", + " /pdfStroke [0 0 0 1] def", + "~23sn", + " /pdfFill [0] def", + " /pdfStroke [0] def", + " /pdfFillOP false def", + " /pdfStrokeOP false def", + "~3sn", + " /pdfOPM false def", + "~123sn", + " /pdfLastFill false def", + " /pdfLastStroke false def", + " /pdfTextMat [1 0 0 1 0 0] def", + " /pdfFontSize 0 def", + " /pdfCharSpacing 0 def", + " /pdfTextRender 0 def", + " /pdfPatternCS false def", + " /pdfTextRise 0 def", + " /pdfWordSpacing 0 def", + " /pdfHorizScaling 1 def", + " /pdfTextClipPath [] def", + "} def", + "/pdfEndPage { end } def", + "~23s", + "% separation convention operators", + "/findcmykcustomcolor where {", + " pop", + "}{", + " /findcmykcustomcolor { 5 array astore } def", + "} ifelse", + "/setcustomcolor where {", + " pop", + "}{", + " /setcustomcolor {", + " exch", + " [ exch /Separation exch dup 4 get exch /DeviceCMYK exch", + " 0 4 getinterval cvx", + " [ exch /dup load exch { mul exch dup } /forall load", + " /pop load dup ] cvx", + " ] setcolorspace setcolor", + " } def", + "} ifelse", + "/customcolorimage where {", + " pop", + "}{", + " /customcolorimage {", + " gsave", + " [ exch /Separation exch dup 4 get exch /DeviceCMYK exch", + " 0 4 getinterval", + " [ exch /dup load exch { mul exch dup } /forall load", + " /pop load dup ] cvx", + " ] setcolorspace", + " 10 dict begin", + " /ImageType 1 def", + " /DataSource exch def", + " /ImageMatrix exch def", + " /BitsPerComponent exch def", + " /Height exch def", + " /Width exch def", + " /Decode [1 0] def", + " currentdict end", + " image", + " grestore", + " } def", + "} ifelse", + "~123sn", + "% PDF color state", + "~1n", + "/g { dup /pdfFill exch def setgray", + " /pdfLastFill true def /pdfLastStroke false def } def", + "/G { dup /pdfStroke exch def setgray", + " /pdfLastStroke true def /pdfLastFill false def } def", + "/fCol {", + " pdfLastFill not {", + " pdfFill setgray", + " /pdfLastFill true def /pdfLastStroke false def", + " } if", + "} def", + "/sCol {", + " pdfLastStroke not {", + " pdfStroke setgray", + " /pdfLastStroke true def /pdfLastFill false def", + " } if", + "} def", + "~1s", + "/k { 4 copy 4 array astore /pdfFill exch def setcmykcolor", + " /pdfLastFill true def /pdfLastStroke false def } def", + "/K { 4 copy 4 array astore /pdfStroke exch def setcmykcolor", + " /pdfLastStroke true def /pdfLastFill false def } def", + "/fCol {", + " pdfLastFill not {", + " pdfFill aload pop setcmykcolor", + " /pdfLastFill true def /pdfLastStroke false def", + " } if", + "} def", + "/sCol {", + " pdfLastStroke not {", + " pdfStroke aload pop setcmykcolor", + " /pdfLastStroke true def /pdfLastFill false def", + " } if", + "} def", + "~3n", + "/opm { dup /pdfOPM exch def", + " /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def", + "~23n", + "/cs { /pdfFillXform exch def dup /pdfFillCS exch def", + " setcolorspace } def", + "/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def", + " setcolorspace } def", + "/sc { pdfLastFill not { pdfFillCS setcolorspace } if", + " dup /pdfFill exch def aload pop pdfFillXform setcolor", + " /pdfLastFill true def /pdfLastStroke false def } def", + "/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if", + " dup /pdfStroke exch def aload pop pdfStrokeXform setcolor", + " /pdfLastStroke true def /pdfLastFill false def } def", + "/op { /pdfFillOP exch def", + " pdfLastFill { pdfFillOP setoverprint } if } def", + "/OP { /pdfStrokeOP exch def", + " pdfLastStroke { pdfStrokeOP setoverprint } if } def", + "/fCol {", + " pdfLastFill not {", + " pdfFillCS setcolorspace", + " pdfFill aload pop pdfFillXform setcolor", + " pdfFillOP setoverprint", + " /pdfLastFill true def /pdfLastStroke false def", + " } if", + "} def", + "/sCol {", + " pdfLastStroke not {", + " pdfStrokeCS setcolorspace", + " pdfStroke aload pop pdfStrokeXform setcolor", + " pdfStrokeOP setoverprint", + " /pdfLastStroke true def /pdfLastFill false def", + " } if", + "} def", + "~3s", + "/opm { dup /pdfOPM exch def", + " /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def", + "~23s", + "/k { 4 copy 4 array astore /pdfFill exch def setcmykcolor", + " /pdfLastFill true def /pdfLastStroke false def } def", + "/K { 4 copy 4 array astore /pdfStroke exch def setcmykcolor", + " /pdfLastStroke true def /pdfLastFill false def } def", + "/ck { 6 copy 6 array astore /pdfFill exch def", + " findcmykcustomcolor exch setcustomcolor", + " /pdfLastFill true def /pdfLastStroke false def } def", + "/CK { 6 copy 6 array astore /pdfStroke exch def", + " findcmykcustomcolor exch setcustomcolor", + " /pdfLastStroke true def /pdfLastFill false def } def", + "/op { /pdfFillOP exch def", + " pdfLastFill { pdfFillOP setoverprint } if } def", + "/OP { /pdfStrokeOP exch def", + " pdfLastStroke { pdfStrokeOP setoverprint } if } def", + "/fCol {", + " pdfLastFill not {", + " pdfFill aload length 4 eq {", + " setcmykcolor", + " }{", + " findcmykcustomcolor exch setcustomcolor", + " } ifelse", + " pdfFillOP setoverprint", + " /pdfLastFill true def /pdfLastStroke false def", + " } if", + "} def", + "/sCol {", + " pdfLastStroke not {", + " pdfStroke aload length 4 eq {", + " setcmykcolor", + " }{", + " findcmykcustomcolor exch setcustomcolor", + " } ifelse", + " pdfStrokeOP setoverprint", + " /pdfLastStroke true def /pdfLastFill false def", + " } if", + "} def", + "~123sn", + "% build a font", + "/pdfMakeFont {", + " 4 3 roll findfont", + " 4 2 roll matrix scale makefont", + " dup length dict begin", + " { 1 index /FID ne { def } { pop pop } ifelse } forall", + " /Encoding exch def", + " currentdict", + " end", + " definefont pop", + "} def", + "/pdfMakeFont16 {", + " exch findfont", + " dup length dict begin", + " { 1 index /FID ne { def } { pop pop } ifelse } forall", + " /WMode exch def", + " currentdict", + " end", + " definefont pop", + "} def", + "~3sn", + "/pdfMakeFont16L3 {", + " 1 index /CIDFont resourcestatus {", + " pop pop 1 index /CIDFont findresource /CIDFontType known", + " } {", + " false", + " } ifelse", + " {", + " 0 eq { /Identity-H } { /Identity-V } ifelse", + " exch 1 array astore composefont pop", + " } {", + " pdfMakeFont16", + " } ifelse", + "} def", + "~123sn", + "% graphics state operators", + "~1sn", + "/q {", + " gsave", + " pdfOpNames length 1 sub -1 0 { pdfOpNames exch get load } for", + " pdfStates pdfStateIdx 1 add get begin", + " pdfOpNames { exch def } forall", + "} def", + "/Q { end grestore } def", + "~23sn", + "/q { gsave pdfDictSize dict begin } def", + "/Q {", + " end grestore", + " /pdfLastFill where {", + " pop", + " pdfLastFill {", + " pdfFillOP setoverprint", + " } {", + " pdfStrokeOP setoverprint", + " } ifelse", + " } if", + "~3sn", + " /pdfOPM where {", + " pop", + " pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse ", + " } if", + "~23sn", + "} def", + "~123sn", + "/cm { concat } def", + "/d { setdash } def", + "/i { setflat } def", + "/j { setlinejoin } def", + "/J { setlinecap } def", + "/M { setmiterlimit } def", + "/w { setlinewidth } def", + "% path segment operators", + "/m { moveto } def", + "/l { lineto } def", + "/c { curveto } def", + "/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto", + " neg 0 rlineto closepath } def", + "/h { closepath } def", + "% path painting operators", + "/S { sCol stroke } def", + "/Sf { fCol stroke } def", + "/f { fCol fill } def", + "/f* { fCol eofill } def", + "% clipping operators", + "/W { clip newpath } def", + "/W* { eoclip newpath } def", + "/Ws { strokepath clip newpath } def", + "% text state operators", + "/Tc { /pdfCharSpacing exch def } def", + "/Tf { dup /pdfFontSize exch def", + " dup pdfHorizScaling mul exch matrix scale", + " pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put", + " exch findfont exch makefont setfont } def", + "/Tr { /pdfTextRender exch def } def", + "/Tp { /pdfPatternCS exch def } def", + "/Ts { /pdfTextRise exch def } def", + "/Tw { /pdfWordSpacing exch def } def", + "/Tz { /pdfHorizScaling exch def } def", + "% text positioning operators", + "/Td { pdfTextMat transform moveto } def", + "/Tm { /pdfTextMat exch def } def", + "% text string operators", + "/xyshow where {", + " pop", + " /xyshow2 {", + " dup length array", + " 0 2 2 index length 1 sub {", + " 2 index 1 index 2 copy get 3 1 roll 1 add get", + " pdfTextMat dtransform", + " 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put", + " } for", + " exch pop", + " xyshow", + " } def", + "}{", + " /xyshow2 {", + " currentfont /FontType get 0 eq {", + " 0 2 3 index length 1 sub {", + " currentpoint 4 index 3 index 2 getinterval show moveto", + " 2 copy get 2 index 3 2 roll 1 add get", + " pdfTextMat dtransform rmoveto", + " } for", + " } {", + " 0 1 3 index length 1 sub {", + " currentpoint 4 index 3 index 1 getinterval show moveto", + " 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get", + " pdfTextMat dtransform rmoveto", + " } for", + " } ifelse", + " pop pop", + " } def", + "} ifelse", + "/cshow where {", + " pop", + " /xycp {", // xycharpath + " 0 3 2 roll", + " {", + " pop pop currentpoint 3 2 roll", + " 1 string dup 0 4 3 roll put false charpath moveto", + " 2 copy get 2 index 2 index 1 add get", + " pdfTextMat dtransform rmoveto", + " 2 add", + " } exch cshow", + " pop pop", + " } def", + "}{", + " /xycp {", // xycharpath + " currentfont /FontType get 0 eq {", + " 0 2 3 index length 1 sub {", + " currentpoint 4 index 3 index 2 getinterval false charpath moveto", + " 2 copy get 2 index 3 2 roll 1 add get", + " pdfTextMat dtransform rmoveto", + " } for", + " } {", + " 0 1 3 index length 1 sub {", + " currentpoint 4 index 3 index 1 getinterval false charpath moveto", + " 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get", + " pdfTextMat dtransform rmoveto", + " } for", + " } ifelse", + " pop pop", + " } def", + "} ifelse", + "/Tj {", + " fCol", // because stringwidth has to draw Type 3 chars + " 0 pdfTextRise pdfTextMat dtransform rmoveto", + " currentpoint 4 2 roll", + " pdfTextRender 1 and 0 eq {", + " 2 copy xyshow2", + " } if", + " pdfTextRender 3 and dup 1 eq exch 2 eq or {", + " 3 index 3 index moveto", + " 2 copy", + " currentfont /FontType get 3 eq { fCol } { sCol } ifelse", + " xycp currentpoint stroke moveto", + " } if", + " pdfTextRender 4 and 0 ne {", + " 4 2 roll moveto xycp", + " /pdfTextClipPath [ pdfTextClipPath aload pop", + " {/moveto cvx}", + " {/lineto cvx}", + " {/curveto cvx}", + " {/closepath cvx}", + " pathforall ] def", + " currentpoint newpath moveto", + " } {", + " pop pop pop pop", + " } ifelse", + " 0 pdfTextRise neg pdfTextMat dtransform rmoveto", + "} def", + "/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0", + " pdfTextMat dtransform rmoveto } def", + "/TJmV { 0.001 mul pdfFontSize mul neg 0 exch", + " pdfTextMat dtransform rmoveto } def", + "/Tclip { pdfTextClipPath cvx exec clip newpath", + " /pdfTextClipPath [] def } def", + "/Tclip* { pdfTextClipPath cvx exec eoclip newpath", + " /pdfTextClipPath [] def } def", + "~1ns", + "% Level 1 image operators", + "/pdfIm1 {", + " /pdfImBuf1 4 index string def", + " { currentfile pdfImBuf1 readhexstring pop } image", + "} def", + "/pdfIm1Bin {", + " /pdfImBuf1 4 index string def", + " { currentfile pdfImBuf1 readstring pop } image", + "} def", + "~1s", + "/pdfIm1Sep {", + " /pdfImBuf1 4 index string def", + " /pdfImBuf2 4 index string def", + " /pdfImBuf3 4 index string def", + " /pdfImBuf4 4 index string def", + " { currentfile pdfImBuf1 readhexstring pop }", + " { currentfile pdfImBuf2 readhexstring pop }", + " { currentfile pdfImBuf3 readhexstring pop }", + " { currentfile pdfImBuf4 readhexstring pop }", + " true 4 colorimage", + "} def", + "/pdfIm1SepBin {", + " /pdfImBuf1 4 index string def", + " /pdfImBuf2 4 index string def", + " /pdfImBuf3 4 index string def", + " /pdfImBuf4 4 index string def", + " { currentfile pdfImBuf1 readstring pop }", + " { currentfile pdfImBuf2 readstring pop }", + " { currentfile pdfImBuf3 readstring pop }", + " { currentfile pdfImBuf4 readstring pop }", + " true 4 colorimage", + "} def", + "~1ns", + "/pdfImM1 {", + " fCol /pdfImBuf1 4 index 7 add 8 idiv string def", + " { currentfile pdfImBuf1 readhexstring pop } imagemask", + "} def", + "/pdfImM1Bin {", + " fCol /pdfImBuf1 4 index 7 add 8 idiv string def", + " { currentfile pdfImBuf1 readstring pop } imagemask", + "} def", + "/pdfImStr {", + " 2 copy exch length lt {", + " 2 copy get exch 1 add exch", + " } {", + " ()", + " } ifelse", + "} def", + "/pdfImM1a {", + " { pdfImStr } imagemask", + " pop pop", + "} def", + "~23sn", + "% Level 2/3 image operators", + "/pdfImBuf 100 string def", + "/pdfImStr {", + " 2 copy exch length lt {", + " 2 copy get exch 1 add exch", + " } {", + " ()", + " } ifelse", + "} def", + "/skipEOD {", + " { currentfile pdfImBuf readline", + " not { pop exit } if", + " (%-EOD-) eq { exit } if } loop", + "} def", + "/pdfIm { image skipEOD } def", + "~3sn", + "/pdfMask {", + " /ReusableStreamDecode filter", + " skipEOD", + " /maskStream exch def", + "} def", + "/pdfMaskEnd { maskStream closefile } def", + "/pdfMaskInit {", + " /maskArray exch def", + " /maskIdx 0 def", + "} def", + "/pdfMaskSrc {", + " maskIdx maskArray length lt {", + " maskArray maskIdx get", + " /maskIdx maskIdx 1 add def", + " } {", + " ()", + " } ifelse", + "} def", + "~23s", + "/pdfImSep {", + " findcmykcustomcolor exch", + " dup /Width get /pdfImBuf1 exch string def", + " dup /Decode get aload pop 1 index sub /pdfImDecodeRange exch def", + " /pdfImDecodeLow exch def", + " begin Width Height BitsPerComponent ImageMatrix DataSource end", + " /pdfImData exch def", + " { pdfImData pdfImBuf1 readstring pop", + " 0 1 2 index length 1 sub {", + " 1 index exch 2 copy get", + " pdfImDecodeRange mul 255 div pdfImDecodeLow add round cvi", + " 255 exch sub put", + " } for }", + " 6 5 roll customcolorimage", + " skipEOD", + "} def", + "~23sn", + "/pdfImM { fCol imagemask skipEOD } def", + "~123sn", + "/pr { 2 index 2 index 3 2 roll putinterval 4 add } def", + "/pdfImClip {", + " gsave", + " 0 2 4 index length 1 sub {", + " dup 4 index exch 2 copy", + " get 5 index div put", + " 1 add 3 index exch 2 copy", + " get 3 index div put", + " } for", + " pop pop rectclip", + "} def", + "/pdfImClipEnd { grestore } def", + "~23sn", + "% shading operators", + "/colordelta {", + " false 0 1 3 index length 1 sub {", + " dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt {", + " pop true", + " } if", + " } for", + " exch pop exch pop", + "} def", + "/funcCol { func n array astore } def", + "/funcSH {", + " dup 0 eq {", + " true", + " } {", + " dup 6 eq {", + " false", + " } {", + " 4 index 4 index funcCol dup", + " 6 index 4 index funcCol dup", + " 3 1 roll colordelta 3 1 roll", + " 5 index 5 index funcCol dup", + " 3 1 roll colordelta 3 1 roll", + " 6 index 8 index funcCol dup", + " 3 1 roll colordelta 3 1 roll", + " colordelta or or or", + " } ifelse", + " } ifelse", + " {", + " 1 add", + " 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch", + " 6 index 6 index 4 index 4 index 4 index funcSH", + " 2 index 6 index 6 index 4 index 4 index funcSH", + " 6 index 2 index 4 index 6 index 4 index funcSH", + " 5 3 roll 3 2 roll funcSH pop pop", + " } {", + " pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul", + "~23n", + " funcCol sc", + "~23s", + " funcCol aload pop k", + "~23sn", + " dup 4 index exch mat transform m", + " 3 index 3 index mat transform l", + " 1 index 3 index mat transform l", + " mat transform l pop pop h f*", + " } ifelse", + "} def", + "/axialCol {", + " dup 0 lt {", + " pop t0", + " } {", + " dup 1 gt {", + " pop t1", + " } {", + " dt mul t0 add", + " } ifelse", + " } ifelse", + " func n array astore", + "} def", + "/axialSH {", + " dup 0 eq {", + " true", + " } {", + " dup 8 eq {", + " false", + " } {", + " 2 index axialCol 2 index axialCol colordelta", + " } ifelse", + " } ifelse", + " {", + " 1 add 3 1 roll 2 copy add 0.5 mul", + " dup 4 3 roll exch 4 index axialSH", + " exch 3 2 roll axialSH", + " } {", + " pop 2 copy add 0.5 mul", + "~23n", + " axialCol sc", + "~23s", + " axialCol aload pop k", + "~23sn", + " exch dup dx mul x0 add exch dy mul y0 add", + " 3 2 roll dup dx mul x0 add exch dy mul y0 add", + " dx abs dy abs ge {", + " 2 copy yMin sub dy mul dx div add yMin m", + " yMax sub dy mul dx div add yMax l", + " 2 copy yMax sub dy mul dx div add yMax l", + " yMin sub dy mul dx div add yMin l", + " h f*", + " } {", + " exch 2 copy xMin sub dx mul dy div add xMin exch m", + " xMax sub dx mul dy div add xMax exch l", + " exch 2 copy xMax sub dx mul dy div add xMax exch l", + " xMin sub dx mul dy div add xMin exch l", + " h f*", + " } ifelse", + " } ifelse", + "} def", + "/radialCol {", + " dup t0 lt {", + " pop t0", + " } {", + " dup t1 gt {", + " pop t1", + " } if", + " } ifelse", + " func n array astore", + "} def", + "/radialSH {", + " dup 0 eq {", + " true", + " } {", + " dup 8 eq {", + " false", + " } {", + " 2 index dt mul t0 add radialCol", + " 2 index dt mul t0 add radialCol colordelta", + " } ifelse", + " } ifelse", + " {", + " 1 add 3 1 roll 2 copy add 0.5 mul", + " dup 4 3 roll exch 4 index radialSH", + " exch 3 2 roll radialSH", + " } {", + " pop 2 copy add 0.5 mul dt mul t0 add", + "~23n", + " radialCol sc", + "~23s", + " radialCol aload pop k", + "~23sn", + " encl {", + " exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add", + " 0 360 arc h", + " dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add", + " 360 0 arcn h f", + " } {", + " 2 copy", + " dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add", + " a1 a2 arcn", + " dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add", + " a2 a1 arcn h", + " dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add", + " a1 a2 arc", + " dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add", + " a2 a1 arc h f", + " } ifelse", + " } ifelse", + "} def", + "~123sn", + "end", + NULL +}; + +static const char *cmapProlog[] = { + "/CIDInit /ProcSet findresource begin", + "10 dict begin", + " begincmap", + " /CMapType 1 def", + " /CMapName /Identity-H def", + " /CIDSystemInfo 3 dict dup begin", + " /Registry (Adobe) def", + " /Ordering (Identity) def", + " /Supplement 0 def", + " end def", + " 1 begincodespacerange", + " <0000> ", + " endcodespacerange", + " 0 usefont", + " 1 begincidrange", + " <0000> 0", + " endcidrange", + " endcmap", + " currentdict CMapName exch /CMap defineresource pop", + "end", + "10 dict begin", + " begincmap", + " /CMapType 1 def", + " /CMapName /Identity-V def", + " /CIDSystemInfo 3 dict dup begin", + " /Registry (Adobe) def", + " /Ordering (Identity) def", + " /Supplement 0 def", + " end def", + " /WMode 1 def", + " 1 begincodespacerange", + " <0000> ", + " endcodespacerange", + " 0 usefont", + " 1 begincidrange", + " <0000> 0", + " endcidrange", + " endcmap", + " currentdict CMapName exch /CMap defineresource pop", + "end", + "end", + NULL +}; + +//------------------------------------------------------------------------ +// Fonts +//------------------------------------------------------------------------ + +struct PSSubstFont { + const char *psName; // PostScript name + double mWidth; // width of 'm' character +}; + +// NB: must be in same order as base14SubstFonts in GfxFont.cc +static PSSubstFont psBase14SubstFonts[14] = { + {"Courier", 0.600}, + {"Courier-Oblique", 0.600}, + {"Courier-Bold", 0.600}, + {"Courier-BoldOblique", 0.600}, + {"Helvetica", 0.833}, + {"Helvetica-Oblique", 0.833}, + {"Helvetica-Bold", 0.889}, + {"Helvetica-BoldOblique", 0.889}, + {"Times-Roman", 0.788}, + {"Times-Italic", 0.722}, + {"Times-Bold", 0.833}, + {"Times-BoldItalic", 0.778}, + // the last two are never used for substitution + {"Symbol", 0}, + {"ZapfDingbats", 0} +}; + +// Mapping from Type 1/1C font file to PS font name. +struct PST1FontName { + Ref fontFileID; + GooString *psName; // PostScript font name used for this + // embedded font file +}; + +// Info for 8-bit fonts +struct PSFont8Info { + Ref fontID; + int *codeToGID; // code-to-GID mapping for TrueType fonts +}; + +// Encoding info for substitute 16-bit font +struct PSFont16Enc { + Ref fontID; + GooString *enc; +}; + +//------------------------------------------------------------------------ +// process colors +//------------------------------------------------------------------------ + +#define psProcessCyan 1 +#define psProcessMagenta 2 +#define psProcessYellow 4 +#define psProcessBlack 8 +#define psProcessCMYK 15 + +//------------------------------------------------------------------------ +// PSOutCustomColor +//------------------------------------------------------------------------ + +class PSOutCustomColor { +public: + + PSOutCustomColor(double cA, double mA, + double yA, double kA, GooString *nameA); + ~PSOutCustomColor(); + + double c, m, y, k; + GooString *name; + PSOutCustomColor *next; +}; + +PSOutCustomColor::PSOutCustomColor(double cA, double mA, + double yA, double kA, GooString *nameA) { + c = cA; + m = mA; + y = yA; + k = kA; + name = nameA; + next = NULL; +} + +PSOutCustomColor::~PSOutCustomColor() { + delete name; +} + +//------------------------------------------------------------------------ + +struct PSOutImgClipRect { + int x0, x1, y0, y1; +}; + +//------------------------------------------------------------------------ + +struct PSOutPaperSize { + PSOutPaperSize(int wA, int hA) { w = wA; h = hA; } + int w, h; +}; + +//------------------------------------------------------------------------ +// DeviceNRecoder +//------------------------------------------------------------------------ + +class DeviceNRecoder: public FilterStream { +public: + + DeviceNRecoder(Stream *strA, int widthA, int heightA, + GfxImageColorMap *colorMapA); + virtual ~DeviceNRecoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx++]; } + virtual int lookChar() + { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx]; } + virtual GooString *getPSFilter(int psLevel, const char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gTrue; } + virtual GBool isEncoder() { return gTrue; } + +private: + + GBool fillBuf(); + + int width, height; + GfxImageColorMap *colorMap; + Function *func; + ImageStream *imgStr; + int buf[gfxColorMaxComps]; + int pixelIdx; + int bufIdx; + int bufSize; +}; + +DeviceNRecoder::DeviceNRecoder(Stream *strA, int widthA, int heightA, + GfxImageColorMap *colorMapA): + FilterStream(strA) { + width = widthA; + height = heightA; + colorMap = colorMapA; + imgStr = NULL; + pixelIdx = 0; + bufIdx = gfxColorMaxComps; + bufSize = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())-> + getAlt()->getNComps(); + func = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())-> + getTintTransformFunc(); +} + +DeviceNRecoder::~DeviceNRecoder() { + if (imgStr) { + delete imgStr; + } + if (str->isEncoder()) { + delete str; + } +} + +void DeviceNRecoder::reset() { + imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); +} + +GBool DeviceNRecoder::fillBuf() { + Guchar pixBuf[gfxColorMaxComps]; + GfxColor color; + double x[gfxColorMaxComps], y[gfxColorMaxComps]; + int i; + + if (pixelIdx >= width * height) { + return gFalse; + } + imgStr->getPixel(pixBuf); + colorMap->getColor(pixBuf, &color); + for (i = 0; + i < ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->getNComps(); + ++i) { + x[i] = colToDbl(color.c[i]); + } + func->transform(x, y); + for (i = 0; i < bufSize; ++i) { + buf[i] = (int)(y[i] * 255 + 0.5); + } + bufIdx = 0; + ++pixelIdx; + return gTrue; +} + +//------------------------------------------------------------------------ +// PSOutputDev +//------------------------------------------------------------------------ + +extern "C" { +typedef void (*SignalFunc)(int); +} + +static void outputToFile(void *stream, const char *data, int len) { + fwrite(data, 1, len, (FILE *)stream); +} + +PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc, + char *psTitle, + int firstPage, int lastPage, PSOutMode modeA, + int paperWidthA, int paperHeightA, GBool duplexA, + int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool forceRasterizeA, + GBool manualCtrlA, + PSOutCustomCodeCbk customCodeCbkA, + void *customCodeCbkDataA) { + FILE *f; + PSFileType fileTypeA; + + underlayCbk = NULL; + underlayCbkData = NULL; + overlayCbk = NULL; + overlayCbkData = NULL; + customCodeCbk = customCodeCbkA; + customCodeCbkData = customCodeCbkDataA; + + fontIDs = NULL; + fontNames = new GooHash(gTrue); + t1FontNames = NULL; + font8Info = NULL; + font16Enc = NULL; + imgIDs = NULL; + formIDs = NULL; + xobjStack = NULL; + paperSizes = NULL; + embFontList = NULL; + customColors = NULL; + haveTextClip = gFalse; + t3String = NULL; + forceRasterize = forceRasterizeA; + + // open file or pipe + if (!strcmp(fileName, "-")) { + fileTypeA = psStdout; + f = stdout; + } else if (fileName[0] == '|') { + fileTypeA = psPipe; +#ifdef HAVE_POPEN +#ifndef _WIN32 + signal(SIGPIPE, (SignalFunc)SIG_IGN); +#endif + if (!(f = popen(fileName + 1, "w"))) { + error(errIO, -1, "Couldn't run print command '{0:s}'", fileName); + ok = gFalse; + return; + } +#else + error(errIO, -1, "Print commands are not supported ('{0:s}')", fileName); + ok = gFalse; + return; +#endif + } else { + fileTypeA = psFile; + if (!(f = fopen(fileName, "w"))) { + error(errIO, -1, "Couldn't open PostScript file '{0:s}'", fileName); + ok = gFalse; + return; + } + } + + init(outputToFile, f, fileTypeA, psTitle, + doc, firstPage, lastPage, modeA, + imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA, + paperWidthA, paperHeightA, duplexA); +} + +PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, + char *psTitle, + PDFDoc *doc, + int firstPage, int lastPage, PSOutMode modeA, + int paperWidthA, int paperHeightA, GBool duplexA, + int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool forceRasterizeA, + GBool manualCtrlA, + PSOutCustomCodeCbk customCodeCbkA, + void *customCodeCbkDataA) { + underlayCbk = NULL; + underlayCbkData = NULL; + overlayCbk = NULL; + overlayCbkData = NULL; + customCodeCbk = customCodeCbkA; + customCodeCbkData = customCodeCbkDataA; + + fontIDs = NULL; + fontNames = new GooHash(gTrue); + t1FontNames = NULL; + font8Info = NULL; + font16Enc = NULL; + imgIDs = NULL; + formIDs = NULL; + xobjStack = NULL; + paperSizes = NULL; + embFontList = NULL; + customColors = NULL; + haveTextClip = gFalse; + t3String = NULL; + forceRasterize = forceRasterizeA; + + init(outputFuncA, outputStreamA, psGeneric, psTitle, + doc, firstPage, lastPage, modeA, + imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA, + paperWidthA, paperHeightA, duplexA); +} + +void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA, + PSFileType fileTypeA, char *pstitle, PDFDoc *docA, + int firstPage, int lastPage, PSOutMode modeA, + int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool manualCtrlA, int paperWidthA, int paperHeightA, + GBool duplexA) { + Catalog *catalog; + PDFRectangle *box; + PSOutPaperSize *size; + GooList *names; + int pg, w, h, i; + + // initialize + displayText = gTrue; + ok = gTrue; + outputFunc = outputFuncA; + outputStream = outputStreamA; + fileType = fileTypeA; + doc = docA; + xref = doc->getXRef(); + catalog = doc->getCatalog(); + level = globalParams->getPSLevel(); + mode = modeA; + paperWidth = paperWidthA; + paperHeight = paperHeightA; + imgLLX = imgLLXA; + imgLLY = imgLLYA; + imgURX = imgURXA; + imgURY = imgURYA; + if (paperWidth < 0 || paperHeight < 0) { + Page *page; + paperMatch = gTrue; + paperSizes = new GooList(); + paperWidth = paperHeight = 1; // in case the document has zero pages + for (pg = (firstPage >= 1) ? firstPage : 1; + pg <= lastPage && pg <= catalog->getNumPages(); + ++pg) { + page = catalog->getPage(pg); + if (page == NULL) { + paperMatch = gFalse; + break; + } + w = (int)ceil(page->getMediaWidth()); + h = (int)ceil(page->getMediaHeight()); + for (i = 0; i < paperSizes->getLength(); ++i) { + size = (PSOutPaperSize *)paperSizes->get(i); + if (size->w == w && size->h == h) { + break; + } + } + if (i == paperSizes->getLength()) { + paperSizes->append(new PSOutPaperSize(w, h)); + } + if (w > paperWidth) { + paperWidth = w; + } + if (h > paperHeight) { + paperHeight = h; + } + } + // NB: img{LLX,LLY,URX,URY} will be set by startPage() + } else { + paperMatch = gFalse; + } + preload = globalParams->getPSPreload(); + if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) { + imgLLX = imgLLY = 0; + imgURX = paperWidth; + imgURY = paperHeight; + } + if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) { + imgLLX = imgLLY = 0; + imgURX = paperWidth; + imgURY = paperHeight; + } + manualCtrl = manualCtrlA; + if (mode == psModeForm) { + lastPage = firstPage; + } + processColors = 0; + inType3Char = gFalse; + inUncoloredPattern = gFalse; + +#if OPI_SUPPORT + // initialize OPI nesting levels + opi13Nest = 0; + opi20Nest = 0; +#endif + + tx0 = ty0 = -1; + xScale0 = yScale0 = 0; + rotate0 = -1; + clipLLX0 = clipLLY0 = 0; + clipURX0 = clipURY0 = -1; + + // initialize fontIDs, fontFileIDs, and fontFileNames lists + fontIDSize = 64; + fontIDLen = 0; + fontIDs = (Ref *)gmallocn(fontIDSize, sizeof(Ref)); + for (i = 0; i < 14; ++i) { + fontNames->add(new GooString(psBase14SubstFonts[i].psName), 1); + } + names = globalParams->getPSResidentFonts(); + for (i = 0; i < names->getLength(); ++i) { + fontNames->add((GooString *)names->get(i), 1); + } + delete names; + t1FontNameSize = 64; + t1FontNameLen = 0; + t1FontNames = (PST1FontName *)gmallocn(t1FontNameSize, sizeof(PST1FontName)); + font8InfoLen = 0; + font8InfoSize = 0; + font16EncLen = 0; + font16EncSize = 0; + imgIDLen = 0; + imgIDSize = 0; + formIDLen = 0; + formIDSize = 0; + + xobjStack = new GooList(); + numSaves = 0; + numTilingPatterns = 0; + nextFunc = 0; + + // initialize embedded font resource comment list + embFontList = new GooString(); + + if (!manualCtrl) { + Page *page; + // this check is needed in case the document has zero pages + if ((page = doc->getPage(firstPage))) { + writeHeader(firstPage, lastPage, + page->getMediaBox(), + page->getCropBox(), + page->getRotate(), + pstitle); + } else { + error(errSyntaxError, -1, "Invalid page {0:d}", firstPage); + box = new PDFRectangle(0, 0, 1, 1); + writeHeader(firstPage, lastPage, box, box, 0, pstitle); + delete box; + } + if (mode != psModeForm) { + writePS("%%BeginProlog\n"); + } + writeXpdfProcset(); + if (mode != psModeForm) { + writePS("%%EndProlog\n"); + writePS("%%BeginSetup\n"); + } + writeDocSetup(doc, catalog, firstPage, lastPage, duplexA); + if (mode != psModeForm) { + writePS("%%EndSetup\n"); + } + } + + // initialize sequential page number + seqPage = 1; +} + +PSOutputDev::~PSOutputDev() { + PSOutCustomColor *cc; + int i; + + if (ok) { + if (!manualCtrl) { + writePS("%%Trailer\n"); + writeTrailer(); + if (mode != psModeForm) { + writePS("%%EOF\n"); + } + } + if (fileType == psFile) { +#ifdef MACOS + ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle); +#endif + fclose((FILE *)outputStream); + } +#ifdef HAVE_POPEN + else if (fileType == psPipe) { + pclose((FILE *)outputStream); +#ifndef _WIN32 + signal(SIGPIPE, (SignalFunc)SIG_DFL); +#endif + } +#endif + } + if (paperSizes) { + deleteGooList(paperSizes, PSOutPaperSize); + } + if (embFontList) { + delete embFontList; + } + if (fontIDs) { + gfree(fontIDs); + } + delete fontNames; + if (t1FontNames) { + for (i = 0; i < t1FontNameLen; ++i) { + delete t1FontNames[i].psName; + } + gfree(t1FontNames); + } + if (font8Info) { + for (i = 0; i < font8InfoLen; ++i) { + gfree(font8Info[i].codeToGID); + } + gfree(font8Info); + } + if (font16Enc) { + for (i = 0; i < font16EncLen; ++i) { + if (font16Enc[i].enc) { + delete font16Enc[i].enc; + } + } + gfree(font16Enc); + } + gfree(imgIDs); + gfree(formIDs); + if (xobjStack) { + delete xobjStack; + } + while (customColors) { + cc = customColors; + customColors = cc->next; + delete cc; + } +} + +void PSOutputDev::writeHeader(int firstPage, int lastPage, + PDFRectangle *mediaBox, PDFRectangle *cropBox, + int pageRotate, char *psTitle) { + Object info, obj1; + PSOutPaperSize *size; + double x1, y1, x2, y2; + int i; + + switch (mode) { + case psModePSOrigPageSizes: + case psModePS: + writePS("%!PS-Adobe-3.0\n"); + break; + case psModeEPS: + writePS("%!PS-Adobe-3.0 EPSF-3.0\n"); + break; + case psModeForm: + writePS("%!PS-Adobe-3.0 Resource-Form\n"); + break; + } + writePSFmt("%Produced by poppler pdftops version: {0:s} (http://poppler.freedesktop.org)\n", PACKAGE_VERSION); + xref->getDocInfo(&info); + if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) { + writePS("%%Creator: "); + writePSTextLine(obj1.getString()); + } + obj1.free(); + info.free(); + if(psTitle) { + writePSFmt("%%Title: {0:s}\n", psTitle); + } + writePSFmt("%%LanguageLevel: {0:d}\n", + (level == psLevel1 || level == psLevel1Sep) ? 1 : + (level == psLevel2 || level == psLevel2Sep) ? 2 : 3); + if (level == psLevel1Sep || level == psLevel2Sep || level == psLevel3Sep) { + writePS("%%DocumentProcessColors: (atend)\n"); + writePS("%%DocumentCustomColors: (atend)\n"); + } + writePS("%%DocumentSuppliedResources: (atend)\n"); + if ((level == psLevel1 || level == psLevel1Sep) && globalParams->getPSBinary()) { + writePS("%%DocumentData: Binary\n"); + } + + switch (mode) { + case psModePSOrigPageSizes: + prevWidth = 0; + prevHeight = 0; + case psModePS: + if (paperMatch) { + for (i = 0; i < paperSizes->getLength(); ++i) { + size = (PSOutPaperSize *)paperSizes->get(i); + writePSFmt("%%{0:s} {1:d}x{2:d} {1:d} {2:d} 0 () ()\n", + i==0 ? "DocumentMedia:" : "+", size->w, size->h); + } + } else { + writePSFmt("%%DocumentMedia: plain {0:d} {1:d} 0 () ()\n", + paperWidth, paperHeight); + } + writePSFmt("%%BoundingBox: 0 0 {0:d} {1:d}\n", paperWidth, paperHeight); + writePSFmt("%%Pages: {0:d}\n", lastPage - firstPage + 1); + writePS("%%EndComments\n"); + if (!paperMatch) { + writePS("%%BeginDefaults\n"); + writePS("%%PageMedia: plain\n"); + writePS("%%EndDefaults\n"); + } + break; + case psModeEPS: + epsX1 = cropBox->x1; + epsY1 = cropBox->y1; + epsX2 = cropBox->x2; + epsY2 = cropBox->y2; + if (pageRotate == 0 || pageRotate == 180) { + x1 = epsX1; + y1 = epsY1; + x2 = epsX2; + y2 = epsY2; + } else { // pageRotate == 90 || pageRotate == 270 + x1 = 0; + y1 = 0; + x2 = epsY2 - epsY1; + y2 = epsX2 - epsX1; + } + writePSFmt("%%BoundingBox: {0:d} {1:d} {2:d} {3:d}\n", + (int)floor(x1), (int)floor(y1), (int)ceil(x2), (int)ceil(y2)); + if (floor(x1) != ceil(x1) || floor(y1) != ceil(y1) || + floor(x2) != ceil(x2) || floor(y2) != ceil(y2)) { + writePSFmt("%%HiResBoundingBox: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n", + x1, y1, x2, y2); + } + writePS("%%DocumentSuppliedResources: (atend)\n"); + writePS("%%EndComments\n"); + break; + case psModeForm: + writePS("%%EndComments\n"); + writePS("32 dict dup begin\n"); + writePSFmt("/BBox [{0:d} {1:d} {2:d} {3:d}] def\n", + (int)floor(mediaBox->x1), (int)floor(mediaBox->y1), + (int)ceil(mediaBox->x2), (int)ceil(mediaBox->y2)); + writePS("/FormType 1 def\n"); + writePS("/Matrix [1 0 0 1 0 0] def\n"); + break; + } +} + +void PSOutputDev::writeXpdfProcset() { + GBool lev1, lev2, lev3, sep, nonSep; + const char **p; + const char *q; + + writePSFmt("%%BeginResource: procset xpdf {0:s} 0\n", "3.00"); + writePSFmt("%%Copyright: {0:s}\n", xpdfCopyright); + lev1 = lev2 = lev3 = sep = nonSep = gTrue; + for (p = prolog; *p; ++p) { + if ((*p)[0] == '~') { + lev1 = lev2 = lev3 = sep = nonSep = gFalse; + for (q = *p + 1; *q; ++q) { + switch (*q) { + case '1': lev1 = gTrue; break; + case '2': lev2 = gTrue; break; + case '3': lev3 = gTrue; break; + case 's': sep = gTrue; break; + case 'n': nonSep = gTrue; break; + } + } + } else if ((level == psLevel1 && lev1 && nonSep) || + (level == psLevel1Sep && lev1 && sep) || + (level == psLevel2 && lev2 && nonSep) || + (level == psLevel2Sep && lev2 && sep) || + (level == psLevel3 && lev3 && nonSep) || + (level == psLevel3Sep && lev3 && sep)) { + writePSFmt("{0:s}\n", *p); + } + } + writePS("%%EndResource\n"); + + if (level >= psLevel3) { + for (p = cmapProlog; *p; ++p) { + writePSFmt("{0:s}\n", *p); + } + } +} + +void PSOutputDev::writeDocSetup(PDFDoc *doc, Catalog *catalog, + int firstPage, int lastPage, + GBool duplexA) { + Page *page; + Dict *resDict; + Annots *annots; + Object *acroForm; + Object obj1, obj2, obj3; + GooString *s; + int pg, i; + + if (mode == psModeForm) { + // swap the form and xpdf dicts + writePS("xpdf end begin dup begin\n"); + } else { + writePS("xpdf begin\n"); + } + for (pg = firstPage; pg <= lastPage; ++pg) { + page = doc->getPage(pg); + if (!page) { + error(errSyntaxError, -1, "Failed writing resources for page {0:d}", pg); + continue; + } + if ((resDict = page->getResourceDict())) { + setupResources(resDict); + } + annots = page->getAnnots(); + for (i = 0; i < annots->getNumAnnots(); ++i) { + if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) { + setupResources(obj1.getDict()); + } + obj1.free(); + } + } + if ((acroForm = catalog->getAcroForm()) && acroForm->isDict()) { + if (acroForm->dictLookup("DR", &obj1)->isDict()) { + setupResources(obj1.getDict()); + } + obj1.free(); + if (acroForm->dictLookup("Fields", &obj1)->isArray()) { + for (i = 0; i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGet(i, &obj2)->isDict()) { + if (obj2.dictLookup("DR", &obj3)->isDict()) { + setupResources(obj3.getDict()); + } + obj3.free(); + } + obj2.free(); + } + } + obj1.free(); + } + if (mode != psModeForm) { + if (mode != psModeEPS && !manualCtrl) { + writePSFmt("{0:s} pdfSetup\n", + duplexA ? "true" : "false"); + if (!paperMatch) { + writePSFmt("{0:d} {1:d} pdfSetupPaper\n", paperWidth, paperHeight); + } + } +#if OPI_SUPPORT + if (globalParams->getPSOPI()) { + writePS("/opiMatrix matrix currentmatrix def\n"); + } +#endif + } + if (customCodeCbk) { + if ((s = (*customCodeCbk)(this, psOutCustomDocSetup, 0, + customCodeCbkData))) { + writePS(s->getCString()); + delete s; + } + } +} + +void PSOutputDev::writePageTrailer() { + if (mode != psModeForm) { + writePS("pdfEndPage\n"); + } +} + +void PSOutputDev::writeTrailer() { + PSOutCustomColor *cc; + + if (mode == psModeForm) { + writePS("/Foo exch /Form defineresource pop\n"); + } else { + writePS("end\n"); + writePS("%%DocumentSuppliedResources:\n"); + writePS(embFontList->getCString()); + if (level == psLevel1Sep || level == psLevel2Sep || + level == psLevel3Sep) { + writePS("%%DocumentProcessColors:"); + if (processColors & psProcessCyan) { + writePS(" Cyan"); + } + if (processColors & psProcessMagenta) { + writePS(" Magenta"); + } + if (processColors & psProcessYellow) { + writePS(" Yellow"); + } + if (processColors & psProcessBlack) { + writePS(" Black"); + } + writePS("\n"); + writePS("%%DocumentCustomColors:"); + for (cc = customColors; cc; cc = cc->next) { + writePS(" "); + writePSString(cc->name); + } + writePS("\n"); + writePS("%%CMYKCustomColor:\n"); + for (cc = customColors; cc; cc = cc->next) { + writePSFmt("%%+ {0:.4g} {1:.4g} {2:.4g} {3:.4g} ", + cc->c, cc->m, cc->y, cc->k); + writePSString(cc->name); + writePS("\n"); + } + } + } +} + +void PSOutputDev::setupResources(Dict *resDict) { + Object xObjDict, xObjRef, xObj, patDict, patRef, pat, resObj; + Ref ref0, ref1; + GBool skip; + int i, j; + + setupFonts(resDict); + setupImages(resDict); + setupForms(resDict); + + //----- recursively scan XObjects + resDict->lookup("XObject", &xObjDict); + if (xObjDict.isDict()) { + for (i = 0; i < xObjDict.dictGetLength(); ++i) { + + // avoid infinite recursion on XObjects + skip = gFalse; + if ((xObjDict.dictGetValNF(i, &xObjRef)->isRef())) { + ref0 = xObjRef.getRef(); + for (j = 0; j < xobjStack->getLength(); ++j) { + ref1 = *(Ref *)xobjStack->get(j); + if (ref1.num == ref0.num && ref1.gen == ref0.gen) { + skip = gTrue; + break; + } + } + if (!skip) { + xobjStack->append(&ref0); + } + } + if (!skip) { + + // process the XObject's resource dictionary + xObjDict.dictGetVal(i, &xObj); + if (xObj.isStream()) { + xObj.streamGetDict()->lookup("Resources", &resObj); + if (resObj.isDict()) { + setupResources(resObj.getDict()); + } + resObj.free(); + } + xObj.free(); + } + + if (xObjRef.isRef() && !skip) { + xobjStack->del(xobjStack->getLength() - 1); + } + xObjRef.free(); + } + } + xObjDict.free(); + + //----- recursively scan Patterns + resDict->lookup("Pattern", &patDict); + if (patDict.isDict()) { + inType3Char = gTrue; + for (i = 0; i < patDict.dictGetLength(); ++i) { + + // avoid infinite recursion on Patterns + skip = gFalse; + if ((patDict.dictGetValNF(i, &patRef)->isRef())) { + ref0 = patRef.getRef(); + for (j = 0; j < xobjStack->getLength(); ++j) { + ref1 = *(Ref *)xobjStack->get(j); + if (ref1.num == ref0.num && ref1.gen == ref0.gen) { + skip = gTrue; + break; + } + } + if (!skip) { + xobjStack->append(&ref0); + } + } + if (!skip) { + + // process the Pattern's resource dictionary + patDict.dictGetVal(i, &pat); + if (pat.isStream()) { + pat.streamGetDict()->lookup("Resources", &resObj); + if (resObj.isDict()) { + setupResources(resObj.getDict()); + } + resObj.free(); + } + pat.free(); + } + + if (patRef.isRef() && !skip) { + xobjStack->del(xobjStack->getLength() - 1); + } + patRef.free(); + } + inType3Char = gFalse; + } + patDict.free(); +} + +void PSOutputDev::setupFonts(Dict *resDict) { + Object obj1, obj2; + Ref r; + GfxFontDict *gfxFontDict; + GfxFont *font; + int i; + + gfxFontDict = NULL; + resDict->lookupNF("Font", &obj1); + if (obj1.isRef()) { + obj1.fetch(xref, &obj2); + if (obj2.isDict()) { + r = obj1.getRef(); + gfxFontDict = new GfxFontDict(xref, &r, obj2.getDict()); + } + obj2.free(); + } else if (obj1.isDict()) { + gfxFontDict = new GfxFontDict(xref, NULL, obj1.getDict()); + } + if (gfxFontDict) { + for (i = 0; i < gfxFontDict->getNumFonts(); ++i) { + if ((font = gfxFontDict->getFont(i))) { + setupFont(font, resDict); + } + } + delete gfxFontDict; + } + obj1.free(); +} + +void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { + GfxFontLoc *fontLoc; + GooString *psName; + char buf[16]; + GBool subst; + UnicodeMap *uMap; + const char *charName; + double xs, ys; + int code; + double w1, w2; + int i, j; + + // check if font is already set up + for (i = 0; i < fontIDLen; ++i) { + if (fontIDs[i].num == font->getID()->num && + fontIDs[i].gen == font->getID()->gen) { + return; + } + } + + // add entry to fontIDs list + if (fontIDLen >= fontIDSize) { + fontIDSize += 64; + fontIDs = (Ref *)greallocn(fontIDs, fontIDSize, sizeof(Ref)); + } + fontIDs[fontIDLen++] = *font->getID(); + + psName = NULL; + xs = ys = 1; + subst = gFalse; + + if (font->getType() == fontType3) { + psName = GooString::format("T3_{0:d}_{1:d}", + font->getID()->num, font->getID()->gen); + setupType3Font(font, psName, parentResDict); + } else { + fontLoc = font->locateFont(xref, gTrue); + if (fontLoc != NULL) { + switch (fontLoc->locType) { + case gfxFontLocEmbedded: + switch (fontLoc->fontType) { + case fontType1: + // this assumes that the PS font name matches the PDF font name + psName = font->getEmbeddedFontName()->copy(); + setupEmbeddedType1Font(&fontLoc->embFontID, psName); + break; + case fontType1C: + psName = makePSFontName(font, &fontLoc->embFontID); + setupEmbeddedType1CFont(font, &fontLoc->embFontID, psName); + break; + case fontType1COT: + psName = makePSFontName(font, &fontLoc->embFontID); + setupEmbeddedOpenTypeT1CFont(font, &fontLoc->embFontID, psName); + break; + case fontTrueType: + case fontTrueTypeOT: + psName = makePSFontName(font, font->getID()); + setupEmbeddedTrueTypeFont(font, &fontLoc->embFontID, psName); + break; + case fontCIDType0C: + psName = makePSFontName(font, &fontLoc->embFontID); + setupEmbeddedCIDType0Font(font, &fontLoc->embFontID, psName); + break; + case fontCIDType2: + case fontCIDType2OT: + psName = makePSFontName(font, font->getID()); + //~ should check to see if font actually uses vertical mode + setupEmbeddedCIDTrueTypeFont(font, &fontLoc->embFontID, psName, gTrue); + break; + case fontCIDType0COT: + psName = makePSFontName(font, &fontLoc->embFontID); + setupEmbeddedOpenTypeCFFFont(font, &fontLoc->embFontID, psName); + break; + default: + break; + } + break; + case gfxFontLocExternal: + //~ add cases for external 16-bit fonts + switch (fontLoc->fontType) { + case fontType1: + if (font->getName()) { + // this assumes that the PS font name matches the PDF font name + psName = font->getName()->copy(); + } else { + //~ this won't work -- the PS font name won't match + psName = makePSFontName(font, font->getID()); + } + setupExternalType1Font(fontLoc->path, psName); + break; + case fontTrueType: + case fontTrueTypeOT: + psName = makePSFontName(font, font->getID()); + setupExternalTrueTypeFont(font, fontLoc->path, psName); + break; + case fontCIDType2: + case fontCIDType2OT: + psName = makePSFontName(font, font->getID()); + //~ should check to see if font actually uses vertical mode + setupExternalCIDTrueTypeFont(font, fontLoc->path, psName, gTrue); + break; + default: + break; + } + break; + case gfxFontLocResident: + psName = fontLoc->path->copy(); + break; + } + } + + if (!psName) { + if (font->isCIDFont()) { + error(errSyntaxError, -1, + "Couldn't find a font to substitute for '{0:s}' ('{1:s}' character collection)", + font->getName() ? font->getName()->getCString() + : "(unnamed)", + ((GfxCIDFont *)font)->getCollection() + ? ((GfxCIDFont *)font)->getCollection()->getCString() + : "(unknown)"); + if (font16EncLen >= font16EncSize) { + font16EncSize += 16; + font16Enc = (PSFont16Enc *)greallocn(font16Enc, + font16EncSize, + sizeof(PSFont16Enc)); + } + font16Enc[font16EncLen].fontID = *font->getID(); + font16Enc[font16EncLen].enc = NULL; + ++font16EncLen; + } else { + error(errSyntaxError, -1, + "Couldn't find a font to substitute for '{0:s}'", + font->getName() ? font->getName()->getCString() + : "(unnamed)"); + } + delete fontLoc; + return; + } + + // scale substituted 8-bit fonts + if (fontLoc->locType == gfxFontLocResident && + fontLoc->substIdx >= 0) { + subst = gTrue; + for (code = 0; code < 256; ++code) { + if ((charName = ((Gfx8BitFont *)font)->getCharName(code)) && + charName[0] == 'm' && charName[1] == '\0') { + break; + } + } + if (code < 256) { + w1 = ((Gfx8BitFont *)font)->getWidth(code); + } else { + w1 = 0; + } + w2 = psBase14SubstFonts[fontLoc->substIdx].mWidth; + xs = w1 / w2; + if (xs < 0.1) { + xs = 1; + } + } + + // handle encodings for substituted CID fonts + if (fontLoc->locType == gfxFontLocResident && + fontLoc->fontType >= fontCIDType0) { + subst = gTrue; + if (font16EncLen >= font16EncSize) { + font16EncSize += 16; + font16Enc = (PSFont16Enc *)greallocn(font16Enc, + font16EncSize, + sizeof(PSFont16Enc)); + } + font16Enc[font16EncLen].fontID = *font->getID(); + if ((uMap = globalParams->getUnicodeMap(fontLoc->encoding))) { + font16Enc[font16EncLen].enc = fontLoc->encoding->copy(); + uMap->decRefCnt(); + } else { + error(errSyntaxError, -1, + "Couldn't find Unicode map for 16-bit font encoding '{0:t}'", + fontLoc->encoding); + font16Enc[font16EncLen].enc = NULL; + } + ++font16EncLen; + } + + delete fontLoc; + } + + // generate PostScript code to set up the font + if (font->isCIDFont()) { + if (level == psLevel3 || level == psLevel3Sep) { + writePSFmt("/F{0:d}_{1:d} /{2:t} {3:d} pdfMakeFont16L3\n", + font->getID()->num, font->getID()->gen, psName, + font->getWMode()); + } else { + writePSFmt("/F{0:d}_{1:d} /{2:t} {3:d} pdfMakeFont16\n", + font->getID()->num, font->getID()->gen, psName, + font->getWMode()); + } + } else { + writePSFmt("/F{0:d}_{1:d} /{2:t} {3:.6g} {4:.6g}\n", + font->getID()->num, font->getID()->gen, psName, xs, ys); + for (i = 0; i < 256; i += 8) { + writePS((char *)((i == 0) ? "[ " : " ")); + for (j = 0; j < 8; ++j) { + if (font->getType() == fontTrueType && + !subst && + !((Gfx8BitFont *)font)->getHasEncoding()) { + sprintf(buf, "c%02x", i+j); + charName = buf; + } else { + charName = ((Gfx8BitFont *)font)->getCharName(i+j); + } + writePS("/"); + writePSName(charName ? charName : (char *)".notdef"); + // the empty name is legal in PDF and PostScript, but PostScript + // uses a double-slash (//...) for "immediately evaluated names", + // so we need to add a space character here + if (charName && !charName[0]) { + writePS(" "); + } + } + writePS((i == 256-8) ? (char *)"]\n" : (char *)"\n"); + } + writePS("pdfMakeFont\n"); + } + + delete psName; +} + +void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) { + static const char hexChar[17] = "0123456789abcdef"; + Object refObj, strObj, obj1, obj2, obj3; + Dict *dict; + int length1, length2, length3; + int c; + int start[4]; + GBool binMode; + GBool writePadding = gTrue; + int i; + + // check if font is already embedded + if (fontNames->lookupInt(psName)) { + return; + } + fontNames->add(psName->copy(), 1); + + // get the font stream and info + refObj.initRef(id->num, id->gen); + refObj.fetch(xref, &strObj); + refObj.free(); + if (!strObj.isStream()) { + error(errSyntaxError, -1, "Embedded font file object is not a stream"); + goto err1; + } + if (!(dict = strObj.streamGetDict())) { + error(errSyntaxError, -1, + "Embedded font stream is missing its dictionary"); + goto err1; + } + dict->lookup("Length1", &obj1); + dict->lookup("Length2", &obj2); + dict->lookup("Length3", &obj3); + if (!obj1.isInt() || !obj2.isInt() || !obj3.isInt()) { + error(errSyntaxError, -1, + "Missing length fields in embedded font stream dictionary"); + obj1.free(); + obj2.free(); + obj3.free(); + goto err1; + } + length1 = obj1.getInt(); + length2 = obj2.getInt(); + length3 = obj3.getInt(); + obj1.free(); + obj2.free(); + obj3.free(); + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // copy ASCII portion of font + strObj.streamReset(); + for (i = 0; i < length1 && (c = strObj.streamGetChar()) != EOF; ++i) { + writePSChar(c); + } + + // figure out if encrypted portion is binary or ASCII + binMode = gFalse; + for (i = 0; i < 4; ++i) { + start[i] = strObj.streamGetChar(); + if (start[i] == EOF) { + error(errSyntaxError, -1, + "Unexpected end of file in embedded font stream"); + goto err1; + } + if (!((start[i] >= '0' && start[i] <= '9') || + (start[i] >= 'A' && start[i] <= 'F') || + (start[i] >= 'a' && start[i] <= 'f'))) + binMode = gTrue; + } + + if (length2 == 0) + { + // length2 == 0 is an error + // trying to solve it by just piping all + // the stream data + error(errSyntaxWarning, -1, "Font has length2 as 0, trying to overcome the problem reading the stream until the end"); + length2 = INT_MAX; + writePadding = gFalse; + } + + + // convert binary data to ASCII + if (binMode) { + for (i = 0; i < 4; ++i) { + writePSChar(hexChar[(start[i] >> 4) & 0x0f]); + writePSChar(hexChar[start[i] & 0x0f]); + } +#if 0 // this causes trouble for various PostScript printers + // if Length2 is incorrect (too small), font data gets chopped, so + // we take a few extra characters from the trailer just in case + length2 += length3 >= 8 ? 8 : length3; +#endif + while (i < length2) { + if ((c = strObj.streamGetChar()) == EOF) { + break; + } + writePSChar(hexChar[(c >> 4) & 0x0f]); + writePSChar(hexChar[c & 0x0f]); + if (++i % 32 == 0) { + writePSChar('\n'); + } + } + if (i % 32 > 0) { + writePSChar('\n'); + } + + // already in ASCII format -- just copy it + } else { + for (i = 0; i < 4; ++i) { + writePSChar(start[i]); + } + for (i = 4; i < length2; ++i) { + if ((c = strObj.streamGetChar()) == EOF) { + break; + } + writePSChar(c); + } + } + + if (writePadding) + { + if (length3 > 0) { + // write fixed-content portion + while ((c = strObj.streamGetChar()) != EOF) { + writePSChar(c); + } + } else { + // write padding and "cleartomark" + for (i = 0; i < 8; ++i) { + writePS("00000000000000000000000000000000" + "00000000000000000000000000000000\n"); + } + writePS("cleartomark\n"); + } + } + + // ending comment + writePS("%%EndResource\n"); + + err1: + strObj.streamClose(); + strObj.free(); +} + +//~ This doesn't handle .pfb files or binary eexec data (which only +//~ happens in pfb files?). +void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) { + FILE *fontFile; + int c; + + if (fontNames->lookupInt(psName)) { + return; + } + fontNames->add(psName->copy(), 1); + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // copy the font file + if (!(fontFile = fopen(fileName->getCString(), "rb"))) { + error(errIO, -1, "Couldn't open external font file"); + return; + } + while ((c = fgetc(fontFile)) != EOF) { + writePSChar(c); + } + fclose(fontFile); + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupEmbeddedType1CFont(GfxFont *font, Ref *id, + GooString *psName) { + char *fontBuf; + int fontLen; + FoFiType1C *ffT1C; + int i; + + // check if font is already embedded + for (i = 0; i < t1FontNameLen; ++i) { + if (t1FontNames[i].fontFileID.num == id->num && + t1FontNames[i].fontFileID.gen == id->gen) { + psName->clear(); + psName->insert(0, t1FontNames[i].psName); + return; + } + } + if (t1FontNameLen == t1FontNameSize) { + t1FontNameSize *= 2; + t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize, + sizeof(PST1FontName)); + } + t1FontNames[t1FontNameLen].fontFileID = *id; + t1FontNames[t1FontNameLen].psName = psName->copy(); + ++t1FontNameLen; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 1 font + if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) { + if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) { + ffT1C->convertToType1(psName->getCString(), NULL, gTrue, + outputFunc, outputStream); + delete ffT1C; + } + gfree(fontBuf); + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupEmbeddedOpenTypeT1CFont(GfxFont *font, Ref *id, + GooString *psName) { + char *fontBuf; + int fontLen; + FoFiTrueType *ffTT; + int i; + + // check if font is already embedded + for (i = 0; i < t1FontNameLen; ++i) { + if (t1FontNames[i].fontFileID.num == id->num && + t1FontNames[i].fontFileID.gen == id->gen) { + psName->clear(); + psName->insert(0, t1FontNames[i].psName); + return; + } + } + if (t1FontNameLen == t1FontNameSize) { + t1FontNameSize *= 2; + t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize, + sizeof(PST1FontName)); + } + t1FontNames[t1FontNameLen].fontFileID = *id; + t1FontNames[t1FontNameLen].psName = psName->copy(); + ++t1FontNameLen; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 1 font + if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) { + if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) { + if (ffTT->isOpenTypeCFF()) { + ffTT->convertToType1(psName->getCString(), NULL, gTrue, + outputFunc, outputStream); + } + delete ffTT; + } + gfree(fontBuf); + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id, + GooString *psName) { + char *fontBuf; + int fontLen; + FoFiTrueType *ffTT; + int *codeToGID; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 42 font + if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) { + if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) { + codeToGID = ((Gfx8BitFont *)font)->getCodeToGIDMap(ffTT); + ffTT->convertToType42(psName->getCString(), + ((Gfx8BitFont *)font)->getHasEncoding() + ? ((Gfx8BitFont *)font)->getEncoding() + : (char **)NULL, + codeToGID, outputFunc, outputStream); + if (codeToGID) { + if (font8InfoLen >= font8InfoSize) { + font8InfoSize += 16; + font8Info = (PSFont8Info *)greallocn(font8Info, + font8InfoSize, + sizeof(PSFont8Info)); + } + font8Info[font8InfoLen].fontID = *font->getID(); + font8Info[font8InfoLen].codeToGID = codeToGID; + ++font8InfoLen; + } + delete ffTT; + } + gfree(fontBuf); + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupExternalTrueTypeFont(GfxFont *font, GooString *fileName, + GooString *psName) { + FoFiTrueType *ffTT; + int *codeToGID; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 42 font + if ((ffTT = FoFiTrueType::load(fileName->getCString()))) { + codeToGID = ((Gfx8BitFont *)font)->getCodeToGIDMap(ffTT); + ffTT->convertToType42(psName->getCString(), + ((Gfx8BitFont *)font)->getHasEncoding() + ? ((Gfx8BitFont *)font)->getEncoding() + : (char **)NULL, + codeToGID, outputFunc, outputStream); + if (codeToGID) { + if (font8InfoLen >= font8InfoSize) { + font8InfoSize += 16; + font8Info = (PSFont8Info *)greallocn(font8Info, + font8InfoSize, + sizeof(PSFont8Info)); + } + font8Info[font8InfoLen].fontID = *font->getID(); + font8Info[font8InfoLen].codeToGID = codeToGID; + ++font8InfoLen; + } + delete ffTT; + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupExternalCIDTrueTypeFont(GfxFont *font, + GooString *fileName, + GooString *psName, + GBool needVerticalMetrics) { + FoFiTrueType *ffTT; + int *codeToGID; + int codeToGIDLen; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 0 font + //~ this should use fontNum to load the correct font + if ((ffTT = FoFiTrueType::load(fileName->getCString()))) { + + // check for embedding permission + if (ffTT->getEmbeddingRights() >= 1) { + codeToGID = NULL; + codeToGIDLen = 0; + if (((GfxCIDFont *)font)->getCIDToGID()) { + codeToGIDLen = ((GfxCIDFont *)font)->getCIDToGIDLen(); + if (codeToGIDLen) { + codeToGID = (int *)gmallocn(codeToGIDLen, sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)font)->getCIDToGID(), + codeToGIDLen * sizeof(int)); + } + } else { + codeToGID = ((GfxCIDFont *)font)->getCodeToGIDMap(ffTT, &codeToGIDLen); + } + if (ffTT->isOpenTypeCFF()) { + ffTT->convertToCIDType0(psName->getCString(), + codeToGID, codeToGIDLen, + outputFunc, outputStream); + } else if (globalParams->getPSLevel() >= psLevel3) { + // Level 3: use a CID font + ffTT->convertToCIDType2(psName->getCString(), + codeToGID, codeToGIDLen, + needVerticalMetrics, + outputFunc, outputStream); + } else { + // otherwise: use a non-CID composite font + ffTT->convertToType0(psName->getCString(), + codeToGID, codeToGIDLen, + needVerticalMetrics, + outputFunc, outputStream); + } + gfree(codeToGID); + } else { + error(errSyntaxError, -1, + "TrueType font '%s' does not allow embedding", + font->getName() ? font->getName()->getCString() : "(unnamed)"); + + } + delete ffTT; + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupEmbeddedCIDType0Font(GfxFont *font, Ref *id, + GooString *psName) { + char *fontBuf; + int fontLen; + FoFiType1C *ffT1C; + int i; + + // check if font is already embedded + for (i = 0; i < t1FontNameLen; ++i) { + if (t1FontNames[i].fontFileID.num == id->num && + t1FontNames[i].fontFileID.gen == id->gen) { + psName->clear(); + psName->insert(0, t1FontNames[i].psName); + return; + } + } + if (t1FontNameLen == t1FontNameSize) { + t1FontNameSize *= 2; + t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize, + sizeof(PST1FontName)); + } + t1FontNames[t1FontNameLen].fontFileID = *id; + t1FontNames[t1FontNameLen].psName = psName->copy(); + ++t1FontNameLen; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 0 font + if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) { + if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) { + if (globalParams->getPSLevel() >= psLevel3) { + // Level 3: use a CID font + ffT1C->convertToCIDType0(psName->getCString(), NULL, 0, + outputFunc, outputStream); + } else { + // otherwise: use a non-CID composite font + ffT1C->convertToType0(psName->getCString(), NULL, 0, + outputFunc, outputStream); + } + delete ffT1C; + } + gfree(fontBuf); + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, + GooString *psName, + GBool needVerticalMetrics) { + char *fontBuf; + int fontLen; + FoFiTrueType *ffTT; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 0 font + if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) { + if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) { + if (globalParams->getPSLevel() >= psLevel3) { + // Level 3: use a CID font + ffTT->convertToCIDType2(psName->getCString(), + ((GfxCIDFont *)font)->getCIDToGID(), + ((GfxCIDFont *)font)->getCIDToGIDLen(), + needVerticalMetrics, + outputFunc, outputStream); + } else { + // otherwise: use a non-CID composite font + ffTT->convertToType0(psName->getCString(), + ((GfxCIDFont *)font)->getCIDToGID(), + ((GfxCIDFont *)font)->getCIDToGIDLen(), + needVerticalMetrics, + outputFunc, outputStream); + } + delete ffTT; + } + gfree(fontBuf); + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupEmbeddedOpenTypeCFFFont(GfxFont *font, Ref *id, + GooString *psName) { + char *fontBuf; + int fontLen; + FoFiTrueType *ffTT; + int i; + + // check if font is already embedded + for (i = 0; i < t1FontNameLen; ++i) { + if (t1FontNames[i].fontFileID.num == id->num && + t1FontNames[i].fontFileID.gen == id->gen) { + psName->clear(); + psName->insert(0, t1FontNames[i].psName); + return; + } + } + if (t1FontNameLen == t1FontNameSize) { + t1FontNameSize *= 2; + t1FontNames = (PST1FontName *)greallocn(t1FontNames, t1FontNameSize, + sizeof(PST1FontName)); + } + t1FontNames[t1FontNameLen].fontFileID = *id; + t1FontNames[t1FontNameLen].psName = psName->copy(); + ++t1FontNameLen; + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // convert it to a Type 0 font + if ((fontBuf = font->readEmbFontFile(xref, &fontLen))) { + if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) { + if (ffTT->isOpenTypeCFF()) { + if (globalParams->getPSLevel() >= psLevel3) { + // Level 3: use a CID font + ffTT->convertToCIDType0(psName->getCString(), + ((GfxCIDFont *)font)->getCIDToGID(), + ((GfxCIDFont *)font)->getCIDToGIDLen(), + outputFunc, outputStream); + } else { + // otherwise: use a non-CID composite font + ffTT->convertToType0(psName->getCString(), + ((GfxCIDFont *)font)->getCIDToGID(), + ((GfxCIDFont *)font)->getCIDToGIDLen(), + outputFunc, outputStream); + } + } + delete ffTT; + } + gfree(fontBuf); + } + + // ending comment + writePS("%%EndResource\n"); +} + +void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName, + Dict *parentResDict) { + Dict *resDict; + Dict *charProcs; + Object charProc; + Gfx *gfx; + PDFRectangle box; + double *m; + GooString *buf; + int i; + + // set up resources used by font + if ((resDict = ((Gfx8BitFont *)font)->getResources())) { + inType3Char = gTrue; + setupResources(resDict); + inType3Char = gFalse; + } else { + resDict = parentResDict; + } + + // beginning comment + writePSFmt("%%BeginResource: font {0:t}\n", psName); + embFontList->append("%%+ font "); + embFontList->append(psName->getCString()); + embFontList->append("\n"); + + // font dictionary + writePS("8 dict begin\n"); + writePS("/FontType 3 def\n"); + m = font->getFontMatrix(); + writePSFmt("/FontMatrix [{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] def\n", + m[0], m[1], m[2], m[3], m[4], m[5]); + m = font->getFontBBox(); + writePSFmt("/FontBBox [{0:.6g} {1:.6g} {2:.6g} {3:.6g}] def\n", + m[0], m[1], m[2], m[3]); + writePS("/Encoding 256 array def\n"); + writePS(" 0 1 255 { Encoding exch /.notdef put } for\n"); + writePS("/BuildGlyph {\n"); + writePS(" exch /CharProcs get exch\n"); + writePS(" 2 copy known not { pop /.notdef } if\n"); + writePS(" get exec\n"); + writePS("} bind def\n"); + writePS("/BuildChar {\n"); + writePS(" 1 index /Encoding get exch get\n"); + writePS(" 1 index /BuildGlyph get exec\n"); + writePS("} bind def\n"); + if ((charProcs = ((Gfx8BitFont *)font)->getCharProcs())) { + writePSFmt("/CharProcs {0:d} dict def\n", charProcs->getLength()); + writePS("CharProcs begin\n"); + box.x1 = m[0]; + box.y1 = m[1]; + box.x2 = m[2]; + box.y2 = m[3]; + gfx = new Gfx(doc, this, resDict, &box, NULL); + inType3Char = gTrue; + for (i = 0; i < charProcs->getLength(); ++i) { + t3FillColorOnly = gFalse; + t3Cacheable = gFalse; + t3NeedsRestore = gFalse; + writePS("/"); + writePSName(charProcs->getKey(i)); + writePS(" {\n"); + gfx->display(charProcs->getVal(i, &charProc)); + charProc.free(); + if (t3String) { + if (t3Cacheable) { + buf = GooString::format("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} setcachedevice\n", + t3WX, t3WY, t3LLX, t3LLY, t3URX, t3URY); + } else { + buf = GooString::format("{0:.6g} {1:.6g} setcharwidth\n", t3WX, t3WY); + } + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, t3String->getCString(), + t3String->getLength()); + delete t3String; + t3String = NULL; + } + if (t3NeedsRestore) { + (*outputFunc)(outputStream, "Q\n", 2); + } + writePS("} def\n"); + } + inType3Char = gFalse; + delete gfx; + writePS("end\n"); + } + writePS("currentdict end\n"); + writePSFmt("/{0:t} exch definefont pop\n", psName); + + // ending comment + writePS("%%EndResource\n"); +} + +// Make a unique PS font name, based on the names given in the PDF +// font object, and an object ID (font file object for +GooString *PSOutputDev::makePSFontName(GfxFont *font, Ref *id) { + GooString *psName, *s; + + if ((s = font->getEmbeddedFontName())) { + psName = filterPSName(s); + if (!fontNames->lookupInt(psName)) { + fontNames->add(psName->copy(), 1); + return psName; + } + delete psName; + } + if ((s = font->getName())) { + psName = filterPSName(s); + if (!fontNames->lookupInt(psName)) { + fontNames->add(psName->copy(), 1); + return psName; + } + delete psName; + } + psName = GooString::format("FF{0:d}_{1:d}", id->num, id->gen); + if ((s = font->getEmbeddedFontName())) { + s = filterPSName(s); + psName->append('_')->append(s); + delete s; + } else if ((s = font->getName())) { + s = filterPSName(s); + psName->append('_')->append(s); + delete s; + } + fontNames->add(psName->copy(), 1); + return psName; +} + +void PSOutputDev::setupImages(Dict *resDict) { + Object xObjDict, xObj, xObjRef, subtypeObj, maskObj, maskRef; + Ref imgID; + int i, j; + + if (!(mode == psModeForm || inType3Char || preload)) { + return; + } + + //----- recursively scan XObjects + resDict->lookup("XObject", &xObjDict); + if (xObjDict.isDict()) { + for (i = 0; i < xObjDict.dictGetLength(); ++i) { + xObjDict.dictGetValNF(i, &xObjRef); + xObjDict.dictGetVal(i, &xObj); + if (xObj.isStream()) { + xObj.streamGetDict()->lookup("Subtype", &subtypeObj); + if (subtypeObj.isName("Image")) { + if (xObjRef.isRef()) { + imgID = xObjRef.getRef(); + for (j = 0; j < imgIDLen; ++j) { + if (imgIDs[j].num == imgID.num && imgIDs[j].gen == imgID.gen) { + break; + } + } + if (j == imgIDLen) { + if (imgIDLen >= imgIDSize) { + if (imgIDSize == 0) { + imgIDSize = 64; + } else { + imgIDSize *= 2; + } + imgIDs = (Ref *)greallocn(imgIDs, imgIDSize, sizeof(Ref)); + } + imgIDs[imgIDLen++] = imgID; + setupImage(imgID, xObj.getStream(), gFalse); + if (level >= psLevel3 && + xObj.streamGetDict()->lookup("Mask", &maskObj)->isStream()) { + setupImage(imgID, maskObj.getStream(), gTrue); + } + maskObj.free(); + } + } else { + error(errSyntaxError, -1, + "Image in resource dict is not an indirect reference"); + } + } + subtypeObj.free(); + } + xObj.free(); + xObjRef.free(); + } + } + xObjDict.free(); +} + +void PSOutputDev::setupImage(Ref id, Stream *str, GBool mask) { + GBool useRLE, useCompressed, useASCIIHex; + GooString *s; + int c; + int size, line, col, i; + int outerSize, outer; + + // filters + //~ this does not correctly handle the DeviceN color space + //~ -- need to use DeviceNRecoder + if (level < psLevel2) { + useRLE = gFalse; + useCompressed = gFalse; + useASCIIHex = gTrue; + } else { + if (globalParams->getPSUncompressPreloadedImages()) { + useRLE = gFalse; + useCompressed = gFalse; + } else { + s = str->getPSFilter(level < psLevel3 ? 2 : 3, ""); + if (s) { + useRLE = gFalse; + useCompressed = gTrue; + delete s; + } else { + useRLE = gTrue; + useCompressed = gFalse; + } + } + useASCIIHex = globalParams->getPSASCIIHex(); + } + if (useCompressed) { + str = str->getUndecodedStream(); + } + if (useRLE) { + str = new RunLengthEncoder(str); + } + if (useASCIIHex) { + str = new ASCIIHexEncoder(str); + } else { + str = new ASCII85Encoder(str); + } + + // compute image data size + str->reset(); + col = size = 0; + do { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + if (c == 'z') { + ++col; + } else { + ++col; + for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + ++col; + } + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + } + if (col > 225) { + ++size; + col = 0; + } + } while (c != (useASCIIHex ? '>' : '~') && c != EOF); + // add one entry for the final line of data; add another entry + // because the RunLengthDecode filter may read past the end + ++size; + if (useRLE) { + ++size; + } + outerSize = size/65535 + 1; + + writePSFmt("{0:d} array dup /{1:s}Data_{2:d}_{3:d} exch def\n", + outerSize, mask ? "Mask" : "Im", id.num, id.gen); + str->close(); + + // write the data into the array + str->reset(); + for (outer = 0;outer < outerSize;outer++) { + int innerSize = size > 65535 ? 65535 : size; + + // put the inner array into the outer array + writePSFmt("{0:d} array 1 index {1:d} 2 index put\n", + innerSize, outer); + line = col = 0; + writePS((char *)(useASCIIHex ? "dup 0 <" : "dup 0 <~")); + for (;;) { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + if (c == 'z') { + writePSChar(c); + ++col; + } else { + writePSChar(c); + ++col; + for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + writePSChar(c); + ++col; + } + } + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + // each line is: "dup nnnnn <~...data...~> put" + // so max data length = 255 - 20 = 235 + // chunks are 1 or 4 bytes each, so we have to stop at 232 + // but make it 225 just to be safe + if (col > 225) { + writePS((char *)(useASCIIHex ? "> put\n" : "~> put\n")); + ++line; + if (line >= innerSize) break; + writePSFmt((char *)(useASCIIHex ? "dup {0:d} <" : "dup {0:d} <~"), line); + col = 0; + } + } + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + writePS((char *)(useASCIIHex ? "> put\n" : "~> put\n")); + if (useRLE) { + ++line; + writePSFmt("{0:d} <> put\n", line); + } else { + writePS("pop\n"); + } + break; + } + writePS("pop\n"); + size -= innerSize; + } + writePS("pop\n"); + str->close(); + + delete str; +} + +void PSOutputDev::setupForms(Dict *resDict) { + Object xObjDict, xObj, xObjRef, subtypeObj; + int i; + + if (!preload) { + return; + } + + resDict->lookup("XObject", &xObjDict); + if (xObjDict.isDict()) { + for (i = 0; i < xObjDict.dictGetLength(); ++i) { + xObjDict.dictGetValNF(i, &xObjRef); + xObjDict.dictGetVal(i, &xObj); + if (xObj.isStream()) { + xObj.streamGetDict()->lookup("Subtype", &subtypeObj); + if (subtypeObj.isName("Form")) { + if (xObjRef.isRef()) { + setupForm(xObjRef.getRef(), &xObj); + } else { + error(errSyntaxError, -1, + "Form in resource dict is not an indirect reference"); + } + } + subtypeObj.free(); + } + xObj.free(); + xObjRef.free(); + } + } + xObjDict.free(); +} + +void PSOutputDev::setupForm(Ref id, Object *strObj) { + Dict *dict, *resDict; + Object matrixObj, bboxObj, resObj, obj1; + double m[6], bbox[4]; + PDFRectangle box; + Gfx *gfx; + int i; + + // check if form is already defined + for (i = 0; i < formIDLen; ++i) { + if (formIDs[i].num == id.num && formIDs[i].gen == id.gen) { + return; + } + } + + // add entry to formIDs list + if (formIDLen >= formIDSize) { + if (formIDSize == 0) { + formIDSize = 64; + } else { + formIDSize *= 2; + } + formIDs = (Ref *)greallocn(formIDs, formIDSize, sizeof(Ref)); + } + formIDs[formIDLen++] = id; + + dict = strObj->streamGetDict(); + + // get bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + bboxObj.free(); + error(errSyntaxError, -1, "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + bbox[i] = obj1.getNum(); + obj1.free(); + } + bboxObj.free(); + + // get matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray()) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + m[i] = obj1.getNum(); + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // get resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; + + writePSFmt("/f_{0:d}_{1:d} {{\n", id.num, id.gen); + writePS("q\n"); + writePSFmt("[{0:.6gs} {1:.6gs} {2:.6gs} {3:.6gs} {4:.6gs} {5:.6gs}] cm\n", + m[0], m[1], m[2], m[3], m[4], m[5]); + + box.x1 = bbox[0]; + box.y1 = bbox[1]; + box.x2 = bbox[2]; + box.y2 = bbox[3]; + gfx = new Gfx(doc, this, resDict, &box, &box); + gfx->display(strObj); + delete gfx; + + writePS("Q\n"); + writePS("} def\n"); + + resObj.free(); +} + +GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, + int rotateA, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, + int sliceW, int sliceH, + GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data), + void *annotDisplayDecideCbkData) { + PreScanOutputDev *scan; + GBool rasterize; +#if HAVE_SPLASH + GBool mono; + double dpi; + SplashOutputDev *splashOut; + SplashColor paperColor; + PDFRectangle box; + GfxState *state; + SplashBitmap *bitmap; + Stream *str0, *str; + Object obj; + Guchar *p; + Guchar col[4]; + double hDPI2, vDPI2; + double m0, m1, m2, m3, m4, m5; + int nStripes, stripeH, stripeY; + int c, w, h, x, y, comp, i; + int numComps, initialNumComps; +#endif + char hexBuf[32*2 + 2]; // 32 values X 2 chars/value + line ending + null + Guchar digit; + GBool useBinary; + GBool isGray; + + if (forceRasterize) { + rasterize = gTrue; + } else { + scan = new PreScanOutputDev(doc); + page->displaySlice(scan, 72, 72, rotateA, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData); + rasterize = scan->usesTransparency() || scan->usesPatternImageMask(); + delete scan; + } + if (!rasterize) { + return gTrue; + } + +#if HAVE_SPLASH + // get the rasterization parameters + dpi = globalParams->getPSRasterResolution(); + mono = globalParams->getPSRasterMono(); + + // start the PS page + page->makeBox(dpi, dpi, rotateA, useMediaBox, gFalse, + sliceX, sliceY, sliceW, sliceH, &box, &crop); + rotateA += page->getRotate(); + if (rotateA >= 360) { + rotateA -= 360; + } else if (rotateA < 0) { + rotateA += 360; + } + state = new GfxState(dpi, dpi, &box, rotateA, gFalse); + startPage(page->getNum(), state); + delete state; + + // set up the SplashOutputDev + if (mono || level == psLevel1) { + numComps = 1; + paperColor[0] = 0xff; + splashOut = new SplashOutputDev(splashModeMono8, 1, gFalse, + paperColor, gFalse, + globalParams->getAntialiasPrinting()); +#if SPLASH_CMYK + } else if (level == psLevel1Sep || level == psLevel2Sep || + level == psLevel3Sep || globalParams->getOverprintPreview()) { + numComps = 4; + paperColor[0] = paperColor[1] = paperColor[2] = paperColor[3] = 0; + splashOut = new SplashOutputDev(splashModeCMYK8, 1, gFalse, + paperColor, gFalse, + globalParams->getAntialiasPrinting()); +#endif + } else { + numComps = 3; + paperColor[0] = paperColor[1] = paperColor[2] = 0xff; + splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse, + paperColor, gFalse, + globalParams->getAntialiasPrinting()); + } + splashOut->startDoc(doc); + + // break the page into stripes + hDPI2 = xScale * dpi; + vDPI2 = yScale * dpi; + if (sliceW < 0 || sliceH < 0) { + if (useMediaBox) { + box = *page->getMediaBox(); + } else { + box = *page->getCropBox(); + } + sliceX = sliceY = 0; + sliceW = (int)((box.x2 - box.x1) * hDPI2 / 72.0); + sliceH = (int)((box.y2 - box.y1) * vDPI2 / 72.0); + } + nStripes = (int)ceil((double)(sliceW * sliceH) / + (double)rasterizationSliceSize); + stripeH = (sliceH + nStripes - 1) / nStripes; + + // render the stripes + initialNumComps = numComps; + for (stripeY = sliceY; stripeY < sliceH; stripeY += stripeH) { + + // rasterize a stripe + page->makeBox(hDPI2, vDPI2, 0, useMediaBox, gFalse, + sliceX, stripeY, sliceW, stripeH, &box, &crop); + m0 = box.x2 - box.x1; + m1 = 0; + m2 = 0; + m3 = box.y2 - box.y1; + m4 = box.x1; + m5 = box.y1; + page->displaySlice(splashOut, hDPI2, vDPI2, + (360 - page->getRotate()) % 360, useMediaBox, crop, + sliceX, stripeY, sliceW, stripeH, + printing, abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData); + + // draw the rasterized image + bitmap = splashOut->getBitmap(); + numComps = initialNumComps; + w = bitmap->getWidth(); + h = bitmap->getHeight(); + writePS("gsave\n"); + writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] concat\n", + m0, m1, m2, m3, m4, m5); + switch (level) { + case psLevel1: + useBinary = globalParams->getPSBinary(); + writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1{5:s}\n", + w, h, w, -h, h, + useBinary ? "Bin" : ""); + p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize(); + i = 0; + if (useBinary) { + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + hexBuf[i++] = *p++; + if (i >= 64) { + writePSBuf(hexBuf, i); + i = 0; + } + } + } + } else { + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + digit = *p / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + digit = *p++ % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + if (i >= 64) { + hexBuf[i++] = '\n'; + writePSBuf(hexBuf, i); + i = 0; + } + } + } + } + if (i != 0) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + } + break; + case psLevel1Sep: + useBinary = globalParams->getPSBinary(); + p = bitmap->getDataPtr(); + // Check for an all gray image + isGray = gTrue; + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + if (p[4*x] != p[4*x + 1] || p[4*x] != p[4*x + 2]) { + isGray = gFalse; + y = h; + break; + } + } + p += bitmap->getRowSize(); + } + writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1{5:s}{6:s}\n", + w, h, w, -h, h, + isGray ? "" : "Sep", + useBinary ? "Bin" : ""); + p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize(); + i = 0; + col[0] = col[1] = col[2] = col[3] = 0; + if (isGray) { + int g; + if ((psProcessBlack & processColors) == 0) { + // Check if the image uses black + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + if (p[4*x] > 0 || p[4*x + 3] > 0) { + col[3] = 1; + y = h; + break; + } + } + p -= bitmap->getRowSize(); + } + p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize(); + } + for (y = 0; y < h; ++y) { + if (useBinary) { + // Binary gray image + for (x = 0; x < w; ++x) { + g = p[4*x] + p[4*x + 3]; + g = 255 - g; + if (g < 0) g = 0; + hexBuf[i++] = (Guchar) g; + if (i >= 64) { + writePSBuf(hexBuf, i); + i = 0; + } + } + } else { + // Hex gray image + for (x = 0; x < w; ++x) { + g = p[4*x] + p[4*x + 3]; + g = 255 - g; + if (g < 0) g = 0; + digit = g / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + digit = g % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + if (i >= 64) { + hexBuf[i++] = '\n'; + writePSBuf(hexBuf, i); + i = 0; + } + } + } + p -= bitmap->getRowSize(); + } + } else if (((psProcessCyan | psProcessMagenta | psProcessYellow | psProcessBlack) & ~processColors) != 0) { + // Color image, need to check color flags for each dot + for (y = 0; y < h; ++y) { + for (comp = 0; comp < 4; ++comp) { + if (useBinary) { + // Binary color image + for (x = 0; x < w; ++x) { + col[comp] |= p[4*x + comp]; + hexBuf[i++] = p[4*x + comp]; + if (i >= 64) { + writePSBuf(hexBuf, i); + i = 0; + } + } + } else { + // Gray color image + for (x = 0; x < w; ++x) { + col[comp] |= p[4*x + comp]; + digit = p[4*x + comp] / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + digit = p[4*x + comp] % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + if (i >= 64) { + hexBuf[i++] = '\n'; + writePSBuf(hexBuf, i); + i = 0; + } + } + } + } + p -= bitmap->getRowSize(); + } + } else { + // Color image, do not need to check color flags + for (y = 0; y < h; ++y) { + for (comp = 0; comp < 4; ++comp) { + if (useBinary) { + // Binary color image + for (x = 0; x < w; ++x) { + hexBuf[i++] = p[4*x + comp]; + if (i >= 64) { + writePSBuf(hexBuf, i); + i = 0; + } + } + } else { + // Hex color image + for (x = 0; x < w; ++x) { + digit = p[4*x + comp] / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + digit = p[4*x + comp] % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + if (i >= 64) { + hexBuf[i++] = '\n'; + writePSBuf(hexBuf, i); + i = 0; + } + } + } + } + p -= bitmap->getRowSize(); + } + } + if (i != 0) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + } + if (col[0]) { + processColors |= psProcessCyan; + } + if (col[1]) { + processColors |= psProcessMagenta; + } + if (col[2]) { + processColors |= psProcessYellow; + } + if (col[3]) { + processColors |= psProcessBlack; + } + break; + case psLevel2: + case psLevel2Sep: + case psLevel3: + case psLevel3Sep: + obj.initNull(); + p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize(); + str0 = new MemStream((char *)p, 0, w * h * numComps, &obj); + // Check for a color image that uses only gray + if (numComps == 4) { + int compCyan; + isGray = gTrue; + while ((compCyan = str0->getChar()) != EOF) { + if (str0->getChar() != compCyan || + str0->getChar() != compCyan) { + isGray = gFalse; + break; + } + str0->getChar(); + } + } else if (numComps == 3) { + int compRed; + isGray = gTrue; + while ((compRed = str0->getChar()) != EOF) { + if (str0->getChar() != compRed || + str0->getChar() != compRed) { + isGray = gFalse; + break; + } + } + } else { + isGray = gFalse; + } + str0->reset(); + if (isGray && numComps == 4) { + str = new RunLengthEncoder(new CMYKGrayEncoder(str0)); + numComps = 1; + } else if (isGray && numComps == 3) { + str = new RunLengthEncoder(new RGBGrayEncoder(str0)); + numComps = 1; + } else { + str = new RunLengthEncoder(str0); + } + if (numComps == 1) { + writePS("/DeviceGray setcolorspace\n"); + } else if (numComps == 3) { + writePS("/DeviceRGB setcolorspace\n"); + } else { + writePS("/DeviceCMYK setcolorspace\n"); + } + writePS("<<\n /ImageType 1\n"); + writePSFmt(" /Width {0:d}\n", bitmap->getWidth()); + writePSFmt(" /Height {0:d}\n", bitmap->getHeight()); + writePSFmt(" /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n", w, -h, h); + writePS(" /BitsPerComponent 8\n"); + if (numComps == 1) { + writePS(" /Decode [1 0]\n"); + } else if (numComps == 3) { + writePS(" /Decode [0 1 0 1 0 1]\n"); + } else { + writePS(" /Decode [0 1 0 1 0 1 0 1]\n"); + } + writePS(" /DataSource currentfile\n"); + useBinary = globalParams->getPSBinary(); + if (useBinary) { + /* nothing to do */; + } else if (globalParams->getPSASCIIHex()) { + writePS(" /ASCIIHexDecode filter\n"); + } else { + writePS(" /ASCII85Decode filter\n"); + } + writePS(" /RunLengthDecode filter\n"); + writePS(">>\n"); + if (useBinary) { + /* nothing to do */; + } else if (globalParams->getPSASCIIHex()) { + str = new ASCIIHexEncoder(str); + } else { + str = new ASCII85Encoder(str); + } + str->reset(); + if (useBinary) { + // Count the bytes to write a document comment + int len = 0; + while (str->getChar() != EOF) { + len++; + } + str->reset(); + writePSFmt("%%BeginData: {0:d} Binary Bytes\n", len+6+1); + } + writePS("image\n"); + while ((c = str->getChar()) != EOF) { + writePSChar(c); + } + str->close(); + delete str; + delete str0; + writePSChar('\n'); + if (useBinary) { + writePS("%%EndData\n"); + } + processColors |= (numComps == 1) ? psProcessBlack : psProcessCMYK; + break; + } + writePS("grestore\n"); + } + + delete splashOut; + + // finish the PS page + endPage(); + + return gFalse; + +#else // HAVE_SPLASH + + error(errSyntaxWarning, -1, + "PDF page uses transparency and PSOutputDev was built without" + " the Splash rasterizer - output may not be correct"); + return gTrue; +#endif // HAVE_SPLASH +} + +void PSOutputDev::startPage(int pageNum, GfxState *state) { + Page *page; + int x1, y1, x2, y2, width, height, t; + int imgWidth, imgHeight, imgWidth2, imgHeight2; + GBool landscape; + GooString *s; + + + if (mode == psModePS || mode == psModePSOrigPageSizes) { + GooString pageLabel; + const GBool gotLabel = doc->getCatalog()->indexToLabel(pageNum -1, &pageLabel); + if (gotLabel) { + // See bug13338 for why we try to avoid parentheses... + GBool needParens; + GooString *filteredString = filterPSLabel(&pageLabel, &needParens); + if (needParens) { + writePSFmt("%%Page: ({0:t}) {1:d}\n", filteredString, seqPage); + } else { + writePSFmt("%%Page: {0:t} {1:d}\n", filteredString, seqPage); + } + delete filteredString; + } else { + writePSFmt("%%Page: {0:d} {1:d}\n", pageNum, seqPage); + } + if (paperMatch) { + page = doc->getCatalog()->getPage(pageNum); + imgLLX = imgLLY = 0; + imgURX = (int)ceil(page->getMediaWidth()); + imgURY = (int)ceil(page->getMediaHeight()); + if (state->getRotate() == 90 || state->getRotate() == 270) { + t = imgURX; + imgURX = imgURY; + imgURY = t; + } + writePSFmt("%%PageMedia: {0:d}x{1:d}\n", imgURX, imgURY); + writePSFmt("%%PageBoundingBox: 0 0 {0:d} {1:d}\n", imgURX, imgURY); + } + if (mode != psModePSOrigPageSizes) + writePS("%%BeginPageSetup\n"); + } + + // underlays + if (underlayCbk) { + (*underlayCbk)(this, underlayCbkData); + } + if (overlayCbk) { + saveState(NULL); + } + + xScale = yScale = 1; + switch (mode) { + + case psModePSOrigPageSizes: + x1 = (int)floor(state->getX1()); + y1 = (int)floor(state->getY1()); + x2 = (int)ceil(state->getX2()); + y2 = (int)ceil(state->getY2()); + width = x2 - x1; + height = y2 - y1; + if (width > height) { + landscape = gTrue; + } else { + landscape = gFalse; + } + writePSFmt("%%PageBoundingBox: {0:d} {1:d} {2:d} {3:d}\n", x1, y1, x2 - x1, y2 - y1); + writePS("%%BeginPageSetup\n"); + writePSFmt("%%PageOrientation: {0:s}\n", + landscape ? "Landscape" : "Portrait"); + if ((width != prevWidth) || (height != prevHeight)) { + // Set page size only when it actually changes, as otherwise Duplex + // printing does not work + writePSFmt("<> setpagedevice\n", width, height); + prevWidth = width; + prevHeight = height; + } + writePS("pdfStartPage\n"); + writePSFmt("{0:d} {1:d} {2:d} {3:d} re W\n", x1, y1, x2 - x1, y2 - y1); + writePS("%%EndPageSetup\n"); + ++seqPage; + break; + + case psModePS: + // rotate, translate, and scale page + imgWidth = imgURX - imgLLX; + imgHeight = imgURY - imgLLY; + x1 = (int)floor(state->getX1()); + y1 = (int)floor(state->getY1()); + x2 = (int)ceil(state->getX2()); + y2 = (int)ceil(state->getY2()); + width = x2 - x1; + height = y2 - y1; + tx = ty = 0; + // rotation and portrait/landscape mode + if (paperMatch) { + rotate = (360 - state->getRotate()) % 360; + landscape = gFalse; + } else if (rotate0 >= 0) { + rotate = (360 - rotate0) % 360; + landscape = gFalse; + } else { + rotate = (360 - state->getRotate()) % 360; + if (rotate == 0 || rotate == 180) { + if ((width < height && imgWidth > imgHeight && height > imgHeight) || + (width > height && imgWidth < imgHeight && width > imgWidth)) { + rotate += 90; + landscape = gTrue; + } else { + landscape = gFalse; + } + } else { // rotate == 90 || rotate == 270 + if ((height < width && imgWidth > imgHeight && width > imgHeight) || + (height > width && imgWidth < imgHeight && height > imgWidth)) { + rotate = 270 - rotate; + landscape = gTrue; + } else { + landscape = gFalse; + } + } + } + writePSFmt("%%PageOrientation: {0:s}\n", + landscape ? "Landscape" : "Portrait"); + if (paperMatch) { + writePSFmt("{0:d} {1:d} pdfSetupPaper\n", imgURX, imgURY); + } + writePS("pdfStartPage\n"); + if (rotate == 0) { + imgWidth2 = imgWidth; + imgHeight2 = imgHeight; + } else if (rotate == 90) { + writePS("90 rotate\n"); + ty = -imgWidth; + imgWidth2 = imgHeight; + imgHeight2 = imgWidth; + } else if (rotate == 180) { + writePS("180 rotate\n"); + imgWidth2 = imgWidth; + imgHeight2 = imgHeight; + tx = -imgWidth; + ty = -imgHeight; + } else { // rotate == 270 + writePS("270 rotate\n"); + tx = -imgHeight; + imgWidth2 = imgHeight; + imgHeight2 = imgWidth; + } + // shrink or expand + if (xScale0 > 0 && yScale0 > 0) { + xScale = xScale0; + yScale = yScale0; + } else if ((globalParams->getPSShrinkLarger() && + (width > imgWidth2 || height > imgHeight2)) || + (globalParams->getPSExpandSmaller() && + (width < imgWidth2 && height < imgHeight2))) { + xScale = (double)imgWidth2 / (double)width; + yScale = (double)imgHeight2 / (double)height; + if (yScale < xScale) { + xScale = yScale; + } else { + yScale = xScale; + } + } + // deal with odd bounding boxes or clipping + if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) { + tx -= xScale * clipLLX0; + ty -= yScale * clipLLY0; + } else { + tx -= xScale * x1; + ty -= yScale * y1; + } + // center + if (tx0 >= 0 && ty0 >= 0) { + tx += (rotate == 0 || rotate == 180) ? tx0 : ty0; + ty += (rotate == 0 || rotate == 180) ? ty0 : -tx0; + } else if (globalParams->getPSCenter()) { + if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) { + tx += (imgWidth2 - xScale * (clipURX0 - clipLLX0)) / 2; + ty += (imgHeight2 - yScale * (clipURY0 - clipLLY0)) / 2; + } else { + tx += (imgWidth2 - xScale * width) / 2; + ty += (imgHeight2 - yScale * height) / 2; + } + } + tx += (rotate == 0 || rotate == 180) ? imgLLX : imgLLY; + ty += (rotate == 0 || rotate == 180) ? imgLLY : -imgLLX; + if (tx != 0 || ty != 0) { + writePSFmt("{0:.6g} {1:.6g} translate\n", tx, ty); + } + if (xScale != 1 || yScale != 1) { + writePSFmt("{0:.6f} {1:.6f} scale\n", xScale, yScale); + } + if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) { + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re W\n", + clipLLX0, clipLLY0, clipURX0 - clipLLX0, clipURY0 - clipLLY0); + } else { + writePSFmt("{0:d} {1:d} {2:d} {3:d} re W\n", x1, y1, x2 - x1, y2 - y1); + } + + ++seqPage; + break; + + case psModeEPS: + writePS("pdfStartPage\n"); + tx = ty = 0; + rotate = (360 - state->getRotate()) % 360; + if (rotate == 0) { + } else if (rotate == 90) { + writePS("90 rotate\n"); + tx = -epsX1; + ty = -epsY2; + } else if (rotate == 180) { + writePS("180 rotate\n"); + tx = -(epsX1 + epsX2); + ty = -(epsY1 + epsY2); + } else { // rotate == 270 + writePS("270 rotate\n"); + tx = -epsX2; + ty = -epsY1; + } + if (tx != 0 || ty != 0) { + writePSFmt("{0:.6g} {1:.6g} translate\n", tx, ty); + } + break; + + case psModeForm: + writePS("/PaintProc {\n"); + writePS("begin xpdf begin\n"); + writePS("pdfStartPage\n"); + tx = ty = 0; + rotate = 0; + break; + } + + if (customCodeCbk) { + if ((s = (*customCodeCbk)(this, psOutCustomPageSetup, pageNum, + customCodeCbkData))) { + writePS(s->getCString()); + delete s; + } + } + + if (mode == psModePS) { + writePS("%%EndPageSetup\n"); + } +} + +void PSOutputDev::endPage() { + if (overlayCbk) { + restoreState(NULL); + (*overlayCbk)(this, overlayCbkData); + } + + + if (mode == psModeForm) { + writePS("pdfEndPage\n"); + writePS("end end\n"); + writePS("} def\n"); + writePS("end end\n"); + } else { + if (!manualCtrl) { + writePS("showpage\n"); + } + writePS("%%PageTrailer\n"); + writePageTrailer(); + } +} + +void PSOutputDev::saveState(GfxState *state) { + writePS("q\n"); + ++numSaves; +} + +void PSOutputDev::restoreState(GfxState *state) { + writePS("Q\n"); + --numSaves; +} + +void PSOutputDev::updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32) { + writePSFmt("[{0:.6gs} {1:.6gs} {2:.6gs} {3:.6gs} {4:.6gs} {5:.6gs}] cm\n", + m11, m12, m21, m22, m31, m32); +} + +void PSOutputDev::updateLineDash(GfxState *state) { + double *dash; + double start; + int length, i; + + state->getLineDash(&dash, &length, &start); + writePS("["); + for (i = 0; i < length; ++i) { + writePSFmt("{0:.6g}{1:w}", + dash[i] < 0 ? 0 : dash[i], + (i == length-1) ? 0 : 1); + } + writePSFmt("] {0:.6g} d\n", start); +} + +void PSOutputDev::updateFlatness(GfxState *state) { + writePSFmt("{0:d} i\n", state->getFlatness()); +} + +void PSOutputDev::updateLineJoin(GfxState *state) { + writePSFmt("{0:d} j\n", state->getLineJoin()); +} + +void PSOutputDev::updateLineCap(GfxState *state) { + writePSFmt("{0:d} J\n", state->getLineCap()); +} + +void PSOutputDev::updateMiterLimit(GfxState *state) { + writePSFmt("{0:.6g} M\n", state->getMiterLimit()); +} + +void PSOutputDev::updateLineWidth(GfxState *state) { + writePSFmt("{0:.6g} w\n", state->getLineWidth()); +} + +void PSOutputDev::updateFillColorSpace(GfxState *state) { + if (inUncoloredPattern) { + return; + } + switch (level) { + case psLevel1: + case psLevel1Sep: + break; + case psLevel2: + case psLevel3: + if (state->getFillColorSpace()->getMode() != csPattern) { + dumpColorSpaceL2(state->getFillColorSpace(), gTrue, gFalse, gFalse); + writePS(" cs\n"); + } + break; + case psLevel2Sep: + case psLevel3Sep: + break; + } +} + +void PSOutputDev::updateStrokeColorSpace(GfxState *state) { + if (inUncoloredPattern) { + return; + } + switch (level) { + case psLevel1: + case psLevel1Sep: + break; + case psLevel2: + case psLevel3: + if (state->getStrokeColorSpace()->getMode() != csPattern) { + dumpColorSpaceL2(state->getStrokeColorSpace(), gTrue, gFalse, gFalse); + writePS(" CS\n"); + } + break; + case psLevel2Sep: + case psLevel3Sep: + break; + } +} + +void PSOutputDev::updateFillColor(GfxState *state) { + GfxColor color; + GfxColor *colorPtr; + GfxGray gray; + GfxCMYK cmyk; + GfxSeparationColorSpace *sepCS; + double c, m, y, k; + int i; + + if (inUncoloredPattern) { + return; + } + switch (level) { + case psLevel1: + state->getFillGray(&gray); + writePSFmt("{0:.4g} g\n", colToDbl(gray)); + break; + case psLevel1Sep: + state->getFillCMYK(&cmyk); + c = colToDbl(cmyk.c); + m = colToDbl(cmyk.m); + y = colToDbl(cmyk.y); + k = colToDbl(cmyk.k); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} k\n", c, m, y, k); + addProcessColor(c, m, y, k); + break; + case psLevel2: + case psLevel3: + if (state->getFillColorSpace()->getMode() != csPattern) { + colorPtr = state->getFillColor(); + writePS("["); + for (i = 0; i < state->getFillColorSpace()->getNComps(); ++i) { + if (i > 0) { + writePS(" "); + } + writePSFmt("{0:.4g}", colToDbl(colorPtr->c[i])); + } + writePS("] sc\n"); + } + break; + case psLevel2Sep: + case psLevel3Sep: + if (state->getFillColorSpace()->getMode() == csSeparation) { + sepCS = (GfxSeparationColorSpace *)state->getFillColorSpace(); + color.c[0] = gfxColorComp1; + sepCS->getCMYK(&color, &cmyk); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} {4:.4g} ({5:t}) ck\n", + colToDbl(state->getFillColor()->c[0]), + colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k), + sepCS->getName()); + addCustomColor(sepCS); + } else { + state->getFillCMYK(&cmyk); + c = colToDbl(cmyk.c); + m = colToDbl(cmyk.m); + y = colToDbl(cmyk.y); + k = colToDbl(cmyk.k); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} k\n", c, m, y, k); + addProcessColor(c, m, y, k); + } + break; + } + t3Cacheable = gFalse; +} + +void PSOutputDev::updateStrokeColor(GfxState *state) { + GfxColor color; + GfxColor *colorPtr; + GfxGray gray; + GfxCMYK cmyk; + GfxSeparationColorSpace *sepCS; + double c, m, y, k; + int i; + + if (inUncoloredPattern) { + return; + } + switch (level) { + case psLevel1: + state->getStrokeGray(&gray); + writePSFmt("{0:.4g} G\n", colToDbl(gray)); + break; + case psLevel1Sep: + state->getStrokeCMYK(&cmyk); + c = colToDbl(cmyk.c); + m = colToDbl(cmyk.m); + y = colToDbl(cmyk.y); + k = colToDbl(cmyk.k); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} K\n", c, m, y, k); + addProcessColor(c, m, y, k); + break; + case psLevel2: + case psLevel3: + if (state->getStrokeColorSpace()->getMode() != csPattern) { + colorPtr = state->getStrokeColor(); + writePS("["); + for (i = 0; i < state->getStrokeColorSpace()->getNComps(); ++i) { + if (i > 0) { + writePS(" "); + } + writePSFmt("{0:.4g}", colToDbl(colorPtr->c[i])); + } + writePS("] SC\n"); + } + break; + case psLevel2Sep: + case psLevel3Sep: + if (state->getStrokeColorSpace()->getMode() == csSeparation) { + sepCS = (GfxSeparationColorSpace *)state->getStrokeColorSpace(); + color.c[0] = gfxColorComp1; + sepCS->getCMYK(&color, &cmyk); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} {4:.4g} ({5:t}) CK\n", + colToDbl(state->getStrokeColor()->c[0]), + colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k), + sepCS->getName()); + addCustomColor(sepCS); + } else { + state->getStrokeCMYK(&cmyk); + c = colToDbl(cmyk.c); + m = colToDbl(cmyk.m); + y = colToDbl(cmyk.y); + k = colToDbl(cmyk.k); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} K\n", c, m, y, k); + addProcessColor(c, m, y, k); + } + break; + } + t3Cacheable = gFalse; +} + +void PSOutputDev::addProcessColor(double c, double m, double y, double k) { + if (c > 0) { + processColors |= psProcessCyan; + } + if (m > 0) { + processColors |= psProcessMagenta; + } + if (y > 0) { + processColors |= psProcessYellow; + } + if (k > 0) { + processColors |= psProcessBlack; + } +} + +void PSOutputDev::addCustomColor(GfxSeparationColorSpace *sepCS) { + PSOutCustomColor *cc; + GfxColor color; + GfxCMYK cmyk; + + if (!sepCS->getName()->cmp("Black")) { + processColors |= psProcessBlack; + return; + } + if (!sepCS->getName()->cmp("Cyan")) { + processColors |= psProcessCyan; + return; + } + if (!sepCS->getName()->cmp("Yellow")) { + processColors |= psProcessYellow; + return; + } + if (!sepCS->getName()->cmp("Magenta")) { + processColors |= psProcessMagenta; + return; + } + if (!sepCS->getName()->cmp("All")) + return; + if (!sepCS->getName()->cmp("None")) + return; + for (cc = customColors; cc; cc = cc->next) { + if (!cc->name->cmp(sepCS->getName())) { + return; + } + } + color.c[0] = gfxColorComp1; + sepCS->getCMYK(&color, &cmyk); + cc = new PSOutCustomColor(colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k), + sepCS->getName()->copy()); + cc->next = customColors; + customColors = cc; +} + +void PSOutputDev::updateFillOverprint(GfxState *state) { + if (level >= psLevel2) { + writePSFmt("{0:s} op\n", state->getFillOverprint() ? "true" : "false"); + } +} + +void PSOutputDev::updateStrokeOverprint(GfxState *state) { + if (level >= psLevel2) { + writePSFmt("{0:s} OP\n", state->getStrokeOverprint() ? "true" : "false"); + } +} + +void PSOutputDev::updateOverprintMode(GfxState *state) { + if (level >= psLevel3) { + writePSFmt("{0:s} opm\n", state->getOverprintMode() ? "true" : "false"); + } +} + +void PSOutputDev::updateTransfer(GfxState *state) { + Function **funcs; + int i; + + funcs = state->getTransfer(); + if (funcs[0] && funcs[1] && funcs[2] && funcs[3]) { + if (level >= psLevel2) { + for (i = 0; i < 4; ++i) { + cvtFunction(funcs[i]); + } + writePS("setcolortransfer\n"); + } else { + cvtFunction(funcs[3]); + writePS("settransfer\n"); + } + } else if (funcs[0]) { + cvtFunction(funcs[0]); + writePS("settransfer\n"); + } else { + writePS("{} settransfer\n"); + } +} + +void PSOutputDev::updateFont(GfxState *state) { + if (state->getFont()) { + writePSFmt("/F{0:d}_{1:d} {2:.6g} Tf\n", + state->getFont()->getID()->num, state->getFont()->getID()->gen, + fabs(state->getFontSize()) < 0.0001 ? 0.0001 + : state->getFontSize()); + } +} + +void PSOutputDev::updateTextMat(GfxState *state) { + double *mat; + + mat = state->getTextMat(); + if (fabs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.00001) { + // avoid a singular (or close-to-singular) matrix + writePSFmt("[0.00001 0 0 0.00001 {0:.6g} {1:.6g}] Tm\n", mat[4], mat[5]); + } else { + writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] Tm\n", + mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + } +} + +void PSOutputDev::updateCharSpace(GfxState *state) { + writePSFmt("{0:.6g} Tc\n", state->getCharSpace()); +} + +void PSOutputDev::updateRender(GfxState *state) { + int rm; + + rm = state->getRender(); + writePSFmt("{0:d} Tr\n", rm); + rm &= 3; + if (rm != 0 && rm != 3) { + t3Cacheable = gFalse; + } +} + +void PSOutputDev::updateRise(GfxState *state) { + writePSFmt("{0:.6g} Ts\n", state->getRise()); +} + +void PSOutputDev::updateWordSpace(GfxState *state) { + writePSFmt("{0:.6g} Tw\n", state->getWordSpace()); +} + +void PSOutputDev::updateHorizScaling(GfxState *state) { + double h; + + h = state->getHorizScaling(); + if (fabs(h) < 0.01) { + h = 0.01; + } + writePSFmt("{0:.6g} Tz\n", h); +} + +void PSOutputDev::updateTextPos(GfxState *state) { + writePSFmt("{0:.6g} {1:.6g} Td\n", state->getLineX(), state->getLineY()); +} + +void PSOutputDev::updateTextShift(GfxState *state, double shift) { + if (state->getFont()->getWMode()) { + writePSFmt("{0:.6g} TJmV\n", shift); + } else { + writePSFmt("{0:.6g} TJm\n", shift); + } +} + +void PSOutputDev::saveTextPos(GfxState *state) { + writePS("currentpoint\n"); +} + +void PSOutputDev::restoreTextPos(GfxState *state) { + writePS("m\n"); +} + +void PSOutputDev::stroke(GfxState *state) { + doPath(state->getPath()); + if (inType3Char && t3FillColorOnly) { + // if we're construct a cacheable Type 3 glyph, we need to do + // everything in the fill color + writePS("Sf\n"); + } else { + writePS("S\n"); + } +} + +void PSOutputDev::fill(GfxState *state) { + doPath(state->getPath()); + writePS("f\n"); +} + +void PSOutputDev::eoFill(GfxState *state) { + doPath(state->getPath()); + writePS("f*\n"); +} + +GBool PSOutputDev::tilingPatternFillL1(GfxState *state, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) { + PDFRectangle box; + Gfx *gfx; + + // define a Type 3 font + writePS("8 dict begin\n"); + writePS("/FontType 3 def\n"); + writePS("/FontMatrix [1 0 0 1 0 0] def\n"); + writePSFmt("/FontBBox [{0:.6g} {1:.6g} {2:.6g} {3:.6g}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + writePS("/Encoding 256 array def\n"); + writePS(" 0 1 255 { Encoding exch /.notdef put } for\n"); + writePS(" Encoding 120 /x put\n"); + writePS("/BuildGlyph {\n"); + writePS(" exch /CharProcs get exch\n"); + writePS(" 2 copy known not { pop /.notdef } if\n"); + writePS(" get exec\n"); + writePS("} bind def\n"); + writePS("/BuildChar {\n"); + writePS(" 1 index /Encoding get exch get\n"); + writePS(" 1 index /BuildGlyph get exec\n"); + writePS("} bind def\n"); + writePS("/CharProcs 1 dict def\n"); + writePS("CharProcs begin\n"); + box.x1 = bbox[0]; + box.y1 = bbox[1]; + box.x2 = bbox[2]; + box.y2 = bbox[3]; + gfx = new Gfx(doc, this, resDict, &box, NULL); + writePS("/x {\n"); + if (paintType == 2) { + writePSFmt("{0:.6g} 0 {1:.6g} {2:.6g} {3:.6g} {4:.6g} setcachedevice\n", + xStep, bbox[0], bbox[1], bbox[2], bbox[3]); + t3FillColorOnly = gTrue; + } else + { + if (x1 - 1 <= x0) { + writePS("1 0 setcharwidth\n"); + } else { + writePSFmt("{0:.6g} 0 setcharwidth\n", xStep); + } + t3FillColorOnly = gFalse; + } + inType3Char = gTrue; + if (paintType == 2) { + inUncoloredPattern = gTrue; + // ensure any PS procedures that contain sCol or fCol do not change the color + writePS("/pdfLastFill true def\n"); + writePS("/pdfLastStroke true def\n"); + } + ++numTilingPatterns; + gfx->display(str); + --numTilingPatterns; + if (paintType == 2) { + inUncoloredPattern = gFalse; + // ensure the next PS procedures that uses sCol or fCol will update the color + writePS("/pdfLastFill false def\n"); + writePS("/pdfLastStroke false def\n"); + } + inType3Char = gFalse; + writePS("} def\n"); + delete gfx; + writePS("end\n"); + writePS("currentdict end\n"); + writePSFmt("/xpdfTile{0:d} exch definefont pop\n", numTilingPatterns); + + // draw the tiles + writePSFmt("/xpdfTile{0:d} findfont setfont\n", numTilingPatterns); + writePS("fCol\n"); + writePSFmt("gsave [{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] concat\n", + mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + writePSFmt("{0:d} 1 {1:d} {{ {2:.6g} exch {3:.6g} mul m {4:d} 1 {5:d} {{ pop (x) show }} for }} for\n", + y0, y1 - 1, x0 * xStep, yStep, x0, x1 - 1); + writePS("grestore\n"); + + return gTrue; +} + +GBool PSOutputDev::tilingPatternFillL2(GfxState *state, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) { + PDFRectangle box; + Gfx *gfx; + + if (paintType == 2) { + // setpattern with PaintType 2 needs the paint color + writePS("currentcolor\n"); + } + writePS("<<\n /PatternType 1\n"); + writePSFmt(" /PaintType {0:d}\n", paintType); + writePSFmt(" /TilingType {0:d}\n", tilingType); + writePSFmt(" /BBox [{0:.6g} {1:.6g} {2:.6g} {3:.6g}]\n", bbox[0], bbox[1], bbox[2], bbox[3]); + writePSFmt(" /XStep {0:.6g}\n", xStep); + writePSFmt(" /YStep {0:.6g}\n", yStep); + writePS(" /PaintProc { \n"); + box.x1 = bbox[0]; + box.y1 = bbox[1]; + box.x2 = bbox[2]; + box.y2 = bbox[3]; + gfx = new Gfx(doc, this, resDict, &box, NULL); + inType3Char = gTrue; + if (paintType == 2) { + inUncoloredPattern = gTrue; + // ensure any PS procedures that contain sCol or fCol do not change the color + writePS("/pdfLastFill true def\n"); + writePS("/pdfLastStroke true def\n"); + } + gfx->display(str); + if (paintType == 2) { + inUncoloredPattern = gFalse; + // ensure the next PS procedures that uses sCol or fCol will update the color + writePS("/pdfLastFill false def\n"); + writePS("/pdfLastStroke false def\n"); + } + inType3Char = gFalse; + delete gfx; + writePS(" }\n"); + writePS(">>\n"); + writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}]\n", mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + writePS("makepattern setpattern\n"); + writePS("clippath fill\n"); // Gfx sets up a clip before calling out->tilingPatternFill() + + return gTrue; +} + +GBool PSOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) { + if (x1 - x0 == 1 && y1 - y0 == 1) { + // Don't need to use patterns if only one instance of the pattern is used + PDFRectangle box; + Gfx *gfx; + double x, y, tx, ty; + + x = x0 * xStep; + y = y0 * yStep; + tx = x * mat[0] + y * mat[2] + mat[4]; + ty = x * mat[1] + y * mat[3] + mat[5]; + box.x1 = bbox[0]; + box.y1 = bbox[1]; + box.x2 = bbox[2]; + box.y2 = bbox[3]; + gfx = new Gfx(doc, this, resDict, &box, NULL); + writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] cm\n", mat[0], mat[1], mat[2], mat[3], tx, ty); + inType3Char = gTrue; + gfx->display(str); + inType3Char = gFalse; + delete gfx; + return gTrue; + } + + if (level == psLevel1 || level == psLevel1Sep) { + return tilingPatternFillL1(state, cat, str, pmat, paintType, tilingType, resDict, + mat, bbox, x0, y0, x1, y1, xStep, yStep); + } else { + return tilingPatternFillL2(state, cat, str, pmat, paintType, tilingType, resDict, + mat, bbox, x0, y0, x1, y1, xStep, yStep); + } +} + +GBool PSOutputDev::functionShadedFill(GfxState *state, + GfxFunctionShading *shading) { + double x0, y0, x1, y1; + double *mat; + int i; + + if (level == psLevel2Sep || level == psLevel3Sep) { + if (shading->getColorSpace()->getMode() != csDeviceCMYK) { + return gFalse; + } + processColors |= psProcessCMYK; + } + + shading->getDomain(&x0, &y0, &x1, &y1); + mat = shading->getMatrix(); + writePSFmt("/mat [{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] def\n", + mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + writePSFmt("/n {0:d} def\n", shading->getColorSpace()->getNComps()); + if (shading->getNFuncs() == 1) { + writePS("/func "); + cvtFunction(shading->getFunc(0)); + writePS("def\n"); + } else { + writePS("/func {\n"); + for (i = 0; i < shading->getNFuncs(); ++i) { + if (i < shading->getNFuncs() - 1) { + writePS("2 copy\n"); + } + cvtFunction(shading->getFunc(i)); + writePS("exec\n"); + if (i < shading->getNFuncs() - 1) { + writePS("3 1 roll\n"); + } + } + writePS("} def\n"); + } + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} 0 funcSH\n", x0, y0, x1, y1); + + return gTrue; +} + +GBool PSOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/) { + double xMin, yMin, xMax, yMax; + double x0, y0, x1, y1, dx, dy, mul; + double tMin, tMax, t, t0, t1; + int i; + + if (level == psLevel2Sep || level == psLevel3Sep) { + if (shading->getColorSpace()->getMode() != csDeviceCMYK) { + return gFalse; + } + processColors |= psProcessCMYK; + } + + // get the clip region bbox + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + + // compute min and max t values, based on the four corners of the + // clip region bbox + shading->getCoords(&x0, &y0, &x1, &y1); + dx = x1 - x0; + dy = y1 - y0; + if (fabs(dx) < 0.01 && fabs(dy) < 0.01) { + return gTrue; + } else { + mul = 1 / (dx * dx + dy * dy); + tMin = tMax = ((xMin - x0) * dx + (yMin - y0) * dy) * mul; + t = ((xMin - x0) * dx + (yMax - y0) * dy) * mul; + if (t < tMin) { + tMin = t; + } else if (t > tMax) { + tMax = t; + } + t = ((xMax - x0) * dx + (yMin - y0) * dy) * mul; + if (t < tMin) { + tMin = t; + } else if (t > tMax) { + tMax = t; + } + t = ((xMax - x0) * dx + (yMax - y0) * dy) * mul; + if (t < tMin) { + tMin = t; + } else if (t > tMax) { + tMax = t; + } + if (tMin < 0 && !shading->getExtend0()) { + tMin = 0; + } + if (tMax > 1 && !shading->getExtend1()) { + tMax = 1; + } + } + + // get the function domain + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + + // generate the PS code + writePSFmt("/t0 {0:.6g} def\n", t0); + writePSFmt("/t1 {0:.6g} def\n", t1); + writePSFmt("/dt {0:.6g} def\n", t1 - t0); + writePSFmt("/x0 {0:.6g} def\n", x0); + writePSFmt("/y0 {0:.6g} def\n", y0); + writePSFmt("/dx {0:.6g} def\n", x1 - x0); + writePSFmt("/x1 {0:.6g} def\n", x1); + writePSFmt("/y1 {0:.6g} def\n", y1); + writePSFmt("/dy {0:.6g} def\n", y1 - y0); + writePSFmt("/xMin {0:.6g} def\n", xMin); + writePSFmt("/yMin {0:.6g} def\n", yMin); + writePSFmt("/xMax {0:.6g} def\n", xMax); + writePSFmt("/yMax {0:.6g} def\n", yMax); + writePSFmt("/n {0:d} def\n", shading->getColorSpace()->getNComps()); + if (shading->getNFuncs() == 1) { + writePS("/func "); + cvtFunction(shading->getFunc(0)); + writePS("def\n"); + } else { + writePS("/func {\n"); + for (i = 0; i < shading->getNFuncs(); ++i) { + if (i < shading->getNFuncs() - 1) { + writePS("dup\n"); + } + cvtFunction(shading->getFunc(i)); + writePS("exec\n"); + if (i < shading->getNFuncs() - 1) { + writePS("exch\n"); + } + } + writePS("} def\n"); + } + writePSFmt("{0:.6g} {1:.6g} 0 axialSH\n", tMin, tMax); + + return gTrue; +} + +GBool PSOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/) { + double xMin, yMin, xMax, yMax; + double x0, y0, r0, x1, y1, r1, t0, t1; + double xa, ya, ra; + double sMin, sMax, h, ta; + double sLeft, sRight, sTop, sBottom, sZero, sDiag; + GBool haveSLeft, haveSRight, haveSTop, haveSBottom, haveSZero; + GBool haveSMin, haveSMax; + double theta, alpha, a1, a2; + GBool enclosed; + int i; + + if (level == psLevel2Sep || level == psLevel3Sep) { + if (shading->getColorSpace()->getMode() != csDeviceCMYK) { + return gFalse; + } + processColors |= psProcessCMYK; + } + + // get the shading info + shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1); + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + + // Compute the point at which r(s) = 0; check for the enclosed + // circles case; and compute the angles for the tangent lines. + // Compute the point at which r(s) = 0; check for the enclosed + // circles case; and compute the angles for the tangent lines. + h = sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + if (h == 0) { + enclosed = gTrue; + theta = 0; // make gcc happy + } else if (r1 - r0 == 0) { + enclosed = gFalse; + theta = 0; + } else if (fabs(r1 - r0) >= h) { + enclosed = gTrue; + theta = 0; // make gcc happy + } else { + enclosed = gFalse; + theta = asin((r1 - r0) / h); + } + if (enclosed) { + a1 = 0; + a2 = 360; + } else { + alpha = atan2(y1 - y0, x1 - x0); + a1 = (180 / M_PI) * (alpha + theta) + 90; + a2 = (180 / M_PI) * (alpha - theta) - 90; + while (a2 < a1) { + a2 += 360; + } + } + + // compute the (possibly extended) s range + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + if (enclosed) { + sMin = 0; + sMax = 1; + } else { + // solve x(sLeft) + r(sLeft) = xMin + if ((haveSLeft = fabs((x1 + r1) - (x0 + r0)) > 0.000001)) { + sLeft = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0)); + } else { + sLeft = 0; // make gcc happy + } + // solve x(sRight) - r(sRight) = xMax + if ((haveSRight = fabs((x1 - r1) - (x0 - r0)) > 0.000001)) { + sRight = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0)); + } else { + sRight = 0; // make gcc happy + } + // solve y(sBottom) + r(sBottom) = yMin + if ((haveSBottom = fabs((y1 + r1) - (y0 + r0)) > 0.000001)) { + sBottom = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0)); + } else { + sBottom = 0; // make gcc happy + } + // solve y(sTop) - r(sTop) = yMax + if ((haveSTop = fabs((y1 - r1) - (y0 - r0)) > 0.000001)) { + sTop = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0)); + } else { + sTop = 0; // make gcc happy + } + // solve r(sZero) = 0 + if ((haveSZero = fabs(r1 - r0) > 0.000001)) { + sZero = -r0 / (r1 - r0); + } else { + sZero = 0; // make gcc happy + } + // solve r(sDiag) = sqrt((xMax-xMin)^2 + (yMax-yMin)^2) + if (haveSZero) { + sDiag = (sqrt((xMax - xMin) * (xMax - xMin) + + (yMax - yMin) * (yMax - yMin)) - r0) / (r1 - r0); + } else { + sDiag = 0; // make gcc happy + } + // compute sMin + if (shading->getExtend0()) { + sMin = 0; + haveSMin = gFalse; + if (x0 < x1 && haveSLeft && sLeft < 0) { + sMin = sLeft; + haveSMin = gTrue; + } else if (x0 > x1 && haveSRight && sRight < 0) { + sMin = sRight; + haveSMin = gTrue; + } + if (y0 < y1 && haveSBottom && sBottom < 0) { + if (!haveSMin || sBottom > sMin) { + sMin = sBottom; + haveSMin = gTrue; + } + } else if (y0 > y1 && haveSTop && sTop < 0) { + if (!haveSMin || sTop > sMin) { + sMin = sTop; + haveSMin = gTrue; + } + } + if (haveSZero && sZero < 0) { + if (!haveSMin || sZero > sMin) { + sMin = sZero; + } + } + } else { + sMin = 0; + } + // compute sMax + if (shading->getExtend1()) { + sMax = 1; + haveSMax = gFalse; + if (x1 < x0 && haveSLeft && sLeft > 1) { + sMax = sLeft; + haveSMax = gTrue; + } else if (x1 > x0 && haveSRight && sRight > 1) { + sMax = sRight; + haveSMax = gTrue; + } + if (y1 < y0 && haveSBottom && sBottom > 1) { + if (!haveSMax || sBottom < sMax) { + sMax = sBottom; + haveSMax = gTrue; + } + } else if (y1 > y0 && haveSTop && sTop > 1) { + if (!haveSMax || sTop < sMax) { + sMax = sTop; + haveSMax = gTrue; + } + } + if (haveSZero && sDiag > 1) { + if (!haveSMax || sDiag < sMax) { + sMax = sDiag; + } + } + } else { + sMax = 1; + } + } + + // generate the PS code + writePSFmt("/x0 {0:.6g} def\n", x0); + writePSFmt("/x1 {0:.6g} def\n", x1); + writePSFmt("/dx {0:.6g} def\n", x1 - x0); + writePSFmt("/y0 {0:.6g} def\n", y0); + writePSFmt("/y1 {0:.6g} def\n", y1); + writePSFmt("/dy {0:.6g} def\n", y1 - y0); + writePSFmt("/r0 {0:.6g} def\n", r0); + writePSFmt("/r1 {0:.6g} def\n", r1); + writePSFmt("/dr {0:.6g} def\n", r1 - r0); + writePSFmt("/t0 {0:.6g} def\n", t0); + writePSFmt("/t1 {0:.6g} def\n", t1); + writePSFmt("/dt {0:.6g} def\n", t1 - t0); + writePSFmt("/n {0:d} def\n", shading->getColorSpace()->getNComps()); + writePSFmt("/encl {0:s} def\n", enclosed ? "true" : "false"); + writePSFmt("/a1 {0:.6g} def\n", a1); + writePSFmt("/a2 {0:.6g} def\n", a2); + if (shading->getNFuncs() == 1) { + writePS("/func "); + cvtFunction(shading->getFunc(0)); + writePS("def\n"); + } else { + writePS("/func {\n"); + for (i = 0; i < shading->getNFuncs(); ++i) { + if (i < shading->getNFuncs() - 1) { + writePS("dup\n"); + } + cvtFunction(shading->getFunc(i)); + writePS("exec\n"); + if (i < shading->getNFuncs() - 1) { + writePS("exch\n"); + } + } + writePS("} def\n"); + } + writePSFmt("{0:.6g} {1:.6g} 0 radialSH\n", sMin, sMax); + + // extend the 'enclosed' case + if (enclosed) { + // extend the smaller circle + if ((shading->getExtend0() && r0 <= r1) || + (shading->getExtend1() && r1 < r0)) { + if (r0 <= r1) { + ta = t0; + ra = r0; + xa = x0; + ya = y0; + } else { + ta = t1; + ra = r1; + xa = x1; + ya = y1; + } + if (level == psLevel2Sep || level == psLevel3Sep) { + writePSFmt("{0:.6g} radialCol aload pop k\n", ta); + } else { + writePSFmt("{0:.6g} radialCol sc\n", ta); + } + writePSFmt("{0:.6g} {1:.6g} {2:.6g} 0 360 arc h f*\n", xa, ya, ra); + } + + // extend the larger circle + if ((shading->getExtend0() && r0 > r1) || + (shading->getExtend1() && r1 >= r0)) { + if (r0 > r1) { + ta = t0; + ra = r0; + xa = x0; + ya = y0; + } else { + ta = t1; + ra = r1; + xa = x1; + ya = y1; + } + if (level == psLevel2Sep || level == psLevel3Sep) { + writePSFmt("{0:.6g} radialCol aload pop k\n", ta); + } else { + writePSFmt("{0:.6g} radialCol sc\n", ta); + } + writePSFmt("{0:.6g} {1:.6g} {2:.6g} 0 360 arc h\n", xa, ya, ra); + writePSFmt("{0:.6g} {1:.6g} m {2:.6g} {3:.6g} l {4:.6g} {5:.6g} l {6:.6g} {7:.6g} l h f*\n", + xMin, yMin, xMin, yMax, xMax, yMax, xMax, yMin); + } + } + + return gTrue; +} + +void PSOutputDev::clip(GfxState *state) { + doPath(state->getPath()); + writePS("W\n"); +} + +void PSOutputDev::eoClip(GfxState *state) { + doPath(state->getPath()); + writePS("W*\n"); +} + +void PSOutputDev::clipToStrokePath(GfxState *state) { + doPath(state->getPath()); + writePS("Ws\n"); +} + +void PSOutputDev::doPath(GfxPath *path) { + GfxSubpath *subpath; + double x0, y0, x1, y1, x2, y2, x3, y3, x4, y4; + int n, m, i, j; + + n = path->getNumSubpaths(); + + if (n == 1 && path->getSubpath(0)->getNumPoints() == 5) { + subpath = path->getSubpath(0); + x0 = subpath->getX(0); + y0 = subpath->getY(0); + x4 = subpath->getX(4); + y4 = subpath->getY(4); + if (x4 == x0 && y4 == y0) { + x1 = subpath->getX(1); + y1 = subpath->getY(1); + x2 = subpath->getX(2); + y2 = subpath->getY(2); + x3 = subpath->getX(3); + y3 = subpath->getY(3); + if (x0 == x1 && x2 == x3 && y0 == y3 && y1 == y2) { + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n", + x0 < x2 ? x0 : x2, y0 < y1 ? y0 : y1, + fabs(x2 - x0), fabs(y1 - y0)); + return; + } else if (x0 == x3 && x1 == x2 && y0 == y1 && y2 == y3) { + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n", + x0 < x1 ? x0 : x1, y0 < y2 ? y0 : y2, + fabs(x1 - x0), fabs(y2 - y0)); + return; + } + } + } + + for (i = 0; i < n; ++i) { + subpath = path->getSubpath(i); + m = subpath->getNumPoints(); + writePSFmt("{0:.6g} {1:.6g} m\n", subpath->getX(0), subpath->getY(0)); + j = 1; + while (j < m) { + if (subpath->getCurve(j)) { + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} c\n", + subpath->getX(j), subpath->getY(j), + subpath->getX(j+1), subpath->getY(j+1), + subpath->getX(j+2), subpath->getY(j+2)); + j += 3; + } else { + writePSFmt("{0:.6g} {1:.6g} l\n", subpath->getX(j), subpath->getY(j)); + ++j; + } + } + if (subpath->isClosed()) { + writePS("h\n"); + } + } +} + +void PSOutputDev::drawString(GfxState *state, GooString *s) { + GfxFont *font; + int wMode; + int *codeToGID; + GooString *s2; + double dx, dy, originX, originY; + char *p; + UnicodeMap *uMap; + CharCode code; + Unicode *u; + char buf[8]; + double *dxdy; + int dxdySize, len, nChars, uLen, n, m, i, j; + + // for pdftohtml, output PS without text + if( displayText == gFalse ) + return; + + // check for invisible text -- this is used by Acrobat Capture + if (state->getRender() == 3) { + return; + } + + // ignore empty strings + if (s->getLength() == 0) { + return; + } + + // get the font + if (!(font = state->getFont())) { + return; + } + wMode = font->getWMode(); + + // check for a subtitute 16-bit font + uMap = NULL; + codeToGID = NULL; + if (font->isCIDFont()) { + for (i = 0; i < font16EncLen; ++i) { + if (font->getID()->num == font16Enc[i].fontID.num && + font->getID()->gen == font16Enc[i].fontID.gen) { + if (!font16Enc[i].enc) { + // font substitution failed, so don't output any text + return; + } + uMap = globalParams->getUnicodeMap(font16Enc[i].enc); + break; + } + } + + // check for a code-to-GID map + } else { + for (i = 0; i < font8InfoLen; ++i) { + if (font->getID()->num == font8Info[i].fontID.num && + font->getID()->gen == font8Info[i].fontID.gen) { + codeToGID = font8Info[i].codeToGID; + break; + } + } + } + + // compute the positioning (dx, dy) for each char in the string + nChars = 0; + p = s->getCString(); + len = s->getLength(); + s2 = new GooString(); + dxdySize = font->isCIDFont() ? 8 : s->getLength(); + dxdy = (double *)gmallocn(2 * dxdySize, sizeof(double)); + while (len > 0) { + n = font->getNextChar(p, len, &code, + &u, &uLen, + &dx, &dy, &originX, &originY); + dx *= state->getFontSize(); + dy *= state->getFontSize(); + if (wMode) { + dy += state->getCharSpace(); + if (n == 1 && *p == ' ') { + dy += state->getWordSpace(); + } + } else { + dx += state->getCharSpace(); + if (n == 1 && *p == ' ') { + dx += state->getWordSpace(); + } + } + dx *= state->getHorizScaling(); + if (font->isCIDFont()) { + if (uMap) { + if (nChars + uLen > dxdySize) { + do { + dxdySize *= 2; + } while (nChars + uLen > dxdySize); + dxdy = (double *)greallocn(dxdy, 2 * dxdySize, sizeof(double)); + } + for (i = 0; i < uLen; ++i) { + m = uMap->mapUnicode(u[i], buf, (int)sizeof(buf)); + for (j = 0; j < m; ++j) { + s2->append(buf[j]); + } + //~ this really needs to get the number of chars in the target + //~ encoding - which may be more than the number of Unicode + //~ chars + dxdy[2 * nChars] = dx; + dxdy[2 * nChars + 1] = dy; + ++nChars; + } + } else { + if (nChars + 1 > dxdySize) { + dxdySize *= 2; + dxdy = (double *)greallocn(dxdy, 2 * dxdySize, sizeof(double)); + } + s2->append((char)((code >> 8) & 0xff)); + s2->append((char)(code & 0xff)); + dxdy[2 * nChars] = dx; + dxdy[2 * nChars + 1] = dy; + ++nChars; + } + } else { + if (!codeToGID || codeToGID[code] >= 0) { + s2->append((char)code); + dxdy[2 * nChars] = dx; + dxdy[2 * nChars + 1] = dy; + ++nChars; + } + } + p += n; + len -= n; + } + if (uMap) { + uMap->decRefCnt(); + } + + if (nChars > 0) { + writePSString(s2); + writePS("\n["); + for (i = 0; i < 2 * nChars; ++i) { + if (i > 0) { + writePS("\n"); + } + writePSFmt("{0:.6g}", dxdy[i]); + } + writePS("] Tj\n"); + } + gfree(dxdy); + delete s2; + + if (state->getRender() & 4) { + haveTextClip = gTrue; + } +} + +void PSOutputDev::beginTextObject(GfxState *state) { +} + +void PSOutputDev::endTextObject(GfxState *state) { + if (haveTextClip) { + writePS("Tclip\n"); + haveTextClip = gFalse; + } +} + +void PSOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + int len; + + len = height * ((width + 7) / 8); + switch (level) { + case psLevel1: + case psLevel1Sep: + doImageL1(ref, NULL, invert, inlineImg, str, width, height, len, + NULL, NULL, 0, 0, gFalse); + break; + case psLevel2: + case psLevel2Sep: + doImageL2(ref, NULL, invert, inlineImg, str, width, height, len, + NULL, NULL, 0, 0, gFalse); + break; + case psLevel3: + case psLevel3Sep: + doImageL3(ref, NULL, invert, inlineImg, str, width, height, len, + NULL, NULL, 0, 0, gFalse); + break; + } +} + +void PSOutputDev::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix) { + if (level != psLevel1 && level != psLevel1Sep) { + maskToClippingPath(str, width, height, invert); + } +} + +void PSOutputDev::unsetSoftMaskFromImageMask(GfxState * state, double *baseMatrix) { + if (level != psLevel1 && level != psLevel1Sep) { + writePS("pdfImClipEnd\n"); + } +} + +void PSOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) { + int len; + + len = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + switch (level) { + case psLevel1: + doImageL1(ref, colorMap, gFalse, inlineImg, str, + width, height, len, maskColors, NULL, 0, 0, gFalse); + break; + case psLevel1Sep: + //~ handle indexed, separation, ... color spaces + doImageL1Sep(ref, colorMap, gFalse, inlineImg, str, + width, height, len, maskColors, NULL, 0, 0, gFalse); + break; + case psLevel2: + case psLevel2Sep: + doImageL2(ref, colorMap, gFalse, inlineImg, str, + width, height, len, maskColors, NULL, 0, 0, gFalse); + break; + case psLevel3: + case psLevel3Sep: + doImageL3(ref, colorMap, gFalse, inlineImg, str, + width, height, len, maskColors, NULL, 0, 0, gFalse); + break; + } + t3Cacheable = gFalse; +} + +void PSOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate) { + int len; + + len = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + switch (level) { + case psLevel1: + doImageL1(ref, colorMap, gFalse, gFalse, str, width, height, len, + NULL, maskStr, maskWidth, maskHeight, maskInvert); + break; + case psLevel1Sep: + //~ handle indexed, separation, ... color spaces + doImageL1Sep(ref, colorMap, gFalse, gFalse, str, width, height, len, + NULL, maskStr, maskWidth, maskHeight, maskInvert); + break; + case psLevel2: + case psLevel2Sep: + doImageL2(ref, colorMap, gFalse, gFalse, str, width, height, len, + NULL, maskStr, maskWidth, maskHeight, maskInvert); + break; + case psLevel3: + case psLevel3Sep: + doImageL3(ref, colorMap, gFalse, gFalse, str, width, height, len, + NULL, maskStr, maskWidth, maskHeight, maskInvert); + break; + } + t3Cacheable = gFalse; +} + +void PSOutputDev::doImageL1(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert) { + ImageStream *imgStr; + Guchar pixBuf[gfxColorMaxComps]; + GfxGray gray; + int col, x, y, c, i; + char hexBuf[32*2 + 2]; // 32 values X 2 chars/value + line ending + null + Guchar digit, grayValue; + const GBool useBinary = globalParams->getPSBinary(); + + // explicit masking + if (maskStr && !(maskColors && colorMap)) { + maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert); + } + + if ((inType3Char || preload) && !colorMap) { + if (inlineImg) { + // create an array + str = new FixedLengthEncoder(str, len); + str = new ASCIIHexEncoder(str); + str->reset(); + col = 0; + writePS("[<"); + do { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == '>' || c == EOF) { + break; + } + writePSChar(c); + ++col; + // each line is: "<...data...>" + // so max data length = 255 - 4 = 251 + // but make it 240 just to be safe + // chunks are 2 bytes each, so we need to stop on an even col number + if (col == 240) { + writePS(">\n<"); + col = 0; + } + } while (c != '>' && c != EOF); + writePS(">]\n"); + writePS("0\n"); + str->close(); + delete str; + } else { + // make sure the image is setup, it sometimes is not like on bug #17645 + setupImage(ref->getRef(), str, gFalse); + // set up to use the array already created by setupImages() + writePSFmt("ImData_{0:d}_{1:d} 0 0\n", ref->getRefNum(), ref->getRefGen()); + } + } + + // image/imagemask command + if ((inType3Char || preload) && !colorMap) { + writePSFmt("{0:d} {1:d} {2:s} [{3:d} 0 0 {4:d} 0 {5:d}] pdfImM1a\n", + width, height, invert ? "true" : "false", + width, -height, height); + } else if (colorMap) { + writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1{5:s}\n", + width, height, + width, -height, height, + useBinary ? "Bin" : ""); + } else { + writePSFmt("{0:d} {1:d} {2:s} [{3:d} 0 0 {4:d} 0 {5:d}] pdfImM1{6:s}\n", + width, height, invert ? "true" : "false", + width, -height, height, + useBinary ? "Bin" : ""); + } + + // image data + if (!((inType3Char || preload) && !colorMap)) { + + if (colorMap) { + + // set up to process the data stream + imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + + // process the data stream + i = 0; + for (y = 0; y < height; ++y) { + + // write the line + for (x = 0; x < width; ++x) { + imgStr->getPixel(pixBuf); + colorMap->getGray(pixBuf, &gray); + grayValue = colToByte(gray); + if (useBinary) { + hexBuf[i++] = grayValue; + } else { + digit = grayValue / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + digit = grayValue % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + } + if (i >= 64) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + i = 0; + } + } + } + if (i != 0) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + } + str->close(); + delete imgStr; + + // imagemask + } else { + str->reset(); + i = 0; + for (y = 0; y < height; ++y) { + for (x = 0; x < width; x += 8) { + grayValue = str->getChar(); + if (useBinary) { + hexBuf[i++] = grayValue; + } else { + digit = grayValue / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + digit = grayValue % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a' - 10: '0'); + } + if (i >= 64) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + i = 0; + } + } + } + if (i != 0) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + } + str->close(); + } + } + + if (maskStr && !(maskColors && colorMap)) { + writePS("pdfImClipEnd\n"); + } +} + +void PSOutputDev::doImageL1Sep(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert) { + ImageStream *imgStr; + Guchar *lineBuf; + Guchar pixBuf[gfxColorMaxComps]; + GfxCMYK cmyk; + int x, y, i, comp; + GBool checkProcessColor; + char hexBuf[32*2 + 2]; // 32 values X 2 chars/value + line ending + null + Guchar digit; + const GBool useBinary = globalParams->getPSBinary(); + + // explicit masking + if (maskStr && !(maskColors && colorMap)) { + maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert); + } + + // width, height, matrix, bits per component + writePSFmt("{0:d} {1:d} 8 [{2:d} 0 0 {3:d} 0 {4:d}] pdfIm1Sep{5:s}\n", + width, height, + width, -height, height, + useBinary ? "Bin" : ""); + + // allocate a line buffer + lineBuf = (Guchar *)gmallocn(width, 4); + + // set up to process the data stream + imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + + // process the data stream + checkProcessColor = gTrue; + i = 0; + for (y = 0; y < height; ++y) { + + // read the line + if (checkProcessColor) { + checkProcessColor = (((psProcessCyan | psProcessMagenta | psProcessYellow | psProcessBlack) & ~processColors) != 0); + } + if (checkProcessColor) { + for (x = 0; x < width; ++x) { + imgStr->getPixel(pixBuf); + colorMap->getCMYK(pixBuf, &cmyk); + lineBuf[4*x+0] = colToByte(cmyk.c); + lineBuf[4*x+1] = colToByte(cmyk.m); + lineBuf[4*x+2] = colToByte(cmyk.y); + lineBuf[4*x+3] = colToByte(cmyk.k); + addProcessColor(colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k)); + } + } else { + for (x = 0; x < width; ++x) { + imgStr->getPixel(pixBuf); + colorMap->getCMYK(pixBuf, &cmyk); + lineBuf[4*x+0] = colToByte(cmyk.c); + lineBuf[4*x+1] = colToByte(cmyk.m); + lineBuf[4*x+2] = colToByte(cmyk.y); + lineBuf[4*x+3] = colToByte(cmyk.k); + } + } + + // write one line of each color component + if (useBinary) { + for (comp = 0; comp < 4; ++comp) { + for (x = 0; x < width; ++x) { + hexBuf[i++] = lineBuf[4*x + comp]; + if (i >= 64) { + writePSBuf(hexBuf, i); + i = 0; + } + } + } + } else { + for (comp = 0; comp < 4; ++comp) { + for (x = 0; x < width; ++x) { + digit = lineBuf[4*x + comp] / 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a'-10: '0'); + digit = lineBuf[4*x + comp] % 16; + hexBuf[i++] = digit + ((digit >= 10)? 'a'-10: '0'); + if (i >= 64) { + hexBuf[i++] = '\n'; + writePSBuf(hexBuf, i); + i = 0; + } + } + } + } + } + + if (i != 0) { + if (!useBinary) { + hexBuf[i++] = '\n'; + } + writePSBuf(hexBuf, i); + } + + str->close(); + delete imgStr; + gfree(lineBuf); + + if (maskStr && !(maskColors && colorMap)) { + writePS("pdfImClipEnd\n"); + } +} + +void PSOutputDev::maskToClippingPath(Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert) { + ImageStream *imgStr; + Guchar *line; + PSOutImgClipRect *rects0, *rects1, *rectsTmp, *rectsOut; + int rects0Len, rects1Len, rectsSize, rectsOutLen, rectsOutSize; + GBool emitRect, addRect, extendRect; + int i, x0, x1, y, maskXor; + + imgStr = new ImageStream(maskStr, maskWidth, 1, 1); + imgStr->reset(); + rects0Len = rects1Len = rectsOutLen = 0; + rectsSize = rectsOutSize = 64; + rects0 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect)); + rects1 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect)); + rectsOut = (PSOutImgClipRect *)gmallocn(rectsOutSize, sizeof(PSOutImgClipRect)); + maskXor = maskInvert ? 1 : 0; + for (y = 0; y < maskHeight; ++y) { + if (!(line = imgStr->getLine())) { + break; + } + i = 0; + rects1Len = 0; + for (x0 = 0; x0 < maskWidth && (line[x0] ^ maskXor); ++x0) ; + for (x1 = x0; x1 < maskWidth && !(line[x1] ^ maskXor); ++x1) ; + while (x0 < maskWidth || i < rects0Len) { + emitRect = addRect = extendRect = gFalse; + if (x0 >= maskWidth) { + emitRect = gTrue; + } else if (i >= rects0Len) { + addRect = gTrue; + } else if (rects0[i].x0 < x0) { + emitRect = gTrue; + } else if (x0 < rects0[i].x0) { + addRect = gTrue; + } else if (rects0[i].x1 == x1) { + extendRect = gTrue; + } else { + emitRect = addRect = gTrue; + } + if (emitRect) { + if (rectsOutLen == rectsOutSize) { + rectsOutSize *= 2; + rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize, sizeof(PSOutImgClipRect)); + } + rectsOut[rectsOutLen].x0 = rects0[i].x0; + rectsOut[rectsOutLen].x1 = rects0[i].x1; + rectsOut[rectsOutLen].y0 = maskHeight - y - 1; + rectsOut[rectsOutLen].y1 = maskHeight - rects0[i].y0 - 1; + ++rectsOutLen; + ++i; + } + if (addRect || extendRect) { + if (rects1Len == rectsSize) { + rectsSize *= 2; + rects0 = (PSOutImgClipRect *)greallocn(rects0, rectsSize, sizeof(PSOutImgClipRect)); + rects1 = (PSOutImgClipRect *)greallocn(rects1, rectsSize, sizeof(PSOutImgClipRect)); + } + rects1[rects1Len].x0 = x0; + rects1[rects1Len].x1 = x1; + if (addRect) { + rects1[rects1Len].y0 = y; + } + if (extendRect) { + rects1[rects1Len].y0 = rects0[i].y0; + ++i; + } + ++rects1Len; + for (x0 = x1; x0 < maskWidth && (line[x0] ^ maskXor); ++x0) ; + for (x1 = x0; x1 < maskWidth && !(line[x1] ^ maskXor); ++x1) ; + } + } + rectsTmp = rects0; + rects0 = rects1; + rects1 = rectsTmp; + i = rects0Len; + rects0Len = rects1Len; + rects1Len = i; + } + for (i = 0; i < rects0Len; ++i) { + if (rectsOutLen == rectsOutSize) { + rectsOutSize *= 2; + rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize, sizeof(PSOutImgClipRect)); + } + rectsOut[rectsOutLen].x0 = rects0[i].x0; + rectsOut[rectsOutLen].x1 = rects0[i].x1; + rectsOut[rectsOutLen].y0 = maskHeight - y - 1; + rectsOut[rectsOutLen].y1 = maskHeight - rects0[i].y0 - 1; + ++rectsOutLen; + } + if (rectsOutLen < 65536/4) { + writePSFmt("{0:d} array 0\n", rectsOutLen * 4); + for (i = 0; i < rectsOutLen; ++i) { + writePSFmt("[{0:d} {1:d} {2:d} {3:d}] pr\n", + rectsOut[i].x0, rectsOut[i].y0, + rectsOut[i].x1 - rectsOut[i].x0, + rectsOut[i].y1 - rectsOut[i].y0); + } + writePSFmt("pop {0:d} {1:d} pdfImClip\n", maskWidth, maskHeight); + } else { + // would be over the limit of array size. + // make each rectangle path and clip. + writePS("gsave newpath\n"); + for (i = 0; i < rectsOutLen; ++i) { + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n", + ((double)rectsOut[i].x0)/maskWidth, + ((double)rectsOut[i].y0)/maskHeight, + ((double)(rectsOut[i].x1 - rectsOut[i].x0))/maskWidth, + ((double)(rectsOut[i].y1 - rectsOut[i].y0))/maskHeight); + } + writePS("clip\n"); + } + gfree(rectsOut); + gfree(rects0); + gfree(rects1); + delete imgStr; + maskStr->close(); +} + +void PSOutputDev::doImageL2(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert) { + Stream *str2; + ImageStream *imgStr; + Guchar *line; + PSOutImgClipRect *rects0, *rects1, *rectsTmp, *rectsOut; + int rects0Len, rects1Len, rectsSize, rectsOutLen, rectsOutSize; + GBool emitRect, addRect, extendRect; + GooString *s; + int n, numComps; + GBool useRLE, useASCII, useASCIIHex, useCompressed; + GfxSeparationColorSpace *sepCS; + GfxColor color; + GfxCMYK cmyk; + int c; + int col, i, j, x0, x1, y; + char dataBuf[4096]; + + rectsOutLen = 0; + + // color key masking + if (maskColors && colorMap && !inlineImg) { + // can't read the stream twice for inline images -- but masking + // isn't allowed with inline images anyway + numComps = colorMap->getNumPixelComps(); + imgStr = new ImageStream(str, width, numComps, colorMap->getBits()); + imgStr->reset(); + rects0Len = rects1Len = 0; + rectsSize = rectsOutSize = 64; + rects0 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect)); + rects1 = (PSOutImgClipRect *)gmallocn(rectsSize, sizeof(PSOutImgClipRect)); + rectsOut = (PSOutImgClipRect *)gmallocn(rectsOutSize, + sizeof(PSOutImgClipRect)); + for (y = 0; y < height; ++y) { + if (!(line = imgStr->getLine())) { + break; + } + i = 0; + rects1Len = 0; + for (x0 = 0; x0 < width; ++x0) { + for (j = 0; j < numComps; ++j) { + if (line[x0*numComps+j] < maskColors[2*j] || + line[x0*numComps+j] > maskColors[2*j+1]) { + break; + } + } + if (j < numComps) { + break; + } + } + for (x1 = x0; x1 < width; ++x1) { + for (j = 0; j < numComps; ++j) { + if (line[x1*numComps+j] < maskColors[2*j] || + line[x1*numComps+j] > maskColors[2*j+1]) { + break; + } + } + if (j == numComps) { + break; + } + } + while (x0 < width || i < rects0Len) { + emitRect = addRect = extendRect = gFalse; + if (x0 >= width) { + emitRect = gTrue; + } else if (i >= rects0Len) { + addRect = gTrue; + } else if (rects0[i].x0 < x0) { + emitRect = gTrue; + } else if (x0 < rects0[i].x0) { + addRect = gTrue; + } else if (rects0[i].x1 == x1) { + extendRect = gTrue; + } else { + emitRect = addRect = gTrue; + } + if (emitRect) { + if (rectsOutLen == rectsOutSize) { + rectsOutSize *= 2; + rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize, + sizeof(PSOutImgClipRect)); + } + rectsOut[rectsOutLen].x0 = rects0[i].x0; + rectsOut[rectsOutLen].x1 = rects0[i].x1; + rectsOut[rectsOutLen].y0 = height - y - 1; + rectsOut[rectsOutLen].y1 = height - rects0[i].y0 - 1; + ++rectsOutLen; + ++i; + } + if (addRect || extendRect) { + if (rects1Len == rectsSize) { + rectsSize *= 2; + rects0 = (PSOutImgClipRect *)greallocn(rects0, rectsSize, + sizeof(PSOutImgClipRect)); + rects1 = (PSOutImgClipRect *)greallocn(rects1, rectsSize, + sizeof(PSOutImgClipRect)); + } + rects1[rects1Len].x0 = x0; + rects1[rects1Len].x1 = x1; + if (addRect) { + rects1[rects1Len].y0 = y; + } + if (extendRect) { + rects1[rects1Len].y0 = rects0[i].y0; + ++i; + } + ++rects1Len; + for (x0 = x1; x0 < width; ++x0) { + for (j = 0; j < numComps; ++j) { + if (line[x0*numComps+j] < maskColors[2*j] || + line[x0*numComps+j] > maskColors[2*j+1]) { + break; + } + } + if (j < numComps) { + break; + } + } + for (x1 = x0; x1 < width; ++x1) { + for (j = 0; j < numComps; ++j) { + if (line[x1*numComps+j] < maskColors[2*j] || + line[x1*numComps+j] > maskColors[2*j+1]) { + break; + } + } + if (j == numComps) { + break; + } + } + } + } + rectsTmp = rects0; + rects0 = rects1; + rects1 = rectsTmp; + i = rects0Len; + rects0Len = rects1Len; + rects1Len = i; + } + for (i = 0; i < rects0Len; ++i) { + if (rectsOutLen == rectsOutSize) { + rectsOutSize *= 2; + rectsOut = (PSOutImgClipRect *)greallocn(rectsOut, rectsOutSize, + sizeof(PSOutImgClipRect)); + } + rectsOut[rectsOutLen].x0 = rects0[i].x0; + rectsOut[rectsOutLen].x1 = rects0[i].x1; + rectsOut[rectsOutLen].y0 = height - y - 1; + rectsOut[rectsOutLen].y1 = height - rects0[i].y0 - 1; + ++rectsOutLen; + } + if (rectsOutLen < 65536/4) { + writePSFmt("{0:d} array 0\n", rectsOutLen * 4); + for (i = 0; i < rectsOutLen; ++i) { + writePSFmt("[{0:d} {1:d} {2:d} {3:d}] pr\n", + rectsOut[i].x0, rectsOut[i].y0, + rectsOut[i].x1 - rectsOut[i].x0, + rectsOut[i].y1 - rectsOut[i].y0); + } + writePSFmt("pop {0:d} {1:d} pdfImClip\n", width, height); + } else { + // would be over the limit of array size. + // make each rectangle path and clip. + writePS("gsave newpath\n"); + for (i = 0; i < rectsOutLen; ++i) { + writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} re\n", + ((double)rectsOut[i].x0)/width, + ((double)rectsOut[i].y0)/height, + ((double)(rectsOut[i].x1 - rectsOut[i].x0))/width, + ((double)(rectsOut[i].y1 - rectsOut[i].y0))/height); + } + writePS("clip\n"); + } + gfree(rectsOut); + gfree(rects0); + gfree(rects1); + delete imgStr; + str->close(); + + // explicit masking + } else if (maskStr) { + maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert); + } + + // color space + if (colorMap) { + dumpColorSpaceL2(colorMap->getColorSpace(), gFalse, gTrue, gFalse); + writePS(" setcolorspace\n"); + } + + useASCIIHex = globalParams->getPSASCIIHex(); + + // set up the image data + if (mode == psModeForm || inType3Char || preload) { + if (inlineImg) { + // create an array + str2 = new FixedLengthEncoder(str, len); + str2 = new RunLengthEncoder(str2); + if (useASCIIHex) { + str2 = new ASCIIHexEncoder(str2); + } else { + str2 = new ASCII85Encoder(str2); + } + str2->reset(); + col = 0; + writePS((char *)(useASCIIHex ? "[<" : "[<~")); + do { + do { + c = str2->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + if (c == 'z') { + writePSChar(c); + ++col; + } else { + writePSChar(c); + ++col; + for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) { + do { + c = str2->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + writePSChar(c); + ++col; + } + } + // each line is: "<~...data...~>" + // so max data length = 255 - 6 = 249 + // chunks are 1 or 5 bytes each, so we have to stop at 245 + // but make it 240 just to be safe + if (col > 240) { + writePS((char *)(useASCIIHex ? ">\n<" : "~>\n<~")); + col = 0; + } + } while (c != (useASCIIHex ? '>' : '~') && c != EOF); + writePS((char *)(useASCIIHex ? ">\n" : "~>\n")); + // add an extra entry because the RunLengthDecode filter may + // read past the end + writePS("<>]\n"); + writePS("0\n"); + str2->close(); + delete str2; + } else { + // make sure the image is setup, it sometimes is not like on bug #17645 + setupImage(ref->getRef(), str, gFalse); + // set up to use the array already created by setupImages() + writePSFmt("ImData_{0:d}_{1:d} 0 0\n",ref->getRefNum(), ref->getRefGen()); + } + } + + // image dictionary + writePS("<<\n /ImageType 1\n"); + + // width, height, matrix, bits per component + writePSFmt(" /Width {0:d}\n", width); + writePSFmt(" /Height {0:d}\n", height); + writePSFmt(" /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n", + width, -height, height); + if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) { + writePS(" /BitsPerComponent 8\n"); + } else { + writePSFmt(" /BitsPerComponent {0:d}\n", + colorMap ? colorMap->getBits() : 1); + } + + // decode + if (colorMap) { + writePS(" /Decode ["); + if ((level == psLevel2Sep || level == psLevel3Sep) && + colorMap->getColorSpace()->getMode() == csSeparation) { + // this matches up with the code in the pdfImSep operator + n = (1 << colorMap->getBits()) - 1; + writePSFmt("{0:.4g} {1:.4g}", colorMap->getDecodeLow(0) * n, + colorMap->getDecodeHigh(0) * n); + } else if (colorMap->getColorSpace()->getMode() == csDeviceN) { + numComps = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())-> + getAlt()->getNComps(); + for (i = 0; i < numComps; ++i) { + if (i > 0) { + writePS(" "); + } + writePS("0 1"); + } + } else { + numComps = colorMap->getNumPixelComps(); + for (i = 0; i < numComps; ++i) { + if (i > 0) { + writePS(" "); + } + writePSFmt("{0:.4g} {1:.4g}", + colorMap->getDecodeLow(i), colorMap->getDecodeHigh(i)); + } + } + writePS("]\n"); + } else { + writePSFmt(" /Decode [{0:d} {1:d}]\n", invert ? 1 : 0, invert ? 0 : 1); + } + + // data source + if (mode == psModeForm || inType3Char || preload) { + if (inlineImg) { + writePS(" /DataSource { pdfImStr }\n"); + } else { + writePS(" /DataSource { dup 65535 ge { pop 1 add 0 } if 2 index 2" + " index get 1 index get exch 1 add exch }\n"); + } + } else { + writePS(" /DataSource currentfile\n"); + } + + // filters + if ((mode == psModeForm || inType3Char || preload) && + globalParams->getPSUncompressPreloadedImages()) { + s = NULL; + useRLE = gFalse; + useCompressed = gFalse; + useASCII = gFalse; + } else { + s = str->getPSFilter(level < psLevel2 ? 1 : level < psLevel3 ? 2 : 3, + " "); + if ((colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) || + inlineImg || !s) { + useRLE = gTrue; + useASCII = !(mode == psModeForm || inType3Char || preload); + useCompressed = gFalse; + } else { + useRLE = gFalse; + useASCII = str->isBinary() && + !(mode == psModeForm || inType3Char || preload); + useCompressed = gTrue; + } + } + if (useASCII) { + writePSFmt(" /ASCII{0:s}Decode filter\n", + useASCIIHex ? "Hex" : "85"); + } + if (useRLE) { + writePS(" /RunLengthDecode filter\n"); + } + if (useCompressed) { + writePS(s->getCString()); + } + if (s) { + delete s; + } + + if (mode == psModeForm || inType3Char || preload) { + + // end of image dictionary + writePSFmt(">>\n{0:s}\n", colorMap ? "image" : "imagemask"); + + // get rid of the array and index + if (!inlineImg) writePS("pop "); + writePS("pop pop\n"); + + } else { + + // cut off inline image streams at appropriate length + if (inlineImg) { + str = new FixedLengthEncoder(str, len); + } else if (useCompressed) { + str = str->getUndecodedStream(); + } + + // recode DeviceN data + if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) { + str = new DeviceNRecoder(str, width, height, colorMap); + } + + // add RunLengthEncode and ASCIIHex/85 encode filters + if (useRLE) { + str = new RunLengthEncoder(str); + } + if (useASCII) { + if (useASCIIHex) { + str = new ASCIIHexEncoder(str); + } else { + str = new ASCII85Encoder(str); + } + } + + // end of image dictionary + writePS(">>\n"); +#if OPI_SUPPORT + if (opi13Nest) { + if (inlineImg) { + // this can't happen -- OPI dictionaries are in XObjects + error(errSyntaxError, -1, "OPI in inline image"); + n = 0; + } else { + // need to read the stream to count characters -- the length + // is data-dependent (because of ASCII and RLE filters) + str->reset(); + n = 0; + while ((c = str->getChar()) != EOF) { + ++n; + } + str->close(); + } + // +6/7 for "pdfIm\n" / "pdfImM\n" + // +8 for newline + trailer + n += colorMap ? 14 : 15; + writePSFmt("%%BeginData: {0:d} Hex Bytes\n", n); + } +#endif + if ((level == psLevel2Sep || level == psLevel3Sep) && colorMap && + colorMap->getColorSpace()->getMode() == csSeparation && colorMap->getBits() == 8) { + color.c[0] = gfxColorComp1; + sepCS = (GfxSeparationColorSpace *)colorMap->getColorSpace(); + sepCS->getCMYK(&color, &cmyk); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} ({4:t}) pdfImSep\n", + colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k), + sepCS->getName()); + } else { + writePSFmt("{0:s}\n", colorMap ? "pdfIm" : "pdfImM"); + } + + // copy the stream data + str->reset(); + i = 0; + while ((c = str->getChar()) != EOF) { + dataBuf[i++] = c; + if (i >= (int)sizeof(dataBuf)) { + writePSBuf(dataBuf, i); + i = 0; + } + } + if (i > 0) { + writePSBuf(dataBuf, i); + } + str->close(); + + // add newline and trailer to the end + writePSChar('\n'); + writePS("%-EOD-\n"); +#if OPI_SUPPORT + if (opi13Nest) { + writePS("%%EndData\n"); + } +#endif + + // delete encoders + if (useRLE || useASCII || inlineImg) { + delete str; + } + } + + if ((maskColors && colorMap && !inlineImg) || maskStr) { + if (rectsOutLen < 65536/4) { + writePS("pdfImClipEnd\n"); + } else { + writePS("grestore\n"); + } + } +} + +//~ this doesn't currently support OPI +void PSOutputDev::doImageL3(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert) { + Stream *str2; + GooString *s; + int n, numComps; + GBool useRLE, useASCII, useASCIIHex, useCompressed; + GBool maskUseRLE, maskUseASCII, maskUseCompressed; + GooString *maskFilters; + GfxSeparationColorSpace *sepCS; + GfxColor color; + GfxCMYK cmyk; + int c; + int col, i; + + useASCIIHex = globalParams->getPSASCIIHex(); + useRLE = useASCII = useCompressed = gFalse; // make gcc happy + maskUseRLE = maskUseASCII = maskUseCompressed = gFalse; // make gcc happy + maskFilters = NULL; // make gcc happy + + // explicit masking + if (maskStr) { + + // mask data source + if ((mode == psModeForm || inType3Char || preload) && + globalParams->getPSUncompressPreloadedImages()) { + s = NULL; + maskUseRLE = gFalse; + maskUseCompressed = gFalse; + maskUseASCII = gFalse; + } else { + s = maskStr->getPSFilter(3, " "); + if (!s) { + maskUseRLE = gTrue; + maskUseASCII = !(mode == psModeForm || inType3Char || preload); + maskUseCompressed = gFalse; + } else { + maskUseRLE = gFalse; + maskUseASCII = maskStr->isBinary() && + !(mode == psModeForm || inType3Char || preload); + maskUseCompressed = gTrue; + } + } + maskFilters = new GooString(); + if (maskUseASCII) { + maskFilters->appendf(" /ASCII{0:s}Decode filter\n", + useASCIIHex ? "Hex" : "85"); + } + if (maskUseRLE) { + maskFilters->append(" /RunLengthDecode filter\n"); + } + if (maskUseCompressed) { + maskFilters->append(s); + } + if (s) { + delete s; + } + if (mode == psModeForm || inType3Char || preload) { + writePSFmt("MaskData_{0:d}_{1:d} pdfMaskInit\n", + ref->getRefNum(), ref->getRefGen()); + } else { + writePS("currentfile\n"); + writePS(maskFilters->getCString()); + writePS("pdfMask\n"); + + // add RunLengthEncode and ASCIIHex/85 encode filters + if (maskUseCompressed) { + maskStr = maskStr->getUndecodedStream(); + } + if (maskUseRLE) { + maskStr = new RunLengthEncoder(maskStr); + } + if (maskUseASCII) { + if (useASCIIHex) { + maskStr = new ASCIIHexEncoder(maskStr); + } else { + maskStr = new ASCII85Encoder(maskStr); + } + } + + // copy the stream data + maskStr->reset(); + while ((c = maskStr->getChar()) != EOF) { + writePSChar(c); + } + maskStr->close(); + writePSChar('\n'); + writePS("%-EOD-\n"); + + // delete encoders + if (maskUseRLE || maskUseASCII) { + delete maskStr; + } + } + } + + // color space + if (colorMap) { + dumpColorSpaceL2(colorMap->getColorSpace(), gFalse, gTrue, gFalse); + writePS(" setcolorspace\n"); + } + + // set up the image data + if (mode == psModeForm || inType3Char || preload) { + if (inlineImg) { + // create an array + str2 = new FixedLengthEncoder(str, len); + str2 = new RunLengthEncoder(str2); + if (useASCIIHex) { + str2 = new ASCIIHexEncoder(str2); + } else { + str2 = new ASCII85Encoder(str2); + } + str2->reset(); + col = 0; + writePS((char *)(useASCIIHex ? "[<" : "[<~")); + do { + do { + c = str2->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + if (c == 'z') { + writePSChar(c); + ++col; + } else { + writePSChar(c); + ++col; + for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) { + do { + c = str2->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (useASCIIHex ? '>' : '~') || c == EOF) { + break; + } + writePSChar(c); + ++col; + } + } + // each line is: "<~...data...~>" + // so max data length = 255 - 6 = 249 + // chunks are 1 or 5 bytes each, so we have to stop at 245 + // but make it 240 just to be safe + if (col > 240) { + writePS((char *)(useASCIIHex ? ">\n<" : "~>\n<~")); + col = 0; + } + } while (c != (useASCIIHex ? '>' : '~') && c != EOF); + writePS((char *)(useASCIIHex ? ">\n" : "~>\n")); + // add an extra entry because the RunLengthDecode filter may + // read past the end + writePS("<>]\n"); + writePS("0\n"); + str2->close(); + delete str2; + } else { + // make sure the image is setup, it sometimes is not like on bug #17645 + setupImage(ref->getRef(), str, gFalse); + // set up to use the array already created by setupImages() + writePSFmt("ImData_{0:d}_{1:d} 0 0\n", ref->getRefNum(), ref->getRefGen()); + } + } + + // explicit masking + if (maskStr) { + writePS("<<\n /ImageType 3\n"); + writePS(" /InterleaveType 3\n"); + writePS(" /DataDict\n"); + } + + // image (data) dictionary + writePSFmt("<<\n /ImageType {0:d}\n", (maskColors && colorMap) ? 4 : 1); + + // color key masking + if (maskColors && colorMap) { + writePS(" /MaskColor [\n"); + numComps = colorMap->getNumPixelComps(); + for (i = 0; i < 2 * numComps; i += 2) { + writePSFmt(" {0:d} {1:d}\n", maskColors[i], maskColors[i+1]); + } + writePS(" ]\n"); + } + + // width, height, matrix, bits per component + writePSFmt(" /Width {0:d}\n", width); + writePSFmt(" /Height {0:d}\n", height); + writePSFmt(" /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n", + width, -height, height); + if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) { + writePS(" /BitsPerComponent 8\n"); + } else { + writePSFmt(" /BitsPerComponent {0:d}\n", + colorMap ? colorMap->getBits() : 1); + } + + // decode + if (colorMap) { + writePS(" /Decode ["); + if ((level == psLevel2Sep || level == psLevel3Sep) && + colorMap->getColorSpace()->getMode() == csSeparation) { + // this matches up with the code in the pdfImSep operator + n = (1 << colorMap->getBits()) - 1; + writePSFmt("{0:.4g} {1:.4g}", colorMap->getDecodeLow(0) * n, + colorMap->getDecodeHigh(0) * n); + } else { + numComps = colorMap->getNumPixelComps(); + for (i = 0; i < numComps; ++i) { + if (i > 0) { + writePS(" "); + } + writePSFmt("{0:.4g} {1:.4g}", colorMap->getDecodeLow(i), + colorMap->getDecodeHigh(i)); + } + } + writePS("]\n"); + } else { + writePSFmt(" /Decode [{0:d} {1:d}]\n", invert ? 1 : 0, invert ? 0 : 1); + } + + // data source + if (mode == psModeForm || inType3Char || preload) { + if (inlineImg) { + writePS(" /DataSource { pdfImStr }\n"); + } else { + writePS(" /DataSource { dup 65535 ge { pop 1 add 0 } if 2 index 2" + " index get 1 index get exch 1 add exch }\n"); + } + } else { + writePS(" /DataSource currentfile\n"); + } + + // filters + if ((mode == psModeForm || inType3Char || preload) && + globalParams->getPSUncompressPreloadedImages()) { + s = NULL; + useRLE = gFalse; + useCompressed = gFalse; + useASCII = gFalse; + } else { + s = str->getPSFilter(level < psLevel2 ? 1 : level < psLevel3 ? 2 : 3, + " "); + if ((colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) || + inlineImg || !s) { + useRLE = gTrue; + useASCII = !(mode == psModeForm || inType3Char || preload); + useCompressed = gFalse; + } else { + useRLE = gFalse; + useASCII = str->isBinary() && + !(mode == psModeForm || inType3Char || preload); + useCompressed = gTrue; + } + } + if (useASCII) { + writePSFmt(" /ASCII{0:s}Decode filter\n", + useASCIIHex ? "Hex" : "85"); + } + if (useRLE) { + writePS(" /RunLengthDecode filter\n"); + } + if (useCompressed) { + writePS(s->getCString()); + } + if (s) { + delete s; + } + + // end of image (data) dictionary + writePS(">>\n"); + + // explicit masking + if (maskStr) { + writePS(" /MaskDict\n"); + writePS("<<\n"); + writePS(" /ImageType 1\n"); + writePSFmt(" /Width {0:d}\n", maskWidth); + writePSFmt(" /Height {0:d}\n", maskHeight); + writePSFmt(" /ImageMatrix [{0:d} 0 0 {1:d} 0 {2:d}]\n", + maskWidth, -maskHeight, maskHeight); + writePS(" /BitsPerComponent 1\n"); + writePSFmt(" /Decode [{0:d} {1:d}]\n", + maskInvert ? 1 : 0, maskInvert ? 0 : 1); + + // mask data source + if (mode == psModeForm || inType3Char || preload) { + writePS(" /DataSource {pdfMaskSrc}\n"); + writePS(maskFilters->getCString()); + } else { + writePS(" /DataSource maskStream\n"); + } + delete maskFilters; + + writePS(">>\n"); + writePS(">>\n"); + } + + if (mode == psModeForm || inType3Char || preload) { + + // image command + writePSFmt("{0:s}\n", colorMap ? "image" : "imagemask"); + + } else { + + if ((level == psLevel2Sep || level == psLevel3Sep) && colorMap && + colorMap->getColorSpace()->getMode() == csSeparation && colorMap->getBits() == 8) { + color.c[0] = gfxColorComp1; + sepCS = (GfxSeparationColorSpace *)colorMap->getColorSpace(); + sepCS->getCMYK(&color, &cmyk); + writePSFmt("{0:.4g} {1:.4g} {2:.4g} {3:.4g} ({4:t}) pdfImSep\n", + colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k), + sepCS->getName()); + } else { + writePSFmt("{0:s}\n", colorMap ? "pdfIm" : "pdfImM"); + } + + } + + // get rid of the array and index + if (mode == psModeForm || inType3Char || preload) { + if (!inlineImg) writePS("pop "); + writePS("pop pop\n"); + + // image data + } else { + + // cut off inline image streams at appropriate length + if (inlineImg) { + str = new FixedLengthEncoder(str, len); + } else if (useCompressed) { + str = str->getUndecodedStream(); + } + + // add RunLengthEncode and ASCIIHex/85 encode filters + if (useRLE) { + str = new RunLengthEncoder(str); + } + if (useASCII) { + if (useASCIIHex) { + str = new ASCIIHexEncoder(str); + } else { + str = new ASCII85Encoder(str); + } + } + + // copy the stream data + str->reset(); + while ((c = str->getChar()) != EOF) { + writePSChar(c); + } + str->close(); + + // add newline and trailer to the end + writePSChar('\n'); + writePS("%-EOD-\n"); + + // delete encoders + if (useRLE || useASCII || inlineImg) { + delete str; + } + } + + // close the mask stream + if (maskStr) { + if (!(mode == psModeForm || inType3Char || preload)) { + writePS("pdfMaskEnd\n"); + } + } +} + +void PSOutputDev::dumpColorSpaceL2(GfxColorSpace *colorSpace, + GBool genXform, GBool updateColors, + GBool map01) { + GfxCalGrayColorSpace *calGrayCS; + GfxCalRGBColorSpace *calRGBCS; + GfxLabColorSpace *labCS; + GfxIndexedColorSpace *indexedCS; + GfxSeparationColorSpace *separationCS; + GfxDeviceNColorSpace *deviceNCS; + GfxColorSpace *baseCS; + Guchar *lookup, *p; + double x[gfxColorMaxComps], y[gfxColorMaxComps]; + double low[gfxColorMaxComps], range[gfxColorMaxComps]; + GfxColor color; + GfxCMYK cmyk; + Function *func; + int n, numComps, numAltComps; + int byte; + int i, j, k; + + switch (colorSpace->getMode()) { + + case csDeviceGray: + writePS("/DeviceGray"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + processColors |= psProcessBlack; + } + break; + + case csCalGray: + calGrayCS = (GfxCalGrayColorSpace *)colorSpace; + writePS("[/CIEBasedA <<\n"); + writePSFmt(" /DecodeA {{{0:.4g} exp}} bind\n", calGrayCS->getGamma()); + writePSFmt(" /MatrixA [{0:.4g} {1:.4g} {2:.4g}]\n", + calGrayCS->getWhiteX(), calGrayCS->getWhiteY(), + calGrayCS->getWhiteZ()); + writePSFmt(" /WhitePoint [{0:.4g} {1:.4g} {2:.4g}]\n", + calGrayCS->getWhiteX(), calGrayCS->getWhiteY(), + calGrayCS->getWhiteZ()); + writePSFmt(" /BlackPoint [{0:.4g} {1:.4g} {2:.4g}]\n", + calGrayCS->getBlackX(), calGrayCS->getBlackY(), + calGrayCS->getBlackZ()); + writePS(">>]"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + processColors |= psProcessBlack; + } + break; + + case csDeviceRGB: + writePS("/DeviceRGB"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + processColors |= psProcessCMYK; + } + break; + + case csCalRGB: + calRGBCS = (GfxCalRGBColorSpace *)colorSpace; + writePS("[/CIEBasedABC <<\n"); + writePSFmt(" /DecodeABC [{{{0:.4g} exp}} bind {{{1:.4g} exp}} bind {{{2:.4g} exp}} bind]\n", + calRGBCS->getGammaR(), calRGBCS->getGammaG(), + calRGBCS->getGammaB()); + writePSFmt(" /MatrixABC [{0:.4g} {1:.4g} {2:.4g} {3:.4g} {4:.4g} {5:.4g} {6:.4g} {7:.4g} {8:.4g}]\n", + calRGBCS->getMatrix()[0], calRGBCS->getMatrix()[1], + calRGBCS->getMatrix()[2], calRGBCS->getMatrix()[3], + calRGBCS->getMatrix()[4], calRGBCS->getMatrix()[5], + calRGBCS->getMatrix()[6], calRGBCS->getMatrix()[7], + calRGBCS->getMatrix()[8]); + writePSFmt(" /WhitePoint [{0:.4g} {1:.4g} {2:.4g}]\n", + calRGBCS->getWhiteX(), calRGBCS->getWhiteY(), + calRGBCS->getWhiteZ()); + writePSFmt(" /BlackPoint [{0:.4g} {1:.4g} {2:.4g}]\n", + calRGBCS->getBlackX(), calRGBCS->getBlackY(), + calRGBCS->getBlackZ()); + writePS(">>]"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + processColors |= psProcessCMYK; + } + break; + + case csDeviceCMYK: + writePS("/DeviceCMYK"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + processColors |= psProcessCMYK; + } + break; + + case csLab: + labCS = (GfxLabColorSpace *)colorSpace; + writePS("[/CIEBasedABC <<\n"); + if (map01) { + writePS(" /RangeABC [0 1 0 1 0 1]\n"); + writePSFmt(" /DecodeABC [{{100 mul 16 add 116 div}} bind {{{0:.4g} mul {1:.4g} add}} bind {{{2:.4g} mul {3:.4g} add}} bind]\n", + (labCS->getAMax() - labCS->getAMin()) / 500.0, + labCS->getAMin() / 500.0, + (labCS->getBMax() - labCS->getBMin()) / 200.0, + labCS->getBMin() / 200.0); + } else { + writePSFmt(" /RangeABC [0 100 {0:.4g} {1:.4g} {2:.4g} {3:.4g}]\n", + labCS->getAMin(), labCS->getAMax(), + labCS->getBMin(), labCS->getBMax()); + writePS(" /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind]\n"); + } + writePS(" /MatrixABC [1 1 1 1 0 0 0 0 -1]\n"); + writePS(" /DecodeLMN\n"); + writePS(" [{dup 6 29 div ge {dup dup mul mul}\n"); + writePSFmt(" {{4 29 div sub 108 841 div mul }} ifelse {0:.4g} mul}} bind\n", + labCS->getWhiteX()); + writePS(" {dup 6 29 div ge {dup dup mul mul}\n"); + writePSFmt(" {{4 29 div sub 108 841 div mul }} ifelse {0:.4g} mul}} bind\n", + labCS->getWhiteY()); + writePS(" {dup 6 29 div ge {dup dup mul mul}\n"); + writePSFmt(" {{4 29 div sub 108 841 div mul }} ifelse {0:.4g} mul}} bind]\n", + labCS->getWhiteZ()); + writePSFmt(" /WhitePoint [{0:.4g} {1:.4g} {2:.4g}]\n", + labCS->getWhiteX(), labCS->getWhiteY(), labCS->getWhiteZ()); + writePSFmt(" /BlackPoint [{0:.4g} {1:.4g} {2:.4g}]\n", + labCS->getBlackX(), labCS->getBlackY(), labCS->getBlackZ()); + writePS(">>]"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + processColors |= psProcessCMYK; + } + break; + + case csICCBased: + // there is no transform function to the alternate color space, so + // we can use it directly + dumpColorSpaceL2(((GfxICCBasedColorSpace *)colorSpace)->getAlt(), + genXform, updateColors, gFalse); + break; + + case csIndexed: + indexedCS = (GfxIndexedColorSpace *)colorSpace; + baseCS = indexedCS->getBase(); + writePS("[/Indexed "); + dumpColorSpaceL2(baseCS, gFalse, gFalse, gTrue); + n = indexedCS->getIndexHigh(); + numComps = baseCS->getNComps(); + lookup = indexedCS->getLookup(); + writePSFmt(" {0:d} <\n", n); + if (baseCS->getMode() == csDeviceN && level != psLevel3 && level != psLevel3Sep) { + func = ((GfxDeviceNColorSpace *)baseCS)->getTintTransformFunc(); + baseCS->getDefaultRanges(low, range, indexedCS->getIndexHigh()); + if (((GfxDeviceNColorSpace *)baseCS)->getAlt()->getMode() == csLab) { + labCS = (GfxLabColorSpace *)((GfxDeviceNColorSpace *)baseCS)->getAlt(); + } else { + labCS = NULL; + } + numAltComps = ((GfxDeviceNColorSpace *)baseCS)->getAlt()->getNComps(); + p = lookup; + for (i = 0; i <= n; i += 8) { + writePS(" "); + for (j = i; j < i+8 && j <= n; ++j) { + for (k = 0; k < numComps; ++k) { + x[k] = low[k] + (*p++ / 255.0) * range[k]; + } + func->transform(x, y); + if (labCS) { + y[0] /= 100.0; + y[1] = (y[1] - labCS->getAMin()) / + (labCS->getAMax() - labCS->getAMin()); + y[2] = (y[2] - labCS->getBMin()) / + (labCS->getBMax() - labCS->getBMin()); + } + for (k = 0; k < numAltComps; ++k) { + byte = (int)(y[k] * 255 + 0.5); + if (byte < 0) { + byte = 0; + } else if (byte > 255) { + byte = 255; + } + writePSFmt("{0:02x}", byte); + } + if (updateColors) { + color.c[0] = dblToCol(j); + indexedCS->getCMYK(&color, &cmyk); + addProcessColor(colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k)); + } + } + writePS("\n"); + } + } else { + for (i = 0; i <= n; i += 8) { + writePS(" "); + for (j = i; j < i+8 && j <= n; ++j) { + for (k = 0; k < numComps; ++k) { + writePSFmt("{0:02x}", lookup[j * numComps + k]); + } + if (updateColors) { + color.c[0] = dblToCol(j); + indexedCS->getCMYK(&color, &cmyk); + addProcessColor(colToDbl(cmyk.c), colToDbl(cmyk.m), + colToDbl(cmyk.y), colToDbl(cmyk.k)); + } + } + writePS("\n"); + } + } + writePS(">]"); + if (genXform) { + writePS(" {}"); + } + break; + + case csSeparation: + separationCS = (GfxSeparationColorSpace *)colorSpace; + writePS("[/Separation "); + writePSString(separationCS->getName()); + writePS(" "); + dumpColorSpaceL2(separationCS->getAlt(), gFalse, gFalse, gFalse); + writePS("\n"); + cvtFunction(separationCS->getFunc()); + writePS("]"); + if (genXform) { + writePS(" {}"); + } + if (updateColors) { + addCustomColor(separationCS); + } + break; + + case csDeviceN: + deviceNCS = (GfxDeviceNColorSpace *)colorSpace; + if (level == psLevel3 || level == psLevel3Sep) { + writePS("[/DeviceN\n"); + writePS(" [ "); + for (i = 0; i < deviceNCS->getNComps(); i++) { + writePSString(deviceNCS->getColorantName(i)); + writePS(" "); + } + writePS("]\n"); + dumpColorSpaceL2(deviceNCS->getAlt(), gFalse, updateColors, gFalse); + writePS("\n"); + cvtFunction(deviceNCS->getTintTransformFunc(), map01 && deviceNCS->getAlt()->getMode() == csLab); + writePS("]\n"); + if (genXform) { + writePS(" {}"); + } + } else { + // DeviceN color spaces are a Level 3 PostScript feature. + dumpColorSpaceL2(deviceNCS->getAlt(), gFalse, updateColors, map01); + if (genXform) { + writePS(" "); + cvtFunction(deviceNCS->getTintTransformFunc()); + } + } + break; + + case csPattern: + //~ unimplemented + break; + } +} + +#if OPI_SUPPORT +void PSOutputDev::opiBegin(GfxState *state, Dict *opiDict) { + Object dict; + + if (globalParams->getPSOPI()) { + opiDict->lookup("2.0", &dict); + if (dict.isDict()) { + opiBegin20(state, dict.getDict()); + dict.free(); + } else { + dict.free(); + opiDict->lookup("1.3", &dict); + if (dict.isDict()) { + opiBegin13(state, dict.getDict()); + } + dict.free(); + } + } +} + +void PSOutputDev::opiBegin20(GfxState *state, Dict *dict) { + Object obj1, obj2, obj3, obj4; + double width, height, left, right, top, bottom; + int w, h; + int i; + + writePS("%%BeginOPI: 2.0\n"); + writePS("%%Distilled\n"); + + dict->lookup("F", &obj1); + if (getFileSpecName(&obj1, &obj2)) { + writePSFmt("%%ImageFileName: {0:t}\n", obj2.getString()); + obj2.free(); + } + obj1.free(); + + dict->lookup("MainImage", &obj1); + if (obj1.isString()) { + writePSFmt("%%MainImage: {0:t}\n", obj1.getString()); + } + obj1.free(); + + //~ ignoring 'Tags' entry + //~ need to use writePSString() and deal with >255-char lines + + dict->lookup("Size", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 2) { + obj1.arrayGet(0, &obj2); + width = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + height = obj2.getNum(); + obj2.free(); + writePSFmt("%%ImageDimensions: {0:.6g} {1:.6g}\n", width, height); + } + obj1.free(); + + dict->lookup("CropRect", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 4) { + obj1.arrayGet(0, &obj2); + left = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + top = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + right = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + bottom = obj2.getNum(); + obj2.free(); + writePSFmt("%%ImageCropRect: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n", + left, top, right, bottom); + } + obj1.free(); + + dict->lookup("Overprint", &obj1); + if (obj1.isBool()) { + writePSFmt("%%ImageOverprint: {0:s}\n", obj1.getBool() ? "true" : "false"); + } + obj1.free(); + + dict->lookup("Inks", &obj1); + if (obj1.isName()) { + writePSFmt("%%ImageInks: {0:s}\n", obj1.getName()); + } else if (obj1.isArray() && obj1.arrayGetLength() >= 1) { + obj1.arrayGet(0, &obj2); + if (obj2.isName()) { + writePSFmt("%%ImageInks: {0:s} {1:d}", + obj2.getName(), (obj1.arrayGetLength() - 1) / 2); + for (i = 1; i+1 < obj1.arrayGetLength(); i += 2) { + obj1.arrayGet(i, &obj3); + obj1.arrayGet(i+1, &obj4); + if (obj3.isString() && obj4.isNum()) { + writePS(" "); + writePSString(obj3.getString()); + writePSFmt(" {0:.6g}", obj4.getNum()); + } + obj3.free(); + obj4.free(); + } + writePS("\n"); + } + obj2.free(); + } + obj1.free(); + + writePS("gsave\n"); + + writePS("%%BeginIncludedImage\n"); + + dict->lookup("IncludedImageDimensions", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 2) { + obj1.arrayGet(0, &obj2); + w = obj2.getInt(); + obj2.free(); + obj1.arrayGet(1, &obj2); + h = obj2.getInt(); + obj2.free(); + writePSFmt("%%IncludedImageDimensions: {0:d} {1:d}\n", w, h); + } + obj1.free(); + + dict->lookup("IncludedImageQuality", &obj1); + if (obj1.isNum()) { + writePSFmt("%%IncludedImageQuality: {0:.6g}\n", obj1.getNum()); + } + obj1.free(); + + ++opi20Nest; +} + +void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) { + Object obj1, obj2; + int left, right, top, bottom, samples, bits, width, height; + double c, m, y, k; + double llx, lly, ulx, uly, urx, ury, lrx, lry; + double tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry; + double horiz, vert; + int i, j; + + writePS("save\n"); + writePS("/opiMatrix2 matrix currentmatrix def\n"); + writePS("opiMatrix setmatrix\n"); + + dict->lookup("F", &obj1); + if (getFileSpecName(&obj1, &obj2)) { + writePSFmt("%ALDImageFileName: {0:t}\n", obj2.getString()); + obj2.free(); + } + obj1.free(); + + dict->lookup("CropRect", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 4) { + obj1.arrayGet(0, &obj2); + left = obj2.getInt(); + obj2.free(); + obj1.arrayGet(1, &obj2); + top = obj2.getInt(); + obj2.free(); + obj1.arrayGet(2, &obj2); + right = obj2.getInt(); + obj2.free(); + obj1.arrayGet(3, &obj2); + bottom = obj2.getInt(); + obj2.free(); + writePSFmt("%ALDImageCropRect: {0:d} {1:d} {2:d} {3:d}\n", + left, top, right, bottom); + } + obj1.free(); + + dict->lookup("Color", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 5) { + obj1.arrayGet(0, &obj2); + c = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + m = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + y = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + k = obj2.getNum(); + obj2.free(); + obj1.arrayGet(4, &obj2); + if (obj2.isString()) { + writePSFmt("%ALDImageColor: {0:.4g} {1:.4g} {2:.4g} {3:.4g} ", + c, m, y, k); + writePSString(obj2.getString()); + writePS("\n"); + } + obj2.free(); + } + obj1.free(); + + dict->lookup("ColorType", &obj1); + if (obj1.isName()) { + writePSFmt("%ALDImageColorType: {0:s}\n", obj1.getName()); + } + obj1.free(); + + //~ ignores 'Comments' entry + //~ need to handle multiple lines + + dict->lookup("CropFixed", &obj1); + if (obj1.isArray()) { + obj1.arrayGet(0, &obj2); + ulx = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + uly = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + lrx = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + lry = obj2.getNum(); + obj2.free(); + writePSFmt("%ALDImageCropFixed: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n", + ulx, uly, lrx, lry); + } + obj1.free(); + + dict->lookup("GrayMap", &obj1); + if (obj1.isArray()) { + writePS("%ALDImageGrayMap:"); + for (i = 0; i < obj1.arrayGetLength(); i += 16) { + if (i > 0) { + writePS("\n%%+"); + } + for (j = 0; j < 16 && i+j < obj1.arrayGetLength(); ++j) { + obj1.arrayGet(i+j, &obj2); + writePSFmt(" {0:d}", obj2.getInt()); + obj2.free(); + } + } + writePS("\n"); + } + obj1.free(); + + dict->lookup("ID", &obj1); + if (obj1.isString()) { + writePSFmt("%ALDImageID: {0:t}\n", obj1.getString()); + } + obj1.free(); + + dict->lookup("ImageType", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 2) { + obj1.arrayGet(0, &obj2); + samples = obj2.getInt(); + obj2.free(); + obj1.arrayGet(1, &obj2); + bits = obj2.getInt(); + obj2.free(); + writePSFmt("%ALDImageType: {0:d} {1:d}\n", samples, bits); + } + obj1.free(); + + dict->lookup("Overprint", &obj1); + if (obj1.isBool()) { + writePSFmt("%ALDImageOverprint: {0:s}\n", + obj1.getBool() ? "true" : "false"); + } + obj1.free(); + + dict->lookup("Position", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 8) { + obj1.arrayGet(0, &obj2); + llx = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + lly = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2, &obj2); + ulx = obj2.getNum(); + obj2.free(); + obj1.arrayGet(3, &obj2); + uly = obj2.getNum(); + obj2.free(); + obj1.arrayGet(4, &obj2); + urx = obj2.getNum(); + obj2.free(); + obj1.arrayGet(5, &obj2); + ury = obj2.getNum(); + obj2.free(); + obj1.arrayGet(6, &obj2); + lrx = obj2.getNum(); + obj2.free(); + obj1.arrayGet(7, &obj2); + lry = obj2.getNum(); + obj2.free(); + opiTransform(state, llx, lly, &tllx, &tlly); + opiTransform(state, ulx, uly, &tulx, &tuly); + opiTransform(state, urx, ury, &turx, &tury); + opiTransform(state, lrx, lry, &tlrx, &tlry); + writePSFmt("%ALDImagePosition: {0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} {6:.6g} {7:.6g}\n", + tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry); + obj2.free(); + } + obj1.free(); + + dict->lookup("Resolution", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 2) { + obj1.arrayGet(0, &obj2); + horiz = obj2.getNum(); + obj2.free(); + obj1.arrayGet(1, &obj2); + vert = obj2.getNum(); + obj2.free(); + writePSFmt("%ALDImageResoution: {0:.6g} {1:.6g}\n", horiz, vert); + obj2.free(); + } + obj1.free(); + + dict->lookup("Size", &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 2) { + obj1.arrayGet(0, &obj2); + width = obj2.getInt(); + obj2.free(); + obj1.arrayGet(1, &obj2); + height = obj2.getInt(); + obj2.free(); + writePSFmt("%ALDImageDimensions: {0:d} {1:d}\n", width, height); + } + obj1.free(); + + //~ ignoring 'Tags' entry + //~ need to use writePSString() and deal with >255-char lines + + dict->lookup("Tint", &obj1); + if (obj1.isNum()) { + writePSFmt("%ALDImageTint: {0:.6g}\n", obj1.getNum()); + } + obj1.free(); + + dict->lookup("Transparency", &obj1); + if (obj1.isBool()) { + writePSFmt("%ALDImageTransparency: {0:s}\n", + obj1.getBool() ? "true" : "false"); + } + obj1.free(); + + writePS("%%BeginObject: image\n"); + writePS("opiMatrix2 setmatrix\n"); + ++opi13Nest; +} + +// Convert PDF user space coordinates to PostScript default user space +// coordinates. This has to account for both the PDF CTM and the +// PSOutputDev page-fitting transform. +void PSOutputDev::opiTransform(GfxState *state, double x0, double y0, + double *x1, double *y1) { + double t; + + state->transform(x0, y0, x1, y1); + *x1 += tx; + *y1 += ty; + if (rotate == 90) { + t = *x1; + *x1 = -*y1; + *y1 = t; + } else if (rotate == 180) { + *x1 = -*x1; + *y1 = -*y1; + } else if (rotate == 270) { + t = *x1; + *x1 = *y1; + *y1 = -t; + } + *x1 *= xScale; + *y1 *= yScale; +} + +void PSOutputDev::opiEnd(GfxState *state, Dict *opiDict) { + Object dict; + + if (globalParams->getPSOPI()) { + opiDict->lookup("2.0", &dict); + if (dict.isDict()) { + writePS("%%EndIncludedImage\n"); + writePS("%%EndOPI\n"); + writePS("grestore\n"); + --opi20Nest; + dict.free(); + } else { + dict.free(); + opiDict->lookup("1.3", &dict); + if (dict.isDict()) { + writePS("%%EndObject\n"); + writePS("restore\n"); + --opi13Nest; + } + dict.free(); + } + } +} +#endif // OPI_SUPPORT + +void PSOutputDev::type3D0(GfxState *state, double wx, double wy) { + writePSFmt("{0:.6g} {1:.6g} setcharwidth\n", wx, wy); + writePS("q\n"); + t3NeedsRestore = gTrue; +} + +void PSOutputDev::type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury) { + t3WX = wx; + t3WY = wy; + t3LLX = llx; + t3LLY = lly; + t3URX = urx; + t3URY = ury; + t3String = new GooString(); + writePS("q\n"); + t3FillColorOnly = gTrue; + t3Cacheable = gTrue; + t3NeedsRestore = gTrue; +} + +void PSOutputDev::drawForm(Ref id) { + writePSFmt("f_{0:d}_{1:d}\n", id.num, id.gen); +} + +void PSOutputDev::psXObject(Stream *psStream, Stream *level1Stream) { + Stream *str; + int c; + + if ((level == psLevel1 || level == psLevel1Sep) && level1Stream) { + str = level1Stream; + } else { + str = psStream; + } + str->reset(); + while ((c = str->getChar()) != EOF) { + writePSChar(c); + } + str->close(); +} + +//~ can nextFunc be reset to 0 -- maybe at the start of each page? +//~ or maybe at the start of each color space / pattern? +void PSOutputDev::cvtFunction(Function *func, GBool invertPSFunction) { + SampledFunction *func0; + ExponentialFunction *func2; + StitchingFunction *func3; + PostScriptFunction *func4; + int thisFunc, m, n, nSamples, i, j, k; + + switch (func->getType()) { + + case -1: // identity + writePS("{}\n"); + break; + + case 0: // sampled + func0 = (SampledFunction *)func; + thisFunc = nextFunc++; + m = func0->getInputSize(); + n = func0->getOutputSize(); + nSamples = n; + for (i = 0; i < m; ++i) { + nSamples *= func0->getSampleSize(i); + } + writePSFmt("/xpdfSamples{0:d} [\n", thisFunc); + for (i = 0; i < nSamples; ++i) { + writePSFmt("{0:.6g}\n", func0->getSamples()[i]); + } + writePS("] def\n"); + writePSFmt("{{ {0:d} array {1:d} array {2:d} 2 roll\n", 2*m, m, m+2); + // [e01] [efrac] x0 x1 ... xm-1 + for (i = m-1; i >= 0; --i) { + // [e01] [efrac] x0 x1 ... xi + writePSFmt("{0:.6g} sub {1:.6g} mul {2:.6g} add\n", + func0->getDomainMin(i), + (func0->getEncodeMax(i) - func0->getEncodeMin(i)) / + (func0->getDomainMax(i) - func0->getDomainMin(i)), + func0->getEncodeMin(i)); + // [e01] [efrac] x0 x1 ... xi-1 xi' + writePSFmt("dup 0 lt {{ pop 0 }} {{ dup {0:d} gt {{ pop {1:d} }} if }} ifelse\n", + func0->getSampleSize(i) - 1, func0->getSampleSize(i) - 1); + // [e01] [efrac] x0 x1 ... xi-1 xi' + writePS("dup floor cvi exch dup ceiling cvi exch 2 index sub\n"); + // [e01] [efrac] x0 x1 ... xi-1 floor(xi') ceiling(xi') xi'-floor(xi') + writePSFmt("{0:d} index {1:d} 3 2 roll put\n", i+3, i); + // [e01] [efrac] x0 x1 ... xi-1 floor(xi') ceiling(xi') + writePSFmt("{0:d} index {1:d} 3 2 roll put\n", i+3, 2*i+1); + // [e01] [efrac] x0 x1 ... xi-1 floor(xi') + writePSFmt("{0:d} index {1:d} 3 2 roll put\n", i+2, 2*i); + // [e01] [efrac] x0 x1 ... xi-1 + } + // [e01] [efrac] + for (i = 0; i < n; ++i) { + // [e01] [efrac] y(0) ... y(i-1) + for (j = 0; j < (1<> k) & 1)); + for (k = m - 2; k >= 0; --k) { + writePSFmt("{0:d} mul {1:d} index {2:d} get add\n", + func0->getSampleSize(k), + i + j + 3, + 2 * k + ((j >> k) & 1)); + } + if (n > 1) { + writePSFmt("{0:d} mul {1:d} add ", n, i); + } + writePS("get\n"); + } + // [e01] [efrac] y(0) ... y(i-1) s(0) s(1) ... s(2^m-1) + for (j = 0; j < m; ++j) { + // [e01] [efrac] y(0) ... y(i-1) s(0) s(1) ... s(2^(m-j)-1) + for (k = 0; k < (1 << (m - j)); k += 2) { + // [e01] [efrac] y(0) ... y(i-1) <2^(m-j)-k s values> + writePSFmt("{0:d} index {1:d} get dup\n", + i + k/2 + (1 << (m-j)) - k, j); + writePS("3 2 roll mul exch 1 exch sub 3 2 roll mul add\n"); + writePSFmt("{0:d} 1 roll\n", k/2 + (1 << (m-j)) - k - 1); + } + // [e01] [efrac] s'(0) s'(1) ... s(2^(m-j-1)-1) + } + // [e01] [efrac] y(0) ... y(i-1) s + writePSFmt("{0:.6g} mul {1:.6g} add\n", + func0->getDecodeMax(i) - func0->getDecodeMin(i), + func0->getDecodeMin(i)); + writePSFmt("dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n", + func0->getRangeMin(i), func0->getRangeMin(i), + func0->getRangeMax(i), func0->getRangeMax(i)); + // [e01] [efrac] y(0) ... y(i-1) y(i) + } + // [e01] [efrac] y(0) ... y(n-1) + writePSFmt("{0:d} {1:d} roll pop pop \n", n+2, n); + if (invertPSFunction) { + for (i = 0; i < n; ++i) { + writePSFmt("{0:d} -1 roll ", n); + writePSFmt("{0:.6g} sub {1:.6g} div ", func0->getRangeMin(i), func0->getRangeMax(i) - func0->getRangeMin(i)); + } + } + writePS("}\n"); + break; + + case 2: // exponential + func2 = (ExponentialFunction *)func; + n = func2->getOutputSize(); + writePSFmt("{{ dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n", + func2->getDomainMin(0), func2->getDomainMin(0), + func2->getDomainMax(0), func2->getDomainMax(0)); + // x + for (i = 0; i < n; ++i) { + // x y(0) .. y(i-1) + writePSFmt("{0:d} index {1:.6g} exp {2:.6g} mul {3:.6g} add\n", + i, func2->getE(), func2->getC1()[i] - func2->getC0()[i], + func2->getC0()[i]); + if (func2->getHasRange()) { + writePSFmt("dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n", + func2->getRangeMin(i), func2->getRangeMin(i), + func2->getRangeMax(i), func2->getRangeMax(i)); + } + } + // x y(0) .. y(n-1) + writePSFmt("{0:d} {1:d} roll pop \n", n+1, n); + if (invertPSFunction && func2->getHasRange()) { + for (i = 0; i < n; ++i) { + writePSFmt("{0:d} -1 roll ", n); + writePSFmt("{0:.6g} sub {1:.6g} div ", func2->getRangeMin(i), func2->getRangeMax(i) - func2->getRangeMin(i)); + } + } + writePS("}\n"); + break; + + case 3: // stitching + func3 = (StitchingFunction *)func; + thisFunc = nextFunc++; + for (i = 0; i < func3->getNumFuncs(); ++i) { + cvtFunction(func3->getFunc(i)); + writePSFmt("/xpdfFunc{0:d}_{1:d} exch def\n", thisFunc, i); + } + writePSFmt("{{ dup {0:.6g} lt {{ pop {1:.6g} }} {{ dup {2:.6g} gt {{ pop {3:.6g} }} if }} ifelse\n", + func3->getDomainMin(0), func3->getDomainMin(0), + func3->getDomainMax(0), func3->getDomainMax(0)); + for (i = 0; i < func3->getNumFuncs() - 1; ++i) { + writePSFmt("dup {0:.6g} lt {{ {1:.6g} sub {2:.6g} mul {3:.6g} add xpdfFunc{4:d}_{5:d} }} {{\n", + func3->getBounds()[i+1], + func3->getBounds()[i], + func3->getScale()[i], + func3->getEncode()[2*i], + thisFunc, i); + } + writePSFmt("{0:.6g} sub {1:.6g} mul {2:.6g} add xpdfFunc{3:d}_{4:d}\n", + func3->getBounds()[i], + func3->getScale()[i], + func3->getEncode()[2*i], + thisFunc, i); + for (i = 0; i < func3->getNumFuncs() - 1; ++i) { + writePS("} ifelse\n"); + } + if (invertPSFunction && func3->getHasRange()) { + n = func3->getOutputSize(); + for (i = 0; i < n; ++i) { + writePSFmt("{0:d} -1 roll ", n); + writePSFmt("{0:.6g} sub {1:.6g} div ", func3->getRangeMin(i), func3->getRangeMax(i) - func3->getRangeMin(i)); + } + } + writePS("}\n"); + break; + + case 4: // PostScript + func4 = (PostScriptFunction *)func; + if (invertPSFunction) { + GooString *codeString = new GooString(func4->getCodeString()); + for (i = codeString->getLength() -1; i > 0; i--) { + if (codeString->getChar(i) == '}') { + codeString->del(i); + break; + } + } + writePS(codeString->getCString()); + writePS("\n"); + delete codeString; + n = func4->getOutputSize(); + for (i = 0; i < n; ++i) { + writePSFmt("{0:d} -1 roll ", n); + writePSFmt("{0:.6g} sub {1:.6g} div ", func4->getRangeMin(i), func4->getRangeMax(i) - func4->getRangeMin(i)); + } + writePS("}\n"); + } else { + writePS(func4->getCodeString()->getCString()); + writePS("\n"); + } + break; + } +} + +void PSOutputDev::writePSChar(char c) { + if (t3String) { + t3String->append(c); + } else { + (*outputFunc)(outputStream, &c, 1); + } +} + +void PSOutputDev::writePS(const char *s) { + if (t3String) { + t3String->append(s); + } else { + (*outputFunc)(outputStream, s, strlen(s)); + } +} + +void PSOutputDev::writePSBuf(const char *s, int len) { + if (t3String) { + for (int i = 0; i < len; i++) { + t3String->append(s[i]); + } + } else { + (*outputFunc)(outputStream, s, len); + } +} + +void PSOutputDev::writePSFmt(const char *fmt, ...) { + va_list args; + GooString *buf; + + va_start(args, fmt); + if (t3String) { + t3String->appendfv((char *)fmt, args); + } else { + buf = GooString::formatv((char *)fmt, args); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + va_end(args); +} + +void PSOutputDev::writePSString(GooString *s) { + Guchar *p; + int n, line; + char buf[8]; + + writePSChar('('); + line = 1; + for (p = (Guchar *)s->getCString(), n = s->getLength(); n; ++p, --n) { + if (line >= 64) { + writePSChar('\\'); + writePSChar('\n'); + line = 0; + } + if (*p == '(' || *p == ')' || *p == '\\') { + writePSChar('\\'); + writePSChar((char)*p); + line += 2; + } else if (*p < 0x20 || *p >= 0x80) { + sprintf(buf, "\\%03o", *p); + writePS(buf); + line += 4; + } else { + writePSChar((char)*p); + ++line; + } + } + writePSChar(')'); +} + +void PSOutputDev::writePSName(const char *s) { + const char *p; + char c; + + p = s; + while ((c = *p++)) { + if (c <= (char)0x20 || c >= (char)0x7f || + c == '(' || c == ')' || c == '<' || c == '>' || + c == '[' || c == ']' || c == '{' || c == '}' || + c == '/' || c == '%' || c == '\\') { + writePSFmt("#{0:02x}", c & 0xff); + } else { + writePSChar(c); + } + } +} + +GooString *PSOutputDev::filterPSName(GooString *name) { + GooString *name2; + char buf[8]; + int i; + char c; + + name2 = new GooString(); + + // ghostscript chokes on names that begin with out-of-limits + // numbers, e.g., 1e4foo is handled correctly (as a name), but + // 1e999foo generates a limitcheck error + c = name->getChar(0); + if (c >= '0' && c <= '9') { + name2->append('f'); + } + + for (i = 0; i < name->getLength(); ++i) { + c = name->getChar(i); + if (c <= (char)0x20 || c >= (char)0x7f || + c == '(' || c == ')' || c == '<' || c == '>' || + c == '[' || c == ']' || c == '{' || c == '}' || + c == '/' || c == '%') { + sprintf(buf, "#%02x", c & 0xff); + name2->append(buf); + } else { + name2->append(c); + } + } + return name2; +} + +// Convert GooString to GooString, with appropriate escaping +// of things that can't appear in a label +// This is heavily based on the writePSTextLine() method +GooString* PSOutputDev::filterPSLabel(GooString *label, GBool *needParens) { + int i, step; + GBool isNumeric; + + // - DSC comments must be printable ASCII; control chars and + // backslashes have to be escaped (we do cheap UCS2-to-ASCII + // conversion by simply ignoring the high byte) + // - parentheses are escaped. this isn't strictly necessary for matched + // parentheses, but shouldn't be a problem + // - lines are limited to 255 chars (we limit to 200 here to allow + // for the keyword, which was emitted by the caller) + + GooString *label2 = new GooString(); + int labelLength = label->getLength(); + + if (labelLength == 0) { + isNumeric = false; + } else { + // this gets changed later if we find a non-numeric character + isNumeric = true; + } + + if ( (labelLength >= 2) && + ( (label->getChar(0) & 0xff) == 0xfe) && + ( (label->getChar(1) & 0xff) == 0xff) ) { + // UCS2 mode + i = 3; + step = 2; + if ( (label->getChar(labelLength-1) == 0) ) { + // prune the trailing null (0x000 for UCS2) + labelLength -= 2; + } + } else { + i = 0; + step = 1; + } + for (int j = 0; i < labelLength && j < 200; i += step) { + char c = label->getChar(i); + if ( (c < '0') || (c > '9') ) { + isNumeric = false; + } + if (c == '\\') { + label2->append("\\\\"); + j += 2; + } else if (c == ')') { + label2->append("\\)"); + } else if (c == '(') { + label2->append("\\("); + } else if (c < 0x20 || c > 0x7e) { + label2->append(GooString::format("\\{0:03o}", c)); + j += 4; + } else { + label2->append(c); + ++j; + } + } + if (needParens) { + *needParens = !(isNumeric); + } + return label2; +} + +// Write a DSC-compliant . +void PSOutputDev::writePSTextLine(GooString *s) { + int i, j, step; + int c; + + // - DSC comments must be printable ASCII; control chars and + // backslashes have to be escaped (we do cheap Unicode-to-ASCII + // conversion by simply ignoring the high byte) + // - lines are limited to 255 chars (we limit to 200 here to allow + // for the keyword, which was emitted by the caller) + // - lines that start with a left paren are treated as + // instead of , so we escape a leading paren + if (s->getLength() >= 2 && + (s->getChar(0) & 0xff) == 0xfe && + (s->getChar(1) & 0xff) == 0xff) { + i = 3; + step = 2; + } else { + i = 0; + step = 1; + } + for (j = 0; i < s->getLength() && j < 200; i += step) { + c = s->getChar(i) & 0xff; + if (c == '\\') { + writePS("\\\\"); + j += 2; + } else if (c < 0x20 || c > 0x7e || (j == 0 && c == '(')) { + writePSFmt("\\{0:03o}", c); + j += 4; + } else { + writePSChar(c); + ++j; + } + } + writePS("\n"); +} diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h new file mode 100644 index 0000000..809f058 --- /dev/null +++ b/poppler/PSOutputDev.h @@ -0,0 +1,495 @@ +//======================================================================== +// +// PSOutputDev.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Martin Kretzschmar +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2006-2008 Albert Astals Cid +// Copyright (C) 2007 Brad Hards +// Copyright (C) 2009-2012 Thomas Freitag +// Copyright (C) 2009 Till Kamppeter +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009, 2011 William Bader +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2011 Adrian Johnson +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PSOUTPUTDEV_H +#define PSOUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include +#include "Object.h" +#include "GfxState.h" +#include "GlobalParams.h" +#include "OutputDev.h" + +class GHooash; +class PDFDoc; +class XRef; +class Function; +class GfxPath; +class GfxFont; +class GfxColorSpace; +class GfxSeparationColorSpace; +class PDFRectangle; +struct PST1FontName; +struct PSFont8Info; +struct PSFont16Enc; +class PSOutCustomColor; +class PSOutputDev; + +//------------------------------------------------------------------------ +// PSOutputDev +//------------------------------------------------------------------------ + +enum PSOutMode { + psModePS, + psModeEPS, + psModeForm, + psModePSOrigPageSizes +}; + +enum PSFileType { + psFile, // write to file + psPipe, // write to pipe + psStdout, // write to stdout + psGeneric // write to a generic stream +}; + +enum PSOutCustomCodeLocation { + psOutCustomDocSetup, + psOutCustomPageSetup +}; + +typedef void (*PSOutputFunc)(void *stream, const char *data, int len); + +typedef GooString *(*PSOutCustomCodeCbk)(PSOutputDev *psOut, + PSOutCustomCodeLocation loc, int n, + void *data); + +class PSOutputDev: public OutputDev { +public: + + // Open a PostScript output file, and write the prolog. + PSOutputDev(const char *fileName, PDFDoc *docA, + char *psTitle, + int firstPage, int lastPage, PSOutMode modeA, + int paperWidthA = -1, int paperHeightA = -1, + GBool duplexA = gTrue, + int imgLLXA = 0, int imgLLYA = 0, + int imgURXA = 0, int imgURYA = 0, + GBool forceRasterizeA = gFalse, + GBool manualCtrlA = gFalse, + PSOutCustomCodeCbk customCodeCbkA = NULL, + void *customCodeCbkDataA = NULL); + + // Open a PSOutputDev that will write to a generic stream. + PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, + char *psTitle, + PDFDoc *docA, + int firstPage, int lastPage, PSOutMode modeA, + int paperWidthA = -1, int paperHeightA = -1, + GBool duplexA = gTrue, + int imgLLXA = 0, int imgLLYA = 0, + int imgURXA = 0, int imgURYA = 0, + GBool forceRasterizeA = gFalse, + GBool manualCtrlA = gFalse, + PSOutCustomCodeCbk customCodeCbkA = NULL, + void *customCodeCbkDataA = NULL); + + // Destructor -- writes the trailer and closes the file. + virtual ~PSOutputDev(); + + // Check if file was successfully created. + virtual GBool isOk() { return ok; } + + //---- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gFalse; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gFalse; } + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gTrue; } + + // Does this device use functionShadedFill(), axialShadedFill(), and + // radialShadedFill()? If this returns false, these shaded fills + // will be reduced to a series of other drawing operations. + virtual GBool useShadedFills(int type) + { return type < 4 && level >= psLevel2; } + + // Does this device use drawForm()? If this returns false, + // form-type XObjects will be interpreted (i.e., unrolled). + virtual GBool useDrawForm() { return preload; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + //----- header/trailer (used only if manualCtrl is true) + + // Write the document-level header. + void writeHeader(int firstPage, int lastPage, + PDFRectangle *mediaBox, PDFRectangle *cropBox, + int pageRotate, char *pstitle); + + // Write the Xpdf procset. + void writeXpdfProcset(); + + // Write the trailer for the current page. + void writePageTrailer(); + + // Write the document trailer. + void writeTrailer(); + + //----- initialization and control + + // Check to see if a page slice should be displayed. If this + // returns false, the page display is aborted. Typically, an + // OutputDev will use some alternate means to display the page + // before returning false. + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL); + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- save/restore graphics state + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + //----- update graphics state + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateFillColorSpace(GfxState *state); + virtual void updateStrokeColorSpace(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateFillOverprint(GfxState *state); + virtual void updateStrokeOverprint(GfxState *state); + virtual void updateOverprintMode(GfxState *state); + virtual void updateTransfer(GfxState *state); + + //----- update text state + virtual void updateFont(GfxState *state); + virtual void updateTextMat(GfxState *state); + virtual void updateCharSpace(GfxState *state); + virtual void updateRender(GfxState *state); + virtual void updateRise(GfxState *state); + virtual void updateWordSpace(GfxState *state); + virtual void updateHorizScaling(GfxState *state); + virtual void updateTextPos(GfxState *state); + virtual void updateTextShift(GfxState *state, double shift); + virtual void saveTextPos(GfxState *state); + virtual void restoreTextPos(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + virtual GBool functionShadedFill(GfxState *state, + GfxFunctionShading *shading); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/); + + //----- path clipping + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + virtual void clipToStrokePath(GfxState *state); + + //----- text drawing + virtual void drawString(GfxState *state, GooString *s); + virtual void beginTextObject(GfxState *state); + virtual GBool deviceHasTextClip(GfxState *state) { return haveTextClip; } + virtual void endTextObject(GfxState *state); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void setSoftMaskFromImageMask(GfxState *state, + Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix); + virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + +#if OPI_SUPPORT + //----- OPI functions + virtual void opiBegin(GfxState *state, Dict *opiDict); + virtual void opiEnd(GfxState *state, Dict *opiDict); +#endif + + //----- Type 3 font operators + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury); + + //----- form XObjects + virtual void drawForm(Ref ref); + + //----- PostScript XObjects + virtual void psXObject(Stream *psStream, Stream *level1Stream); + + //----- miscellaneous + void setOffset(double x, double y) + { tx0 = x; ty0 = y; } + void setScale(double x, double y) + { xScale0 = x; yScale0 = y; } + void setRotate(int rotateA) + { rotate0 = rotateA; } + void setClip(double llx, double lly, double urx, double ury) + { clipLLX0 = llx; clipLLY0 = lly; clipURX0 = urx; clipURY0 = ury; } + void setUnderlayCbk(void (*cbk)(PSOutputDev *psOut, void *data), + void *data) + { underlayCbk = cbk; underlayCbkData = data; } + void setOverlayCbk(void (*cbk)(PSOutputDev *psOut, void *data), + void *data) + { overlayCbk = cbk; overlayCbkData = data; } + void setDisplayText(GBool display) { displayText = display; } + +private: + + void init(PSOutputFunc outputFuncA, void *outputStreamA, + PSFileType fileTypeA, char *pstitle, PDFDoc *doc, + int firstPage, int lastPage, PSOutMode modeA, + int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool manualCtrlA, int paperWidthA, int paperHeightA, + GBool duplexA); + void setupResources(Dict *resDict); + void setupFonts(Dict *resDict); + void setupFont(GfxFont *font, Dict *parentResDict); + void setupEmbeddedType1Font(Ref *id, GooString *psName); + void setupExternalType1Font(GooString *fileName, GooString *psName); + void setupEmbeddedType1CFont(GfxFont *font, Ref *id, GooString *psName); + void setupEmbeddedOpenTypeT1CFont(GfxFont *font, Ref *id, GooString *psName); + void setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id, GooString *psName); + void setupExternalTrueTypeFont(GfxFont *font, GooString *fileName, + GooString *psName); + void setupEmbeddedCIDType0Font(GfxFont *font, Ref *id, GooString *psName); + void setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, GooString *psName, + GBool needVerticalMetrics); + void setupExternalCIDTrueTypeFont(GfxFont *font, + GooString *fileName, + GooString *psName, + GBool needVerticalMetrics); + void setupEmbeddedOpenTypeCFFFont(GfxFont *font, Ref *id, GooString *psName); + void setupType3Font(GfxFont *font, GooString *psName, Dict *parentResDict); + GooString *makePSFontName(GfxFont *font, Ref *id); + void setupImages(Dict *resDict); + void setupImage(Ref id, Stream *str, GBool mask); + void setupForms(Dict *resDict); + void setupForm(Ref id, Object *strObj); + void addProcessColor(double c, double m, double y, double k); + void addCustomColor(GfxSeparationColorSpace *sepCS); + void doPath(GfxPath *path); + void maskToClippingPath(Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert); + void doImageL1(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert); + void doImageL1Sep(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert); + void doImageL2(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert); + void doImageL3(Object *ref, GfxImageColorMap *colorMap, + GBool invert, GBool inlineImg, + Stream *str, int width, int height, int len, + int *maskColors, Stream *maskStr, + int maskWidth, int maskHeight, GBool maskInvert); + void dumpColorSpaceL2(GfxColorSpace *colorSpace, + GBool genXform, GBool updateColors, + GBool map01); + GBool tilingPatternFillL1(GfxState *state, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + GBool tilingPatternFillL2(GfxState *state, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + +#if OPI_SUPPORT + void opiBegin20(GfxState *state, Dict *dict); + void opiBegin13(GfxState *state, Dict *dict); + void opiTransform(GfxState *state, double x0, double y0, + double *x1, double *y1); +#endif + void cvtFunction(Function *func, GBool invertPSFunction = gFalse); + GooString *filterPSName(GooString *name); + + // Write the document-level setup. + void writeDocSetup(PDFDoc *doc, Catalog *catalog, int firstPage, int lastPage, GBool duplexA); + + void writePSChar(char c); + void writePS(const char *s); + void writePSBuf(const char *s, int len); + void writePSFmt(const char *fmt, ...); + void writePSString(GooString *s); + void writePSName(const char *s); + GooString *filterPSLabel(GooString *label, GBool *needParens=0); + void writePSTextLine(GooString *s); + + PSLevel level; // PostScript level (1, 2, separation) + PSOutMode mode; // PostScript mode (PS, EPS, form) + int paperWidth; // width of paper, in pts + int paperHeight; // height of paper, in pts + GBool paperMatch; // true if paper size is set to match each page + int prevWidth; // width of previous page + // (only psModePSOrigPageSizes output mode) + int prevHeight; // height of previous page + // (only psModePSOrigPageSizes output mode) + int imgLLX, imgLLY, // imageable area, in pts + imgURX, imgURY; + GBool preload; // load all images into memory, and + // predefine forms + + PSOutputFunc outputFunc; + void *outputStream; + PSFileType fileType; // file / pipe / stdout + GBool manualCtrl; + int seqPage; // current sequential page number + void (*underlayCbk)(PSOutputDev *psOut, void *data); + void *underlayCbkData; + void (*overlayCbk)(PSOutputDev *psOut, void *data); + void *overlayCbkData; + GooString *(*customCodeCbk)(PSOutputDev *psOut, + PSOutCustomCodeLocation loc, int n, + void *data); + void *customCodeCbkData; + + PDFDoc *doc; + XRef *xref; // the xref table for this PDF file + + Ref *fontIDs; // list of object IDs of all used fonts + int fontIDLen; // number of entries in fontIDs array + int fontIDSize; // size of fontIDs array + GooHash *fontNames; // all used font names + PST1FontName *t1FontNames; // font names for Type 1/1C fonts + int t1FontNameLen; // number of entries in t1FontNames array + int t1FontNameSize; // size of t1FontNames array + PSFont8Info *font8Info; // info for 8-bit fonts + int font8InfoLen; // number of entries in font8Info array + int font8InfoSize; // size of font8Info array + PSFont16Enc *font16Enc; // encodings for substitute 16-bit fonts + int font16EncLen; // number of entries in font16Enc array + int font16EncSize; // size of font16Enc array + Ref *imgIDs; // list of image IDs for in-memory images + int imgIDLen; // number of entries in imgIDs array + int imgIDSize; // size of imgIDs array + Ref *formIDs; // list of IDs for predefined forms + int formIDLen; // number of entries in formIDs array + int formIDSize; // size of formIDs array + GooList *xobjStack; // stack of XObject dicts currently being + // processed + int numSaves; // current number of gsaves + int numTilingPatterns; // current number of nested tiling patterns + int nextFunc; // next unique number to use for a function + + GooList *paperSizes; // list of used paper sizes, if paperMatch + // is true [PSOutPaperSize] + double tx0, ty0; // global translation + double xScale0, yScale0; // global scaling + int rotate0; // rotation angle (0, 90, 180, 270) + double clipLLX0, clipLLY0, + clipURX0, clipURY0; + double tx, ty; // global translation for current page + double xScale, yScale; // global scaling for current page + int rotate; // rotation angle for current page + double epsX1, epsY1, // EPS bounding box (unrotated) + epsX2, epsY2; + + GooString *embFontList; // resource comments for embedded fonts + + int processColors; // used process colors + PSOutCustomColor // used custom colors + *customColors; + + GBool haveTextClip; // set if text has been drawn with a + // clipping render mode + + GBool inType3Char; // inside a Type 3 CharProc + GBool inUncoloredPattern; // inside a uncolored pattern (PaintType = 2) + GooString *t3String; // Type 3 content string + double t3WX, t3WY, // Type 3 character parameters + t3LLX, t3LLY, t3URX, t3URY; + GBool t3FillColorOnly; // operators should only use the fill color + GBool t3Cacheable; // cleared if char is not cacheable + GBool t3NeedsRestore; // set if a 'q' operator was issued + GBool forceRasterize; // forces the page to be rasterized into a image before printing + GBool displayText; // displayText + +#if OPI_SUPPORT + int opi13Nest; // nesting level of OPI 1.3 objects + int opi20Nest; // nesting level of OPI 2.0 objects +#endif + + GBool ok; // set up ok? + + friend class WinPDFPrinter; +}; + +#endif diff --git a/poppler/PSTokenizer.cc b/poppler/PSTokenizer.cc new file mode 100644 index 0000000..05127f0 --- /dev/null +++ b/poppler/PSTokenizer.cc @@ -0,0 +1,159 @@ +//======================================================================== +// +// PSTokenizer.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Scott Turner +// Copyright (C) 2008 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "PSTokenizer.h" + +//------------------------------------------------------------------------ + +// A '1' in this array means the character is white space. A '1' or +// '2' means the character ends a name or command. +static const char specialChars[256] = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx +}; + +//------------------------------------------------------------------------ + +PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) { + getCharFunc = getCharFuncA; + data = dataA; + charBuf = -1; +} + +PSTokenizer::~PSTokenizer() { +} + +GBool PSTokenizer::getToken(char *buf, int size, int *length) { + GBool comment, backslash; + int c; + int i; + + // skip leading whitespace and comments + comment = gFalse; + while (1) { + if ((c = getChar()) == EOF) { + buf[0] = '\0'; + *length = 0; + return gFalse; + } + if (comment) { + if (c == '\x0a' || c == '\x0d') { + comment = gFalse; + } + } else if (c == '%') { + comment = gTrue; + } else if (specialChars[c] != 1) { + break; + } + } + + // Reserve room for terminating '\0' + size--; + + // read a token + i = 0; + buf[i++] = c; + if (c == '(') { + backslash = gFalse; + while ((c = lookChar()) != EOF) { + consumeChar(); + if (i < size) { + buf[i++] = c; + } + if (c == '\\') { + backslash = gTrue; + } else if (!backslash && c == ')') { + break; + } else { + backslash = gFalse; + } + } + } else if (c == '<') { + while ((c = lookChar()) != EOF) { + consumeChar(); + if (i < size && specialChars[c] != 1) { + buf[i++] = c; + } + if (c == '>') { + break; + } + } + } else if (c != '[' && c != ']') { + while ((c = lookChar()) != EOF && !specialChars[c]) { + consumeChar(); + if (i < size) { + buf[i++] = c; + } + } + } + // Zero terminate token string + buf[i] = '\0'; + // Return length of token + *length = i; + + return gTrue; +} + +int PSTokenizer::lookChar() { + if (charBuf < 0) { + charBuf = (*getCharFunc)(data); + } + return charBuf; +} + +void PSTokenizer::consumeChar() { + charBuf = -1; +} + +int PSTokenizer::getChar() { + int c = charBuf; + + if (c < 0) { + c = (*getCharFunc)(data); + } else { + charBuf = -1; + } + return c; +} diff --git a/poppler/PSTokenizer.h b/poppler/PSTokenizer.h new file mode 100644 index 0000000..fc2f053 --- /dev/null +++ b/poppler/PSTokenizer.h @@ -0,0 +1,54 @@ +//======================================================================== +// +// PSTokenizer.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Scott Turner +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PSTOKENIZER_H +#define PSTOKENIZER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +//------------------------------------------------------------------------ + +class PSTokenizer { +public: + + PSTokenizer(int (*getCharFuncA)(void *), void *dataA); + ~PSTokenizer(); + + // Get the next PostScript token. Returns false at end-of-stream. + GBool getToken(char *buf, int size, int *length); + +private: + + int lookChar(); + void consumeChar(); + int getChar(); + + int (*getCharFunc)(void *); + void *data; + int charBuf; +}; + +#endif diff --git a/poppler/Page.cc b/poppler/Page.cc new file mode 100644 index 0000000..eccc198 --- /dev/null +++ b/poppler/Page.cc @@ -0,0 +1,755 @@ +//======================================================================== +// +// Page.cc +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2005 Jeff Muizelaar +// Copyright (C) 2005-2012 Albert Astals Cid +// Copyright (C) 2006-2008 Pino Toscano +// Copyright (C) 2006 Nickolay V. Shmyrev +// Copyright (C) 2006 Scott Turner +// Copyright (C) 2006-2011 Carlos Garcia Campos +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2008 Iñigo Martínez +// Copyright (C) 2008 Brad Hards +// Copyright (C) 2008 Ilya Gorenbein +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "GlobalParams.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "PDFDoc.h" +#include "XRef.h" +#include "Link.h" +#include "OutputDev.h" +#include "Gfx.h" +#include "GfxState.h" +#include "Annot.h" +#include "TextOutputDev.h" +#include "Form.h" +#include "Error.h" +#include "Page.h" +#include "Catalog.h" +#include "Form.h" + +//------------------------------------------------------------------------ +// PDFRectangle +//------------------------------------------------------------------------ + +void PDFRectangle::clipTo(PDFRectangle *rect) { + if (x1 < rect->x1) { + x1 = rect->x1; + } else if (x1 > rect->x2) { + x1 = rect->x2; + } + if (x2 < rect->x1) { + x2 = rect->x1; + } else if (x2 > rect->x2) { + x2 = rect->x2; + } + if (y1 < rect->y1) { + y1 = rect->y1; + } else if (y1 > rect->y2) { + y1 = rect->y2; + } + if (y2 < rect->y1) { + y2 = rect->y1; + } else if (y2 > rect->y2) { + y2 = rect->y2; + } +} + +//------------------------------------------------------------------------ +// PageAttrs +//------------------------------------------------------------------------ + +PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) { + Object obj1; + PDFRectangle mBox; + const GBool isPage = dict->is("Page"); + + // get old/default values + if (attrs) { + mediaBox = attrs->mediaBox; + cropBox = attrs->cropBox; + haveCropBox = attrs->haveCropBox; + rotate = attrs->rotate; + attrs->resources.copy(&resources); + } else { + // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary + // but some (non-compliant) PDF files don't specify a MediaBox + mediaBox.x1 = 0; + mediaBox.y1 = 0; + mediaBox.x2 = 612; + mediaBox.y2 = 792; + cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0; + haveCropBox = gFalse; + rotate = 0; + resources.initNull(); + } + + // media box + if (readBox(dict, "MediaBox", &mBox)) { + mediaBox = mBox; + } + + // crop box + if (readBox(dict, "CropBox", &cropBox)) { + haveCropBox = gTrue; + } + if (!haveCropBox) { + cropBox = mediaBox; + } + + if (isPage) { + // cropBox can not be bigger than mediaBox + if (cropBox.x2 - cropBox.x1 > mediaBox.x2 - mediaBox.x1) + { + cropBox.x1 = mediaBox.x1; + cropBox.x2 = mediaBox.x2; + } + if (cropBox.y2 - cropBox.y1 > mediaBox.y2 - mediaBox.y1) + { + cropBox.y1 = mediaBox.y1; + cropBox.y2 = mediaBox.y2; + } + } + + // other boxes + bleedBox = cropBox; + readBox(dict, "BleedBox", &bleedBox); + trimBox = cropBox; + readBox(dict, "TrimBox", &trimBox); + artBox = cropBox; + readBox(dict, "ArtBox", &artBox); + + // rotate + dict->lookup("Rotate", &obj1); + if (obj1.isInt()) { + rotate = obj1.getInt(); + } + obj1.free(); + while (rotate < 0) { + rotate += 360; + } + while (rotate >= 360) { + rotate -= 360; + } + + // misc attributes + dict->lookup("LastModified", &lastModified); + dict->lookup("BoxColorInfo", &boxColorInfo); + dict->lookup("Group", &group); + dict->lookup("Metadata", &metadata); + dict->lookup("PieceInfo", &pieceInfo); + dict->lookup("SeparationInfo", &separationInfo); + + // resource dictionary + dict->lookup("Resources", &obj1); + if (obj1.isDict()) { + resources.free(); + obj1.copy(&resources); + } + obj1.free(); +} + +PageAttrs::~PageAttrs() { + lastModified.free(); + boxColorInfo.free(); + group.free(); + metadata.free(); + pieceInfo.free(); + separationInfo.free(); + resources.free(); +} + +void PageAttrs::clipBoxes() { + cropBox.clipTo(&mediaBox); + bleedBox.clipTo(&mediaBox); + trimBox.clipTo(&mediaBox); + artBox.clipTo(&mediaBox); +} + +GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) { + PDFRectangle tmp; + double t; + Object obj1, obj2; + GBool ok; + + dict->lookup(key, &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 4) { + ok = gTrue; + obj1.arrayGet(0, &obj2); + if (obj2.isNum()) { + tmp.x1 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + obj1.arrayGet(1, &obj2); + if (obj2.isNum()) { + tmp.y1 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + obj1.arrayGet(2, &obj2); + if (obj2.isNum()) { + tmp.x2 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + obj1.arrayGet(3, &obj2); + if (obj2.isNum()) { + tmp.y2 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + if (tmp.x1 == 0 && tmp.x2 == 0 && tmp.y1 == 0 && tmp.y2 == 0) + ok = gFalse; + if (ok) { + if (tmp.x1 > tmp.x2) { + t = tmp.x1; tmp.x1 = tmp.x2; tmp.x2 = t; + } + if (tmp.y1 > tmp.y2) { + t = tmp.y1; tmp.y1 = tmp.y2; tmp.y2 = t; + } + *box = tmp; + } + } else { + ok = gFalse; + } + obj1.free(); + return ok; +} + +//------------------------------------------------------------------------ +// Page +//------------------------------------------------------------------------ + +Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) { + Object tmp; + + ok = gTrue; + doc = docA; + xref = doc->getXRef(); + num = numA; + duration = -1; + annots = NULL; + + pageObj.initDict(pageDict); + pageRef = pageRefA; + + // get attributes + attrs = attrsA; + attrs->clipBoxes(); + + // transtion + pageDict->lookupNF("Trans", &trans); + if (!(trans.isRef() || trans.isDict() || trans.isNull())) { + error(errSyntaxError, -1, "Page transition object (page {0:d}) is wrong type ({1:s})", + num, trans.getTypeName()); + trans.free(); + } + + // duration + pageDict->lookupNF("Dur", &tmp); + if (!(tmp.isNum() || tmp.isNull())) { + error(errSyntaxError, -1, "Page duration object (page {0:d}) is wrong type ({1:s})", + num, tmp.getTypeName()); + } else if (tmp.isNum()) { + duration = tmp.getNum(); + } + tmp.free(); + + // annotations + pageDict->lookupNF("Annots", &annotsObj); + if (!(annotsObj.isRef() || annotsObj.isArray() || annotsObj.isNull())) { + error(errSyntaxError, -1, "Page annotations object (page {0:d}) is wrong type ({1:s})", + num, annotsObj.getTypeName()); + annotsObj.free(); + goto err2; + } + + // contents + pageDict->lookupNF("Contents", &contents); + if (!(contents.isRef() || contents.isArray() || + contents.isNull())) { + error(errSyntaxError, -1, "Page contents object (page {0:d}) is wrong type ({1:s})", + num, contents.getTypeName()); + contents.free(); + goto err1; + } + + // thumb + pageDict->lookupNF("Thumb", &thumb); + if (!(thumb.isStream() || thumb.isNull() || thumb.isRef())) { + error(errSyntaxError, -1, "Page thumb object (page {0:d}) is wrong type ({1:s})", + num, thumb.getTypeName()); + thumb.initNull(); + } + + // actions + pageDict->lookupNF("AA", &actions); + if (!(actions.isDict() || actions.isNull())) { + error(errSyntaxError, -1, "Page additional action object (page {0:d}) is wrong type ({1:s})", + num, actions.getTypeName()); + actions.initNull(); + } + + return; + + trans.initNull(); + err2: + annotsObj.initNull(); + err1: + contents.initNull(); + ok = gFalse; +} + +Page::~Page() { + delete attrs; + delete annots; + pageObj.free(); + annotsObj.free(); + contents.free(); + trans.free(); + thumb.free(); + actions.free(); +} + +Annots *Page::getAnnots() { + if (!annots) { + Object obj; + annots = new Annots(doc, getAnnots(&obj)); + obj.free(); + } + + return annots; +} + +void Page::addAnnot(Annot *annot) { + Object obj1; + Object tmp; + Ref annotRef = annot->getRef (); + + // Make sure we have annots before adding the new one + // even if it's an empty list so that we can safely + // call annots->appendAnnot(annot) + getAnnots(); + + if (annotsObj.isNull()) { + Ref annotsRef; + // page doesn't have annots array, + // we have to create it + + obj1.initArray(xref); + obj1.arrayAdd(tmp.initRef (annotRef.num, annotRef.gen)); + tmp.free(); + + annotsRef = xref->addIndirectObject (&obj1); + annotsObj.initRef(annotsRef.num, annotsRef.gen); + pageObj.dictSet ("Annots", &annotsObj); + xref->setModifiedObject (&pageObj, pageRef); + } else { + getAnnots(&obj1); + if (obj1.isArray()) { + obj1.arrayAdd (tmp.initRef (annotRef.num, annotRef.gen)); + if (annotsObj.isRef()) + xref->setModifiedObject (&obj1, annotsObj.getRef()); + else + xref->setModifiedObject (&pageObj, pageRef); + } + obj1.free(); + } + + annots->appendAnnot(annot); + + annot->setPage(&pageRef, num); +} + +void Page::removeAnnot(Annot *annot) { + Ref annotRef = annot->getRef(); + Object annArray; + + getAnnots(&annArray); + if (annArray.isArray()) { + int idx = -1; + // Get annotation position + for (int i = 0; idx == -1 && i < annArray.arrayGetLength(); ++i) { + Object tmp; + Ref currAnnot = annArray.arrayGetNF(i, &tmp)->getRef(); + tmp.free(); + if (currAnnot.num == annotRef.num && currAnnot.gen == annotRef.gen) { + idx = i; + } + } + + if (idx == -1) { + error(errInternal, -1, "Annotation doesn't belong to this page"); + annArray.free(); + return; + } + annots->removeAnnot(annot); // Gracefully fails on popup windows + annArray.arrayRemove(idx); + xref->removeIndirectObject(annotRef); + + if (annotsObj.isRef()) { + xref->setModifiedObject (&annArray, annotsObj.getRef()); + } else { + xref->setModifiedObject (&pageObj, pageRef); + } + } + annArray.free(); +} + +Links *Page::getLinks() { + return new Links(getAnnots()); +} + +FormPageWidgets *Page::getFormWidgets() { + return new FormPageWidgets(getAnnots(), num, doc->getCatalog()->getForm()); +} + +void Page::display(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data), + void *annotDisplayDecideCbkData) { + displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, -1, -1, -1, -1, printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData); +} + +Gfx *Page::createGfx(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) { + PDFRectangle *mediaBox, *cropBox; + PDFRectangle box; + Gfx *gfx; + + rotate += getRotate(); + if (rotate >= 360) { + rotate -= 360; + } else if (rotate < 0) { + rotate += 360; + } + + makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(), + sliceX, sliceY, sliceW, sliceH, &box, &crop); + cropBox = getCropBox(); + mediaBox = getMediaBox(); + + if (globalParams->getPrintCommands()) { + printf("***** MediaBox = ll:%g,%g ur:%g,%g\n", + mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2); + printf("***** CropBox = ll:%g,%g ur:%g,%g\n", + cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2); + printf("***** Rotate = %d\n", attrs->getRotate()); + } + + gfx = new Gfx(doc, out, num, attrs->getResourceDict(), + hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL, + rotate, abortCheckCbk, abortCheckCbkData); + + return gfx; +} + +void Page::displaySlice(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data), + void *annotDisplayDecideCbkData) { + Gfx *gfx; + Object obj; + Annots *annotList; + int i; + + if (!out->checkPageSlice(this, hDPI, vDPI, rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData)) { + return; + } + + gfx = createGfx(out, hDPI, vDPI, rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, + abortCheckCbk, abortCheckCbkData); + + contents.fetch(xref, &obj); + if (!obj.isNull()) { + gfx->saveState(); + gfx->display(&obj); + gfx->restoreState(); + } else { + // empty pages need to call dump to do any setup required by the + // OutputDev + out->dump(); + } + obj.free(); + + // draw annotations + annotList = getAnnots(); + + if (annotList->getNumAnnots() > 0) { + if (globalParams->getPrintCommands()) { + printf("***** Annotations\n"); + } + for (i = 0; i < annotList->getNumAnnots(); ++i) { + Annot *annot = annotList->getAnnot(i); + if ((annotDisplayDecideCbk && + (*annotDisplayDecideCbk)(annot, annotDisplayDecideCbkData)) || + !annotDisplayDecideCbk) { + annotList->getAnnot(i)->draw(gfx, printing); + } + } + out->dump(); + } + + delete gfx; +} + +void Page::display(Gfx *gfx) { + Object obj; + + contents.fetch(xref, &obj); + if (!obj.isNull()) { + gfx->saveState(); + gfx->display(&obj); + gfx->restoreState(); + } + obj.free(); +} + +GBool Page::loadThumb(unsigned char **data_out, + int *width_out, int *height_out, + int *rowstride_out) +{ + unsigned int pixbufdatasize; + int width, height, bits; + Object obj1, fetched_thumb; + Dict *dict; + GfxColorSpace *colorSpace; + GBool success = gFalse; + Stream *str; + GfxImageColorMap *colorMap; + + /* Get stream dict */ + thumb.fetch(xref, &fetched_thumb); + if (!fetched_thumb.isStream()) { + fetched_thumb.free(); + return gFalse; + } + + dict = fetched_thumb.streamGetDict(); + str = fetched_thumb.getStream(); + + if (!dict->lookupInt("Width", "W", &width)) + goto fail1; + if (!dict->lookupInt("Height", "H", &height)) + goto fail1; + if (!dict->lookupInt("BitsPerComponent", "BPC", &bits)) + goto fail1; + + /* Check for invalid dimensions and integer overflow. */ + if (width <= 0 || height <= 0) + goto fail1; + if (width > INT_MAX / 3 / height) + goto fail1; + pixbufdatasize = width * height * 3; + + /* Get color space */ + dict->lookup ("ColorSpace", &obj1); + if (obj1.isNull ()) { + obj1.free (); + dict->lookup ("CS", &obj1); + } + colorSpace = GfxColorSpace::parse(&obj1, NULL); + obj1.free(); + if (!colorSpace) { + fprintf (stderr, "Error: Cannot parse color space\n"); + goto fail1; + } + + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + colorMap = new GfxImageColorMap(bits, &obj1, colorSpace); + obj1.free(); + if (!colorMap->isOk()) { + fprintf (stderr, "Error: invalid colormap\n"); + delete colorMap; + goto fail1; + } + + if (data_out) { + unsigned char *pixbufdata = (unsigned char *) gmalloc(pixbufdatasize); + unsigned char *p = pixbufdata; + ImageStream *imgstr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgstr->reset(); + for (int row = 0; row < height; ++row) { + for (int col = 0; col < width; ++col) { + Guchar pix[gfxColorMaxComps]; + GfxRGB rgb; + + imgstr->getPixel(pix); + colorMap->getRGB(pix, &rgb); + + *p++ = colToByte(rgb.r); + *p++ = colToByte(rgb.g); + *p++ = colToByte(rgb.b); + } + } + *data_out = pixbufdata; + imgstr->close(); + delete imgstr; + } + + success = gTrue; + + if (width_out) + *width_out = width; + if (height_out) + *height_out = height; + if (rowstride_out) + *rowstride_out = width * 3; + + delete colorMap; + fail1: + fetched_thumb.free(); + + return success; +} + +void Page::makeBox(double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool upsideDown, + double sliceX, double sliceY, double sliceW, double sliceH, + PDFRectangle *box, GBool *crop) { + PDFRectangle *mediaBox, *cropBox, *baseBox; + double kx, ky; + + mediaBox = getMediaBox(); + cropBox = getCropBox(); + if (sliceW >= 0 && sliceH >= 0) { + baseBox = useMediaBox ? mediaBox : cropBox; + kx = 72.0 / hDPI; + ky = 72.0 / vDPI; + if (rotate == 90) { + if (upsideDown) { + box->x1 = baseBox->x1 + ky * sliceY; + box->x2 = baseBox->x1 + ky * (sliceY + sliceH); + } else { + box->x1 = baseBox->x2 - ky * (sliceY + sliceH); + box->x2 = baseBox->x2 - ky * sliceY; + } + box->y1 = baseBox->y1 + kx * sliceX; + box->y2 = baseBox->y1 + kx * (sliceX + sliceW); + } else if (rotate == 180) { + box->x1 = baseBox->x2 - kx * (sliceX + sliceW); + box->x2 = baseBox->x2 - kx * sliceX; + if (upsideDown) { + box->y1 = baseBox->y1 + ky * sliceY; + box->y2 = baseBox->y1 + ky * (sliceY + sliceH); + } else { + box->y1 = baseBox->y2 - ky * (sliceY + sliceH); + box->y2 = baseBox->y2 - ky * sliceY; + } + } else if (rotate == 270) { + if (upsideDown) { + box->x1 = baseBox->x2 - ky * (sliceY + sliceH); + box->x2 = baseBox->x2 - ky * sliceY; + } else { + box->x1 = baseBox->x1 + ky * sliceY; + box->x2 = baseBox->x1 + ky * (sliceY + sliceH); + } + box->y1 = baseBox->y2 - kx * (sliceX + sliceW); + box->y2 = baseBox->y2 - kx * sliceX; + } else { + box->x1 = baseBox->x1 + kx * sliceX; + box->x2 = baseBox->x1 + kx * (sliceX + sliceW); + if (upsideDown) { + box->y1 = baseBox->y2 - ky * (sliceY + sliceH); + box->y2 = baseBox->y2 - ky * sliceY; + } else { + box->y1 = baseBox->y1 + ky * sliceY; + box->y2 = baseBox->y1 + ky * (sliceY + sliceH); + } + } + } else if (useMediaBox) { + *box = *mediaBox; + } else { + *box = *cropBox; + *crop = gFalse; + } +} + +void Page::processLinks(OutputDev *out) { + Links *links; + int i; + + links = getLinks(); + for (i = 0; i < links->getNumLinks(); ++i) { + out->processLink(links->getLink(i)); + } + delete links; +} + +void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool upsideDown) { + GfxState *state; + int i; + rotate += getRotate(); + if (rotate >= 360) { + rotate -= 360; + } else if (rotate < 0) { + rotate += 360; + } + state = new GfxState(hDPI, vDPI, + useMediaBox ? getMediaBox() : getCropBox(), + rotate, upsideDown); + for (i = 0; i < 6; ++i) { + ctm[i] = state->getCTM()[i]; + } + delete state; +} diff --git a/poppler/Page.h b/poppler/Page.h new file mode 100644 index 0000000..e2e666c --- /dev/null +++ b/poppler/Page.h @@ -0,0 +1,263 @@ +//======================================================================== +// +// Page.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Kristian Høgsberg +// Copyright (C) 2005 Jeff Muizelaar +// Copyright (C) 2006 Pino Toscano +// Copyright (C) 2006, 2011 Carlos Garcia Campos +// Copyright (C) 2007 Julien Rebetez +// Copyright (C) 2008 Iñigo Martínez +// Copyright (C) 2012 Fabio D'Urso +// Copyright (C) 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PAGE_H +#define PAGE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class Dict; +class PDFDoc; +class XRef; +class OutputDev; +class Links; +class Annots; +class Annot; +class Gfx; +class FormPageWidgets; +class Form; + +//------------------------------------------------------------------------ + +class PDFRectangle { +public: + double x1, y1, x2, y2; + + PDFRectangle() { x1 = y1 = x2 = y2 = 0; } + PDFRectangle(double x1A, double y1A, double x2A, double y2A) + { x1 = x1A; y1 = y1A; x2 = x2A; y2 = y2A; } + GBool isValid() { return x1 != 0 || y1 != 0 || x2 != 0 || y2 != 0; } + GBool contains(double x, double y) { return x1 <= x && x <= x2 && y1 <= y && y <= y2; } + void clipTo(PDFRectangle *rect); +}; + +//------------------------------------------------------------------------ +// PageAttrs +//------------------------------------------------------------------------ + +class PageAttrs { +public: + + // Construct a new PageAttrs object by merging a dictionary + // (of type Pages or Page) into another PageAttrs object. If + // is NULL, uses defaults. + PageAttrs(PageAttrs *attrs, Dict *dict); + + // Destructor. + ~PageAttrs(); + + // Accessors. + PDFRectangle *getMediaBox() { return &mediaBox; } + PDFRectangle *getCropBox() { return &cropBox; } + GBool isCropped() { return haveCropBox; } + PDFRectangle *getBleedBox() { return &bleedBox; } + PDFRectangle *getTrimBox() { return &trimBox; } + PDFRectangle *getArtBox() { return &artBox; } + int getRotate() { return rotate; } + GooString *getLastModified() + { return lastModified.isString() + ? lastModified.getString() : (GooString *)NULL; } + Dict *getBoxColorInfo() + { return boxColorInfo.isDict() ? boxColorInfo.getDict() : (Dict *)NULL; } + Dict *getGroup() + { return group.isDict() ? group.getDict() : (Dict *)NULL; } + Stream *getMetadata() + { return metadata.isStream() ? metadata.getStream() : (Stream *)NULL; } + Dict *getPieceInfo() + { return pieceInfo.isDict() ? pieceInfo.getDict() : (Dict *)NULL; } + Dict *getSeparationInfo() + { return separationInfo.isDict() + ? separationInfo.getDict() : (Dict *)NULL; } + Dict *getResourceDict() + { return resources.isDict() ? resources.getDict() : (Dict *)NULL; } + + // Clip all other boxes to the MediaBox. + void clipBoxes(); + +private: + + GBool readBox(Dict *dict, const char *key, PDFRectangle *box); + + PDFRectangle mediaBox; + PDFRectangle cropBox; + GBool haveCropBox; + PDFRectangle bleedBox; + PDFRectangle trimBox; + PDFRectangle artBox; + int rotate; + Object lastModified; + Object boxColorInfo; + Object group; + Object metadata; + Object pieceInfo; + Object separationInfo; + Object resources; +}; + +//------------------------------------------------------------------------ +// Page +//------------------------------------------------------------------------ + +class Page { +public: + + // Constructor. + Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form); + + // Destructor. + ~Page(); + + // Is page valid? + GBool isOk() { return ok; } + + // Get page parameters. + int getNum() { return num; } + PDFRectangle *getMediaBox() { return attrs->getMediaBox(); } + PDFRectangle *getCropBox() { return attrs->getCropBox(); } + GBool isCropped() { return attrs->isCropped(); } + double getMediaWidth() + { return attrs->getMediaBox()->x2 - attrs->getMediaBox()->x1; } + double getMediaHeight() + { return attrs->getMediaBox()->y2 - attrs->getMediaBox()->y1; } + double getCropWidth() + { return attrs->getCropBox()->x2 - attrs->getCropBox()->x1; } + double getCropHeight() + { return attrs->getCropBox()->y2 - attrs->getCropBox()->y1; } + PDFRectangle *getBleedBox() { return attrs->getBleedBox(); } + PDFRectangle *getTrimBox() { return attrs->getTrimBox(); } + PDFRectangle *getArtBox() { return attrs->getArtBox(); } + int getRotate() { return attrs->getRotate(); } + GooString *getLastModified() { return attrs->getLastModified(); } + Dict *getBoxColorInfo() { return attrs->getBoxColorInfo(); } + Dict *getGroup() { return attrs->getGroup(); } + Stream *getMetadata() { return attrs->getMetadata(); } + Dict *getPieceInfo() { return attrs->getPieceInfo(); } + Dict *getSeparationInfo() { return attrs->getSeparationInfo(); } + PDFDoc *getDoc() { return doc; } + + // Get resource dictionary. + Dict *getResourceDict() { return attrs->getResourceDict(); } + + // Get annotations array. + Object *getAnnots(Object *obj) { return annotsObj.fetch(xref, obj); } + // Add a new annotation to the page + void addAnnot(Annot *annot); + // Remove an existing annotation from the page + // Note: Caller is responsible for deleting popup and appearance streams too + void removeAnnot(Annot *annot); + + // Return a list of links. + Links *getLinks(); + + // Return a list of annots. It will be valid until the page is destroyed + Annots *getAnnots(); + + // Get contents. + Object *getContents(Object *obj) { return contents.fetch(xref, obj); } + + // Get thumb. + Object *getThumb(Object *obj) { return thumb.fetch(xref, obj); } + GBool loadThumb(unsigned char **data, int *width, int *height, int *rowstride); + + // Get transition. + Object *getTrans(Object *obj) { return trans.fetch(xref, obj); } + + // Get form. + FormPageWidgets *getFormWidgets(); + + // Get duration, the maximum length of time, in seconds, + // that the page is displayed before the presentation automatically + // advances to the next page + double getDuration() { return duration; } + + // Get actions + Object *getActions(Object *obj) { return actions.fetch(xref, obj); } + + Gfx *createGfx(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData); + + // Display a page. + void display(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL); + + // Display part of a page. + void displaySlice(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL); + + void display(Gfx *gfx); + + void makeBox(double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool upsideDown, + double sliceX, double sliceY, double sliceW, double sliceH, + PDFRectangle *box, GBool *crop); + + void processLinks(OutputDev *out); + + // Get the page's default CTM. + void getDefaultCTM(double *ctm, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool upsideDown); + +private: + + PDFDoc *doc; + XRef *xref; // the xref table for this PDF file + Object pageObj; // page dictionary + Ref pageRef; // page reference + int num; // page number + PageAttrs *attrs; // page attributes + Annots *annots; // annotations + Object annotsObj; // annotations array + Object contents; // page contents + Object thumb; // page thumbnail + Object trans; // page transition + Object actions; // page addiction actions + double duration; // page duration + GBool ok; // true if page is valid +}; + +#endif diff --git a/poppler/PageLabelInfo.cc b/poppler/PageLabelInfo.cc new file mode 100644 index 0000000..a099d11 --- /dev/null +++ b/poppler/PageLabelInfo.cc @@ -0,0 +1,388 @@ +//======================================================================== +// +// This file is under the GPLv2 or later license +// +// Copyright (C) 2005-2006 Kristian Høgsberg +// Copyright (C) 2005, 2009 Albert Astals Cid +// Copyright (C) 2011 Simon Kellner +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include +#include +#include +#include +#include + +#include "PageLabelInfo.h" + +/* http://mathworld.wolfram.com/RomanNumerals.html */ + +static int fromRoman(const char *buffer) { + int digit_value, prev_digit_value, value; + int i; + + prev_digit_value = INT_MAX; + value = 0; + for (i = 0; buffer[i] != '\0'; i++) { + switch (buffer[i]) { + case 'm': + case 'M': + digit_value = 1000; + break; + case 'd': + case 'D': + digit_value = 500; + break; + case 'c': + case 'C': + digit_value = 100; + break; + case 'l': + case 'L': + digit_value = 50; + break; + case 'x': + case 'X': + digit_value = 10; + break; + case 'v': + case 'V': + digit_value = 5; + break; + case 'i': + case 'I': + digit_value = 1; + break; + default: + return -1; + } + + if (digit_value <= prev_digit_value) + value += digit_value; + else + value += digit_value - prev_digit_value * 2; + prev_digit_value = digit_value; + } + + return value; +} + +static void toRoman(int number, GooString *str, GBool uppercase) { + static const char uppercaseNumerals[] = "IVXLCDM"; + static const char lowercaseNumerals[] = "ivxlcdm"; + int divisor; + int i, j, k; + const char *wh; + + if (uppercase) + wh = uppercaseNumerals; + else + wh = lowercaseNumerals; + + divisor = 1000; + for (k = 3; k >= 0; k--) { + i = number / divisor; + number = number % divisor; + + switch (i) { + case 0: + break; + case 5: + str->append(wh[2 * k + 1]); + break; + case 9: + str->append(wh[2 * k + 0]); + str->append(wh[ 2 * k + 2]); + break; + case 4: + str->append(wh[2 * k + 0]); + str->append(wh[2 * k + 1]); + break; + default: + if (i > 5) { + str->append(wh[2 * k + 1]); + i -= 5; + } + for (j = 0; j < i; j++) { + str->append(wh[2 * k + 0]); + } + } + + divisor = divisor / 10; + } +} + +static int fromLatin(const char *buffer) +{ + int count; + const char *p; + + for (p = buffer; *p; p++) { + if (*p != buffer[0]) + return -1; + } + + count = p - buffer; + if (buffer[0] >= 'a' && buffer[0] <= 'z') + return 26 * (count - 1) + buffer[0] - 'a' + 1; + if (buffer[0] >= 'A' && buffer[0] <= 'Z') + return 26 * (count - 1) + buffer[0] - 'A' + 1; + + return -1; +} + +#ifdef TEST +static void toLatin(int number, GooString *str, GBool uppercase) { + char base, letter; + int i, count; + + if (uppercase) + base = 'A'; + else + base = 'a'; + + count = (number - 1) / 26 + 1; + letter = base + (number - 1) % 26; + + for (i = 0; i < count; i++) + str->append(letter); +} +#endif + +PageLabelInfo::Interval::Interval(Object *dict, int baseA) { + Object obj; + + style = None; + if (dict->dictLookup("S", &obj)->isName()) { + if (obj.isName("D")) { + style = Arabic; + } else if (obj.isName("R")) { + style = UppercaseRoman; + } else if (obj.isName("r")) { + style = LowercaseRoman; + } else if (obj.isName("A")) { + style = UppercaseLatin; + } else if (obj.isName("a")) { + style = LowercaseLatin; + } + } + obj.free(); + + if (dict->dictLookup("P", &obj)->isString()) + prefix = obj.getString()->copy(); + else + prefix = new GooString(""); + obj.free(); + + if (dict->dictLookup("St", &obj)->isInt()) + first = obj.getInt(); + else + first = 1; + obj.free(); + + base = baseA; +} + +PageLabelInfo::Interval::~Interval() { + delete prefix; +} + +PageLabelInfo::PageLabelInfo(Object *tree, int numPages) { + int i; + Interval *interval, *next; + + parse(tree); + + for (i = 0; i < intervals.getLength(); i++) { + interval = (Interval *) intervals.get(i); + + if (i + 1 < intervals.getLength()) { + next = (Interval *) intervals.get(i + 1); + interval->length = next->base - interval->base; + } else { + interval->length = numPages - interval->base; + } + if (interval->length < 0) interval->length = 0; + } +} + +PageLabelInfo::~PageLabelInfo() { + int i; + for (i = 0; i < intervals.getLength(); ++i) { + delete (Interval*)intervals.get(i); + } +} + +void PageLabelInfo::parse(Object *tree) { + Object nums, obj; + Object kids, kid, limits, low, high; + int i, base; + Interval *interval; + + // leaf node + if (tree->dictLookup("Nums", &nums)->isArray()) { + for (i = 0; i < nums.arrayGetLength(); i += 2) { + if (!nums.arrayGet(i, &obj)->isInt()) { + obj.free(); + continue; + } + base = obj.getInt(); + obj.free(); + if (!nums.arrayGet(i + 1, &obj)->isDict()) { + obj.free(); + continue; + } + + interval = new Interval(&obj, base); + obj.free(); + intervals.append(interval); + } + } + nums.free(); + + if (tree->dictLookup("Kids", &kids)->isArray()) { + for (i = 0; i < kids.arrayGetLength(); ++i) { + if (kids.arrayGet(i, &kid)->isDict()) + parse(&kid); + kid.free(); + } + } + kids.free(); +} + +GBool PageLabelInfo::labelToIndex(GooString *label, int *index) +{ + Interval *interval; + char *str = label->getCString(), *end; + int prefixLength; + int i, number; + + for (i = 0; i < intervals.getLength(); i++) { + interval = (Interval *) intervals.get(i); + const int base = interval->base; + prefixLength = interval->prefix->getLength(); + if (label->cmpN(interval->prefix, prefixLength) != 0) + continue; + + switch (interval->style) { + case Interval::Arabic: + number = strtol(str + prefixLength, &end, 10); + if (*end == '\0' && number - interval->first < interval->length) { + *index = base + number - interval->first; + return gTrue; + } + break; + case Interval::LowercaseRoman: + case Interval::UppercaseRoman: + number = fromRoman(str + prefixLength); + if (number >= 0 && number - interval->first < interval->length) { + *index = base + number - interval->first; + return gTrue; + } + break; + case Interval::UppercaseLatin: + case Interval::LowercaseLatin: + number = fromLatin(str + prefixLength); + if (number >= 0 && number - interval->first < interval->length) { + *index = base + number - interval->first; + return gTrue; + } + break; + case Interval::None: + break; + } + } + + return gFalse; +} + +GBool PageLabelInfo::indexToLabel(int index, GooString *label) +{ + char buffer[32]; + int i, base, number; + Interval *interval; + GooString number_string; + + base = 0; + interval = NULL; + for (i = 0; i < intervals.getLength(); i++) { + interval = (Interval *) intervals.get(i); + if (base <= index && index < base + interval->length) + break; + base += interval->length; + } + + if (i == intervals.getLength()) + return gFalse; + + number = index - base + interval->first; + switch (interval->style) { + case Interval::Arabic: + snprintf (buffer, sizeof(buffer), "%d", number); + number_string.append(buffer); + break; + case Interval::LowercaseRoman: + toRoman(number, &number_string, gFalse); + break; + case Interval::UppercaseRoman: + toRoman(number, &number_string, gTrue); + break; + case Interval::UppercaseLatin: + case Interval::LowercaseLatin: + number = 0; + break; + case Interval::None: + break; + } + + label->clear(); + label->append(interval->prefix); + if (label->hasUnicodeMarker()) { + int i, len; + char ucs2_char[2]; + + /* Convert the ascii number string to ucs2 and append. */ + len = number_string.getLength (); + ucs2_char[0] = 0; + for (i = 0; i < len; ++i) { + ucs2_char[1] = number_string.getChar(i); + label->append(ucs2_char, 2); + } + } else { + label->append(&number_string); + } + + return gTrue; +} + +#ifdef TEST +int main(int argc, char *argv[]) +{ + { + GooString str; + toRoman(177, &str, gFalse); + assert (str.cmp("clxxvii") == 0); + } + + { + GooString roman("clxxvii"); + assert (fromRoman(roman.getCString()) == 177); + } + + { + GooString str; + toLatin(54, &str, gFalse); + assert (str.cmp("bbb") == 0); + } + + { + GooString latin("ddd"); + assert (fromLatin(latin.getCString()) == 56); + } +} +#endif diff --git a/poppler/PageLabelInfo.h b/poppler/PageLabelInfo.h new file mode 100644 index 0000000..960e710 --- /dev/null +++ b/poppler/PageLabelInfo.h @@ -0,0 +1,51 @@ +//======================================================================== +// +// This file is under the GPLv2 or later license +// +// Copyright (C) 2005-2006 Kristian Høgsberg +// Copyright (C) 2005 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include +#include +#include +#include +#include + +#include "goo/gtypes.h" +#include "goo/GooList.h" +#include "goo/GooString.h" +#include "Object.h" + +class PageLabelInfo { +public: + PageLabelInfo(Object *tree, int numPages); + ~PageLabelInfo(); + GBool labelToIndex(GooString *label, int *index); + GBool indexToLabel(int index, GooString *label); + +private: + void parse(Object *tree); + +private: + struct Interval { + Interval(Object *dict, int baseA); + ~Interval(); + GooString *prefix; + enum NumberStyle { + None, + Arabic, + LowercaseRoman, + UppercaseRoman, + UppercaseLatin, + LowercaseLatin + } style; + int first, base, length; + }; + + GooList intervals; +}; diff --git a/poppler/PageTransition.cc b/poppler/PageTransition.cc new file mode 100644 index 0000000..3fbd0de --- /dev/null +++ b/poppler/PageTransition.cc @@ -0,0 +1,137 @@ +/* PageTransition.cc + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2010, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "PageTransition.h" + +//------------------------------------------------------------------------ +// PageTransition +//------------------------------------------------------------------------ + +PageTransition::PageTransition (Object *trans) { + Object obj; + Dict *dict; + + type = transitionReplace; + duration = 1; + alignment = transitionHorizontal; + direction = transitionInward; + angle = 0; + scale = 1.0; + rectangular = gFalse; + ok = gTrue; + + if (!trans || !trans->isDict ()) { + ok = gFalse; + return; + } + + dict = trans->getDict(); + + // get type + if (dict->lookup("S", &obj)->isName()) { + const char *s = obj.getName(); + + if (strcmp("R", s) == 0) + type = transitionReplace; + else if (strcmp("Split", s) == 0) + type = transitionSplit; + else if (strcmp("Blinds", s) == 0) + type = transitionBlinds; + else if (strcmp("Box", s) == 0) + type = transitionBox; + else if (strcmp("Wipe", s) == 0) + type = transitionWipe; + else if (strcmp("Dissolve", s) == 0) + type = transitionDissolve; + else if (strcmp("Glitter", s) == 0) + type = transitionGlitter; + else if (strcmp("Fly", s) == 0) + type = transitionFly; + else if (strcmp("Push", s) == 0) + type = transitionPush; + else if (strcmp("Cover", s) == 0) + type = transitionCover; + else if (strcmp("Uncover", s) == 0) + type = transitionUncover; + else if (strcmp("Fade", s) == 0) + type = transitionFade; + } + obj.free(); + + // get duration + if (dict->lookup("D", &obj)->isInt()) { + duration = obj.getInt(); + } + obj.free(); + + // get alignment + if (dict->lookup("Dm", &obj)->isName()) { + const char *dm = obj.getName(); + + if (strcmp("H", dm) == 0) + alignment = transitionHorizontal; + else if (strcmp("V", dm) == 0) + alignment = transitionVertical; + } + obj.free(); + + // get direction + if (dict->lookup("M", &obj)->isName()) { + const char *m = obj.getName(); + + if (strcmp("I", m) == 0) + direction = transitionInward; + else if (strcmp("O", m) == 0) + direction = transitionOutward; + } + obj.free(); + + // get angle + if (dict->lookup("Di", &obj)->isInt()) { + angle = obj.getInt(); + } + obj.free(); + + if (dict->lookup("Di", &obj)->isName()) { + if (strcmp("None", obj.getName()) == 0) + angle = 0; + } + obj.free(); + + // get sacle + if (dict->lookup("SS", &obj)->isReal()) { + scale = obj.getReal(); + } + obj.free(); + + // get rectangular + if (dict->lookup("B", &obj)->isBool()) { + rectangular = obj.getBool(); + } + obj.free(); +} + +PageTransition::~PageTransition() +{ +} + diff --git a/poppler/PageTransition.h b/poppler/PageTransition.h new file mode 100644 index 0000000..e892c6c --- /dev/null +++ b/poppler/PageTransition.h @@ -0,0 +1,104 @@ +/* PageTransition.cc + * Copyright (C) 2005, Net Integration Technologies, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef PAGE_TRANSITION_H +#define PAGE_TRANSITION_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +//------------------------------------------------------------------------ +// PageTransition +//------------------------------------------------------------------------ + +// if changed remember to keep in sync with frontend enums +enum PageTransitionType { + transitionReplace = 0, + transitionSplit, + transitionBlinds, + transitionBox, + transitionWipe, + transitionDissolve, + transitionGlitter, + transitionFly, + transitionPush, + transitionCover, + transitionUncover, + transitionFade +}; + +// if changed remember to keep in sync with frontend enums +enum PageTransitionAlignment { + transitionHorizontal = 0, + transitionVertical +}; + +// if changed remember to keep in sync with frontend enums +enum PageTransitionDirection { + transitionInward = 0, + transitionOutward +}; + +class PageTransition { +public: + // Construct a Page Transition. + PageTransition (Object *trans); + + // Destructor. + ~PageTransition (); + + // Was the Page Transition created successfully? + GBool isOk() { return ok; } + + // Get type + PageTransitionType getType() { return type; } + + // Get duration + int getDuration() { return duration;} + + // Get alignment + PageTransitionAlignment getAlignment() { return alignment; } + + // Get direction + PageTransitionDirection getDirection() { return direction; } + + // Get angle + int getAngle() { return angle; } + + // Get scale + double getScale() { return scale; } + + // Is rectangular? + GBool isRectangular() { return rectangular; } + +private: + + PageTransitionType type; // transition style + int duration; // duration of the effect in seconds + PageTransitionAlignment alignment; // dimension of the effect + PageTransitionDirection direction; // direction of motion + int angle; // direction in degrees + double scale; // scale + GBool rectangular; // is the area to be flown in rectangular? + GBool ok; // set if created successfully +}; + +#endif /* PAGE_TRANSITION_H */ diff --git a/poppler/Parser.cc b/poppler/Parser.cc new file mode 100644 index 0000000..5b80293 --- /dev/null +++ b/poppler/Parser.cc @@ -0,0 +1,298 @@ +//======================================================================== +// +// Parser.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2009, 201, 2010 Albert Astals Cid +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2009 Ilya Gorenbein +// Copyright (C) 2012 Hib Eris +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Decrypt.h" +#include "Parser.h" +#include "XRef.h" +#include "Error.h" + +// Max number of nested objects. This is used to catch infinite loops +// in the object structure. And also technically valid files with +// lots of nested arrays that made us consume all the stack +#define recursionLimit 500 + +Parser::Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA) { + xref = xrefA; + lexer = lexerA; + inlineImg = 0; + allowStreams = allowStreamsA; + lexer->getObj(&buf1); + lexer->getObj(&buf2); +} + +Parser::~Parser() { + buf1.free(); + buf2.free(); + delete lexer; +} + +Object *Parser::getObj(Object *obj, int recursion) +{ + return getObj(obj, gFalse, NULL, cryptRC4, 0, 0, 0, recursion); +} + +Object *Parser::getObj(Object *obj, GBool simpleOnly, + Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, + int objNum, int objGen, int recursion, + GBool strict) { + char *key; + Stream *str; + Object obj2; + int num; + DecryptStream *decrypt; + GooString *s, *s2; + int c; + + // refill buffer after inline image data + if (inlineImg == 2) { + buf1.free(); + buf2.free(); + lexer->getObj(&buf1); + lexer->getObj(&buf2); + inlineImg = 0; + } + + // array + if (!simpleOnly && likely(recursion < recursionLimit) && buf1.isCmd("[")) { + shift(); + obj->initArray(xref); + while (!buf1.isCmd("]") && !buf1.isEOF()) + obj->arrayAdd(getObj(&obj2, gFalse, fileKey, encAlgorithm, keyLength, + objNum, objGen, recursion + 1)); + if (buf1.isEOF()) { + error(errSyntaxError, getPos(), "End of file inside array"); + if (strict) goto err; + } + shift(); + + // dictionary or stream + } else if (!simpleOnly && likely(recursion < recursionLimit) && buf1.isCmd("<<")) { + shift(objNum); + obj->initDict(xref); + while (!buf1.isCmd(">>") && !buf1.isEOF()) { + if (!buf1.isName()) { + error(errSyntaxError, getPos(), "Dictionary key must be a name object"); + if (strict) goto err; + shift(); + } else { + // buf1 might go away in shift(), so construct the key + key = copyString(buf1.getName()); + shift(); + if (buf1.isEOF() || buf1.isError()) { + gfree(key); + if (strict && buf1.isError()) goto err; + break; + } + obj->dictAdd(key, getObj(&obj2, gFalse, fileKey, encAlgorithm, keyLength, objNum, objGen, recursion + 1)); + } + } + if (buf1.isEOF()) { + error(errSyntaxError, getPos(), "End of file inside dictionary"); + if (strict) goto err; + } + // stream objects are not allowed inside content streams or + // object streams + if (allowStreams && buf2.isCmd("stream")) { + if ((str = makeStream(obj, fileKey, encAlgorithm, keyLength, + objNum, objGen, recursion + 1, + strict))) { + obj->initStream(str); + } else { + obj->free(); + obj->initError(); + } + } else { + shift(); + } + + // indirect reference or integer + } else if (buf1.isInt()) { + num = buf1.getInt(); + shift(); + if (buf1.isInt() && buf2.isCmd("R")) { + obj->initRef(num, buf1.getInt()); + shift(); + shift(); + } else { + obj->initInt(num); + } + + // string + } else if (buf1.isString() && fileKey) { + s = buf1.getString(); + s2 = new GooString(); + obj2.initNull(); + decrypt = new DecryptStream(new MemStream(s->getCString(), 0, + s->getLength(), &obj2), + fileKey, encAlgorithm, keyLength, + objNum, objGen); + decrypt->reset(); + while ((c = decrypt->getChar()) != EOF) { + s2->append((char)c); + } + delete decrypt; + obj->initString(s2); + shift(); + + // simple object + } else { + // avoid re-allocating memory for complex objects like strings by + // shallow copy of to and nulling so that + // subsequent buf1.free() won't free this memory + buf1.shallowCopy(obj); + buf1.initNull(); + shift(); + } + + return obj; + +err: + obj->free(); + obj->initError(); + return obj; + +} + +Stream *Parser::makeStream(Object *dict, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, + int objNum, int objGen, int recursion, + GBool strict) { + Object obj; + BaseStream *baseStr; + Stream *str; + Guint pos, endPos, length; + + // get stream start position + lexer->skipToNextLine(); + if (!(str = lexer->getStream())) { + return NULL; + } + pos = str->getPos(); + + // get length + dict->dictLookup("Length", &obj, recursion); + if (obj.isInt()) { + length = (Guint)obj.getInt(); + obj.free(); + } else { + error(errSyntaxError, getPos(), "Bad 'Length' attribute in stream"); + obj.free(); + if (strict) return NULL; + length = 0; + } + + // check for length in damaged file + if (xref && xref->getStreamEnd(pos, &endPos)) { + length = endPos - pos; + } + + // in badly damaged PDF files, we can run off the end of the input + // stream immediately after the "stream" token + if (!lexer->getStream()) { + return NULL; + } + baseStr = lexer->getStream()->getBaseStream(); + + // skip over stream data + if (Lexer::LOOK_VALUE_NOT_CACHED != lexer->lookCharLastValueCached) { + // take into account the fact that we've cached one value + pos = pos - 1; + lexer->lookCharLastValueCached = Lexer::LOOK_VALUE_NOT_CACHED; + } + lexer->setPos(pos + length); + + // refill token buffers and check for 'endstream' + shift(); // kill '>>' + shift(); // kill 'stream' + if (buf1.isCmd("endstream")) { + shift(); + } else { + error(errSyntaxError, getPos(), "Missing 'endstream' or incorrect stream length"); + if (strict) return NULL; + if (xref) { + // shift until we find the proper endstream or we change to another object or reach eof + while (!buf1.isCmd("endstream") && xref->getNumEntry(lexer->getPos()) == objNum && !buf1.isEOF()) { + shift(); + } + length = lexer->getPos() - pos; + if (buf1.isCmd("endstream")) { + obj.initInt(length); + dict->dictSet("Length", &obj); + obj.free(); + } + } else { + // When building the xref we can't use it so use this + // kludge for broken PDF files: just add 5k to the length, and + // hope its enough + length += 5000; + } + } + + // make base stream + str = baseStr->makeSubStream(pos, gTrue, length, dict); + + // handle decryption + if (fileKey) { + str = new DecryptStream(str, fileKey, encAlgorithm, keyLength, + objNum, objGen); + } + + // get filters + str = str->addFilters(dict); + + return str; +} + +void Parser::shift(int objNum) { + if (inlineImg > 0) { + if (inlineImg < 2) { + ++inlineImg; + } else { + // in a damaged content stream, if 'ID' shows up in the middle + // of a dictionary, we need to reset + inlineImg = 0; + } + } else if (buf2.isCmd("ID")) { + lexer->skipChar(); // skip char after 'ID' command + inlineImg = 1; + } + buf1.free(); + buf2.shallowCopy(&buf1); + if (inlineImg > 0) // don't buffer inline image data + buf2.initNull(); + else + lexer->getObj(&buf2, objNum); +} diff --git a/poppler/Parser.h b/poppler/Parser.h new file mode 100644 index 0000000..5ab4099 --- /dev/null +++ b/poppler/Parser.h @@ -0,0 +1,79 @@ +//======================================================================== +// +// Parser.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2010 Albert Astals Cid +// Copyright (C) 2012 Hib Eris +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PARSER_H +#define PARSER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Lexer.h" + +//------------------------------------------------------------------------ +// Parser +//------------------------------------------------------------------------ + +class Parser { +public: + + // Constructor. + Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA); + + // Destructor. + ~Parser(); + + // Get the next object from the input stream. If is + // true, do not parse compound objects (arrays, dictionaries, or + // streams). + Object *getObj(Object *obj, GBool simpleOnly = gFalse, + Guchar *fileKey = NULL, + CryptAlgorithm encAlgorithm = cryptRC4, int keyLength = 0, + int objNum = 0, int objGen = 0, int recursion = 0, + GBool strict = gFalse); + + Object *getObj(Object *obj, int recursion); + + // Get stream. + Stream *getStream() { return lexer->getStream(); } + + // Get current position in file. + int getPos() { return lexer->getPos(); } + +private: + + XRef *xref; // the xref table for this PDF file + Lexer *lexer; // input stream + GBool allowStreams; // parse stream objects? + Object buf1, buf2; // next two tokens + int inlineImg; // set when inline image data is encountered + + Stream *makeStream(Object *dict, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, + int objNum, int objGen, int recursion, + GBool strict); + void shift(int objNum = -1); +}; + +#endif + diff --git a/poppler/PopplerCache.cc b/poppler/PopplerCache.cc new file mode 100644 index 0000000..6018a77 --- /dev/null +++ b/poppler/PopplerCache.cc @@ -0,0 +1,163 @@ +//======================================================================== +// +// PopplerCache.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Koji Otani +// Copyright (C) 2009, 2010 Albert Astals Cid +// Copyright (C) 2010 Carlos Garcia Campos +// +//======================================================================== + +#include "PopplerCache.h" + +#include "XRef.h" + +PopplerCacheKey::~PopplerCacheKey() +{ +} + +PopplerCacheItem::~PopplerCacheItem() +{ +} + +PopplerCache::PopplerCache(int cacheSizeA) +{ + cacheSize = cacheSizeA; + keys = new PopplerCacheKey*[cacheSize]; + items = new PopplerCacheItem*[cacheSize]; + lastValidCacheIndex = -1; +} + +PopplerCache::~PopplerCache() +{ + for (int i = 0; i <= lastValidCacheIndex; ++i) { + delete keys[i]; + delete items[i]; + } + delete[] keys; + delete[] items; +} + +PopplerCacheItem *PopplerCache::lookup(const PopplerCacheKey &key) +{ + if (lastValidCacheIndex < 0) + return 0; + + if (*keys[0] == key) { + return items[0]; + } + for (int i = 1; i <= lastValidCacheIndex; i++) { + if (*keys[i] == key) { + PopplerCacheKey *keyHit = keys[i]; + PopplerCacheItem *itemHit = items[i]; + + for (int j = i; j > 0; j--) { + keys[j] = keys[j - 1]; + items[j] = items[j - 1]; + } + + keys[0] = keyHit; + items[0] = itemHit; + return itemHit; + } + } + return 0; +} + +void PopplerCache::put(PopplerCacheKey *key, PopplerCacheItem *item) +{ + int movingStartIndex = lastValidCacheIndex + 1; + if (lastValidCacheIndex == cacheSize - 1) { + delete keys[lastValidCacheIndex]; + delete items[lastValidCacheIndex]; + movingStartIndex = cacheSize - 1; + } else { + lastValidCacheIndex++; + } + for (int i = movingStartIndex; i > 0; i--) { + keys[i] = keys[i - 1]; + items[i] = items[i - 1]; + } + keys[0] = key; + items[0] = item; +} + +int PopplerCache::size() +{ + return cacheSize; +} + +int PopplerCache::numberOfItems() +{ + return lastValidCacheIndex + 1; +} + +PopplerCacheItem *PopplerCache::item(int index) +{ + return items[index]; +} + +PopplerCacheKey *PopplerCache::key(int index) +{ + return keys[index]; +} + +class ObjectKey : public PopplerCacheKey { + public: + ObjectKey(int numA, int genA) : num(numA), gen(genA) + { + } + + bool operator==(const PopplerCacheKey &key) const + { + const ObjectKey *k = static_cast(&key); + return k->num == num && k->gen == gen; + } + + int num, gen; +}; + +class ObjectItem : public PopplerCacheItem { + public: + ObjectItem(Object *obj) + { + obj->copy(&item); + } + + ~ObjectItem() + { + item.free(); + } + + Object item; +}; + +PopplerObjectCache::PopplerObjectCache(int cacheSize, XRef *xrefA) { + cache = new PopplerCache (cacheSize); + xref = xrefA; +} + +PopplerObjectCache::~PopplerObjectCache() { + delete cache; +} + +Object *PopplerObjectCache::put(const Ref &ref) { + Object obj; + xref->fetch(ref.num, ref.gen, &obj); + + ObjectKey *key = new ObjectKey(ref.num, ref.gen); + ObjectItem *item = new ObjectItem(&obj); + cache->put(key, item); + obj.free(); + + return &item->item; +} + +Object *PopplerObjectCache::lookup(const Ref &ref, Object *obj) { + ObjectKey key(ref.num, ref.gen); + ObjectItem *item = static_cast(cache->lookup(key)); + + return item ? item->item.copy(obj) : obj->initNull(); +} diff --git a/poppler/PopplerCache.h b/poppler/PopplerCache.h new file mode 100644 index 0000000..74010a2 --- /dev/null +++ b/poppler/PopplerCache.h @@ -0,0 +1,78 @@ +//======================================================================== +// +// PopplerCache.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2009 Koji Otani +// Copyright (C) 2009, 2010 Albert Astals Cid +// Copyright (C) 2010 Carlos Garcia Campos +// +//======================================================================== + +#ifndef POPPLER_CACHE_H +#define POPPLER_CACHE_H + +#include "Object.h" + +class PopplerCacheItem +{ + public: + virtual ~PopplerCacheItem(); +}; + +class PopplerCacheKey +{ + public: + virtual ~PopplerCacheKey(); + virtual bool operator==(const PopplerCacheKey &key) const = 0; +}; + +class PopplerCache +{ + public: + PopplerCache(int cacheSizeA); + ~PopplerCache(); + + /* The item returned is owned by the cache */ + PopplerCacheItem *lookup(const PopplerCacheKey &key); + + /* The key and item pointers ownership is taken by the cache */ + void put(PopplerCacheKey *key, PopplerCacheItem *item); + + /* The max size of the cache */ + int size(); + + /* The number of items in the cache */ + int numberOfItems(); + + /* The n-th item in the cache */ + PopplerCacheItem *item(int index); + + /* The n-th key in the cache */ + PopplerCacheKey *key(int index); + + private: + PopplerCache(const PopplerCache &cache); // not allowed + + PopplerCacheKey **keys; + PopplerCacheItem **items; + int lastValidCacheIndex; + int cacheSize; +}; + +class PopplerObjectCache +{ + public: + PopplerObjectCache (int cacheSizeA, XRef *xrefA); + ~PopplerObjectCache(); + + Object *put(const Ref &ref); + Object *lookup(const Ref &ref, Object *obj); + + private: + XRef *xref; + PopplerCache *cache; +}; + +#endif diff --git a/poppler/PreScanOutputDev.cc b/poppler/PreScanOutputDev.cc new file mode 100644 index 0000000..3a86d52 --- /dev/null +++ b/poppler/PreScanOutputDev.cc @@ -0,0 +1,357 @@ +//======================================================================== +// +// PreScanOutputDev.cc +// +// Copyright 2005 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2010, 2011 Albert Astals Cid +// Copyright (C) 2011 William Bader +// Copyright (C) 2011 Thomas Freitag +// Copyright (C) 2011 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "GlobalParams.h" +#include "Gfx.h" +#include "GfxFont.h" +#include "Link.h" +#include "Catalog.h" +#include "Page.h" +#include "PreScanOutputDev.h" + +//------------------------------------------------------------------------ +// PreScanOutputDev +//------------------------------------------------------------------------ + +PreScanOutputDev::PreScanOutputDev(PDFDoc *docA) { + level = globalParams->getPSLevel(); + doc = docA; + clearStats(); +} + +PreScanOutputDev::~PreScanOutputDev() { +} + +void PreScanOutputDev::startPage(int /*pageNum*/, GfxState * /*state*/) { +} + +void PreScanOutputDev::endPage() { +} + +void PreScanOutputDev::stroke(GfxState *state) { + double *dash; + int dashLen; + double dashStart; + + check(state->getStrokeColorSpace(), state->getStrokeColor(), + state->getStrokeOpacity(), state->getBlendMode()); + state->getLineDash(&dash, &dashLen, &dashStart); + if (dashLen != 0) { + gdi = gFalse; + } +} + +void PreScanOutputDev::fill(GfxState *state) { + check(state->getFillColorSpace(), state->getFillColor(), + state->getFillOpacity(), state->getBlendMode()); +} + +void PreScanOutputDev::eoFill(GfxState *state) { + check(state->getFillColorSpace(), state->getFillColor(), + state->getFillOpacity(), state->getBlendMode()); +} + +GBool PreScanOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *catalog, Object *str, + double *pmat, int paintType, int /*tilingType*/, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) { + if (paintType == 1) { + gfx->drawForm(str, resDict, mat, bbox); + } else { + check(state->getFillColorSpace(), state->getFillColor(), + state->getFillOpacity(), state->getBlendMode()); + } + return gTrue; +} + +GBool PreScanOutputDev::functionShadedFill(GfxState *state, + GfxFunctionShading *shading) { + if (shading->getColorSpace()->getMode() != csDeviceGray && + shading->getColorSpace()->getMode() != csCalGray) { + gray = gFalse; + } + mono = gFalse; + if (state->getFillOpacity() != 1 || + state->getBlendMode() != gfxBlendNormal) { + transparency = gTrue; + } + return gTrue; +} + +GBool PreScanOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/) { + if (shading->getColorSpace()->getMode() != csDeviceGray && + shading->getColorSpace()->getMode() != csCalGray) { + gray = gFalse; + } + mono = gFalse; + if (state->getFillOpacity() != 1 || + state->getBlendMode() != gfxBlendNormal) { + transparency = gTrue; + } + return gTrue; +} + +GBool PreScanOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/) { + if (shading->getColorSpace()->getMode() != csDeviceGray && + shading->getColorSpace()->getMode() != csCalGray) { + gray = gFalse; + } + mono = gFalse; + if (state->getFillOpacity() != 1 || + state->getBlendMode() != gfxBlendNormal) { + transparency = gTrue; + } + return gTrue; +} + +void PreScanOutputDev::clip(GfxState * /*state*/) { + //~ check for a rectangle "near" the edge of the page; + //~ else set gdi to false +} + +void PreScanOutputDev::eoClip(GfxState * /*state*/) { + //~ see clip() +} + +void PreScanOutputDev::beginStringOp(GfxState *state) { + int render; + GfxFont *font; + double m11, m12, m21, m22; + GBool simpleTTF; + + render = state->getRender(); + if (!(render & 1)) { + check(state->getFillColorSpace(), state->getFillColor(), + state->getFillOpacity(), state->getBlendMode()); + } + if ((render & 3) == 1 || (render & 3) == 2) { + check(state->getStrokeColorSpace(), state->getStrokeColor(), + state->getStrokeOpacity(), state->getBlendMode()); + } + + font = state->getFont(); + state->getFontTransMat(&m11, &m12, &m21, &m22); + //~ this should check for external fonts that are non-TrueType + simpleTTF = fabs(m11 + m22) < 0.01 && + m11 > 0 && + fabs(m12) < 0.01 && + fabs(m21) < 0.01 && + fabs(state->getHorizScaling() - 1) < 0.001 && + (font->getType() == fontTrueType || + font->getType() == fontTrueTypeOT); + if (simpleTTF) { + //~ need to create a FoFiTrueType object, and check for a Unicode cmap + } + if (state->getRender() != 0 || !simpleTTF) { + gdi = gFalse; + } +} + +void PreScanOutputDev::endStringOp(GfxState * /*state*/) { +} + +GBool PreScanOutputDev::beginType3Char(GfxState * /*state*/, double /*x*/, double /*y*/, + double /*dx*/, double /*dy*/, + CharCode /*code*/, Unicode * /*u*/, int /*uLen*/) { + // return false so all Type 3 chars get rendered (no caching) + return gFalse; +} + +void PreScanOutputDev::endType3Char(GfxState * /*state*/) { +} + +void PreScanOutputDev::drawImageMask(GfxState *state, Object * /*ref*/, Stream *str, + int width, int height, GBool /*invert*/, + GBool /*interpolate*/, GBool inlineImg) { + int i, j; + + check(state->getFillColorSpace(), state->getFillColor(), + state->getFillOpacity(), state->getBlendMode()); + gdi = gFalse; + if ((level == psLevel1 || level == psLevel1Sep) && + state->getFillColorSpace()->getMode() == csPattern) { + patternImgMask = gTrue; + } + + if (inlineImg) { + str->reset(); + j = height * ((width + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + str->close(); + } +} + +void PreScanOutputDev::drawImage(GfxState *state, Object * /*ref*/, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool /*interpolate*/, int * /*maskColors*/, GBool inlineImg) { + GfxColorSpace *colorSpace; + int i, j; + + colorSpace = colorMap->getColorSpace(); + if (colorSpace->getMode() == csIndexed) { + colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase(); + } + if (colorSpace->getMode() == csDeviceGray || + colorSpace->getMode() == csCalGray) { + if (colorMap->getBits() > 1) { + mono = gFalse; + } + } else { + gray = gFalse; + mono = gFalse; + } + if (state->getFillOpacity() != 1 || + state->getBlendMode() != gfxBlendNormal) { + transparency = gTrue; + } + gdi = gFalse; + + if (inlineImg) { + str->reset(); + j = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + str->close(); + } +} + +void PreScanOutputDev::drawMaskedImage(GfxState *state, Object * /*ref*/, + Stream * /*str*/, + int /*width*/, int /*height*/, + GfxImageColorMap *colorMap, + GBool /*interpolate*/, + Stream * /*maskStr*/, + int /*maskWidth*/, int /*maskHeight*/, + GBool /*maskInvert*/, GBool /*maskInterpolate*/) { + GfxColorSpace *colorSpace; + + colorSpace = colorMap->getColorSpace(); + if (colorSpace->getMode() == csIndexed) { + colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase(); + } + if (colorSpace->getMode() == csDeviceGray || + colorSpace->getMode() == csCalGray) { + if (colorMap->getBits() > 1) { + mono = gFalse; + } + } else { + gray = gFalse; + mono = gFalse; + } + if (state->getFillOpacity() != 1 || + state->getBlendMode() != gfxBlendNormal) { + transparency = gTrue; + } + gdi = gFalse; +} + +void PreScanOutputDev::drawSoftMaskedImage(GfxState * /*state*/, Object * /*ref*/, + Stream * /*str*/, + int /*width*/, int /*height*/, + GfxImageColorMap *colorMap, + GBool /*interpolate*/, + Stream * /*maskStr*/, + int /*maskWidth*/, int /*maskHeight*/, + GfxImageColorMap * /*maskColorMap*/, + GBool /*maskInterpolate*/) { + GfxColorSpace *colorSpace; + + colorSpace = colorMap->getColorSpace(); + if (colorSpace->getMode() == csIndexed) { + colorSpace = ((GfxIndexedColorSpace *)colorSpace)->getBase(); + } + if (colorSpace->getMode() != csDeviceGray && + colorSpace->getMode() != csCalGray) { + gray = gFalse; + } + mono = gFalse; + transparency = gTrue; + gdi = gFalse; +} + +void PreScanOutputDev::beginTransparencyGroup( + GfxState * /*state*/, double * /*bbox*/, + GfxColorSpace * /*blendingColorSpace*/, + GBool /*isolated*/, GBool /*knockout*/, + GBool /*forSoftMask*/) { + gdi = gFalse; +} + +void PreScanOutputDev::paintTransparencyGroup(GfxState *state, double * /*bbox*/) +{ + check(state->getFillColorSpace(), state->getFillColor(), + state->getFillOpacity(), state->getBlendMode()); +} + +void PreScanOutputDev::setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/, + Function * /*transferFunc*/, GfxColor * /*backdropColor*/) +{ + transparency = gTrue; +} + +void PreScanOutputDev::check(GfxColorSpace *colorSpace, GfxColor *color, + double opacity, GfxBlendMode blendMode) { + GfxRGB rgb; + + if (colorSpace->getMode() == csPattern) { + mono = gFalse; + gray = gFalse; + gdi = gFalse; + } else { + colorSpace->getRGB(color, &rgb); + if (rgb.r != rgb.g || rgb.g != rgb.b || rgb.b != rgb.r) { + mono = gFalse; + gray = gFalse; + } else if (!((rgb.r == 0 && rgb.g == 0 && rgb.b == 0) || + (rgb.r == gfxColorComp1 && + rgb.g == gfxColorComp1 && + rgb.b == gfxColorComp1))) { + mono = gFalse; + } + } + if (opacity != 1 || blendMode != gfxBlendNormal) { + transparency = gTrue; + } +} + +void PreScanOutputDev::clearStats() { + mono = gTrue; + gray = gTrue; + transparency = gFalse; + gdi = gTrue; + patternImgMask = gFalse; +} diff --git a/poppler/PreScanOutputDev.h b/poppler/PreScanOutputDev.h new file mode 100644 index 0000000..5260a3b --- /dev/null +++ b/poppler/PreScanOutputDev.h @@ -0,0 +1,181 @@ +//======================================================================== +// +// PreScanOutputDev.h +// +// Copyright 2005 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2010 Albert Astals Cid +// Copyright (C) 2011 William Bader +// Copyright (C) 2011 Thomas Freitag +// Copyright (C) 2011 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef PRESCANOUTPUTDEV_H +#define PRESCANOUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" +#include "GfxState.h" +#include "GlobalParams.h" +#include "OutputDev.h" + +//------------------------------------------------------------------------ +// PreScanOutputDev +//------------------------------------------------------------------------ + +class PreScanOutputDev: public OutputDev { +public: + + // Constructor. + PreScanOutputDev(PDFDoc *docA); + + // Destructor. + virtual ~PreScanOutputDev(); + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gTrue; } + + // Does this device use functionShadedFill(), axialShadedFill(), and + // radialShadedFill()? If this returns false, these shaded fills + // will be reduced to a series of other drawing operations. + virtual GBool useShadedFills(int type) { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + virtual GBool functionShadedFill(GfxState *state, + GfxFunctionShading *shading); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double tMin, double tMax); + + //----- path clipping + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + + //----- text drawing + virtual void beginStringOp(GfxState *state); + virtual void endStringOp(GfxState *state); + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate); + + //----- transparency groups and soft masks + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask); + virtual void paintTransparencyGroup(GfxState *state, double *bbox); + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, + Function *transferFunc, GfxColor *backdropColor); + + //----- special access + + // Returns true if the operations performed since the last call to + // clearStats() are all monochrome (black or white). + GBool isMonochrome() { return mono; } + + // Returns true if the operations performed since the last call to + // clearStats() are all gray. + GBool isGray() { return gray; } + + // Returns true if the operations performed since the last call to + // clearStats() included any transparency. + GBool usesTransparency() { return transparency; } + + // Returns true if the operations performed since the last call to + // clearStats() are all rasterizable by GDI calls in GDIOutputDev. + GBool isAllGDI() { return gdi; } + + // Returns true if the operations performed since the last call to + // clearStats() included any image mask fills with a pattern color + // space. (only level1!) + GBool usesPatternImageMask() { return patternImgMask; } + + // Clear the stats used by the above functions. + void clearStats(); + +private: + + void check(GfxColorSpace *colorSpace, GfxColor *color, + double opacity, GfxBlendMode blendMode); + + PDFDoc *doc; + GBool mono; + GBool gray; + GBool transparency; + GBool gdi; + PSLevel level; // PostScript level (1, 2, separation) + GBool patternImgMask; +}; + +#endif diff --git a/poppler/ProfileData.cc b/poppler/ProfileData.cc new file mode 100644 index 0000000..a0c4474 --- /dev/null +++ b/poppler/ProfileData.cc @@ -0,0 +1,44 @@ +//======================================================================== +// +// ProfileData.cc +// +// Copyright 2005 Jonathan Blandford +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "ProfileData.h" + +//------------------------------------------------------------------------ +// ProfileData +//------------------------------------------------------------------------ + +ProfileData::ProfileData() { + count = 0; + total = 0.0; + min = 0.0; + max = 0.0; +} + +void +ProfileData::addElement (double elapsed) { + if (count == 0) { + min = elapsed; + max = elapsed; + } else { + if (elapsed < min) + min = elapsed; + if (elapsed > max) + max = elapsed; + } + total += elapsed; + count ++; +} + diff --git a/poppler/ProfileData.h b/poppler/ProfileData.h new file mode 100644 index 0000000..418ee01 --- /dev/null +++ b/poppler/ProfileData.h @@ -0,0 +1,41 @@ +//======================================================================== +// +// ProfileData.h +// +// Copyright 2005 Jonathan Blandford +// +//======================================================================== + +#ifndef PROFILE_DATA_H +#define PROFILE_DATA_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +//------------------------------------------------------------------------ +// ProfileData +//------------------------------------------------------------------------ + +class ProfileData { +public: + + // Constructor. + ProfileData (); + + // Destructor. + ~ProfileData() {} + + void addElement (double elapsed); + int getCount () { return count; } + double getTotal () { return total; } + double getMin () { return max; } + double getMax () { return max; } +private: + int count; // size of array + double total; // number of elements in array + double min; // reference count + double max; // reference count +}; + +#endif diff --git a/poppler/Rendition.cc b/poppler/Rendition.cc new file mode 100644 index 0000000..c040bf2 --- /dev/null +++ b/poppler/Rendition.cc @@ -0,0 +1,401 @@ +//********************************************************************************* +// Rendition.cc +//--------------------------------------------------------------------------------- +// +//--------------------------------------------------------------------------------- +// Hugo Mercier (c) 2008 +// Pino Toscano (c) 2008 +// Carlos Garcia Campos (c) 2010 +// Tobias Koenig (c) 2012 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//********************************************************************************* + +#include +#include "Rendition.h" +#include "FileSpec.h" + +MediaWindowParameters::MediaWindowParameters() { + // default values + type = windowEmbedded; + width = -1; + height = -1; + relativeTo = windowRelativeToDocument; + XPosition = 0.5; + YPosition = 0.5; + hasTitleBar = gTrue; + hasCloseButton = gTrue; + isResizeable = gTrue; +} + +MediaWindowParameters::~MediaWindowParameters() { +} + +void MediaWindowParameters::parseFWParams(Object* obj) { + Object tmp; + + if (obj->dictLookup("D", &tmp)->isArray()) { + Array * dim = tmp.getArray(); + + if (dim->getLength() >= 2) { + Object dd; + if (dim->get(0, &dd)->isInt()) { + width = dd.getInt(); + } + dd.free(); + if (dim->get(1, &dd)->isInt()) { + height = dd.getInt(); + } + dd.free(); + } + } + tmp.free(); + + if (obj->dictLookup("RT", &tmp)->isInt()) { + int t = tmp.getInt(); + switch(t) { + case 0: relativeTo = windowRelativeToDocument; break; + case 1: relativeTo = windowRelativeToApplication; break; + case 2: relativeTo = windowRelativeToDesktop; break; + } + } + tmp.free(); + + if (obj->dictLookup("P",&tmp)->isInt()) { + int t = tmp.getInt(); + + switch(t) { + case 0: // Upper left + XPosition = 0.0; + YPosition = 0.0; + break; + case 1: // Upper Center + XPosition = 0.5; + YPosition = 0.0; + break; + case 2: // Upper Right + XPosition = 1.0; + YPosition = 0.0; + break; + case 3: // Center Left + XPosition = 0.0; + YPosition = 0.5; + break; + case 4: // Center + XPosition = 0.5; + YPosition = 0.5; + break; + case 5: // Center Right + XPosition = 1.0; + YPosition = 0.5; + break; + case 6: // Lower Left + XPosition = 0.0; + YPosition = 1.0; + break; + case 7: // Lower Center + XPosition = 0.5; + YPosition = 1.0; + break; + case 8: // Lower Right + XPosition = 1.0; + YPosition = 1.0; + break; + } + } + tmp.free(); + + if (obj->dictLookup("T", &tmp)->isBool()) { + hasTitleBar = tmp.getBool(); + } + tmp.free(); + if (obj->dictLookup("UC", &tmp)->isBool()) { + hasCloseButton = tmp.getBool(); + } + tmp.free(); + if (obj->dictLookup("R", &tmp)->isInt()) { + isResizeable = (tmp.getInt() != 0); + } + tmp.free(); + +} + +MediaParameters::MediaParameters() { + // instanciate to default values + + volume = 100; + fittingPolicy = fittingUndefined; + autoPlay = gTrue; + repeatCount = 1.0; + opacity = 1.0; + showControls = gFalse; + duration = 0; +} + +MediaParameters::~MediaParameters() { +} + +void MediaParameters::parseMediaPlayParameters(Object* obj) { + + Object tmp; + + if (obj->dictLookup("V", &tmp)->isInt()) { + volume = tmp.getInt(); + } + tmp.free(); + + if (obj->dictLookup("C", &tmp)->isBool()) { + showControls = tmp.getBool(); + } + tmp.free(); + + if (obj->dictLookup("F", &tmp)->isInt()) { + int t = tmp.getInt(); + + switch(t) { + case 0: fittingPolicy = fittingMeet; break; + case 1: fittingPolicy = fittingSlice; break; + case 2: fittingPolicy = fittingFill; break; + case 3: fittingPolicy = fittingScroll; break; + case 4: fittingPolicy = fittingHidden; break; + case 5: fittingPolicy = fittingUndefined; break; + } + } + tmp.free(); + + // duration parsing + // duration's default value is set to 0, which means : intrinsinc media duration + if (obj->dictLookup("D", &tmp)->isDict()) { + Object oname, ddict, tmp2; + if (tmp.dictLookup("S", &oname)->isName()) { + char* name = oname.getName(); + if (!strcmp(name, "F")) + duration = -1; // infinity + else if (!strcmp(name, "T")) { + if (tmp.dictLookup("T", &ddict)->isDict()) { + if (ddict.dictLookup("V", &tmp2)->isNum()) { + duration = Gulong(tmp2.getNum()); + } + tmp2.free(); + } + ddict.free(); + } + } + oname.free(); + } + tmp.free(); + + + if (obj->dictLookup("A", &tmp)->isBool()) { + autoPlay = tmp.getBool(); + } + tmp.free(); + + if (obj->dictLookup("RC", &tmp)->isNum()) { + repeatCount = tmp.getNum(); + } + tmp.free(); + +} + +void MediaParameters::parseMediaScreenParameters(Object* obj) { + Object tmp; + + if (obj->dictLookup("W", &tmp)->isInt()) { + int t = tmp.getInt(); + + switch(t) { + case 0: windowParams.type = MediaWindowParameters::windowFloating; break; + case 1: windowParams.type = MediaWindowParameters::windowFullscreen; break; + case 2: windowParams.type = MediaWindowParameters::windowHidden; break; + case 3: windowParams.type = MediaWindowParameters::windowEmbedded; break; + } + } + tmp.free(); + + // background color + if (obj->dictLookup("B", &tmp)->isArray()) { + Array* color = tmp.getArray(); + + Object component; + + color->get(0, &component); + bgColor.r = component.getNum(); + component.free(); + + color->get(1, &component); + bgColor.g = component.getNum(); + component.free(); + + color->get(2, &component); + bgColor.b = component.getNum(); + component.free(); + } + tmp.free(); + + + // opacity + if (obj->dictLookup("O", &tmp)->isNum()) { + opacity = tmp.getNum(); + } + tmp.free(); + + if (windowParams.type == MediaWindowParameters::windowFloating) { + Object winDict; + if (obj->dictLookup("F",&winDict)->isDict()) { + windowParams.parseFWParams(&winDict); + } + winDict.free(); + } +} + +MediaRendition::~MediaRendition() { + if (fileName) + delete fileName; + if (contentType) + delete contentType; + + if (embeddedStream && (!embeddedStream->decRef())) { + delete embeddedStream; + } +} + +MediaRendition::MediaRendition(Object* obj) { + Object tmp, tmp2; + GBool hasClip = gFalse; + + ok = gTrue; + fileName = NULL; + contentType = NULL; + isEmbedded = gFalse; + embeddedStream = NULL; + + // + // Parse media clip data + // + if (obj->dictLookup("C", &tmp2)->isDict()) { // media clip + hasClip = gTrue; + if (tmp2.dictLookup("S", &tmp)->isName()) { + if (!strcmp(tmp.getName(), "MCD")) { // media clip data + Object obj1, obj2; + if (tmp2.dictLookup("D", &obj1)->isDict()) { + if (obj1.dictLookup("F", &obj2)->isString()) { + fileName = obj2.getString()->copy(); + } + obj2.free(); + if (obj1.dictLookup("EF", &obj2)->isDict()) { + Object embedded; + if (obj2.dictLookup("F", &embedded)->isStream()) { + isEmbedded = gTrue; + embeddedStream = embedded.getStream(); + // "copy" stream + embeddedStream->incRef(); + } + embedded.free(); + } + obj2.free(); + + // TODO: D might be a form XObject too + } else { + error (errSyntaxError, -1, "Invalid Media Clip Data"); + ok = gFalse; + } + obj1.free(); + + // FIXME: ignore CT if D is a form XObject + if (tmp2.dictLookup("CT", &obj1)->isString()) { + contentType = obj1.getString()->copy(); + } + obj1.free(); + } else if (!strcmp(tmp.getName(), "MCS")) { // media clip data + // TODO + } + } else { + error (errSyntaxError, -1, "Invalid Media Clip"); + ok = gFalse; + } + tmp.free(); + } + tmp2.free(); + + if (!ok) + return; + + // + // parse Media Play Parameters + if (obj->dictLookup("P", &tmp2)->isDict()) { // media play parameters + Object params; + if (tmp2.dictLookup("MH", ¶ms)->isDict()) { + MH.parseMediaPlayParameters(¶ms); + } + params.free(); + if (tmp2.dictLookup("BE", ¶ms)->isDict()) { + BE.parseMediaPlayParameters(¶ms); + } + params.free(); + } else if (!hasClip) { + error (errSyntaxError, -1, "Invalid Media Rendition"); + ok = gFalse; + } + tmp2.free(); + + // + // parse Media Screen Parameters + if (obj->dictLookup("SP", &tmp2)->isDict()) { // media screen parameters + Object params; + if (tmp2.dictLookup("MH", ¶ms)->isDict()) { + MH.parseMediaScreenParameters(¶ms); + } + params.free(); + if (tmp2.dictLookup("BE", ¶ms)->isDict()) { + BE.parseMediaScreenParameters(¶ms); + } + params.free(); + } + tmp2.free(); +} + +void MediaRendition::outputToFile(FILE* fp) { + if (!isEmbedded) + return; + + embeddedStream->reset(); + + while (1) { + int c = embeddedStream->getChar(); + if (c == EOF) + break; + + fwrite(&c, 1, 1, fp); + } + +} + +MediaRendition *MediaRendition::copy() { + // call default copy constructor + MediaRendition* new_media = new MediaRendition(*this); + + if (contentType) + new_media->contentType = contentType->copy(); + if (fileName) + new_media->fileName = fileName->copy(); + + if (new_media->embeddedStream) + new_media->embeddedStream->incRef(); + + return new_media; +} + +// TODO: SelectorRendition diff --git a/poppler/Rendition.h b/poppler/Rendition.h new file mode 100644 index 0000000..75bfeff --- /dev/null +++ b/poppler/Rendition.h @@ -0,0 +1,157 @@ +//********************************************************************************* +// Rendition.h +//--------------------------------------------------------------------------------- +// +//--------------------------------------------------------------------------------- +// Hugo Mercier (c) 2008 +// Carlos Garcia Campos (c) 2010 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//********************************************************************************* + +#ifndef _RENDITION_H_ +#define _RENDITION_H_ + +#include "Object.h" + +struct MediaWindowParameters { + + MediaWindowParameters(); + ~MediaWindowParameters(); + + // parse from a floating window parameters dictionary + void parseFWParams(Object* obj); + + enum MediaWindowType { + windowFloating = 0, + windowFullscreen, + windowHidden, + windowEmbedded + }; + + enum MediaWindowRelativeTo { + windowRelativeToDocument = 0, + windowRelativeToApplication, + windowRelativeToDesktop + }; + + + // DEFAULT VALUE + + MediaWindowType type; // movieWindowEmbedded + + + int width; // -1 + int height; // -1 + + // floating window position + MediaWindowRelativeTo relativeTo; // windowRelativeToDocument (or to desktop) + double XPosition; // 0.5 + double YPosition; // 0.5 + + GBool hasTitleBar; // true + GBool hasCloseButton; // true + GBool isResizeable; // true +}; + + +struct MediaParameters { + + MediaParameters(); + ~MediaParameters(); + + // parse from a "Media Play Parameters" dictionary + void parseMediaPlayParameters(Object* playObj); + // parse from a "Media Screen Parameters" dictionary + void parseMediaScreenParameters(Object* screenObj); + + enum MediaFittingPolicy { + fittingMeet = 0, + fittingSlice, + fittingFill, + fittingScroll, + fittingHidden, + fittingUndefined + }; + + struct Color { + double r, g, b; + }; + + int duration; // 0 + + int volume; // 100 + + // defined in media play parameters, p 770 + // correspond to 'fit' SMIL's attribute + MediaFittingPolicy fittingPolicy; // fittingUndefined + + GBool autoPlay; // true + + // repeat count, can be real values, 0 means forever + double repeatCount; // 1.0 + + // background color // black = (0.0 0.0 0.0) + Color bgColor; + + // opacity in [0.0 1.0] + double opacity; // 1.0 + + + GBool showControls; // false + + MediaWindowParameters windowParams; +}; + +class MediaRendition { + public: + MediaRendition(Object *obj); + ~MediaRendition(); + + GBool isOk () { return ok; } + + MediaParameters* getMHParameters() { return &MH; } + MediaParameters* getBEParameters() { return &BE; } + + GooString* getContentType() { return contentType; } + GooString* getFileName() { return fileName; } + + GBool getIsEmbedded() { return isEmbedded; } + Stream* getEmbbededStream() { return embeddedStream; } + // write embedded stream to file + void outputToFile(FILE*); + + MediaRendition* copy(); + + private: + GBool ok; + + // "Must Honor" parameters + MediaParameters MH; + // "Best Effort" parameters + MediaParameters BE; + + GBool isEmbedded; + + GooString* contentType; + + // if it's embedded + Stream* embeddedStream; + + // if it's not embedded + GooString* fileName; +}; + +#endif /* _RENDITION_H_ */ diff --git a/poppler/SecurityHandler.cc b/poppler/SecurityHandler.cc new file mode 100644 index 0000000..a48449a --- /dev/null +++ b/poppler/SecurityHandler.cc @@ -0,0 +1,455 @@ +//======================================================================== +// +// SecurityHandler.cc +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010, 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "GooString.h" +#include "PDFDoc.h" +#include "Decrypt.h" +#include "Error.h" +#include "GlobalParams.h" +#ifdef ENABLE_PLUGINS +# include "XpdfPluginAPI.h" +#endif +#include "SecurityHandler.h" + +#include + +//------------------------------------------------------------------------ +// SecurityHandler +//------------------------------------------------------------------------ + +SecurityHandler *SecurityHandler::make(PDFDoc *docA, Object *encryptDictA) { + Object filterObj; + SecurityHandler *secHdlr; +#ifdef ENABLE_PLUGINS + XpdfSecurityHandler *xsh; +#endif + + encryptDictA->dictLookup("Filter", &filterObj); + if (filterObj.isName("Standard")) { + secHdlr = new StandardSecurityHandler(docA, encryptDictA); + } else if (filterObj.isName()) { +#ifdef ENABLE_PLUGINS + if ((xsh = globalParams->getSecurityHandler(filterObj.getName()))) { + secHdlr = new ExternalSecurityHandler(docA, encryptDictA, xsh); + } else { +#endif + error(errSyntaxError, -1, "Couldn't find the '{0:s}' security handler", + filterObj.getName()); + secHdlr = NULL; +#ifdef ENABLE_PLUGINS + } +#endif + } else { + error(errSyntaxError, -1, + "Missing or invalid 'Filter' entry in encryption dictionary"); + secHdlr = NULL; + } + filterObj.free(); + return secHdlr; +} + +SecurityHandler::SecurityHandler(PDFDoc *docA) { + doc = docA; +} + +SecurityHandler::~SecurityHandler() { +} + +GBool SecurityHandler::checkEncryption(GooString *ownerPassword, + GooString *userPassword) { + void *authData; + GBool ok; + int i; + + if (ownerPassword || userPassword) { + authData = makeAuthData(ownerPassword, userPassword); + } else { + authData = NULL; + } + ok = authorize(authData); + if (authData) { + freeAuthData(authData); + } + for (i = 0; !ok && i < 3; ++i) { + if (!(authData = getAuthData())) { + break; + } + ok = authorize(authData); + if (authData) { + freeAuthData(authData); + } + } + if (!ok) { + if (!ownerPassword && !userPassword) { + GooString dummy; + return checkEncryption(&dummy, &dummy); + } else { + error(errCommandLine, -1, "Incorrect password"); + } + } + return ok; +} + +//------------------------------------------------------------------------ +// StandardSecurityHandler +//------------------------------------------------------------------------ + +class StandardAuthData { +public: + + StandardAuthData(GooString *ownerPasswordA, GooString *userPasswordA) { + ownerPassword = ownerPasswordA; + userPassword = userPasswordA; + } + + ~StandardAuthData() { + if (ownerPassword) { + delete ownerPassword; + } + if (userPassword) { + delete userPassword; + } + } + + GooString *ownerPassword; + GooString *userPassword; +}; + +StandardSecurityHandler::StandardSecurityHandler(PDFDoc *docA, + Object *encryptDictA): + SecurityHandler(docA) +{ + Object versionObj, revisionObj, lengthObj; + Object ownerKeyObj, userKeyObj, ownerEncObj, userEncObj; + Object permObj, fileIDObj, fileIDObj1; + Object cryptFiltersObj, streamFilterObj, stringFilterObj; + Object cryptFilterObj, cfmObj, cfLengthObj; + Object encryptMetadataObj; + + ok = gFalse; + fileID = NULL; + ownerKey = NULL; + userKey = NULL; + ownerEnc = NULL; + userEnc = NULL; + fileKeyLength = 0; + + encryptDictA->dictLookup("V", &versionObj); + encryptDictA->dictLookup("R", &revisionObj); + encryptDictA->dictLookup("Length", &lengthObj); + encryptDictA->dictLookup("O", &ownerKeyObj); + encryptDictA->dictLookup("U", &userKeyObj); + encryptDictA->dictLookup("OE", &ownerEncObj); + encryptDictA->dictLookup("UE", &userEncObj); + encryptDictA->dictLookup("P", &permObj); + if (permObj.isUint()) { + unsigned int permUint = permObj.getUint(); + int perms = permUint - UINT_MAX - 1; + permObj.free(); + permObj.initInt(perms); + } + doc->getXRef()->getTrailerDict()->dictLookup("ID", &fileIDObj); + if (versionObj.isInt() && + revisionObj.isInt() && + permObj.isInt() && + ownerKeyObj.isString() && + userKeyObj.isString()) { + encVersion = versionObj.getInt(); + encRevision = revisionObj.getInt(); + if ((encRevision <= 4 && + ownerKeyObj.getString()->getLength() == 32 && + userKeyObj.getString()->getLength() == 32) || + (encRevision == 5 && + // the spec says 48 bytes, but Acrobat pads them out longer + ownerKeyObj.getString()->getLength() >= 48 && + userKeyObj.getString()->getLength() >= 48 && + ownerEncObj.isString() && + ownerEncObj.getString()->getLength() == 32 && + userEncObj.isString() && + userEncObj.getString()->getLength() == 32)) { + encAlgorithm = cryptRC4; + // revision 2 forces a 40-bit key - some buggy PDF generators + // set the Length value incorrectly + if (encRevision == 2 || !lengthObj.isInt()) { + fileKeyLength = 5; + } else { + fileKeyLength = lengthObj.getInt() / 8; + } + encryptMetadata = gTrue; + //~ this currently only handles a subset of crypt filter functionality + //~ (in particular, it ignores the EFF entry in encryptDictA, and + //~ doesn't handle the case where StmF, StrF, and EFF are not all the + //~ same) + if ((encVersion == 4 || encVersion == 5) && + (encRevision == 4 || encRevision == 5)) { + encryptDictA->dictLookup("CF", &cryptFiltersObj); + encryptDictA->dictLookup("StmF", &streamFilterObj); + encryptDictA->dictLookup("StrF", &stringFilterObj); + if (cryptFiltersObj.isDict() && + streamFilterObj.isName() && + stringFilterObj.isName() && + !strcmp(streamFilterObj.getName(), stringFilterObj.getName())) { + if (!strcmp(streamFilterObj.getName(), "Identity")) { + // no encryption on streams or strings + encVersion = encRevision = -1; + } else { + if (cryptFiltersObj.dictLookup(streamFilterObj.getName(), + &cryptFilterObj)->isDict()) { + cryptFilterObj.dictLookup("CFM", &cfmObj); + if (cfmObj.isName("V2")) { + encVersion = 2; + encRevision = 3; + if (cryptFilterObj.dictLookup("Length", + &cfLengthObj)->isInt()) { + //~ according to the spec, this should be cfLengthObj / 8 + fileKeyLength = cfLengthObj.getInt(); + } + cfLengthObj.free(); + } else if (cfmObj.isName("AESV2")) { + encVersion = 2; + encRevision = 3; + encAlgorithm = cryptAES; + if (cryptFilterObj.dictLookup("Length", + &cfLengthObj)->isInt()) { + //~ according to the spec, this should be cfLengthObj / 8 + fileKeyLength = cfLengthObj.getInt(); + } + cfLengthObj.free(); + } else if (cfmObj.isName("AESV3")) { + encVersion = 5; + encRevision = 5; + encAlgorithm = cryptAES256; + if (cryptFilterObj.dictLookup("Length", + &cfLengthObj)->isInt()) { + //~ according to the spec, this should be cfLengthObj / 8 + fileKeyLength = cfLengthObj.getInt(); + } + cfLengthObj.free(); + } + cfmObj.free(); + } + cryptFilterObj.free(); + } + } + stringFilterObj.free(); + streamFilterObj.free(); + cryptFiltersObj.free(); + if (encryptDictA->dictLookup("EncryptMetadata", + &encryptMetadataObj)->isBool()) { + encryptMetadata = encryptMetadataObj.getBool(); + } + encryptMetadataObj.free(); + } + permFlags = permObj.getInt(); + ownerKey = ownerKeyObj.getString()->copy(); + userKey = userKeyObj.getString()->copy(); + if (encVersion >= 1 && encVersion <= 2 && + encRevision >= 2 && encRevision <= 3) { + if (fileIDObj.isArray()) { + if (fileIDObj.arrayGet(0, &fileIDObj1)->isString()) { + fileID = fileIDObj1.getString()->copy(); + } else { + fileID = new GooString(); + } + fileIDObj1.free(); + } else { + fileID = new GooString(); + } + if (fileKeyLength > 16 || fileKeyLength < 0) { + fileKeyLength = 16; + } + ok = gTrue; + } else if (encVersion == 5 && encRevision == 5) { + fileID = new GooString(); // unused for V=R=5 + ownerEnc = ownerEncObj.getString()->copy(); + userEnc = userEncObj.getString()->copy(); + if (fileKeyLength > 32 || fileKeyLength < 0) { + fileKeyLength = 32; + } + ok = gTrue; + } else if (!(encVersion == -1 && encRevision == -1)) { + error(errUnimplemented, -1, + "Unsupported version/revision (%d/%d) of Standard security handler", + encVersion, encRevision); + } + } else { + error(errSyntaxError, -1, "Invalid encryption key length"); + } + } else { + error(errSyntaxError, -1, "Weird encryption info"); + } + fileIDObj.free(); + permObj.free(); + userEncObj.free(); + ownerEncObj.free(); + userKeyObj.free(); + ownerKeyObj.free(); + lengthObj.free(); + revisionObj.free(); + versionObj.free(); +} + +StandardSecurityHandler::~StandardSecurityHandler() { + if (fileID) { + delete fileID; + } + if (ownerKey) { + delete ownerKey; + } + if (userKey) { + delete userKey; + } + if (ownerEnc) { + delete ownerEnc; + } + if (userEnc) { + delete userEnc; + } +} + +GBool StandardSecurityHandler::isUnencrypted() { + return encVersion == -1 && encRevision == -1; +} + +void *StandardSecurityHandler::makeAuthData(GooString *ownerPassword, + GooString *userPassword) { + return new StandardAuthData(ownerPassword ? ownerPassword->copy() + : (GooString *)NULL, + userPassword ? userPassword->copy() + : (GooString *)NULL); +} + +void *StandardSecurityHandler::getAuthData() { + return NULL; +} + +void StandardSecurityHandler::freeAuthData(void *authData) { + delete (StandardAuthData *)authData; +} + +GBool StandardSecurityHandler::authorize(void *authData) { + GooString *ownerPassword, *userPassword; + + if (!ok) { + return gFalse; + } + if (authData) { + ownerPassword = ((StandardAuthData *)authData)->ownerPassword; + userPassword = ((StandardAuthData *)authData)->userPassword; + } else { + ownerPassword = NULL; + userPassword = NULL; + } + if (!Decrypt::makeFileKey(encVersion, encRevision, fileKeyLength, + ownerKey, userKey, ownerEnc, userEnc, + permFlags, fileID, + ownerPassword, userPassword, fileKey, + encryptMetadata, &ownerPasswordOk)) { + return gFalse; + } + return gTrue; +} + +#ifdef ENABLE_PLUGINS + +//------------------------------------------------------------------------ +// ExternalSecurityHandler +//------------------------------------------------------------------------ + +ExternalSecurityHandler::ExternalSecurityHandler(PDFDoc *docA, + Object *encryptDictA, + XpdfSecurityHandler *xshA): + SecurityHandler(docA) +{ + encryptDictA->copy(&encryptDict); + xsh = xshA; + encAlgorithm = cryptRC4; //~ this should be obtained via getKey + ok = gFalse; + + if (!(*xsh->newDoc)(xsh->handlerData, (XpdfDoc)docA, + (XpdfObject)encryptDictA, &docData)) { + return; + } + + ok = gTrue; +} + +ExternalSecurityHandler::~ExternalSecurityHandler() { + (*xsh->freeDoc)(xsh->handlerData, docData); + encryptDict.free(); +} + +void *ExternalSecurityHandler::makeAuthData(GooString *ownerPassword, + GooString *userPassword) { + char *opw, *upw; + void *authData; + + opw = ownerPassword ? ownerPassword->getCString() : (char *)NULL; + upw = userPassword ? userPassword->getCString() : (char *)NULL; + if (!(*xsh->makeAuthData)(xsh->handlerData, docData, opw, upw, &authData)) { + return NULL; + } + return authData; +} + +void *ExternalSecurityHandler::getAuthData() { + void *authData; + + if (!(*xsh->getAuthData)(xsh->handlerData, docData, &authData)) { + return NULL; + } + return authData; +} + +void ExternalSecurityHandler::freeAuthData(void *authData) { + (*xsh->freeAuthData)(xsh->handlerData, docData, authData); +} + +GBool ExternalSecurityHandler::authorize(void *authData) { + char *key; + int length; + + if (!ok) { + return gFalse; + } + permFlags = (*xsh->authorize)(xsh->handlerData, docData, authData); + if (!(permFlags & xpdfPermissionOpen)) { + return gFalse; + } + if (!(*xsh->getKey)(xsh->handlerData, docData, &key, &length, &encVersion, &encRevision)) { + return gFalse; + } + if ((fileKeyLength = length) > 16) { + fileKeyLength = 16; + } + memcpy(fileKey, key, fileKeyLength); + (*xsh->freeKey)(xsh->handlerData, docData, key, length); + return gTrue; +} + +#endif // ENABLE_PLUGINS diff --git a/poppler/SecurityHandler.h b/poppler/SecurityHandler.h new file mode 100644 index 0000000..c2991c8 --- /dev/null +++ b/poppler/SecurityHandler.h @@ -0,0 +1,183 @@ +//======================================================================== +// +// SecurityHandler.h +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SECURITYHANDLER_H +#define SECURITYHANDLER_H + +#include "poppler-config.h" + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" + +class GooString; +class PDFDoc; +struct XpdfSecurityHandler; + +//------------------------------------------------------------------------ +// SecurityHandler +//------------------------------------------------------------------------ + +class SecurityHandler { +public: + + static SecurityHandler *make(PDFDoc *docA, Object *encryptDictA); + + SecurityHandler(PDFDoc *docA); + virtual ~SecurityHandler(); + + // Returns true if the file is actually unencrypted. + virtual GBool isUnencrypted() { return gFalse; } + + // Check the document's encryption. If the document is encrypted, + // this will first try and (in + // "batch" mode), and if those fail, it will attempt to request a + // password from the user. This is the high-level function that + // calls the lower level functions for the specific security handler + // (requesting a password three times, etc.). Returns true if the + // document can be opened (if it's unencrypted, or if a correct + // password is obtained); false otherwise (encrypted and no correct + // password). + GBool checkEncryption(GooString *ownerPassword, + GooString *userPassword); + + // Create authorization data for the specified owner and user + // passwords. If the security handler doesn't support "batch" mode, + // this function should return NULL. + virtual void *makeAuthData(GooString *ownerPassword, + GooString *userPassword) = 0; + + // Construct authorization data, typically by prompting the user for + // a password. Returns an authorization data object, or NULL to + // cancel. + virtual void *getAuthData() = 0; + + // Free the authorization data returned by makeAuthData or + // getAuthData. + virtual void freeAuthData(void *authData) = 0; + + // Attempt to authorize the document, using the supplied + // authorization data (which may be NULL). Returns true if + // successful (i.e., if at least the right to open the document was + // granted). + virtual GBool authorize(void *authData) = 0; + + // Return the various authorization parameters. These are only + // valid after authorize has returned true. + virtual int getPermissionFlags() = 0; + virtual GBool getOwnerPasswordOk() = 0; + virtual Guchar *getFileKey() = 0; + virtual int getFileKeyLength() = 0; + virtual int getEncVersion() = 0; + virtual int getEncRevision() = 0; + virtual CryptAlgorithm getEncAlgorithm() = 0; + +protected: + + PDFDoc *doc; +}; + +//------------------------------------------------------------------------ +// StandardSecurityHandler +//------------------------------------------------------------------------ + +class StandardSecurityHandler: public SecurityHandler { +public: + + StandardSecurityHandler(PDFDoc *docA, Object *encryptDictA); + virtual ~StandardSecurityHandler(); + + virtual GBool isUnencrypted(); + virtual void *makeAuthData(GooString *ownerPassword, + GooString *userPassword); + virtual void *getAuthData(); + virtual void freeAuthData(void *authData); + virtual GBool authorize(void *authData); + virtual int getPermissionFlags() { return permFlags; } + virtual GBool getOwnerPasswordOk() { return ownerPasswordOk; } + virtual Guchar *getFileKey() { return fileKey; } + virtual int getFileKeyLength() { return fileKeyLength; } + virtual int getEncVersion() { return encVersion; } + virtual int getEncRevision() { return encRevision; } + virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; } + +private: + + int permFlags; + GBool ownerPasswordOk; + Guchar fileKey[32]; + int fileKeyLength; + int encVersion; + int encRevision; + GBool encryptMetadata; + CryptAlgorithm encAlgorithm; + + GooString *ownerKey, *userKey; + GooString *ownerEnc, *userEnc; + GooString *fileID; + GBool ok; +}; + +#ifdef ENABLE_PLUGINS +//------------------------------------------------------------------------ +// ExternalSecurityHandler +//------------------------------------------------------------------------ + +class ExternalSecurityHandler: public SecurityHandler { +public: + + ExternalSecurityHandler(PDFDoc *docA, Object *encryptDictA, + XpdfSecurityHandler *xshA); + virtual ~ExternalSecurityHandler(); + + virtual void *makeAuthData(GooString *ownerPassword, + GooString *userPassword); + virtual void *getAuthData(); + virtual void freeAuthData(void *authData); + virtual GBool authorize(void *authData); + virtual int getPermissionFlags() { return permFlags; } + virtual GBool getOwnerPasswordOk() { return gFalse; } + virtual Guchar *getFileKey() { return fileKey; } + virtual int getFileKeyLength() { return fileKeyLength; } + virtual int getEncVersion() { return encVersion; } + virtual int getEncRevision() { return encRevision; } + virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; } + +private: + + Object encryptDict; + XpdfSecurityHandler *xsh; + void *docData; + int permFlags; + Guchar fileKey[16]; + int fileKeyLength; + int encVersion; + int encRevision; + CryptAlgorithm encAlgorithm; + GBool ok; +}; +#endif // ENABLE_PLUGINS + +#endif diff --git a/poppler/Sound.cc b/poppler/Sound.cc new file mode 100644 index 0000000..6129fdc --- /dev/null +++ b/poppler/Sound.cc @@ -0,0 +1,145 @@ +/* Sound.cc - an object that holds the sound structure + * Copyright (C) 2006-2007, Pino Toscano + * Copyright (C) 2009, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "GooString.h" +#include "Object.h" +#include "Sound.h" +#include "Stream.h" +#include "FileSpec.h" + +Sound *Sound::parseSound(Object *obj) +{ + // let's try to see if this Object is a Sound, according to the PDF specs + // (section 9.2) + Stream *str = NULL; + // the Object must be a Stream + if (obj->isStream()) { + str = obj->getStream(); + } else { + return NULL; + } + // the Stream must have a Dict + Dict *dict = str->getDict(); + if (dict == NULL) + return NULL; + Object tmp; + // the Dict must have the 'R' key of type num + dict->lookup("R", &tmp); + if (tmp.isNum()) { + return new Sound(obj); + } else { + return NULL; + } +} + +Sound::Sound(Object *obj, bool readAttrs) +{ + streamObj = new Object(); + streamObj->initNull(); + obj->copy(streamObj); + + fileName = NULL; + samplingRate = 0.0; + channels = 1; + bitsPerSample = 8; + encoding = soundRaw; + + if (readAttrs) + { + Object tmp; + Dict *dict = streamObj->getStream()->getDict(); + dict->lookup("F", &tmp); + if (!tmp.isNull()) { + Object obj1; + // valid 'F' key -> external file + kind = soundExternal; + if (getFileSpecNameForPlatform (&tmp, &obj1)) { + fileName = obj1.getString()->copy(); + obj1.free(); + } + } else { + // no file specification, then the sound data have to be + // extracted from the stream + kind = soundEmbedded; + } + tmp.free(); + // sampling rate + dict->lookup("R", &tmp); + if (tmp.isNum()) { + samplingRate = tmp.getNum(); + } + tmp.free(); + // sound channels + dict->lookup("C", &tmp); + if (tmp.isInt()) { + channels = tmp.getInt(); + } + tmp.free(); + // bits per sample + dict->lookup("B", &tmp); + if (tmp.isInt()) { + bitsPerSample = tmp.getInt(); + } + tmp.free(); + // encoding format + dict->lookup("E", &tmp); + if (tmp.isName()) + { + const char *enc = tmp.getName(); + if (strcmp("Raw", enc) == 0) { + encoding = soundRaw; + } else if (strcmp("Signed", enc) == 0) { + encoding = soundSigned; + } else if (strcmp("muLaw", enc) == 0) { + encoding = soundMuLaw; + } else if (strcmp("ALaw", enc) == 0) { + encoding = soundALaw; + } + } + tmp.free(); + } +} + +Sound::~Sound() +{ + delete fileName; + streamObj->free(); + delete streamObj; +} + +Stream *Sound::getStream() +{ + return streamObj->getStream(); +} + +Sound *Sound::copy() +{ + Sound *newsound = new Sound(streamObj, false); + + newsound->kind = kind; + if (fileName) { + newsound->fileName = fileName->copy(); + } + newsound->samplingRate = samplingRate; + newsound->channels = channels; + newsound->bitsPerSample = bitsPerSample; + newsound->encoding = encoding; + + return newsound; +} diff --git a/poppler/Sound.h b/poppler/Sound.h new file mode 100644 index 0000000..acb0f8d --- /dev/null +++ b/poppler/Sound.h @@ -0,0 +1,74 @@ +/* Sound.h - an object that holds the sound structure + * Copyright (C) 2006-2007, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef Sound_H +#define Sound_H + +class GooString; +class Object; +class Stream; + +//------------------------------------------------------------------------ + +enum SoundKind { + soundEmbedded, // embedded sound + soundExternal // external sound +}; + +enum SoundEncoding { + soundRaw, // raw encoding + soundSigned, // twos-complement values + soundMuLaw, // mu-law-encoded samples + soundALaw // A-law-encoded samples +}; + +class Sound +{ +public: + // Try to parse the Object s + static Sound *parseSound(Object *s); + + // Destructor + ~Sound(); + + Object *getObject() { return streamObj; } + Stream *getStream(); + + SoundKind getSoundKind() { return kind; } + GooString *getFileName() { return fileName; } + double getSamplingRate() { return samplingRate; } + int getChannels() { return channels; } + int getBitsPerSample() { return bitsPerSample; } + SoundEncoding getEncoding() { return encoding; } + + Sound *copy(); + +private: + // Create a sound. The Object obj is ensured to be a Stream with a Dict + Sound(Object *obj, bool readAttrs = true); + + Object *streamObj; + SoundKind kind; + GooString *fileName; + double samplingRate; + int channels; + int bitsPerSample; + SoundEncoding encoding; +}; + +#endif diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc new file mode 100644 index 0000000..9e07060 --- /dev/null +++ b/poppler/SplashOutputDev.cc @@ -0,0 +1,4206 @@ +//======================================================================== +// +// SplashOutputDev.cc +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Takashi Iwai +// Copyright (C) 2006 Stefan Schweizer +// Copyright (C) 2006-2012 Albert Astals Cid +// Copyright (C) 2006 Krzysztof Kowalczyk +// Copyright (C) 2006 Scott Turner +// Copyright (C) 2007 Koji Otani +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2009-2012 Thomas Freitag +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009 William Bader +// Copyright (C) 2010 Patrick Spendrin +// Copyright (C) 2010 Brian Cameron +// Copyright (C) 2010 Paweł Wiejacha +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Andreas Hartmetz +// Copyright (C) 2011 Andrea Canciani +// Copyright (C) 2011 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gfile.h" +#include "GlobalParams.h" +#include "Error.h" +#include "Object.h" +#include "Gfx.h" +#include "GfxFont.h" +#include "Page.h" +#include "PDFDoc.h" +#include "Link.h" +#include "FontEncodingTables.h" +#include "fofi/FoFiTrueType.h" +#include "splash/SplashBitmap.h" +#include "splash/SplashGlyphBitmap.h" +#include "splash/SplashPattern.h" +#include "splash/SplashScreen.h" +#include "splash/SplashPath.h" +#include "splash/SplashState.h" +#include "splash/SplashErrorCodes.h" +#include "splash/SplashFontEngine.h" +#include "splash/SplashFont.h" +#include "splash/SplashFontFile.h" +#include "splash/SplashFontFileID.h" +#include "splash/Splash.h" +#include "SplashOutputDev.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +#ifdef _MSC_VER +#include +#define isfinite(x) _finite(x) +#endif + +#ifdef __sun +#include +#define isfinite(x) finite(x) +#endif + +static inline void convertGfxColor(SplashColorPtr dest, + SplashColorMode colorMode, + GfxColorSpace *colorSpace, + GfxColor *src) { + SplashColor color; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + + // make gcc happy + color[0] = color[1] = color[2] = 0; +#if SPLASH_CMYK + color[3] = 0; +#endif + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + colorSpace->getGray(src, &gray); + color[0] = colToByte(gray); + break; + case splashModeXBGR8: + color[3] = 255; + case splashModeBGR8: + case splashModeRGB8: + colorSpace->getRGB(src, &rgb); + color[0] = colToByte(rgb.r); + color[1] = colToByte(rgb.g); + color[2] = colToByte(rgb.b); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + colorSpace->getCMYK(src, &cmyk); + color[0] = colToByte(cmyk.c); + color[1] = colToByte(cmyk.m); + color[2] = colToByte(cmyk.y); + color[3] = colToByte(cmyk.k); + break; +#endif + } + splashColorCopy(dest, color); +} + +//------------------------------------------------------------------------ +// SplashGouraudPattern +//------------------------------------------------------------------------ +SplashGouraudPattern::SplashGouraudPattern(GBool bDirectColorTranslationA, + GfxState *stateA, GfxGouraudTriangleShading *shadingA, SplashColorMode modeA) { + SplashColor defaultColor; + GfxColor srcColor; + state = stateA; + shading = shadingA; + mode = modeA; + bDirectColorTranslation = bDirectColorTranslationA; + shadingA->getColorSpace()->getDefaultColor(&srcColor); + convertGfxColor(defaultColor, mode, shadingA->getColorSpace(), &srcColor); +} + +SplashGouraudPattern::~SplashGouraudPattern() { +} + +void SplashGouraudPattern::getParameterizedColor(double colorinterp, SplashColorMode mode, SplashColorPtr dest) { + GfxColor src; + GfxColorSpace* srcColorSpace = shading->getColorSpace(); + int colorComps = 3; +#if SPLASH_CMYK + if (mode == splashModeCMYK8) + colorComps=4; +#endif + + shading->getParameterizedColor(colorinterp, &src); + + if (bDirectColorTranslation) { + for (int m = 0; m < colorComps; ++m) + dest[m] = colToByte(src.c[m]); + } else { + convertGfxColor(dest, mode, srcColorSpace, &src); + } +} + +//------------------------------------------------------------------------ +// SplashUnivariatePattern +//------------------------------------------------------------------------ + +SplashUnivariatePattern::SplashUnivariatePattern(SplashColorMode colorModeA, GfxState *stateA, GfxUnivariateShading *shadingA) { + Matrix ctm; + double xMin, yMin, xMax, yMax; + + shading = shadingA; + state = stateA; + colorMode = colorModeA; + + state->getCTM(&ctm); + ctm.invertTo(&ictm); + + // get the function domain + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + dt = t1 - t0; + + stateA->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + shadingA->setupCache(&ctm, xMin, yMin, xMax, yMax); +} + +SplashUnivariatePattern::~SplashUnivariatePattern() { +} + +GBool SplashUnivariatePattern::getColor(int x, int y, SplashColorPtr c) { + GfxColor gfxColor; + double xc, yc, t; + + ictm.transform(x, y, &xc, &yc); + if (! getParameter (xc, yc, &t)) + return gFalse; + + shading->getColor(t, &gfxColor); + convertGfxColor(c, colorMode, shading->getColorSpace(), &gfxColor); + return gTrue; +} + +GBool SplashUnivariatePattern::testPosition(int x, int y) { + double xc, yc, t; + + ictm.transform(x, y, &xc, &yc); + if (! getParameter (xc, yc, &t)) + return gFalse; + return (t0 < t1) ? (t > t0 && t < t1) : (t > t1 && t < t0); +} + + +//------------------------------------------------------------------------ +// SplashRadialPattern +//------------------------------------------------------------------------ +#define RADIAL_EPSILON (1. / 1024 / 1024) + +SplashRadialPattern::SplashRadialPattern(SplashColorMode colorModeA, GfxState *stateA, GfxRadialShading *shadingA): + SplashUnivariatePattern(colorModeA, stateA, shadingA) +{ + SplashColor defaultColor; + GfxColor srcColor; + + shadingA->getCoords(&x0, &y0, &r0, &dx, &dy, &dr); + dx -= x0; + dy -= y0; + dr -= r0; + a = dx*dx + dy*dy - dr*dr; + if (fabs(a) > RADIAL_EPSILON) + inva = 1.0 / a; + shadingA->getColorSpace()->getDefaultColor(&srcColor); + convertGfxColor(defaultColor, colorModeA, shadingA->getColorSpace(), &srcColor); +} + +SplashRadialPattern::~SplashRadialPattern() { +} + +GBool SplashRadialPattern::getParameter(double xs, double ys, double *t) { + double b, c, s0, s1; + + // We want to solve this system of equations: + // + // 1. (x - xc(s))^2 + (y -yc(s))^2 = rc(s)^2 + // 2. xc(s) = x0 + s * (x1 - xo) + // 3. yc(s) = y0 + s * (y1 - yo) + // 4. rc(s) = r0 + s * (r1 - ro) + // + // To simplify the system a little, we translate + // our coordinates to have the origin in (x0,y0) + + xs -= x0; + ys -= y0; + + // Then we have to solve the equation: + // A*s^2 - 2*B*s + C = 0 + // where + // A = dx^2 + dy^2 - dr^2 + // B = xs*dx + ys*dy + r0*dr + // C = xs^2 + ys^2 - r0^2 + + b = xs*dx + ys*dy + r0*dr; + c = xs*xs + ys*ys - r0*r0; + + if (fabs(a) <= RADIAL_EPSILON) { + // A is 0, thus the equation simplifies to: + // -2*B*s + C = 0 + // If B is 0, we can either have no solution or an indeterminate + // equation, thus we behave as if we had an invalid solution + if (fabs(b) <= RADIAL_EPSILON) + return gFalse; + + s0 = s1 = 0.5 * c / b; + } else { + double d; + + d = b*b - a*c; + if (d < 0) + return gFalse; + + d = sqrt (d); + s0 = b + d; + s1 = b - d; + + // If A < 0, one of the two solutions will have negative radius, + // thus it will be ignored. Otherwise we know that s1 <= s0 + // (because d >=0 implies b - d <= b + d), so if both are valid it + // will be the true solution. + s0 *= inva; + s1 *= inva; + } + + if (r0 + s0 * dr >= 0) { + if (0 <= s0 && s0 <= 1) { + *t = t0 + dt * s0; + return gTrue; + } else if (s0 < 0 && shading->getExtend0()) { + *t = t0; + return gTrue; + } else if (s0 > 1 && shading->getExtend1()) { + *t = t1; + return gTrue; + } + } + + if (r0 + s1 * dr >= 0) { + if (0 <= s1 && s1 <= 1) { + *t = t0 + dt * s1; + return gTrue; + } else if (s1 < 0 && shading->getExtend0()) { + *t = t0; + return gTrue; + } else if (s1 > 1 && shading->getExtend1()) { + *t = t1; + return gTrue; + } + } + + return gFalse; +} + +#undef RADIAL_EPSILON + +//------------------------------------------------------------------------ +// SplashAxialPattern +//------------------------------------------------------------------------ + +SplashAxialPattern::SplashAxialPattern(SplashColorMode colorModeA, GfxState *stateA, GfxAxialShading *shadingA): + SplashUnivariatePattern(colorModeA, stateA, shadingA) +{ + SplashColor defaultColor; + GfxColor srcColor; + + shadingA->getCoords(&x0, &y0, &x1, &y1); + dx = x1 - x0; + dy = y1 - y0; + mul = 1 / (dx * dx + dy * dy); + shadingA->getColorSpace()->getDefaultColor(&srcColor); + convertGfxColor(defaultColor, colorModeA, shadingA->getColorSpace(), &srcColor); +} + +SplashAxialPattern::~SplashAxialPattern() { +} + +GBool SplashAxialPattern::getParameter(double xc, double yc, double *t) { + double s; + + xc -= x0; + yc -= y0; + + s = (xc * dx + yc * dy) * mul; + if (0 <= s && s <= 1) { + *t = t0 + dt * s; + } else if (s < 0 && shading->getExtend0()) { + *t = t0; + } else if (s > 1 && shading->getExtend1()) { + *t = t1; + } else { + return gFalse; + } + + return gTrue; +} + +//------------------------------------------------------------------------ +// Type 3 font cache size parameters +#define type3FontCacheAssoc 8 +#define type3FontCacheMaxSets 8 +#define type3FontCacheSize (128*1024) + +//------------------------------------------------------------------------ +// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result. +static inline Guchar div255(int x) { + return (Guchar)((x + (x >> 8) + 0x80) >> 8); +} + +#if SPLASH_CMYK + +#include "GfxState_helpers.h" + +//------------------------------------------------------------------------- +// helper for Blend functions (convert CMYK to RGB, do blend, convert back) +//------------------------------------------------------------------------- + +// based in GfxState.cc + +static void cmykToRGB(SplashColorPtr cmyk, SplashColor rgb) { + double c, m, y, k, c1, m1, y1, k1, r, g, b; + + c = colToDbl(byteToCol(cmyk[0])); + m = colToDbl(byteToCol(cmyk[1])); + y = colToDbl(byteToCol(cmyk[2])); + k = colToDbl(byteToCol(cmyk[3])); + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); + rgb[0] = colToByte(clip01(dblToCol(r))); + rgb[1] = colToByte(clip01(dblToCol(g))); + rgb[2] = colToByte(clip01(dblToCol(b))); +} + +static void rgbToCMYK(SplashColor rgb, SplashColorPtr cmyk) { + GfxColorComp c, m, y, k; + + c = clip01(gfxColorComp1 - byteToCol(rgb[0])); + m = clip01(gfxColorComp1 - byteToCol(rgb[1])); + y = clip01(gfxColorComp1 - byteToCol(rgb[2])); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk[0] = colToByte(c - k); + cmyk[1] = colToByte(m - k); + cmyk[2] = colToByte(y - k); + cmyk[3] = colToByte(k); +} + +#endif + +//------------------------------------------------------------------------ +// Blend functions +//------------------------------------------------------------------------ + +static void splashOutBlendMultiply(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = (rgbDest[i] * rgbSrc[i]) / 255; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = (dest[i] * src[i]) / 255; + } + } +} + +static void splashOutBlendScreen(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbDest[i] + rgbSrc[i] - (rgbDest[i] * rgbSrc[i]) / 255; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] + src[i] - (dest[i] * src[i]) / 255; + } + } +} + +static void splashOutBlendOverlay(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbDest[i] < 0x80 + ? (rgbSrc[i] * 2 * rgbDest[i]) / 255 + : 255 - 2 * ((255 - rgbSrc[i]) * (255 - rgbDest[i])) / 255; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < 0x80 + ? (src[i] * 2 * dest[i]) / 255 + : 255 - 2 * ((255 - src[i]) * (255 - dest[i])) / 255; + } + } +} + +static void splashOutBlendDarken(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbDest[i] < rgbSrc[i] ? rgbDest[i] : rgbSrc[i]; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < src[i] ? dest[i] : src[i]; + } + } +} + +static void splashOutBlendLighten(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbDest[i] > rgbSrc[i] ? rgbDest[i] : rgbSrc[i]; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] > src[i] ? dest[i] : src[i]; + } + } +} + +static void splashOutBlendColorDodge(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int i, x; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + if (rgbSrc[i] == 255) { + rgbBlend[i] = 255; + } else { + x = (rgbDest[i] * 255) / (255 - rgbSrc[i]); + rgbBlend[i] = x <= 255 ? x : 255; + } + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + if (src[i] == 255) { + blend[i] = 255; + } else { + x = (dest[i] * 255) / (255 - src[i]); + blend[i] = x <= 255 ? x : 255; + } + } + } +} + +static void splashOutBlendColorBurn(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i, x; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + if (rgbSrc[i] == 0) { + rgbBlend[i] = 0; + } else { + x = ((255 - rgbDest[i]) * 255) / rgbSrc[i]; + rgbBlend[i] = x <= 255 ? 255 - x : 0; + } + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + if (src[i] == 0) { + blend[i] = 0; + } else { + x = ((255 - dest[i]) * 255) / src[i]; + blend[i] = x <= 255 ? 255 - x : 0; + } + } + } +} + +static void splashOutBlendHardLight(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbSrc[i] < 0x80 + ? (rgbDest[i] * 2 * rgbSrc[i]) / 255 + : 255 - 2 * ((255 - rgbDest[i]) * (255 - rgbSrc[i])) / 255; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = src[i] < 0x80 + ? (dest[i] * 2 * src[i]) / 255 + : 255 - 2 * ((255 - dest[i]) * (255 - src[i])) / 255; + } + } +} + +static void splashOutBlendSoftLight(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i, x; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + if (rgbSrc[i] < 0x80) { + rgbBlend[i] = rgbDest[i] - (255 - 2 * rgbSrc[i]) * rgbDest[i] * (255 - rgbDest[i]) / (255 * 255); + } else { + if (rgbDest[i] < 0x40) { + x = (((((16 * rgbDest[i] - 12 * 255) * rgbDest[i]) / 255) + 4 * 255) * rgbDest[i]) / 255; + } else { + x = (int)sqrt(255.0 * rgbDest[i]); + } + rgbBlend[i] = rgbDest[i] + (2 * rgbSrc[i] - 255) * (x - rgbDest[i]) / 255; + } + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + if (src[i] < 0x80) { + blend[i] = dest[i] - (255 - 2 * src[i]) * dest[i] * (255 - dest[i]) / (255 * 255); + } else { + if (dest[i] < 0x40) { + x = (((((16 * dest[i] - 12 * 255) * dest[i]) / 255) + 4 * 255) * dest[i]) / 255; + } else { + x = (int)sqrt(255.0 * dest[i]); + } + blend[i] = dest[i] + (2 * src[i] - 255) * (x - dest[i]) / 255; + } + } + } +} + +static void splashOutBlendDifference(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbDest[i] < rgbSrc[i] ? rgbSrc[i] - rgbDest[i] : rgbDest[i] - rgbSrc[i]; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < src[i] ? src[i] - dest[i] : dest[i] - src[i]; + } + } +} + +static void splashOutBlendExclusion(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8) { + SplashColor rgbSrc; + SplashColor rgbDest; + SplashColor rgbBlend; + cmykToRGB(src, rgbSrc); + cmykToRGB(dest, rgbDest); + for (i = 0; i < 3; ++i) { + rgbBlend[i] = rgbDest[i] + rgbSrc[i] - (2 * rgbDest[i] * rgbSrc[i]) / 255; + } + rgbToCMYK(rgbBlend, blend); + } else +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] + src[i] - (2 * dest[i] * src[i]) / 255; + } + } +} + +static int getLum(int r, int g, int b) { + return (int)(0.3 * r + 0.59 * g + 0.11 * b); +} + +static int getSat(int r, int g, int b) { + int rgbMin, rgbMax; + + rgbMin = rgbMax = r; + if (g < rgbMin) { + rgbMin = g; + } else if (g > rgbMax) { + rgbMax = g; + } + if (b < rgbMin) { + rgbMin = b; + } else if (b > rgbMax) { + rgbMax = b; + } + return rgbMax - rgbMin; +} + +static void clipColor(int rIn, int gIn, int bIn, + Guchar *rOut, Guchar *gOut, Guchar *bOut) { + int lum, rgbMin, rgbMax; + + lum = getLum(rIn, gIn, bIn); + rgbMin = rgbMax = rIn; + if (gIn < rgbMin) { + rgbMin = gIn; + } else if (gIn > rgbMax) { + rgbMax = gIn; + } + if (bIn < rgbMin) { + rgbMin = bIn; + } else if (bIn > rgbMax) { + rgbMax = bIn; + } + if (rgbMin < 0) { + *rOut = (Guchar)(lum + ((rIn - lum) * lum) / (lum - rgbMin)); + *gOut = (Guchar)(lum + ((gIn - lum) * lum) / (lum - rgbMin)); + *bOut = (Guchar)(lum + ((bIn - lum) * lum) / (lum - rgbMin)); + } else if (rgbMax > 255) { + *rOut = (Guchar)(lum + ((rIn - lum) * (255 - lum)) / (rgbMax - lum)); + *gOut = (Guchar)(lum + ((gIn - lum) * (255 - lum)) / (rgbMax - lum)); + *bOut = (Guchar)(lum + ((bIn - lum) * (255 - lum)) / (rgbMax - lum)); + } else { + *rOut = rIn; + *gOut = gIn; + *bOut = bIn; + } +} + +static void setLum(Guchar rIn, Guchar gIn, Guchar bIn, int lum, + Guchar *rOut, Guchar *gOut, Guchar *bOut) { + int d; + + d = lum - getLum(rIn, gIn, bIn); + clipColor(rIn + d, gIn + d, bIn + d, rOut, gOut, bOut); +} + +static void setSat(Guchar rIn, Guchar gIn, Guchar bIn, int sat, + Guchar *rOut, Guchar *gOut, Guchar *bOut) { + int rgbMin, rgbMid, rgbMax; + Guchar *minOut, *midOut, *maxOut; + + if (rIn < gIn) { + rgbMin = rIn; minOut = rOut; + rgbMid = gIn; midOut = gOut; + } else { + rgbMin = gIn; minOut = gOut; + rgbMid = rIn; midOut = rOut; + } + if (bIn > rgbMid) { + rgbMax = bIn; maxOut = bOut; + } else if (bIn > rgbMin) { + rgbMax = rgbMid; maxOut = midOut; + rgbMid = bIn; midOut = bOut; + } else { + rgbMax = rgbMid; maxOut = midOut; + rgbMid = rgbMin; midOut = minOut; + rgbMin = bIn; minOut = bOut; + } + if (rgbMax > rgbMin) { + *midOut = (Guchar)((rgbMid - rgbMin) * sat) / (rgbMax - rgbMin); + *maxOut = (Guchar)sat; + } else { + *midOut = *maxOut = 0; + } + *minOut = 0; +} + +static void splashOutBlendHue(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + Guchar r0, g0, b0; +#ifdef SPLASH_CMYK + Guchar r1, g1, b1; + int i; + SplashColor src2, dest2; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeXBGR8: + src[3] = 255; + case splashModeRGB8: + case splashModeBGR8: + setSat(src[0], src[1], src[2], getSat(dest[0], dest[1], dest[2]), + &r0, &g0, &b0); + setLum(r0, g0, b0, getLum(dest[0], dest[1], dest[2]), + &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < 4; i++) { + // convert to additive + src2[i] = 0xff - src[i]; + dest2[i] = 0xff - dest[i]; + } + // NB: inputs have already been converted to additive mode + setSat(src2[0], src2[1], src2[2], getSat(dest2[0], dest2[1], dest2[2]), + &r0, &g0, &b0); + setLum(r0, g0, b0, getLum(dest2[0], dest2[1], dest2[2]), + &r1, &g1, &b1); + blend[0] = r1; + blend[1] = g1; + blend[2] = b1; + blend[3] = dest2[3]; + for (i = 0; i < 4; i++) { + // convert back to subtractive + blend[i] = 0xff - blend[i]; + } + break; +#endif + } +} + +static void splashOutBlendSaturation(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + Guchar r0, g0, b0; +#ifdef SPLASH_CMYK + Guchar r1, g1, b1; + int i; + SplashColor src2, dest2; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeXBGR8: + src[3] = 255; + case splashModeRGB8: + case splashModeBGR8: + setSat(dest[0], dest[1], dest[2], getSat(src[0], src[1], src[2]), + &r0, &g0, &b0); + setLum(r0, g0, b0, getLum(dest[0], dest[1], dest[2]), + &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < 4; i++) { + // convert to additive + src2[i] = 0xff - src[i]; + dest2[i] = 0xff - dest[i]; + } + setSat(dest2[0], dest2[1], dest2[2], getSat(src2[0], src2[1], src2[2]), + &r0, &g0, &b0); + setLum(r0, g0, b0, getLum(dest2[0], dest2[1], dest2[2]), + &r1, &g1, &b1); + blend[0] = r1; + blend[1] = g1; + blend[2] = b1; + blend[3] = dest2[3]; + for (i = 0; i < 4; i++) { + // convert back to subtractive + blend[i] = 0xff - blend[i]; + } + break; +#endif + } +} + +static void splashOutBlendColor(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { +#if SPLASH_CMYK + Guchar r, g, b; + int i; + SplashColor src2, dest2; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeXBGR8: + src[3] = 255; + case splashModeRGB8: + case splashModeBGR8: + setLum(src[0], src[1], src[2], getLum(dest[0], dest[1], dest[2]), + &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < 4; i++) { + // convert to additive + src2[i] = 0xff - src[i]; + dest2[i] = 0xff - dest[i]; + } + setLum(src2[0], src2[1], src2[2], getLum(dest2[0], dest2[1], dest2[2]), + &r, &g, &b); + blend[0] = r; + blend[1] = g; + blend[2] = b; + blend[3] = dest2[3]; + for (i = 0; i < 4; i++) { + // convert back to subtractive + blend[i] = 0xff - blend[i]; + } + break; +#endif + } +} + +static void splashOutBlendLuminosity(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { +#if SPLASH_CMYK + Guchar r, g, b; + int i; + SplashColor src2, dest2; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeXBGR8: + src[3] = 255; + case splashModeRGB8: + case splashModeBGR8: + setLum(dest[0], dest[1], dest[2], getLum(src[0], src[1], src[2]), + &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < 4; i++) { + // convert to additive + src2[i] = 0xff - src[i]; + dest2[i] = 0xff - dest[i]; + } + setLum(dest2[0], dest2[1], dest2[2], getLum(src2[0], src2[1], src2[2]), + &r, &g, &b); + blend[0] = r; + blend[1] = g; + blend[2] = b; + blend[3] = src2[3]; + for (i = 0; i < 4; i++) { + // convert back to subtractive + blend[i] = 0xff - blend[i]; + } + break; +#endif + } +} + +// NB: This must match the GfxBlendMode enum defined in GfxState.h. +static const SplashBlendFunc splashOutBlendFuncs[] = { + NULL, + &splashOutBlendMultiply, + &splashOutBlendScreen, + &splashOutBlendOverlay, + &splashOutBlendDarken, + &splashOutBlendLighten, + &splashOutBlendColorDodge, + &splashOutBlendColorBurn, + &splashOutBlendHardLight, + &splashOutBlendSoftLight, + &splashOutBlendDifference, + &splashOutBlendExclusion, + &splashOutBlendHue, + &splashOutBlendSaturation, + &splashOutBlendColor, + &splashOutBlendLuminosity +}; + +//------------------------------------------------------------------------ +// SplashOutFontFileID +//------------------------------------------------------------------------ + +class SplashOutFontFileID: public SplashFontFileID { +public: + + SplashOutFontFileID(Ref *rA) { r = *rA; } + + ~SplashOutFontFileID() {} + + GBool matches(SplashFontFileID *id) { + return ((SplashOutFontFileID *)id)->r.num == r.num && + ((SplashOutFontFileID *)id)->r.gen == r.gen; + } + +private: + + Ref r; +}; + +//------------------------------------------------------------------------ +// T3FontCache +//------------------------------------------------------------------------ + +struct T3FontCacheTag { + Gushort code; + Gushort mru; // valid bit (0x8000) and MRU index +}; + +class T3FontCache { +public: + + T3FontCache(Ref *fontID, double m11A, double m12A, + double m21A, double m22A, + int glyphXA, int glyphYA, int glyphWA, int glyphHA, + GBool aa, GBool validBBoxA); + ~T3FontCache(); + GBool matches(Ref *idA, double m11A, double m12A, + double m21A, double m22A) + { return fontID.num == idA->num && fontID.gen == idA->gen && + m11 == m11A && m12 == m12A && m21 == m21A && m22 == m22A; } + + Ref fontID; // PDF font ID + double m11, m12, m21, m22; // transform matrix + int glyphX, glyphY; // pixel offset of glyph bitmaps + int glyphW, glyphH; // size of glyph bitmaps, in pixels + GBool validBBox; // false if the bbox was [0 0 0 0] + int glyphSize; // size of glyph bitmaps, in bytes + int cacheSets; // number of sets in cache + int cacheAssoc; // cache associativity (glyphs per set) + Guchar *cacheData; // glyph pixmap cache + T3FontCacheTag *cacheTags; // cache tags, i.e., char codes +}; + +T3FontCache::T3FontCache(Ref *fontIDA, double m11A, double m12A, + double m21A, double m22A, + int glyphXA, int glyphYA, int glyphWA, int glyphHA, + GBool validBBoxA, GBool aa) { + int i; + + fontID = *fontIDA; + m11 = m11A; + m12 = m12A; + m21 = m21A; + m22 = m22A; + glyphX = glyphXA; + glyphY = glyphYA; + glyphW = glyphWA; + glyphH = glyphHA; + validBBox = validBBoxA; + // sanity check for excessively large glyphs (which most likely + // indicate an incorrect BBox) + i = glyphW * glyphH; + if (i > 100000 || glyphW > INT_MAX / glyphH || glyphW <= 0 || glyphH <= 0) { + glyphW = glyphH = 100; + validBBox = gFalse; + } + if (aa) { + glyphSize = glyphW * glyphH; + } else { + glyphSize = ((glyphW + 7) >> 3) * glyphH; + } + cacheAssoc = type3FontCacheAssoc; + for (cacheSets = type3FontCacheMaxSets; + cacheSets > 1 && + cacheSets * cacheAssoc * glyphSize > type3FontCacheSize; + cacheSets >>= 1) ; + if (glyphSize < 10485760 / cacheAssoc / cacheSets) { + cacheData = (Guchar *)gmallocn_checkoverflow(cacheSets * cacheAssoc, glyphSize); + } else { + error(errSyntaxWarning, -1, "Not creating cacheData for T3FontCache, it asked for too much memory.\n" + " This could teoretically result in wrong rendering,\n" + " but most probably the document is bogus.\n" + " Please report a bug if you think the rendering may be wrong because of this."); + cacheData = NULL; + } + if (cacheData != NULL) + { + cacheTags = (T3FontCacheTag *)gmallocn(cacheSets * cacheAssoc, + sizeof(T3FontCacheTag)); + for (i = 0; i < cacheSets * cacheAssoc; ++i) { + cacheTags[i].mru = i & (cacheAssoc - 1); + } + } + else + { + cacheTags = NULL; + } +} + +T3FontCache::~T3FontCache() { + gfree(cacheData); + gfree(cacheTags); +} + +struct T3GlyphStack { + Gushort code; // character code + + //----- cache info + T3FontCache *cache; // font cache for the current font + T3FontCacheTag *cacheTag; // pointer to cache tag for the glyph + Guchar *cacheData; // pointer to cache data for the glyph + + //----- saved state + SplashBitmap *origBitmap; + Splash *origSplash; + double origCTM4, origCTM5; + + T3GlyphStack *next; // next object on stack +}; + +//------------------------------------------------------------------------ +// SplashTransparencyGroup +//------------------------------------------------------------------------ + +struct SplashTransparencyGroup { + int tx, ty; // translation coordinates + SplashBitmap *tBitmap; // bitmap for transparency group + GfxColorSpace *blendingColorSpace; + GBool isolated; + + //----- for knockout + SplashBitmap *shape; + GBool knockout; + SplashCoord knockoutOpacity; + + //----- saved state + SplashBitmap *origBitmap; + Splash *origSplash; + + SplashTransparencyGroup *next; +}; + +//------------------------------------------------------------------------ +// SplashOutputDev +//------------------------------------------------------------------------ + +SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, + int bitmapRowPadA, + GBool reverseVideoA, + SplashColorPtr paperColorA, + GBool bitmapTopDownA, + GBool allowAntialiasA) { + colorMode = colorModeA; + bitmapRowPad = bitmapRowPadA; + bitmapTopDown = bitmapTopDownA; + bitmapUpsideDown = gFalse; + allowAntialias = allowAntialiasA; + vectorAntialias = allowAntialias && + globalParams->getVectorAntialias() && + colorMode != splashModeMono1; + enableFreeTypeHinting = gFalse; + enableSlightHinting = gFalse; + setupScreenParams(72.0, 72.0); + reverseVideo = reverseVideoA; + if (paperColorA != NULL) { + splashColorCopy(paperColor, paperColorA); + } else { + splashClearColor(paperColor); + } + skipHorizText = gFalse; + skipRotatedText = gFalse; + keepAlphaChannel = paperColorA == NULL; + + doc = NULL; + + bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + splash = new Splash(bitmap, vectorAntialias, &screenParams); + splash->setMinLineWidth(globalParams->getMinLineWidth()); + splash->clear(paperColor, 0); + + fontEngine = NULL; + + nT3Fonts = 0; + t3GlyphStack = NULL; + + font = NULL; + needFontUpdate = gFalse; + textClipPath = NULL; + transpGroupStack = NULL; + nestCount = 0; +} + +void SplashOutputDev::setupScreenParams(double hDPI, double vDPI) { + screenParams.size = globalParams->getScreenSize(); + screenParams.dotRadius = globalParams->getScreenDotRadius(); + screenParams.gamma = (SplashCoord)globalParams->getScreenGamma(); + screenParams.blackThreshold = + (SplashCoord)globalParams->getScreenBlackThreshold(); + screenParams.whiteThreshold = + (SplashCoord)globalParams->getScreenWhiteThreshold(); + switch (globalParams->getScreenType()) { + case screenDispersed: + screenParams.type = splashScreenDispersed; + if (screenParams.size < 0) { + screenParams.size = 4; + } + break; + case screenClustered: + screenParams.type = splashScreenClustered; + if (screenParams.size < 0) { + screenParams.size = 10; + } + break; + case screenStochasticClustered: + screenParams.type = splashScreenStochasticClustered; + if (screenParams.size < 0) { + screenParams.size = 64; + } + if (screenParams.dotRadius < 0) { + screenParams.dotRadius = 2; + } + break; + case screenUnset: + default: + // use clustered dithering for resolution >= 300 dpi + // (compare to 299.9 to avoid floating point issues) + if (hDPI > 299.9 && vDPI > 299.9) { + screenParams.type = splashScreenStochasticClustered; + if (screenParams.size < 0) { + screenParams.size = 64; + } + if (screenParams.dotRadius < 0) { + screenParams.dotRadius = 2; + } + } else { + screenParams.type = splashScreenDispersed; + if (screenParams.size < 0) { + screenParams.size = 4; + } + } + } +} + +SplashOutputDev::~SplashOutputDev() { + int i; + + for (i = 0; i < nT3Fonts; ++i) { + delete t3FontCache[i]; + } + if (fontEngine) { + delete fontEngine; + } + if (splash) { + delete splash; + } + if (bitmap) { + delete bitmap; + } +} + +void SplashOutputDev::startDoc(PDFDoc *docA) { + int i; + + doc = docA; + if (fontEngine) { + delete fontEngine; + } + fontEngine = new SplashFontEngine( +#if HAVE_T1LIB_H + globalParams->getEnableT1lib(), +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + globalParams->getEnableFreeType(), + enableFreeTypeHinting, + enableSlightHinting, +#endif + allowAntialias && + globalParams->getAntialias() && + colorMode != splashModeMono1); + for (i = 0; i < nT3Fonts; ++i) { + delete t3FontCache[i]; + } + nT3Fonts = 0; +} + +void SplashOutputDev::startPage(int pageNum, GfxState *state) { + int w, h; + double *ctm; + SplashCoord mat[6]; + SplashColor color; + + if (state) { + setupScreenParams(state->getHDPI(), state->getVDPI()); + w = (int)(state->getPageWidth() + 0.5); + if (w <= 0) { + w = 1; + } + h = (int)(state->getPageHeight() + 0.5); + if (h <= 0) { + h = 1; + } + } else { + w = h = 1; + } + if (splash) { + delete splash; + splash = NULL; + } + if (!bitmap || w != bitmap->getWidth() || h != bitmap->getHeight()) { + if (bitmap) { + delete bitmap; + bitmap = NULL; + } + bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + } + splash = new Splash(bitmap, vectorAntialias, &screenParams); + splash->setMinLineWidth(globalParams->getMinLineWidth()); + if (state) { + ctm = state->getCTM(); + mat[0] = (SplashCoord)ctm[0]; + mat[1] = (SplashCoord)ctm[1]; + mat[2] = (SplashCoord)ctm[2]; + mat[3] = (SplashCoord)ctm[3]; + mat[4] = (SplashCoord)ctm[4]; + mat[5] = (SplashCoord)ctm[5]; + splash->setMatrix(mat); + } + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + color[0] = 0; + break; + case splashModeXBGR8: + color[3] = 255; + case splashModeRGB8: + case splashModeBGR8: + color[0] = color[1] = color[2] = 0; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + color[0] = color[1] = color[2] = color[3] = 0; + break; +#endif + } + splash->setStrokePattern(new SplashSolidColor(color)); + splash->setFillPattern(new SplashSolidColor(color)); + splash->setLineCap(splashLineCapButt); + splash->setLineJoin(splashLineJoinMiter); + splash->setLineDash(NULL, 0, 0); + splash->setMiterLimit(10); + splash->setFlatness(1); + // the SA parameter supposedly defaults to false, but Acrobat + // apparently hardwires it to true + splash->setStrokeAdjust(globalParams->getStrokeAdjust()); + splash->clear(paperColor, 0); +} + +void SplashOutputDev::endPage() { + if (colorMode != splashModeMono1 && !keepAlphaChannel) { + splash->compositeBackground(paperColor); + } +} + +void SplashOutputDev::saveState(GfxState *state) { + splash->saveState(); +} + +void SplashOutputDev::restoreState(GfxState *state) { + splash->restoreState(); + needFontUpdate = gTrue; +} + +void SplashOutputDev::updateAll(GfxState *state) { + updateLineDash(state); + updateLineJoin(state); + updateLineCap(state); + updateLineWidth(state); + updateFlatness(state); + updateMiterLimit(state); + updateStrokeAdjust(state); + updateFillColor(state); + updateStrokeColor(state); + needFontUpdate = gTrue; +} + +void SplashOutputDev::updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, + double m31, double m32) { + double *ctm; + SplashCoord mat[6]; + + ctm = state->getCTM(); + mat[0] = (SplashCoord)ctm[0]; + mat[1] = (SplashCoord)ctm[1]; + mat[2] = (SplashCoord)ctm[2]; + mat[3] = (SplashCoord)ctm[3]; + mat[4] = (SplashCoord)ctm[4]; + mat[5] = (SplashCoord)ctm[5]; + splash->setMatrix(mat); +} + +void SplashOutputDev::updateLineDash(GfxState *state) { + double *dashPattern; + int dashLength; + double dashStart; + SplashCoord dash[20]; + int i; + + state->getLineDash(&dashPattern, &dashLength, &dashStart); + if (dashLength > 20) { + dashLength = 20; + } + for (i = 0; i < dashLength; ++i) { + dash[i] = (SplashCoord)dashPattern[i]; + if (dash[i] < 0) { + dash[i] = 0; + } + } + splash->setLineDash(dash, dashLength, (SplashCoord)dashStart); +} + +void SplashOutputDev::updateFlatness(GfxState *state) { +#if 0 // Acrobat ignores the flatness setting, and always renders curves + // with a fairly small flatness value + splash->setFlatness(state->getFlatness()); +#endif +} + +void SplashOutputDev::updateLineJoin(GfxState *state) { + splash->setLineJoin(state->getLineJoin()); +} + +void SplashOutputDev::updateLineCap(GfxState *state) { + splash->setLineCap(state->getLineCap()); +} + +void SplashOutputDev::updateMiterLimit(GfxState *state) { + splash->setMiterLimit(state->getMiterLimit()); +} + +void SplashOutputDev::updateLineWidth(GfxState *state) { + splash->setLineWidth(state->getLineWidth()); +} + +void SplashOutputDev::updateStrokeAdjust(GfxState * /*state*/) { +#if 0 // the SA parameter supposedly defaults to false, but Acrobat + // apparently hardwires it to true + splash->setStrokeAdjust(state->getStrokeAdjust()); +#endif +} + +void SplashOutputDev::updateFillColor(GfxState *state) { + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + state->getFillGray(&gray); + splash->setFillPattern(getColor(gray)); + break; + case splashModeXBGR8: + case splashModeRGB8: + case splashModeBGR8: + state->getFillRGB(&rgb); + splash->setFillPattern(getColor(&rgb)); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + state->getFillCMYK(&cmyk); + splash->setFillPattern(getColor(&cmyk)); + break; +#endif + } +} + +void SplashOutputDev::updateStrokeColor(GfxState *state) { + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + state->getStrokeGray(&gray); + splash->setStrokePattern(getColor(gray)); + break; + case splashModeXBGR8: + case splashModeRGB8: + case splashModeBGR8: + state->getStrokeRGB(&rgb); + splash->setStrokePattern(getColor(&rgb)); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + state->getStrokeCMYK(&cmyk); + splash->setStrokePattern(getColor(&cmyk)); + break; +#endif + } +} + +SplashPattern *SplashOutputDev::getColor(GfxGray gray) { + SplashColor color; + + if (reverseVideo) { + gray = gfxColorComp1 - gray; + } + color[0] = colToByte(gray); + return new SplashSolidColor(color); +} + +SplashPattern *SplashOutputDev::getColor(GfxRGB *rgb) { + GfxColorComp r, g, b; + SplashColor color; + + if (reverseVideo) { + r = gfxColorComp1 - rgb->r; + g = gfxColorComp1 - rgb->g; + b = gfxColorComp1 - rgb->b; + } else { + r = rgb->r; + g = rgb->g; + b = rgb->b; + } + color[0] = colToByte(r); + color[1] = colToByte(g); + color[2] = colToByte(b); + if (colorMode == splashModeXBGR8) color[3] = 255; + return new SplashSolidColor(color); +} + +#if SPLASH_CMYK +SplashPattern *SplashOutputDev::getColor(GfxCMYK *cmyk) { + SplashColor color; + + color[0] = colToByte(cmyk->c); + color[1] = colToByte(cmyk->m); + color[2] = colToByte(cmyk->y); + color[3] = colToByte(cmyk->k); + return new SplashSolidColor(color); +} +#endif + +void SplashOutputDev::setOverprintMask(GfxColorSpace *colorSpace, + GBool overprintFlag, + int overprintMode, + GfxColor *singleColor, + GBool grayIndexed) { +#if SPLASH_CMYK + Guint mask; + GfxCMYK cmyk; + GBool additive = gFalse; + int i; + + if (colorSpace->getMode() == csIndexed) { + setOverprintMask(((GfxIndexedColorSpace *)colorSpace)->getBase(), + overprintFlag, + overprintMode, + singleColor, + grayIndexed); + return; + } + if (overprintFlag && globalParams->getOverprintPreview()) { + mask = colorSpace->getOverprintMask(); + if (singleColor && overprintMode && + colorSpace->getMode() == csDeviceCMYK) { + colorSpace->getCMYK(singleColor, &cmyk); + if (cmyk.c == 0) { + mask &= ~1; + } + if (cmyk.m == 0) { + mask &= ~2; + } + if (cmyk.y == 0) { + mask &= ~4; + } + if (cmyk.k == 0) { + mask &= ~8; + } + } + if (grayIndexed) { + mask &= ~7; + } else if (colorSpace->getMode() == csSeparation) { + GfxSeparationColorSpace *deviceSep = (GfxSeparationColorSpace *)colorSpace; + additive = deviceSep->getName()->cmp("All") != 0 && mask == 0x0f && !deviceSep->isNonMarking(); + } else if (colorSpace->getMode() == csDeviceN) { + GfxDeviceNColorSpace *deviceNCS = (GfxDeviceNColorSpace *)colorSpace; + additive = mask == 0x0f && !deviceNCS->isNonMarking(); + for (i = 0; i < deviceNCS->getNComps() && additive; i++) { + if (deviceNCS->getColorantName(i)->cmp("Cyan") == 0) { + additive = gFalse; + } else if (deviceNCS->getColorantName(i)->cmp("Magenta") == 0) { + additive = gFalse; + } else if (deviceNCS->getColorantName(i)->cmp("Yellow") == 0) { + additive = gFalse; + } else if (deviceNCS->getColorantName(i)->cmp("Black") == 0) { + additive = gFalse; + } + } + } + } else { + mask = 0xffffffff; + } + splash->setOverprintMask(mask, additive); +#endif +} + +void SplashOutputDev::updateBlendMode(GfxState *state) { + splash->setBlendFunc(splashOutBlendFuncs[state->getBlendMode()]); +} + +void SplashOutputDev::updateFillOpacity(GfxState *state) { + splash->setFillAlpha((SplashCoord)state->getFillOpacity()); + if (transpGroupStack != NULL && (SplashCoord)state->getFillOpacity() < transpGroupStack->knockoutOpacity) { + transpGroupStack->knockoutOpacity = (SplashCoord)state->getFillOpacity(); + } +} + +void SplashOutputDev::updateStrokeOpacity(GfxState *state) { + splash->setStrokeAlpha((SplashCoord)state->getStrokeOpacity()); + if (transpGroupStack != NULL && (SplashCoord)state->getStrokeOpacity() < transpGroupStack->knockoutOpacity) { + transpGroupStack->knockoutOpacity = (SplashCoord)state->getStrokeOpacity(); + } +} + +void SplashOutputDev::updateFillOverprint(GfxState *state) { + splash->setFillOverprint(state->getFillOverprint()); +} + +void SplashOutputDev::updateStrokeOverprint(GfxState *state) { + splash->setStrokeOverprint(state->getStrokeOverprint()); +} + +void SplashOutputDev::updateOverprintMode(GfxState *state) { + splash->setOverprintMode(state->getOverprintMode()); +} + +void SplashOutputDev::updateTransfer(GfxState *state) { + Function **transfer; + Guchar red[256], green[256], blue[256], gray[256]; + double x, y; + int i; + + transfer = state->getTransfer(); + if (transfer[0] && + transfer[0]->getInputSize() == 1 && + transfer[0]->getOutputSize() == 1) { + if (transfer[1] && + transfer[1]->getInputSize() == 1 && + transfer[1]->getOutputSize() == 1 && + transfer[2] && + transfer[2]->getInputSize() == 1 && + transfer[2]->getOutputSize() == 1 && + transfer[3] && + transfer[3]->getInputSize() == 1 && + transfer[3]->getOutputSize() == 1) { + for (i = 0; i < 256; ++i) { + x = i / 255.0; + transfer[0]->transform(&x, &y); + red[i] = (Guchar)(y * 255.0 + 0.5); + transfer[1]->transform(&x, &y); + green[i] = (Guchar)(y * 255.0 + 0.5); + transfer[2]->transform(&x, &y); + blue[i] = (Guchar)(y * 255.0 + 0.5); + transfer[3]->transform(&x, &y); + gray[i] = (Guchar)(y * 255.0 + 0.5); + } + } else { + for (i = 0; i < 256; ++i) { + x = i / 255.0; + transfer[0]->transform(&x, &y); + red[i] = green[i] = blue[i] = gray[i] = (Guchar)(y * 255.0 + 0.5); + } + } + } else { + for (i = 0; i < 256; ++i) { + red[i] = green[i] = blue[i] = gray[i] = (Guchar)i; + } + } + splash->setTransfer(red, green, blue, gray); +} + +void SplashOutputDev::updateFont(GfxState * /*state*/) { + needFontUpdate = gTrue; +} + +void SplashOutputDev::doUpdateFont(GfxState *state) { + GfxFont *gfxFont; + GfxFontLoc *fontLoc; + GfxFontType fontType; + SplashOutFontFileID *id; + SplashFontFile *fontFile; + SplashFontSrc *fontsrc = NULL; + FoFiTrueType *ff; + Object refObj, strObj; + GooString *fileName; + char *tmpBuf; + int tmpBufLen; + int *codeToGID; + double *textMat; + double m11, m12, m21, m22, fontSize; + int faceIndex = 0; + SplashCoord mat[4]; + int n, i; + GBool recreateFont = gFalse; + GBool doAdjustFontMatrix = gFalse; + + needFontUpdate = gFalse; + font = NULL; + fileName = NULL; + tmpBuf = NULL; + fontLoc = NULL; + + if (!(gfxFont = state->getFont())) { + goto err1; + } + fontType = gfxFont->getType(); + if (fontType == fontType3) { + goto err1; + } + + // sanity-check the font size - skip anything larger than 10 inches + // (this avoids problems allocating memory for the font cache) + if (state->getTransformedFontSize() + > 10 * (state->getHDPI() + state->getVDPI())) { + goto err1; + } + + // check the font file cache + id = new SplashOutFontFileID(gfxFont->getID()); + if ((fontFile = fontEngine->getFontFile(id))) { + delete id; + + } else { + + if (!(fontLoc = gfxFont->locateFont(doc->getXRef(), gFalse))) { + error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + + // embedded font + if (fontLoc->locType == gfxFontLocEmbedded) { + // if there is an embedded font, read it to memory + tmpBuf = gfxFont->readEmbFontFile(doc->getXRef(), &tmpBufLen); + if (! tmpBuf) + goto err2; + + // external font + } else { // gfxFontLocExternal + fileName = fontLoc->path; + fontType = fontLoc->fontType; + doAdjustFontMatrix = gTrue; + } + + fontsrc = new SplashFontSrc; + if (fileName) + fontsrc->setFile(fileName, gFalse); + else + fontsrc->setBuf(tmpBuf, tmpBufLen, gTrue); + + // load the font file + switch (fontType) { + case fontType1: + if (!(fontFile = fontEngine->loadType1Font( + id, + fontsrc, + (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontType1C: + if (!(fontFile = fontEngine->loadType1CFont( + id, + fontsrc, + (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontType1COT: + if (!(fontFile = fontEngine->loadOpenTypeT1CFont( + id, + fontsrc, + (const char **)((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontTrueType: + case fontTrueTypeOT: + if (fileName) + ff = FoFiTrueType::load(fileName->getCString()); + else + ff = FoFiTrueType::make(tmpBuf, tmpBufLen); + if (ff) { + codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff); + n = 256; + delete ff; + // if we're substituting for a non-TrueType font, we need to mark + // all notdef codes as "do not draw" (rather than drawing TrueType + // notdef glyphs) + if (gfxFont->getType() != fontTrueType && + gfxFont->getType() != fontTrueTypeOT) { + for (i = 0; i < 256; ++i) { + if (codeToGID[i] == 0) { + codeToGID[i] = -1; + } + } + } + } else { + codeToGID = NULL; + n = 0; + } + if (!(fontFile = fontEngine->loadTrueTypeFont( + id, + fontsrc, + codeToGID, n))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType0: + case fontCIDType0C: + if (!(fontFile = fontEngine->loadCIDFont( + id, + fontsrc))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType0COT: + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + codeToGID = (int *)gmallocn(n, sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(int)); + } else { + codeToGID = NULL; + n = 0; + } + if (!(fontFile = fontEngine->loadOpenTypeCFFFont( + id, + fontsrc, + codeToGID, n))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType2: + case fontCIDType2OT: + codeToGID = NULL; + n = 0; + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (n) { + codeToGID = (int *)gmallocn(n, sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(int)); + } + } else { + if (fileName) + ff = FoFiTrueType::load(fileName->getCString()); + else + ff = FoFiTrueType::make(tmpBuf, tmpBufLen); + if (! ff) + { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n); + delete ff; + } + if (!(fontFile = fontEngine->loadTrueTypeFont( + id, + fontsrc, + codeToGID, n, faceIndex))) { + error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + default: + // this shouldn't happen + goto err2; + } + fontFile->doAdjustMatrix = doAdjustFontMatrix; + } + + // get the font matrix + textMat = state->getTextMat(); + fontSize = state->getFontSize(); + m11 = textMat[0] * fontSize * state->getHorizScaling(); + m12 = textMat[1] * fontSize * state->getHorizScaling(); + m21 = textMat[2] * fontSize; + m22 = textMat[3] * fontSize; + + // create the scaled font + mat[0] = m11; mat[1] = m12; + mat[2] = m21; mat[3] = m22; + font = fontEngine->getFont(fontFile, mat, splash->getMatrix()); + + // for substituted fonts: adjust the font matrix -- compare the + // width of 'm' in the original font and the substituted font + if (fontFile->doAdjustMatrix && !gfxFont->isCIDFont()) { + double w1, w2; + CharCode code; + char *name; + for (code = 0; code < 256; ++code) { + if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) && + name[0] == 'm' && name[1] == '\0') { + break; + } + } + if (code < 256) { + w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code); + w2 = font->getGlyphAdvance(code); + if (!gfxFont->isSymbolic() && w2 > 0) { + // if real font is substantially narrower than substituted + // font, reduce the font size accordingly + if (w1 > 0.01 && w1 < 0.9 * w2) { + w1 /= w2; + m11 *= w1; + m21 *= w1; + recreateFont = gTrue; + } + } + } + } + + if (recreateFont) + { + mat[0] = m11; mat[1] = m12; + mat[2] = m21; mat[3] = m22; + font = fontEngine->getFont(fontFile, mat, splash->getMatrix()); + } + + delete fontLoc; + if (fontsrc && !fontsrc->isFile) + fontsrc->unref(); + return; + + err2: + delete id; + delete fontLoc; + err1: + if (fontsrc && !fontsrc->isFile) + fontsrc->unref(); + return; +} + +void SplashOutputDev::stroke(GfxState *state) { + SplashPath *path; + + if (state->getStrokeColorSpace()->isNonMarking()) { + return; + } + setOverprintMask(state->getStrokeColorSpace(), state->getStrokeOverprint(), + state->getOverprintMode(), state->getStrokeColor()); + path = convertPath(state, state->getPath(), gFalse); + splash->stroke(path); + delete path; +} + +void SplashOutputDev::fill(GfxState *state) { + SplashPath *path; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + path = convertPath(state, state->getPath(), gTrue); + splash->fill(path, gFalse); + delete path; +} + +void SplashOutputDev::eoFill(GfxState *state) { + SplashPath *path; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + path = convertPath(state, state->getPath(), gTrue); + splash->fill(path, gTrue); + delete path; +} + +void SplashOutputDev::clip(GfxState *state) { + SplashPath *path; + + path = convertPath(state, state->getPath(), gTrue); + splash->clipToPath(path, gFalse); + delete path; +} + +void SplashOutputDev::eoClip(GfxState *state) { + SplashPath *path; + + path = convertPath(state, state->getPath(), gTrue); + splash->clipToPath(path, gTrue); + delete path; +} + +void SplashOutputDev::clipToStrokePath(GfxState *state) { + SplashPath *path, *path2; + + path = convertPath(state, state->getPath(), gFalse); + path2 = splash->makeStrokePath(path, state->getLineWidth()); + delete path; + splash->clipToPath(path2, gFalse); + delete path2; +} + +SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path, + GBool dropEmptySubpaths) { + SplashPath *sPath; + GfxSubpath *subpath; + int n, i, j; + + n = dropEmptySubpaths ? 1 : 0; + sPath = new SplashPath(); + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + if (subpath->getNumPoints() > n) { + sPath->moveTo((SplashCoord)subpath->getX(0), + (SplashCoord)subpath->getY(0)); + j = 1; + while (j < subpath->getNumPoints()) { + if (subpath->getCurve(j)) { + sPath->curveTo((SplashCoord)subpath->getX(j), + (SplashCoord)subpath->getY(j), + (SplashCoord)subpath->getX(j+1), + (SplashCoord)subpath->getY(j+1), + (SplashCoord)subpath->getX(j+2), + (SplashCoord)subpath->getY(j+2)); + j += 3; + } else { + sPath->lineTo((SplashCoord)subpath->getX(j), + (SplashCoord)subpath->getY(j)); + ++j; + } + } + if (subpath->isClosed()) { + sPath->close(); + } + } + } + return sPath; +} + +void SplashOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, + Unicode *u, int uLen) { + SplashPath *path; + int render; + GBool doFill, doStroke, doClip, strokeAdjust; + double m[4]; + GBool horiz; + + if (skipHorizText || skipRotatedText) { + state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]); + horiz = m[0] > 0 && fabs(m[1]) < 0.001 && + fabs(m[2]) < 0.001 && m[3] < 0; + if ((skipHorizText && horiz) || (skipRotatedText && !horiz)) { + return; + } + } + + // check for invisible text -- this is used by Acrobat Capture + render = state->getRender(); + if (render == 3) { + return; + } + + if (needFontUpdate) { + doUpdateFont(state); + } + if (!font) { + return; + } + + x -= originX; + y -= originY; + + doFill = !(render & 1) && !state->getFillColorSpace()->isNonMarking(); + doStroke = ((render & 3) == 1 || (render & 3) == 2) && + !state->getStrokeColorSpace()->isNonMarking(); + doClip = render & 4; + + path = NULL; + if (doStroke || doClip) { + if ((path = font->getGlyphPath(code))) { + path->offset((SplashCoord)x, (SplashCoord)y); + } + } + + // don't use stroke adjustment when stroking text -- the results + // tend to be ugly (because characters with horizontal upper or + // lower edges get misaligned relative to the other characters) + strokeAdjust = gFalse; // make gcc happy + if (doStroke) { + strokeAdjust = splash->getStrokeAdjust(); + splash->setStrokeAdjust(gFalse); + } + + // fill and stroke + if (doFill && doStroke) { + if (path) { + setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + splash->fill(path, gFalse); + setOverprintMask(state->getStrokeColorSpace(), + state->getStrokeOverprint(), + state->getOverprintMode(), + state->getStrokeColor()); + splash->stroke(path); + } + + // fill + } else if (doFill) { + setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + splash->fillChar((SplashCoord)x, (SplashCoord)y, code, font); + + // stroke + } else if (doStroke) { + if (path) { + setOverprintMask(state->getStrokeColorSpace(), + state->getStrokeOverprint(), + state->getOverprintMode(), + state->getStrokeColor()); + splash->stroke(path); + } + } + + // clip + if (doClip) { + if (path) { + if (textClipPath) { + textClipPath->append(path); + } else { + textClipPath = path; + path = NULL; + } + } + } + + if (doStroke) { + splash->setStrokeAdjust(strokeAdjust); + } + + if (path) { + delete path; + } +} + +GBool SplashOutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) { + GfxFont *gfxFont; + Ref *fontID; + double *ctm, *bbox; + T3FontCache *t3Font; + T3GlyphStack *t3gs; + GBool validBBox; + double m[4]; + GBool horiz; + double x1, y1, xMin, yMin, xMax, yMax, xt, yt; + int i, j; + + if (skipHorizText || skipRotatedText) { + state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]); + horiz = m[0] > 0 && fabs(m[1]) < 0.001 && + fabs(m[2]) < 0.001 && m[3] < 0; + if ((skipHorizText && horiz) || (skipRotatedText && !horiz)) { + return gTrue; + } + } + + if (!(gfxFont = state->getFont())) { + return gFalse; + } + fontID = gfxFont->getID(); + ctm = state->getCTM(); + state->transform(0, 0, &xt, &yt); + + // is it the first (MRU) font in the cache? + if (!(nT3Fonts > 0 && + t3FontCache[0]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3]))) { + + // is the font elsewhere in the cache? + for (i = 1; i < nT3Fonts; ++i) { + if (t3FontCache[i]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3])) { + t3Font = t3FontCache[i]; + for (j = i; j > 0; --j) { + t3FontCache[j] = t3FontCache[j - 1]; + } + t3FontCache[0] = t3Font; + break; + } + } + if (i >= nT3Fonts) { + + // create new entry in the font cache + if (nT3Fonts == splashOutT3FontCacheSize) { + delete t3FontCache[nT3Fonts - 1]; + --nT3Fonts; + } + for (j = nT3Fonts; j > 0; --j) { + t3FontCache[j] = t3FontCache[j - 1]; + } + ++nT3Fonts; + bbox = gfxFont->getFontBBox(); + if (bbox[0] == 0 && bbox[1] == 0 && bbox[2] == 0 && bbox[3] == 0) { + // unspecified bounding box -- just take a guess + xMin = xt - 5; + xMax = xMin + 30; + yMax = yt + 15; + yMin = yMax - 45; + validBBox = gFalse; + } else { + state->transform(bbox[0], bbox[1], &x1, &y1); + xMin = xMax = x1; + yMin = yMax = y1; + state->transform(bbox[0], bbox[3], &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(bbox[2], bbox[1], &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(bbox[2], bbox[3], &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + validBBox = gTrue; + } + t3FontCache[0] = new T3FontCache(fontID, ctm[0], ctm[1], ctm[2], ctm[3], + (int)floor(xMin - xt) - 2, + (int)floor(yMin - yt) - 2, + (int)ceil(xMax) - (int)floor(xMin) + 4, + (int)ceil(yMax) - (int)floor(yMin) + 4, + validBBox, + colorMode != splashModeMono1); + } + } + t3Font = t3FontCache[0]; + + // is the glyph in the cache? + i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; + for (j = 0; j < t3Font->cacheAssoc; ++j) { + if (t3Font->cacheTags != NULL) { + if ((t3Font->cacheTags[i+j].mru & 0x8000) && + t3Font->cacheTags[i+j].code == code) { + drawType3Glyph(state, t3Font, &t3Font->cacheTags[i+j], + t3Font->cacheData + (i+j) * t3Font->glyphSize); + return gTrue; + } + } + } + + // push a new Type 3 glyph record + t3gs = new T3GlyphStack(); + t3gs->next = t3GlyphStack; + t3GlyphStack = t3gs; + t3GlyphStack->code = code; + t3GlyphStack->cache = t3Font; + t3GlyphStack->cacheTag = NULL; + t3GlyphStack->cacheData = NULL; + + haveT3Dx = gFalse; + + return gFalse; +} + +void SplashOutputDev::endType3Char(GfxState *state) { + T3GlyphStack *t3gs; + double *ctm; + + if (t3GlyphStack->cacheTag) { + --nestCount; + memcpy(t3GlyphStack->cacheData, bitmap->getDataPtr(), + t3GlyphStack->cache->glyphSize); + delete bitmap; + delete splash; + bitmap = t3GlyphStack->origBitmap; + splash = t3GlyphStack->origSplash; + ctm = state->getCTM(); + state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], + t3GlyphStack->origCTM4, t3GlyphStack->origCTM5); + updateCTM(state, 0, 0, 0, 0, 0, 0); + drawType3Glyph(state, t3GlyphStack->cache, + t3GlyphStack->cacheTag, t3GlyphStack->cacheData); + } + t3gs = t3GlyphStack; + t3GlyphStack = t3gs->next; + delete t3gs; +} + +void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) { + haveT3Dx = gTrue; +} + +void SplashOutputDev::type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury) { + double *ctm; + T3FontCache *t3Font; + SplashColor color; + double xt, yt, xMin, xMax, yMin, yMax, x1, y1; + int i, j; + + // ignore multiple d0/d1 operators + if (haveT3Dx) { + return; + } + haveT3Dx = gTrue; + + if (unlikely(t3GlyphStack == NULL)) { + error(errSyntaxWarning, -1, "t3GlyphStack was null in SplashOutputDev::type3D1"); + return; + } + + if (unlikely(t3GlyphStack->origBitmap != NULL)) { + error(errSyntaxWarning, -1, "t3GlyphStack origBitmap was not null in SplashOutputDev::type3D1"); + return; + } + + if (unlikely(t3GlyphStack->origSplash != NULL)) { + error(errSyntaxWarning, -1, "t3GlyphStack origSplash was not null in SplashOutputDev::type3D1"); + return; + } + + t3Font = t3GlyphStack->cache; + + // check for a valid bbox + state->transform(0, 0, &xt, &yt); + state->transform(llx, lly, &x1, &y1); + xMin = xMax = x1; + yMin = yMax = y1; + state->transform(llx, ury, &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(urx, lly, &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(urx, ury, &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + if (xMin - xt < t3Font->glyphX || + yMin - yt < t3Font->glyphY || + xMax - xt > t3Font->glyphX + t3Font->glyphW || + yMax - yt > t3Font->glyphY + t3Font->glyphH) { + if (t3Font->validBBox) { + error(errSyntaxWarning, -1, "Bad bounding box in Type 3 glyph"); + } + return; + } + + if (t3Font->cacheTags == NULL) + return; + + // allocate a cache entry + i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; + for (j = 0; j < t3Font->cacheAssoc; ++j) { + if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) { + t3Font->cacheTags[i+j].mru = 0x8000; + t3Font->cacheTags[i+j].code = t3GlyphStack->code; + t3GlyphStack->cacheTag = &t3Font->cacheTags[i+j]; + t3GlyphStack->cacheData = t3Font->cacheData + (i+j) * t3Font->glyphSize; + } else { + ++t3Font->cacheTags[i+j].mru; + } + } + + // save state + t3GlyphStack->origBitmap = bitmap; + t3GlyphStack->origSplash = splash; + ctm = state->getCTM(); + t3GlyphStack->origCTM4 = ctm[4]; + t3GlyphStack->origCTM5 = ctm[5]; + + // create the temporary bitmap + if (colorMode == splashModeMono1) { + bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1, + splashModeMono1, gFalse); + splash = new Splash(bitmap, gFalse, + t3GlyphStack->origSplash->getScreen()); + color[0] = 0; + splash->clear(color); + color[0] = 0xff; + } else { + bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1, + splashModeMono8, gFalse); + splash = new Splash(bitmap, vectorAntialias, + t3GlyphStack->origSplash->getScreen()); + color[0] = 0x00; + splash->clear(color); + color[0] = 0xff; + } + splash->setMinLineWidth(globalParams->getMinLineWidth()); + splash->setFillPattern(new SplashSolidColor(color)); + splash->setStrokePattern(new SplashSolidColor(color)); + //~ this should copy other state from t3GlyphStack->origSplash? + state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], + -t3Font->glyphX, -t3Font->glyphY); + updateCTM(state, 0, 0, 0, 0, 0, 0); + ++nestCount; +} + +void SplashOutputDev::drawType3Glyph(GfxState *state, T3FontCache *t3Font, + T3FontCacheTag * /*tag*/, Guchar *data) { + SplashGlyphBitmap glyph; + + setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + glyph.x = -t3Font->glyphX; + glyph.y = -t3Font->glyphY; + glyph.w = t3Font->glyphW; + glyph.h = t3Font->glyphH; + glyph.aa = colorMode != splashModeMono1; + glyph.data = data; + glyph.freeData = gFalse; + splash->fillGlyph(0, 0, &glyph); +} + +void SplashOutputDev::beginTextObject(GfxState *state) { +} + +void SplashOutputDev::endTextObject(GfxState *state) { + if (textClipPath) { + splash->clipToPath(textClipPath, gFalse); + delete textClipPath; + textClipPath = NULL; + } +} + +struct SplashOutImageMaskData { + ImageStream *imgStr; + GBool invert; + int width, height, y; +}; + +GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) { + SplashOutImageMaskData *imgMaskData = (SplashOutImageMaskData *)data; + Guchar *p; + SplashColorPtr q; + int x; + + if (imgMaskData->y == imgMaskData->height) { + return gFalse; + } + if (!(p = imgMaskData->imgStr->getLine())) { + return gFalse; + } + for (x = 0, q = line; x < imgMaskData->width; ++x) { + *q++ = *p++ ^ imgMaskData->invert; + } + ++imgMaskData->y; + return gTrue; +} + +void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageMaskData imgMaskData; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + setOverprintMask(state->getFillColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + + ctm = state->getCTM(); + for (int i = 0; i < 6; ++i) { + if (!isfinite(ctm[i])) return; + } + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + imgMaskData.imgStr = new ImageStream(str, width, 1, 1); + imgMaskData.imgStr->reset(); + imgMaskData.invert = invert ? 0 : 1; + imgMaskData.width = width; + imgMaskData.height = height; + imgMaskData.y = 0; + + splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, t3GlyphStack != NULL); + if (inlineImg) { + if (inlineImg) { + while (imgMaskData.y < height) { + imgMaskData.imgStr->getLine(); + ++imgMaskData.y; + } + } + } + + delete imgMaskData.imgStr; + str->close(); +} + +void SplashOutputDev::setSoftMaskFromImageMask(GfxState *state, + Object *ref, Stream *str, + int width, int height, + GBool invert, + GBool inlineImg, double *baseMatrix) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageMaskData imgMaskData; + Splash *maskSplash; + SplashColor maskColor; + double bbox[4] = {0, 0, 1, 1}; // default; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + + ctm = state->getCTM(); + for (int i = 0; i < 6; ++i) { + if (!isfinite(ctm[i])) return; + } + + beginTransparencyGroup(state, bbox, NULL, gFalse, gFalse, gFalse); + baseMatrix[4] -= transpGroupStack->tx; + baseMatrix[5] -= transpGroupStack->ty; + + ctm = state->getCTM(); + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + imgMaskData.imgStr = new ImageStream(str, width, 1, 1); + imgMaskData.imgStr->reset(); + imgMaskData.invert = invert ? 0 : 1; + imgMaskData.width = width; + imgMaskData.height = height; + imgMaskData.y = 0; + + maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse); + maskSplash = new Splash(maskBitmap, vectorAntialias); + maskColor[0] = 0; + maskSplash->clear(maskColor); + maskColor[0] = 0xff; + maskSplash->setFillPattern(new SplashSolidColor(maskColor)); + maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, t3GlyphStack != NULL); + delete maskSplash; + delete imgMaskData.imgStr; + str->close(); +} + +void SplashOutputDev::unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix) { + double bbox[4] = {0,0,1,1}; // dummy + + /* transfer mask to alpha channel! */ + // memcpy(maskBitmap->getAlphaPtr(), maskBitmap->getDataPtr(), bitmap->getRowSize() * bitmap->getHeight()); + // memset(maskBitmap->getDataPtr(), 0, bitmap->getRowSize() * bitmap->getHeight()); + Guchar *dest = bitmap->getAlphaPtr(); + Guchar *src = maskBitmap->getDataPtr(); + for (int c= 0; c < maskBitmap->getRowSize() * maskBitmap->getHeight(); c++) { + dest[c] = src[c]; + } + delete maskBitmap; + maskBitmap = NULL; + endTransparencyGroup(state); + baseMatrix[4] += transpGroupStack->tx; + baseMatrix[5] += transpGroupStack->ty; + paintTransparencyGroup(state, bbox); +} + +struct SplashOutImageData { + ImageStream *imgStr; + GfxImageColorMap *colorMap; + SplashColorPtr lookup; + int *maskColors; + SplashColorMode colorMode; + int width, height, y; +}; + +GBool SplashOutputDev::imageSrc(void *data, SplashColorPtr colorLine, + Guchar * /*alphaLine*/) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + Guchar *p; + SplashColorPtr q, col; + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + int nComps, x; + + if (imgData->y == imgData->height) { + return gFalse; + } + if (!(p = imgData->imgStr->getLine())) { + return gFalse; + } + + nComps = imgData->colorMap->getNumPixelComps(); + + if (imgData->lookup) { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) { + *q++ = imgData->lookup[*p]; + } + break; + case splashModeRGB8: + case splashModeBGR8: + for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) { + col = &imgData->lookup[3 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + } + break; + case splashModeXBGR8: + for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) { + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) { + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + } + break; +#endif + } + } else { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) { + imgData->colorMap->getGray(p, &gray); + *q++ = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) { + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + } + break; + case splashModeXBGR8: + for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) { + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + *q++ = 255; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) { + imgData->colorMap->getCMYK(p, &cmyk); + *q++ = colToByte(cmyk.c); + *q++ = colToByte(cmyk.m); + *q++ = colToByte(cmyk.y); + *q++ = colToByte(cmyk.k); + } + break; +#endif + } + } + + ++imgData->y; + return gTrue; +} + +GBool SplashOutputDev::alphaImageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + Guchar *p, *aq; + SplashColorPtr q, col; + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar alpha; + int nComps, x, i; + + if (imgData->y == imgData->height) { + return gFalse; + } + if (!(p = imgData->imgStr->getLine())) { + return gFalse; + } + + nComps = imgData->colorMap->getNumPixelComps(); + + for (x = 0, q = colorLine, aq = alphaLine; + x < imgData->width; + ++x, p += nComps) { + alpha = 0; + for (i = 0; i < nComps; ++i) { + if (p[i] < imgData->maskColors[2*i] || + p[i] > imgData->maskColors[2*i+1]) { + alpha = 0xff; + break; + } + } + if (imgData->lookup) { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + *q++ = imgData->lookup[*p]; + break; + case splashModeRGB8: + case splashModeBGR8: + col = &imgData->lookup[3 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + break; + case splashModeXBGR8: + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = 255; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + break; +#endif + } + *aq++ = alpha; + } else { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData->colorMap->getGray(p, &gray); + *q++ = colToByte(gray); + break; + case splashModeXBGR8: + case splashModeRGB8: + case splashModeBGR8: + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + if (imgData->colorMode == splashModeXBGR8) *q++ = 255; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData->colorMap->getCMYK(p, &cmyk); + *q++ = colToByte(cmyk.c); + *q++ = colToByte(cmyk.m); + *q++ = colToByte(cmyk.y); + *q++ = colToByte(cmyk.k); + break; +#endif + } + *aq++ = alpha; + } + } + + ++imgData->y; + return gTrue; +} + +struct TilingSplashOutBitmap { + SplashBitmap *bitmap; + SplashPattern *pattern; + SplashColorMode colorMode; + int paintType; + int repeatX; + int repeatY; + int y; +}; + +GBool SplashOutputDev::tilingBitmapSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine) { + TilingSplashOutBitmap *imgData = (TilingSplashOutBitmap *)data; + + if (imgData->y == imgData->bitmap->getHeight()) { + imgData->repeatY--; + if (imgData->repeatY == 0) + return gFalse; + imgData->y = 0; + } + + if (imgData->paintType == 1) { + const SplashColorMode cMode = imgData->bitmap->getMode(); + SplashColorPtr q = colorLine; + // For splashModeBGR8 and splashModeXBGR8 we need to use getPixel + // for the others we can use raw access + if (cMode == splashModeBGR8 || cMode == splashModeXBGR8) { + for (int m = 0; m < imgData->repeatX; m++) { + for (int x = 0; x < imgData->bitmap->getWidth(); x++) { + imgData->bitmap->getPixel(x, imgData->y, q); + q += splashColorModeNComps[cMode]; + } + } + } else { + const int n = imgData->bitmap->getRowSize(); + SplashColorPtr p; + for (int m = 0; m < imgData->repeatX; m++) { + p = imgData->bitmap->getDataPtr() + imgData->y * imgData->bitmap->getRowSize(); + for (int x = 0; x < n; ++x) { + *q++ = *p++; + } + } + } + if (alphaLine != NULL) { + SplashColorPtr aq = alphaLine; + SplashColorPtr p; + const int n = imgData->bitmap->getWidth() - 1; + for (int m = 0; m < imgData->repeatX; m++) { + p = imgData->bitmap->getAlphaPtr() + imgData->y * imgData->bitmap->getWidth(); + for (int x = 0; x < n; ++x) { + *aq++ = *p++; + } + // This is a hack, because of how Splash antialias works if we overwrite the + // last alpha pixel of the tile most/all of the files look much better + *aq++ = (n == 0) ? *p : *(p - 1); + } + } + } else { + SplashColor col, pat; + SplashColorPtr dest = colorLine; + for (int m = 0; m < imgData->repeatX; m++) { + for (int x = 0; x < imgData->bitmap->getWidth(); x++) { + imgData->bitmap->getPixel(x, imgData->y, col); + imgData->pattern->getColor(x, imgData->y, pat); + for (int i = 0; i < splashColorModeNComps[imgData->colorMode]; ++i) { +#if SPLASH_CMYK + if (imgData->colorMode == splashModeCMYK8) + dest[i] = div255(pat[i] * (255 - col[0])); + else +#endif + dest[i] = 255 - div255((255 - pat[i]) * (255 - col[0])); + } + dest += splashColorModeNComps[imgData->colorMode]; + } + } + if (alphaLine != NULL) { + const int y = (imgData->y == imgData->bitmap->getHeight() - 1 && imgData->y > 50) ? imgData->y - 1 : imgData->y; + SplashColorPtr aq = alphaLine; + SplashColorPtr p; + const int n = imgData->bitmap->getWidth(); + for (int m = 0; m < imgData->repeatX; m++) { + p = imgData->bitmap->getAlphaPtr() + y * imgData->bitmap->getWidth(); + for (int x = 0; x < n; ++x) { + *aq++ = *p++; + } + } + } + } + ++imgData->y; + return gTrue; +} + +void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + int *maskColors, GBool inlineImg) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageData imgData; + SplashColorMode srcMode; + SplashImageSource src; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; + GBool grayIndexed = gFalse; +#endif + Guchar pix; + int n, i; + + ctm = state->getCTM(); + for (i = 0; i < 6; ++i) { + if (!isfinite(ctm[i])) return; + } + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + imgData.imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgData.imgStr->reset(); + imgData.colorMap = colorMap; + imgData.maskColors = maskColors; + imgData.colorMode = colorMode; + imgData.width = width; + imgData.height = height; + imgData.y = 0; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + imgData.lookup = NULL; + if (colorMap->getNumPixelComps() == 1) { + n = 1 << colorMap->getBits(); + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getGray(&pix, &gray); + imgData.lookup[i] = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 3); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[3*i] = colToByte(rgb.r); + imgData.lookup[3*i+1] = colToByte(rgb.g); + imgData.lookup[3*i+2] = colToByte(rgb.b); + } + break; + case splashModeXBGR8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[4*i] = colToByte(rgb.r); + imgData.lookup[4*i+1] = colToByte(rgb.g); + imgData.lookup[4*i+2] = colToByte(rgb.b); + imgData.lookup[4*i+3] = 255; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + grayIndexed = colorMap->getColorSpace()->getMode() != csDeviceGray; + imgData.lookup = (SplashColorPtr)gmallocn(n, 4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getCMYK(&pix, &cmyk); + if (cmyk.c != 0 || cmyk.m != 0 || cmyk.y != 0) { + grayIndexed = gFalse; + } + imgData.lookup[4*i] = colToByte(cmyk.c); + imgData.lookup[4*i+1] = colToByte(cmyk.m); + imgData.lookup[4*i+2] = colToByte(cmyk.y); + imgData.lookup[4*i+3] = colToByte(cmyk.k); + } + break; +#endif + } + } + +#if SPLASH_CMYK + setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), NULL, grayIndexed); +#else + setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), NULL); +#endif + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + src = maskColors ? &alphaImageSrc : &imageSrc; + splash->drawImage(src, &imgData, srcMode, maskColors ? gTrue : gFalse, + width, height, mat); + if (inlineImg) { + while (imgData.y < height) { + imgData.imgStr->getLine(); + ++imgData.y; + } + } + + gfree(imgData.lookup); + delete imgData.imgStr; + str->close(); +} + +struct SplashOutMaskedImageData { + ImageStream *imgStr; + GfxImageColorMap *colorMap; + SplashBitmap *mask; + SplashColorPtr lookup; + SplashColorMode colorMode; + int width, height, y; +}; + +GBool SplashOutputDev::maskedImageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine) { + SplashOutMaskedImageData *imgData = (SplashOutMaskedImageData *)data; + Guchar *p, *aq; + SplashColorPtr q, col; + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar alpha; + Guchar *maskPtr; + int maskBit; + int nComps, x; + + if (imgData->y == imgData->height) { + return gFalse; + } + if (!(p = imgData->imgStr->getLine())) { + return gFalse; + } + + nComps = imgData->colorMap->getNumPixelComps(); + + maskPtr = imgData->mask->getDataPtr() + + imgData->y * imgData->mask->getRowSize(); + maskBit = 0x80; + for (x = 0, q = colorLine, aq = alphaLine; + x < imgData->width; + ++x, p += nComps) { + alpha = (*maskPtr & maskBit) ? 0xff : 0x00; + if (!(maskBit >>= 1)) { + ++maskPtr; + maskBit = 0x80; + } + if (imgData->lookup) { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + *q++ = imgData->lookup[*p]; + break; + case splashModeRGB8: + case splashModeBGR8: + col = &imgData->lookup[3 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + break; + case splashModeXBGR8: + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = 255; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + break; +#endif + } + *aq++ = alpha; + } else { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData->colorMap->getGray(p, &gray); + *q++ = colToByte(gray); + break; + case splashModeXBGR8: + case splashModeRGB8: + case splashModeBGR8: + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + if (imgData->colorMode == splashModeXBGR8) *q++ = 255; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData->colorMap->getCMYK(p, &cmyk); + *q++ = colToByte(cmyk.c); + *q++ = colToByte(cmyk.m); + *q++ = colToByte(cmyk.y); + *q++ = colToByte(cmyk.k); + break; +#endif + } + *aq++ = alpha; + } + } + + ++imgData->y; + return gTrue; +} + +void SplashOutputDev::drawMaskedImage(GfxState *state, Object *ref, + Stream *str, int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, int maskWidth, + int maskHeight, GBool maskInvert, + GBool maskInterpolate) { + GfxImageColorMap *maskColorMap; + Object maskDecode, decodeLow, decodeHigh; + double *ctm; + SplashCoord mat[6]; + SplashOutMaskedImageData imgData; + SplashOutImageMaskData imgMaskData; + SplashColorMode srcMode; + SplashBitmap *maskBitmap; + Splash *maskSplash; + SplashColor maskColor; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar pix; + int n, i; + + setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), NULL); + + // If the mask is higher resolution than the image, use + // drawSoftMaskedImage() instead. + if (maskWidth > width || maskHeight > height) { + decodeLow.initInt(maskInvert ? 0 : 1); + decodeHigh.initInt(maskInvert ? 1 : 0); + maskDecode.initArray(doc->getXRef()); + maskDecode.arrayAdd(&decodeLow); + maskDecode.arrayAdd(&decodeHigh); + maskColorMap = new GfxImageColorMap(1, &maskDecode, + new GfxDeviceGrayColorSpace()); + maskDecode.free(); + drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate); + delete maskColorMap; + + } else { + //----- scale the mask image to the same size as the source image + + mat[0] = (SplashCoord)width; + mat[1] = 0; + mat[2] = 0; + mat[3] = (SplashCoord)height; + mat[4] = 0; + mat[5] = 0; + imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, 1, 1); + imgMaskData.imgStr->reset(); + imgMaskData.invert = maskInvert ? 0 : 1; + imgMaskData.width = maskWidth; + imgMaskData.height = maskHeight; + imgMaskData.y = 0; + maskBitmap = new SplashBitmap(width, height, 1, splashModeMono1, gFalse); + maskSplash = new Splash(maskBitmap, gFalse); + maskColor[0] = 0; + maskSplash->clear(maskColor); + maskColor[0] = 0xff; + maskSplash->setFillPattern(new SplashSolidColor(maskColor)); + maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData, + maskWidth, maskHeight, mat, gFalse); + delete imgMaskData.imgStr; + maskStr->close(); + delete maskSplash; + + //----- draw the source image + + ctm = state->getCTM(); + for (i = 0; i < 6; ++i) { + if (!isfinite(ctm[i])) { + delete maskBitmap; + return; + } + } + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + imgData.imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgData.imgStr->reset(); + imgData.colorMap = colorMap; + imgData.mask = maskBitmap; + imgData.colorMode = colorMode; + imgData.width = width; + imgData.height = height; + imgData.y = 0; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + imgData.lookup = NULL; + if (colorMap->getNumPixelComps() == 1) { + n = 1 << colorMap->getBits(); + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getGray(&pix, &gray); + imgData.lookup[i] = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 3); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[3*i] = colToByte(rgb.r); + imgData.lookup[3*i+1] = colToByte(rgb.g); + imgData.lookup[3*i+2] = colToByte(rgb.b); + } + break; + case splashModeXBGR8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[4*i] = colToByte(rgb.r); + imgData.lookup[4*i+1] = colToByte(rgb.g); + imgData.lookup[4*i+2] = colToByte(rgb.b); + imgData.lookup[4*i+3] = 255; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getCMYK(&pix, &cmyk); + imgData.lookup[4*i] = colToByte(cmyk.c); + imgData.lookup[4*i+1] = colToByte(cmyk.m); + imgData.lookup[4*i+2] = colToByte(cmyk.y); + imgData.lookup[4*i+3] = colToByte(cmyk.k); + } + break; +#endif + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + splash->drawImage(&maskedImageSrc, &imgData, srcMode, gTrue, + width, height, mat); + delete maskBitmap; + gfree(imgData.lookup); + delete imgData.imgStr; + str->close(); + } +} + +void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, + Stream *str, int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageData imgData; + SplashOutImageData imgMaskData; + SplashColorMode srcMode; + SplashBitmap *maskBitmap; + Splash *maskSplash; + SplashColor maskColor; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar pix; + int n, i; + + setOverprintMask(colorMap->getColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), NULL); + + ctm = state->getCTM(); + for (i = 0; i < 6; ++i) { + if (!isfinite(ctm[i])) return; + } + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + //----- set up the soft mask + + imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, + maskColorMap->getNumPixelComps(), + maskColorMap->getBits()); + imgMaskData.imgStr->reset(); + imgMaskData.colorMap = maskColorMap; + imgMaskData.maskColors = NULL; + imgMaskData.colorMode = splashModeMono8; + imgMaskData.width = maskWidth; + imgMaskData.height = maskHeight; + imgMaskData.y = 0; + n = 1 << maskColorMap->getBits(); + imgMaskData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + maskColorMap->getGray(&pix, &gray); + imgMaskData.lookup[i] = colToByte(gray); + } + maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), + 1, splashModeMono8, gFalse); + maskSplash = new Splash(maskBitmap, vectorAntialias); + maskColor[0] = 0; + maskSplash->clear(maskColor); + maskSplash->drawImage(&imageSrc, &imgMaskData, splashModeMono8, gFalse, + maskWidth, maskHeight, mat); + delete imgMaskData.imgStr; + maskStr->close(); + gfree(imgMaskData.lookup); + delete maskSplash; + splash->setSoftMask(maskBitmap); + + //----- draw the source image + + imgData.imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgData.imgStr->reset(); + imgData.colorMap = colorMap; + imgData.maskColors = NULL; + imgData.colorMode = colorMode; + imgData.width = width; + imgData.height = height; + imgData.y = 0; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + imgData.lookup = NULL; + if (colorMap->getNumPixelComps() == 1) { + n = 1 << colorMap->getBits(); + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getGray(&pix, &gray); + imgData.lookup[i] = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 3); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[3*i] = colToByte(rgb.r); + imgData.lookup[3*i+1] = colToByte(rgb.g); + imgData.lookup[3*i+2] = colToByte(rgb.b); + } + break; + case splashModeXBGR8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[4*i] = colToByte(rgb.r); + imgData.lookup[4*i+1] = colToByte(rgb.g); + imgData.lookup[4*i+2] = colToByte(rgb.b); + imgData.lookup[4*i+3] = 255; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData.lookup = (SplashColorPtr)gmallocn(n, 4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getCMYK(&pix, &cmyk); + imgData.lookup[4*i] = colToByte(cmyk.c); + imgData.lookup[4*i+1] = colToByte(cmyk.m); + imgData.lookup[4*i+2] = colToByte(cmyk.y); + imgData.lookup[4*i+3] = colToByte(cmyk.k); + } + break; +#endif + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + splash->drawImage(&imageSrc, &imgData, srcMode, gFalse, width, height, mat); + splash->setSoftMask(NULL); + gfree(imgData.lookup); + delete imgData.imgStr; + str->close(); +} + +GBool SplashOutputDev::checkTransparencyGroup(GfxState *state, GBool knockout) { + if (state->getFillOpacity() != 1 || + state->getStrokeOpacity() != 1 || + state->getAlphaIsShape() || + state->getBlendMode() != gfxBlendNormal || + splash->getSoftMask() != NULL || + knockout) + return gTrue; + return transpGroupStack != NULL && transpGroupStack->shape != NULL; +} + +void SplashOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask) { + SplashTransparencyGroup *transpGroup; + SplashColor color; + double xMin, yMin, xMax, yMax, x, y; + int tx, ty, w, h, i; + + // transform the bbox + state->transform(bbox[0], bbox[1], &x, &y); + xMin = xMax = x; + yMin = yMax = y; + state->transform(bbox[0], bbox[3], &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + state->transform(bbox[2], bbox[1], &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + state->transform(bbox[2], bbox[3], &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + tx = (int)floor(xMin); + if (tx < 0) { + tx = 0; + } else if (tx >= bitmap->getWidth()) { + tx = bitmap->getWidth() - 1; + } + ty = (int)floor(yMin); + if (ty < 0) { + ty = 0; + } else if (ty >= bitmap->getHeight()) { + ty = bitmap->getHeight() - 1; + } + w = (int)ceil(xMax) - tx + 1; + if (tx + w > bitmap->getWidth()) { + w = bitmap->getWidth() - tx; + } + if (w < 1) { + w = 1; + } + h = (int)ceil(yMax) - ty + 1; + if (ty + h > bitmap->getHeight()) { + h = bitmap->getHeight() - ty; + } + if (h < 1) { + h = 1; + } + + // push a new stack entry + transpGroup = new SplashTransparencyGroup(); + transpGroup->tx = tx; + transpGroup->ty = ty; + transpGroup->blendingColorSpace = blendingColorSpace; + transpGroup->isolated = isolated; + transpGroup->shape = (knockout) ? SplashBitmap::copy(bitmap) : NULL; + transpGroup->knockout = gFalse; + transpGroup->knockoutOpacity = 1.0; + transpGroup->next = transpGroupStack; + transpGroupStack = transpGroup; + + // save state + transpGroup->origBitmap = bitmap; + transpGroup->origSplash = splash; + + //~ this handles the blendingColorSpace arg for soft masks, but + //~ not yet for transparency groups + + // switch to the blending color space + if (forSoftMask && isolated && blendingColorSpace) { + if (blendingColorSpace->getMode() == csDeviceGray || + blendingColorSpace->getMode() == csCalGray || + (blendingColorSpace->getMode() == csICCBased && + blendingColorSpace->getNComps() == 1)) { + colorMode = splashModeMono8; + } else if (blendingColorSpace->getMode() == csDeviceRGB || + blendingColorSpace->getMode() == csCalRGB || + (blendingColorSpace->getMode() == csICCBased && + blendingColorSpace->getNComps() == 3)) { + //~ does this need to use BGR8? + colorMode = splashModeRGB8; +#if SPLASH_CMYK + } else if (blendingColorSpace->getMode() == csDeviceCMYK || + (blendingColorSpace->getMode() == csICCBased && + blendingColorSpace->getNComps() == 4)) { + colorMode = splashModeCMYK8; +#endif + } + } + + // create the temporary bitmap + bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, gTrue, + bitmapTopDown); + splash = new Splash(bitmap, vectorAntialias, + transpGroup->origSplash->getScreen()); + splash->setMinLineWidth(globalParams->getMinLineWidth()); + //~ Acrobat apparently copies at least the fill and stroke colors, and + //~ maybe other state(?) -- but not the clipping path (and not sure + //~ what else) + //~ [this is likely the same situation as in type3D1()] + splash->setFillPattern(transpGroup->origSplash->getFillPattern()->copy()); + splash->setStrokePattern( + transpGroup->origSplash->getStrokePattern()->copy()); + if (isolated) { + for (i = 0; i < splashMaxColorComps; ++i) { + color[i] = 0; + } + if (colorMode == splashModeXBGR8) color[3] = 255; + splash->clear(color, 0); + } else { + SplashBitmap *shape = (knockout) ? transpGroup->shape : + (transpGroup->next != NULL && transpGroup->next->shape != NULL) ? transpGroup->next->shape : transpGroup->origBitmap; + splash->blitTransparent(transpGroup->origBitmap, tx, ty, 0, 0, w, h); + splash->setInNonIsolatedGroup(shape, tx, ty); + } + transpGroup->tBitmap = bitmap; + state->shiftCTM(-tx, -ty); + updateCTM(state, 0, 0, 0, 0, 0, 0); + ++nestCount; +} + +void SplashOutputDev::endTransparencyGroup(GfxState *state) { + // restore state + --nestCount; + delete splash; + bitmap = transpGroupStack->origBitmap; + colorMode = bitmap->getMode(); + splash = transpGroupStack->origSplash; + state->shiftCTM(transpGroupStack->tx, transpGroupStack->ty); + updateCTM(state, 0, 0, 0, 0, 0, 0); +} + +void SplashOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) { + SplashBitmap *tBitmap; + SplashTransparencyGroup *transpGroup; + GBool isolated; + int tx, ty; + + tx = transpGroupStack->tx; + ty = transpGroupStack->ty; + tBitmap = transpGroupStack->tBitmap; + isolated = transpGroupStack->isolated; + + // paint the transparency group onto the parent bitmap + // - the clip path was set in the parent's state) + if (tx < bitmap->getWidth() && ty < bitmap->getHeight()) { + SplashCoord knockoutOpacity = (transpGroupStack->next != NULL) ? transpGroupStack->next->knockoutOpacity + : transpGroupStack->knockoutOpacity; + splash->setOverprintMask(0xffffffff, gFalse); + splash->composite(tBitmap, 0, 0, tx, ty, + tBitmap->getWidth(), tBitmap->getHeight(), + gFalse, !isolated, transpGroupStack->next != NULL && transpGroupStack->next->knockout, knockoutOpacity); + if (transpGroupStack->next != NULL && transpGroupStack->next->shape != NULL) { + transpGroupStack->next->knockout = gTrue; + } + } + + // pop the stack + transpGroup = transpGroupStack; + transpGroupStack = transpGroup->next; + if (transpGroupStack != NULL && transpGroup->knockoutOpacity < transpGroupStack->knockoutOpacity) { + transpGroupStack->knockoutOpacity = transpGroup->knockoutOpacity; + } + delete transpGroup->shape; + delete transpGroup; + + delete tBitmap; +} + +void SplashOutputDev::setSoftMask(GfxState *state, double *bbox, + GBool alpha, Function *transferFunc, + GfxColor *backdropColor) { + SplashBitmap *softMask, *tBitmap; + Splash *tSplash; + SplashTransparencyGroup *transpGroup; + SplashColor color; + SplashColorPtr p; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + double lum, lum2; + int tx, ty, x, y; + + tx = transpGroupStack->tx; + ty = transpGroupStack->ty; + tBitmap = transpGroupStack->tBitmap; + + // composite with backdrop color + if (!alpha && tBitmap->getMode() != splashModeMono1) { + //~ need to correctly handle the case where no blending color + //~ space is given + if (transpGroupStack->blendingColorSpace) { + tSplash = new Splash(tBitmap, vectorAntialias, + transpGroupStack->origSplash->getScreen()); + switch (tBitmap->getMode()) { + case splashModeMono1: + // transparency is not supported in mono1 mode + break; + case splashModeMono8: + transpGroupStack->blendingColorSpace->getGray(backdropColor, &gray); + color[0] = colToByte(gray); + tSplash->compositeBackground(color); + break; + case splashModeXBGR8: + color[3] = 255; + case splashModeRGB8: + case splashModeBGR8: + transpGroupStack->blendingColorSpace->getRGB(backdropColor, &rgb); + color[0] = colToByte(rgb.r); + color[1] = colToByte(rgb.g); + color[2] = colToByte(rgb.b); + tSplash->compositeBackground(color); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + transpGroupStack->blendingColorSpace->getCMYK(backdropColor, &cmyk); + color[0] = colToByte(cmyk.c); + color[1] = colToByte(cmyk.m); + color[2] = colToByte(cmyk.y); + color[3] = colToByte(cmyk.k); + tSplash->compositeBackground(color); + break; +#endif + } + delete tSplash; + } + } + + softMask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), + 1, splashModeMono8, gFalse); + unsigned char fill = 0; + if (transpGroupStack->blendingColorSpace) { + transpGroupStack->blendingColorSpace->getGray(backdropColor, &gray); + fill = colToByte(gray); + } + memset(softMask->getDataPtr(), fill, + softMask->getRowSize() * softMask->getHeight()); + p = softMask->getDataPtr() + ty * softMask->getRowSize() + tx; + int xMax = tBitmap->getWidth(); + int yMax = tBitmap->getHeight(); + if (xMax + tx > bitmap->getWidth()) xMax = bitmap->getWidth() - tx; + if (yMax + ty > bitmap->getHeight()) yMax = bitmap->getHeight() - ty; + for (y = 0; y < yMax; ++y) { + for (x = 0; x < xMax; ++x) { + if (alpha) { + p[x] = tBitmap->getAlpha(x, y); + } else { + tBitmap->getPixel(x, y, color); + // convert to luminosity + switch (tBitmap->getMode()) { + case splashModeMono1: + case splashModeMono8: + lum = color[0] / 255.0; + break; + case splashModeXBGR8: + case splashModeRGB8: + case splashModeBGR8: + lum = (0.3 / 255.0) * color[0] + + (0.59 / 255.0) * color[1] + + (0.11 / 255.0) * color[2]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + lum = (1 - color[3] / 255.0) + - (0.3 / 255.0) * color[0] + - (0.59 / 255.0) * color[1] + - (0.11 / 255.0) * color[2]; + if (lum < 0) { + lum = 0; + } + break; +#endif + } + if (transferFunc) { + transferFunc->transform(&lum, &lum2); + } else { + lum2 = lum; + } + p[x] = (int)(lum2 * 255.0 + 0.5); + } + } + p += softMask->getRowSize(); + } + splash->setSoftMask(softMask); + + // pop the stack + transpGroup = transpGroupStack; + transpGroupStack = transpGroup->next; + delete transpGroup; + + delete tBitmap; +} + +void SplashOutputDev::clearSoftMask(GfxState *state) { + splash->setSoftMask(NULL); +} + +void SplashOutputDev::setPaperColor(SplashColorPtr paperColorA) { + splashColorCopy(paperColor, paperColorA); +} + +int SplashOutputDev::getBitmapWidth() { + return bitmap->getWidth(); +} + +int SplashOutputDev::getBitmapHeight() { + return bitmap->getHeight(); +} + +SplashBitmap *SplashOutputDev::takeBitmap() { + SplashBitmap *ret; + + ret = bitmap; + bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + return ret; +} + +void SplashOutputDev::getModRegion(int *xMin, int *yMin, + int *xMax, int *yMax) { + splash->getModRegion(xMin, yMin, xMax, yMax); +} + +void SplashOutputDev::clearModRegion() { + splash->clearModRegion(); +} + +#if 1 //~tmp: turn off anti-aliasing temporarily +GBool SplashOutputDev::getVectorAntialias() { + return splash->getVectorAntialias(); +} + +void SplashOutputDev::setVectorAntialias(GBool vaa) { + vectorAntialias = vaa; + splash->setVectorAntialias(vaa); +} +#endif + +void SplashOutputDev::setFreeTypeHinting(GBool enable, GBool enableSlightHintingA) +{ + enableFreeTypeHinting = enable; + enableSlightHinting = enableSlightHintingA; +} + +GBool SplashOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx1, Catalog *catalog, Object *str, + double *ptm, int paintType, int /*tilingType*/, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) +{ + PDFRectangle box; + Gfx *gfx; + Splash *formerSplash = splash; + SplashBitmap *formerBitmap = bitmap; + double width, height; + int surface_width, surface_height, result_width, result_height, i; + int repeatX, repeatY; + SplashCoord matc[6]; + Matrix m1; + double *ctm, savedCTM[6]; + double kx, ky, sx, sy; + + width = bbox[2] - bbox[0]; + height = bbox[3] - bbox[1]; + + if (xStep != width || yStep != height) + return gFalse; + + // calculate offsets + ctm = state->getCTM(); + for (i = 0; i < 6; ++i) { + savedCTM[i] = ctm[i]; + } + state->concatCTM(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + state->concatCTM(1, 0, 0, 1, bbox[0], bbox[1]); + ctm = state->getCTM(); + for (i = 0; i < 6; ++i) { + if (!isfinite(ctm[i])) + return gFalse; + } + matc[4] = x0 * xStep * ctm[0] + y0 * yStep * ctm[2] + ctm[4]; + matc[5] = x0 * xStep * ctm[1] + y0 * yStep * ctm[3] + ctm[5]; + if (splashAbs(ctm[1]) > splashAbs(ctm[0])) { + kx = -ctm[1]; + ky = ctm[2] - (ctm[0] * ctm[3]) / ctm[1]; + } else { + kx = ctm[0]; + ky = ctm[3] - (ctm[1] * ctm[2]) / ctm[0]; + } + result_width = (int) ceil(fabs(kx * width * (x1 - x0))); + result_height = (int) ceil(fabs(ky * height * (y1 - y0))); + kx = state->getHDPI() / 72.0; + ky = state->getVDPI() / 72.0; + m1.m[0] = (ptm[0] == 0) ? fabs(ptm[2]) * kx : fabs(ptm[0]) * kx; + m1.m[1] = 0; + m1.m[2] = 0; + m1.m[3] = (ptm[3] == 0) ? fabs(ptm[1]) * ky : fabs(ptm[3]) * ky; + m1.m[4] = 0; + m1.m[5] = 0; + m1.transform(width, height, &kx, &ky); + surface_width = (int) ceil (fabs(kx)); + surface_height = (int) ceil (fabs(ky)); + + sx = (double) result_width / (surface_width * (x1 - x0)); + sy = (double) result_height / (surface_height * (y1 - y0)); + m1.m[0] *= sx; + m1.m[3] *= sy; + m1.transform(width, height, &kx, &ky); + + if(fabs(kx) < 1 && fabs(ky) < 1) { + kx = std::min(kx, ky); + ky = 2 / kx; + m1.m[0] *= ky; + m1.m[3] *= ky; + m1.transform(width, height, &kx, &ky); + surface_width = (int) ceil (fabs(kx)); + surface_height = (int) ceil (fabs(ky)); + repeatX = x1 - x0; + repeatY = y1 - y0; + } else { + while(fabs(kx) > 16384 || fabs(ky) > 16384) { + // limit pattern bitmap size + m1.m[0] /= 2; + m1.m[3] /= 2; + m1.transform(width, height, &kx, &ky); + } + surface_width = (int) ceil (fabs(kx)); + surface_height = (int) ceil (fabs(ky)); + // adjust repeat values to completely fill region + repeatX = result_width / surface_width; + repeatY = result_height / surface_height; + if (surface_width * repeatX < result_width) + repeatX++; + if (surface_height * repeatY < result_height) + repeatY++; + if (x1 - x0 > repeatX) + repeatX = x1 - x0; + if (y1 - y0 > repeatY) + repeatY = y1 - y0; + } + // restore CTM and calculate rotate and scale with rounded matric + state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); + state->concatCTM(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + state->concatCTM(width * repeatX, 0, 0, height * repeatY, bbox[0], bbox[1]); + ctm = state->getCTM(); + matc[0] = ctm[0]; + matc[1] = ctm[1]; + matc[2] = ctm[2]; + matc[3] = ctm[3]; + + if (surface_width == 0 || surface_height == 0) + return gFalse; + m1.transform(bbox[0], bbox[1], &kx, &ky); + m1.m[4] = -kx; + m1.m[5] = -ky; + + bitmap = new SplashBitmap(surface_width, surface_height, colorMode != splashModeMono1, + (paintType == 1) ? colorMode : splashModeMono8, gTrue); + memset(bitmap->getAlphaPtr(), 0, bitmap->getWidth() * bitmap->getHeight()); + if (paintType == 2) { +#if SPLASH_CMYK + memset(bitmap->getDataPtr(), (colorMode == splashModeCMYK8) ? 0x00 : 0xFF, bitmap->getRowSize() * bitmap->getHeight()); +#else + memset(bitmap->getDataPtr(), 0xFF, bitmap->getRowSize() * bitmap->getHeight()); +#endif + } + splash = new Splash(bitmap, gTrue); + splash->setMinLineWidth(globalParams->getMinLineWidth()); + + box.x1 = bbox[0]; box.y1 = bbox[1]; + box.x2 = bbox[2]; box.y2 = bbox[3]; + gfx = new Gfx(doc, this, resDict, &box, NULL); + // set pattern transformation matrix + gfx->getState()->setCTM(m1.m[0], m1.m[1], m1.m[2], m1.m[3], m1.m[4], m1.m[5]); + updateCTM(gfx->getState(), m1.m[0], m1.m[1], m1.m[2], m1.m[3], m1.m[4], m1.m[5]); + gfx->display(str); + splash = formerSplash; + TilingSplashOutBitmap imgData; + imgData.bitmap = bitmap; + imgData.paintType = paintType; + imgData.pattern = splash->getFillPattern(); + imgData.colorMode = colorMode; + imgData.y = 0; + imgData.repeatX = repeatX; + imgData.repeatY = repeatY; + SplashBitmap *tBitmap = bitmap; + bitmap = formerBitmap; + result_width = tBitmap->getWidth() * imgData.repeatX; + result_height = tBitmap->getHeight() * imgData.repeatY; + + if (splashAbs(matc[1]) > splashAbs(matc[0])) { + kx = -matc[1]; + ky = matc[2] - (matc[0] * matc[3]) / matc[1]; + } else { + kx = matc[0]; + ky = matc[3] - (matc[1] * matc[2]) / matc[0]; + } + kx = result_width / (fabs(kx) + 1); + ky = result_height / (fabs(ky) + 1); + state->concatCTM(kx, 0, 0, ky, 0, 0); + ctm = state->getCTM(); + matc[0] = ctm[0]; + matc[1] = ctm[1]; + matc[2] = ctm[2]; + matc[3] = ctm[3]; + splash->drawImage(&tilingBitmapSrc, &imgData, colorMode, gTrue, result_width, result_height, matc, gTrue); + delete tBitmap; + delete gfx; + return gTrue; +} + +GBool SplashOutputDev::gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading) +{ + GfxColorSpaceMode shadingMode = shading->getColorSpace()->getMode(); + GBool bDirectColorTranslation = gFalse; // triggers an optimization. + switch (colorMode) { + case splashModeRGB8: + bDirectColorTranslation = (shadingMode == csDeviceRGB); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + bDirectColorTranslation = (shadingMode == csDeviceCMYK); + break; +#endif + default: + break; + } + SplashGouraudColor *splashShading = new SplashGouraudPattern(bDirectColorTranslation, state, shading, colorMode); + // restore vector antialias because we support it here + if (shading->isParameterized()) { + GBool vaa = getVectorAntialias(); + GBool retVal = gFalse; + setVectorAntialias(gTrue); + retVal = splash->gouraudTriangleShadedFill(splashShading); + setVectorAntialias(vaa); + return retVal; + } + return gFalse; +} + +GBool SplashOutputDev::univariateShadedFill(GfxState *state, SplashUnivariatePattern *pattern, double tMin, double tMax) { + double xMin, yMin, xMax, yMax; + SplashPath *path; + GBool vaa = getVectorAntialias(); + // restore vector antialias because we support it here + setVectorAntialias(gTrue); + + GBool retVal = gFalse; + // get the clip region bbox + if (pattern->getShading()->getHasBBox()) { + pattern->getShading()->getBBox(&xMin, &yMin, &xMax, &yMax); + } else { + state->getClipBBox(&xMin, &yMin, &xMax, &yMax); + + xMin = floor (xMin); + yMin = floor (yMin); + xMax = ceil (xMax); + yMax = ceil (yMax); + + { + Matrix ctm, ictm; + double x[4], y[4]; + int i; + + state->getCTM(&ctm); + ctm.invertTo(&ictm); + + ictm.transform(xMin, yMin, &x[0], &y[0]); + ictm.transform(xMax, yMin, &x[1], &y[1]); + ictm.transform(xMin, yMax, &x[2], &y[2]); + ictm.transform(xMax, yMax, &x[3], &y[3]); + + xMin = xMax = x[0]; + yMin = yMax = y[0]; + for (i = 1; i < 4; i++) { + xMin = std::min(xMin, x[i]); + yMin = std::min(yMin, y[i]); + xMax = std::max(xMax, x[i]); + yMax = std::max(yMax, y[i]); + } + } + } + + // fill the region + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + path = convertPath(state, state->getPath(), gTrue); + + setOverprintMask(pattern->getShading()->getColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), state->getFillColor()); + retVal = (splash->shadedFill(path, pattern->getShading()->getHasBBox(), pattern) == splashOk); + state->clearPath(); + setVectorAntialias(vaa); + delete path; + + return retVal; +} + +GBool SplashOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax) { + SplashAxialPattern *pattern = new SplashAxialPattern(colorMode, state, shading); + GBool retVal = univariateShadedFill(state, pattern, tMin, tMax); + + delete pattern; + + return retVal; +} + +GBool SplashOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double tMin, double tMax) { + SplashRadialPattern *pattern = new SplashRadialPattern(colorMode, state, shading); + GBool retVal = univariateShadedFill(state, pattern, tMin, tMax); + + delete pattern; + + return retVal; +} diff --git a/poppler/SplashOutputDev.h b/poppler/SplashOutputDev.h new file mode 100644 index 0000000..f1c87ec --- /dev/null +++ b/poppler/SplashOutputDev.h @@ -0,0 +1,420 @@ +//======================================================================== +// +// SplashOutputDev.h +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Takashi Iwai +// Copyright (C) 2009-2012 Thomas Freitag +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011 Andreas Hartmetz +// Copyright (C) 2011 Andrea Canciani +// Copyright (C) 2011 Adrian Johnson +// Copyright (C) 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHOUTPUTDEV_H +#define SPLASHOUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "splash/SplashTypes.h" +#include "splash/SplashPattern.h" +#include "poppler-config.h" +#include "OutputDev.h" +#include "GfxState.h" + +class PDFDoc; +class Gfx8BitFont; +class SplashBitmap; +class Splash; +class SplashPath; +class SplashFontEngine; +class SplashFont; +class T3FontCache; +struct T3FontCacheTag; +struct T3GlyphStack; +struct SplashTransparencyGroup; + +//------------------------------------------------------------------------ +// Splash dynamic pattern +//------------------------------------------------------------------------ + +class SplashUnivariatePattern: public SplashPattern { +public: + + SplashUnivariatePattern(SplashColorMode colorMode, GfxState *state, GfxUnivariateShading *shading); + + virtual ~SplashUnivariatePattern(); + + virtual GBool getColor(int x, int y, SplashColorPtr c); + + virtual GBool testPosition(int x, int y); + + virtual GBool isStatic() { return gFalse; } + + virtual GBool getParameter(double xs, double ys, double *t) = 0; + + virtual GfxUnivariateShading *getShading() { return shading; } + +protected: + Matrix ictm; + double t0, t1, dt; + GfxUnivariateShading *shading; + GfxState *state; + SplashColorMode colorMode; +}; + +class SplashAxialPattern: public SplashUnivariatePattern { +public: + + SplashAxialPattern(SplashColorMode colorMode, GfxState *state, GfxAxialShading *shading); + + virtual SplashPattern *copy() { return new SplashAxialPattern(colorMode, state, (GfxAxialShading *) shading); } + + virtual ~SplashAxialPattern(); + + virtual GBool getParameter(double xs, double ys, double *t); + +private: + double x0, y0, x1, y1; + double dx, dy, mul; +}; + +// see GfxState.h, GfxGouraudTriangleShading +class SplashGouraudPattern: public SplashGouraudColor { +public: + + SplashGouraudPattern(GBool bDirectColorTranslation, GfxState *state, GfxGouraudTriangleShading *shading, SplashColorMode mode); + + virtual SplashPattern *copy() { return new SplashGouraudPattern(bDirectColorTranslation, state, shading, mode); } + + virtual ~SplashGouraudPattern(); + + virtual GBool getColor(int x, int y, SplashColorPtr c) { return gFalse; } + + virtual GBool testPosition(int x, int y) { return gFalse; } + + virtual GBool isStatic() { return gFalse; } + + virtual GBool isParameterized() { return shading->isParameterized(); } + virtual int getNTriangles() { return shading->getNTriangles(); } + virtual void getTriangle(int i, double *x0, double *y0, double *color0, + double *x1, double *y1, double *color1, + double *x2, double *y2, double *color2) + { return shading->getTriangle(i, x0, y0, color0, x1, y1, color1, x2, y2, color2); } + + virtual void getParameterizedColor(double t, SplashColorMode mode, SplashColorPtr c); + +private: + GfxGouraudTriangleShading *shading; + GfxState *state; + GBool bDirectColorTranslation; + SplashColorMode mode; +}; + +// see GfxState.h, GfxRadialShading +class SplashRadialPattern: public SplashUnivariatePattern { +public: + + SplashRadialPattern(SplashColorMode colorMode, GfxState *state, GfxRadialShading *shading); + + virtual SplashPattern *copy() { return new SplashRadialPattern(colorMode, state, (GfxRadialShading *) shading); } + + virtual ~SplashRadialPattern(); + + virtual GBool getParameter(double xs, double ys, double *t); + +private: + double x0, y0, r0, dx, dy, dr; + double a, inva; +}; + +//------------------------------------------------------------------------ + +// number of Type 3 fonts to cache +#define splashOutT3FontCacheSize 8 + +//------------------------------------------------------------------------ +// SplashOutputDev +//------------------------------------------------------------------------ + +class SplashOutputDev: public OutputDev { +public: + + // Constructor. + SplashOutputDev(SplashColorMode colorModeA, int bitmapRowPadA, + GBool reverseVideoA, SplashColorPtr paperColorA, + GBool bitmapTopDownA = gTrue, + GBool allowAntialiasA = gTrue); + + // Destructor. + virtual ~SplashOutputDev(); + + //----- get info about output device + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gTrue; } + + // Does this device use functionShadedFill(), axialShadedFill(), and + // radialShadedFill()? If this returns false, these shaded fills + // will be reduced to a series of other drawing operations. + virtual GBool useShadedFills(int type) + { return (type >= 2 && type <= 5) ? gTrue : gFalse; } + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return bitmapTopDown ^ bitmapUpsideDown; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- save/restore graphics state + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateStrokeAdjust(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateBlendMode(GfxState *state); + virtual void updateFillOpacity(GfxState *state); + virtual void updateStrokeOpacity(GfxState *state); + virtual void updateFillOverprint(GfxState *state); + virtual void updateStrokeOverprint(GfxState *state); + virtual void updateOverprintMode(GfxState *state); + virtual void updateTransfer(GfxState *state); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *catalog, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double tMin, double tMax); + virtual GBool gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading); + + //----- path clipping + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + virtual void clipToStrokePath(GfxState *state); + + //----- text drawing + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + virtual void beginTextObject(GfxState *state); + virtual GBool deviceHasTextClip(GfxState *state) { return textClipPath; } + virtual void endTextObject(GfxState *state); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void setSoftMaskFromImageMask(GfxState *state, + Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix); + virtual void unsetSoftMaskFromImageMask(GfxState *state, double *baseMatrix); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate); + + //----- Type 3 font operators + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury); + + //----- transparency groups and soft masks + virtual GBool checkTransparencyGroup(GfxState *state, GBool knockout); + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask); + virtual void endTransparencyGroup(GfxState *state); + virtual void paintTransparencyGroup(GfxState *state, double *bbox); + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, + Function *transferFunc, GfxColor *backdropColor); + virtual void clearSoftMask(GfxState *state); + + //----- special access + + // Called to indicate that a new PDF document has been loaded. + void startDoc(PDFDoc *docA); + + void setPaperColor(SplashColorPtr paperColorA); + + GBool isReverseVideo() { return reverseVideo; } + void setReverseVideo(GBool reverseVideoA) { reverseVideo = reverseVideoA; } + + // Get the bitmap and its size. + SplashBitmap *getBitmap() { return bitmap; } + int getBitmapWidth(); + int getBitmapHeight(); + + // Returns the last rasterized bitmap, transferring ownership to the + // caller. + SplashBitmap *takeBitmap(); + + // Set this flag to true to generate an upside-down bitmap (useful + // for Windows BMP files). + void setBitmapUpsideDown(GBool f) { bitmapUpsideDown = f; } + + // Get the Splash object. + Splash *getSplash() { return splash; } + + // Get the modified region. + void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax); + + // Clear the modified region. + void clearModRegion(); + + SplashFont *getCurrentFont() { return font; } + + // If is true, don't draw horizontal text. + // If is true, don't draw rotated (non-horizontal) text. + void setSkipText(GBool skipHorizTextA, GBool skipRotatedTextA) + { skipHorizText = skipHorizTextA; skipRotatedText = skipRotatedTextA; } + + int getNestCount() { return nestCount; } + +#if 1 //~tmp: turn off anti-aliasing temporarily + virtual GBool getVectorAntialias(); + virtual void setVectorAntialias(GBool vaa); +#endif + + void setFreeTypeHinting(GBool enable, GBool enableSlightHinting); + +protected: + void doUpdateFont(GfxState *state); + +private: + GBool univariateShadedFill(GfxState *state, SplashUnivariatePattern *pattern, double tMin, double tMax); + + void setupScreenParams(double hDPI, double vDPI); + SplashPattern *getColor(GfxGray gray); + SplashPattern *getColor(GfxRGB *rgb); +#if SPLASH_CMYK + SplashPattern *getColor(GfxCMYK *cmyk); +#endif + void setOverprintMask(GfxColorSpace *colorSpace, GBool overprintFlag, + int overprintMode, GfxColor *singleColor, GBool grayIndexed = gFalse); + SplashPath *convertPath(GfxState *state, GfxPath *path, + GBool dropEmptySubpaths); + void drawType3Glyph(GfxState *state, T3FontCache *t3Font, + T3FontCacheTag *tag, Guchar *data); + static GBool imageMaskSrc(void *data, SplashColorPtr line); + static GBool imageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine); + static GBool alphaImageSrc(void *data, SplashColorPtr line, + Guchar *alphaLine); + static GBool maskedImageSrc(void *data, SplashColorPtr line, + Guchar *alphaLine); + static GBool tilingBitmapSrc(void *data, SplashColorPtr line, + Guchar *alphaLine); + + GBool keepAlphaChannel; // don't fill with paper color, keep alpha channel + + SplashColorMode colorMode; + int bitmapRowPad; + GBool bitmapTopDown; + GBool bitmapUpsideDown; + GBool allowAntialias; + GBool vectorAntialias; + GBool enableFreeTypeHinting; + GBool enableSlightHinting; + GBool reverseVideo; // reverse video mode + SplashColor paperColor; // paper color + SplashScreenParams screenParams; + GBool skipHorizText; + GBool skipRotatedText; + + PDFDoc *doc; // the current document + + SplashBitmap *bitmap; + Splash *splash; + SplashFontEngine *fontEngine; + + T3FontCache * // Type 3 font cache + t3FontCache[splashOutT3FontCacheSize]; + int nT3Fonts; // number of valid entries in t3FontCache + T3GlyphStack *t3GlyphStack; // Type 3 glyph context stack + GBool haveT3Dx; // set after seeing a d0/d1 operator + + SplashFont *font; // current font + GBool needFontUpdate; // set when the font needs to be updated + SplashPath *textClipPath; // clipping path built with text object + + SplashTransparencyGroup * // transparency group stack + transpGroupStack; + SplashBitmap *maskBitmap; // for image masks in pattern colorspace + int nestCount; +}; + +#endif diff --git a/poppler/StdinCachedFile.cc b/poppler/StdinCachedFile.cc new file mode 100644 index 0000000..db96637 --- /dev/null +++ b/poppler/StdinCachedFile.cc @@ -0,0 +1,47 @@ +//======================================================================== +// +// StdinCachedFile.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// Copyright 2010 Jonathan Liu +// +//======================================================================== + +#include + +#include "StdinCachedFile.h" + +#ifdef _WIN32 +#include // for O_BINARY +#include // for setmode +#endif +#include + +size_t StdinCacheLoader::init(GooString *dummy, CachedFile *cachedFile) +{ + size_t read, size = 0; + char buf[CachedFileChunkSize]; + +#ifdef _WIN32 + setmode(fileno(stdin), O_BINARY); +#endif + + CachedFileWriter writer = CachedFileWriter (cachedFile, NULL); + do { + read = fread(buf, 1, CachedFileChunkSize, stdin); + (writer.write) (buf, CachedFileChunkSize); + size += read; + } + while (read == CachedFileChunkSize); + + return size; +} + +int StdinCacheLoader::load(const std::vector &ranges, CachedFileWriter *writer) +{ + return 0; +} + diff --git a/poppler/StdinCachedFile.h b/poppler/StdinCachedFile.h new file mode 100644 index 0000000..5be6fa8 --- /dev/null +++ b/poppler/StdinCachedFile.h @@ -0,0 +1,27 @@ +//======================================================================== +// +// StdinCachedFile.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef STDINCACHELOADER_H +#define STDINCACHELOADER_H + +#include "CachedFile.h" + +class StdinCacheLoader : public CachedFileLoader { + +public: + + size_t init(GooString *dummy, CachedFile* cachedFile); + int load(const std::vector &ranges, CachedFileWriter *writer); + +}; + +#endif + diff --git a/poppler/StdinPDFDocBuilder.cc b/poppler/StdinPDFDocBuilder.cc new file mode 100644 index 0000000..571ee46 --- /dev/null +++ b/poppler/StdinPDFDocBuilder.cc @@ -0,0 +1,43 @@ +//======================================================================== +// +// StdinPDFDocBuilder.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#include + +#include "StdinPDFDocBuilder.h" +#include "CachedFile.h" +#include "StdinCachedFile.h" + +//------------------------------------------------------------------------ +// StdinPDFDocBuilder +//------------------------------------------------------------------------ + +PDFDoc * +StdinPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, + GooString *userPassword, void *guiDataA) +{ + Object obj; + + obj.initNull(); + CachedFile *cachedFile = new CachedFile(new StdinCacheLoader(), NULL); + return new PDFDoc(new CachedFileStream(cachedFile, 0, gFalse, + cachedFile->getLength(), &obj), + ownerPassword, userPassword); +} + +GBool StdinPDFDocBuilder::supports(const GooString &uri) +{ + if (uri.cmpN("fd://0", 6) == 0) { + return gTrue; + } else { + return gFalse; + } +} + diff --git a/poppler/StdinPDFDocBuilder.h b/poppler/StdinPDFDocBuilder.h new file mode 100644 index 0000000..e9b2f47 --- /dev/null +++ b/poppler/StdinPDFDocBuilder.h @@ -0,0 +1,33 @@ +//======================================================================== +// +// StdinPDFDocBuilder.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris +// Copyright 2010 Albert Astals Cid +// +//======================================================================== + +#ifndef STDINPDFDOCBUILDER_H +#define STDINPDFDOCBUILDER_H + +#include "PDFDocBuilder.h" + +//------------------------------------------------------------------------ +// StdinPDFDocBuilder +// +// The StdinPDFDocBuilder implements a PDFDocBuilder that read from stdin. +//------------------------------------------------------------------------ + +class StdinPDFDocBuilder : public PDFDocBuilder { + +public: + + PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = NULL, + GooString *userPassword = NULL, void *guiDataA = NULL); + GBool supports(const GooString &uri); + +}; + +#endif /* STDINPDFDOCBUILDER_H */ diff --git a/poppler/Stream-CCITT.h b/poppler/Stream-CCITT.h new file mode 100644 index 0000000..7207729 --- /dev/null +++ b/poppler/Stream-CCITT.h @@ -0,0 +1,478 @@ +//======================================================================== +// +// Stream-CCITT.h +// +// Tables for CCITT Fax decoding. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef STREAM_CCITT_H +#define STREAM_CCITT_H + +struct CCITTCode { + short bits; + short n; +}; + +#define ccittEOL -2 + +//------------------------------------------------------------------------ +// 2D codes +//------------------------------------------------------------------------ + +#define twoDimPass 0 +#define twoDimHoriz 1 +#define twoDimVert0 2 +#define twoDimVertR1 3 +#define twoDimVertL1 4 +#define twoDimVertR2 5 +#define twoDimVertL2 6 +#define twoDimVertR3 7 +#define twoDimVertL3 8 + +// 1-7 bit codes +static const CCITTCode twoDimTab1[128] = { + {-1, -1}, {-1, -1}, // 000000x + {7, twoDimVertL3}, // 0000010 + {7, twoDimVertR3}, // 0000011 + {6, twoDimVertL2}, {6, twoDimVertL2}, // 000010x + {6, twoDimVertR2}, {6, twoDimVertR2}, // 000011x + {4, twoDimPass}, {4, twoDimPass}, // 0001xxx + {4, twoDimPass}, {4, twoDimPass}, + {4, twoDimPass}, {4, twoDimPass}, + {4, twoDimPass}, {4, twoDimPass}, + {3, twoDimHoriz}, {3, twoDimHoriz}, // 001xxxx + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimVertL1}, {3, twoDimVertL1}, // 010xxxx + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, // 011xxxx + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {1, twoDimVert0}, {1, twoDimVert0}, // 1xxxxxx + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0} +}; + +//------------------------------------------------------------------------ +// white run lengths +//------------------------------------------------------------------------ + +// 11-12 bit codes (upper 7 bits are 0) +static const CCITTCode whiteTab1[32] = { + {-1, -1}, // 00000 + {12, ccittEOL}, // 00001 + {-1, -1}, {-1, -1}, // 0001x + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 001xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 010xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 011xx + {11, 1792}, {11, 1792}, // 1000x + {12, 1984}, // 10010 + {12, 2048}, // 10011 + {12, 2112}, // 10100 + {12, 2176}, // 10101 + {12, 2240}, // 10110 + {12, 2304}, // 10111 + {11, 1856}, {11, 1856}, // 1100x + {11, 1920}, {11, 1920}, // 1101x + {12, 2368}, // 11100 + {12, 2432}, // 11101 + {12, 2496}, // 11110 + {12, 2560} // 11111 +}; + +// 1-9 bit codes +static const CCITTCode whiteTab2[512] = { + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000000xx + {8, 29}, {8, 29}, // 00000010x + {8, 30}, {8, 30}, // 00000011x + {8, 45}, {8, 45}, // 00000100x + {8, 46}, {8, 46}, // 00000101x + {7, 22}, {7, 22}, {7, 22}, {7, 22}, // 0000011xx + {7, 23}, {7, 23}, {7, 23}, {7, 23}, // 0000100xx + {8, 47}, {8, 47}, // 00001010x + {8, 48}, {8, 48}, // 00001011x + {6, 13}, {6, 13}, {6, 13}, {6, 13}, // 000011xxx + {6, 13}, {6, 13}, {6, 13}, {6, 13}, + {7, 20}, {7, 20}, {7, 20}, {7, 20}, // 0001000xx + {8, 33}, {8, 33}, // 00010010x + {8, 34}, {8, 34}, // 00010011x + {8, 35}, {8, 35}, // 00010100x + {8, 36}, {8, 36}, // 00010101x + {8, 37}, {8, 37}, // 00010110x + {8, 38}, {8, 38}, // 00010111x + {7, 19}, {7, 19}, {7, 19}, {7, 19}, // 0001100xx + {8, 31}, {8, 31}, // 00011010x + {8, 32}, {8, 32}, // 00011011x + {6, 1}, {6, 1}, {6, 1}, {6, 1}, // 000111xxx + {6, 1}, {6, 1}, {6, 1}, {6, 1}, + {6, 12}, {6, 12}, {6, 12}, {6, 12}, // 001000xxx + {6, 12}, {6, 12}, {6, 12}, {6, 12}, + {8, 53}, {8, 53}, // 00100100x + {8, 54}, {8, 54}, // 00100101x + {7, 26}, {7, 26}, {7, 26}, {7, 26}, // 0010011xx + {8, 39}, {8, 39}, // 00101000x + {8, 40}, {8, 40}, // 00101001x + {8, 41}, {8, 41}, // 00101010x + {8, 42}, {8, 42}, // 00101011x + {8, 43}, {8, 43}, // 00101100x + {8, 44}, {8, 44}, // 00101101x + {7, 21}, {7, 21}, {7, 21}, {7, 21}, // 0010111xx + {7, 28}, {7, 28}, {7, 28}, {7, 28}, // 0011000xx + {8, 61}, {8, 61}, // 00110010x + {8, 62}, {8, 62}, // 00110011x + {8, 63}, {8, 63}, // 00110100x + {8, 0}, {8, 0}, // 00110101x + {8, 320}, {8, 320}, // 00110110x + {8, 384}, {8, 384}, // 00110111x + {5, 10}, {5, 10}, {5, 10}, {5, 10}, // 00111xxxx + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, // 01000xxxx + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {7, 27}, {7, 27}, {7, 27}, {7, 27}, // 0100100xx + {8, 59}, {8, 59}, // 01001010x + {8, 60}, {8, 60}, // 01001011x + {9, 1472}, // 010011000 + {9, 1536}, // 010011001 + {9, 1600}, // 010011010 + {9, 1728}, // 010011011 + {7, 18}, {7, 18}, {7, 18}, {7, 18}, // 0100111xx + {7, 24}, {7, 24}, {7, 24}, {7, 24}, // 0101000xx + {8, 49}, {8, 49}, // 01010010x + {8, 50}, {8, 50}, // 01010011x + {8, 51}, {8, 51}, // 01010100x + {8, 52}, {8, 52}, // 01010101x + {7, 25}, {7, 25}, {7, 25}, {7, 25}, // 0101011xx + {8, 55}, {8, 55}, // 01011000x + {8, 56}, {8, 56}, // 01011001x + {8, 57}, {8, 57}, // 01011010x + {8, 58}, {8, 58}, // 01011011x + {6, 192}, {6, 192}, {6, 192}, {6, 192}, // 010111xxx + {6, 192}, {6, 192}, {6, 192}, {6, 192}, + {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, // 011000xxx + {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, + {8, 448}, {8, 448}, // 01100100x + {8, 512}, {8, 512}, // 01100101x + {9, 704}, // 011001100 + {9, 768}, // 011001101 + {8, 640}, {8, 640}, // 01100111x + {8, 576}, {8, 576}, // 01101000x + {9, 832}, // 011010010 + {9, 896}, // 011010011 + {9, 960}, // 011010100 + {9, 1024}, // 011010101 + {9, 1088}, // 011010110 + {9, 1152}, // 011010111 + {9, 1216}, // 011011000 + {9, 1280}, // 011011001 + {9, 1344}, // 011011010 + {9, 1408}, // 011011011 + {7, 256}, {7, 256}, {7, 256}, {7, 256}, // 0110111xx + {4, 2}, {4, 2}, {4, 2}, {4, 2}, // 0111xxxxx + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, // 1000xxxxx + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, // 10010xxxx + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, // 10011xxxx + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, // 10100xxxx + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {6, 16}, {6, 16}, {6, 16}, {6, 16}, // 101010xxx + {6, 16}, {6, 16}, {6, 16}, {6, 16}, + {6, 17}, {6, 17}, {6, 17}, {6, 17}, // 101011xxx + {6, 17}, {6, 17}, {6, 17}, {6, 17}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, // 1011xxxxx + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 1100xxxxx + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {6, 14}, {6, 14}, {6, 14}, {6, 14}, // 110100xxx + {6, 14}, {6, 14}, {6, 14}, {6, 14}, + {6, 15}, {6, 15}, {6, 15}, {6, 15}, // 110101xxx + {6, 15}, {6, 15}, {6, 15}, {6, 15}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, // 11011xxxx + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 1110xxxxx + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, // 1111xxxxx + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7} +}; + +//------------------------------------------------------------------------ +// black run lengths +//------------------------------------------------------------------------ + +// 10-13 bit codes (upper 6 bits are 0) +static const CCITTCode blackTab1[128] = { + {-1, -1}, {-1, -1}, // 000000000000x + {12, ccittEOL}, {12, ccittEOL}, // 000000000001x + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000001xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000010xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000011xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000100xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000101xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000110xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000111xx + {11, 1792}, {11, 1792}, {11, 1792}, {11, 1792}, // 00000001000xx + {12, 1984}, {12, 1984}, // 000000010010x + {12, 2048}, {12, 2048}, // 000000010011x + {12, 2112}, {12, 2112}, // 000000010100x + {12, 2176}, {12, 2176}, // 000000010101x + {12, 2240}, {12, 2240}, // 000000010110x + {12, 2304}, {12, 2304}, // 000000010111x + {11, 1856}, {11, 1856}, {11, 1856}, {11, 1856}, // 00000001100xx + {11, 1920}, {11, 1920}, {11, 1920}, {11, 1920}, // 00000001101xx + {12, 2368}, {12, 2368}, // 000000011100x + {12, 2432}, {12, 2432}, // 000000011101x + {12, 2496}, {12, 2496}, // 000000011110x + {12, 2560}, {12, 2560}, // 000000011111x + {10, 18}, {10, 18}, {10, 18}, {10, 18}, // 0000001000xxx + {10, 18}, {10, 18}, {10, 18}, {10, 18}, + {12, 52}, {12, 52}, // 000000100100x + {13, 640}, // 0000001001010 + {13, 704}, // 0000001001011 + {13, 768}, // 0000001001100 + {13, 832}, // 0000001001101 + {12, 55}, {12, 55}, // 000000100111x + {12, 56}, {12, 56}, // 000000101000x + {13, 1280}, // 0000001010010 + {13, 1344}, // 0000001010011 + {13, 1408}, // 0000001010100 + {13, 1472}, // 0000001010101 + {12, 59}, {12, 59}, // 000000101011x + {12, 60}, {12, 60}, // 000000101100x + {13, 1536}, // 0000001011010 + {13, 1600}, // 0000001011011 + {11, 24}, {11, 24}, {11, 24}, {11, 24}, // 00000010111xx + {11, 25}, {11, 25}, {11, 25}, {11, 25}, // 00000011000xx + {13, 1664}, // 0000001100100 + {13, 1728}, // 0000001100101 + {12, 320}, {12, 320}, // 000000110011x + {12, 384}, {12, 384}, // 000000110100x + {12, 448}, {12, 448}, // 000000110101x + {13, 512}, // 0000001101100 + {13, 576}, // 0000001101101 + {12, 53}, {12, 53}, // 000000110111x + {12, 54}, {12, 54}, // 000000111000x + {13, 896}, // 0000001110010 + {13, 960}, // 0000001110011 + {13, 1024}, // 0000001110100 + {13, 1088}, // 0000001110101 + {13, 1152}, // 0000001110110 + {13, 1216}, // 0000001110111 + {10, 64}, {10, 64}, {10, 64}, {10, 64}, // 0000001111xxx + {10, 64}, {10, 64}, {10, 64}, {10, 64} +}; + +// 7-12 bit codes (upper 4 bits are 0) +static const CCITTCode blackTab2[192] = { + {8, 13}, {8, 13}, {8, 13}, {8, 13}, // 00000100xxxx + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {11, 23}, {11, 23}, // 00000101000x + {12, 50}, // 000001010010 + {12, 51}, // 000001010011 + {12, 44}, // 000001010100 + {12, 45}, // 000001010101 + {12, 46}, // 000001010110 + {12, 47}, // 000001010111 + {12, 57}, // 000001011000 + {12, 58}, // 000001011001 + {12, 61}, // 000001011010 + {12, 256}, // 000001011011 + {10, 16}, {10, 16}, {10, 16}, {10, 16}, // 0000010111xx + {10, 17}, {10, 17}, {10, 17}, {10, 17}, // 0000011000xx + {12, 48}, // 000001100100 + {12, 49}, // 000001100101 + {12, 62}, // 000001100110 + {12, 63}, // 000001100111 + {12, 30}, // 000001101000 + {12, 31}, // 000001101001 + {12, 32}, // 000001101010 + {12, 33}, // 000001101011 + {12, 40}, // 000001101100 + {12, 41}, // 000001101101 + {11, 22}, {11, 22}, // 00000110111x + {8, 14}, {8, 14}, {8, 14}, {8, 14}, // 00000111xxxx + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, // 0000100xxxxx + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, // 0000101xxxxx + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {9, 15}, {9, 15}, {9, 15}, {9, 15}, // 000011000xxx + {9, 15}, {9, 15}, {9, 15}, {9, 15}, + {12, 128}, // 000011001000 + {12, 192}, // 000011001001 + {12, 26}, // 000011001010 + {12, 27}, // 000011001011 + {12, 28}, // 000011001100 + {12, 29}, // 000011001101 + {11, 19}, {11, 19}, // 00001100111x + {11, 20}, {11, 20}, // 00001101000x + {12, 34}, // 000011010010 + {12, 35}, // 000011010011 + {12, 36}, // 000011010100 + {12, 37}, // 000011010101 + {12, 38}, // 000011010110 + {12, 39}, // 000011010111 + {11, 21}, {11, 21}, // 00001101100x + {12, 42}, // 000011011010 + {12, 43}, // 000011011011 + {10, 0}, {10, 0}, {10, 0}, {10, 0}, // 0000110111xx + {7, 12}, {7, 12}, {7, 12}, {7, 12}, // 0000111xxxxx + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12} +}; + +// 2-6 bit codes +static const CCITTCode blackTab3[64] = { + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000xx + {6, 9}, // 000100 + {6, 8}, // 000101 + {5, 7}, {5, 7}, // 00011x + {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 0010xx + {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 0011xx + {3, 1}, {3, 1}, {3, 1}, {3, 1}, // 010xxx + {3, 1}, {3, 1}, {3, 1}, {3, 1}, + {3, 4}, {3, 4}, {3, 4}, {3, 4}, // 011xxx + {3, 4}, {3, 4}, {3, 4}, {3, 4}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, // 10xxxx + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 2}, {2, 2}, {2, 2}, {2, 2}, // 11xxxx + {2, 2}, {2, 2}, {2, 2}, {2, 2}, + {2, 2}, {2, 2}, {2, 2}, {2, 2}, + {2, 2}, {2, 2}, {2, 2}, {2, 2} +}; + +#endif diff --git a/poppler/Stream.cc b/poppler/Stream.cc new file mode 100644 index 0000000..4ce6c00 --- /dev/null +++ b/poppler/Stream.cc @@ -0,0 +1,5251 @@ +//======================================================================== +// +// Stream.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Jeff Muizelaar +// Copyright (C) 2006-2010, 2012 Albert Astals Cid +// Copyright (C) 2007 Krzysztof Kowalczyk +// Copyright (C) 2008 Julien Rebetez +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009 Glenn Ganz +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Tomas Hoger +// Copyright (C) 2011, 2012 William Bader +// Copyright (C) 2012 Thomas Freitag +// Copyright (C) 2012 Oliver Sander +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "poppler-config.h" +#include "Error.h" +#include "Object.h" +#include "Lexer.h" +#include "GfxState.h" +#include "Stream.h" +#include "JBIG2Stream.h" +#include "Stream-CCITT.h" +#include "CachedFile.h" + +#ifdef ENABLE_LIBJPEG +#include "DCTStream.h" +#endif + +#ifdef ENABLE_ZLIB +#include "FlateStream.h" +#endif + +#ifdef ENABLE_LIBOPENJPEG +#include "JPEG2000Stream.h" +#else +#include "JPXStream.h" +#endif + +#ifdef __DJGPP__ +static GBool setDJSYSFLAGS = gFalse; +#endif + +#ifdef VMS +#ifdef __GNUC__ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif +#endif + +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +Stream::Stream() { + ref = 1; +} + +Stream::~Stream() { +} + +void Stream::close() { +} + +int Stream::getRawChar() { + error(errInternal, -1, "Internal: called getRawChar() on non-predictor stream"); + return EOF; +} + +int Stream::getChars(int nChars, Guchar *buffer) { + error(errInternal, -1, "Internal: called getChars() on non-predictor stream"); + return 0; +} + +void Stream::getRawChars(int nChars, int *buffer) { + error(errInternal, -1, "Internal: called getRawChars() on non-predictor stream"); +} + +char *Stream::getLine(char *buf, int size) { + int i; + int c; + + if (lookChar() == EOF || size < 0) + return NULL; + for (i = 0; i < size - 1; ++i) { + c = getChar(); + if (c == EOF || c == '\n') + break; + if (c == '\r') { + if ((c = lookChar()) == '\n') + getChar(); + break; + } + buf[i] = c; + } + buf[i] = '\0'; + return buf; +} + +GooString *Stream::getPSFilter(int psLevel, const char *indent) { + return new GooString(); +} + +Stream *Stream::addFilters(Object *dict) { + Object obj, obj2; + Object params, params2; + Stream *str; + int i; + + str = this; + dict->dictLookup("Filter", &obj); + if (obj.isNull()) { + obj.free(); + dict->dictLookup("F", &obj); + } + dict->dictLookup("DecodeParms", ¶ms); + if (params.isNull()) { + params.free(); + dict->dictLookup("DP", ¶ms); + } + if (obj.isName()) { + str = makeFilter(obj.getName(), str, ¶ms); + } else if (obj.isArray()) { + for (i = 0; i < obj.arrayGetLength(); ++i) { + obj.arrayGet(i, &obj2); + if (params.isArray()) + params.arrayGet(i, ¶ms2); + else + params2.initNull(); + if (obj2.isName()) { + str = makeFilter(obj2.getName(), str, ¶ms2); + } else { + error(errSyntaxError, getPos(), "Bad filter name"); + str = new EOFStream(str); + } + obj2.free(); + params2.free(); + } + } else if (!obj.isNull()) { + error(errSyntaxError, getPos(), "Bad 'Filter' attribute in stream"); + } + obj.free(); + params.free(); + + return str; +} + +Stream *Stream::makeFilter(char *name, Stream *str, Object *params) { + int pred; // parameters + int colors; + int bits; + int early; + int encoding; + GBool endOfLine, byteAlign, endOfBlock, black; + int columns, rows; + int colorXform; + Object globals, obj; + + if (!strcmp(name, "ASCIIHexDecode") || !strcmp(name, "AHx")) { + str = new ASCIIHexStream(str); + } else if (!strcmp(name, "ASCII85Decode") || !strcmp(name, "A85")) { + str = new ASCII85Stream(str); + } else if (!strcmp(name, "LZWDecode") || !strcmp(name, "LZW")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + early = 1; + if (params->isDict()) { + params->dictLookup("Predictor", &obj); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + params->dictLookup("EarlyChange", &obj); + if (obj.isInt()) + early = obj.getInt(); + obj.free(); + } + str = new LZWStream(str, pred, columns, colors, bits, early); + } else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) { + str = new RunLengthStream(str); + } else if (!strcmp(name, "CCITTFaxDecode") || !strcmp(name, "CCF")) { + encoding = 0; + endOfLine = gFalse; + byteAlign = gFalse; + columns = 1728; + rows = 0; + endOfBlock = gTrue; + black = gFalse; + if (params->isDict()) { + params->dictLookup("K", &obj); + if (obj.isInt()) { + encoding = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfLine", &obj); + if (obj.isBool()) { + endOfLine = obj.getBool(); + } + obj.free(); + params->dictLookup("EncodedByteAlign", &obj); + if (obj.isBool()) { + byteAlign = obj.getBool(); + } + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) { + columns = obj.getInt(); + } + obj.free(); + params->dictLookup("Rows", &obj); + if (obj.isInt()) { + rows = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfBlock", &obj); + if (obj.isBool()) { + endOfBlock = obj.getBool(); + } + obj.free(); + params->dictLookup("BlackIs1", &obj); + if (obj.isBool()) { + black = obj.getBool(); + } + obj.free(); + } + str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign, + columns, rows, endOfBlock, black); + } else if (!strcmp(name, "DCTDecode") || !strcmp(name, "DCT")) { + colorXform = -1; + if (params->isDict()) { + if (params->dictLookup("ColorTransform", &obj)->isInt()) { + colorXform = obj.getInt(); + } + obj.free(); + } + str = new DCTStream(str, colorXform); + } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + if (params->isDict()) { + params->dictLookup("Predictor", &obj); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + } + str = new FlateStream(str, pred, columns, colors, bits); + } else if (!strcmp(name, "JBIG2Decode")) { + if (params->isDict()) { + params->dictLookup("JBIG2Globals", &globals); + } + str = new JBIG2Stream(str, &globals); + globals.free(); + } else if (!strcmp(name, "JPXDecode")) { + str = new JPXStream(str); + } else { + error(errSyntaxError, getPos(), "Unknown filter '{0:s}'", name); + str = new EOFStream(str); + } + return str; +} + +//------------------------------------------------------------------------ +// OutStream +//------------------------------------------------------------------------ +OutStream::OutStream () +{ + ref = 1; +} + +OutStream::~OutStream () +{ +} + +//------------------------------------------------------------------------ +// FileOutStream +//------------------------------------------------------------------------ +FileOutStream::FileOutStream (FILE* fa, Guint startA) +{ + f = fa; + start = startA; +} + +FileOutStream::~FileOutStream () +{ + close (); +} + +void FileOutStream::close () +{ + +} + +int FileOutStream::getPos () +{ + return ftell(f); +} + +void FileOutStream::put (char c) +{ + fputc(c,f); +} + +void FileOutStream::printf(const char *format, ...) +{ + va_list argptr; + va_start (argptr, format); + vfprintf(f, format, argptr); + va_end (argptr); +} + + +//------------------------------------------------------------------------ +// BaseStream +//------------------------------------------------------------------------ + +BaseStream::BaseStream(Object *dictA, Guint lengthA) { + dict = *dictA; + length = lengthA; +} + +BaseStream::~BaseStream() { + dict.free(); +} + +//------------------------------------------------------------------------ +// FilterStream +//------------------------------------------------------------------------ + +FilterStream::FilterStream(Stream *strA) { + str = strA; +} + +FilterStream::~FilterStream() { +} + +void FilterStream::close() { + str->close(); +} + +void FilterStream::setPos(Guint pos, int dir) { + error(errInternal, -1, "Internal: called setPos() on FilterStream"); +} + +//------------------------------------------------------------------------ +// ImageStream +//------------------------------------------------------------------------ + +ImageStream::ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA) { + int imgLineSize; + + str = strA; + width = widthA; + nComps = nCompsA; + nBits = nBitsA; + + nVals = width * nComps; + inputLineSize = (nVals * nBits + 7) >> 3; + if (nVals > INT_MAX / nBits - 7) { + // force a call to gmallocn(-1,...), which will throw an exception + inputLineSize = -1; + } + inputLine = (Guchar *)gmallocn(inputLineSize, sizeof(char)); + if (nBits == 8) { + imgLine = (Guchar *)inputLine; + } else { + if (nBits == 1) { + imgLineSize = (nVals + 7) & ~7; + } else { + imgLineSize = nVals; + } + if (width > INT_MAX / nComps) { + // force a call to gmallocn(-1,...), which will throw an exception + imgLineSize = -1; + } + imgLine = (Guchar *)gmallocn(imgLineSize, sizeof(Guchar)); + } + imgIdx = nVals; +} + +ImageStream::~ImageStream() { + if (imgLine != (Guchar *)inputLine) { + gfree(imgLine); + } + gfree(inputLine); +} + +void ImageStream::reset() { + str->reset(); +} + +void ImageStream::close() { + str->close(); +} + +GBool ImageStream::getPixel(Guchar *pix) { + int i; + + if (imgIdx >= nVals) { + if (!getLine()) { + return gFalse; + } + imgIdx = 0; + } + for (i = 0; i < nComps; ++i) { + pix[i] = imgLine[imgIdx++]; + } + return gTrue; +} + +Guchar *ImageStream::getLine() { + Gulong buf, bitMask; + int bits; + int c; + int i; + Guchar *p; + + int readChars = str->doGetChars(inputLineSize, inputLine); + for ( ; readChars < inputLineSize; readChars++) inputLine[readChars] = EOF; + if (nBits == 1) { + p = inputLine; + for (i = 0; i < nVals; i += 8) { + c = *p++; + imgLine[i+0] = (Guchar)((c >> 7) & 1); + imgLine[i+1] = (Guchar)((c >> 6) & 1); + imgLine[i+2] = (Guchar)((c >> 5) & 1); + imgLine[i+3] = (Guchar)((c >> 4) & 1); + imgLine[i+4] = (Guchar)((c >> 3) & 1); + imgLine[i+5] = (Guchar)((c >> 2) & 1); + imgLine[i+6] = (Guchar)((c >> 1) & 1); + imgLine[i+7] = (Guchar)(c & 1); + } + } else if (nBits == 8) { + // special case: imgLine == inputLine + } else if (nBits == 16) { + // this is a hack to support 16 bits images, everywhere + // we assume a component fits in 8 bits, with this hack + // we treat 16 bit images as 8 bit ones until it's fixed correctly. + // The hack has another part on GfxImageColorMap::GfxImageColorMap + p = inputLine; + for (i = 0; i < nVals; ++i) { + imgLine[i] = *p++; + p++; + } + } else { + bitMask = (1 << nBits) - 1; + buf = 0; + bits = 0; + p = inputLine; + for (i = 0; i < nVals; ++i) { + if (bits < nBits) { + buf = (buf << 8) | (*p++ & 0xff); + bits += 8; + } + imgLine[i] = (Guchar)((buf >> (bits - nBits)) & bitMask); + bits -= nBits; + } + } + return imgLine; +} + +void ImageStream::skipLine() { + str->doGetChars(inputLineSize, inputLine); +} + +//------------------------------------------------------------------------ +// StreamPredictor +//------------------------------------------------------------------------ + +StreamPredictor::StreamPredictor(Stream *strA, int predictorA, + int widthA, int nCompsA, int nBitsA) { + str = strA; + predictor = predictorA; + width = widthA; + nComps = nCompsA; + nBits = nBitsA; + predLine = NULL; + ok = gFalse; + + nVals = width * nComps; + pixBytes = (nComps * nBits + 7) >> 3; + rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; + if (width <= 0 || nComps <= 0 || nBits <= 0 || + nComps > gfxColorMaxComps || + nBits > 16 || + width >= INT_MAX / nComps || // check for overflow in nVals + nVals >= (INT_MAX - 7) / nBits) { // check for overflow in rowBytes + return; + } + predLine = (Guchar *)gmalloc(rowBytes); + memset(predLine, 0, rowBytes); + predIdx = rowBytes; + + ok = gTrue; +} + +StreamPredictor::~StreamPredictor() { + gfree(predLine); +} + +int StreamPredictor::lookChar() { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + return EOF; + } + } + return predLine[predIdx]; +} + +int StreamPredictor::getChar() { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + return EOF; + } + } + return predLine[predIdx++]; +} + +int StreamPredictor::getChars(int nChars, Guchar *buffer) { + int n, m; + + n = 0; + while (n < nChars) { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + break; + } + } + m = rowBytes - predIdx; + if (m > nChars - n) { + m = nChars - n; + } + memcpy(buffer + n, predLine + predIdx, m); + predIdx += m; + n += m; + } + return n; +} + +GBool StreamPredictor::getNextLine() { + int curPred; + Guchar upLeftBuf[gfxColorMaxComps * 2 + 1]; + int left, up, upLeft, p, pa, pb, pc; + int c; + Gulong inBuf, outBuf, bitMask; + int inBits, outBits; + int i, j, k, kk; + + // get PNG optimum predictor number + if (predictor >= 10) { + if ((curPred = str->getRawChar()) == EOF) { + return gFalse; + } + curPred += 10; + } else { + curPred = predictor; + } + + // read the raw line, apply PNG (byte) predictor + int *rawCharLine = new int[rowBytes - pixBytes]; + str->getRawChars(rowBytes - pixBytes, rawCharLine); + memset(upLeftBuf, 0, pixBytes + 1); + for (i = pixBytes; i < rowBytes; ++i) { + for (j = pixBytes; j > 0; --j) { + upLeftBuf[j] = upLeftBuf[j-1]; + } + upLeftBuf[0] = predLine[i]; + if ((c = rawCharLine[i - pixBytes]) == EOF) { + if (i > pixBytes) { + // this ought to return false, but some (broken) PDF files + // contain truncated image data, and Adobe apparently reads the + // last partial line + break; + } + delete[] rawCharLine; + return gFalse; + } + switch (curPred) { + case 11: // PNG sub + predLine[i] = predLine[i - pixBytes] + (Guchar)c; + break; + case 12: // PNG up + predLine[i] = predLine[i] + (Guchar)c; + break; + case 13: // PNG average + predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) + + (Guchar)c; + break; + case 14: // PNG Paeth + left = predLine[i - pixBytes]; + up = predLine[i]; + upLeft = upLeftBuf[pixBytes]; + p = left + up - upLeft; + if ((pa = p - left) < 0) + pa = -pa; + if ((pb = p - up) < 0) + pb = -pb; + if ((pc = p - upLeft) < 0) + pc = -pc; + if (pa <= pb && pa <= pc) + predLine[i] = left + (Guchar)c; + else if (pb <= pc) + predLine[i] = up + (Guchar)c; + else + predLine[i] = upLeft + (Guchar)c; + break; + case 10: // PNG none + default: // no predictor or TIFF predictor + predLine[i] = (Guchar)c; + break; + } + } + delete[] rawCharLine; + + // apply TIFF (component) predictor + if (predictor == 2) { + if (nBits == 1) { + inBuf = predLine[pixBytes - 1]; + for (i = pixBytes; i < rowBytes; i += 8) { + // 1-bit add is just xor + inBuf = (inBuf << 8) | predLine[i]; + predLine[i] ^= inBuf >> nComps; + } + } else if (nBits == 8) { + for (i = pixBytes; i < rowBytes; ++i) { + predLine[i] += predLine[i - nComps]; + } + } else { + memset(upLeftBuf, 0, nComps + 1); + bitMask = (1 << nBits) - 1; + inBuf = outBuf = 0; + inBits = outBits = 0; + j = k = pixBytes; + for (i = 0; i < width; ++i) { + for (kk = 0; kk < nComps; ++kk) { + if (inBits < nBits) { + inBuf = (inBuf << 8) | (predLine[j++] & 0xff); + inBits += 8; + } + upLeftBuf[kk] = (Guchar)((upLeftBuf[kk] + + (inBuf >> (inBits - nBits))) & bitMask); + inBits -= nBits; + outBuf = (outBuf << nBits) | upLeftBuf[kk]; + outBits += nBits; + if (outBits >= 8) { + predLine[k++] = (Guchar)(outBuf >> (outBits - 8)); + outBits -= 8; + } + } + } + if (outBits > 0) { + predLine[k++] = (Guchar)((outBuf << (8 - outBits)) + + (inBuf & ((1 << (8 - outBits)) - 1))); + } + } + } + + // reset to start of line + predIdx = pixBytes; + + return gTrue; +} + +//------------------------------------------------------------------------ +// FileStream +//------------------------------------------------------------------------ + +FileStream::FileStream(FILE *fA, Guint startA, GBool limitedA, + Guint lengthA, Object *dictA): + BaseStream(dictA, lengthA) { + f = fA; + start = startA; + limited = limitedA; + length = lengthA; + bufPtr = bufEnd = buf; + bufPos = start; + savePos = 0; + saved = gFalse; +} + +FileStream::~FileStream() { + close(); +} + +Stream *FileStream::makeSubStream(Guint startA, GBool limitedA, + Guint lengthA, Object *dictA) { + return new FileStream(f, startA, limitedA, lengthA, dictA); +} + +void FileStream::reset() { +#if HAVE_FSEEKO + savePos = (Guint)ftello(f); + fseeko(f, start, SEEK_SET); +#elif HAVE_FSEEK64 + savePos = (Guint)ftell64(f); + fseek64(f, start, SEEK_SET); +#else + savePos = (Guint)ftell(f); + fseek(f, start, SEEK_SET); +#endif + saved = gTrue; + bufPtr = bufEnd = buf; + bufPos = start; +} + +void FileStream::close() { + if (saved) { +#if HAVE_FSEEKO + fseeko(f, savePos, SEEK_SET); +#elif HAVE_FSEEK64 + fseek64(f, savePos, SEEK_SET); +#else + fseek(f, savePos, SEEK_SET); +#endif + saved = gFalse; + } +} + +GBool FileStream::fillBuf() { + int n; + + bufPos += bufEnd - buf; + bufPtr = bufEnd = buf; + if (limited && bufPos >= start + length) { + return gFalse; + } + if (limited && bufPos + fileStreamBufSize > start + length) { + n = start + length - bufPos; + } else { + n = fileStreamBufSize; + } + n = fread(buf, 1, n, f); + bufEnd = buf + n; + if (bufPtr >= bufEnd) { + return gFalse; + } + return gTrue; +} + +void FileStream::setPos(Guint pos, int dir) { + Guint size; + + if (dir >= 0) { +#if HAVE_FSEEKO + fseeko(f, pos, SEEK_SET); +#elif HAVE_FSEEK64 + fseek64(f, pos, SEEK_SET); +#else + fseek(f, pos, SEEK_SET); +#endif + bufPos = pos; + } else { +#if HAVE_FSEEKO + fseeko(f, 0, SEEK_END); + size = (Guint)ftello(f); +#elif HAVE_FSEEK64 + fseek64(f, 0, SEEK_END); + size = (Guint)ftell64(f); +#else + fseek(f, 0, SEEK_END); + size = (Guint)ftell(f); +#endif + if (pos > size) + pos = (Guint)size; +#if HAVE_FSEEKO + fseeko(f, -(int)pos, SEEK_END); + bufPos = (Guint)ftello(f); +#elif HAVE_FSEEK64 + fseek64(f, -(int)pos, SEEK_END); + bufPos = (Guint)ftell64(f); +#else + fseek(f, -(int)pos, SEEK_END); + bufPos = (Guint)ftell(f); +#endif + } + bufPtr = bufEnd = buf; +} + +void FileStream::moveStart(int delta) { + start += delta; + bufPtr = bufEnd = buf; + bufPos = start; +} + +//------------------------------------------------------------------------ +// CachedFileStream +//------------------------------------------------------------------------ + +CachedFileStream::CachedFileStream(CachedFile *ccA, Guint startA, + GBool limitedA, Guint lengthA, Object *dictA) + : BaseStream(dictA, lengthA) +{ + cc = ccA; + start = startA; + limited = limitedA; + length = lengthA; + bufPtr = bufEnd = buf; + bufPos = start; + savePos = 0; + saved = gFalse; +} + +CachedFileStream::~CachedFileStream() +{ + close(); + cc->decRefCnt(); +} + +Stream *CachedFileStream::makeSubStream(Guint startA, GBool limitedA, + Guint lengthA, Object *dictA) +{ + cc->incRefCnt(); + return new CachedFileStream(cc, startA, limitedA, lengthA, dictA); +} + +void CachedFileStream::reset() +{ + savePos = (Guint)cc->tell(); + cc->seek(start, SEEK_SET); + + saved = gTrue; + bufPtr = bufEnd = buf; + bufPos = start; +} + +void CachedFileStream::close() +{ + if (saved) { + cc->seek(savePos, SEEK_SET); + saved = gFalse; + } +} + +GBool CachedFileStream::fillBuf() +{ + int n; + + bufPos += bufEnd - buf; + bufPtr = bufEnd = buf; + if (limited && bufPos >= start + length) { + return gFalse; + } + if (limited && bufPos + cachedStreamBufSize > start + length) { + n = start + length - bufPos; + } else { + n = cachedStreamBufSize - (bufPos % cachedStreamBufSize); + } + cc->read(buf, 1, n); + bufEnd = buf + n; + if (bufPtr >= bufEnd) { + return gFalse; + } + return gTrue; +} + +void CachedFileStream::setPos(Guint pos, int dir) +{ + Guint size; + + if (dir >= 0) { + cc->seek(pos, SEEK_SET); + bufPos = pos; + } else { + cc->seek(0, SEEK_END); + size = (Guint)cc->tell(); + + if (pos > size) + pos = (Guint)size; + + cc->seek(-(int)pos, SEEK_END); + bufPos = (Guint)cc->tell(); + } + + bufPtr = bufEnd = buf; +} + +void CachedFileStream::moveStart(int delta) +{ + start += delta; + bufPtr = bufEnd = buf; + bufPos = start; +} + +//------------------------------------------------------------------------ +// MemStream +//------------------------------------------------------------------------ + +MemStream::MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA): + BaseStream(dictA, lengthA) { + buf = bufA; + start = startA; + length = lengthA; + bufEnd = buf + start + length; + bufPtr = buf + start; + needFree = gFalse; +} + +MemStream::~MemStream() { + if (needFree) { + gfree(buf); + } +} + +Stream *MemStream::makeSubStream(Guint startA, GBool limited, + Guint lengthA, Object *dictA) { + MemStream *subStr; + Guint newLength; + + if (!limited || startA + lengthA > start + length) { + newLength = start + length - startA; + } else { + newLength = lengthA; + } + subStr = new MemStream(buf, startA, newLength, dictA); + return subStr; +} + +void MemStream::reset() { + bufPtr = buf + start; +} + +void MemStream::close() { +} + +int MemStream::getChars(int nChars, Guchar *buffer) { + int n; + + if (nChars <= 0) { + return 0; + } + if (bufEnd - bufPtr < nChars) { + n = (int)(bufEnd - bufPtr); + } else { + n = nChars; + } + memcpy(buffer, bufPtr, n); + bufPtr += n; + return n; +} + +void MemStream::setPos(Guint pos, int dir) { + Guint i; + + if (dir >= 0) { + i = pos; + } else { + i = start + length - pos; + } + if (i < start) { + i = start; + } else if (i > start + length) { + i = start + length; + } + bufPtr = buf + i; +} + +void MemStream::moveStart(int delta) { + start += delta; + length -= delta; + bufPtr = buf + start; +} + +//------------------------------------------------------------------------ +// EmbedStream +//------------------------------------------------------------------------ + +EmbedStream::EmbedStream(Stream *strA, Object *dictA, + GBool limitedA, Guint lengthA): + BaseStream(dictA, lengthA) { + str = strA; + limited = limitedA; + length = lengthA; +} + +EmbedStream::~EmbedStream() { +} + +Stream *EmbedStream::makeSubStream(Guint start, GBool limitedA, + Guint lengthA, Object *dictA) { + error(errInternal, -1, "Called makeSubStream() on EmbedStream"); + return NULL; +} + +int EmbedStream::getChar() { + if (limited && !length) { + return EOF; + } + --length; + return str->getChar(); +} + +int EmbedStream::lookChar() { + if (limited && !length) { + return EOF; + } + return str->lookChar(); +} + +int EmbedStream::getChars(int nChars, Guchar *buffer) { + if (nChars <= 0) { + return 0; + } + if (limited && length < (Guint)nChars) { + nChars = (int)length; + } + return str->doGetChars(nChars, buffer); +} + +void EmbedStream::setPos(Guint pos, int dir) { + error(errInternal, -1, "Internal: called setPos() on EmbedStream"); +} + +Guint EmbedStream::getStart() { + error(errInternal, -1, "Internal: called getStart() on EmbedStream"); + return 0; +} + +void EmbedStream::moveStart(int delta) { + error(errInternal, -1, "Internal: called moveStart() on EmbedStream"); +} + +//------------------------------------------------------------------------ +// ASCIIHexStream +//------------------------------------------------------------------------ + +ASCIIHexStream::ASCIIHexStream(Stream *strA): + FilterStream(strA) { + buf = EOF; + eof = gFalse; +} + +ASCIIHexStream::~ASCIIHexStream() { + delete str; +} + +void ASCIIHexStream::reset() { + str->reset(); + buf = EOF; + eof = gFalse; +} + +int ASCIIHexStream::lookChar() { + int c1, c2, x; + + if (buf != EOF) + return buf; + if (eof) { + buf = EOF; + return EOF; + } + do { + c1 = str->getChar(); + } while (isspace(c1)); + if (c1 == '>') { + eof = gTrue; + buf = EOF; + return buf; + } + do { + c2 = str->getChar(); + } while (isspace(c2)); + if (c2 == '>') { + eof = gTrue; + c2 = '0'; + } + if (c1 >= '0' && c1 <= '9') { + x = (c1 - '0') << 4; + } else if (c1 >= 'A' && c1 <= 'F') { + x = (c1 - 'A' + 10) << 4; + } else if (c1 >= 'a' && c1 <= 'f') { + x = (c1 - 'a' + 10) << 4; + } else if (c1 == EOF) { + eof = gTrue; + x = 0; + } else { + error(errSyntaxError, getPos(), + "Illegal character <{0:02x}> in ASCIIHex stream", c1); + x = 0; + } + if (c2 >= '0' && c2 <= '9') { + x += c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + x += c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + x += c2 - 'a' + 10; + } else if (c2 == EOF) { + eof = gTrue; + x = 0; + } else { + error(errSyntaxError, getPos(), + "Illegal character <{0:02x}> in ASCIIHex stream", c2); + } + buf = x & 0xff; + return buf; +} + +GooString *ASCIIHexStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("/ASCIIHexDecode filter\n"); + return s; +} + +GBool ASCIIHexStream::isBinary(GBool last) { + return str->isBinary(gFalse); +} + +//------------------------------------------------------------------------ +// ASCII85Stream +//------------------------------------------------------------------------ + +ASCII85Stream::ASCII85Stream(Stream *strA): + FilterStream(strA) { + index = n = 0; + eof = gFalse; +} + +ASCII85Stream::~ASCII85Stream() { + delete str; +} + +void ASCII85Stream::reset() { + str->reset(); + index = n = 0; + eof = gFalse; +} + +int ASCII85Stream::lookChar() { + int k; + Gulong t; + + if (index >= n) { + if (eof) + return EOF; + index = 0; + do { + c[0] = str->getChar(); + } while (Lexer::isSpace(c[0])); + if (c[0] == '~' || c[0] == EOF) { + eof = gTrue; + n = 0; + return EOF; + } else if (c[0] == 'z') { + b[0] = b[1] = b[2] = b[3] = 0; + n = 4; + } else { + for (k = 1; k < 5; ++k) { + do { + c[k] = str->getChar(); + } while (Lexer::isSpace(c[k])); + if (c[k] == '~' || c[k] == EOF) + break; + } + n = k - 1; + if (k < 5 && (c[k] == '~' || c[k] == EOF)) { + for (++k; k < 5; ++k) + c[k] = 0x21 + 84; + eof = gTrue; + } + t = 0; + for (k = 0; k < 5; ++k) + t = t * 85 + (c[k] - 0x21); + for (k = 3; k >= 0; --k) { + b[k] = (int)(t & 0xff); + t >>= 8; + } + } + } + return b[index]; +} + +GooString *ASCII85Stream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("/ASCII85Decode filter\n"); + return s; +} + +GBool ASCII85Stream::isBinary(GBool last) { + return str->isBinary(gFalse); +} + +//------------------------------------------------------------------------ +// LZWStream +//------------------------------------------------------------------------ + +LZWStream::LZWStream(Stream *strA, int predictor, int columns, int colors, + int bits, int earlyA): + FilterStream(strA) { + if (predictor != 1) { + pred = new StreamPredictor(this, predictor, columns, colors, bits); + if (!pred->isOk()) { + delete pred; + pred = NULL; + } + } else { + pred = NULL; + } + early = earlyA; + eof = gFalse; + inputBits = 0; + clearTable(); +} + +LZWStream::~LZWStream() { + if (pred) { + delete pred; + } + delete str; +} + +int LZWStream::getChar() { + if (pred) { + return pred->getChar(); + } + if (eof) { + return EOF; + } + if (seqIndex >= seqLength) { + if (!processNextCode()) { + return EOF; + } + } + return seqBuf[seqIndex++]; +} + +int LZWStream::lookChar() { + if (pred) { + return pred->lookChar(); + } + if (eof) { + return EOF; + } + if (seqIndex >= seqLength) { + if (!processNextCode()) { + return EOF; + } + } + return seqBuf[seqIndex]; +} + +void LZWStream::getRawChars(int nChars, int *buffer) { + for (int i = 0; i < nChars; ++i) + buffer[i] = doGetRawChar(); +} + +int LZWStream::getRawChar() { + return doGetRawChar(); +} + +int LZWStream::getChars(int nChars, Guchar *buffer) { + int n, m; + + if (pred) { + return pred->getChars(nChars, buffer); + } + if (eof) { + return 0; + } + n = 0; + while (n < nChars) { + if (seqIndex >= seqLength) { + if (!processNextCode()) { + break; + } + } + m = seqLength - seqIndex; + if (m > nChars - n) { + m = nChars - n; + } + memcpy(buffer + n, seqBuf + seqIndex, m); + seqIndex += m; + n += m; + } + return n; +} + +void LZWStream::reset() { + str->reset(); + eof = gFalse; + inputBits = 0; + clearTable(); +} + +GBool LZWStream::processNextCode() { + int code; + int nextLength; + int i, j; + + // check for EOF + if (eof) { + return gFalse; + } + + // check for eod and clear-table codes + start: + code = getCode(); + if (code == EOF || code == 257) { + eof = gTrue; + return gFalse; + } + if (code == 256) { + clearTable(); + goto start; + } + if (nextCode >= 4097) { + error(errSyntaxError, getPos(), + "Bad LZW stream - expected clear-table code"); + clearTable(); + } + + // process the next code + nextLength = seqLength + 1; + if (code < 256) { + seqBuf[0] = code; + seqLength = 1; + } else if (code < nextCode) { + seqLength = table[code].length; + for (i = seqLength - 1, j = code; i > 0; --i) { + seqBuf[i] = table[j].tail; + j = table[j].head; + } + seqBuf[0] = j; + } else if (code == nextCode) { + seqBuf[seqLength] = newChar; + ++seqLength; + } else { + error(errSyntaxError, getPos(), "Bad LZW stream - unexpected code"); + eof = gTrue; + return gFalse; + } + newChar = seqBuf[0]; + if (first) { + first = gFalse; + } else { + table[nextCode].length = nextLength; + table[nextCode].head = prevCode; + table[nextCode].tail = newChar; + ++nextCode; + if (nextCode + early == 512) + nextBits = 10; + else if (nextCode + early == 1024) + nextBits = 11; + else if (nextCode + early == 2048) + nextBits = 12; + } + prevCode = code; + + // reset buffer + seqIndex = 0; + + return gTrue; +} + +void LZWStream::clearTable() { + nextCode = 258; + nextBits = 9; + seqIndex = seqLength = 0; + first = gTrue; +} + +int LZWStream::getCode() { + int c; + int code; + + while (inputBits < nextBits) { + if ((c = str->getChar()) == EOF) + return EOF; + inputBuf = (inputBuf << 8) | (c & 0xff); + inputBits += 8; + } + code = (inputBuf >> (inputBits - nextBits)) & ((1 << nextBits) - 1); + inputBits -= nextBits; + return code; +} + +GooString *LZWStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 2 || pred) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< "); + if (!early) { + s->append("/EarlyChange 0 "); + } + s->append(">> /LZWDecode filter\n"); + return s; +} + +GBool LZWStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// RunLengthStream +//------------------------------------------------------------------------ + +RunLengthStream::RunLengthStream(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + eof = gFalse; +} + +RunLengthStream::~RunLengthStream() { + delete str; +} + +void RunLengthStream::reset() { + str->reset(); + bufPtr = bufEnd = buf; + eof = gFalse; +} + +int RunLengthStream::getChars(int nChars, Guchar *buffer) { + int n, m; + + n = 0; + while (n < nChars) { + if (bufPtr >= bufEnd) { + if (!fillBuf()) { + break; + } + } + m = (int)(bufEnd - bufPtr); + if (m > nChars - n) { + m = nChars - n; + } + memcpy(buffer + n, bufPtr, m); + bufPtr += m; + n += m; + } + return n; +} + +GooString *RunLengthStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("/RunLengthDecode filter\n"); + return s; +} + +GBool RunLengthStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +GBool RunLengthStream::fillBuf() { + int c; + int n, i; + + if (eof) + return gFalse; + c = str->getChar(); + if (c == 0x80 || c == EOF) { + eof = gTrue; + return gFalse; + } + if (c < 0x80) { + n = c + 1; + for (i = 0; i < n; ++i) + buf[i] = (char)str->getChar(); + } else { + n = 0x101 - c; + c = str->getChar(); + for (i = 0; i < n; ++i) + buf[i] = (char)c; + } + bufPtr = buf; + bufEnd = buf + n; + return gTrue; +} + +//------------------------------------------------------------------------ +// CCITTFaxStream +//------------------------------------------------------------------------ + +CCITTFaxStream::CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA, + GBool byteAlignA, int columnsA, int rowsA, + GBool endOfBlockA, GBool blackA): + FilterStream(strA) { + encoding = encodingA; + endOfLine = endOfLineA; + byteAlign = byteAlignA; + columns = columnsA; + if (columns < 1) { + columns = 1; + } else if (columns > INT_MAX - 2) { + columns = INT_MAX - 2; + } + rows = rowsA; + endOfBlock = endOfBlockA; + black = blackA; + // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = columns + // ---> max codingLine size = columns + 1 + // refLine has one extra guard entry at the end + // ---> max refLine size = columns + 2 + codingLine = (int *)gmallocn_checkoverflow(columns + 1, sizeof(int)); + refLine = (int *)gmallocn_checkoverflow(columns + 2, sizeof(int)); + + if (codingLine != NULL && refLine != NULL) { + eof = gFalse; + codingLine[0] = columns; + } else { + eof = gTrue; + } + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; + a0i = 0; + outputBits = 0; + + buf = EOF; +} + +CCITTFaxStream::~CCITTFaxStream() { + delete str; + gfree(refLine); + gfree(codingLine); +} + +void CCITTFaxStream::ccittReset(GBool unfiltered) { + if (unfiltered) + str->unfilteredReset(); + else + str->reset(); + + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; + a0i = 0; + outputBits = 0; + buf = EOF; +} + +void CCITTFaxStream::unfilteredReset() { + ccittReset(gTrue); +} + +void CCITTFaxStream::reset() { + int code1; + + ccittReset(gFalse); + + if (codingLine != NULL && refLine != NULL) { + eof = gFalse; + codingLine[0] = columns; + } else { + eof = gTrue; + } + + // skip any initial zero bits and end-of-line marker, and get the 2D + // encoding tag + while ((code1 = lookBits(12)) == 0) { + eatBits(1); + } + if (code1 == 0x001) { + eatBits(12); + endOfLine = gTrue; + } + if (encoding > 0) { + nextLine2D = !lookBits(1); + eatBits(1); + } +} + +inline void CCITTFaxStream::addPixels(int a1, int blackPixels) { + if (a1 > codingLine[a0i]) { + if (a1 > columns) { + error(errSyntaxError, getPos(), + "CCITTFax row is wrong length ({0:d})", a1); + err = gTrue; + a1 = columns; + } + if ((a0i & 1) ^ blackPixels) { + ++a0i; + } + codingLine[a0i] = a1; + } +} + +inline void CCITTFaxStream::addPixelsNeg(int a1, int blackPixels) { + if (a1 > codingLine[a0i]) { + if (a1 > columns) { + error(errSyntaxError, getPos(), + "CCITTFax row is wrong length ({0:d})", a1); + err = gTrue; + a1 = columns; + } + if ((a0i & 1) ^ blackPixels) { + ++a0i; + } + codingLine[a0i] = a1; + } else if (a1 < codingLine[a0i]) { + if (a1 < 0) { + error(errSyntaxError, getPos(), "Invalid CCITTFax code"); + err = gTrue; + a1 = 0; + } + while (a0i > 0 && a1 <= codingLine[a0i - 1]) { + --a0i; + } + codingLine[a0i] = a1; + } +} + +int CCITTFaxStream::lookChar() { + int code1, code2, code3; + int b1i, blackPixels, i, bits; + GBool gotEOL; + + if (buf != EOF) { + return buf; + } + + // read the next row + if (outputBits == 0) { + + // if at eof just return EOF + if (eof) { + return EOF; + } + + err = gFalse; + + // 2-D encoding + if (nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; + a0i = 0; + b1i = 0; + blackPixels = 0; + // invariant: + // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] + // <= columns + // exception at left edge: + // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible + // exception at right edge: + // refLine[b1i] = refLine[b1i+1] = columns is possible + while (codingLine[a0i] < columns) { + code1 = getTwoDimCode(); + switch (code1) { + case twoDimPass: + if (likely(b1i + 1 < columns + 2)) { + addPixels(refLine[b1i + 1], blackPixels); + if (refLine[b1i + 1] < columns) { + b1i += 2; + } + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = getBlackCode(); + } while (code3 >= 64); + } + addPixels(codingLine[a0i] + code1, blackPixels); + if (codingLine[a0i] < columns) { + addPixels(codingLine[a0i] + code2, blackPixels ^ 1); + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + break; + case twoDimVertR3: + addPixels(refLine[b1i] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertR2: + addPixels(refLine[b1i] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertR1: + addPixels(refLine[b1i] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVert0: + addPixels(refLine[b1i], blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertL3: + addPixelsNeg(refLine[b1i] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertL2: + addPixelsNeg(refLine[b1i] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertL1: + addPixelsNeg(refLine[b1i] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case EOF: + addPixels(columns, 0); + eof = gTrue; + break; + default: + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + addPixels(columns, 0); + err = gTrue; + break; + } + } + + // 1-D encoding + } else { + codingLine[0] = 0; + a0i = 0; + blackPixels = 0; + while (codingLine[a0i] < columns) { + code1 = 0; + if (blackPixels) { + do { + code1 += code3 = getBlackCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + } + addPixels(codingLine[a0i] + code1, blackPixels); + blackPixels ^= 1; + } + } + + // check for end-of-line marker, skipping over any extra zero bits + // (if EncodedByteAlign is true and EndOfLine is false, there can + // be "false" EOL markers -- i.e., if the last n unused bits in + // row i are set to zero, and the first 11-n bits in row i+1 + // happen to be zero -- so we don't look for EOL markers in this + // case) + gotEOL = gFalse; + if (!endOfBlock && row == rows - 1) { + eof = gTrue; + } else if (endOfLine || !byteAlign) { + code1 = lookBits(12); + if (endOfLine) { + while (code1 != EOF && code1 != 0x001) { + eatBits(1); + code1 = lookBits(12); + } + } else { + while (code1 == 0) { + eatBits(1); + code1 = lookBits(12); + } + } + if (code1 == 0x001) { + eatBits(12); + gotEOL = gTrue; + } + } + + // byte-align the row + // (Adobe apparently doesn't do byte alignment after EOL markers + // -- I've seen CCITT image data streams in two different formats, + // both with the byteAlign flag set: + // 1. xx:x0:01:yy:yy + // 2. xx:00:1y:yy:yy + // where xx is the previous line, yy is the next line, and colons + // separate bytes.) + if (byteAlign && !gotEOL) { + inputBits &= ~7; + } + + // check for end of stream + if (lookBits(1) == EOF) { + eof = gTrue; + } + + // get 2D encoding tag + if (!eof && encoding > 0) { + nextLine2D = !lookBits(1); + eatBits(1); + } + + // check for end-of-block marker + if (endOfBlock && !endOfLine && byteAlign) { + // in this case, we didn't check for an EOL code above, so we + // need to check here + code1 = lookBits(24); + if (code1 == 0x001001) { + eatBits(12); + gotEOL = gTrue; + } + } + if (endOfBlock && gotEOL) { + code1 = lookBits(12); + if (code1 == 0x001) { + eatBits(12); + if (encoding > 0) { + lookBits(1); + eatBits(1); + } + if (encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = lookBits(12); + if (code1 != 0x001) { + error(errSyntaxError, getPos(), + "Bad RTC code in CCITTFax stream"); + } + eatBits(12); + if (encoding > 0) { + lookBits(1); + eatBits(1); + } + } + } + eof = gTrue; + } + + // look for an end-of-line marker after an error -- we only do + // this if we know the stream contains end-of-line markers because + // the "just plow on" technique tends to work better otherwise + } else if (err && endOfLine) { + while (1) { + code1 = lookBits(13); + if (code1 == EOF) { + eof = gTrue; + return EOF; + } + if ((code1 >> 1) == 0x001) { + break; + } + eatBits(1); + } + eatBits(12); + if (encoding > 0) { + eatBits(1); + nextLine2D = !(code1 & 1); + } + } + + // set up for output + if (codingLine[0] > 0) { + outputBits = codingLine[a0i = 0]; + } else { + outputBits = codingLine[a0i = 1]; + } + + ++row; + } + + // get a byte + if (outputBits >= 8) { + buf = (a0i & 1) ? 0x00 : 0xff; + outputBits -= 8; + if (outputBits == 0 && codingLine[a0i] < columns) { + ++a0i; + outputBits = codingLine[a0i] - codingLine[a0i - 1]; + } + } else { + bits = 8; + buf = 0; + do { + if (outputBits > bits) { + buf <<= bits; + if (!(a0i & 1)) { + buf |= 0xff >> (8 - bits); + } + outputBits -= bits; + bits = 0; + } else { + buf <<= outputBits; + if (!(a0i & 1)) { + buf |= 0xff >> (8 - outputBits); + } + bits -= outputBits; + outputBits = 0; + if (codingLine[a0i] < columns) { + ++a0i; + outputBits = codingLine[a0i] - codingLine[a0i - 1]; + } else if (bits > 0) { + buf <<= bits; + bits = 0; + } + } + } while (bits); + } + if (black) { + buf ^= 0xff; + } + return buf; +} + +short CCITTFaxStream::getTwoDimCode() { + int code; + const CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + if ((code = lookBits(7)) != EOF) { + p = &twoDimTab1[code]; + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } + } else { + for (n = 1; n <= 7; ++n) { + if ((code = lookBits(n)) == EOF) { + break; + } + if (n < 7) { + code <<= 7 - n; + } + p = &twoDimTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(errSyntaxError, getPos(), + "Bad two dim code ({0:04x}) in CCITTFax stream", code); + return EOF; +} + +short CCITTFaxStream::getWhiteCode() { + short code; + const CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(12); + if (code == EOF) { + return 1; + } + if ((code >> 5) == 0) { + p = &whiteTab1[code]; + } else { + p = &whiteTab2[code >> 3]; + } + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 1; n <= 9; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 9) { + code <<= 9 - n; + } + p = &whiteTab2[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + for (n = 11; n <= 12; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 12) { + code <<= 12 - n; + } + p = &whiteTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(errSyntaxError, getPos(), + "Bad white code ({0:04x}) in CCITTFax stream", code); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + eatBits(1); + return 1; +} + +short CCITTFaxStream::getBlackCode() { + short code; + const CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(13); + if (code == EOF) { + return 1; + } + if ((code >> 7) == 0) { + p = &blackTab1[code]; + } else if ((code >> 9) == 0 && (code >> 7) != 0) { + p = &blackTab2[(code >> 1) - 64]; + } else { + p = &blackTab3[code >> 7]; + } + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 2; n <= 6; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 6) { + code <<= 6 - n; + } + p = &blackTab3[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + for (n = 7; n <= 12; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 12) { + code <<= 12 - n; + } + if (code >= 64) { + p = &blackTab2[code - 64]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + for (n = 10; n <= 13; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 13) { + code <<= 13 - n; + } + p = &blackTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(errSyntaxError, getPos(), + "Bad black code ({0:04x}) in CCITTFax stream", code); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + eatBits(1); + return 1; +} + +short CCITTFaxStream::lookBits(int n) { + int c; + + while (inputBits < n) { + if ((c = str->getChar()) == EOF) { + if (inputBits == 0) { + return EOF; + } + // near the end of the stream, the caller may ask for more bits + // than are available, but there may still be a valid code in + // however many bits are available -- we need to return correct + // data in this case + return (inputBuf << (n - inputBits)) & (0xffffffff >> (32 - n)); + } + inputBuf = (inputBuf << 8) + c; + inputBits += 8; + } + return (inputBuf >> (inputBits - n)) & (0xffffffff >> (32 - n)); +} + +GooString *CCITTFaxStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + char s1[50]; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< "); + if (encoding != 0) { + sprintf(s1, "/K %d ", encoding); + s->append(s1); + } + if (endOfLine) { + s->append("/EndOfLine true "); + } + if (byteAlign) { + s->append("/EncodedByteAlign true "); + } + sprintf(s1, "/Columns %d ", columns); + s->append(s1); + if (rows != 0) { + sprintf(s1, "/Rows %d ", rows); + s->append(s1); + } + if (!endOfBlock) { + s->append("/EndOfBlock false "); + } + if (black) { + s->append("/BlackIs1 true "); + } + s->append(">> /CCITTFaxDecode filter\n"); + return s; +} + +GBool CCITTFaxStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +#ifndef ENABLE_LIBJPEG + +//------------------------------------------------------------------------ +// DCTStream +//------------------------------------------------------------------------ + +// IDCT constants (20.12 fixed point format) +#define dctCos1 4017 // cos(pi/16) +#define dctSin1 799 // sin(pi/16) +#define dctCos3 3406 // cos(3*pi/16) +#define dctSin3 2276 // sin(3*pi/16) +#define dctCos6 1567 // cos(6*pi/16) +#define dctSin6 3784 // sin(6*pi/16) +#define dctSqrt2 5793 // sqrt(2) +#define dctSqrt1d2 2896 // sqrt(2) / 2 + +// color conversion parameters (16.16 fixed point format) +#define dctCrToR 91881 // 1.4020 +#define dctCbToG -22553 // -0.3441363 +#define dctCrToG -46802 // -0.71413636 +#define dctCbToB 116130 // 1.772 + +// clip [-256,511] --> [0,255] +#define dctClipOffset 256 +static Guchar dctClip[768]; +static int dctClipInit = 0; + +// zig zag decode map +static const int dctZigZag[64] = { + 0, + 1, 8, + 16, 9, 2, + 3, 10, 17, 24, + 32, 25, 18, 11, 4, + 5, 12, 19, 26, 33, 40, + 48, 41, 34, 27, 20, 13, 6, + 7, 14, 21, 28, 35, 42, 49, 56, + 57, 50, 43, 36, 29, 22, 15, + 23, 30, 37, 44, 51, 58, + 59, 52, 45, 38, 31, + 39, 46, 53, 60, + 61, 54, 47, + 55, 62, + 63 +}; + +DCTStream::DCTStream(Stream *strA, int colorXformA): + FilterStream(strA) { + int i, j; + + colorXform = colorXformA; + progressive = interleaved = gFalse; + width = height = 0; + mcuWidth = mcuHeight = 0; + numComps = 0; + comp = 0; + x = y = dy = 0; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 32; ++j) { + rowBuf[i][j] = NULL; + } + frameBuf[i] = NULL; + } + + if (!dctClipInit) { + for (i = -256; i < 0; ++i) + dctClip[dctClipOffset + i] = 0; + for (i = 0; i < 256; ++i) + dctClip[dctClipOffset + i] = i; + for (i = 256; i < 512; ++i) + dctClip[dctClipOffset + i] = 255; + dctClipInit = 1; + } +} + +DCTStream::~DCTStream() { + close(); + delete str; +} + +void DCTStream::dctReset(GBool unfiltered) { + if (unfiltered) + str->unfilteredReset(); + else + str->reset(); + + progressive = interleaved = gFalse; + width = height = 0; + numComps = 0; + numQuantTables = 0; + numDCHuffTables = 0; + numACHuffTables = 0; + gotJFIFMarker = gFalse; + gotAdobeMarker = gFalse; + restartInterval = 0; +} + +void DCTStream::unfilteredReset() { + dctReset(gTrue); +} + +void DCTStream::reset() { + int i, j; + + dctReset(gFalse); + + if (!readHeader()) { + y = height; + return; + } + + // compute MCU size + if (numComps == 1) { + compInfo[0].hSample = compInfo[0].vSample = 1; + } + mcuWidth = compInfo[0].hSample; + mcuHeight = compInfo[0].vSample; + for (i = 1; i < numComps; ++i) { + if (compInfo[i].hSample > mcuWidth) { + mcuWidth = compInfo[i].hSample; + } + if (compInfo[i].vSample > mcuHeight) { + mcuHeight = compInfo[i].vSample; + } + } + mcuWidth *= 8; + mcuHeight *= 8; + + // figure out color transform + if (colorXform == -1) { + if (numComps == 3) { + if (gotJFIFMarker) { + colorXform = 1; + } else if (compInfo[0].id == 82 && compInfo[1].id == 71 && + compInfo[2].id == 66) { // ASCII "RGB" + colorXform = 0; + } else { + colorXform = 1; + } + } else { + colorXform = 0; + } + } + + if (progressive || !interleaved) { + + // allocate a buffer for the whole image + bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; + bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight; + if (bufWidth <= 0 || bufHeight <= 0 || + bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) { + error(errSyntaxError, getPos(), "Invalid image size in DCT stream"); + y = height; + return; + } + for (i = 0; i < numComps; ++i) { + frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int)); + memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int)); + } + + // read the image data + do { + restartMarker = 0xd0; + restart(); + readScan(); + } while (readHeader()); + + // decode + decodeImage(); + + // initialize counters + comp = 0; + x = 0; + y = 0; + + } else { + + // allocate a buffer for one row of MCUs + bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; + for (i = 0; i < numComps; ++i) { + for (j = 0; j < mcuHeight; ++j) { + rowBuf[i][j] = (Guchar *)gmallocn(bufWidth, sizeof(Guchar)); + } + } + + // initialize counters + comp = 0; + x = 0; + y = 0; + dy = mcuHeight; + + restartMarker = 0xd0; + restart(); + } +} + +void DCTStream::close() { + int i, j; + + for (i = 0; i < 4; ++i) { + for (j = 0; j < 32; ++j) { + gfree(rowBuf[i][j]); + rowBuf[i][j] = NULL; + } + gfree(frameBuf[i]); + frameBuf[i] = NULL; + } + FilterStream::close(); +} + +int DCTStream::getChar() { + int c; + + if (y >= height) { + return EOF; + } + if (progressive || !interleaved) { + c = frameBuf[comp][y * bufWidth + x]; + if (++comp == numComps) { + comp = 0; + if (++x == width) { + x = 0; + ++y; + } + } + } else { + if (dy >= mcuHeight) { + if (!readMCURow()) { + y = height; + return EOF; + } + comp = 0; + x = 0; + dy = 0; + } + c = rowBuf[comp][dy][x]; + if (++comp == numComps) { + comp = 0; + if (++x == width) { + x = 0; + ++y; + ++dy; + if (y == height) { + readTrailer(); + } + } + } + } + return c; +} + +int DCTStream::lookChar() { + if (y >= height) { + return EOF; + } + if (progressive || !interleaved) { + return frameBuf[comp][y * bufWidth + x]; + } else { + if (dy >= mcuHeight) { + if (!readMCURow()) { + y = height; + return EOF; + } + comp = 0; + x = 0; + dy = 0; + } + return rowBuf[comp][dy][x]; + } +} + +void DCTStream::restart() { + int i; + + inputBits = 0; + restartCtr = restartInterval; + for (i = 0; i < numComps; ++i) { + compInfo[i].prevDC = 0; + } + eobRun = 0; +} + +// Read one row of MCUs from a sequential JPEG stream. +GBool DCTStream::readMCURow() { + int data1[64]; + Guchar data2[64]; + Guchar *p1, *p2; + int pY, pCb, pCr, pR, pG, pB; + int h, v, horiz, vert, hSub, vSub; + int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; + int c; + + for (x1 = 0; x1 < width; x1 += mcuWidth) { + + // deal with restart marker + if (restartInterval > 0 && restartCtr == 0) { + c = readMarker(); + if (c != restartMarker) { + error(errSyntaxError, getPos(), + "Bad DCT data: incorrect restart marker"); + return gFalse; + } + if (++restartMarker == 0xd8) + restartMarker = 0xd0; + restart(); + } + + // read one MCU + for (cc = 0; cc < numComps; ++cc) { + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + hSub = horiz / 8; + vSub = vert / 8; + for (y2 = 0; y2 < mcuHeight; y2 += vert) { + for (x2 = 0; x2 < mcuWidth; x2 += horiz) { + if (unlikely(scanInfo.dcHuffTable[cc] >= 4) || unlikely(scanInfo.acHuffTable[cc] >= 4)) { + return gFalse; + } + if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]], + &acHuffTables[scanInfo.acHuffTable[cc]], + &compInfo[cc].prevDC, + data1)) { + return gFalse; + } + transformDataUnit(quantTables[compInfo[cc].quantTable], + data1, data2); + if (hSub == 1 && vSub == 1) { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1 = &rowBuf[cc][y2+y3][x1+x2]; + p1[0] = data2[i]; + p1[1] = data2[i+1]; + p1[2] = data2[i+2]; + p1[3] = data2[i+3]; + p1[4] = data2[i+4]; + p1[5] = data2[i+5]; + p1[6] = data2[i+6]; + p1[7] = data2[i+7]; + } + } else if (hSub == 2 && vSub == 2) { + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { + p1 = &rowBuf[cc][y2+y3][x1+x2]; + p2 = &rowBuf[cc][y2+y3+1][x1+x2]; + p1[0] = p1[1] = p2[0] = p2[1] = data2[i]; + p1[2] = p1[3] = p2[2] = p2[3] = data2[i+1]; + p1[4] = p1[5] = p2[4] = p2[5] = data2[i+2]; + p1[6] = p1[7] = p2[6] = p2[7] = data2[i+3]; + p1[8] = p1[9] = p2[8] = p2[9] = data2[i+4]; + p1[10] = p1[11] = p2[10] = p2[11] = data2[i+5]; + p1[12] = p1[13] = p2[12] = p2[13] = data2[i+6]; + p1[14] = p1[15] = p2[14] = p2[15] = data2[i+7]; + } + } else { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { + for (y5 = 0; y5 < vSub; ++y5) + for (x5 = 0; x5 < hSub; ++x5) + rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data2[i]; + ++i; + } + } + } + } + } + } + --restartCtr; + + // color space conversion + if (colorXform) { + // convert YCbCr to RGB + if (numComps == 3) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = rowBuf[0][y2][x1+x2]; + pCb = rowBuf[1][y2][x1+x2] - 128; + pCr = rowBuf[2][y2][x1+x2] - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; + rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB]; + } + } + // convert YCbCrK to CMYK (K is passed through unchanged) + } else if (numComps == 4) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = rowBuf[0][y2][x1+x2]; + pCb = rowBuf[1][y2][x1+x2] - 128; + pCr = rowBuf[2][y2][x1+x2] - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; + rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB]; + } + } + } + } + } + return gTrue; +} + +// Read one scan from a progressive or non-interleaved JPEG stream. +void DCTStream::readScan() { + int data[64]; + int x1, y1, dx1, dy1, x2, y2, y3, cc, i; + int h, v, horiz, vert, vSub; + int *p1; + int c; + + if (scanInfo.numComps == 1) { + for (cc = 0; cc < numComps; ++cc) { + if (scanInfo.comp[cc]) { + break; + } + } + dx1 = mcuWidth / compInfo[cc].hSample; + dy1 = mcuHeight / compInfo[cc].vSample; + } else { + dx1 = mcuWidth; + dy1 = mcuHeight; + } + + for (y1 = 0; y1 < height; y1 += dy1) { + for (x1 = 0; x1 < width; x1 += dx1) { + + // deal with restart marker + if (restartInterval > 0 && restartCtr == 0) { + c = readMarker(); + if (c != restartMarker) { + error(errSyntaxError, getPos(), + "Bad DCT data: incorrect restart marker"); + return; + } + if (++restartMarker == 0xd8) { + restartMarker = 0xd0; + } + restart(); + } + + // read one MCU + for (cc = 0; cc < numComps; ++cc) { + if (!scanInfo.comp[cc]) { + continue; + } + + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + vSub = vert / 8; + for (y2 = 0; y2 < dy1; y2 += vert) { + for (x2 = 0; x2 < dx1; x2 += horiz) { + + // pull out the current values + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + data[i] = p1[0]; + data[i+1] = p1[1]; + data[i+2] = p1[2]; + data[i+3] = p1[3]; + data[i+4] = p1[4]; + data[i+5] = p1[5]; + data[i+6] = p1[6]; + data[i+7] = p1[7]; + p1 += bufWidth * vSub; + } + + // read one data unit + if (progressive) { + if (!readProgressiveDataUnit( + &dcHuffTables[scanInfo.dcHuffTable[cc]], + &acHuffTables[scanInfo.acHuffTable[cc]], + &compInfo[cc].prevDC, + data)) { + return; + } + } else { + if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]], + &acHuffTables[scanInfo.acHuffTable[cc]], + &compInfo[cc].prevDC, + data)) { + return; + } + } + + // add the data unit into frameBuf + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1[0] = data[i]; + p1[1] = data[i+1]; + p1[2] = data[i+2]; + p1[3] = data[i+3]; + p1[4] = data[i+4]; + p1[5] = data[i+5]; + p1[6] = data[i+6]; + p1[7] = data[i+7]; + p1 += bufWidth * vSub; + } + } + } + } + --restartCtr; + } + } +} + +// Read one data unit from a sequential JPEG stream. +GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]) { + int run, size, amp; + int c; + int i, j; + + if ((size = readHuffSym(dcHuffTable)) == 9999) { + return gFalse; + } + if (size > 0) { + if ((amp = readAmp(size)) == 9999) { + return gFalse; + } + } else { + amp = 0; + } + data[0] = *prevDC += amp; + for (i = 1; i < 64; ++i) { + data[i] = 0; + } + i = 1; + while (i < 64) { + run = 0; + while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) { + run += 0x10; + } + if (c == 9999) { + return gFalse; + } + if (c == 0x00) { + break; + } else { + run += (c >> 4) & 0x0f; + size = c & 0x0f; + amp = readAmp(size); + if (amp == 9999) { + return gFalse; + } + i += run; + if (i < 64) { + j = dctZigZag[i++]; + data[j] = amp; + } + } + } + return gTrue; +} + +// Read one data unit from a sequential JPEG stream. +GBool DCTStream::readProgressiveDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]) { + int run, size, amp, bit, c; + int i, j, k; + + // get the DC coefficient + i = scanInfo.firstCoeff; + if (i == 0) { + if (scanInfo.ah == 0) { + if ((size = readHuffSym(dcHuffTable)) == 9999) { + return gFalse; + } + if (size > 0) { + if ((amp = readAmp(size)) == 9999) { + return gFalse; + } + } else { + amp = 0; + } + data[0] += (*prevDC += amp) << scanInfo.al; + } else { + if ((bit = readBit()) == 9999) { + return gFalse; + } + data[0] += bit << scanInfo.al; + } + ++i; + } + if (scanInfo.lastCoeff == 0) { + return gTrue; + } + + // check for an EOB run + if (eobRun > 0) { + while (i <= scanInfo.lastCoeff) { + j = dctZigZag[i++]; + if (data[j] != 0) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + } + } + --eobRun; + return gTrue; + } + + // read the AC coefficients + while (i <= scanInfo.lastCoeff) { + if ((c = readHuffSym(acHuffTable)) == 9999) { + return gFalse; + } + + // ZRL + if (c == 0xf0) { + k = 0; + while (k < 16 && i <= scanInfo.lastCoeff) { + j = dctZigZag[i++]; + if (data[j] == 0) { + ++k; + } else { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + } + } + + // EOB run + } else if ((c & 0x0f) == 0x00) { + j = c >> 4; + eobRun = 0; + for (k = 0; k < j; ++k) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + eobRun = (eobRun << 1) | bit; + } + eobRun += 1 << j; + while (i <= scanInfo.lastCoeff) { + j = dctZigZag[i++]; + if (data[j] != 0) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + } + } + --eobRun; + break; + + // zero run and one AC coefficient + } else { + run = (c >> 4) & 0x0f; + size = c & 0x0f; + if ((amp = readAmp(size)) == 9999) { + return gFalse; + } + j = 0; // make gcc happy + for (k = 0; k <= run && i <= scanInfo.lastCoeff; ++k) { + j = dctZigZag[i++]; + while (data[j] != 0 && i <= scanInfo.lastCoeff) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + j = dctZigZag[i++]; + } + } + data[j] = amp << scanInfo.al; + } + } + + return gTrue; +} + +// Decode a progressive JPEG image. +void DCTStream::decodeImage() { + int dataIn[64]; + Guchar dataOut[64]; + Gushort *quantTable; + int pY, pCb, pCr, pR, pG, pB; + int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; + int h, v, horiz, vert, hSub, vSub; + int *p0, *p1, *p2; + + for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) { + for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) { + for (cc = 0; cc < numComps; ++cc) { + quantTable = quantTables[compInfo[cc].quantTable]; + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + hSub = horiz / 8; + vSub = vert / 8; + for (y2 = 0; y2 < mcuHeight; y2 += vert) { + for (x2 = 0; x2 < mcuWidth; x2 += horiz) { + + // pull out the coded data unit + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + dataIn[i] = p1[0]; + dataIn[i+1] = p1[1]; + dataIn[i+2] = p1[2]; + dataIn[i+3] = p1[3]; + dataIn[i+4] = p1[4]; + dataIn[i+5] = p1[5]; + dataIn[i+6] = p1[6]; + dataIn[i+7] = p1[7]; + p1 += bufWidth * vSub; + } + + // transform + transformDataUnit(quantTable, dataIn, dataOut); + + // store back into frameBuf, doing replication for + // subsampled components + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + if (hSub == 1 && vSub == 1) { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1[0] = dataOut[i] & 0xff; + p1[1] = dataOut[i+1] & 0xff; + p1[2] = dataOut[i+2] & 0xff; + p1[3] = dataOut[i+3] & 0xff; + p1[4] = dataOut[i+4] & 0xff; + p1[5] = dataOut[i+5] & 0xff; + p1[6] = dataOut[i+6] & 0xff; + p1[7] = dataOut[i+7] & 0xff; + p1 += bufWidth; + } + } else if (hSub == 2 && vSub == 2) { + p2 = p1 + bufWidth; + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { + p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff; + p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff; + p1[4] = p1[5] = p2[4] = p2[5] = dataOut[i+2] & 0xff; + p1[6] = p1[7] = p2[6] = p2[7] = dataOut[i+3] & 0xff; + p1[8] = p1[9] = p2[8] = p2[9] = dataOut[i+4] & 0xff; + p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff; + p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff; + p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff; + p1 += bufWidth * 2; + p2 += bufWidth * 2; + } + } else { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { + p2 = p1 + x4; + for (y5 = 0; y5 < vSub; ++y5) { + for (x5 = 0; x5 < hSub; ++x5) { + p2[x5] = dataOut[i] & 0xff; + } + p2 += bufWidth; + } + ++i; + } + p1 += bufWidth * vSub; + } + } + } + } + } + + // color space conversion + if (colorXform) { + // convert YCbCr to RGB + if (numComps == 3) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + p0 = &frameBuf[0][(y1+y2) * bufWidth + x1]; + p1 = &frameBuf[1][(y1+y2) * bufWidth + x1]; + p2 = &frameBuf[2][(y1+y2) * bufWidth + x1]; + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = *p0; + pCb = *p1 - 128; + pCr = *p2 - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + *p0++ = dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + + 32768) >> 16; + *p1++ = dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + *p2++ = dctClip[dctClipOffset + pB]; + } + } + // convert YCbCrK to CMYK (K is passed through unchanged) + } else if (numComps == 4) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + p0 = &frameBuf[0][(y1+y2) * bufWidth + x1]; + p1 = &frameBuf[1][(y1+y2) * bufWidth + x1]; + p2 = &frameBuf[2][(y1+y2) * bufWidth + x1]; + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = *p0; + pCb = *p1 - 128; + pCr = *p2 - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + *p0++ = 255 - dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + + 32768) >> 16; + *p1++ = 255 - dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + *p2++ = 255 - dctClip[dctClipOffset + pB]; + } + } + } + } + } + } +} + +// Transform one data unit -- this performs the dequantization and +// IDCT steps. This IDCT algorithm is taken from: +// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, +// "Practical Fast 1-D DCT Algorithms with 11 Multiplications", +// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, +// 988-991. +// The stage numbers mentioned in the comments refer to Figure 1 in this +// paper. +void DCTStream::transformDataUnit(Gushort *quantTable, + int dataIn[64], Guchar dataOut[64]) { + int v0, v1, v2, v3, v4, v5, v6, v7, t; + int *p; + int i; + + // dequant + for (i = 0; i < 64; ++i) { + dataIn[i] *= quantTable[i]; + } + + // inverse DCT on rows + for (i = 0; i < 64; i += 8) { + p = dataIn + i; + + // check for all-zero AC coefficients + if (p[1] == 0 && p[2] == 0 && p[3] == 0 && + p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] == 0) { + t = (dctSqrt2 * p[0] + 512) >> 10; + p[0] = t; + p[1] = t; + p[2] = t; + p[3] = t; + p[4] = t; + p[5] = t; + p[6] = t; + p[7] = t; + continue; + } + + // stage 4 + v0 = (dctSqrt2 * p[0] + 128) >> 8; + v1 = (dctSqrt2 * p[4] + 128) >> 8; + v2 = p[2]; + v3 = p[6]; + v4 = (dctSqrt1d2 * (p[1] - p[7]) + 128) >> 8; + v7 = (dctSqrt1d2 * (p[1] + p[7]) + 128) >> 8; + v5 = p[3] << 4; + v6 = p[5] << 4; + + // stage 3 + t = (v0 - v1+ 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + p[0] = v0 + v7; + p[7] = v0 - v7; + p[1] = v1 + v6; + p[6] = v1 - v6; + p[2] = v2 + v5; + p[5] = v2 - v5; + p[3] = v3 + v4; + p[4] = v3 - v4; + } + + // inverse DCT on columns + for (i = 0; i < 8; ++i) { + p = dataIn + i; + + // check for all-zero AC coefficients + if (p[1*8] == 0 && p[2*8] == 0 && p[3*8] == 0 && + p[4*8] == 0 && p[5*8] == 0 && p[6*8] == 0 && p[7*8] == 0) { + t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14; + p[0*8] = t; + p[1*8] = t; + p[2*8] = t; + p[3*8] = t; + p[4*8] = t; + p[5*8] = t; + p[6*8] = t; + p[7*8] = t; + continue; + } + + // stage 4 + v0 = (dctSqrt2 * p[0*8] + 2048) >> 12; + v1 = (dctSqrt2 * p[4*8] + 2048) >> 12; + v2 = p[2*8]; + v3 = p[6*8]; + v4 = (dctSqrt1d2 * (p[1*8] - p[7*8]) + 2048) >> 12; + v7 = (dctSqrt1d2 * (p[1*8] + p[7*8]) + 2048) >> 12; + v5 = p[3*8]; + v6 = p[5*8]; + + // stage 3 + t = (v0 - v1 + 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + p[0*8] = v0 + v7; + p[7*8] = v0 - v7; + p[1*8] = v1 + v6; + p[6*8] = v1 - v6; + p[2*8] = v2 + v5; + p[5*8] = v2 - v5; + p[3*8] = v3 + v4; + p[4*8] = v3 - v4; + } + + // convert to 8-bit integers + for (i = 0; i < 64; ++i) { + dataOut[i] = dctClip[dctClipOffset + 128 + ((dataIn[i] + 8) >> 4)]; + } +} + +int DCTStream::readHuffSym(DCTHuffTable *table) { + Gushort code; + int bit; + int codeBits; + + code = 0; + codeBits = 0; + do { + // add a bit to the code + if ((bit = readBit()) == EOF) { + return 9999; + } + code = (code << 1) + bit; + ++codeBits; + + // look up code + if (code < table->firstCode[codeBits]) { + break; + } + if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) { + code -= table->firstCode[codeBits]; + return table->sym[table->firstSym[codeBits] + code]; + } + } while (codeBits < 16); + + error(errSyntaxError, getPos(), "Bad Huffman code in DCT stream"); + return 9999; +} + +int DCTStream::readAmp(int size) { + int amp, bit; + int bits; + + amp = 0; + for (bits = 0; bits < size; ++bits) { + if ((bit = readBit()) == EOF) + return 9999; + amp = (amp << 1) + bit; + } + if (amp < (1 << (size - 1))) + amp -= (1 << size) - 1; + return amp; +} + +int DCTStream::readBit() { + int bit; + int c, c2; + + if (inputBits == 0) { + if ((c = str->getChar()) == EOF) + return EOF; + if (c == 0xff) { + do { + c2 = str->getChar(); + } while (c2 == 0xff); + if (c2 != 0x00) { + error(errSyntaxError, getPos(), "Bad DCT data: missing 00 after ff"); + return EOF; + } + } + inputBuf = c; + inputBits = 8; + } + bit = (inputBuf >> (inputBits - 1)) & 1; + --inputBits; + return bit; +} + +GBool DCTStream::readHeader() { + GBool doScan; + int n; + int c = 0; + int i; + + // read headers + doScan = gFalse; + while (!doScan) { + c = readMarker(); + switch (c) { + case 0xc0: // SOF0 (sequential) + case 0xc1: // SOF1 (extended sequential) + if (!readBaselineSOF()) { + return gFalse; + } + break; + case 0xc2: // SOF2 (progressive) + if (!readProgressiveSOF()) { + return gFalse; + } + break; + case 0xc4: // DHT + if (!readHuffmanTables()) { + return gFalse; + } + break; + case 0xd8: // SOI + break; + case 0xd9: // EOI + return gFalse; + case 0xda: // SOS + if (!readScanInfo()) { + return gFalse; + } + doScan = gTrue; + break; + case 0xdb: // DQT + if (!readQuantTables()) { + return gFalse; + } + break; + case 0xdd: // DRI + if (!readRestartInterval()) { + return gFalse; + } + break; + case 0xe0: // APP0 + if (!readJFIFMarker()) { + return gFalse; + } + break; + case 0xee: // APP14 + if (!readAdobeMarker()) { + return gFalse; + } + break; + case EOF: + error(errSyntaxError, getPos(), "Bad DCT header"); + return gFalse; + default: + // skip APPn / COM / etc. + if (c >= 0xe0) { + n = read16() - 2; + for (i = 0; i < n; ++i) { + str->getChar(); + } + } else { + error(errSyntaxError, getPos(), "Unknown DCT marker <{0:02x}>", c); + return gFalse; + } + break; + } + } + + return gTrue; +} + +GBool DCTStream::readBaselineSOF() { + int length; + int prec; + int i; + int c; + + length = read16(); + prec = str->getChar(); + height = read16(); + width = read16(); + numComps = str->getChar(); + if (numComps <= 0 || numComps > 4) { + error(errSyntaxError, getPos(), "Bad number of components in DCT stream"); + numComps = 0; + return gFalse; + } + if (prec != 8) { + error(errSyntaxError, getPos(), "Bad DCT precision {0:d}", prec); + return gFalse; + } + for (i = 0; i < numComps; ++i) { + compInfo[i].id = str->getChar(); + c = str->getChar(); + compInfo[i].hSample = (c >> 4) & 0x0f; + compInfo[i].vSample = c & 0x0f; + compInfo[i].quantTable = str->getChar(); + if (compInfo[i].hSample < 1 || compInfo[i].hSample > 4 || + compInfo[i].vSample < 1 || compInfo[i].vSample > 4) { + error(errSyntaxError, getPos(), "Bad DCT sampling factor"); + return gFalse; + } + if (compInfo[i].quantTable < 0 || compInfo[i].quantTable > 3) { + error(errSyntaxError, getPos(), "Bad DCT quant table selector"); + return gFalse; + } + } + progressive = gFalse; + return gTrue; +} + +GBool DCTStream::readProgressiveSOF() { + int length; + int prec; + int i; + int c; + + length = read16(); + prec = str->getChar(); + height = read16(); + width = read16(); + numComps = str->getChar(); + if (prec != 8) { + error(errSyntaxError, getPos(), "Bad DCT precision {0:d}", prec); + return gFalse; + } + for (i = 0; i < numComps; ++i) { + compInfo[i].id = str->getChar(); + c = str->getChar(); + compInfo[i].hSample = (c >> 4) & 0x0f; + compInfo[i].vSample = c & 0x0f; + compInfo[i].quantTable = str->getChar(); + if (compInfo[i].hSample < 1 || compInfo[i].hSample > 4 || + compInfo[i].vSample < 1 || compInfo[i].vSample > 4) { + error(errSyntaxError, getPos(), "Bad DCT sampling factor"); + return gFalse; + } + if (compInfo[i].quantTable < 0 || compInfo[i].quantTable > 3) { + error(errSyntaxError, getPos(), "Bad DCT quant table selector"); + return gFalse; + } + } + progressive = gTrue; + return gTrue; +} + +GBool DCTStream::readScanInfo() { + int length; + int id, c; + int i, j; + + length = read16() - 2; + scanInfo.numComps = str->getChar(); + if (scanInfo.numComps <= 0 || scanInfo.numComps > 4) { + error(errSyntaxError, getPos(), "Bad number of components in DCT stream"); + scanInfo.numComps = 0; + return gFalse; + } + --length; + if (length != 2 * scanInfo.numComps + 3) { + error(errSyntaxError, getPos(), "Bad DCT scan info block"); + return gFalse; + } + interleaved = scanInfo.numComps == numComps; + for (j = 0; j < numComps; ++j) { + scanInfo.comp[j] = gFalse; + scanInfo.dcHuffTable[j] = 0; + scanInfo.acHuffTable[j] = 0; + } + for (i = 0; i < scanInfo.numComps; ++i) { + id = str->getChar(); + // some (broken) DCT streams reuse ID numbers, but at least they + // keep the components in order, so we check compInfo[i] first to + // work around the problem + if (id == compInfo[i].id) { + j = i; + } else { + for (j = 0; j < numComps; ++j) { + if (id == compInfo[j].id) { + break; + } + } + if (j == numComps) { + error(errSyntaxError, getPos(), + "Bad DCT component ID in scan info block"); + return gFalse; + } + } + scanInfo.comp[j] = gTrue; + c = str->getChar(); + scanInfo.dcHuffTable[j] = (c >> 4) & 0x0f; + scanInfo.acHuffTable[j] = c & 0x0f; + } + scanInfo.firstCoeff = str->getChar(); + scanInfo.lastCoeff = str->getChar(); + if (scanInfo.firstCoeff < 0 || scanInfo.lastCoeff > 63 || + scanInfo.firstCoeff > scanInfo.lastCoeff) { + error(errSyntaxError, getPos(), + "Bad DCT coefficient numbers in scan info block"); + return gFalse; + } + c = str->getChar(); + scanInfo.ah = (c >> 4) & 0x0f; + scanInfo.al = c & 0x0f; + return gTrue; +} + +GBool DCTStream::readQuantTables() { + int length, prec, i, index; + + length = read16() - 2; + while (length > 0) { + index = str->getChar(); + prec = (index >> 4) & 0x0f; + index &= 0x0f; + if (prec > 1 || index >= 4) { + error(errSyntaxError, getPos(), "Bad DCT quantization table"); + return gFalse; + } + if (index == numQuantTables) { + numQuantTables = index + 1; + } + for (i = 0; i < 64; ++i) { + if (prec) { + quantTables[index][dctZigZag[i]] = read16(); + } else { + quantTables[index][dctZigZag[i]] = str->getChar(); + } + } + if (prec) { + length -= 129; + } else { + length -= 65; + } + } + return gTrue; +} + +GBool DCTStream::readHuffmanTables() { + DCTHuffTable *tbl; + int length; + int index; + Gushort code; + Guchar sym; + int i; + int c; + + length = read16() - 2; + while (length > 0) { + index = str->getChar(); + --length; + if ((index & 0x0f) >= 4) { + error(errSyntaxError, getPos(), "Bad DCT Huffman table"); + return gFalse; + } + if (index & 0x10) { + index &= 0x0f; + if (index >= numACHuffTables) + numACHuffTables = index+1; + tbl = &acHuffTables[index]; + } else { + index &= 0x0f; + if (index >= numDCHuffTables) + numDCHuffTables = index+1; + tbl = &dcHuffTables[index]; + } + sym = 0; + code = 0; + for (i = 1; i <= 16; ++i) { + c = str->getChar(); + tbl->firstSym[i] = sym; + tbl->firstCode[i] = code; + tbl->numCodes[i] = c; + sym += c; + code = (code + c) << 1; + } + length -= 16; + for (i = 0; i < sym; ++i) + tbl->sym[i] = str->getChar(); + length -= sym; + } + return gTrue; +} + +GBool DCTStream::readRestartInterval() { + int length; + + length = read16(); + if (length != 4) { + error(errSyntaxError, getPos(), "Bad DCT restart interval"); + return gFalse; + } + restartInterval = read16(); + return gTrue; +} + +GBool DCTStream::readJFIFMarker() { + int length, i; + char buf[5]; + int c; + + length = read16(); + length -= 2; + if (length >= 5) { + for (i = 0; i < 5; ++i) { + if ((c = str->getChar()) == EOF) { + error(errSyntaxError, getPos(), "Bad DCT APP0 marker"); + return gFalse; + } + buf[i] = c; + } + length -= 5; + if (!memcmp(buf, "JFIF\0", 5)) { + gotJFIFMarker = gTrue; + } + } + while (length > 0) { + if (str->getChar() == EOF) { + error(errSyntaxError, getPos(), "Bad DCT APP0 marker"); + return gFalse; + } + --length; + } + return gTrue; +} + +GBool DCTStream::readAdobeMarker() { + int length, i; + char buf[12]; + int c; + + length = read16(); + if (length < 14) { + goto err; + } + for (i = 0; i < 12; ++i) { + if ((c = str->getChar()) == EOF) { + goto err; + } + buf[i] = c; + } + if (strncmp(buf, "Adobe", 5)) { + goto err; + } + colorXform = buf[11]; + gotAdobeMarker = gTrue; + for (i = 14; i < length; ++i) { + if (str->getChar() == EOF) { + goto err; + } + } + return gTrue; + + err: + error(errSyntaxError, getPos(), "Bad DCT Adobe APP14 marker"); + return gFalse; +} + +GBool DCTStream::readTrailer() { + int c; + + c = readMarker(); + if (c != 0xd9) { // EOI + error(errSyntaxError, getPos(), "Bad DCT trailer"); + return gFalse; + } + return gTrue; +} + +int DCTStream::readMarker() { + int c; + + do { + do { + c = str->getChar(); + } while (c != 0xff && c != EOF); + while (c == 0xff) { + c = str->getChar(); + } + } while (c == 0x00); + return c; +} + +int DCTStream::read16() { + int c1, c2; + + if ((c1 = str->getChar()) == EOF) + return EOF; + if ((c2 = str->getChar()) == EOF) + return EOF; + return (c1 << 8) + c2; +} + +GooString *DCTStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< >> /DCTDecode filter\n"); + return s; +} + +GBool DCTStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +#endif + +#ifndef ENABLE_ZLIB +//------------------------------------------------------------------------ +// FlateStream +//------------------------------------------------------------------------ + +int FlateStream::codeLenCodeMap[flateMaxCodeLenCodes] = { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 +}; + +FlateDecode FlateStream::lengthDecode[flateMaxLitCodes-257] = { + {0, 3}, + {0, 4}, + {0, 5}, + {0, 6}, + {0, 7}, + {0, 8}, + {0, 9}, + {0, 10}, + {1, 11}, + {1, 13}, + {1, 15}, + {1, 17}, + {2, 19}, + {2, 23}, + {2, 27}, + {2, 31}, + {3, 35}, + {3, 43}, + {3, 51}, + {3, 59}, + {4, 67}, + {4, 83}, + {4, 99}, + {4, 115}, + {5, 131}, + {5, 163}, + {5, 195}, + {5, 227}, + {0, 258}, + {0, 258}, + {0, 258} +}; + +FlateDecode FlateStream::distDecode[flateMaxDistCodes] = { + { 0, 1}, + { 0, 2}, + { 0, 3}, + { 0, 4}, + { 1, 5}, + { 1, 7}, + { 2, 9}, + { 2, 13}, + { 3, 17}, + { 3, 25}, + { 4, 33}, + { 4, 49}, + { 5, 65}, + { 5, 97}, + { 6, 129}, + { 6, 193}, + { 7, 257}, + { 7, 385}, + { 8, 513}, + { 8, 769}, + { 9, 1025}, + { 9, 1537}, + {10, 2049}, + {10, 3073}, + {11, 4097}, + {11, 6145}, + {12, 8193}, + {12, 12289}, + {13, 16385}, + {13, 24577} +}; + +static FlateCode flateFixedLitCodeTabCodes[512] = { + {7, 0x0100}, + {8, 0x0050}, + {8, 0x0010}, + {8, 0x0118}, + {7, 0x0110}, + {8, 0x0070}, + {8, 0x0030}, + {9, 0x00c0}, + {7, 0x0108}, + {8, 0x0060}, + {8, 0x0020}, + {9, 0x00a0}, + {8, 0x0000}, + {8, 0x0080}, + {8, 0x0040}, + {9, 0x00e0}, + {7, 0x0104}, + {8, 0x0058}, + {8, 0x0018}, + {9, 0x0090}, + {7, 0x0114}, + {8, 0x0078}, + {8, 0x0038}, + {9, 0x00d0}, + {7, 0x010c}, + {8, 0x0068}, + {8, 0x0028}, + {9, 0x00b0}, + {8, 0x0008}, + {8, 0x0088}, + {8, 0x0048}, + {9, 0x00f0}, + {7, 0x0102}, + {8, 0x0054}, + {8, 0x0014}, + {8, 0x011c}, + {7, 0x0112}, + {8, 0x0074}, + {8, 0x0034}, + {9, 0x00c8}, + {7, 0x010a}, + {8, 0x0064}, + {8, 0x0024}, + {9, 0x00a8}, + {8, 0x0004}, + {8, 0x0084}, + {8, 0x0044}, + {9, 0x00e8}, + {7, 0x0106}, + {8, 0x005c}, + {8, 0x001c}, + {9, 0x0098}, + {7, 0x0116}, + {8, 0x007c}, + {8, 0x003c}, + {9, 0x00d8}, + {7, 0x010e}, + {8, 0x006c}, + {8, 0x002c}, + {9, 0x00b8}, + {8, 0x000c}, + {8, 0x008c}, + {8, 0x004c}, + {9, 0x00f8}, + {7, 0x0101}, + {8, 0x0052}, + {8, 0x0012}, + {8, 0x011a}, + {7, 0x0111}, + {8, 0x0072}, + {8, 0x0032}, + {9, 0x00c4}, + {7, 0x0109}, + {8, 0x0062}, + {8, 0x0022}, + {9, 0x00a4}, + {8, 0x0002}, + {8, 0x0082}, + {8, 0x0042}, + {9, 0x00e4}, + {7, 0x0105}, + {8, 0x005a}, + {8, 0x001a}, + {9, 0x0094}, + {7, 0x0115}, + {8, 0x007a}, + {8, 0x003a}, + {9, 0x00d4}, + {7, 0x010d}, + {8, 0x006a}, + {8, 0x002a}, + {9, 0x00b4}, + {8, 0x000a}, + {8, 0x008a}, + {8, 0x004a}, + {9, 0x00f4}, + {7, 0x0103}, + {8, 0x0056}, + {8, 0x0016}, + {8, 0x011e}, + {7, 0x0113}, + {8, 0x0076}, + {8, 0x0036}, + {9, 0x00cc}, + {7, 0x010b}, + {8, 0x0066}, + {8, 0x0026}, + {9, 0x00ac}, + {8, 0x0006}, + {8, 0x0086}, + {8, 0x0046}, + {9, 0x00ec}, + {7, 0x0107}, + {8, 0x005e}, + {8, 0x001e}, + {9, 0x009c}, + {7, 0x0117}, + {8, 0x007e}, + {8, 0x003e}, + {9, 0x00dc}, + {7, 0x010f}, + {8, 0x006e}, + {8, 0x002e}, + {9, 0x00bc}, + {8, 0x000e}, + {8, 0x008e}, + {8, 0x004e}, + {9, 0x00fc}, + {7, 0x0100}, + {8, 0x0051}, + {8, 0x0011}, + {8, 0x0119}, + {7, 0x0110}, + {8, 0x0071}, + {8, 0x0031}, + {9, 0x00c2}, + {7, 0x0108}, + {8, 0x0061}, + {8, 0x0021}, + {9, 0x00a2}, + {8, 0x0001}, + {8, 0x0081}, + {8, 0x0041}, + {9, 0x00e2}, + {7, 0x0104}, + {8, 0x0059}, + {8, 0x0019}, + {9, 0x0092}, + {7, 0x0114}, + {8, 0x0079}, + {8, 0x0039}, + {9, 0x00d2}, + {7, 0x010c}, + {8, 0x0069}, + {8, 0x0029}, + {9, 0x00b2}, + {8, 0x0009}, + {8, 0x0089}, + {8, 0x0049}, + {9, 0x00f2}, + {7, 0x0102}, + {8, 0x0055}, + {8, 0x0015}, + {8, 0x011d}, + {7, 0x0112}, + {8, 0x0075}, + {8, 0x0035}, + {9, 0x00ca}, + {7, 0x010a}, + {8, 0x0065}, + {8, 0x0025}, + {9, 0x00aa}, + {8, 0x0005}, + {8, 0x0085}, + {8, 0x0045}, + {9, 0x00ea}, + {7, 0x0106}, + {8, 0x005d}, + {8, 0x001d}, + {9, 0x009a}, + {7, 0x0116}, + {8, 0x007d}, + {8, 0x003d}, + {9, 0x00da}, + {7, 0x010e}, + {8, 0x006d}, + {8, 0x002d}, + {9, 0x00ba}, + {8, 0x000d}, + {8, 0x008d}, + {8, 0x004d}, + {9, 0x00fa}, + {7, 0x0101}, + {8, 0x0053}, + {8, 0x0013}, + {8, 0x011b}, + {7, 0x0111}, + {8, 0x0073}, + {8, 0x0033}, + {9, 0x00c6}, + {7, 0x0109}, + {8, 0x0063}, + {8, 0x0023}, + {9, 0x00a6}, + {8, 0x0003}, + {8, 0x0083}, + {8, 0x0043}, + {9, 0x00e6}, + {7, 0x0105}, + {8, 0x005b}, + {8, 0x001b}, + {9, 0x0096}, + {7, 0x0115}, + {8, 0x007b}, + {8, 0x003b}, + {9, 0x00d6}, + {7, 0x010d}, + {8, 0x006b}, + {8, 0x002b}, + {9, 0x00b6}, + {8, 0x000b}, + {8, 0x008b}, + {8, 0x004b}, + {9, 0x00f6}, + {7, 0x0103}, + {8, 0x0057}, + {8, 0x0017}, + {8, 0x011f}, + {7, 0x0113}, + {8, 0x0077}, + {8, 0x0037}, + {9, 0x00ce}, + {7, 0x010b}, + {8, 0x0067}, + {8, 0x0027}, + {9, 0x00ae}, + {8, 0x0007}, + {8, 0x0087}, + {8, 0x0047}, + {9, 0x00ee}, + {7, 0x0107}, + {8, 0x005f}, + {8, 0x001f}, + {9, 0x009e}, + {7, 0x0117}, + {8, 0x007f}, + {8, 0x003f}, + {9, 0x00de}, + {7, 0x010f}, + {8, 0x006f}, + {8, 0x002f}, + {9, 0x00be}, + {8, 0x000f}, + {8, 0x008f}, + {8, 0x004f}, + {9, 0x00fe}, + {7, 0x0100}, + {8, 0x0050}, + {8, 0x0010}, + {8, 0x0118}, + {7, 0x0110}, + {8, 0x0070}, + {8, 0x0030}, + {9, 0x00c1}, + {7, 0x0108}, + {8, 0x0060}, + {8, 0x0020}, + {9, 0x00a1}, + {8, 0x0000}, + {8, 0x0080}, + {8, 0x0040}, + {9, 0x00e1}, + {7, 0x0104}, + {8, 0x0058}, + {8, 0x0018}, + {9, 0x0091}, + {7, 0x0114}, + {8, 0x0078}, + {8, 0x0038}, + {9, 0x00d1}, + {7, 0x010c}, + {8, 0x0068}, + {8, 0x0028}, + {9, 0x00b1}, + {8, 0x0008}, + {8, 0x0088}, + {8, 0x0048}, + {9, 0x00f1}, + {7, 0x0102}, + {8, 0x0054}, + {8, 0x0014}, + {8, 0x011c}, + {7, 0x0112}, + {8, 0x0074}, + {8, 0x0034}, + {9, 0x00c9}, + {7, 0x010a}, + {8, 0x0064}, + {8, 0x0024}, + {9, 0x00a9}, + {8, 0x0004}, + {8, 0x0084}, + {8, 0x0044}, + {9, 0x00e9}, + {7, 0x0106}, + {8, 0x005c}, + {8, 0x001c}, + {9, 0x0099}, + {7, 0x0116}, + {8, 0x007c}, + {8, 0x003c}, + {9, 0x00d9}, + {7, 0x010e}, + {8, 0x006c}, + {8, 0x002c}, + {9, 0x00b9}, + {8, 0x000c}, + {8, 0x008c}, + {8, 0x004c}, + {9, 0x00f9}, + {7, 0x0101}, + {8, 0x0052}, + {8, 0x0012}, + {8, 0x011a}, + {7, 0x0111}, + {8, 0x0072}, + {8, 0x0032}, + {9, 0x00c5}, + {7, 0x0109}, + {8, 0x0062}, + {8, 0x0022}, + {9, 0x00a5}, + {8, 0x0002}, + {8, 0x0082}, + {8, 0x0042}, + {9, 0x00e5}, + {7, 0x0105}, + {8, 0x005a}, + {8, 0x001a}, + {9, 0x0095}, + {7, 0x0115}, + {8, 0x007a}, + {8, 0x003a}, + {9, 0x00d5}, + {7, 0x010d}, + {8, 0x006a}, + {8, 0x002a}, + {9, 0x00b5}, + {8, 0x000a}, + {8, 0x008a}, + {8, 0x004a}, + {9, 0x00f5}, + {7, 0x0103}, + {8, 0x0056}, + {8, 0x0016}, + {8, 0x011e}, + {7, 0x0113}, + {8, 0x0076}, + {8, 0x0036}, + {9, 0x00cd}, + {7, 0x010b}, + {8, 0x0066}, + {8, 0x0026}, + {9, 0x00ad}, + {8, 0x0006}, + {8, 0x0086}, + {8, 0x0046}, + {9, 0x00ed}, + {7, 0x0107}, + {8, 0x005e}, + {8, 0x001e}, + {9, 0x009d}, + {7, 0x0117}, + {8, 0x007e}, + {8, 0x003e}, + {9, 0x00dd}, + {7, 0x010f}, + {8, 0x006e}, + {8, 0x002e}, + {9, 0x00bd}, + {8, 0x000e}, + {8, 0x008e}, + {8, 0x004e}, + {9, 0x00fd}, + {7, 0x0100}, + {8, 0x0051}, + {8, 0x0011}, + {8, 0x0119}, + {7, 0x0110}, + {8, 0x0071}, + {8, 0x0031}, + {9, 0x00c3}, + {7, 0x0108}, + {8, 0x0061}, + {8, 0x0021}, + {9, 0x00a3}, + {8, 0x0001}, + {8, 0x0081}, + {8, 0x0041}, + {9, 0x00e3}, + {7, 0x0104}, + {8, 0x0059}, + {8, 0x0019}, + {9, 0x0093}, + {7, 0x0114}, + {8, 0x0079}, + {8, 0x0039}, + {9, 0x00d3}, + {7, 0x010c}, + {8, 0x0069}, + {8, 0x0029}, + {9, 0x00b3}, + {8, 0x0009}, + {8, 0x0089}, + {8, 0x0049}, + {9, 0x00f3}, + {7, 0x0102}, + {8, 0x0055}, + {8, 0x0015}, + {8, 0x011d}, + {7, 0x0112}, + {8, 0x0075}, + {8, 0x0035}, + {9, 0x00cb}, + {7, 0x010a}, + {8, 0x0065}, + {8, 0x0025}, + {9, 0x00ab}, + {8, 0x0005}, + {8, 0x0085}, + {8, 0x0045}, + {9, 0x00eb}, + {7, 0x0106}, + {8, 0x005d}, + {8, 0x001d}, + {9, 0x009b}, + {7, 0x0116}, + {8, 0x007d}, + {8, 0x003d}, + {9, 0x00db}, + {7, 0x010e}, + {8, 0x006d}, + {8, 0x002d}, + {9, 0x00bb}, + {8, 0x000d}, + {8, 0x008d}, + {8, 0x004d}, + {9, 0x00fb}, + {7, 0x0101}, + {8, 0x0053}, + {8, 0x0013}, + {8, 0x011b}, + {7, 0x0111}, + {8, 0x0073}, + {8, 0x0033}, + {9, 0x00c7}, + {7, 0x0109}, + {8, 0x0063}, + {8, 0x0023}, + {9, 0x00a7}, + {8, 0x0003}, + {8, 0x0083}, + {8, 0x0043}, + {9, 0x00e7}, + {7, 0x0105}, + {8, 0x005b}, + {8, 0x001b}, + {9, 0x0097}, + {7, 0x0115}, + {8, 0x007b}, + {8, 0x003b}, + {9, 0x00d7}, + {7, 0x010d}, + {8, 0x006b}, + {8, 0x002b}, + {9, 0x00b7}, + {8, 0x000b}, + {8, 0x008b}, + {8, 0x004b}, + {9, 0x00f7}, + {7, 0x0103}, + {8, 0x0057}, + {8, 0x0017}, + {8, 0x011f}, + {7, 0x0113}, + {8, 0x0077}, + {8, 0x0037}, + {9, 0x00cf}, + {7, 0x010b}, + {8, 0x0067}, + {8, 0x0027}, + {9, 0x00af}, + {8, 0x0007}, + {8, 0x0087}, + {8, 0x0047}, + {9, 0x00ef}, + {7, 0x0107}, + {8, 0x005f}, + {8, 0x001f}, + {9, 0x009f}, + {7, 0x0117}, + {8, 0x007f}, + {8, 0x003f}, + {9, 0x00df}, + {7, 0x010f}, + {8, 0x006f}, + {8, 0x002f}, + {9, 0x00bf}, + {8, 0x000f}, + {8, 0x008f}, + {8, 0x004f}, + {9, 0x00ff} +}; + +FlateHuffmanTab FlateStream::fixedLitCodeTab = { + flateFixedLitCodeTabCodes, 9 +}; + +static FlateCode flateFixedDistCodeTabCodes[32] = { + {5, 0x0000}, + {5, 0x0010}, + {5, 0x0008}, + {5, 0x0018}, + {5, 0x0004}, + {5, 0x0014}, + {5, 0x000c}, + {5, 0x001c}, + {5, 0x0002}, + {5, 0x0012}, + {5, 0x000a}, + {5, 0x001a}, + {5, 0x0006}, + {5, 0x0016}, + {5, 0x000e}, + {0, 0x0000}, + {5, 0x0001}, + {5, 0x0011}, + {5, 0x0009}, + {5, 0x0019}, + {5, 0x0005}, + {5, 0x0015}, + {5, 0x000d}, + {5, 0x001d}, + {5, 0x0003}, + {5, 0x0013}, + {5, 0x000b}, + {5, 0x001b}, + {5, 0x0007}, + {5, 0x0017}, + {5, 0x000f}, + {0, 0x0000} +}; + +FlateHuffmanTab FlateStream::fixedDistCodeTab = { + flateFixedDistCodeTabCodes, 5 +}; + +FlateStream::FlateStream(Stream *strA, int predictor, int columns, + int colors, int bits): + FilterStream(strA) { + if (predictor != 1) { + pred = new StreamPredictor(this, predictor, columns, colors, bits); + if (!pred->isOk()) { + delete pred; + pred = NULL; + } + } else { + pred = NULL; + } + litCodeTab.codes = NULL; + distCodeTab.codes = NULL; + memset(buf, 0, flateWindow); +} + +FlateStream::~FlateStream() { + if (litCodeTab.codes != fixedLitCodeTab.codes) { + gfree(litCodeTab.codes); + } + if (distCodeTab.codes != fixedDistCodeTab.codes) { + gfree(distCodeTab.codes); + } + if (pred) { + delete pred; + } + delete str; +} + +void FlateStream::unfilteredReset() { + index = 0; + remain = 0; + codeBuf = 0; + codeSize = 0; + compressedBlock = gFalse; + endOfBlock = gTrue; + eof = gTrue; + + str->reset(); +} + +void FlateStream::reset() { + int cmf, flg; + + unfilteredReset(); + + // read header + //~ need to look at window size? + endOfBlock = eof = gTrue; + cmf = str->getChar(); + flg = str->getChar(); + if (cmf == EOF || flg == EOF) + return; + if ((cmf & 0x0f) != 0x08) { + error(errSyntaxError, getPos(), "Unknown compression method in flate stream"); + return; + } + if ((((cmf << 8) + flg) % 31) != 0) { + error(errSyntaxError, getPos(), "Bad FCHECK in flate stream"); + return; + } + if (flg & 0x20) { + error(errSyntaxError, getPos(), "FDICT bit set in flate stream"); + return; + } + + eof = gFalse; +} + +int FlateStream::getChar() { + if (pred) { + return pred->getChar(); + } + return doGetRawChar(); +} + +int FlateStream::getChars(int nChars, Guchar *buffer) { + if (pred) { + return pred->getChars(nChars, buffer); + } else { + for (int i = 0; i < nChars; ++i) { + const int c = doGetRawChar(); + if (likely(c != EOF)) buffer[i] = c; + else return i; + } + return nChars; + } +} + +int FlateStream::lookChar() { + int c; + + if (pred) { + return pred->lookChar(); + } + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + return c; +} + +void FlateStream::getRawChars(int nChars, int *buffer) { + for (int i = 0; i < nChars; ++i) + buffer[i] = doGetRawChar(); +} + +int FlateStream::getRawChar() { + return doGetRawChar(); +} + +GooString *FlateStream::getPSFilter(int psLevel, const char *indent) { + GooString *s; + + if (psLevel < 3 || pred) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< >> /FlateDecode filter\n"); + return s; +} + +GBool FlateStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void FlateStream::readSome() { + int code1, code2; + int len, dist; + int i, j, k; + int c; + + if (endOfBlock) { + if (!startBlock()) + return; + } + + if (compressedBlock) { + if ((code1 = getHuffmanCodeWord(&litCodeTab)) == EOF) + goto err; + if (code1 < 256) { + buf[index] = code1; + remain = 1; + } else if (code1 == 256) { + endOfBlock = gTrue; + remain = 0; + } else { + code1 -= 257; + code2 = lengthDecode[code1].bits; + if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) + goto err; + len = lengthDecode[code1].first + code2; + if ((code1 = getHuffmanCodeWord(&distCodeTab)) == EOF) + goto err; + code2 = distDecode[code1].bits; + if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) + goto err; + dist = distDecode[code1].first + code2; + i = index; + j = (index - dist) & flateMask; + for (k = 0; k < len; ++k) { + buf[i] = buf[j]; + i = (i + 1) & flateMask; + j = (j + 1) & flateMask; + } + remain = len; + } + + } else { + len = (blockLen < flateWindow) ? blockLen : flateWindow; + for (i = 0, j = index; i < len; ++i, j = (j + 1) & flateMask) { + if ((c = str->getChar()) == EOF) { + endOfBlock = eof = gTrue; + break; + } + buf[j] = c & 0xff; + } + remain = i; + blockLen -= len; + if (blockLen == 0) + endOfBlock = gTrue; + } + + return; + +err: + error(errSyntaxError, getPos(), "Unexpected end of file in flate stream"); + endOfBlock = eof = gTrue; + remain = 0; +} + +GBool FlateStream::startBlock() { + int blockHdr; + int c; + int check; + + // free the code tables from the previous block + if (litCodeTab.codes != fixedLitCodeTab.codes) { + gfree(litCodeTab.codes); + } + litCodeTab.codes = NULL; + if (distCodeTab.codes != fixedDistCodeTab.codes) { + gfree(distCodeTab.codes); + } + distCodeTab.codes = NULL; + + // read block header + blockHdr = getCodeWord(3); + if (blockHdr & 1) + eof = gTrue; + blockHdr >>= 1; + + // uncompressed block + if (blockHdr == 0) { + compressedBlock = gFalse; + if ((c = str->getChar()) == EOF) + goto err; + blockLen = c & 0xff; + if ((c = str->getChar()) == EOF) + goto err; + blockLen |= (c & 0xff) << 8; + if ((c = str->getChar()) == EOF) + goto err; + check = c & 0xff; + if ((c = str->getChar()) == EOF) + goto err; + check |= (c & 0xff) << 8; + if (check != (~blockLen & 0xffff)) + error(errSyntaxError, getPos(), "Bad uncompressed block length in flate stream"); + codeBuf = 0; + codeSize = 0; + + // compressed block with fixed codes + } else if (blockHdr == 1) { + compressedBlock = gTrue; + loadFixedCodes(); + + // compressed block with dynamic codes + } else if (blockHdr == 2) { + compressedBlock = gTrue; + if (!readDynamicCodes()) { + goto err; + } + + // unknown block type + } else { + goto err; + } + + endOfBlock = gFalse; + return gTrue; + +err: + error(errSyntaxError, getPos(), "Bad block header in flate stream"); + endOfBlock = eof = gTrue; + return gFalse; +} + +void FlateStream::loadFixedCodes() { + litCodeTab.codes = fixedLitCodeTab.codes; + litCodeTab.maxLen = fixedLitCodeTab.maxLen; + distCodeTab.codes = fixedDistCodeTab.codes; + distCodeTab.maxLen = fixedDistCodeTab.maxLen; +} + +GBool FlateStream::readDynamicCodes() { + int numCodeLenCodes; + int numLitCodes; + int numDistCodes; + int codeLenCodeLengths[flateMaxCodeLenCodes]; + FlateHuffmanTab codeLenCodeTab; + int len, repeat, code; + int i; + + codeLenCodeTab.codes = NULL; + + // read lengths + if ((numLitCodes = getCodeWord(5)) == EOF) { + goto err; + } + numLitCodes += 257; + if ((numDistCodes = getCodeWord(5)) == EOF) { + goto err; + } + numDistCodes += 1; + if ((numCodeLenCodes = getCodeWord(4)) == EOF) { + goto err; + } + numCodeLenCodes += 4; + if (numLitCodes > flateMaxLitCodes || + numDistCodes > flateMaxDistCodes || + numCodeLenCodes > flateMaxCodeLenCodes) { + goto err; + } + + // build the code length code table + for (i = 0; i < flateMaxCodeLenCodes; ++i) { + codeLenCodeLengths[i] = 0; + } + for (i = 0; i < numCodeLenCodes; ++i) { + if ((codeLenCodeLengths[codeLenCodeMap[i]] = getCodeWord(3)) == -1) { + goto err; + } + } + compHuffmanCodes(codeLenCodeLengths, flateMaxCodeLenCodes, &codeLenCodeTab); + + // build the literal and distance code tables + len = 0; + repeat = 0; + i = 0; + while (i < numLitCodes + numDistCodes) { + if ((code = getHuffmanCodeWord(&codeLenCodeTab)) == EOF) { + goto err; + } + if (code == 16) { + if ((repeat = getCodeWord(2)) == EOF) { + goto err; + } + repeat += 3; + if (i + repeat > numLitCodes + numDistCodes) { + goto err; + } + for (; repeat > 0; --repeat) { + codeLengths[i++] = len; + } + } else if (code == 17) { + if ((repeat = getCodeWord(3)) == EOF) { + goto err; + } + repeat += 3; + if (i + repeat > numLitCodes + numDistCodes) { + goto err; + } + len = 0; + for (; repeat > 0; --repeat) { + codeLengths[i++] = 0; + } + } else if (code == 18) { + if ((repeat = getCodeWord(7)) == EOF) { + goto err; + } + repeat += 11; + if (i + repeat > numLitCodes + numDistCodes) { + goto err; + } + len = 0; + for (; repeat > 0; --repeat) { + codeLengths[i++] = 0; + } + } else { + codeLengths[i++] = len = code; + } + } + compHuffmanCodes(codeLengths, numLitCodes, &litCodeTab); + compHuffmanCodes(codeLengths + numLitCodes, numDistCodes, &distCodeTab); + + gfree(codeLenCodeTab.codes); + return gTrue; + +err: + error(errSyntaxError, getPos(), "Bad dynamic code table in flate stream"); + gfree(codeLenCodeTab.codes); + return gFalse; +} + +// Convert an array of lengths, in value order, into a +// Huffman code lookup table. +void FlateStream::compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab) { + int tabSize, len, code, code2, skip, val, i, t; + + // find max code length + tab->maxLen = 0; + for (val = 0; val < n; ++val) { + if (lengths[val] > tab->maxLen) { + tab->maxLen = lengths[val]; + } + } + + // allocate the table + tabSize = 1 << tab->maxLen; + tab->codes = (FlateCode *)gmallocn(tabSize, sizeof(FlateCode)); + + // clear the table + for (i = 0; i < tabSize; ++i) { + tab->codes[i].len = 0; + tab->codes[i].val = 0; + } + + // build the table + for (len = 1, code = 0, skip = 2; + len <= tab->maxLen; + ++len, code <<= 1, skip <<= 1) { + for (val = 0; val < n; ++val) { + if (lengths[val] == len) { + + // bit-reverse the code + code2 = 0; + t = code; + for (i = 0; i < len; ++i) { + code2 = (code2 << 1) | (t & 1); + t >>= 1; + } + + // fill in the table entries + for (i = code2; i < tabSize; i += skip) { + tab->codes[i].len = (Gushort)len; + tab->codes[i].val = (Gushort)val; + } + + ++code; + } + } + } +} + +int FlateStream::getHuffmanCodeWord(FlateHuffmanTab *tab) { + FlateCode *code; + int c; + + while (codeSize < tab->maxLen) { + if ((c = str->getChar()) == EOF) { + break; + } + codeBuf |= (c & 0xff) << codeSize; + codeSize += 8; + } + code = &tab->codes[codeBuf & ((1 << tab->maxLen) - 1)]; + if (codeSize == 0 || codeSize < code->len || code->len == 0) { + return EOF; + } + codeBuf >>= code->len; + codeSize -= code->len; + return (int)code->val; +} + +int FlateStream::getCodeWord(int bits) { + int c; + + while (codeSize < bits) { + if ((c = str->getChar()) == EOF) + return EOF; + codeBuf |= (c & 0xff) << codeSize; + codeSize += 8; + } + c = codeBuf & ((1 << bits) - 1); + codeBuf >>= bits; + codeSize -= bits; + return c; +} +#endif + +//------------------------------------------------------------------------ +// EOFStream +//------------------------------------------------------------------------ + +EOFStream::EOFStream(Stream *strA): + FilterStream(strA) { +} + +EOFStream::~EOFStream() { + delete str; +} + +//------------------------------------------------------------------------ +// BufStream +//------------------------------------------------------------------------ + +BufStream::BufStream(Stream *strA, int bufSizeA): FilterStream(strA) { + bufSize = bufSizeA; + buf = (int *)gmallocn(bufSize, sizeof(int)); +} + +BufStream::~BufStream() { + gfree(buf); + delete str; +} + +void BufStream::reset() { + int i; + + str->reset(); + for (i = 0; i < bufSize; ++i) { + buf[i] = str->getChar(); + } +} + +int BufStream::getChar() { + int c, i; + + c = buf[0]; + for (i = 1; i < bufSize; ++i) { + buf[i-1] = buf[i]; + } + buf[bufSize - 1] = str->getChar(); + return c; +} + +int BufStream::lookChar() { + return buf[0]; +} + +int BufStream::lookChar(int idx) { + return buf[idx]; +} + +GBool BufStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// FixedLengthEncoder +//------------------------------------------------------------------------ + +FixedLengthEncoder::FixedLengthEncoder(Stream *strA, int lengthA): + FilterStream(strA) { + length = lengthA; + count = 0; +} + +FixedLengthEncoder::~FixedLengthEncoder() { + if (str->isEncoder()) + delete str; +} + +void FixedLengthEncoder::reset() { + str->reset(); + count = 0; +} + +int FixedLengthEncoder::getChar() { + if (length >= 0 && count >= length) + return EOF; + ++count; + return str->getChar(); +} + +int FixedLengthEncoder::lookChar() { + if (length >= 0 && count >= length) + return EOF; + return str->getChar(); +} + +GBool FixedLengthEncoder::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// ASCIIHexEncoder +//------------------------------------------------------------------------ + +ASCIIHexEncoder::ASCIIHexEncoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +ASCIIHexEncoder::~ASCIIHexEncoder() { + if (str->isEncoder()) { + delete str; + } +} + +void ASCIIHexEncoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +GBool ASCIIHexEncoder::fillBuf() { + static const char *hex = "0123456789abcdef"; + int c; + + if (eof) { + return gFalse; + } + bufPtr = bufEnd = buf; + if ((c = str->getChar()) == EOF) { + *bufEnd++ = '>'; + eof = gTrue; + } else { + if (lineLen >= 64) { + *bufEnd++ = '\n'; + lineLen = 0; + } + *bufEnd++ = hex[(c >> 4) & 0x0f]; + *bufEnd++ = hex[c & 0x0f]; + lineLen += 2; + } + return gTrue; +} + +//------------------------------------------------------------------------ +// ASCII85Encoder +//------------------------------------------------------------------------ + +ASCII85Encoder::ASCII85Encoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +ASCII85Encoder::~ASCII85Encoder() { + if (str->isEncoder()) + delete str; +} + +void ASCII85Encoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +GBool ASCII85Encoder::fillBuf() { + Guint t; + char buf1[5]; + int c0, c1, c2, c3; + int n, i; + + if (eof) { + return gFalse; + } + c0 = str->getChar(); + c1 = str->getChar(); + c2 = str->getChar(); + c3 = str->getChar(); + bufPtr = bufEnd = buf; + if (c3 == EOF) { + if (c0 == EOF) { + n = 0; + t = 0; + } else { + if (c1 == EOF) { + n = 1; + t = c0 << 24; + } else if (c2 == EOF) { + n = 2; + t = (c0 << 24) | (c1 << 16); + } else { + n = 3; + t = (c0 << 24) | (c1 << 16) | (c2 << 8); + } + for (i = 4; i >= 0; --i) { + buf1[i] = (char)(t % 85 + 0x21); + t /= 85; + } + for (i = 0; i <= n; ++i) { + *bufEnd++ = buf1[i]; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } + } + *bufEnd++ = '~'; + *bufEnd++ = '>'; + eof = gTrue; + } else { + t = (c0 << 24) | (c1 << 16) | (c2 << 8) | c3; + if (t == 0) { + *bufEnd++ = 'z'; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } else { + for (i = 4; i >= 0; --i) { + buf1[i] = (char)(t % 85 + 0x21); + t /= 85; + } + for (i = 0; i <= 4; ++i) { + *bufEnd++ = buf1[i]; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } + } + } + return gTrue; +} + +//------------------------------------------------------------------------ +// RunLengthEncoder +//------------------------------------------------------------------------ + +RunLengthEncoder::RunLengthEncoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = nextEnd = buf; + eof = gFalse; +} + +RunLengthEncoder::~RunLengthEncoder() { + if (str->isEncoder()) + delete str; +} + +void RunLengthEncoder::reset() { + str->reset(); + bufPtr = bufEnd = nextEnd = buf; + eof = gFalse; +} + +// +// When fillBuf finishes, buf[] looks like this: +// +-----+--------------+-----------------+-- +// + tag | ... data ... | next 0, 1, or 2 | +// +-----+--------------+-----------------+-- +// ^ ^ ^ +// bufPtr bufEnd nextEnd +// +GBool RunLengthEncoder::fillBuf() { + int c, c1, c2; + int n; + + // already hit EOF? + if (eof) + return gFalse; + + // grab two bytes + if (nextEnd < bufEnd + 1) { + if ((c1 = str->getChar()) == EOF) { + eof = gTrue; + return gFalse; + } + } else { + c1 = bufEnd[0] & 0xff; + } + if (nextEnd < bufEnd + 2) { + if ((c2 = str->getChar()) == EOF) { + eof = gTrue; + buf[0] = 0; + buf[1] = c1; + bufPtr = buf; + bufEnd = &buf[2]; + return gTrue; + } + } else { + c2 = bufEnd[1] & 0xff; + } + + // check for repeat + c = 0; // make gcc happy + if (c1 == c2) { + n = 2; + while (n < 128 && (c = str->getChar()) == c1) + ++n; + buf[0] = (char)(257 - n); + buf[1] = c1; + bufEnd = &buf[2]; + if (c == EOF) { + eof = gTrue; + } else if (n < 128) { + buf[2] = c; + nextEnd = &buf[3]; + } else { + nextEnd = bufEnd; + } + + // get up to 128 chars + } else { + buf[1] = c1; + buf[2] = c2; + n = 2; + while (n < 128) { + if ((c = str->getChar()) == EOF) { + eof = gTrue; + break; + } + ++n; + buf[n] = c; + if (buf[n] == buf[n-1]) + break; + } + if (buf[n] == buf[n-1]) { + buf[0] = (char)(n-2-1); + bufEnd = &buf[n-1]; + nextEnd = &buf[n+1]; + } else { + buf[0] = (char)(n-1); + bufEnd = nextEnd = &buf[n+1]; + } + } + bufPtr = buf; + return gTrue; +} + +//------------------------------------------------------------------------ +// CMYKGrayEncoder +//------------------------------------------------------------------------ + +CMYKGrayEncoder::CMYKGrayEncoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + eof = gFalse; +} + +CMYKGrayEncoder::~CMYKGrayEncoder() { + if (str->isEncoder()) + delete str; +} + +void CMYKGrayEncoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + eof = gFalse; +} + +GBool CMYKGrayEncoder::fillBuf() { + int c0, c1, c2, c3; + int i; + + if (eof) { + return gFalse; + } + c0 = str->getChar(); + c1 = str->getChar(); + c2 = str->getChar(); + c3 = str->getChar(); + if (c3 == EOF) { + eof = gTrue; + return gFalse; + } + i = (3 * c0 + 6 * c1 + c2) / 10 + c3; + if (i > 255) i = 255; + bufPtr = bufEnd = buf; + *bufEnd++ = (char) i; + return gTrue; +} + +//------------------------------------------------------------------------ +// RGBGrayEncoder +//------------------------------------------------------------------------ + +RGBGrayEncoder::RGBGrayEncoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + eof = gFalse; +} + +RGBGrayEncoder::~RGBGrayEncoder() { + if (str->isEncoder()) + delete str; +} + +void RGBGrayEncoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + eof = gFalse; +} + +GBool RGBGrayEncoder::fillBuf() { + int c0, c1, c2; + int i; + + if (eof) { + return gFalse; + } + c0 = str->getChar(); + c1 = str->getChar(); + c2 = str->getChar(); + if (c2 == EOF) { + eof = gTrue; + return gFalse; + } + i = 255 - (3 * c0 + 6 * c1 + c2) / 10; + if (i < 0) i = 0; + bufPtr = bufEnd = buf; + *bufEnd++ = (char) i; + return gTrue; +} + diff --git a/poppler/Stream.h b/poppler/Stream.h new file mode 100644 index 0000000..a270fdf --- /dev/null +++ b/poppler/Stream.h @@ -0,0 +1,1239 @@ +//======================================================================== +// +// Stream.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Jeff Muizelaar +// Copyright (C) 2008 Julien Rebetez +// Copyright (C) 2008, 2010, 2011 Albert Astals Cid +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2011, 2012 William Bader +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef STREAM_H +#define STREAM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include +#include "goo/gtypes.h" +#include "Object.h" + +class BaseStream; +class CachedFile; + +//------------------------------------------------------------------------ + +enum StreamKind { + strFile, + strCachedFile, + strASCIIHex, + strASCII85, + strLZW, + strRunLength, + strCCITTFax, + strDCT, + strFlate, + strJBIG2, + strJPX, + strWeird // internal-use stream types +}; + +enum StreamColorSpaceMode { + streamCSNone, + streamCSDeviceGray, + streamCSDeviceRGB, + streamCSDeviceCMYK +}; + +//------------------------------------------------------------------------ + +// This is in Stream.h instead of Decrypt.h to avoid really annoying +// include file dependency loops. +enum CryptAlgorithm { + cryptRC4, + cryptAES, + cryptAES256 +}; + +//------------------------------------------------------------------------ + +typedef struct _ByteRange { + Guint offset; + Guint length; +} ByteRange; + +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +class Stream { +public: + + // Constructor. + Stream(); + + // Destructor. + virtual ~Stream(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get kind of stream. + virtual StreamKind getKind() = 0; + + // Reset stream to beginning. + virtual void reset() = 0; + + // Close down the stream. + virtual void close(); + + inline int doGetChars(int nChars, Guchar *buffer) + { + if (hasGetChars()) { + return getChars(nChars, buffer); + } else { + for (int i = 0; i < nChars; ++i) { + const int c = getChar(); + if (likely(c != EOF)) buffer[i] = c; + else return i; + } + return nChars; + } + } + + inline void fillGooString(GooString *s) + { + Guchar readBuf[4096]; + int readChars; + reset(); + while ((readChars = doGetChars(4096, readBuf)) != 0) { + s->append((const char *)readBuf, readChars); + } + } + + inline Guchar *toUnsignedChars(int *length, int initialSize = 4096, int sizeIncrement = 4096) + { + int readChars; + Guchar *buf = (Guchar *)gmalloc(initialSize); + int size = initialSize; + *length = 0; + int charsToRead = initialSize; + bool continueReading = true; + reset(); + while (continueReading && (readChars = doGetChars(charsToRead, &buf[*length])) != 0) { + *length += readChars; + if (readChars == charsToRead) { + if (lookChar() != EOF) { + size += sizeIncrement; + charsToRead = sizeIncrement; + buf = (Guchar *)grealloc(buf, size); + } else { + continueReading = false; + } + } else { + continueReading = false; + } + } + return buf; + } + + // Get next char from stream. + virtual int getChar() = 0; + + // Peek at next char in stream. + virtual int lookChar() = 0; + + // Get next char from stream without using the predictor. + // This is only used by StreamPredictor. + virtual int getRawChar(); + virtual void getRawChars(int nChars, int *buffer); + + // Get next char directly from stream source, without filtering it + virtual int getUnfilteredChar () = 0; + + // Resets the stream without reading anything (even not the headers) + // WARNING: Reading the stream with something else than getUnfilteredChar + // may lead to unexcepted behaviour until you call reset () + virtual void unfilteredReset () = 0; + + // Get next line from stream. + virtual char *getLine(char *buf, int size); + + // Get current position in file. + virtual int getPos() = 0; + + // Go to a position in the stream. If

is negative, the + // position is from the end of the file; otherwise the position is + // from the start of the file. + virtual void setPos(Guint pos, int dir = 0) = 0; + + // Get PostScript command for the filter(s). + virtual GooString *getPSFilter(int psLevel, const char *indent); + + // Does this stream type potentially contain non-printable chars? + virtual GBool isBinary(GBool last = gTrue) = 0; + + // Get the BaseStream of this stream. + virtual BaseStream *getBaseStream() = 0; + + // Get the stream after the last decoder (this may be a BaseStream + // or a DecryptStream). + virtual Stream *getUndecodedStream() = 0; + + // Get the dictionary associated with this stream. + virtual Dict *getDict() = 0; + + // Is this an encoding filter? + virtual GBool isEncoder() { return gFalse; } + + // Get image parameters which are defined by the stream contents. + virtual void getImageParams(int * /*bitsPerComponent*/, + StreamColorSpaceMode * /*csMode*/) {} + + // Return the next stream in the "stack". + virtual Stream *getNextStream() { return NULL; } + + // Add filters to this stream according to the parameters in . + // Returns the new stream. + Stream *addFilters(Object *dict); + +private: + virtual GBool hasGetChars() { return false; } + virtual int getChars(int nChars, Guchar *buffer); + + Stream *makeFilter(char *name, Stream *str, Object *params); + + int ref; // reference count +}; + + + //------------------------------------------------------------------------ +// OutStream +// +// This is the base class for all streams that output to a file +//------------------------------------------------------------------------ +class OutStream { +public: + // Constructor. + OutStream (); + + // Desctructor. + virtual ~OutStream (); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Close the stream + virtual void close() = 0; + + // Return position in stream + virtual int getPos() = 0; + + // Put a char in the stream + virtual void put (char c) = 0; + + //FIXME + // Printf-like function 2,3 because the first arg is class instance ? + virtual void printf (const char *format, ...) = 0 ; //__attribute__((format(printf, 2,3))) = 0; + +private: + int ref; // reference count + +}; + +//------------------------------------------------------------------------ +// FileOutStream +//------------------------------------------------------------------------ +class FileOutStream : public OutStream { +public: + FileOutStream (FILE* fa, Guint startA); + + virtual ~FileOutStream (); + + virtual void close(); + + virtual int getPos(); + + virtual void put (char c); + + virtual void printf (const char *format, ...); +private: + FILE *f; + Guint start; + +}; + + +//------------------------------------------------------------------------ +// BaseStream +// +// This is the base class for all streams that read directly from a file. +//------------------------------------------------------------------------ + +class BaseStream: public Stream { +public: + + BaseStream(Object *dictA, Guint lengthA); + virtual ~BaseStream(); + virtual Stream *makeSubStream(Guint start, GBool limited, + Guint length, Object *dict) = 0; + virtual void setPos(Guint pos, int dir = 0) = 0; + virtual GBool isBinary(GBool last = gTrue) { return last; } + virtual BaseStream *getBaseStream() { return this; } + virtual Stream *getUndecodedStream() { return this; } + virtual Dict *getDict() { return dict.getDict(); } + virtual GooString *getFileName() { return NULL; } + virtual Guint getLength() { return length; } + + // Get/set position of first byte of stream within the file. + virtual Guint getStart() = 0; + virtual void moveStart(int delta) = 0; + +protected: + + Guint length; + +private: + + Object dict; +}; + +//------------------------------------------------------------------------ +// FilterStream +// +// This is the base class for all streams that filter another stream. +//------------------------------------------------------------------------ + +class FilterStream: public Stream { +public: + + FilterStream(Stream *strA); + virtual ~FilterStream(); + virtual void close(); + virtual int getPos() { return str->getPos(); } + virtual void setPos(Guint pos, int dir = 0); + virtual BaseStream *getBaseStream() { return str->getBaseStream(); } + virtual Stream *getUndecodedStream() { return str->getUndecodedStream(); } + virtual Dict *getDict() { return str->getDict(); } + virtual Stream *getNextStream() { return str; } + + virtual int getUnfilteredChar () { return str->getUnfilteredChar(); } + virtual void unfilteredReset () { str->unfilteredReset(); } + +protected: + + Stream *str; +}; + +//------------------------------------------------------------------------ +// ImageStream +//------------------------------------------------------------------------ + +class ImageStream { +public: + + // Create an image stream object for an image with the specified + // parameters. Note that these are the actual image parameters, + // which may be different from the predictor parameters. + ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA); + + ~ImageStream(); + + // Reset the stream. + void reset(); + + // Close the stream previously reset + void close(); + + // Gets the next pixel from the stream. should be able to hold + // at least nComps elements. Returns false at end of file. + GBool getPixel(Guchar *pix); + + // Returns a pointer to the next line of pixels. Returns NULL at + // end of file. + Guchar *getLine(); + + // Skip an entire line from the image. + void skipLine(); + +private: + + Stream *str; // base stream + int width; // pixels per line + int nComps; // components per pixel + int nBits; // bits per component + int nVals; // components per line + int inputLineSize; // input line buffer size + Guchar *inputLine; // input line buffer + Guchar *imgLine; // line buffer + int imgIdx; // current index in imgLine +}; + +//------------------------------------------------------------------------ +// StreamPredictor +//------------------------------------------------------------------------ + +class StreamPredictor { +public: + + // Create a predictor object. Note that the parameters are for the + // predictor, and may not match the actual image parameters. + StreamPredictor(Stream *strA, int predictorA, + int widthA, int nCompsA, int nBitsA); + + ~StreamPredictor(); + + GBool isOk() { return ok; } + + int lookChar(); + int getChar(); + int getChars(int nChars, Guchar *buffer); + +private: + + GBool getNextLine(); + + Stream *str; // base stream + int predictor; // predictor + int width; // pixels per line + int nComps; // components per pixel + int nBits; // bits per component + int nVals; // components per line + int pixBytes; // bytes per pixel + int rowBytes; // bytes per line + Guchar *predLine; // line buffer + int predIdx; // current index in predLine + GBool ok; +}; + +//------------------------------------------------------------------------ +// FileStream +//------------------------------------------------------------------------ + +#define fileStreamBufSize 256 + +class FileStream: public BaseStream { +public: + + FileStream(FILE *fA, Guint startA, GBool limitedA, + Guint lengthA, Object *dictA); + virtual ~FileStream(); + virtual Stream *makeSubStream(Guint startA, GBool limitedA, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return strFile; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual int getPos() { return bufPos + (bufPtr - buf); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart() { return start; } + virtual void moveStart(int delta); + + virtual int getUnfilteredChar () { return getChar(); } + virtual void unfilteredReset () { reset(); } + +private: + + GBool fillBuf(); + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer) + { + int n, m; + + n = 0; + while (n < nChars) { + if (bufPtr >= bufEnd) { + if (!fillBuf()) { + break; + } + } + m = (int)(bufEnd - bufPtr); + if (m > nChars - n) { + m = nChars - n; + } + memcpy(buffer + n, bufPtr, m); + bufPtr += m; + n += m; + } + return n; + } + + FILE *f; + Guint start; + GBool limited; + char buf[fileStreamBufSize]; + char *bufPtr; + char *bufEnd; + Guint bufPos; + int savePos; + GBool saved; +}; + +//------------------------------------------------------------------------ +// CachedFileStream +//------------------------------------------------------------------------ + +#define cachedStreamBufSize 1024 + +class CachedFileStream: public BaseStream { +public: + + CachedFileStream(CachedFile *ccA, Guint startA, GBool limitedA, + Guint lengthA, Object *dictA); + virtual ~CachedFileStream(); + virtual Stream *makeSubStream(Guint startA, GBool limitedA, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return strCachedFile; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual int getPos() { return bufPos + (bufPtr - buf); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart() { return start; } + virtual void moveStart(int delta); + + virtual int getUnfilteredChar () { return getChar(); } + virtual void unfilteredReset () { reset(); } + +private: + + GBool fillBuf(); + + CachedFile *cc; + Guint start; + GBool limited; + char buf[cachedStreamBufSize]; + char *bufPtr; + char *bufEnd; + Guint bufPos; + int savePos; + GBool saved; +}; + + +//------------------------------------------------------------------------ +// MemStream +//------------------------------------------------------------------------ + +class MemStream: public BaseStream { +public: + + MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA); + virtual ~MemStream(); + virtual Stream *makeSubStream(Guint start, GBool limited, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; } + virtual int lookChar() + { return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; } + virtual int getPos() { return (int)(bufPtr - buf); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart() { return start; } + virtual void moveStart(int delta); + + //if needFree = true, the stream will delete buf when it is destroyed + //otherwise it will not touch it. Default value is false + virtual void setNeedFree (GBool val) { needFree = val; } + + virtual int getUnfilteredChar () { return getChar(); } + virtual void unfilteredReset () { reset (); } + +private: + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + char *buf; + Guint start; + char *bufEnd; + char *bufPtr; + GBool needFree; +}; + +//------------------------------------------------------------------------ +// EmbedStream +// +// This is a special stream type used for embedded streams (inline +// images). It reads directly from the base stream -- after the +// EmbedStream is deleted, reads from the base stream will proceed where +// the BaseStream left off. Note that this is very different behavior +// that creating a new FileStream (using makeSubStream). +//------------------------------------------------------------------------ + +class EmbedStream: public BaseStream { +public: + + EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Guint lengthA); + virtual ~EmbedStream(); + virtual Stream *makeSubStream(Guint start, GBool limitedA, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return str->getKind(); } + virtual void reset() {} + virtual int getChar(); + virtual int lookChar(); + virtual int getPos() { return str->getPos(); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart(); + virtual void moveStart(int delta); + + virtual int getUnfilteredChar () { return str->getUnfilteredChar(); } + virtual void unfilteredReset () { str->unfilteredReset(); } + + +private: + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + Stream *str; + GBool limited; +}; + +//------------------------------------------------------------------------ +// ASCIIHexStream +//------------------------------------------------------------------------ + +class ASCIIHexStream: public FilterStream { +public: + + ASCIIHexStream(Stream *strA); + virtual ~ASCIIHexStream(); + virtual StreamKind getKind() { return strASCIIHex; } + virtual void reset(); + virtual int getChar() + { int c = lookChar(); buf = EOF; return c; } + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int buf; + GBool eof; +}; + +//------------------------------------------------------------------------ +// ASCII85Stream +//------------------------------------------------------------------------ + +class ASCII85Stream: public FilterStream { +public: + + ASCII85Stream(Stream *strA); + virtual ~ASCII85Stream(); + virtual StreamKind getKind() { return strASCII85; } + virtual void reset(); + virtual int getChar() + { int ch = lookChar(); ++index; return ch; } + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int c[5]; + int b[4]; + int index, n; + GBool eof; +}; + +//------------------------------------------------------------------------ +// LZWStream +//------------------------------------------------------------------------ + +class LZWStream: public FilterStream { +public: + + LZWStream(Stream *strA, int predictor, int columns, int colors, + int bits, int earlyA); + virtual ~LZWStream(); + virtual StreamKind getKind() { return strLZW; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual void getRawChars(int nChars, int *buffer); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + inline int doGetRawChar() { + if (eof) { + return EOF; + } + if (seqIndex >= seqLength) { + if (!processNextCode()) { + return EOF; + } + } + return seqBuf[seqIndex++]; + } + + StreamPredictor *pred; // predictor + int early; // early parameter + GBool eof; // true if at eof + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer + struct { // decoding table + int length; + int head; + Guchar tail; + } table[4097]; + int nextCode; // next code to be used + int nextBits; // number of bits in next code word + int prevCode; // previous code used in stream + int newChar; // next char to be added to table + Guchar seqBuf[4097]; // buffer for current sequence + int seqLength; // length of current sequence + int seqIndex; // index into current sequence + GBool first; // first code after a table clear + + GBool processNextCode(); + void clearTable(); + int getCode(); +}; + +//------------------------------------------------------------------------ +// RunLengthStream +//------------------------------------------------------------------------ + +class RunLengthStream: public FilterStream { +public: + + RunLengthStream(Stream *strA); + virtual ~RunLengthStream(); + virtual StreamKind getKind() { return strRunLength; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + char buf[128]; // buffer + char *bufPtr; // next char to read + char *bufEnd; // end of buffer + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// CCITTFaxStream +//------------------------------------------------------------------------ + +struct CCITTCodeTable; + +class CCITTFaxStream: public FilterStream { +public: + + CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA, + GBool byteAlignA, int columnsA, int rowsA, + GBool endOfBlockA, GBool blackA); + virtual ~CCITTFaxStream(); + virtual StreamKind getKind() { return strCCITTFax; } + virtual void reset(); + virtual int getChar() + { int c = lookChar(); buf = EOF; return c; } + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + + virtual void unfilteredReset (); + +private: + + void ccittReset(GBool unfiltered); + int encoding; // 'K' parameter + GBool endOfLine; // 'EndOfLine' parameter + GBool byteAlign; // 'EncodedByteAlign' parameter + int columns; // 'Columns' parameter + int rows; // 'Rows' parameter + GBool endOfBlock; // 'EndOfBlock' parameter + GBool black; // 'BlackIs1' parameter + GBool eof; // true if at eof + GBool nextLine2D; // true if next line uses 2D encoding + int row; // current row + Guint inputBuf; // input buffer + int inputBits; // number of bits in input buffer + int *codingLine; // coding line changing elements + int *refLine; // reference line changing elements + int a0i; // index into codingLine + GBool err; // error on current line + int outputBits; // remaining ouput bits + int buf; // character buffer + + void addPixels(int a1, int blackPixels); + void addPixelsNeg(int a1, int blackPixels); + short getTwoDimCode(); + short getWhiteCode(); + short getBlackCode(); + short lookBits(int n); + void eatBits(int n) { if ((inputBits -= n) < 0) inputBits = 0; } +}; + +#ifndef ENABLE_LIBJPEG +//------------------------------------------------------------------------ +// DCTStream +//------------------------------------------------------------------------ + +// DCT component info +struct DCTCompInfo { + int id; // component ID + int hSample, vSample; // horiz/vert sampling resolutions + int quantTable; // quantization table number + int prevDC; // DC coefficient accumulator +}; + +struct DCTScanInfo { + GBool comp[4]; // comp[i] is set if component i is + // included in this scan + int numComps; // number of components in the scan + int dcHuffTable[4]; // DC Huffman table numbers + int acHuffTable[4]; // AC Huffman table numbers + int firstCoeff, lastCoeff; // first and last DCT coefficient + int ah, al; // successive approximation parameters +}; + +// DCT Huffman decoding table +struct DCTHuffTable { + Guchar firstSym[17]; // first symbol for this bit length + Gushort firstCode[17]; // first code for this bit length + Gushort numCodes[17]; // number of codes of this bit length + Guchar sym[256]; // symbols +}; + +class DCTStream: public FilterStream { +public: + + DCTStream(Stream *strA, int colorXformA); + virtual ~DCTStream(); + virtual StreamKind getKind() { return strDCT; } + virtual void reset(); + virtual void close(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + + virtual void unfilteredReset(); + +private: + + void dctReset(GBool unfiltered); + GBool progressive; // set if in progressive mode + GBool interleaved; // set if in interleaved mode + int width, height; // image size + int mcuWidth, mcuHeight; // size of min coding unit, in data units + int bufWidth, bufHeight; // frameBuf size + DCTCompInfo compInfo[4]; // info for each component + DCTScanInfo scanInfo; // info for the current scan + int numComps; // number of components in image + int colorXform; // color transform: -1 = unspecified + // 0 = none + // 1 = YUV/YUVK -> RGB/CMYK + GBool gotJFIFMarker; // set if APP0 JFIF marker was present + GBool gotAdobeMarker; // set if APP14 Adobe marker was present + int restartInterval; // restart interval, in MCUs + Gushort quantTables[4][64]; // quantization tables + int numQuantTables; // number of quantization tables + DCTHuffTable dcHuffTables[4]; // DC Huffman tables + DCTHuffTable acHuffTables[4]; // AC Huffman tables + int numDCHuffTables; // number of DC Huffman tables + int numACHuffTables; // number of AC Huffman tables + Guchar *rowBuf[4][32]; // buffer for one MCU (non-progressive mode) + int *frameBuf[4]; // buffer for frame (progressive mode) + int comp, x, y, dy; // current position within image/MCU + int restartCtr; // MCUs left until restart + int restartMarker; // next restart marker + int eobRun; // number of EOBs left in the current run + int inputBuf; // input buffer for variable length codes + int inputBits; // number of valid bits in input buffer + + void restart(); + GBool readMCURow(); + void readScan(); + GBool readDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]); + GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]); + void decodeImage(); + void transformDataUnit(Gushort *quantTable, + int dataIn[64], Guchar dataOut[64]); + int readHuffSym(DCTHuffTable *table); + int readAmp(int size); + int readBit(); + GBool readHeader(); + GBool readBaselineSOF(); + GBool readProgressiveSOF(); + GBool readScanInfo(); + GBool readQuantTables(); + GBool readHuffmanTables(); + GBool readRestartInterval(); + GBool readJFIFMarker(); + GBool readAdobeMarker(); + GBool readTrailer(); + int readMarker(); + int read16(); +}; + +#endif + +#ifndef ENABLE_ZLIB +//------------------------------------------------------------------------ +// FlateStream +//------------------------------------------------------------------------ + +#define flateWindow 32768 // buffer size +#define flateMask (flateWindow-1) +#define flateMaxHuffman 15 // max Huffman code length +#define flateMaxCodeLenCodes 19 // max # code length codes +#define flateMaxLitCodes 288 // max # literal codes +#define flateMaxDistCodes 30 // max # distance codes + +// Huffman code table entry +struct FlateCode { + Gushort len; // code length, in bits + Gushort val; // value represented by this code +}; + +struct FlateHuffmanTab { + FlateCode *codes; + int maxLen; +}; + +// Decoding info for length and distance code words +struct FlateDecode { + int bits; // # extra bits + int first; // first length/distance +}; + +class FlateStream: public FilterStream { +public: + + FlateStream(Stream *strA, int predictor, int columns, + int colors, int bits); + virtual ~FlateStream(); + virtual StreamKind getKind() { return strFlate; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual void getRawChars(int nChars, int *buffer); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + virtual void unfilteredReset (); + +private: + inline int doGetRawChar() { + int c; + + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + index = (index + 1) & flateMask; + --remain; + return c; + } + + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); + + StreamPredictor *pred; // predictor + Guchar buf[flateWindow]; // output data buffer + int index; // current index into output buffer + int remain; // number valid bytes in output buffer + int codeBuf; // input buffer + int codeSize; // number of bits in input buffer + int // literal and distance code lengths + codeLengths[flateMaxLitCodes + flateMaxDistCodes]; + FlateHuffmanTab litCodeTab; // literal code table + FlateHuffmanTab distCodeTab; // distance code table + GBool compressedBlock; // set if reading a compressed block + int blockLen; // remaining length of uncompressed block + GBool endOfBlock; // set when end of block is reached + GBool eof; // set when end of stream is reached + + static int // code length code reordering + codeLenCodeMap[flateMaxCodeLenCodes]; + static FlateDecode // length decoding info + lengthDecode[flateMaxLitCodes-257]; + static FlateDecode // distance decoding info + distDecode[flateMaxDistCodes]; + static FlateHuffmanTab // fixed literal code table + fixedLitCodeTab; + static FlateHuffmanTab // fixed distance code table + fixedDistCodeTab; + + void readSome(); + GBool startBlock(); + void loadFixedCodes(); + GBool readDynamicCodes(); + void compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab); + int getHuffmanCodeWord(FlateHuffmanTab *tab); + int getCodeWord(int bits); +}; +#endif + +//------------------------------------------------------------------------ +// EOFStream +//------------------------------------------------------------------------ + +class EOFStream: public FilterStream { +public: + + EOFStream(Stream *strA); + virtual ~EOFStream(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset() {} + virtual int getChar() { return EOF; } + virtual int lookChar() { return EOF; } + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; } +}; + +//------------------------------------------------------------------------ +// BufStream +//------------------------------------------------------------------------ + +class BufStream: public FilterStream { +public: + + BufStream(Stream *strA, int bufSizeA); + virtual ~BufStream(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent) + { return NULL; } + virtual GBool isBinary(GBool last = gTrue); + + int lookChar(int idx); + +private: + + int *buf; + int bufSize; +}; + +//------------------------------------------------------------------------ +// FixedLengthEncoder +//------------------------------------------------------------------------ + +class FixedLengthEncoder: public FilterStream { +public: + + FixedLengthEncoder(Stream *strA, int lengthA); + ~FixedLengthEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/); + virtual GBool isEncoder() { return gTrue; } + +private: + + int length; + int count; +}; + +//------------------------------------------------------------------------ +// ASCIIHexEncoder +//------------------------------------------------------------------------ + +class ASCIIHexEncoder: public FilterStream { +public: + + ASCIIHexEncoder(Stream *strA); + virtual ~ASCIIHexEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[4]; + char *bufPtr; + char *bufEnd; + int lineLen; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// ASCII85Encoder +//------------------------------------------------------------------------ + +class ASCII85Encoder: public FilterStream { +public: + + ASCII85Encoder(Stream *strA); + virtual ~ASCII85Encoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[8]; + char *bufPtr; + char *bufEnd; + int lineLen; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// RunLengthEncoder +//------------------------------------------------------------------------ + +class RunLengthEncoder: public FilterStream { +public: + + RunLengthEncoder(Stream *strA); + virtual ~RunLengthEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/) { return gTrue; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[131]; + char *bufPtr; + char *bufEnd; + char *nextEnd; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// CMYKGrayEncoder +//------------------------------------------------------------------------ + +class CMYKGrayEncoder: public FilterStream { +public: + + CMYKGrayEncoder(Stream *strA); + virtual ~CMYKGrayEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[2]; + char *bufPtr; + char *bufEnd; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// RGBGrayEncoder +//------------------------------------------------------------------------ + +class RGBGrayEncoder: public FilterStream { +public: + + RGBGrayEncoder(Stream *strA); + virtual ~RGBGrayEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GooString *getPSFilter(int /*psLevel*/, const char * /*indent*/) { return NULL; } + virtual GBool isBinary(GBool /*last = gTrue*/) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[2]; + char *bufPtr; + char *bufEnd; + GBool eof; + + GBool fillBuf(); +}; + +#endif diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc new file mode 100644 index 0000000..e8d993b --- /dev/null +++ b/poppler/TextOutputDev.cc @@ -0,0 +1,5612 @@ +//======================================================================== +// +// TextOutputDev.cc +// +// Copyright 1997-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2007 Kristian Høgsberg +// Copyright (C) 2005 Nickolay V. Shmyrev +// Copyright (C) 2006-2008, 2011 Carlos Garcia Campos +// Copyright (C) 2006, 2007 Ed Catmur +// Copyright (C) 2006 Jeff Muizelaar +// Copyright (C) 2007, 2008 Adrian Johnson +// Copyright (C) 2008 Koji Otani +// Copyright (C) 2008, 2010, 2011 Albert Astals Cid +// Copyright (C) 2008 Pino Toscano +// Copyright (C) 2008, 2010 Hib Eris +// Copyright (C) 2009 Ross Moore +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2010 Brian Ewins +// Copyright (C) 2010 Suzuki Toshiya +// Copyright (C) 2011 Sam Liao +// Copyright (C) 2012 Horst Prote +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include // for O_BINARY +#include // for setmode +#endif +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "poppler-config.h" +#include "Error.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" +#include "UnicodeTypeTable.h" +#include "Link.h" +#include "TextOutputDev.h" +#include "Page.h" +#include "Annot.h" +#include "PDFDocEncoding.h" + +#ifdef MACOS +// needed for setting type/creator of MacOS files +#include "ICSupport.h" +#endif + +//------------------------------------------------------------------------ +// parameters +//------------------------------------------------------------------------ + +// Each bucket in a text pool includes baselines within a range of +// this many points. +#define textPoolStep 4 + +// Inter-character space width which will cause addChar to start a new +// word. +#define minWordBreakSpace 0.1 + +// Negative inter-character space width, i.e., overlap, which will +// cause addChar to start a new word. +#define minDupBreakOverlap 0.2 + +// Max distance between baselines of two lines within a block, as a +// fraction of the font size. +#define maxLineSpacingDelta 1.5 + +// Max difference in primary font sizes on two lines in the same +// block. Delta1 is used when examining new lines above and below the +// current block; delta2 is used when examining text that overlaps the +// current block; delta3 is used when examining text to the left and +// right of the current block. +#define maxBlockFontSizeDelta1 0.05 +#define maxBlockFontSizeDelta2 0.6 +#define maxBlockFontSizeDelta3 0.2 + +// Max difference in font sizes inside a word. +#define maxWordFontSizeDelta 0.05 + +// Maximum distance between baselines of two words on the same line, +// e.g., distance between subscript or superscript and the primary +// baseline, as a fraction of the font size. +#define maxIntraLineDelta 0.5 + +// Minimum inter-word spacing, as a fraction of the font size. (Only +// used for raw ordering.) +#define minWordSpacing 0.15 + +// Maximum inter-word spacing, as a fraction of the font size. +#define maxWordSpacing 1.5 + +// Maximum horizontal spacing which will allow a word to be pulled +// into a block. +#define minColSpacing1 0.3 + +// Minimum spacing between columns, as a fraction of the font size. +#define minColSpacing2 1.0 + +// Maximum vertical spacing between blocks within a flow, as a +// multiple of the font size. +#define maxBlockSpacing 2.5 + +// Minimum spacing between characters within a word, as a fraction of +// the font size. +#define minCharSpacing -0.2 + +// Maximum spacing between characters within a word, as a fraction of +// the font size, when there is no obvious extra-wide character +// spacing. +#define maxCharSpacing 0.03 + +// When extra-wide character spacing is detected, the inter-character +// space threshold is set to the minimum inter-character space +// multiplied by this constant. +#define maxWideCharSpacingMul 1.3 + +// Upper limit on spacing between characters in a word. +#define maxWideCharSpacing 0.4 + +// Max difference in primary,secondary coordinates (as a fraction of +// the font size) allowed for duplicated text (fake boldface, drop +// shadows) which is to be discarded. +#define dupMaxPriDelta 0.1 +#define dupMaxSecDelta 0.2 + +// Max width of underlines (in points). +#define maxUnderlineWidth 3 + +// Min distance between baseline and underline (in points). +//~ this should be font-size-dependent +#define minUnderlineGap -2 + +// Max distance between baseline and underline (in points). +//~ this should be font-size-dependent +#define maxUnderlineGap 4 + +// Max horizontal distance between edge of word and start of underline +// (in points). +//~ this should be font-size-dependent +#define underlineSlack 1 + +// Max distance between edge of text and edge of link border +#define hyperlinkSlack 2 + +//------------------------------------------------------------------------ +// TextUnderline +//------------------------------------------------------------------------ + +class TextUnderline { +public: + + TextUnderline(double x0A, double y0A, double x1A, double y1A) + { x0 = x0A; y0 = y0A; x1 = x1A; y1 = y1A; horiz = y0 == y1; } + ~TextUnderline() {} + + double x0, y0, x1, y1; + GBool horiz; +}; + +//------------------------------------------------------------------------ +// TextLink +//------------------------------------------------------------------------ + +class TextLink { +public: + + TextLink(int xMinA, int yMinA, int xMaxA, int yMaxA, AnnotLink *linkA) + { xMin = xMinA; yMin = yMinA; xMax = xMaxA; yMax = yMaxA; link = linkA; } + ~TextLink() {} + + int xMin, yMin, xMax, yMax; + AnnotLink *link; +}; + +//------------------------------------------------------------------------ +// TextFontInfo +//------------------------------------------------------------------------ + +TextFontInfo::TextFontInfo(GfxState *state) { + gfxFont = state->getFont(); + if (gfxFont) + gfxFont->incRefCnt(); +#if TEXTOUT_WORD_LIST + fontName = (gfxFont && gfxFont->getName()) ? gfxFont->getName()->copy() + : (GooString *)NULL; + flags = gfxFont ? gfxFont->getFlags() : 0; +#endif +} + +TextFontInfo::~TextFontInfo() { + if (gfxFont) + gfxFont->decRefCnt(); +#if TEXTOUT_WORD_LIST + if (fontName) { + delete fontName; + } +#endif +} + +GBool TextFontInfo::matches(GfxState *state) { + return state->getFont() == gfxFont; +} + +GBool TextFontInfo::matches(TextFontInfo *fontInfo) { + return gfxFont == fontInfo->gfxFont; +} + +//------------------------------------------------------------------------ +// TextWord +//------------------------------------------------------------------------ + +TextWord::TextWord(GfxState *state, int rotA, double x0, double y0, + TextFontInfo *fontA, double fontSizeA) { + GfxFont *gfxFont; + double x, y, ascent, descent; + int wMode; + + rot = rotA; + font = fontA; + fontSize = fontSizeA; + state->transform(x0, y0, &x, &y); + if ((gfxFont = font->gfxFont)) { + ascent = gfxFont->getAscent() * fontSize; + descent = gfxFont->getDescent() * fontSize; + wMode = gfxFont->getWMode(); + } else { + // this means that the PDF file draws text without a current font, + // which should never happen + ascent = 0.95 * fontSize; + descent = -0.35 * fontSize; + wMode = 0; + } + if (wMode) { // vertical writing mode + // NB: the rotation value has been incremented by 1 (in + // TextPage::beginWord()) for vertical writing mode + switch (rot) { + case 0: + yMin = y - fontSize; + yMax = y; + base = y; + break; + case 1: + xMin = x; + xMax = x + fontSize; + base = x; + break; + case 2: + yMin = y; + yMax = y + fontSize; + base = y; + break; + case 3: + xMin = x - fontSize; + xMax = x; + base = x; + break; + } + } else { // horizontal writing mode + switch (rot) { + case 0: + yMin = y - ascent; + yMax = y - descent; + if (yMin == yMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + yMin = y; + yMax = y + 1; + } + base = y; + break; + case 1: + xMin = x + descent; + xMax = x + ascent; + if (xMin == xMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + xMin = x; + xMax = x + 1; + } + base = x; + break; + case 2: + yMin = y + descent; + yMax = y + ascent; + if (yMin == yMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + yMin = y; + yMax = y + 1; + } + base = y; + break; + case 3: + xMin = x - ascent; + xMax = x - descent; + if (xMin == xMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + xMin = x; + xMax = x + 1; + } + base = x; + break; + } + } + text = NULL; + charcode = NULL; + edge = NULL; + charPos = NULL; + len = size = 0; + spaceAfter = gFalse; + next = NULL; + +#if TEXTOUT_WORD_LIST + GfxRGB rgb; + + if ((state->getRender() & 3) == 1) { + state->getStrokeRGB(&rgb); + } else { + state->getFillRGB(&rgb); + } + colorR = colToDbl(rgb.r); + colorG = colToDbl(rgb.g); + colorB = colToDbl(rgb.b); +#endif + + underlined = gFalse; + link = NULL; +} + +TextWord::~TextWord() { + gfree(text); + gfree(charcode); + gfree(edge); + gfree(charPos); +} + +void TextWord::addChar(GfxState *state, double x, double y, + double dx, double dy, int charPosA, int charLen, + CharCode c, Unicode u) { + int wMode; + + if (len == size) { + size += 16; + text = (Unicode *)greallocn(text, size, sizeof(Unicode)); + charcode = (Unicode *)greallocn(charcode, size, sizeof(CharCode)); + edge = (double *)greallocn(edge, (size + 1), sizeof(double)); + charPos = (int *)greallocn(charPos, size + 1, sizeof(int)); + } + text[len] = u; + charcode[len] = c; + charPos[len] = charPosA; + charPos[len + 1] = charPosA + charLen; + wMode = font->gfxFont ? font->gfxFont->getWMode() : 0; + if (wMode) { // vertical writing mode + // NB: the rotation value has been incremented by 1 (in + // TextPage::beginWord()) for vertical writing mode + switch (rot) { + case 0: + if (len == 0) { + xMin = x - fontSize; + } + edge[len] = x - fontSize; + xMax = edge[len+1] = x; + break; + case 1: + if (len == 0) { + yMin = y - fontSize; + } + edge[len] = y - fontSize; + yMax = edge[len+1] = y; + break; + case 2: + if (len == 0) { + xMax = x + fontSize; + } + edge[len] = x + fontSize; + xMin = edge[len+1] = x; + break; + case 3: + if (len == 0) { + yMax = y + fontSize; + } + edge[len] = y + fontSize; + yMin = edge[len+1] = y; + break; + } + } else { // horizontal writing mode + switch (rot) { + case 0: + if (len == 0) { + xMin = x; + } + edge[len] = x; + xMax = edge[len+1] = x + dx; + break; + case 1: + if (len == 0) { + yMin = y; + } + edge[len] = y; + yMax = edge[len+1] = y + dy; + break; + case 2: + if (len == 0) { + xMax = x; + } + edge[len] = x; + xMin = edge[len+1] = x + dx; + break; + case 3: + if (len == 0) { + yMax = y; + } + edge[len] = y; + yMin = edge[len+1] = y + dy; + break; + } + } + ++len; +} + +void TextWord::merge(TextWord *word) { + int i; + + if (word->xMin < xMin) { + xMin = word->xMin; + } + if (word->yMin < yMin) { + yMin = word->yMin; + } + if (word->xMax > xMax) { + xMax = word->xMax; + } + if (word->yMax > yMax) { + yMax = word->yMax; + } + if (len + word->len > size) { + size = len + word->len; + text = (Unicode *)greallocn(text, size, sizeof(Unicode)); + charcode = (CharCode *)greallocn(charcode, (size + 1), sizeof(CharCode)); + edge = (double *)greallocn(edge, (size + 1), sizeof(double)); + charPos = (int *)greallocn(charPos, size + 1, sizeof(int)); + } + for (i = 0; i < word->len; ++i) { + text[len + i] = word->text[i]; + charcode[len + i] = word->charcode[i]; + edge[len + i] = word->edge[i]; + charPos[len + i] = word->charPos[i]; + } + edge[len + word->len] = word->edge[word->len]; + charPos[len + word->len] = word->charPos[word->len]; + len += word->len; +} + +inline int TextWord::primaryCmp(TextWord *word) { + double cmp; + + cmp = 0; // make gcc happy + switch (rot) { + case 0: + cmp = xMin - word->xMin; + break; + case 1: + cmp = yMin - word->yMin; + break; + case 2: + cmp = word->xMax - xMax; + break; + case 3: + cmp = word->yMax - yMax; + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +double TextWord::primaryDelta(TextWord *word) { + double delta; + + delta = 0; // make gcc happy + switch (rot) { + case 0: + delta = word->xMin - xMax; + break; + case 1: + delta = word->yMin - yMax; + break; + case 2: + delta = xMin - word->xMax; + break; + case 3: + delta = yMin - word->yMax; + break; + } + return delta; +} + +int TextWord::cmpYX(const void *p1, const void *p2) { + TextWord *word1 = *(TextWord **)p1; + TextWord *word2 = *(TextWord **)p2; + double cmp; + + cmp = word1->yMin - word2->yMin; + if (cmp == 0) { + cmp = word1->xMin - word2->xMin; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +#if TEXTOUT_WORD_LIST + +GooString *TextWord::getText() { + GooString *s; + UnicodeMap *uMap; + char buf[8]; + int n, i; + + s = new GooString(); + if (!(uMap = globalParams->getTextEncoding())) { + return s; + } + for (i = 0; i < len; ++i) { + n = uMap->mapUnicode(text[i], buf, sizeof(buf)); + s->append(buf, n); + } + uMap->decRefCnt(); + return s; +} + +void TextWord::getCharBBox(int charIdx, double *xMinA, double *yMinA, + double *xMaxA, double *yMaxA) { + if (charIdx < 0 || charIdx >= len) { + return; + } + switch (rot) { + case 0: + *xMinA = edge[charIdx]; + *xMaxA = edge[charIdx + 1]; + *yMinA = yMin; + *yMaxA = yMax; + break; + case 1: + *xMinA = xMin; + *xMaxA = xMax; + *yMinA = edge[charIdx]; + *yMaxA = edge[charIdx + 1]; + break; + case 2: + *xMinA = edge[charIdx + 1]; + *xMaxA = edge[charIdx]; + *yMinA = yMin; + *yMaxA = yMax; + break; + case 3: + *xMinA = xMin; + *xMaxA = xMax; + *yMinA = edge[charIdx + 1]; + *yMaxA = edge[charIdx]; + break; + } +} + +#endif // TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextPool +//------------------------------------------------------------------------ + +TextPool::TextPool() { + minBaseIdx = 0; + maxBaseIdx = -1; + pool = NULL; + cursor = NULL; + cursorBaseIdx = -1; +} + +TextPool::~TextPool() { + int baseIdx; + TextWord *word, *word2; + + for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { + for (word = pool[baseIdx - minBaseIdx]; word; word = word2) { + word2 = word->next; + delete word; + } + } + gfree(pool); +} + +int TextPool::getBaseIdx(double base) { + int baseIdx; + + baseIdx = (int)(base / textPoolStep); + if (baseIdx < minBaseIdx) { + return minBaseIdx; + } + if (baseIdx > maxBaseIdx) { + return maxBaseIdx; + } + return baseIdx; +} + +void TextPool::addWord(TextWord *word) { + TextWord **newPool; + int wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx; + TextWord *w0, *w1; + + // expand the array if needed + wordBaseIdx = (int)(word->base / textPoolStep); + if (minBaseIdx > maxBaseIdx) { + minBaseIdx = wordBaseIdx - 128; + maxBaseIdx = wordBaseIdx + 128; + pool = (TextWord **)gmallocn(maxBaseIdx - minBaseIdx + 1, + sizeof(TextWord *)); + for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { + pool[baseIdx - minBaseIdx] = NULL; + } + } else if (wordBaseIdx < minBaseIdx) { + newMinBaseIdx = wordBaseIdx - 128; + newPool = (TextWord **)gmallocn(maxBaseIdx - newMinBaseIdx + 1, + sizeof(TextWord *)); + for (baseIdx = newMinBaseIdx; baseIdx < minBaseIdx; ++baseIdx) { + newPool[baseIdx - newMinBaseIdx] = NULL; + } + memcpy(&newPool[minBaseIdx - newMinBaseIdx], pool, + (maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *)); + gfree(pool); + pool = newPool; + minBaseIdx = newMinBaseIdx; + } else if (wordBaseIdx > maxBaseIdx) { + newMaxBaseIdx = wordBaseIdx + 128; + pool = (TextWord **)greallocn(pool, newMaxBaseIdx - minBaseIdx + 1, + sizeof(TextWord *)); + for (baseIdx = maxBaseIdx + 1; baseIdx <= newMaxBaseIdx; ++baseIdx) { + pool[baseIdx - minBaseIdx] = NULL; + } + maxBaseIdx = newMaxBaseIdx; + } + + // insert the new word + if (cursor && wordBaseIdx == cursorBaseIdx && + word->primaryCmp(cursor) >= 0) { + w0 = cursor; + w1 = cursor->next; + } else { + w0 = NULL; + w1 = pool[wordBaseIdx - minBaseIdx]; + } + for (; w1 && word->primaryCmp(w1) > 0; w0 = w1, w1 = w1->next) ; + word->next = w1; + if (w0) { + w0->next = word; + } else { + pool[wordBaseIdx - minBaseIdx] = word; + } + cursor = word; + cursorBaseIdx = wordBaseIdx; +} + +//------------------------------------------------------------------------ +// TextLine +//------------------------------------------------------------------------ + +TextLine::TextLine(TextBlock *blkA, int rotA, double baseA) { + blk = blkA; + rot = rotA; + base = baseA; + words = lastWord = NULL; + text = NULL; + edge = NULL; + col = NULL; + len = 0; + convertedLen = 0; + hyphenated = gFalse; + next = NULL; + xMin = yMin = 0; + xMax = yMax = -1; + normalized = NULL; + normalized_len = 0; + normalized_idx = NULL; +} + +TextLine::~TextLine() { + TextWord *word; + + while (words) { + word = words; + words = words->next; + delete word; + } + gfree(text); + gfree(edge); + gfree(col); + if (normalized) { + gfree(normalized); + gfree(normalized_idx); + } +} + +void TextLine::addWord(TextWord *word) { + if (lastWord) { + lastWord->next = word; + } else { + words = word; + } + lastWord = word; + + if (xMin > xMax) { + xMin = word->xMin; + xMax = word->xMax; + yMin = word->yMin; + yMax = word->yMax; + } else { + if (word->xMin < xMin) { + xMin = word->xMin; + } + if (word->xMax > xMax) { + xMax = word->xMax; + } + if (word->yMin < yMin) { + yMin = word->yMin; + } + if (word->yMax > yMax) { + yMax = word->yMax; + } + } +} + +double TextLine::primaryDelta(TextLine *line) { + double delta; + + delta = 0; // make gcc happy + switch (rot) { + case 0: + delta = line->xMin - xMax; + break; + case 1: + delta = line->yMin - yMax; + break; + case 2: + delta = xMin - line->xMax; + break; + case 3: + delta = yMin - line->yMax; + break; + } + return delta; +} + +int TextLine::primaryCmp(TextLine *line) { + double cmp; + + cmp = 0; // make gcc happy + switch (rot) { + case 0: + cmp = xMin - line->xMin; + break; + case 1: + cmp = yMin - line->yMin; + break; + case 2: + cmp = line->xMax - xMax; + break; + case 3: + cmp = line->yMax - yMax; + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLine::secondaryCmp(TextLine *line) { + double cmp; + + cmp = (rot == 0 || rot == 3) ? base - line->base : line->base - base; + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLine::cmpYX(TextLine *line) { + int cmp; + + if ((cmp = secondaryCmp(line))) { + return cmp; + } + return primaryCmp(line); +} + +int TextLine::cmpXY(const void *p1, const void *p2) { + TextLine *line1 = *(TextLine **)p1; + TextLine *line2 = *(TextLine **)p2; + int cmp; + + if ((cmp = line1->primaryCmp(line2))) { + return cmp; + } + return line1->secondaryCmp(line2); +} + +void TextLine::coalesce(UnicodeMap *uMap) { + TextWord *word0, *word1; + double space, delta, minSpace; + GBool isUnicode; + char buf[8]; + int i, j; + + if (words->next) { + + // compute the inter-word space threshold + if (words->len > 1 || words->next->len > 1) { + minSpace = 0; + } else { + minSpace = words->primaryDelta(words->next); + for (word0 = words->next, word1 = word0->next; + word1 && minSpace > 0; + word0 = word1, word1 = word0->next) { + if (word1->len > 1) { + minSpace = 0; + } + delta = word0->primaryDelta(word1); + if (delta < minSpace) { + minSpace = delta; + } + } + } + if (minSpace <= 0) { + space = maxCharSpacing * words->fontSize; + } else { + space = maxWideCharSpacingMul * minSpace; + if (space > maxWideCharSpacing * words->fontSize) { + space = maxWideCharSpacing * words->fontSize; + } + } + + // merge words + word0 = words; + word1 = words->next; + while (word1) { + if (word0->primaryDelta(word1) >= space) { + word0->spaceAfter = gTrue; + word0 = word1; + word1 = word1->next; + } else if (word0->font == word1->font && + word0->underlined == word1->underlined && + fabs(word0->fontSize - word1->fontSize) < + maxWordFontSizeDelta * words->fontSize && + word1->charPos[0] == word0->charPos[word0->len]) { + word0->merge(word1); + word0->next = word1->next; + delete word1; + word1 = word0->next; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + + // build the line text + isUnicode = uMap ? uMap->isUnicode() : gFalse; + len = 0; + for (word1 = words; word1; word1 = word1->next) { + len += word1->len; + if (word1->spaceAfter) { + ++len; + } + } + text = (Unicode *)gmallocn(len, sizeof(Unicode)); + edge = (double *)gmallocn(len + 1, sizeof(double)); + i = 0; + for (word1 = words; word1; word1 = word1->next) { + for (j = 0; j < word1->len; ++j) { + text[i] = word1->text[j]; + edge[i] = word1->edge[j]; + ++i; + } + edge[i] = word1->edge[word1->len]; + if (word1->spaceAfter) { + text[i] = (Unicode)0x0020; + ++i; + } + } + + // compute convertedLen and set up the col array + col = (int *)gmallocn(len + 1, sizeof(int)); + convertedLen = 0; + for (i = 0; i < len; ++i) { + col[i] = convertedLen; + if (isUnicode) { + ++convertedLen; + } else if (uMap) { + convertedLen += uMap->mapUnicode(text[i], buf, sizeof(buf)); + } + } + col[len] = convertedLen; + + // check for hyphen at end of line + //~ need to check for other chars used as hyphens + hyphenated = text[len - 1] == (Unicode)'-'; +} + +//------------------------------------------------------------------------ +// TextLineFrag +//------------------------------------------------------------------------ + +class TextLineFrag { +public: + + TextLine *line; // the line object + int start, len; // offset and length of this fragment + // (in Unicode chars) + double xMin, xMax; // bounding box coordinates + double yMin, yMax; + double base; // baseline virtual coordinate + int col; // first column + + void init(TextLine *lineA, int startA, int lenA); + void computeCoords(GBool oneRot); + + static int cmpYXPrimaryRot(const void *p1, const void *p2); + static int cmpYXLineRot(const void *p1, const void *p2); + static int cmpXYLineRot(const void *p1, const void *p2); + static int cmpXYColumnPrimaryRot(const void *p1, const void *p2); + static int cmpXYColumnLineRot(const void *p1, const void *p2); +}; + +void TextLineFrag::init(TextLine *lineA, int startA, int lenA) { + line = lineA; + start = startA; + len = lenA; + col = line->col[start]; +} + +void TextLineFrag::computeCoords(GBool oneRot) { + TextBlock *blk; + double d0, d1, d2, d3, d4; + + if (oneRot) { + + switch (line->rot) { + case 0: + xMin = line->edge[start]; + xMax = line->edge[start + len]; + yMin = line->yMin; + yMax = line->yMax; + break; + case 1: + xMin = line->xMin; + xMax = line->xMax; + yMin = line->edge[start]; + yMax = line->edge[start + len]; + break; + case 2: + xMin = line->edge[start + len]; + xMax = line->edge[start]; + yMin = line->yMin; + yMax = line->yMax; + break; + case 3: + xMin = line->xMin; + xMax = line->xMax; + yMin = line->edge[start + len]; + yMax = line->edge[start]; + break; + } + base = line->base; + + } else { + + if (line->rot == 0 && line->blk->page->primaryRot == 0) { + + xMin = line->edge[start]; + xMax = line->edge[start + len]; + yMin = line->yMin; + yMax = line->yMax; + base = line->base; + + } else { + + blk = line->blk; + d0 = line->edge[start]; + d1 = line->edge[start + len]; + d2 = d3 = d4 = 0; // make gcc happy + + switch (line->rot) { + case 0: + d2 = line->yMin; + d3 = line->yMax; + d4 = line->base; + d0 = (d0 - blk->xMin) / (blk->xMax - blk->xMin); + d1 = (d1 - blk->xMin) / (blk->xMax - blk->xMin); + d2 = (d2 - blk->yMin) / (blk->yMax - blk->yMin); + d3 = (d3 - blk->yMin) / (blk->yMax - blk->yMin); + d4 = (d4 - blk->yMin) / (blk->yMax - blk->yMin); + break; + case 1: + d2 = line->xMax; + d3 = line->xMin; + d4 = line->base; + d0 = (d0 - blk->yMin) / (blk->yMax - blk->yMin); + d1 = (d1 - blk->yMin) / (blk->yMax - blk->yMin); + d2 = (blk->xMax - d2) / (blk->xMax - blk->xMin); + d3 = (blk->xMax - d3) / (blk->xMax - blk->xMin); + d4 = (blk->xMax - d4) / (blk->xMax - blk->xMin); + break; + case 2: + d2 = line->yMax; + d3 = line->yMin; + d4 = line->base; + d0 = (blk->xMax - d0) / (blk->xMax - blk->xMin); + d1 = (blk->xMax - d1) / (blk->xMax - blk->xMin); + d2 = (blk->yMax - d2) / (blk->yMax - blk->yMin); + d3 = (blk->yMax - d3) / (blk->yMax - blk->yMin); + d4 = (blk->yMax - d4) / (blk->yMax - blk->yMin); + break; + case 3: + d2 = line->xMin; + d3 = line->xMax; + d4 = line->base; + d0 = (blk->yMax - d0) / (blk->yMax - blk->yMin); + d1 = (blk->yMax - d1) / (blk->yMax - blk->yMin); + d2 = (d2 - blk->xMin) / (blk->xMax - blk->xMin); + d3 = (d3 - blk->xMin) / (blk->xMax - blk->xMin); + d4 = (d4 - blk->xMin) / (blk->xMax - blk->xMin); + break; + } + + switch (line->blk->page->primaryRot) { + case 0: + xMin = blk->xMin + d0 * (blk->xMax - blk->xMin); + xMax = blk->xMin + d1 * (blk->xMax - blk->xMin); + yMin = blk->yMin + d2 * (blk->yMax - blk->yMin); + yMax = blk->yMin + d3 * (blk->yMax - blk->yMin); + base = blk->yMin + d4 * (blk->yMax - blk->yMin); + break; + case 1: + xMin = blk->xMax - d3 * (blk->xMax - blk->xMin); + xMax = blk->xMax - d2 * (blk->xMax - blk->xMin); + yMin = blk->yMin + d0 * (blk->yMax - blk->yMin); + yMax = blk->yMin + d1 * (blk->yMax - blk->yMin); + base = blk->xMax - d4 * (blk->xMax - blk->xMin); + break; + case 2: + xMin = blk->xMax - d1 * (blk->xMax - blk->xMin); + xMax = blk->xMax - d0 * (blk->xMax - blk->xMin); + yMin = blk->yMax - d3 * (blk->yMax - blk->yMin); + yMax = blk->yMax - d2 * (blk->yMax - blk->yMin); + base = blk->yMax - d4 * (blk->yMax - blk->yMin); + break; + case 3: + xMin = blk->xMin + d2 * (blk->xMax - blk->xMin); + xMax = blk->xMin + d3 * (blk->xMax - blk->xMin); + yMin = blk->yMax - d1 * (blk->yMax - blk->yMin); + yMax = blk->yMax - d0 * (blk->yMax - blk->yMin); + base = blk->xMin + d4 * (blk->xMax - blk->xMin); + break; + } + + } + } +} + +int TextLineFrag::cmpYXPrimaryRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (frag1->line->blk->page->primaryRot) { + case 0: + if (fabs(cmp = frag1->yMin - frag2->yMin) < 0.01) { + cmp = frag1->xMin - frag2->xMin; + } + break; + case 1: + if (fabs(cmp = frag2->xMax - frag1->xMax) < 0.01) { + cmp = frag1->yMin - frag2->yMin; + } + break; + case 2: + if (fabs(cmp = frag2->yMin - frag1->yMin) < 0.01) { + cmp = frag2->xMax - frag1->xMax; + } + break; + case 3: + if (fabs(cmp = frag1->xMax - frag2->xMax) < 0.01) { + cmp = frag2->yMax - frag1->yMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLineFrag::cmpYXLineRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (frag1->line->rot) { + case 0: + if ((cmp = frag1->yMin - frag2->yMin) == 0) { + cmp = frag1->xMin - frag2->xMin; + } + break; + case 1: + if ((cmp = frag2->xMax - frag1->xMax) == 0) { + cmp = frag1->yMin - frag2->yMin; + } + break; + case 2: + if ((cmp = frag2->yMin - frag1->yMin) == 0) { + cmp = frag2->xMax - frag1->xMax; + } + break; + case 3: + if ((cmp = frag1->xMax - frag2->xMax) == 0) { + cmp = frag2->yMax - frag1->yMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLineFrag::cmpXYLineRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (frag1->line->rot) { + case 0: + if ((cmp = frag1->xMin - frag2->xMin) == 0) { + cmp = frag1->yMin - frag2->yMin; + } + break; + case 1: + if ((cmp = frag1->yMin - frag2->yMin) == 0) { + cmp = frag2->xMax - frag1->xMax; + } + break; + case 2: + if ((cmp = frag2->xMax - frag1->xMax) == 0) { + cmp = frag2->yMin - frag1->yMin; + } + break; + case 3: + if ((cmp = frag2->yMax - frag1->yMax) == 0) { + cmp = frag1->xMax - frag2->xMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLineFrag::cmpXYColumnPrimaryRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + // if columns overlap, compare y values + if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] - + frag2->line->col[frag2->start]) && + frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start])) { + cmp = 0; // make gcc happy + switch (frag1->line->blk->page->primaryRot) { + case 0: cmp = frag1->yMin - frag2->yMin; break; + case 1: cmp = frag2->xMax - frag1->xMax; break; + case 2: cmp = frag2->yMin - frag1->yMin; break; + case 3: cmp = frag1->xMax - frag2->xMax; break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; + } + + // otherwise, compare starting column + return frag1->col - frag2->col; +} + +int TextLineFrag::cmpXYColumnLineRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + // if columns overlap, compare y values + if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] - + frag2->line->col[frag2->start]) && + frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start])) { + cmp = 0; // make gcc happy + switch (frag1->line->rot) { + case 0: cmp = frag1->yMin - frag2->yMin; break; + case 1: cmp = frag2->xMax - frag1->xMax; break; + case 2: cmp = frag2->yMin - frag1->yMin; break; + case 3: cmp = frag1->xMax - frag2->xMax; break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; + } + + // otherwise, compare starting column + return frag1->col - frag2->col; +} + +//------------------------------------------------------------------------ +// TextBlock +//------------------------------------------------------------------------ + +TextBlock::TextBlock(TextPage *pageA, int rotA) { + page = pageA; + rot = rotA; + xMin = yMin = 0; + xMax = yMax = -1; + priMin = 0; + priMax = page->pageWidth; + pool = new TextPool(); + lines = NULL; + curLine = NULL; + next = NULL; + stackNext = NULL; + tableId = -1; + tableEnd = gFalse; +} + +TextBlock::~TextBlock() { + TextLine *line; + + delete pool; + while (lines) { + line = lines; + lines = lines->next; + delete line; + } +} + +void TextBlock::addWord(TextWord *word) { + pool->addWord(word); + if (xMin > xMax) { + xMin = word->xMin; + xMax = word->xMax; + yMin = word->yMin; + yMax = word->yMax; + } else { + if (word->xMin < xMin) { + xMin = word->xMin; + } + if (word->xMax > xMax) { + xMax = word->xMax; + } + if (word->yMin < yMin) { + yMin = word->yMin; + } + if (word->yMax > yMax) { + yMax = word->yMax; + } + } +} + +void TextBlock::coalesce(UnicodeMap *uMap, double fixedPitch) { + TextWord *word0, *word1, *word2, *bestWord0, *bestWord1, *lastWord; + TextLine *line, *line0, *line1; + int poolMinBaseIdx, startBaseIdx, minBaseIdx, maxBaseIdx; + int baseIdx, bestWordBaseIdx, idx0, idx1; + double minBase, maxBase; + double fontSize, wordSpacing, delta, priDelta, secDelta; + TextLine **lineArray; + GBool found, overlap; + int col1, col2; + int i, j, k; + + // discard duplicated text (fake boldface, drop shadows) + for (idx0 = pool->minBaseIdx; idx0 <= pool->maxBaseIdx; ++idx0) { + word0 = pool->getPool(idx0); + while (word0) { + priDelta = dupMaxPriDelta * word0->fontSize; + secDelta = dupMaxSecDelta * word0->fontSize; + maxBaseIdx = pool->getBaseIdx(word0->base + secDelta); + found = gFalse; + word1 = word2 = NULL; // make gcc happy + for (idx1 = idx0; idx1 <= maxBaseIdx; ++idx1) { + if (idx1 == idx0) { + word1 = word0; + word2 = word0->next; + } else { + word1 = NULL; + word2 = pool->getPool(idx1); + } + for (; word2; word1 = word2, word2 = word2->next) { + if (word2->len == word0->len && + !memcmp(word2->text, word0->text, + word0->len * sizeof(Unicode))) { + switch (rot) { + case 0: + case 2: + found = fabs(word0->xMin - word2->xMin) < priDelta && + fabs(word0->xMax - word2->xMax) < priDelta && + fabs(word0->yMin - word2->yMin) < secDelta && + fabs(word0->yMax - word2->yMax) < secDelta; + break; + case 1: + case 3: + found = fabs(word0->xMin - word2->xMin) < secDelta && + fabs(word0->xMax - word2->xMax) < secDelta && + fabs(word0->yMin - word2->yMin) < priDelta && + fabs(word0->yMax - word2->yMax) < priDelta; + break; + } + } + if (found) { + break; + } + } + if (found) { + break; + } + } + if (found) { + if (word1) { + word1->next = word2->next; + } else { + pool->setPool(idx1, word2->next); + } + delete word2; + } else { + word0 = word0->next; + } + } + } + + // build the lines + curLine = NULL; + poolMinBaseIdx = pool->minBaseIdx; + charCount = 0; + nLines = 0; + while (1) { + + // find the first non-empty line in the pool + for (; + poolMinBaseIdx <= pool->maxBaseIdx && !pool->getPool(poolMinBaseIdx); + ++poolMinBaseIdx) ; + if (poolMinBaseIdx > pool->maxBaseIdx) { + break; + } + + // look for the left-most word in the first four lines of the + // pool -- this avoids starting with a superscript word + startBaseIdx = poolMinBaseIdx; + for (baseIdx = poolMinBaseIdx + 1; + baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx; + ++baseIdx) { + if (!pool->getPool(baseIdx)) { + continue; + } + if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx)) + < 0) { + startBaseIdx = baseIdx; + } + } + + // create a new line + word0 = pool->getPool(startBaseIdx); + pool->setPool(startBaseIdx, word0->next); + word0->next = NULL; + line = new TextLine(this, word0->rot, word0->base); + line->addWord(word0); + lastWord = word0; + + // compute the search range + fontSize = word0->fontSize; + minBase = word0->base - maxIntraLineDelta * fontSize; + maxBase = word0->base + maxIntraLineDelta * fontSize; + minBaseIdx = pool->getBaseIdx(minBase); + maxBaseIdx = pool->getBaseIdx(maxBase); + wordSpacing = fixedPitch ? fixedPitch : maxWordSpacing * fontSize; + + // find the rest of the words in this line + while (1) { + + // find the left-most word whose baseline is in the range for + // this line + bestWordBaseIdx = 0; + bestWord0 = bestWord1 = NULL; + overlap = gFalse; + for (baseIdx = minBaseIdx; + !overlap && baseIdx <= maxBaseIdx; + ++baseIdx) { + for (word0 = NULL, word1 = pool->getPool(baseIdx); + word1; + word0 = word1, word1 = word1->next) { + if (word1->base >= minBase && + word1->base <= maxBase) { + delta = lastWord->primaryDelta(word1); + if (delta < minCharSpacing * fontSize) { + overlap = gTrue; + break; + } else { + if (delta < wordSpacing && + (!bestWord1 || word1->primaryCmp(bestWord1) < 0)) { + bestWordBaseIdx = baseIdx; + bestWord0 = word0; + bestWord1 = word1; + } + break; + } + } + } + } + if (overlap || !bestWord1) { + break; + } + + // remove it from the pool, and add it to the line + if (bestWord0) { + bestWord0->next = bestWord1->next; + } else { + pool->setPool(bestWordBaseIdx, bestWord1->next); + } + bestWord1->next = NULL; + line->addWord(bestWord1); + lastWord = bestWord1; + } + + // add the line + if (curLine && line->cmpYX(curLine) > 0) { + line0 = curLine; + line1 = curLine->next; + } else { + line0 = NULL; + line1 = lines; + } + for (; + line1 && line->cmpYX(line1) > 0; + line0 = line1, line1 = line1->next) ; + if (line0) { + line0->next = line; + } else { + lines = line; + } + line->next = line1; + curLine = line; + line->coalesce(uMap); + charCount += line->len; + ++nLines; + } + + // sort lines into xy order for column assignment + lineArray = (TextLine **)gmallocn(nLines, sizeof(TextLine *)); + for (line = lines, i = 0; line; line = line->next, ++i) { + lineArray[i] = line; + } + qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY); + + // column assignment + nColumns = 0; + if (fixedPitch) { + for (i = 0; i < nLines; ++i) { + line0 = lineArray[i]; + col1 = 0; // make gcc happy + switch (rot) { + case 0: + col1 = (int)((line0->xMin - xMin) / fixedPitch + 0.5); + break; + case 1: + col1 = (int)((line0->yMin - yMin) / fixedPitch + 0.5); + break; + case 2: + col1 = (int)((xMax - line0->xMax) / fixedPitch + 0.5); + break; + case 3: + col1 = (int)((yMax - line0->yMax) / fixedPitch + 0.5); + break; + } + for (k = 0; k <= line0->len; ++k) { + line0->col[k] += col1; + } + if (line0->col[line0->len] > nColumns) { + nColumns = line0->col[line0->len]; + } + } + } else { + for (i = 0; i < nLines; ++i) { + line0 = lineArray[i]; + col1 = 0; + for (j = 0; j < i; ++j) { + line1 = lineArray[j]; + if (line1->primaryDelta(line0) >= 0) { + col2 = line1->col[line1->len] + 1; + } else { + k = 0; // make gcc happy + switch (rot) { + case 0: + for (k = 0; + k < line1->len && + line0->xMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + case 1: + for (k = 0; + k < line1->len && + line0->yMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + case 2: + for (k = 0; + k < line1->len && + line0->xMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + case 3: + for (k = 0; + k < line1->len && + line0->yMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + } + col2 = line1->col[k]; + } + if (col2 > col1) { + col1 = col2; + } + } + for (k = 0; k <= line0->len; ++k) { + line0->col[k] += col1; + } + if (line0->col[line0->len] > nColumns) { + nColumns = line0->col[line0->len]; + } + } + } + gfree(lineArray); +} + +void TextBlock::updatePriMinMax(TextBlock *blk) { + double newPriMin, newPriMax; + GBool gotPriMin, gotPriMax; + + gotPriMin = gotPriMax = gFalse; + newPriMin = newPriMax = 0; // make gcc happy + switch (page->primaryRot) { + case 0: + case 2: + if (blk->yMin < yMax && blk->yMax > yMin) { + if (blk->xMin < xMin) { + newPriMin = blk->xMax; + gotPriMin = gTrue; + } + if (blk->xMax > xMax) { + newPriMax = blk->xMin; + gotPriMax = gTrue; + } + } + break; + case 1: + case 3: + if (blk->xMin < xMax && blk->xMax > xMin) { + if (blk->yMin < yMin) { + newPriMin = blk->yMax; + gotPriMin = gTrue; + } + if (blk->yMax > yMax) { + newPriMax = blk->yMin; + gotPriMax = gTrue; + } + } + break; + } + if (gotPriMin) { + if (newPriMin > xMin) { + newPriMin = xMin; + } + if (newPriMin > priMin) { + priMin = newPriMin; + } + } + if (gotPriMax) { + if (newPriMax < xMax) { + newPriMax = xMax; + } + if (newPriMax < priMax) { + priMax = newPriMax; + } + } +} + +int TextBlock::cmpXYPrimaryRot(const void *p1, const void *p2) { + TextBlock *blk1 = *(TextBlock **)p1; + TextBlock *blk2 = *(TextBlock **)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (blk1->page->primaryRot) { + case 0: + if ((cmp = blk1->xMin - blk2->xMin) == 0) { + cmp = blk1->yMin - blk2->yMin; + } + break; + case 1: + if ((cmp = blk1->yMin - blk2->yMin) == 0) { + cmp = blk2->xMax - blk1->xMax; + } + break; + case 2: + if ((cmp = blk2->xMax - blk1->xMax) == 0) { + cmp = blk2->yMin - blk1->yMin; + } + break; + case 3: + if ((cmp = blk2->yMax - blk1->yMax) == 0) { + cmp = blk1->xMax - blk2->xMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextBlock::cmpYXPrimaryRot(const void *p1, const void *p2) { + TextBlock *blk1 = *(TextBlock **)p1; + TextBlock *blk2 = *(TextBlock **)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (blk1->page->primaryRot) { + case 0: + if ((cmp = blk1->yMin - blk2->yMin) == 0) { + cmp = blk1->xMin - blk2->xMin; + } + break; + case 1: + if ((cmp = blk2->xMax - blk1->xMax) == 0) { + cmp = blk1->yMin - blk2->yMin; + } + break; + case 2: + if ((cmp = blk2->yMin - blk1->yMin) == 0) { + cmp = blk2->xMax - blk1->xMax; + } + break; + case 3: + if ((cmp = blk1->xMax - blk2->xMax) == 0) { + cmp = blk2->yMax - blk1->yMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextBlock::primaryCmp(TextBlock *blk) { + double cmp; + + cmp = 0; // make gcc happy + switch (rot) { + case 0: + cmp = xMin - blk->xMin; + break; + case 1: + cmp = yMin - blk->yMin; + break; + case 2: + cmp = blk->xMax - xMax; + break; + case 3: + cmp = blk->yMax - yMax; + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +double TextBlock::secondaryDelta(TextBlock *blk) { + double delta; + + delta = 0; // make gcc happy + switch (rot) { + case 0: + delta = blk->yMin - yMax; + break; + case 1: + delta = xMin - blk->xMax; + break; + case 2: + delta = yMin - blk->yMax; + break; + case 3: + delta = blk->xMin - xMax; + break; + } + return delta; +} + +GBool TextBlock::isBelow(TextBlock *blk) { + GBool below; + + below = gFalse; // make gcc happy + switch (page->primaryRot) { + case 0: + below = xMin >= blk->priMin && xMax <= blk->priMax && + yMin > blk->yMin; + break; + case 1: + below = yMin >= blk->priMin && yMax <= blk->priMax && + xMax < blk->xMax; + break; + case 2: + below = xMin >= blk->priMin && xMax <= blk->priMax && + yMax < blk->yMax; + break; + case 3: + below = yMin >= blk->priMin && yMax <= blk->priMax && + xMin > blk->xMin; + break; + } + + return below; +} + +GBool TextBlock::isBeforeByRule1(TextBlock *blk1) { + GBool before = gFalse; + GBool overlap = gFalse; + + switch (this->page->primaryRot) { + case 0: + case 2: + overlap = ((this->ExMin <= blk1->ExMin) && + (blk1->ExMin <= this->ExMax)) || + ((blk1->ExMin <= this->ExMin) && + (this->ExMin <= blk1->ExMax)); + break; + case 1: + case 3: + overlap = ((this->EyMin <= blk1->EyMin) && + (blk1->EyMin <= this->EyMax)) || + ((blk1->EyMin <= this->EyMin) && + (this->EyMin <= blk1->EyMax)); + break; + } + switch (this->page->primaryRot) { + case 0: + before = overlap && this->EyMin < blk1->EyMin; + break; + case 1: + before = overlap && this->ExMax > blk1->ExMax; + break; + case 2: + before = overlap && this->EyMax > blk1->EyMax; + break; + case 3: + before = overlap && this->ExMin < blk1->ExMin; + break; + } + return before; +} + +GBool TextBlock::isBeforeByRule2(TextBlock *blk1) { + double cmp = 0; + int rotLR = rot; + + if (!page->primaryLR) { + rotLR = (rotLR + 2) % 4; + } + + switch (rotLR) { + case 0: + cmp = ExMax - blk1->ExMin; + break; + case 1: + cmp = EyMin - blk1->EyMax; + break; + case 2: + cmp = blk1->ExMax - ExMin; + break; + case 3: + cmp = blk1->EyMin - EyMax; + break; + } + return cmp <= 0; +} + +// Sort into reading order by performing a topological sort using the rules +// given in "High Performance Document Layout Analysis", T.M. Breuel, 2003. +// See http://pubs.iupr.org/#2003-breuel-sdiut +// Topological sort is done by depth first search, see +// http://en.wikipedia.org/wiki/Topological_sorting +int TextBlock::visitDepthFirst(TextBlock *blkList, int pos1, + TextBlock **sorted, int sortPos, + GBool* visited) { + int pos2; + TextBlock *blk1, *blk2, *blk3; + GBool before; + + if (visited[pos1]) { + return sortPos; + } + + blk1 = this; + +#if 0 // for debugging + printf("visited: %d %.2f..%.2f %.2f..%.2f\n", + sortPos, blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax); +#endif + visited[pos1] = gTrue; + pos2 = -1; + for (blk2 = blkList; blk2; blk2 = blk2->next) { + pos2++; + if (visited[pos2]) { + // skip visited nodes + continue; + } + before = gFalse; + + // is blk2 before blk1? (for table entries) + if (blk1->tableId >= 0 && blk1->tableId == blk2->tableId) { + if (page->primaryLR) { + if (blk2->xMax <= blk1->xMin && + blk2->yMin <= blk1->yMax && + blk2->yMax >= blk1->yMin) + before = gTrue; + } else { + if (blk2->xMin >= blk1->xMax && + blk2->yMin <= blk1->yMax && + blk2->yMax >= blk1->yMin) + before = gTrue; + } + + if (blk2->yMax <= blk1->yMin) + before = gTrue; + } else { + if (blk2->isBeforeByRule1(blk1)) { + // Rule (1) blk1 and blk2 overlap, and blk2 is above blk1. + before = gTrue; +#if 0 // for debugging + printf("rule1: %.2f..%.2f %.2f..%.2f %.2f..%.2f %.2f..%.2f\n", + blk2->ExMin, blk2->ExMax, blk2->EyMin, blk2->EyMax, + blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax); +#endif + } else if (blk2->isBeforeByRule2(blk1)) { + // Rule (2) blk2 left of blk1, and no intervening blk3 + // such that blk1 is before blk3 by rule 1, + // and blk3 is before blk2 by rule 1. + before = gTrue; + for (blk3 = blkList; blk3; blk3 = blk3->next) { + if (blk3 == blk2 || blk3 == blk1) { + continue; + } + if (blk1->isBeforeByRule1(blk3) && + blk3->isBeforeByRule1(blk2)) { + before = gFalse; + break; + } + } +#if 0 // for debugging + if (before) { + printf("rule2: %.2f..%.2f %.2f..%.2f %.2f..%.2f %.2f..%.2f\n", + blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax, + blk2->ExMin, blk2->ExMax, blk2->EyMin, blk2->EyMax); + } +#endif + } + } + if (before) { + // blk2 is before blk1, so it needs to be visited + // before we can add blk1 to the sorted list. + sortPos = blk2->visitDepthFirst(blkList, pos2, sorted, sortPos, visited); + } + } +#if 0 // for debugging + printf("sorted: %d %.2f..%.2f %.2f..%.2f\n", + sortPos, blk1->ExMin, blk1->ExMax, blk1->EyMin, blk1->EyMax); +#endif + sorted[sortPos++] = blk1; + return sortPos; +} + +//------------------------------------------------------------------------ +// TextFlow +//------------------------------------------------------------------------ + +TextFlow::TextFlow(TextPage *pageA, TextBlock *blk) { + page = pageA; + xMin = blk->xMin; + xMax = blk->xMax; + yMin = blk->yMin; + yMax = blk->yMax; + priMin = blk->priMin; + priMax = blk->priMax; + blocks = lastBlk = blk; + next = NULL; +} + +TextFlow::~TextFlow() { + TextBlock *blk; + + while (blocks) { + blk = blocks; + blocks = blocks->next; + delete blk; + } +} + +void TextFlow::addBlock(TextBlock *blk) { + if (lastBlk) { + lastBlk->next = blk; + } else { + blocks = blk; + } + lastBlk = blk; + if (blk->xMin < xMin) { + xMin = blk->xMin; + } + if (blk->xMax > xMax) { + xMax = blk->xMax; + } + if (blk->yMin < yMin) { + yMin = blk->yMin; + } + if (blk->yMax > yMax) { + yMax = blk->yMax; + } +} + +GBool TextFlow::blockFits(TextBlock *blk, TextBlock *prevBlk) { + GBool fits; + + // lower blocks must use smaller fonts + if (blk->lines->words->fontSize > lastBlk->lines->words->fontSize) { + return gFalse; + } + + fits = gFalse; // make gcc happy + switch (page->primaryRot) { + case 0: + fits = blk->xMin >= priMin && blk->xMax <= priMax; + break; + case 1: + fits = blk->yMin >= priMin && blk->yMax <= priMax; + break; + case 2: + fits = blk->xMin >= priMin && blk->xMax <= priMax; + break; + case 3: + fits = blk->yMin >= priMin && blk->yMax <= priMax; + break; + } + return fits; +} + +#if TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextWordList +//------------------------------------------------------------------------ + +TextWordList::TextWordList(TextPage *text, GBool physLayout) { + TextFlow *flow; + TextBlock *blk; + TextLine *line; + TextWord *word; + TextWord **wordArray; + int nWords, i; + + words = new GooList(); + + if (text->rawOrder) { + for (word = text->rawWords; word; word = word->next) { + words->append(word); + } + + } else if (physLayout) { + // this is inefficient, but it's also the least useful of these + // three cases + nWords = 0; + for (flow = text->flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + ++nWords; + } + } + } + } + wordArray = (TextWord **)gmallocn(nWords, sizeof(TextWord *)); + i = 0; + for (flow = text->flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + wordArray[i++] = word; + } + } + } + } + qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX); + for (i = 0; i < nWords; ++i) { + words->append(wordArray[i]); + } + gfree(wordArray); + + } else { + for (flow = text->flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + words->append(word); + } + } + } + } + } +} + +TextWordList::~TextWordList() { + delete words; +} + +int TextWordList::getLength() { + return words->getLength(); +} + +TextWord *TextWordList::get(int idx) { + if (idx < 0 || idx >= words->getLength()) { + return NULL; + } + return (TextWord *)words->get(idx); +} + +#endif // TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextPage +//------------------------------------------------------------------------ + +TextPage::TextPage(GBool rawOrderA) { + int rot; + + refCnt = 1; + rawOrder = rawOrderA; + curWord = NULL; + charPos = 0; + curFont = NULL; + curFontSize = 0; + nest = 0; + nTinyChars = 0; + lastCharOverlap = gFalse; + if (!rawOrder) { + for (rot = 0; rot < 4; ++rot) { + pools[rot] = new TextPool(); + } + } + flows = NULL; + blocks = NULL; + rawWords = NULL; + rawLastWord = NULL; + fonts = new GooList(); + lastFindXMin = lastFindYMin = 0; + haveLastFind = gFalse; + underlines = new GooList(); + links = new GooList(); +} + +TextPage::~TextPage() { + int rot; + + clear(); + if (!rawOrder) { + for (rot = 0; rot < 4; ++rot) { + delete pools[rot]; + } + } + delete fonts; + deleteGooList(underlines, TextUnderline); + deleteGooList(links, TextLink); +} + +void TextPage::incRefCnt() { + refCnt++; +} + +void TextPage::decRefCnt() { + if (--refCnt == 0) + delete this; +} + +void TextPage::startPage(GfxState *state) { + clear(); + if (state) { + pageWidth = state->getPageWidth(); + pageHeight = state->getPageHeight(); + } else { + pageWidth = pageHeight = 0; + } +} + +void TextPage::endPage() { + if (curWord) { + endWord(); + } +} + +void TextPage::clear() { + int rot; + TextFlow *flow; + TextWord *word; + + if (curWord) { + delete curWord; + curWord = NULL; + } + if (rawOrder) { + while (rawWords) { + word = rawWords; + rawWords = rawWords->next; + delete word; + } + } else { + for (rot = 0; rot < 4; ++rot) { + delete pools[rot]; + } + while (flows) { + flow = flows; + flows = flows->next; + delete flow; + } + gfree(blocks); + } + deleteGooList(fonts, TextFontInfo); + deleteGooList(underlines, TextUnderline); + deleteGooList(links, TextLink); + + curWord = NULL; + charPos = 0; + curFont = NULL; + curFontSize = 0; + nest = 0; + nTinyChars = 0; + if (!rawOrder) { + for (rot = 0; rot < 4; ++rot) { + pools[rot] = new TextPool(); + } + } + flows = NULL; + blocks = NULL; + rawWords = NULL; + rawLastWord = NULL; + fonts = new GooList(); + underlines = new GooList(); + links = new GooList(); +} + +void TextPage::updateFont(GfxState *state) { + GfxFont *gfxFont; + double *fm; + char *name; + int code, mCode, letterCode, anyCode; + double w; + int i; + + // get the font info object + curFont = NULL; + for (i = 0; i < fonts->getLength(); ++i) { + curFont = (TextFontInfo *)fonts->get(i); + if (curFont->matches(state)) { + break; + } + curFont = NULL; + } + if (!curFont) { + curFont = new TextFontInfo(state); + fonts->append(curFont); + } + + // adjust the font size + gfxFont = state->getFont(); + curFontSize = state->getTransformedFontSize(); + if (gfxFont && gfxFont->getType() == fontType3) { + // This is a hack which makes it possible to deal with some Type 3 + // fonts. The problem is that it's impossible to know what the + // base coordinate system used in the font is without actually + // rendering the font. This code tries to guess by looking at the + // width of the character 'm' (which breaks if the font is a + // subset that doesn't contain 'm'). + mCode = letterCode = anyCode = -1; + for (code = 0; code < 256; ++code) { + name = ((Gfx8BitFont *)gfxFont)->getCharName(code); + if (name && name[0] == 'm' && name[1] == '\0') { + mCode = code; + } + if (letterCode < 0 && name && name[1] == '\0' && + ((name[0] >= 'A' && name[0] <= 'Z') || + (name[0] >= 'a' && name[0] <= 'z'))) { + letterCode = code; + } + if (anyCode < 0 && name && + ((Gfx8BitFont *)gfxFont)->getWidth(code) > 0) { + anyCode = code; + } + } + if (mCode >= 0 && + (w = ((Gfx8BitFont *)gfxFont)->getWidth(mCode)) > 0) { + // 0.6 is a generic average 'm' width -- yes, this is a hack + curFontSize *= w / 0.6; + } else if (letterCode >= 0 && + (w = ((Gfx8BitFont *)gfxFont)->getWidth(letterCode)) > 0) { + // even more of a hack: 0.5 is a generic letter width + curFontSize *= w / 0.5; + } else if (anyCode >= 0 && + (w = ((Gfx8BitFont *)gfxFont)->getWidth(anyCode)) > 0) { + // better than nothing: 0.5 is a generic character width + curFontSize *= w / 0.5; + } + fm = gfxFont->getFontMatrix(); + if (fm[0] != 0) { + curFontSize *= fabs(fm[3] / fm[0]); + } + } +} + +void TextPage::beginWord(GfxState *state, double x0, double y0) { + GfxFont *gfxFont; + double *fontm; + double m[4], m2[4]; + int rot; + + // This check is needed because Type 3 characters can contain + // text-drawing operations (when TextPage is being used via + // {X,Win}SplashOutputDev rather than TextOutputDev). + if (curWord) { + ++nest; + return; + } + + // compute the rotation + state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]); + gfxFont = state->getFont(); + if (gfxFont && gfxFont->getType() == fontType3) { + fontm = state->getFont()->getFontMatrix(); + m2[0] = fontm[0] * m[0] + fontm[1] * m[2]; + m2[1] = fontm[0] * m[1] + fontm[1] * m[3]; + m2[2] = fontm[2] * m[0] + fontm[3] * m[2]; + m2[3] = fontm[2] * m[1] + fontm[3] * m[3]; + m[0] = m2[0]; + m[1] = m2[1]; + m[2] = m2[2]; + m[3] = m2[3]; + } + if (fabs(m[0] * m[3]) > fabs(m[1] * m[2])) { + rot = (m[0] > 0 || m[3] < 0) ? 0 : 2; + } else { + rot = (m[2] > 0) ? 1 : 3; + } + + // for vertical writing mode, the lines are effectively rotated 90 + // degrees + if (state->getFont()->getWMode()) { + rot = (rot + 1) & 3; + } + + curWord = new TextWord(state, rot, x0, y0, curFont, curFontSize); +} + +void TextPage::addChar(GfxState *state, double x, double y, + double dx, double dy, + CharCode c, int nBytes, Unicode *u, int uLen) { + double x1, y1, w1, h1, dx2, dy2, base, sp, delta; + GBool overlap; + int i; + + // subtract char and word spacing from the dx,dy values + sp = state->getCharSpace(); + if (c == (CharCode)0x20) { + sp += state->getWordSpace(); + } + state->textTransformDelta(sp * state->getHorizScaling(), 0, &dx2, &dy2); + dx -= dx2; + dy -= dy2; + state->transformDelta(dx, dy, &w1, &h1); + + // throw away chars that aren't inside the page bounds + // (and also do a sanity check on the character size) + state->transform(x, y, &x1, &y1); + if (x1 + w1 < 0 || x1 > pageWidth || + y1 + h1 < 0 || y1 > pageHeight || + w1 > pageWidth || h1 > pageHeight) { + charPos += nBytes; + return; + } + + // check the tiny chars limit + if (!globalParams->getTextKeepTinyChars() && + fabs(w1) < 3 && fabs(h1) < 3) { + if (++nTinyChars > 50000) { + charPos += nBytes; + return; + } + } + + // break words at space character + if (uLen == 1 && u[0] == (Unicode)0x20) { + charPos += nBytes; + endWord(); + return; + } + + // start a new word if: + // (1) this character doesn't fall in the right place relative to + // the end of the previous word (this places upper and lower + // constraints on the position deltas along both the primary + // and secondary axes), or + // (2) this character overlaps the previous one (duplicated text), or + // (3) the previous character was an overlap (we want each duplicated + // character to be in a word by itself at this stage), + // (4) the font size has changed + if (curWord && curWord->len > 0) { + base = sp = delta = 0; // make gcc happy + switch (curWord->rot) { + case 0: + base = y1; + sp = x1 - curWord->xMax; + delta = x1 - curWord->edge[curWord->len - 1]; + break; + case 1: + base = x1; + sp = y1 - curWord->yMax; + delta = y1 - curWord->edge[curWord->len - 1]; + break; + case 2: + base = y1; + sp = curWord->xMin - x1; + delta = curWord->edge[curWord->len - 1] - x1; + break; + case 3: + base = x1; + sp = curWord->yMin - y1; + delta = curWord->edge[curWord->len - 1] - y1; + break; + } + overlap = fabs(delta) < dupMaxPriDelta * curWord->fontSize && + fabs(base - curWord->base) < dupMaxSecDelta * curWord->fontSize; + if (overlap || lastCharOverlap || + sp < -minDupBreakOverlap * curWord->fontSize || + sp > minWordBreakSpace * curWord->fontSize || + fabs(base - curWord->base) > 0.5 || + curFontSize != curWord->fontSize) { + endWord(); + } + lastCharOverlap = overlap; + } else { + lastCharOverlap = gFalse; + } + + if (uLen != 0) { + // start a new word if needed + if (!curWord) { + beginWord(state, x, y); + } + + // page rotation and/or transform matrices can cause text to be + // drawn in reverse order -- in this case, swap the begin/end + // coordinates and break text into individual chars + if ((curWord->rot == 0 && w1 < 0) || + (curWord->rot == 1 && h1 < 0) || + (curWord->rot == 2 && w1 > 0) || + (curWord->rot == 3 && h1 > 0)) { + endWord(); + beginWord(state, x + dx, y + dy); + x1 += w1; + y1 += h1; + w1 = -w1; + h1 = -h1; + } + + // add the characters to the current word + w1 /= uLen; + h1 /= uLen; + for (i = 0; i < uLen; ++i) { + if (u[i] >= 0xd800 && u[i] < 0xdc00) { /* surrogate pair */ + if (i + 1 < uLen && u[i+1] >= 0xdc00 && u[i+1] < 0xe000) { + /* next code is a low surrogate */ + Unicode uu = (((u[i] & 0x3ff) << 10) | (u[i+1] & 0x3ff)) + 0x10000; + i++; + curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, uu); + } else { + /* missing low surrogate + replace it with REPLACEMENT CHARACTER (U+FFFD) */ + curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, 0xfffd); + } + } else if (u[i] >= 0xdc00 && u[i] < 0xe000) { + /* invalid low surrogate + replace it with REPLACEMENT CHARACTER (U+FFFD) */ + curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, 0xfffd); + } else { + curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, u[i]); + } + } + } + charPos += nBytes; +} + +void TextPage::incCharCount(int nChars) { + charPos += nChars; +} + +void TextPage::endWord() { + // This check is needed because Type 3 characters can contain + // text-drawing operations (when TextPage is being used via + // {X,Win}SplashOutputDev rather than TextOutputDev). + if (nest > 0) { + --nest; + return; + } + + if (curWord) { + addWord(curWord); + curWord = NULL; + } +} + +void TextPage::addWord(TextWord *word) { + // throw away zero-length words -- they don't have valid xMin/xMax + // values, and they're useless anyway + if (word->len == 0) { + delete word; + return; + } + + if (rawOrder) { + if (rawLastWord) { + rawLastWord->next = word; + } else { + rawWords = word; + } + rawLastWord = word; + } else { + pools[word->rot]->addWord(word); + } +} + +void TextPage::addUnderline(double x0, double y0, double x1, double y1) { + underlines->append(new TextUnderline(x0, y0, x1, y1)); +} + +void TextPage::addLink(int xMin, int yMin, int xMax, int yMax, AnnotLink *link) { + links->append(new TextLink(xMin, yMin, xMax, yMax, link)); +} + +void TextPage::coalesce(GBool physLayout, double fixedPitch, GBool doHTML) { + UnicodeMap *uMap; + TextPool *pool; + TextWord *word0, *word1, *word2; + TextLine *line; + TextBlock *blkList, *blk, *lastBlk, *blk0, *blk1, *blk2; + TextFlow *flow, *lastFlow; + TextUnderline *underline; + TextLink *link; + int rot, poolMinBaseIdx, baseIdx, startBaseIdx, endBaseIdx; + double minBase, maxBase, newMinBase, newMaxBase; + double fontSize, colSpace1, colSpace2, lineSpace, intraLineSpace, blkSpace; + GBool found; + int count[4]; + int lrCount; + int col1, col2; + int i, j, n; + + if (rawOrder) { + primaryRot = 0; + primaryLR = gTrue; + return; + } + + uMap = globalParams->getTextEncoding(); + blkList = NULL; + lastBlk = NULL; + nBlocks = 0; + primaryRot = 0; + +#if 0 // for debugging + printf("*** initial words ***\n"); + for (rot = 0; rot < 4; ++rot) { + pool = pools[rot]; + for (baseIdx = pool->minBaseIdx; baseIdx <= pool->maxBaseIdx; ++baseIdx) { + for (word0 = pool->getPool(baseIdx); word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f rot=%d link=%p '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, rot*90, word0->link); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + +#if 0 //~ for debugging + for (i = 0; i < underlines->getLength(); ++i) { + underline = (TextUnderline *)underlines->get(i); + printf("underline: x=%g..%g y=%g..%g horiz=%d\n", + underline->x0, underline->x1, underline->y0, underline->y1, + underline->horiz); + } +#endif + + if (doHTML) { + + //----- handle underlining + for (i = 0; i < underlines->getLength(); ++i) { + underline = (TextUnderline *)underlines->get(i); + if (underline->horiz) { + // rot = 0 + if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { + startBaseIdx = pools[0]->getBaseIdx(underline->y0 + minUnderlineGap); + endBaseIdx = pools[0]->getBaseIdx(underline->y0 + maxUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) { + //~ need to check the y value against the word baseline + if (underline->x0 < word0->xMin + underlineSlack && + word0->xMax - underlineSlack < underline->x1) { + word0->underlined = gTrue; + } + } + } + } + + // rot = 2 + if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) { + startBaseIdx = pools[2]->getBaseIdx(underline->y0 - maxUnderlineGap); + endBaseIdx = pools[2]->getBaseIdx(underline->y0 - minUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) { + if (underline->x0 < word0->xMin + underlineSlack && + word0->xMax - underlineSlack < underline->x1) { + word0->underlined = gTrue; + } + } + } + } + } else { + // rot = 1 + if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) { + startBaseIdx = pools[1]->getBaseIdx(underline->x0 - maxUnderlineGap); + endBaseIdx = pools[1]->getBaseIdx(underline->x0 - minUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) { + if (underline->y0 < word0->yMin + underlineSlack && + word0->yMax - underlineSlack < underline->y1) { + word0->underlined = gTrue; + } + } + } + } + + // rot = 3 + if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) { + startBaseIdx = pools[3]->getBaseIdx(underline->x0 + minUnderlineGap); + endBaseIdx = pools[3]->getBaseIdx(underline->x0 + maxUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) { + if (underline->y0 < word0->yMin + underlineSlack && + word0->yMax - underlineSlack < underline->y1) { + word0->underlined = gTrue; + } + } + } + } + } + } + + //----- handle links + for (i = 0; i < links->getLength(); ++i) { + link = (TextLink *)links->get(i); + + // rot = 0 + if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { + startBaseIdx = pools[0]->getBaseIdx(link->yMin); + endBaseIdx = pools[0]->getBaseIdx(link->yMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) { + if (link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax && + link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax) { + word0->link = link->link; + } + } + } + } + + // rot = 2 + if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) { + startBaseIdx = pools[2]->getBaseIdx(link->yMin); + endBaseIdx = pools[2]->getBaseIdx(link->yMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) { + if (link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax && + link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax) { + word0->link = link->link; + } + } + } + } + + // rot = 1 + if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) { + startBaseIdx = pools[1]->getBaseIdx(link->xMin); + endBaseIdx = pools[1]->getBaseIdx(link->xMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) { + if (link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax && + link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax) { + word0->link = link->link; + } + } + } + } + + // rot = 3 + if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) { + startBaseIdx = pools[3]->getBaseIdx(link->xMin); + endBaseIdx = pools[3]->getBaseIdx(link->xMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) { + if (link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax && + link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax) { + word0->link = link->link; + } + } + } + } + } + } + + //----- assemble the blocks + + //~ add an outer loop for writing mode (vertical text) + + // build blocks for each rotation value + for (rot = 0; rot < 4; ++rot) { + pool = pools[rot]; + poolMinBaseIdx = pool->minBaseIdx; + count[rot] = 0; + + // add blocks until no more words are left + while (1) { + + // find the first non-empty line in the pool + for (; + poolMinBaseIdx <= pool->maxBaseIdx && + !pool->getPool(poolMinBaseIdx); + ++poolMinBaseIdx) ; + if (poolMinBaseIdx > pool->maxBaseIdx) { + break; + } + + // look for the left-most word in the first four lines of the + // pool -- this avoids starting with a superscript word + startBaseIdx = poolMinBaseIdx; + for (baseIdx = poolMinBaseIdx + 1; + baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx; + ++baseIdx) { + if (!pool->getPool(baseIdx)) { + continue; + } + if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx)) + < 0) { + startBaseIdx = baseIdx; + } + } + + // create a new block + word0 = pool->getPool(startBaseIdx); + pool->setPool(startBaseIdx, word0->next); + word0->next = NULL; + blk = new TextBlock(this, rot); + blk->addWord(word0); + + fontSize = word0->fontSize; + minBase = maxBase = word0->base; + colSpace1 = minColSpacing1 * fontSize; + colSpace2 = minColSpacing2 * fontSize; + lineSpace = maxLineSpacingDelta * fontSize; + intraLineSpace = maxIntraLineDelta * fontSize; + + // add words to the block + do { + found = gFalse; + + // look for words on the line above the current top edge of + // the block + newMinBase = minBase; + for (baseIdx = pool->getBaseIdx(minBase); + baseIdx >= pool->getBaseIdx(minBase - lineSpace); + --baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base < minBase && + word1->base >= minBase - lineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin) + : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta1 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + found = gTrue; + newMinBase = word2->base; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + minBase = newMinBase; + + // look for words on the line below the current bottom edge of + // the block + newMaxBase = maxBase; + for (baseIdx = pool->getBaseIdx(maxBase); + baseIdx <= pool->getBaseIdx(maxBase + lineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base > maxBase && + word1->base <= maxBase + lineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin) + : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta1 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + found = gTrue; + newMaxBase = word2->base; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + maxBase = newMaxBase; + + // look for words that are on lines already in the block, and + // that overlap the block horizontally + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin < blk->xMax + colSpace1 && + word1->xMax > blk->xMin - colSpace1) + : (word1->yMin < blk->yMax + colSpace1 && + word1->yMax > blk->yMin - colSpace1)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta2 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + found = gTrue; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + + // only check for outlying words (the next two chunks of code) + // if we didn't find anything else + if (found) { + continue; + } + + // scan down the left side of the block, looking for words + // that are near (but not overlapping) the block; if there are + // three or fewer, add them to the block + n = 0; + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMax <= blk->xMin && + word1->xMax > blk->xMin - colSpace2) + : (word1->yMax <= blk->yMin && + word1->yMax > blk->yMin - colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + ++n; + break; + } + word1 = word1->next; + } + } + if (n > 0 && n <= 3) { + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMax <= blk->xMin && + word1->xMax > blk->xMin - colSpace2) + : (word1->yMax <= blk->yMin && + word1->yMax > blk->yMin - colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + if (word2->base < minBase) { + minBase = word2->base; + } else if (word2->base > maxBase) { + maxBase = word2->base; + } + found = gTrue; + break; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + } + + // scan down the right side of the block, looking for words + // that are near (but not overlapping) the block; if there are + // three or fewer, add them to the block + n = 0; + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin >= blk->xMax && + word1->xMin < blk->xMax + colSpace2) + : (word1->yMin >= blk->yMax && + word1->yMin < blk->yMax + colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + ++n; + break; + } + word1 = word1->next; + } + } + if (n > 0 && n <= 3) { + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin >= blk->xMax && + word1->xMin < blk->xMax + colSpace2) + : (word1->yMin >= blk->yMax && + word1->yMin < blk->yMax + colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + if (word2->base < minBase) { + minBase = word2->base; + } else if (word2->base > maxBase) { + maxBase = word2->base; + } + found = gTrue; + break; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + } + + } while (found); + + //~ need to compute the primary writing mode (horiz/vert) in + //~ addition to primary rotation + + // coalesce the block, and add it to the list + blk->coalesce(uMap, fixedPitch); + if (lastBlk) { + lastBlk->next = blk; + } else { + blkList = blk; + } + lastBlk = blk; + count[rot] += blk->charCount; + ++nBlocks; + } + + if (count[rot] > count[primaryRot]) { + primaryRot = rot; + } + } + +#if 0 // for debugging + printf("*** rotation ***\n"); + for (rot = 0; rot < 4; ++rot) { + printf(" %d: %6d\n", rot, count[rot]); + } + printf(" primary rot = %d\n", primaryRot); + printf("\n"); +#endif + +#if 0 // for debugging + printf("*** blocks ***\n"); + for (blk = blkList; blk; blk = blk->next) { + printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax); + for (line = blk->lines; line; line = line->next) { + printf(" line: x=%.2f..%.2f y=%.2f..%.2f base=%.2f\n", + line->xMin, line->xMax, line->yMin, line->yMax, line->base); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + + // determine the primary direction + lrCount = 0; + for (blk = blkList; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word0 = line->words; word0; word0 = word0->next) { + for (i = 0; i < word0->len; ++i) { + if (unicodeTypeL(word0->text[i])) { + ++lrCount; + } else if (unicodeTypeR(word0->text[i])) { + --lrCount; + } + } + } + } + } + primaryLR = lrCount >= 0; + +#if 0 // for debugging + printf("*** direction ***\n"); + printf("lrCount = %d\n", lrCount); + printf("primaryLR = %d\n", primaryLR); +#endif + + //----- column assignment + + // sort blocks into xy order for column assignment + if (blocks) + gfree (blocks); + if (physLayout && fixedPitch) { + + blocks = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *)); + for (blk = blkList, i = 0; blk; blk = blk->next, ++i) { + blocks[i] = blk; + col1 = 0; // make gcc happy + switch (primaryRot) { + case 0: + col1 = (int)(blk->xMin / fixedPitch + 0.5); + break; + case 1: + col1 = (int)(blk->yMin / fixedPitch + 0.5); + break; + case 2: + col1 = (int)((pageWidth - blk->xMax) / fixedPitch + 0.5); + break; + case 3: + col1 = (int)((pageHeight - blk->yMax) / fixedPitch + 0.5); + break; + } + blk->col = col1; + for (line = blk->lines; line; line = line->next) { + for (j = 0; j <= line->len; ++j) { + line->col[j] += col1; + } + } + } + + } else { + + // sort blocks into xy order for column assignment + blocks = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *)); + for (blk = blkList, i = 0; blk; blk = blk->next, ++i) { + blocks[i] = blk; + } + qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot); + + // column assignment + for (i = 0; i < nBlocks; ++i) { + blk0 = blocks[i]; + col1 = 0; + for (j = 0; j < i; ++j) { + blk1 = blocks[j]; + col2 = 0; // make gcc happy + switch (primaryRot) { + case 0: + if (blk0->xMin > blk1->xMax) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->xMax == blk1->xMin) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->xMin - blk1->xMin) / + (blk1->xMax - blk1->xMin)) * + blk1->nColumns); + } + break; + case 1: + if (blk0->yMin > blk1->yMax) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->yMax == blk1->yMin) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->yMin - blk1->yMin) / + (blk1->yMax - blk1->yMin)) * + blk1->nColumns); + } + break; + case 2: + if (blk0->xMax < blk1->xMin) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->xMin == blk1->xMax) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->xMax - blk1->xMax) / + (blk1->xMin - blk1->xMax)) * + blk1->nColumns); + } + break; + case 3: + if (blk0->yMax < blk1->yMin) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->yMin == blk1->yMax) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->yMax - blk1->yMax) / + (blk1->yMin - blk1->yMax)) * + blk1->nColumns); + } + break; + } + if (col2 > col1) { + col1 = col2; + } + } + blk0->col = col1; + for (line = blk0->lines; line; line = line->next) { + for (j = 0; j <= line->len; ++j) { + line->col[j] += col1; + } + } + } + + } + +#if 0 // for debugging + printf("*** blocks, after column assignment ***\n"); + for (blk = blkList; blk; blk = blk->next) { + printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f col=%d nCols=%d\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, blk->col, + blk->nColumns); + for (line = blk->lines; line; line = line->next) { + printf(" line: col[0]=%d\n", line->col[0]); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + + //----- reading order sort + + // compute space on left and right sides of each block + for (i = 0; i < nBlocks; ++i) { + blk0 = blocks[i]; + for (j = 0; j < nBlocks; ++j) { + blk1 = blocks[j]; + if (blk1 != blk0) { + blk0->updatePriMinMax(blk1); + } + } + } + +#if 0 // for debugging + printf("PAGE\n"); +#endif + + int sortPos = 0; + GBool *visited = (GBool *)gmallocn(nBlocks, sizeof(GBool)); + for (i = 0; i < nBlocks; i++) { + visited[i] = gFalse; + } + + double bxMin0, byMin0, bxMin1, byMin1; + int numTables = 0; + int tableId = -1; + int correspondenceX, correspondenceY; + double xCentre1, yCentre1, xCentre2, yCentre2; + double xCentre3, yCentre3, xCentre4, yCentre4; + double deltaX, deltaY; + TextBlock *fblk2 = NULL, *fblk3 = NULL, *fblk4 = NULL; + + for (blk1 = blkList; blk1; blk1 = blk1->next) { + blk1->ExMin = blk1->xMin; + blk1->ExMax = blk1->xMax; + blk1->EyMin = blk1->yMin; + blk1->EyMax = blk1->yMax; + + bxMin0 = DBL_MAX; + byMin0 = DBL_MAX; + bxMin1 = DBL_MAX; + byMin1 = DBL_MAX; + + fblk2 = NULL; + fblk3 = NULL; + fblk4 = NULL; + + /* find fblk2, fblk3 and fblk4 so that + * fblk2 is on the right of blk1 and overlap with blk1 in y axis + * fblk3 is under blk1 and overlap with blk1 in x axis + * fblk4 is under blk1 and on the right of blk1 + * and they are closest to blk1 + */ + for (blk2 = blkList; blk2; blk2 = blk2->next) { + if (blk2 != blk1) { + if (blk2->yMin <= blk1->yMax && + blk2->yMax >= blk1->yMin && + blk2->xMin > blk1->xMax && + blk2->xMin < bxMin0) { + bxMin0 = blk2->xMin; + fblk2 = blk2; + } else if (blk2->xMin <= blk1->xMax && + blk2->xMax >= blk1->xMin && + blk2->yMin > blk1->yMax && + blk2->yMin < byMin0) { + byMin0 = blk2->yMin; + fblk3 = blk2; + } else if (blk2->xMin > blk1->xMax && + blk2->xMin < bxMin1 && + blk2->yMin > blk1->yMax && + blk2->yMin < byMin1) { + bxMin1 = blk2->xMin; + byMin1 = blk2->yMin; + fblk4 = blk2; + } + } + } + + /* fblk4 can not overlap with fblk3 in x and with fblk2 in y + * fblk2 can not overlap with fblk3 in x and y + * fblk4 has to overlap with fblk3 in y and with fblk2 in x + */ + if (fblk2 != NULL && + fblk3 != NULL && + fblk4 != NULL) { + if (((fblk3->xMin <= fblk4->xMax && fblk3->xMax >= fblk4->xMin) || + (fblk2->yMin <= fblk4->yMax && fblk2->yMax >= fblk4->yMin) || + (fblk2->xMin <= fblk3->xMax && fblk2->xMax >= fblk3->xMin) || + (fblk2->yMin <= fblk3->yMax && fblk2->yMax >= fblk3->yMin)) || + !(fblk4->xMin <= fblk2->xMax && fblk4->xMax >= fblk2->xMin && + fblk4->yMin <= fblk3->yMax && fblk4->yMax >= fblk3->yMin)) { + fblk2 = NULL; + fblk3 = NULL; + fblk4 = NULL; + } + } + + // if we found any then look whether they form a table + if (fblk2 != NULL && + fblk3 != NULL && + fblk4 != NULL) { + tableId = -1; + correspondenceX = 0; + correspondenceY = 0; + deltaX = 0.0; + deltaY = 0.0; + + if (blk1->lines && blk1->lines->words) + deltaX = blk1->lines->words->getFontSize(); + if (fblk2->lines && fblk2->lines->words) + deltaX = deltaX < fblk2->lines->words->getFontSize() ? + deltaX : fblk2->lines->words->getFontSize(); + if (fblk3->lines && fblk3->lines->words) + deltaX = deltaX < fblk3->lines->words->getFontSize() ? + deltaX : fblk3->lines->words->getFontSize(); + if (fblk4->lines && fblk4->lines->words) + deltaX = deltaX < fblk4->lines->words->getFontSize() ? + deltaX : fblk4->lines->words->getFontSize(); + + deltaY = deltaX; + + deltaX *= minColSpacing1; + deltaY *= maxIntraLineDelta; + + xCentre1 = (blk1->xMax + blk1->xMin) / 2.0; + yCentre1 = (blk1->yMax + blk1->yMin) / 2.0; + xCentre2 = (fblk2->xMax + fblk2->xMin) / 2.0; + yCentre2 = (fblk2->yMax + fblk2->yMin) / 2.0; + xCentre3 = (fblk3->xMax + fblk3->xMin) / 2.0; + yCentre3 = (fblk3->yMax + fblk3->yMin) / 2.0; + xCentre4 = (fblk4->xMax + fblk4->xMin) / 2.0; + yCentre4 = (fblk4->yMax + fblk4->yMin) / 2.0; + + // are blocks centrally aligned in x ? + if (fabs (xCentre1 - xCentre3) <= deltaX && + fabs (xCentre2 - xCentre4) <= deltaX) + correspondenceX++; + + // are blocks centrally aligned in y ? + if (fabs (yCentre1 - yCentre2) <= deltaY && + fabs (yCentre3 - yCentre4) <= deltaY) + correspondenceY++; + + // are blocks aligned to the left ? + if (fabs (blk1->xMin - fblk3->xMin) <= deltaX && + fabs (fblk2->xMin - fblk4->xMin) <= deltaX) + correspondenceX++; + + // are blocks aligned to the right ? + if (fabs (blk1->xMax - fblk3->xMax) <= deltaX && + fabs (fblk2->xMax - fblk4->xMax) <= deltaX) + correspondenceX++; + + // are blocks aligned to the top ? + if (fabs (blk1->yMin - fblk2->yMin) <= deltaY && + fabs (fblk3->yMin - fblk4->yMin) <= deltaY) + correspondenceY++; + + // are blocks aligned to the bottom ? + if (fabs (blk1->yMax - fblk2->yMax) <= deltaY && + fabs (fblk3->yMax - fblk4->yMax) <= deltaY) + correspondenceY++; + + // are blocks aligned in x and y ? + if (correspondenceX > 0 && + correspondenceY > 0) { + + // find maximal tableId + tableId = tableId < fblk4->tableId ? fblk4->tableId : tableId; + tableId = tableId < fblk3->tableId ? fblk3->tableId : tableId; + tableId = tableId < fblk2->tableId ? fblk2->tableId : tableId; + tableId = tableId < blk1->tableId ? blk1->tableId : tableId; + + // if the tableId is -1, then we found new table + if (tableId < 0) { + tableId = numTables; + numTables++; + } + + blk1->tableId = tableId; + fblk2->tableId = tableId; + fblk3->tableId = tableId; + fblk4->tableId = tableId; + } + } + } + + /* set extended bounding boxes of all table entries + * so that they contain whole table + * (we need to process whole table size when comparing it + * with regular text blocks) + */ + PDFRectangle *envelopes = new PDFRectangle [numTables]; + TextBlock **ending_blocks = new TextBlock* [numTables]; + + for (i = 0; i < numTables; i++) { + envelopes[i].x1 = DBL_MAX; + envelopes[i].x2 = DBL_MIN; + envelopes[i].y1 = DBL_MAX; + envelopes[i].y2 = DBL_MIN; + } + + for (blk1 = blkList; blk1; blk1 = blk1->next) { + if (blk1->tableId >= 0) { + if (blk1->ExMin < envelopes[blk1->tableId].x1) { + envelopes[blk1->tableId].x1 = blk1->ExMin; + if (!blk1->page->primaryLR) + ending_blocks[blk1->tableId] = blk1; + } + + if (blk1->ExMax > envelopes[blk1->tableId].x2) { + envelopes[blk1->tableId].x2 = blk1->ExMax; + if (blk1->page->primaryLR) + ending_blocks[blk1->tableId] = blk1; + } + + envelopes[blk1->tableId].y1 = blk1->EyMin < envelopes[blk1->tableId].y1 ? + blk1->EyMin : envelopes[blk1->tableId].y1; + envelopes[blk1->tableId].y2 = blk1->EyMax > envelopes[blk1->tableId].y2 ? + blk1->EyMax : envelopes[blk1->tableId].y2; + } + } + + for (blk1 = blkList; blk1; blk1 = blk1->next) { + if (blk1->tableId >= 0 && + blk1->xMin <= ending_blocks[blk1->tableId]->xMax && + blk1->xMax >= ending_blocks[blk1->tableId]->xMin) { + blk1->tableEnd = gTrue; + } + } + + for (blk1 = blkList; blk1; blk1 = blk1->next) { + if (blk1->tableId >= 0) { + blk1->ExMin = envelopes[blk1->tableId].x1; + blk1->ExMax = envelopes[blk1->tableId].x2; + blk1->EyMin = envelopes[blk1->tableId].y1; + blk1->EyMax = envelopes[blk1->tableId].y2; + } + } + delete[] envelopes; + delete[] ending_blocks; + + + /* set extended bounding boxes of all other blocks + * so that they extend in x without hitting neighbours + */ + for (blk1 = blkList; blk1; blk1 = blk1->next) { + if (!blk1->tableId >= 0) { + double xMax = DBL_MAX; + double xMin = DBL_MIN; + + for (blk2 = blkList; blk2; blk2 = blk2->next) { + if (blk2 == blk1) + continue; + + if (blk1->yMin <= blk2->yMax && blk1->yMax >= blk2->yMin) { + if (blk2->xMin < xMax && blk2->xMin > blk1->xMax) + xMax = blk2->xMin; + + if (blk2->xMax > xMin && blk2->xMax < blk1->xMin) + xMin = blk2->xMax; + } + } + + for (blk2 = blkList; blk2; blk2 = blk2->next) { + if (blk2 == blk1) + continue; + + if (blk2->xMax > blk1->ExMax && + blk2->xMax <= xMax && + blk2->yMin >= blk1->yMax) { + blk1->ExMax = blk2->xMax; + } + + if (blk2->xMin < blk1->ExMin && + blk2->xMin >= xMin && + blk2->yMin >= blk1->yMax) + blk1->ExMin = blk2->xMin; + } + } + } + + i = -1; + for (blk1 = blkList; blk1; blk1 = blk1->next) { + i++; + sortPos = blk1->visitDepthFirst(blkList, i, blocks, sortPos, visited); + } + if (visited) { + gfree(visited); + } + +#if 0 // for debugging + printf("*** blocks, after ro sort ***\n"); + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f space=%.2f..%.2f\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, + blk->priMin, blk->priMax); + for (line = blk->lines; line; line = line->next) { + printf(" line:\n"); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (j = 0; j < word0->len; ++j) { + fputc(word0->text[j] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); + fflush(stdout); +#endif + + // build the flows + //~ this needs to be adjusted for writing mode (vertical text) + //~ this also needs to account for right-to-left column ordering + flow = NULL; + while (flows) { + flow = flows; + flows = flows->next; + delete flow; + } + flows = lastFlow = NULL; + // assume blocks are already in reading order, + // and construct flows accordingly. + for (i = 0; i < nBlocks; i++) { + blk = blocks[i]; + blk->next = NULL; + if (flow) { + blk1 = blocks[i - 1]; + blkSpace = maxBlockSpacing * blk1->lines->words->fontSize; + if (blk1->secondaryDelta(blk) <= blkSpace && + blk->isBelow(blk1) && + flow->blockFits(blk, blk1)) { + flow->addBlock(blk); + continue; + } + } + flow = new TextFlow(this, blk); + if (lastFlow) { + lastFlow->next = flow; + } else { + flows = flow; + } + lastFlow = flow; + } + +#if 0 // for debugging + printf("*** flows ***\n"); + for (flow = flows; flow; flow = flow->next) { + printf("flow: x=%.2f..%.2f y=%.2f..%.2f pri:%.2f..%.2f\n", + flow->xMin, flow->xMax, flow->yMin, flow->yMax, + flow->priMin, flow->priMax); + for (blk = flow->blocks; blk; blk = blk->next) { + printf(" block: rot=%d x=%.2f..%.2f y=%.2f..%.2f pri=%.2f..%.2f\n", + blk->rot, blk->ExMin, blk->ExMax, blk->EyMin, blk->EyMax, + blk->priMin, blk->priMax); + for (line = blk->lines; line; line = line->next) { + printf(" line:\n"); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + } + printf("\n"); +#endif + + if (uMap) { + uMap->decRefCnt(); + } +} + +GBool TextPage::findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + GBool wholeWord, + double *xMin, double *yMin, + double *xMax, double *yMax) { + TextBlock *blk; + TextLine *line; + Unicode *s2, *txt; + Unicode *p; + int txtSize, m, i, j, k; + double xStart, yStart, xStop, yStop; + double xMin0, yMin0, xMax0, yMax0; + double xMin1, yMin1, xMax1, yMax1; + GBool found; + + //~ needs to handle right-to-left text + + if (rawOrder) { + return gFalse; + } + + // convert the search string to uppercase + if (!caseSensitive) { + s2 = unicodeNormalizeNFKC(s, len, &len, NULL); + for (i = 0; i < len; ++i) { + s2[i] = unicodeToUpper(s2[i]); + } + } else { + s2 = unicodeNormalizeNFKC(s, len, &len, NULL); + } + + txt = NULL; + txtSize = 0; + + xStart = yStart = xStop = yStop = 0; + if (startAtLast && haveLastFind) { + xStart = lastFindXMin; + yStart = lastFindYMin; + } else if (!startAtTop) { + xStart = *xMin; + yStart = *yMin; + } + if (stopAtLast && haveLastFind) { + xStop = lastFindXMin; + yStop = lastFindYMin; + } else if (!stopAtBottom) { + xStop = *xMax; + yStop = *yMax; + } + + found = gFalse; + xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy + xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy + + for (i = backward ? nBlocks - 1 : 0; + backward ? i >= 0 : i < nBlocks; + i += backward ? -1 : 1) { + blk = blocks[i]; + + // check: is the block above the top limit? + // (this only works if the page's primary rotation is zero -- + // otherwise the blocks won't be sorted in the useful order) + if (!startAtTop && primaryRot == 0 && + (backward ? blk->yMin > yStart : blk->yMax < yStart)) { + continue; + } + + // check: is the block below the bottom limit? + // (this only works if the page's primary rotation is zero -- + // otherwise the blocks won't be sorted in the useful order) + if (!stopAtBottom && primaryRot == 0 && + (backward ? blk->yMax < yStop : blk->yMin > yStop)) { + break; + } + + for (line = blk->lines; line; line = line->next) { + + // check: is the line above the top limit? + // (this only works if the page's primary rotation is zero -- + // otherwise the lines won't be sorted in the useful order) + if (!startAtTop && primaryRot == 0 && + (backward ? line->yMin > yStart : line->yMin < yStart)) { + continue; + } + + // check: is the line below the bottom limit? + // (this only works if the page's primary rotation is zero -- + // otherwise the lines won't be sorted in the useful order) + if (!stopAtBottom && primaryRot == 0 && + (backward ? line->yMin < yStop : line->yMin > yStop)) { + continue; + } + + if (!line->normalized) + line->normalized = unicodeNormalizeNFKC(line->text, line->len, + &line->normalized_len, + &line->normalized_idx); + // convert the line to uppercase + m = line->normalized_len; + if (!caseSensitive) { + if (m > txtSize) { + txt = (Unicode *)greallocn(txt, m, sizeof(Unicode)); + txtSize = m; + } + for (k = 0; k < m; ++k) { + txt[k] = unicodeToUpper(line->normalized[k]); + } + } else { + txt = line->normalized; + } + + // search each position in this line + j = backward ? m - len : 0; + p = txt + j; + while (backward ? j >= 0 : j <= m - len) { + + // compare the strings + for (k = 0; k < len; ++k) { + if (p[k] != s2[k]) { + break; + } + } + + // found it + if (k == len) { + // where s2 matches a subsequence of a compatibility equivalence + // decomposition, highlight the entire glyph, since we don't know + // the internal layout of subglyph components + int normStart = line->normalized_idx[j]; + int normAfterEnd = line->normalized_idx[j + len - 1] + 1; + switch (line->rot) { + case 0: + xMin1 = line->edge[normStart]; + xMax1 = line->edge[normAfterEnd]; + yMin1 = line->yMin; + yMax1 = line->yMax; + break; + case 1: + xMin1 = line->xMin; + xMax1 = line->xMax; + yMin1 = line->edge[normStart]; + yMax1 = line->edge[normAfterEnd]; + break; + case 2: + xMin1 = line->edge[normAfterEnd]; + xMax1 = line->edge[normStart]; + yMin1 = line->yMin; + yMax1 = line->yMax; + break; + case 3: + xMin1 = line->xMin; + xMax1 = line->xMax; + yMin1 = line->edge[normAfterEnd]; + yMax1 = line->edge[normStart]; + break; + } + if (backward) { + if ((startAtTop || + yMin1 < yStart || (yMin1 == yStart && xMin1 < xStart)) && + (stopAtBottom || + yMin1 > yStop || (yMin1 == yStop && xMin1 > xStop))) { + if (!found || + yMin1 > yMin0 || (yMin1 == yMin0 && xMin1 > xMin0)) { + xMin0 = xMin1; + xMax0 = xMax1; + yMin0 = yMin1; + yMax0 = yMax1; + found = gTrue; + } + } + } else { + if ((startAtTop || + yMin1 > yStart || (yMin1 == yStart && xMin1 > xStart)) && + (stopAtBottom || + yMin1 < yStop || (yMin1 == yStop && xMin1 < xStop))) { + if (!found || + yMin1 < yMin0 || (yMin1 == yMin0 && xMin1 < xMin0)) { + xMin0 = xMin1; + xMax0 = xMax1; + yMin0 = yMin1; + yMax0 = yMax1; + found = gTrue; + } + } + } + } + if (backward) { + --j; + --p; + } else { + ++j; + ++p; + } + } + } + } + + gfree(s2); + if (!caseSensitive) { + gfree(txt); + } + + if (found) { + *xMin = xMin0; + *xMax = xMax0; + *yMin = yMin0; + *yMax = yMax0; + lastFindXMin = xMin0; + lastFindYMin = yMin0; + haveLastFind = gTrue; + return gTrue; + } + + return gFalse; +} + +GooString *TextPage::getText(double xMin, double yMin, + double xMax, double yMax) { + GooString *s; + UnicodeMap *uMap; + TextBlock *blk; + TextLine *line; + TextLineFrag *frags; + int nFrags, fragsSize; + TextLineFrag *frag; + char space[8], eol[16]; + int spaceLen, eolLen; + int lastRot; + double x, y, delta; + int col, idx0, idx1, i, j; + GBool multiLine, oneRot; + + s = new GooString(); + + // get the output encoding + if (!(uMap = globalParams->getTextEncoding())) { + return s; + } + + if (rawOrder) { + TextWord* word; + char mbc[16]; + int mbc_len; + + for (word = rawWords; word && word <= rawLastWord; word = word->next) { + for (j = 0; j < word->getLength(); ++j) { + double gXMin, gXMax, gYMin, gYMax; + word->getCharBBox(j, &gXMin, &gYMin, &gXMax, &gYMax); + if (xMin <= gXMin && gXMax <= xMax && yMin <= gYMin && gYMax <= yMax) + { + mbc_len = uMap->mapUnicode( *(word->getChar(j)), mbc, sizeof(mbc) ); + s->append(mbc, mbc_len); + } + } + } + return s; + } + + spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); + eolLen = 0; // make gcc happy + switch (globalParams->getTextEOL()) { + case eolUnix: + eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); + break; + case eolDOS: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen); + break; + case eolMac: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + break; + } + + //~ writing mode (horiz/vert) + + // collect the line fragments that are in the rectangle + fragsSize = 256; + frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); + nFrags = 0; + lastRot = -1; + oneRot = gTrue; + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + if (xMin < blk->xMax && blk->xMin < xMax && + yMin < blk->yMax && blk->yMin < yMax) { + for (line = blk->lines; line; line = line->next) { + if (xMin < line->xMax && line->xMin < xMax && + yMin < line->yMax && line->yMin < yMax) { + idx0 = idx1 = -1; + switch (line->rot) { + case 0: + y = 0.5 * (line->yMin + line->yMax); + if (yMin < y && y < yMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) { + idx1 = j; + break; + } + --j; + } + } + break; + case 1: + x = 0.5 * (line->xMin + line->xMax); + if (xMin < x && x < xMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) { + idx1 = j; + break; + } + --j; + } + } + break; + case 2: + y = 0.5 * (line->yMin + line->yMax); + if (yMin < y && y < yMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) { + idx1 = j; + break; + } + --j; + } + } + break; + case 3: + x = 0.5 * (line->xMin + line->xMax); + if (xMin < x && x < xMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) { + idx1 = j; + break; + } + --j; + } + } + break; + } + if (idx0 >= 0 && idx1 >= 0) { + if (nFrags == fragsSize) { + fragsSize *= 2; + frags = (TextLineFrag *) + greallocn(frags, fragsSize, sizeof(TextLineFrag)); + } + frags[nFrags].init(line, idx0, idx1 - idx0 + 1); + ++nFrags; + if (lastRot >= 0 && line->rot != lastRot) { + oneRot = gFalse; + } + lastRot = line->rot; + } + } + } + } + } + + // sort the fragments and generate the string + if (nFrags > 0) { + + for (i = 0; i < nFrags; ++i) { + frags[i].computeCoords(oneRot); + } + assignColumns(frags, nFrags, oneRot); + + // if all lines in the region have the same rotation, use it; + // otherwise, use the page's primary rotation + if (oneRot) { + qsort(frags, nFrags, sizeof(TextLineFrag), + &TextLineFrag::cmpYXLineRot); + } else { + qsort(frags, nFrags, sizeof(TextLineFrag), + &TextLineFrag::cmpYXPrimaryRot); + } + i = 0; + while (i < nFrags) { + delta = maxIntraLineDelta * frags[i].line->words->fontSize; + for (j = i+1; + j < nFrags && fabs(frags[j].base - frags[i].base) < delta; + ++j) ; + qsort(frags + i, j - i, sizeof(TextLineFrag), + oneRot ? &TextLineFrag::cmpXYColumnLineRot + : &TextLineFrag::cmpXYColumnPrimaryRot); + i = j; + } + + col = 0; + multiLine = gFalse; + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + + // insert a return + if (frag->col < col || + (i > 0 && fabs(frag->base - frags[i-1].base) > + maxIntraLineDelta * frags[i-1].line->words->fontSize)) { + s->append(eol, eolLen); + col = 0; + multiLine = gTrue; + } + + // column alignment + for (; col < frag->col; ++col) { + s->append(space, spaceLen); + } + + // get the fragment text + col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s); + } + + if (multiLine) { + s->append(eol, eolLen); + } + } + + gfree(frags); + uMap->decRefCnt(); + + return s; +} + +class TextSelectionVisitor { +public: + TextSelectionVisitor (TextPage *page); + virtual ~TextSelectionVisitor () { } + virtual void visitBlock (TextBlock *block, + TextLine *begin, + TextLine *end, + PDFRectangle *selection) = 0; + virtual void visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection) = 0; + virtual void visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection) = 0; + +protected: + TextPage *page; +}; + +TextSelectionVisitor::TextSelectionVisitor (TextPage *page) + : page(page) +{ +} + + +class TextSelectionDumper : public TextSelectionVisitor { +public: + TextSelectionDumper(TextPage *page); + virtual ~TextSelectionDumper(); + + virtual void visitBlock (TextBlock *block, + TextLine *begin, + TextLine *end, + PDFRectangle *selection) { }; + virtual void visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection); + virtual void visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection) { }; + + GooString *getText(void); + +private: + TextLineFrag *frags; + int nFrags, fragsSize; +}; + +TextSelectionDumper::TextSelectionDumper(TextPage *page) + : TextSelectionVisitor(page) +{ + fragsSize = 256; + frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); + nFrags = 0; +} + +TextSelectionDumper::~TextSelectionDumper() +{ + gfree(frags); +} + +void TextSelectionDumper::visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection) +{ + if (nFrags == fragsSize) { + fragsSize *= 2; + frags = (TextLineFrag *) grealloc(frags, fragsSize * sizeof(TextLineFrag)); + } + + frags[nFrags].init(line, edge_begin, edge_end - edge_begin); + ++nFrags; + +} + +GooString *TextSelectionDumper::getText (void) +{ + GooString *s; + TextLineFrag *frag; + int i, j; + UnicodeMap *uMap; + char space[8], eol[16]; + int spaceLen, eolLen; + GooList *strings = NULL; + int actual_table = -1; + int actual_line = -1; + int last_length = 0; + TextBlock *actual_block = NULL; + + s = new GooString(); + + uMap = globalParams->getTextEncoding(); + + if (uMap == NULL) + return s; + + spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); + eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); + + if (nFrags > 0) { + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + + if (actual_table >= 0 && frag->line->blk->tableId < 0) { + for (j = 0; j < strings->getLength (); j++) { + s->append ((GooString*) strings->get (j)); + s->append (eol, eolLen); + delete ((GooString*) strings->get (j)); + } + delete strings; + strings = NULL; + actual_table = -1; + actual_line = -1; + actual_block = NULL; + } + + // a table + if (frag->line->blk->tableId >= 0) { + if (actual_table == -1) { + strings = new GooList(); + actual_table = frag->line->blk->tableId; + actual_block = frag->line->blk; + actual_line = -1; + } + + // the same block + if (actual_block == frag->line->blk) { + actual_line++; + if (actual_line >= strings->getLength ()) { + GooString *t = new GooString (); + // add some spaces to have this block correctly aligned + if (actual_line > 0) + for (j = 0; j < ((GooString*) (strings->get (actual_line - 1)))->getLength() - last_length - 1; j++) + t->append (space, spaceLen); + strings->append (t); + } + } + // another block + else { + // previous block ended its row + if (actual_block->tableEnd) { + for (j = 0; j < strings->getLength (); j++) { + s->append ((GooString*) strings->get (j)); + s->append (eol, eolLen); + delete ((GooString*) strings->get (j)); + } + delete strings; + + strings = new GooList(); + GooString *t = new GooString (); + strings->append (t); + } + actual_block = frag->line->blk; + actual_line = 0; + } + + page->dumpFragment(frag->line->text + frag->start, frag->len, uMap, ((GooString*) strings->get (actual_line))); + last_length = frag->len; + + if (!frag->line->blk->tableEnd) { + ((GooString*) strings->get (actual_line))->append (space, spaceLen); + } + } + // not a table + else { + page->dumpFragment (frag->line->text + frag->start, frag->len, uMap, s); + if (i < nFrags - 1) { + s->append (eol, eolLen); + } + } + } + + if (strings != NULL) { + for (j = 0; j < strings->getLength (); j++) { + s->append((GooString*) strings->get (j)); + s->append(eol, eolLen); + delete ((GooString*) strings->get (j)); + } + delete strings; + strings = NULL; + actual_table = -1; + actual_line = -1; + actual_block = NULL; + } + } + + uMap->decRefCnt(); + + return s; +} + +class TextSelectionSizer : public TextSelectionVisitor { +public: + TextSelectionSizer(TextPage *page, double scale); + ~TextSelectionSizer() { } + + virtual void visitBlock (TextBlock *block, + TextLine *begin, + TextLine *end, + PDFRectangle *selection) { }; + virtual void visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection); + virtual void visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection) { }; + + GooList *getRegion () { return list; } + +private: + GooList *list; + double scale; +}; + +TextSelectionSizer::TextSelectionSizer(TextPage *page, double scale) + : TextSelectionVisitor(page), + scale(scale) +{ + list = new GooList(); +} + +void TextSelectionSizer::visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection) +{ + PDFRectangle *rect; + double x1, y1, x2, y2, margin; + + margin = (line->yMax - line->yMin) / 8; + x1 = line->edge[edge_begin]; + y1 = line->yMin - margin; + x2 = line->edge[edge_end]; + y2 = line->yMax + margin; + + rect = new PDFRectangle (floor (x1 * scale), + floor (y1 * scale), + ceil (x2 * scale), + ceil (y2 * scale)); + list->append (rect); +} + + +class TextSelectionPainter : public TextSelectionVisitor { +public: + TextSelectionPainter(TextPage *page, + double scale, + int rotation, + OutputDev *out, + GfxColor *box_color, + GfxColor *glyph_color); + ~TextSelectionPainter(); + + virtual void visitBlock (TextBlock *block, + TextLine *begin, + TextLine *end, + PDFRectangle *selection) { }; + virtual void visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection); + virtual void visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection); + +private: + OutputDev *out; + GfxColor *box_color, *glyph_color; + GfxState *state; +}; + +TextSelectionPainter::TextSelectionPainter(TextPage *page, + double scale, + int rotation, + OutputDev *out, + GfxColor *box_color, + GfxColor *glyph_color) + : TextSelectionVisitor(page), + out(out), + box_color(box_color), + glyph_color(glyph_color) +{ + PDFRectangle box(0, 0, page->pageWidth, page->pageHeight); + + state = new GfxState(72 * scale, 72 * scale, &box, rotation, gFalse); + + out->startPage (0, state); + out->setDefaultCTM (state->getCTM()); + + state->setTextMat(1, 0, 0, -1, 0, 0); + state->setFillColorSpace(new GfxDeviceRGBColorSpace()); + +} + +TextSelectionPainter::~TextSelectionPainter() +{ + out->endPage (); + + delete state; +} + +void TextSelectionPainter::visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection) +{ + double x1, y1, x2, y2, margin; + Matrix ctm, ictm; + + state->setFillColor(box_color); + out->updateFillColor(state); + + margin = (line->yMax - line->yMin) / 8; + x1 = floor (line->edge[edge_begin]); + y1 = floor (line->yMin - margin); + x2 = ceil (line->edge[edge_end]); + y2 = ceil (line->yMax + margin); + + state->getCTM (&ctm); + ctm.transform(line->edge[edge_begin], line->yMin - margin, &x1, &y1); + ctm.transform(line->edge[edge_end], line->yMax + margin, &x2, &y2); + + x1 = floor (x1); + y1 = floor (y1); + x2 = ceil (x2); + y2 = ceil (y2); + + ctm.invertTo (&ictm); + ictm.transform(x1, y1, &x1, &y1); + ictm.transform(x2, y2, &x2, &y2); + + state->moveTo(x1, y1); + state->lineTo(x2, y1); + state->lineTo(x2, y2); + state->lineTo(x1, y2); + state->closePath(); + + out->fill(state); + state->clearPath(); +} + +void TextSelectionPainter::visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection) +{ + GooString *string; + int i; + + state->setFillColor(glyph_color); + out->updateFillColor(state); + word->font->gfxFont->incRefCnt(); + state->setFont(word->font->gfxFont, word->fontSize); + out->updateFont(state); + + /* The only purpose of this string is to let the output device query + * it's length. Might want to change this interface later. */ + + string = new GooString ((char *) word->charcode, end - begin); + + out->beginString(state, string); + + for (i = begin; i < end; i++) + out->drawChar(state, word->edge[i], word->base, 0, 0, 0, 0, + word->charcode[i], 1, NULL, 0); + + out->endString(state); + + delete string; +} + +void TextWord::visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style) +{ + int i, begin, end; + double mid; + + begin = len; + end = 0; + for (i = 0; i < len; i++) { + mid = (edge[i] + edge[i + 1]) / 2; + if (selection->x1 < mid || selection->x2 < mid) + if (i < begin) + begin = i; + if (mid < selection->x1 || mid < selection->x2) + end = i + 1; + } + + /* Skip empty selection. */ + if (end <= begin) + return; + + visitor->visitWord (this, begin, end, selection); +} + +void TextLine::visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style) { + TextWord *p, *begin, *end, *current; + int i, edge_begin, edge_end; + PDFRectangle child_selection; + + begin = NULL; + end = NULL; + current = NULL; + for (p = words; p != NULL; p = p->next) { + if (blk->page->primaryLR) { + if ((selection->x1 < p->xMax) || + (selection->x2 < p->xMax)) + if (begin == NULL) + begin = p; + + if (((selection->x1 > p->xMin) || + (selection->x2 > p->xMin)) && (begin != NULL)) { + end = p->next; + current = p; + } + } else { + if ((selection->x1 > p->xMin) || + (selection->x2 > p->xMin)) + if (begin == NULL) + begin = p; + + if (((selection->x1 < p->xMax) || + (selection->x2 < p->xMax)) && (begin != NULL)) { + end = p->next; + current = p; + } + } + } + + if (!current) + current = begin; + + child_selection = *selection; + if (style == selectionStyleWord) { + child_selection.x1 = begin ? begin->xMin : xMin; + if (end && end->xMax != -1) { + child_selection.x2 = current->xMax; + } else { + child_selection.x2 = xMax; + } + } + + edge_begin = len; + edge_end = 0; + for (i = 0; i < len; i++) { + double mid = (edge[i] + edge[i + 1]) / 2; + if (child_selection.x1 < mid || child_selection.x2 < mid) + if (i < edge_begin) + edge_begin = i; + if (mid < child_selection.x2 || mid < child_selection.x1) + edge_end = i + 1; + } + + /* Skip empty selection. */ + if (edge_end <= edge_begin) + return; + + visitor->visitLine (this, begin, end, edge_begin, edge_end, + &child_selection); + + for (p = begin; p != end; p = p->next) + p->visitSelection (visitor, &child_selection, style); +} + +void TextBlock::visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style) { + PDFRectangle child_selection; + double x[2], y[2], d, best_d[2]; + TextLine *p, *best_line[2]; + int i, count = 0, best_count[2], start, stop; + GBool all[2]; + + x[0] = selection->x1; + y[0] = selection->y1; + x[1] = selection->x2; + y[1] = selection->y2; + + for (i = 0; i < 2; i++) { + // the first/last lines are often not nearest + // the corners, so we have to force them to be + // selected when the selection runs outside this + // block. + if (page->primaryLR) { + all[i] = x[i] >= this->xMax && y[i] >= this->yMax; + if (x[i] <= this->xMin && y[i] <= this->yMin) { + best_line[i] = this->lines; + best_count[i] = 1; + } else { + best_line[i] = NULL; + best_count[i] = 0; + } + } else { + all[i] = x[i] <= this->xMin && y[i] >= this->yMax; + if (x[i] >= this->xMax && y[i] <= this->yMin) { + best_line[i] = this->lines; + best_count[i] = 1; + } else { + best_line[i] = NULL; + best_count[i] = 0; + } + } + best_d[i] = 0; + } + + // find the nearest line to the selection points + // using the manhattan distance. + for (p = this->lines; p; p = p->next) { + count++; + for (i = 0; i < 2; i++) { + d = fmax(p->xMin - x[i], 0.0) + + fmax(x[i] - p->xMax, 0.0) + + fmax(p->yMin - y[i], 0.0) + + fmax(y[i] - p->yMax, 0.0); + if (!best_line[i] || all[i] || + d < best_d[i]) { + best_line[i] = p; + best_count[i] = count; + best_d[i] = d; + } + } + } + // assert: best is always set. + if (!best_line[0] || !best_line[1]) { + return; + } + + // Now decide which point was first. + if (best_count[0] < best_count[1] || + (best_count[0] == best_count[1] && + y[0] < y[1])) { + start = 0; + stop = 1; + } else { + start = 1; + stop = 0; + } + + visitor->visitBlock(this, best_line[start], best_line[stop], selection); + + for (p = best_line[start]; p; p = p->next) { + if (page->primaryLR) { + child_selection.x1 = p->xMin; + child_selection.x2 = p->xMax; + } else { + child_selection.x1 = p->xMax; + child_selection.x2 = p->xMin; + } + child_selection.y1 = p->yMin; + child_selection.y2 = p->yMax; + if (style == selectionStyleLine) { + if (p == best_line[start]) { + child_selection.x1 = 0; + child_selection.y1 = 0; + } + if (p == best_line[stop]) { + child_selection.x2 = page->pageWidth; + child_selection.y2 = page->pageHeight; + } + } else { + if (p == best_line[start]) { + child_selection.x1 = fmax(p->xMin, fmin(p->xMax, x[start])); + child_selection.y1 = fmax(p->yMin, fmin(p->yMax, y[start])); + } + if (p == best_line[stop]) { + child_selection.x2 = fmax(p->xMin, fmin(p->xMax, x[stop])); + child_selection.y2 = fmax(p->yMin, fmin(p->yMax, y[stop])); + } + } + p->visitSelection(visitor, &child_selection, style); + if (p == best_line[stop]) { + return; + } + } +} + +void TextPage::visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style) +{ + PDFRectangle child_selection; + double x[2], y[2], d, best_d[2]; + double xMin, yMin, xMax, yMax; + TextFlow *flow, *best_flow[2]; + TextBlock *blk, *best_block[2]; + int i, count = 0, best_count[2], start, stop; + + if (!flows) + return; + + x[0] = selection->x1; + y[0] = selection->y1; + x[1] = selection->x2; + y[1] = selection->y2; + + xMin = pageWidth; + yMin = pageHeight; + xMax = 0.0; + yMax = 0.0; + + for (i = 0; i < 2; i++) { + best_block[i] = NULL; + best_flow[i] = NULL; + best_count[i] = 0; + best_d[i] = 0; + } + + // find the nearest blocks to the selection points + // using the manhattan distance. + for (flow = flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + count++; + // the first/last blocks in reading order are + // often not the closest to the page corners; + // track the corners, force those blocks to + // be selected if the selection runs across + // multiple pages. + xMin = fmin(xMin, blk->xMin); + yMin = fmin(yMin, blk->yMin); + xMax = fmax(xMax, blk->xMax); + yMax = fmax(yMax, blk->yMax); + for (i = 0; i < 2; i++) { + d = fmax(blk->xMin - x[i], 0.0) + + fmax(x[i] - blk->xMax, 0.0) + + fmax(blk->yMin - y[i], 0.0) + + fmax(y[i] - blk->yMax, 0.0); + if (!best_block[i] || + d < best_d[i] || + (!blk->next && !flow->next && + x[i] > xMax && y[i] > yMax)) { + best_block[i] = blk; + best_flow[i] = flow; + best_count[i] = count; + best_d[i] = d; + } + } + } + } + for (i = 0; i < 2; i++) { + if (primaryLR) { + if (x[i] < xMin && y[i] < yMin) { + best_block[i] = flows->blocks; + best_flow[i] = flows; + best_count[i] = 1; + } + } else { + if (x[i] > xMax && y[i] < yMin) { + best_block[i] = flows->blocks; + best_flow[i] = flows; + best_count[i] = 1; + } + } + } + // assert: best is always set. + if (!best_block[0] || !best_block[1]) { + return; + } + + // Now decide which point was first. + if (best_count[0] < best_count[1] || + (best_count[0] == best_count[1] && y[0] < y[1])) { + start = 0; + stop = 1; + } else { + start = 1; + stop = 0; + } + + for (flow = best_flow[start]; flow; flow = flow->next) { + if (flow == best_flow[start]) { + blk = best_block[start]; + } else { + blk = flow->blocks; + } + for (; blk; blk = blk->next) { + if (primaryLR) { + child_selection.x1 = blk->xMin; + child_selection.x2 = blk->xMax; + } else { + child_selection.x1 = blk->xMax; + child_selection.x2 = blk->xMin; + } + child_selection.y1 = blk->yMin; + child_selection.y2 = blk->yMax; + if (blk == best_block[start]) { + child_selection.x1 = fmax(blk->xMin, fmin(blk->xMax, x[start])); + child_selection.y1 = fmax(blk->yMin, fmin(blk->yMax, y[start])); + } + if (blk == best_block[stop]) { + child_selection.x2 = fmax(blk->xMin, fmin(blk->xMax, x[stop])); + child_selection.y2 = fmax(blk->yMin, fmin(blk->yMax, y[stop])); + blk->visitSelection(visitor, &child_selection, style); + return; + } + blk->visitSelection(visitor, &child_selection, style); + } + } +} + +void TextPage::drawSelection(OutputDev *out, + double scale, + int rotation, + PDFRectangle *selection, + SelectionStyle style, + GfxColor *glyph_color, GfxColor *box_color) +{ + TextSelectionPainter painter(this, scale, rotation, + out, box_color, glyph_color); + + visitSelection(&painter, selection, style); +} + +GooList *TextPage::getSelectionRegion(PDFRectangle *selection, + SelectionStyle style, + double scale) { + TextSelectionSizer sizer(this, scale); + + visitSelection(&sizer, selection, style); + + return sizer.getRegion(); +} + +GooString *TextPage::getSelectionText(PDFRectangle *selection, + SelectionStyle style) +{ + TextSelectionDumper dumper(this); + + visitSelection(&dumper, selection, style); + + return dumper.getText(); +} + +GBool TextPage::findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax) { + TextBlock *blk; + TextLine *line; + TextWord *word; + double xMin0, xMax0, yMin0, yMax0; + double xMin1, xMax1, yMin1, yMax1; + GBool first; + int i, j0, j1; + + if (rawOrder) { + return gFalse; + } + + //~ this doesn't correctly handle ranges split across multiple lines + //~ (the highlighted region is the bounding box of all the parts of + //~ the range) + first = gTrue; + xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy + xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + if (pos < word->charPos[word->len] && + pos + length > word->charPos[0]) { + for (j0 = 0; + j0 < word->len && pos >= word->charPos[j0 + 1]; + ++j0) ; + for (j1 = word->len - 1; + j1 > j0 && pos + length <= word->charPos[j1]; + --j1) ; + switch (line->rot) { + case 0: + xMin1 = word->edge[j0]; + xMax1 = word->edge[j1 + 1]; + yMin1 = word->yMin; + yMax1 = word->yMax; + break; + case 1: + xMin1 = word->xMin; + xMax1 = word->xMax; + yMin1 = word->edge[j0]; + yMax1 = word->edge[j1 + 1]; + break; + case 2: + xMin1 = word->edge[j1 + 1]; + xMax1 = word->edge[j0]; + yMin1 = word->yMin; + yMax1 = word->yMax; + break; + case 3: + xMin1 = word->xMin; + xMax1 = word->xMax; + yMin1 = word->edge[j1 + 1]; + yMax1 = word->edge[j0]; + break; + } + if (first || xMin1 < xMin0) { + xMin0 = xMin1; + } + if (first || xMax1 > xMax0) { + xMax0 = xMax1; + } + if (first || yMin1 < yMin0) { + yMin0 = yMin1; + } + if (first || yMax1 > yMax0) { + yMax0 = yMax1; + } + first = gFalse; + } + } + } + } + if (!first) { + *xMin = xMin0; + *xMax = xMax0; + *yMin = yMin0; + *yMax = yMax0; + return gTrue; + } + return gFalse; +} + +void TextPage::dump(void *outputStream, TextOutputFunc outputFunc, + GBool physLayout) { + UnicodeMap *uMap; + TextFlow *flow; + TextBlock *blk; + TextLine *line; + TextLineFrag *frags; + TextWord *word; + int nFrags, fragsSize; + TextLineFrag *frag; + char space[8], eol[16], eop[8]; + int spaceLen, eolLen, eopLen; + GBool pageBreaks; + GooString *s; + double delta; + int col, i, j, d, n; + + // get the output encoding + if (!(uMap = globalParams->getTextEncoding())) { + return; + } + spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); + eolLen = 0; // make gcc happy + switch (globalParams->getTextEOL()) { + case eolUnix: + eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); + break; + case eolDOS: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen); + break; + case eolMac: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + break; + } + eopLen = uMap->mapUnicode(0x0c, eop, sizeof(eop)); + pageBreaks = globalParams->getTextPageBreaks(); + + //~ writing mode (horiz/vert) + + // output the page in raw (content stream) order + if (rawOrder) { + + for (word = rawWords; word; word = word->next) { + s = new GooString(); + dumpFragment(word->text, word->len, uMap, s); + (*outputFunc)(outputStream, s->getCString(), s->getLength()); + delete s; + if (word->next && + fabs(word->next->base - word->base) < + maxIntraLineDelta * word->fontSize && + word->next->xMin > + word->xMax - minDupBreakOverlap * word->fontSize) { + if (word->next->xMin > word->xMax + minWordSpacing * word->fontSize) { + (*outputFunc)(outputStream, space, spaceLen); + } + } else { + (*outputFunc)(outputStream, eol, eolLen); + } + } + + // output the page, maintaining the original physical layout + } else if (physLayout) { + + // collect the line fragments for the page and sort them + fragsSize = 256; + frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); + nFrags = 0; + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + for (line = blk->lines; line; line = line->next) { + if (nFrags == fragsSize) { + fragsSize *= 2; + frags = (TextLineFrag *)greallocn(frags, + fragsSize, sizeof(TextLineFrag)); + } + frags[nFrags].init(line, 0, line->len); + frags[nFrags].computeCoords(gTrue); + ++nFrags; + } + } + qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpYXPrimaryRot); + i = 0; + while (i < nFrags) { + delta = maxIntraLineDelta * frags[i].line->words->fontSize; + for (j = i+1; + j < nFrags && fabs(frags[j].base - frags[i].base) < delta; + ++j) ; + qsort(frags + i, j - i, sizeof(TextLineFrag), + &TextLineFrag::cmpXYColumnPrimaryRot); + i = j; + } + +#if 0 // for debugging + printf("*** line fragments ***\n"); + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + printf("frag: x=%.2f..%.2f y=%.2f..%.2f base=%.2f '", + frag->xMin, frag->xMax, frag->yMin, frag->yMax, frag->base); + for (n = 0; n < frag->len; ++n) { + fputc(frag->line->text[frag->start + n] & 0xff, stdout); + } + printf("'\n"); + } + printf("\n"); +#endif + + // generate output + col = 0; + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + + // column alignment + for (; col < frag->col; ++col) { + (*outputFunc)(outputStream, space, spaceLen); + } + + // print the line + s = new GooString(); + col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s); + (*outputFunc)(outputStream, s->getCString(), s->getLength()); + delete s; + + // print one or more returns if necessary + if (i == nFrags - 1 || + frags[i+1].col < col || + fabs(frags[i+1].base - frag->base) > + maxIntraLineDelta * frag->line->words->fontSize) { + if (i < nFrags - 1) { + d = (int)((frags[i+1].base - frag->base) / + frag->line->words->fontSize); + if (d < 1) { + d = 1; + } else if (d > 5) { + d = 5; + } + } else { + d = 1; + } + for (; d > 0; --d) { + (*outputFunc)(outputStream, eol, eolLen); + } + col = 0; + } + } + + gfree(frags); + + // output the page, "undoing" the layout + } else { + for (flow = flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + n = line->len; + if (line->hyphenated && (line->next || blk->next)) { + --n; + } + s = new GooString(); + dumpFragment(line->text, n, uMap, s); + (*outputFunc)(outputStream, s->getCString(), s->getLength()); + delete s; + // output a newline when a hyphen is not suppressed + if (n == line->len) { + (*outputFunc)(outputStream, eol, eolLen); + } + } + } + (*outputFunc)(outputStream, eol, eolLen); + } + } + + // end of page + if (pageBreaks) { + (*outputFunc)(outputStream, eop, eopLen); + } + + uMap->decRefCnt(); +} + +void TextPage::assignColumns(TextLineFrag *frags, int nFrags, GBool oneRot) { + TextLineFrag *frag0, *frag1; + int rot, col1, col2, i, j, k; + + // all text in the region has the same rotation -- recompute the + // column numbers based only on the text in the region + if (oneRot) { + qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpXYLineRot); + rot = frags[0].line->rot; + for (i = 0; i < nFrags; ++i) { + frag0 = &frags[i]; + col1 = 0; + for (j = 0; j < i; ++j) { + frag1 = &frags[j]; + col2 = 0; // make gcc happy + switch (rot) { + case 0: + if (frag0->xMin >= frag1->xMax) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->xMin >= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + case 1: + if (frag0->yMin >= frag1->yMax) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->yMin >= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + case 2: + if (frag0->xMax <= frag1->xMin) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->xMax <= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + case 3: + if (frag0->yMax <= frag1->yMin) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->yMax <= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + } + if (col2 > col1) { + col1 = col2; + } + } + frag0->col = col1; + } + + // the region includes text at different rotations -- use the + // globally assigned column numbers, offset by the minimum column + // number (i.e., shift everything over to column 0) + } else { + col1 = frags[0].col; + for (i = 1; i < nFrags; ++i) { + if (frags[i].col < col1) { + col1 = frags[i].col; + } + } + for (i = 0; i < nFrags; ++i) { + frags[i].col -= col1; + } + } +} + +int TextPage::dumpFragment(Unicode *text, int len, UnicodeMap *uMap, + GooString *s) { + char lre[8], rle[8], popdf[8], buf[8]; + int lreLen, rleLen, popdfLen, n; + int nCols, i, j, k; + + nCols = 0; + + if (uMap->isUnicode()) { + + lreLen = uMap->mapUnicode(0x202a, lre, sizeof(lre)); + rleLen = uMap->mapUnicode(0x202b, rle, sizeof(rle)); + popdfLen = uMap->mapUnicode(0x202c, popdf, sizeof(popdf)); + + if (primaryLR) { + + i = 0; + while (i < len) { + // output a left-to-right section + for (j = i; j < len && !unicodeTypeR(text[j]); ++j) ; + for (k = i; k < j; ++k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + i = j; + // output a right-to-left section + for (j = i; + j < len && !(unicodeTypeL(text[j]) || unicodeTypeNum(text[j])); + ++j) ; + if (j > i) { + s->append(rle, rleLen); + for (k = j - 1; k >= i; --k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + s->append(popdf, popdfLen); + i = j; + } + } + + } else { + + // Note: This code treats numeric characters (European and + // Arabic/Indic) as left-to-right, which isn't strictly correct + // (incurs extra LRE/POPDF pairs), but does produce correct + // visual formatting. + s->append(rle, rleLen); + i = len - 1; + while (i >= 0) { + // output a right-to-left section + for (j = i; + j >= 0 && !(unicodeTypeL(text[j]) || unicodeTypeNum(text[j])); + --j) ; + for (k = i; k > j; --k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + i = j; + // output a left-to-right section + for (j = i; j >= 0 && !unicodeTypeR(text[j]); --j) ; + if (j < i) { + s->append(lre, lreLen); + for (k = j + 1; k <= i; ++k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + s->append(popdf, popdfLen); + i = j; + } + } + s->append(popdf, popdfLen); + + } + + } else { + for (i = 0; i < len; ++i) { + n = uMap->mapUnicode(text[i], buf, sizeof(buf)); + s->append(buf, n); + nCols += n; + } + } + + return nCols; +} + +#if TEXTOUT_WORD_LIST +TextWordList *TextPage::makeWordList(GBool physLayout) { + return new TextWordList(this, physLayout); +} +#endif + +//------------------------------------------------------------------------ +// ActualText +//------------------------------------------------------------------------ +ActualText::ActualText(TextPage *out) { + out->incRefCnt(); + text = out; + actualText = NULL; + actualTextNBytes = 0; +} + +ActualText::~ActualText() { + if (actualText) + delete actualText; + text->decRefCnt(); +} + +void ActualText::addChar(GfxState *state, double x, double y, + double dx, double dy, + CharCode c, int nBytes, Unicode *u, int uLen) { + if (!actualText) { + text->addChar(state, x, y, dx, dy, c, nBytes, u, uLen); + return; + } + + // Inside ActualText span. + if (!actualTextNBytes) { + actualTextX0 = x; + actualTextY0 = y; + } + actualTextX1 = x + dx; + actualTextY1 = y + dy; + actualTextNBytes += nBytes; +} + +void ActualText::begin(GfxState *state, GooString *text) { + if (actualText) + delete actualText; + actualText = new GooString(text); + actualTextNBytes = 0; +} + +void ActualText::end(GfxState *state) { + // ActualText span closed. Output the span text and the + // extents of all the glyphs inside the span + + if (actualTextNBytes) { + char *uniString = NULL; + Unicode *uni; + int length, i; + + if (!actualText->hasUnicodeMarker()) { + if (actualText->getLength() > 0) { + //non-unicode string -- assume pdfDocEncoding and + //try to convert to UTF16BE + uniString = pdfDocEncodingToUTF16(actualText, &length); + } else { + length = 0; + } + } else { + uniString = actualText->getCString(); + length = actualText->getLength(); + } + + if (length < 3) + length = 0; + else + length = length/2 - 1; + uni = new Unicode[length]; + for (i = 0 ; i < length; i++) + uni[i] = ((uniString[2 + i*2] & 0xff)<<8)|(uniString[3 + i*2] & 0xff); + + // now that we have the position info for all of the text inside + // the marked content span, we feed the "ActualText" back through + // text->addChar() + text->addChar(state, actualTextX0, actualTextY0, + actualTextX1 - actualTextX0, actualTextY1 - actualTextY0, + 0, actualTextNBytes, uni, length); + + delete [] uni; + if (!actualText->hasUnicodeMarker()) + delete [] uniString; + } + + delete actualText; + actualText = NULL; + actualTextNBytes = 0; +} + +//------------------------------------------------------------------------ +// TextOutputDev +//------------------------------------------------------------------------ + +static void TextOutputDev_outputToFile(void *stream, const char *text, int len) { + fwrite(text, 1, len, (FILE *)stream); +} + +TextOutputDev::TextOutputDev(char *fileName, GBool physLayoutA, + double fixedPitchA, GBool rawOrderA, + GBool append) { + text = NULL; + physLayout = physLayoutA; + fixedPitch = physLayout ? fixedPitchA : 0; + rawOrder = rawOrderA; + doHTML = gFalse; + ok = gTrue; + + // open file + needClose = gFalse; + if (fileName) { + if (!strcmp(fileName, "-")) { + outputStream = stdout; +#ifdef _WIN32 + // keep DOS from munging the end-of-line characters + setmode(fileno(stdout), O_BINARY); +#endif + } else if ((outputStream = fopen(fileName, append ? "ab" : "wb"))) { + needClose = gTrue; + } else { + error(errIO, -1, "Couldn't open text file '{0:s}'", fileName); + ok = gFalse; + actualText = NULL; + return; + } + outputFunc = &TextOutputDev_outputToFile; + } else { + outputStream = NULL; + } + + // set up text object + text = new TextPage(rawOrderA); + actualText = new ActualText(text); +} + +TextOutputDev::TextOutputDev(TextOutputFunc func, void *stream, + GBool physLayoutA, double fixedPitchA, + GBool rawOrderA) { + outputFunc = func; + outputStream = stream; + needClose = gFalse; + physLayout = physLayoutA; + fixedPitch = physLayout ? fixedPitchA : 0; + rawOrder = rawOrderA; + doHTML = gFalse; + text = new TextPage(rawOrderA); + actualText = new ActualText(text); + ok = gTrue; +} + +TextOutputDev::~TextOutputDev() { + if (needClose) { +#ifdef MACOS + ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle); +#endif + fclose((FILE *)outputStream); + } + if (text) { + text->decRefCnt(); + } + delete actualText; +} + +void TextOutputDev::startPage(int pageNum, GfxState *state) { + text->startPage(state); +} + +void TextOutputDev::endPage() { + text->endPage(); + text->coalesce(physLayout, fixedPitch, doHTML); + if (outputStream) { + text->dump(outputStream, outputFunc, physLayout); + } +} + +void TextOutputDev::restoreState(GfxState *state) { + text->updateFont(state); +} + +void TextOutputDev::updateFont(GfxState *state) { + text->updateFont(state); +} + +void TextOutputDev::beginString(GfxState *state, GooString *s) { +} + +void TextOutputDev::endString(GfxState *state) { +} + +void TextOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode c, int nBytes, Unicode *u, int uLen) { + actualText->addChar(state, x, y, dx, dy, c, nBytes, u, uLen); +} + +void TextOutputDev::incCharCount(int nChars) { + text->incCharCount(nChars); +} + +void TextOutputDev::beginActualText(GfxState *state, GooString *text) +{ + actualText->begin(state, text); +} + +void TextOutputDev::endActualText(GfxState *state) +{ + actualText->end(state); +} + +void TextOutputDev::stroke(GfxState *state) { + GfxPath *path; + GfxSubpath *subpath; + double x[2], y[2]; + + if (!doHTML) { + return; + } + path = state->getPath(); + if (path->getNumSubpaths() != 1) { + return; + } + subpath = path->getSubpath(0); + if (subpath->getNumPoints() != 2) { + return; + } + state->transform(subpath->getX(0), subpath->getY(0), &x[0], &y[0]); + state->transform(subpath->getX(1), subpath->getY(1), &x[1], &y[1]); + + // look for a vertical or horizontal line + if (x[0] == x[1] || y[0] == y[1]) { + text->addUnderline(x[0], y[0], x[1], y[1]); + } +} + +void TextOutputDev::fill(GfxState *state) { + GfxPath *path; + GfxSubpath *subpath; + double x[5], y[5]; + double rx0, ry0, rx1, ry1, t; + int i; + + if (!doHTML) { + return; + } + path = state->getPath(); + if (path->getNumSubpaths() != 1) { + return; + } + subpath = path->getSubpath(0); + if (subpath->getNumPoints() != 5) { + return; + } + for (i = 0; i < 5; ++i) { + if (subpath->getCurve(i)) { + return; + } + state->transform(subpath->getX(i), subpath->getY(i), &x[i], &y[i]); + } + + // look for a rectangle + if (x[0] == x[1] && y[1] == y[2] && x[2] == x[3] && y[3] == y[4] && + x[0] == x[4] && y[0] == y[4]) { + rx0 = x[0]; + ry0 = y[0]; + rx1 = x[2]; + ry1 = y[1]; + } else if (y[0] == y[1] && x[1] == x[2] && y[2] == y[3] && x[3] == x[4] && + x[0] == x[4] && y[0] == y[4]) { + rx0 = x[0]; + ry0 = y[0]; + rx1 = x[1]; + ry1 = y[2]; + } else { + return; + } + if (rx1 < rx0) { + t = rx0; + rx0 = rx1; + rx1 = t; + } + if (ry1 < ry0) { + t = ry0; + ry0 = ry1; + ry1 = t; + } + + // skinny horizontal rectangle + if (ry1 - ry0 < rx1 - rx0) { + if (ry1 - ry0 < maxUnderlineWidth) { + ry0 = 0.5 * (ry0 + ry1); + text->addUnderline(rx0, ry0, rx1, ry0); + } + + // skinny vertical rectangle + } else { + if (rx1 - rx0 < maxUnderlineWidth) { + rx0 = 0.5 * (rx0 + rx1); + text->addUnderline(rx0, ry0, rx0, ry1); + } + } +} + +void TextOutputDev::eoFill(GfxState *state) { + if (!doHTML) { + return; + } + fill(state); +} + +void TextOutputDev::processLink(AnnotLink *link) { + double x1, y1, x2, y2; + int xMin, yMin, xMax, yMax, x, y; + + if (!doHTML) { + return; + } + link->getRect(&x1, &y1, &x2, &y2); + cvtUserToDev(x1, y1, &x, &y); + xMin = xMax = x; + yMin = yMax = y; + cvtUserToDev(x1, y2, &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + cvtUserToDev(x2, y1, &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + cvtUserToDev(x2, y2, &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + text->addLink(xMin, yMin, xMax, yMax, link); +} + +GBool TextOutputDev::findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + GBool wholeWord, + double *xMin, double *yMin, + double *xMax, double *yMax) { + return text->findText(s, len, startAtTop, stopAtBottom, + startAtLast, stopAtLast, + caseSensitive, backward, wholeWord, + xMin, yMin, xMax, yMax); +} + +GooString *TextOutputDev::getText(double xMin, double yMin, + double xMax, double yMax) { + return text->getText(xMin, yMin, xMax, yMax); +} + +void TextOutputDev::drawSelection(OutputDev *out, + double scale, + int rotation, + PDFRectangle *selection, + SelectionStyle style, + GfxColor *glyph_color, GfxColor *box_color) { + text->drawSelection(out, scale, rotation, selection, style, glyph_color, box_color); +} + +GooList *TextOutputDev::getSelectionRegion(PDFRectangle *selection, + SelectionStyle style, + double scale) { + return text->getSelectionRegion(selection, style, scale); +} + +GooString *TextOutputDev::getSelectionText(PDFRectangle *selection, + SelectionStyle style) +{ + return text->getSelectionText(selection, style); +} + +GBool TextOutputDev::findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax) { + return text->findCharRange(pos, length, xMin, yMin, xMax, yMax); +} + +#if TEXTOUT_WORD_LIST +TextWordList *TextOutputDev::makeWordList() { + return text->makeWordList(physLayout); +} +#endif + +TextPage *TextOutputDev::takeText() { + TextPage *ret; + + ret = text; + text = new TextPage(rawOrder); + return ret; +} diff --git a/poppler/TextOutputDev.h b/poppler/TextOutputDev.h new file mode 100644 index 0000000..e31876b --- /dev/null +++ b/poppler/TextOutputDev.h @@ -0,0 +1,824 @@ +//======================================================================== +// +// TextOutputDev.h +// +// Copyright 1997-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2007 Kristian Høgsberg +// Copyright (C) 2006 Ed Catmur +// Copyright (C) 2007, 2008, 2011 Carlos Garcia Campos +// Copyright (C) 2007 Adrian Johnson +// Copyright (C) 2008, 2010 Albert Astals Cid +// Copyright (C) 2010 Brian Ewins +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef TEXTOUTPUTDEV_H +#define TEXTOUTPUTDEV_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include +#include "goo/gtypes.h" +#include "GfxFont.h" +#include "GfxState.h" +#include "OutputDev.h" + +class GooString; +class GooList; +class Gfx; +class GfxFont; +class GfxState; +class UnicodeMap; +class AnnotLink; + +class TextWord; +class TextPool; +class TextLine; +class TextLineFrag; +class TextBlock; +class TextFlow; +class TextWordList; +class TextPage; +class TextSelectionVisitor; + +//------------------------------------------------------------------------ + +typedef void (*TextOutputFunc)(void *stream, const char *text, int len); + +enum SelectionStyle { + selectionStyleGlyph, + selectionStyleWord, + selectionStyleLine +}; + +//------------------------------------------------------------------------ +// TextFontInfo +//------------------------------------------------------------------------ + +class TextFontInfo { +public: + + TextFontInfo(GfxState *state); + ~TextFontInfo(); + + GBool matches(GfxState *state); + GBool matches(TextFontInfo *fontInfo); + +#if TEXTOUT_WORD_LIST + // Get the font name (which may be NULL). + GooString *getFontName() { return fontName; } + + // Get font descriptor flags. + GBool isFixedWidth() { return flags & fontFixedWidth; } + GBool isSerif() { return flags & fontSerif; } + GBool isSymbolic() { return flags & fontSymbolic; } + GBool isItalic() { return flags & fontItalic; } + GBool isBold() { return flags & fontBold; } +#endif + +private: + + GfxFont *gfxFont; +#if TEXTOUT_WORD_LIST + GooString *fontName; + int flags; +#endif + + friend class TextWord; + friend class TextPage; + friend class TextSelectionPainter; +}; + +//------------------------------------------------------------------------ +// TextWord +//------------------------------------------------------------------------ + +class TextWord { +public: + + // Constructor. + TextWord(GfxState *state, int rotA, double x0, double y0, + TextFontInfo *fontA, double fontSize); + + // Destructor. + ~TextWord(); + + // Add a character to the word. + void addChar(GfxState *state, double x, double y, + double dx, double dy, int charPosA, int charLen, + CharCode c, Unicode u); + + // Merge onto the end of . + void merge(TextWord *word); + + // Compares to , returning -1 (<), 0 (=), or +1 (>), + // based on a primary-axis comparison, e.g., x ordering if rot=0. + int primaryCmp(TextWord *word); + + // Return the distance along the primary axis between and + // . + double primaryDelta(TextWord *word); + + static int cmpYX(const void *p1, const void *p2); + + void visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style); + + // Get the TextFontInfo object associated with this word. + TextFontInfo *getFontInfo() { return font; } + + // Get the next TextWord on the linked list. + TextWord *getNext() { return next; } + +#if TEXTOUT_WORD_LIST + int getLength() { return len; } + const Unicode *getChar(int idx) { return &text[idx]; } + GooString *getText(); + GooString *getFontName() { return font->fontName; } + void getColor(double *r, double *g, double *b) + { *r = colorR; *g = colorG; *b = colorB; } + void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + void getCharBBox(int charIdx, double *xMinA, double *yMinA, + double *xMaxA, double *yMaxA); + double getFontSize() { return fontSize; } + int getRotation() { return rot; } + int getCharPos() { return charPos[0]; } + int getCharLen() { return charPos[len] - charPos[0]; } + GBool getSpaceAfter() { return spaceAfter; } +#endif + GBool isUnderlined() { return underlined; } + AnnotLink *getLink() { return link; } + double getEdge(int i) { return edge[i]; } + double getBaseline () { return base; } + GBool hasSpaceAfter () { return spaceAfter; } + TextWord* nextWord () { return next; }; +private: + + int rot; // rotation, multiple of 90 degrees + // (0, 1, 2, or 3) + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double base; // baseline x or y coordinate + Unicode *text; // the text + CharCode *charcode; // glyph indices + double *edge; // "near" edge x or y coord of each char + // (plus one extra entry for the last char) + int *charPos; // character position (within content stream) + // of each char (plus one extra entry for + // the last char) + int len; // length of text/edge/charPos arrays + int size; // size of text/edge/charPos arrays + TextFontInfo *font; // font information + double fontSize; // font size + GBool spaceAfter; // set if there is a space between this + // word and the next word on the line + TextWord *next; // next word in line + +#if TEXTOUT_WORD_LIST + double colorR, // word color + colorG, + colorB; +#endif + + GBool underlined; + AnnotLink *link; + + friend class TextPool; + friend class TextLine; + friend class TextBlock; + friend class TextFlow; + friend class TextWordList; + friend class TextPage; + + friend class TextSelectionPainter; + friend class TextSelectionDumper; +}; + +//------------------------------------------------------------------------ +// TextPool +//------------------------------------------------------------------------ + +class TextPool { +public: + + TextPool(); + ~TextPool(); + + TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; } + void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; } + + int getBaseIdx(double base); + + void addWord(TextWord *word); + +private: + + int minBaseIdx; // min baseline bucket index + int maxBaseIdx; // max baseline bucket index + TextWord **pool; // array of linked lists, one for each + // baseline value (multiple of 4 pts) + TextWord *cursor; // pointer to last-accessed word + int cursorBaseIdx; // baseline bucket index of last-accessed word + + friend class TextBlock; + friend class TextPage; +}; + +struct TextFlowData; + +//------------------------------------------------------------------------ +// TextLine +//------------------------------------------------------------------------ + +class TextLine { +public: + + TextLine(TextBlock *blkA, int rotA, double baseA); + ~TextLine(); + + void addWord(TextWord *word); + + // Return the distance along the primary axis between and + // . + double primaryDelta(TextLine *line); + + // Compares to , returning -1 (<), 0 (=), or +1 (>), + // based on a primary-axis comparison, e.g., x ordering if rot=0. + int primaryCmp(TextLine *line); + + // Compares to , returning -1 (<), 0 (=), or +1 (>), + // based on a secondary-axis comparison of the baselines, e.g., y + // ordering if rot=0. + int secondaryCmp(TextLine *line); + + int cmpYX(TextLine *line); + + static int cmpXY(const void *p1, const void *p2); + + void coalesce(UnicodeMap *uMap); + + void visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style); + + // Get the head of the linked list of TextWords. + TextWord *getWords() { return words; } + + // Get the next TextLine on the linked list. + TextLine *getNext() { return next; } + + // Returns true if the last char of the line is a hyphen. + GBool isHyphenated() { return hyphenated; } + +private: + + TextBlock *blk; // parent block + int rot; // text rotation + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double base; // baseline x or y coordinate + TextWord *words; // words in this line + TextWord *lastWord; // last word in this line + Unicode *text; // Unicode text of the line, including + // spaces between words + double *edge; // "near" edge x or y coord of each char + // (plus one extra entry for the last char) + int *col; // starting column number of each Unicode char + int len; // number of Unicode chars + int convertedLen; // total number of converted characters + GBool hyphenated; // set if last char is a hyphen + TextLine *next; // next line in block + Unicode *normalized; // normalized form of Unicode text + int normalized_len; // number of normalized Unicode chars + int *normalized_idx; // indices of normalized chars into Unicode text + + friend class TextLineFrag; + friend class TextBlock; + friend class TextFlow; + friend class TextWordList; + friend class TextPage; + + friend class TextSelectionPainter; + friend class TextSelectionSizer; + friend class TextSelectionDumper; +}; + +//------------------------------------------------------------------------ +// TextBlock +//------------------------------------------------------------------------ + +class TextBlock { +public: + + TextBlock(TextPage *pageA, int rotA); + ~TextBlock(); + + void addWord(TextWord *word); + + void coalesce(UnicodeMap *uMap, double fixedPitch); + + // Update this block's priMin and priMax values, looking at . + void updatePriMinMax(TextBlock *blk); + + static int cmpXYPrimaryRot(const void *p1, const void *p2); + + static int cmpYXPrimaryRot(const void *p1, const void *p2); + + int primaryCmp(TextBlock *blk); + + double secondaryDelta(TextBlock *blk); + + // Returns true if is below , relative to the page's + // primary rotation. + GBool isBelow(TextBlock *blk); + + void visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style); + + // Get the head of the linked list of TextLines. + TextLine *getLines() { return lines; } + + // Get the next TextBlock on the linked list. + TextBlock *getNext() { return next; } + + void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + + int getLineCount() { return nLines; } + +private: + + GBool isBeforeByRule1(TextBlock *blk1); + GBool isBeforeByRepeatedRule1(TextBlock *blkList, TextBlock *blk1); + GBool isBeforeByRule2(TextBlock *blk1); + + int visitDepthFirst(TextBlock *blkList, int pos1, + TextBlock **sorted, int sortPos, + GBool* visited); + + TextPage *page; // the parent page + int rot; // text rotation + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double priMin, priMax; // whitespace bounding box along primary axis + double ExMin, ExMax; // extended bounding box x coordinates + double EyMin, EyMax; // extended bounding box y coordinates + int tableId; // id of table to which this block belongs + GBool tableEnd; // is this block at end of line of actual table + + TextPool *pool; // pool of words (used only until lines + // are built) + TextLine *lines; // linked list of lines + TextLine *curLine; // most recently added line + int nLines; // number of lines + int charCount; // number of characters in the block + int col; // starting column + int nColumns; // number of columns in the block + + TextBlock *next; + TextBlock *stackNext; + + friend class TextLine; + friend class TextLineFrag; + friend class TextFlow; + friend class TextWordList; + friend class TextPage; + friend class TextSelectionPainter; + friend class TextSelectionDumper; +}; + +//------------------------------------------------------------------------ +// TextFlow +//------------------------------------------------------------------------ + +class TextFlow { +public: + + TextFlow(TextPage *pageA, TextBlock *blk); + ~TextFlow(); + + // Add a block to the end of this flow. + void addBlock(TextBlock *blk); + + // Returns true if fits below in the flow, i.e., (1) + // it uses a font no larger than the last block added to the flow, + // and (2) it fits within the flow's [priMin, priMax] along the + // primary axis. + GBool blockFits(TextBlock *blk, TextBlock *prevBlk); + + // Get the head of the linked list of TextBlocks. + TextBlock *getBlocks() { return blocks; } + + // Get the next TextFlow on the linked list. + TextFlow *getNext() { return next; } + +private: + + TextPage *page; // the parent page + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double priMin, priMax; // whitespace bounding box along primary axis + TextBlock *blocks; // blocks in flow + TextBlock *lastBlk; // last block in this flow + TextFlow *next; + + friend class TextWordList; + friend class TextPage; +}; + +#if TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextWordList +//------------------------------------------------------------------------ + +class TextWordList { +public: + + // Build a flat word list, in content stream order (if + // text->rawOrder is true), physical layout order (if + // is true and text->rawOrder is false), or reading order (if both + // flags are false). + TextWordList(TextPage *text, GBool physLayout); + + ~TextWordList(); + + // Return the number of words on the list. + int getLength(); + + // Return the th word from the list. + TextWord *get(int idx); + +private: + + GooList *words; // [TextWord] +}; + +#endif // TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextPage +//------------------------------------------------------------------------ + +class TextPage { +public: + + // Constructor. + TextPage(GBool rawOrderA); + + void incRefCnt(); + void decRefCnt(); + + // Start a new page. + void startPage(GfxState *state); + + // End the current page. + void endPage(); + + // Update the current font. + void updateFont(GfxState *state); + + // Begin a new word. + void beginWord(GfxState *state, double x0, double y0); + + // Add a character to the current word. + void addChar(GfxState *state, double x, double y, + double dx, double dy, + CharCode c, int nBytes, Unicode *u, int uLen); + + // Add invisible characters. + void incCharCount(int nChars); + + // End the current word, sorting it into the list of words. + void endWord(); + + // Add a word, sorting it into the list of words. + void addWord(TextWord *word); + + // Add a (potential) underline. + void addUnderline(double x0, double y0, double x1, double y1); + + // Add a hyperlink. + void addLink(int xMin, int yMin, int xMax, int yMax, AnnotLink *link); + + // Coalesce strings that look like parts of the same line. + void coalesce(GBool physLayout, double fixedPitch, GBool doHTML); + + // Find a string. If is true, starts looking at the + // top of the page; else if is true, starts looking + // immediately after the last find result; else starts looking at + // ,. If is true, stops looking at the + // bottom of the page; else if is true, stops looking + // just before the last find result; else stops looking at + // ,. + GBool findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + GBool wholeWord, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Get the text which is inside the specified rectangle. + GooString *getText(double xMin, double yMin, + double xMax, double yMax); + + void visitSelection(TextSelectionVisitor *visitor, + PDFRectangle *selection, + SelectionStyle style); + + void drawSelection(OutputDev *out, + double scale, + int rotation, + PDFRectangle *selection, + SelectionStyle style, + GfxColor *glyph_color, GfxColor *box_color); + + GooList *getSelectionRegion(PDFRectangle *selection, + SelectionStyle style, + double scale); + + GooString *getSelectionText(PDFRectangle *selection, + SelectionStyle style); + + // Find a string by character position and length. If found, sets + // the text bounding rectangle and returns true; otherwise returns + // false. + GBool findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Dump contents of page to a file. + void dump(void *outputStream, TextOutputFunc outputFunc, + GBool physLayout); + + // Get the head of the linked list of TextFlows. + TextFlow *getFlows() { return flows; } + +#if TEXTOUT_WORD_LIST + // Build a flat word list, in content stream order (if + // this->rawOrder is true), physical layout order (if + // is true and this->rawOrder is false), or reading order (if both + // flags are false). + TextWordList *makeWordList(GBool physLayout); +#endif + +private: + + // Destructor. + ~TextPage(); + + void clear(); + void assignColumns(TextLineFrag *frags, int nFrags, GBool rot); + int dumpFragment(Unicode *text, int len, UnicodeMap *uMap, GooString *s); + + GBool rawOrder; // keep text in content stream order + + double pageWidth, pageHeight; // width and height of current page + TextWord *curWord; // currently active string + int charPos; // next character position (within content + // stream) + TextFontInfo *curFont; // current font + double curFontSize; // current font size + int nest; // current nesting level (for Type 3 fonts) + int nTinyChars; // number of "tiny" chars seen so far + GBool lastCharOverlap; // set if the last added char overlapped the + // previous char + + TextPool *pools[4]; // a "pool" of TextWords for each rotation + TextFlow *flows; // linked list of flows + TextBlock **blocks; // array of blocks, in yx order + int nBlocks; // number of blocks + int primaryRot; // primary rotation + GBool primaryLR; // primary direction (true means L-to-R, + // false means R-to-L) + TextWord *rawWords; // list of words, in raw order (only if + // rawOrder is set) + TextWord *rawLastWord; // last word on rawWords list + + GooList *fonts; // all font info objects used on this + // page [TextFontInfo] + + double lastFindXMin, // coordinates of the last "find" result + lastFindYMin; + GBool haveLastFind; + + GooList *underlines; // [TextUnderline] + GooList *links; // [TextLink] + + int refCnt; + + friend class TextLine; + friend class TextLineFrag; + friend class TextBlock; + friend class TextFlow; + friend class TextWordList; + friend class TextSelectionPainter; + friend class TextSelectionDumper; +}; + +//------------------------------------------------------------------------ +// ActualText +//------------------------------------------------------------------------ + +class ActualText { +public: + // Create an ActualText + ActualText(TextPage *out); + ~ActualText(); + + void addChar(GfxState *state, double x, double y, + double dx, double dy, + CharCode c, int nBytes, Unicode *u, int uLen); + void begin(GfxState *state, GooString *text); + void end(GfxState *state); + +private: + TextPage *text; + + GooString *actualText; // replacement text for the span + double actualTextX0; + double actualTextY0; + double actualTextX1; + double actualTextY1; + int actualTextNBytes; +}; + + +//------------------------------------------------------------------------ +// TextOutputDev +//------------------------------------------------------------------------ + +class TextOutputDev: public OutputDev { +public: + + // Open a text output file. If is NULL, no file is + // written (this is useful, e.g., for searching text). If + // is true, the original physical layout of the text + // is maintained. If is true, the text is kept in + // content stream order. + TextOutputDev(char *fileName, GBool physLayoutA, + double fixedPitchA, GBool rawOrderA, + GBool append); + + // Create a TextOutputDev which will write to a generic stream. If + // is true, the original physical layout of the text + // is maintained. If is true, the text is kept in + // content stream order. + TextOutputDev(TextOutputFunc func, void *stream, + GBool physLayoutA, double fixedPitchA, + GBool rawOrderA); + + // Destructor. + virtual ~TextOutputDev(); + + // Check if file was successfully created. + virtual GBool isOk() { return ok; } + + //---- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + // Does this device need non-text content? + virtual GBool needNonText() { return gFalse; } + + // Does this device require incCharCount to be called for text on + // non-shown layers? + virtual GBool needCharCount() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- save/restore graphics state + virtual void restoreState(GfxState *state); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- text drawing + virtual void beginString(GfxState *state, GooString *s); + virtual void endString(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode c, int nBytes, Unicode *u, int uLen); + virtual void incCharCount(int nChars); + virtual void beginActualText(GfxState *state, GooString *text); + virtual void endActualText(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + + //----- link borders + virtual void processLink(AnnotLink *link); + + //----- special access + + // Find a string. If is true, starts looking at the + // top of the page; else if is true, starts looking + // immediately after the last find result; else starts looking at + // ,. If is true, stops looking at the + // bottom of the page; else if is true, stops looking + // just before the last find result; else stops looking at + // ,. + GBool findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + GBool wholeWord, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Get the text which is inside the specified rectangle. + GooString *getText(double xMin, double yMin, + double xMax, double yMax); + + // Find a string by character position and length. If found, sets + // the text bounding rectangle and returns true; otherwise returns + // false. + GBool findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax); + + void drawSelection(OutputDev *out, double scale, int rotation, + PDFRectangle *selection, + SelectionStyle style, + GfxColor *glyph_color, GfxColor *box_color); + + GooList *getSelectionRegion(PDFRectangle *selection, + SelectionStyle style, + double scale); + + GooString *getSelectionText(PDFRectangle *selection, + SelectionStyle style); + +#if TEXTOUT_WORD_LIST + // Build a flat word list, in content stream order (if + // this->rawOrder is true), physical layout order (if + // this->physLayout is true and this->rawOrder is false), or reading + // order (if both flags are false). + TextWordList *makeWordList(); +#endif + + // Returns the TextPage object for the last rasterized page, + // transferring ownership to the caller. + TextPage *takeText(); + + // Turn extra processing for HTML conversion on or off. + void enableHTMLExtras(GBool doHTMLA) { doHTML = doHTMLA; } + +private: + + TextOutputFunc outputFunc; // output function + void *outputStream; // output stream + GBool needClose; // need to close the output file? + // (only if outputStream is a FILE*) + TextPage *text; // text for the current page + GBool physLayout; // maintain original physical layout when + // dumping text + double fixedPitch; // if physLayout is true and this is non-zero, + // assume fixed-pitch characters with this + // width + GBool rawOrder; // keep text in content stream order + GBool doHTML; // extra processing for HTML conversion + GBool ok; // set up ok? + + ActualText *actualText; +}; + +#endif diff --git a/poppler/UTF8.h b/poppler/UTF8.h new file mode 100644 index 0000000..34a07d4 --- /dev/null +++ b/poppler/UTF8.h @@ -0,0 +1,84 @@ +//======================================================================== +// +// UTF8.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Koji Otani +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +static int mapUTF8(Unicode u, char *buf, int bufSize) { + if (u <= 0x0000007f) { + if (bufSize < 1) { + return 0; + } + buf[0] = (char)u; + return 1; + } else if (u <= 0x000007ff) { + if (bufSize < 2) { + return 0; + } + buf[0] = (char)(0xc0 + (u >> 6)); + buf[1] = (char)(0x80 + (u & 0x3f)); + return 2; + } else if (u <= 0x0000ffff) { + if (bufSize < 3) { + return 0; + } + buf[0] = (char)(0xe0 + (u >> 12)); + buf[1] = (char)(0x80 + ((u >> 6) & 0x3f)); + buf[2] = (char)(0x80 + (u & 0x3f)); + return 3; + } else if (u <= 0x0010ffff) { + if (bufSize < 4) { + return 0; + } + buf[0] = (char)(0xf0 + (u >> 18)); + buf[1] = (char)(0x80 + ((u >> 12) & 0x3f)); + buf[2] = (char)(0x80 + ((u >> 6) & 0x3f)); + buf[3] = (char)(0x80 + (u & 0x3f)); + return 4; + } else { + return 0; + } +} + +static int mapUCS2(Unicode u, char *buf, int bufSize) { + if (u <= 0xffff) { + if (bufSize < 2) { + return 0; + } + buf[0] = (char)((u >> 8) & 0xff); + buf[1] = (char)(u & 0xff); + return 2; + } else if (u < 0x110000) { + Unicode uu; + + /* using surrogate pair */ + if (bufSize < 4) { + return 0; + } + uu = ((u - 0x10000) >> 10) + 0xd800; + buf[0] = (char)((uu >> 8) & 0xff); + buf[1] = (char)(uu & 0xff); + uu = (u & 0x3ff)+0xdc00; + buf[2] = (char)((uu >> 8) & 0xff); + buf[3] = (char)(uu & 0xff); + return 4; + } else { + return 0; + } +} diff --git a/poppler/UnicodeCClassTables.h b/poppler/UnicodeCClassTables.h new file mode 100644 index 0000000..62f9ecc --- /dev/null +++ b/poppler/UnicodeCClassTables.h @@ -0,0 +1,1827 @@ +// Copied from gunidecomp.h in GLib: +// s/[G]_UNICODE_MAX_TABLE_INDEX/UNICODE_MAX_TABLE_INDEX/g +// s/[g]uchar/Unicode/g +// s/[g]int16/short/g +// Can be regenerated from gen-unicode-tables.pl, also in GLib, with relevant +// Unicode data tables from ftp.unicode.org. + +static const Unicode cclass_data[][256] = { + { /* page 3, index 0 */ + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, + 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, + 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, + 220, 220, 230, 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, + 230, 0, 0, 0, 0, 0, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 4, index 1 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 5, index 2 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, + 230, 230, 230, 0, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, + 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 0, 23, + 0, 24, 25, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 6, index 3 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, + 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, + 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, + 230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 7, index 4 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, + 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 9, index 5 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 10, index 6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 11, index 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 12, index 8 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 13, index 9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 14, index 10 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 15, index 11 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, + 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + }, + { /* page 16, index 12 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 23, index 13 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 24, index 14 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 25, index 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 32, index 16 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, + 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, + 230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 48, index 17 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, + 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 251, index 18 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 254, index 19 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 465, index 20 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216, + 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0, + 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; + +static const short combining_class_table_part1[763] = { + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 /* page 3 */, + 1 /* page 4 */, + 2 /* page 5 */, + 3 /* page 6 */, + 4 /* page 7 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 5 /* page 9 */, + 6 /* page 10 */, + 7 /* page 11 */, + 8 /* page 12 */, + 9 /* page 13 */, + 10 /* page 14 */, + 11 /* page 15 */, + 12 /* page 16 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 13 /* page 23 */, + 14 /* page 24 */, + 15 /* page 25 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 16 /* page 32 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 17 /* page 48 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 18 /* page 251 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 19 /* page 254 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 20 /* page 465 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX +}; + +static const short combining_class_table_part2[768] = { + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX +}; diff --git a/poppler/UnicodeCompTables.h b/poppler/UnicodeCompTables.h new file mode 100644 index 0000000..68e2f86 --- /dev/null +++ b/poppler/UnicodeCompTables.h @@ -0,0 +1,665 @@ +// Copied from gunicomp.h in GLib: +// s/[G]_UNICODE_MAX_TABLE_INDEX/UNICODE_MAX_TABLE_INDEX/g +// s/[g]uint16/unsigned short/g +// s/[g]int16/short/g +// Can be regenerated from gen-unicode-tables.pl, also in GLib, with relevant +// Unicode data tables from ftp.unicode.org. + +#define COMPOSE_FIRST_START 1 +#define COMPOSE_FIRST_SINGLE_START 147 +#define COMPOSE_SECOND_START 357 +#define COMPOSE_SECOND_SINGLE_START 388 + +#define COMPOSE_TABLE_LAST 48 + +static const unsigned short compose_data[][256] = { + { /* page 0, index 0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, + 150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, + 50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, + 162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0 + }, + { /* page 1, index 1 */ + 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, + 0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 + }, + { /* page 2, index 2 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, + 181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 3, index 3 */ + 357, 358, 359, 360, 361, 0, 362, 363, 364, 365, 366, 367, 368, 0, 0, 369, + 0, 370, 0, 371, 372, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 374, + 375, 376, 377, 378, 379, 0, 0, 0, 0, 380, 381, 0, 382, 383, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, + 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, + 0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, + 0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 4, index 4 */ + 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, + 91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, + 194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, + 199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, + 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 6, index 5 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, + 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 9, index 6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, + 216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 11, index 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 395, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 396, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 12, index 8 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 398, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, + 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 13, index 9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 104, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 16, index 10 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 30, index 11 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, 0, 0, + 0, 0, 0, 0, 230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 31, index 12 */ + 108, 109, 236, 237, 238, 239, 240, 241, 110, 111, 242, 243, 244, 245, + 246, 247, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, + 117, 248, 249, 250, 251, 252, 253, 118, 119, 254, 255, 256, 257, 258, + 259, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, + 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, + 130, 0, 0, 0, 0, 0, 0, 131, 132, 260, 261, 262, 263, 264, 265, 133, 134, + 266, 267, 268, 269, 270, 271, 272, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 136, 0 + }, + { /* page 33, index 13 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 282, 0, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 34, index 14 */ + 0, 0, 0, 284, 0, 0, 0, 0, 285, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 290, + 0, 291, 0, 0, 292, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 295, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 297, 298, 0, 0, 299, 300, 0, 0, 301, 302, 303, 304, 0, 0, 0, 0, + 305, 306, 0, 0, 307, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, + 0, 0, 0, 0, 0, 0, 315, 316, 317, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 48, index 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, + 0, 0, 0, 320, 0, 321, 0, 322, 0, 323, 0, 324, 0, 325, 0, 326, 0, 327, 0, + 328, 0, 329, 0, 330, 0, 331, 0, 0, 332, 0, 333, 0, 334, 0, 0, 0, 0, 0, 0, + 137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 387, + 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 337, 0, 338, 0, 339, + 0, 340, 0, 341, 0, 342, 0, 343, 0, 344, 0, 345, 0, 346, 0, 347, 0, 348, + 0, 0, 349, 0, 350, 0, 351, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144, + 0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 352, 353, 354, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0 + } +}; + +static const short compose_table[COMPOSE_TABLE_LAST + 1] = { + 0 /* page 0 */, + 1 /* page 1 */, + 2 /* page 2 */, + 3 /* page 3 */, + 4 /* page 4 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 5 /* page 6 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 6 /* page 9 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 7 /* page 11 */, + 8 /* page 12 */, + 9 /* page 13 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 10 /* page 16 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 11 /* page 30 */, + 12 /* page 31 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 13 /* page 33 */, + 14 /* page 34 */, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 0 + UNICODE_MAX_TABLE_INDEX, + 15 /* page 48 */ +}; + +static const unsigned short compose_first_single[][2] = { + { 0x0338, 0x226e }, + { 0x0338, 0x2260 }, + { 0x0338, 0x226f }, + { 0x0307, 0x1e1e }, + { 0x0302, 0x0134 }, + { 0x0307, 0x1e1f }, + { 0x0304, 0x01de }, + { 0x0301, 0x01fa }, + { 0x0301, 0x1e08 }, + { 0x0301, 0x1e2e }, + { 0x0304, 0x022a }, + { 0x0301, 0x01fe }, + { 0x0304, 0x01df }, + { 0x0301, 0x01fb }, + { 0x0301, 0x1e09 }, + { 0x0301, 0x1e2f }, + { 0x0304, 0x022b }, + { 0x0301, 0x01ff }, + { 0x0307, 0x1e64 }, + { 0x0307, 0x1e65 }, + { 0x0307, 0x1e66 }, + { 0x0307, 0x1e67 }, + { 0x0301, 0x1e78 }, + { 0x0301, 0x1e79 }, + { 0x0308, 0x1e7a }, + { 0x0308, 0x1e7b }, + { 0x0307, 0x1e9b }, + { 0x030c, 0x01ee }, + { 0x0304, 0x01ec }, + { 0x0304, 0x01ed }, + { 0x0304, 0x01e0 }, + { 0x0304, 0x01e1 }, + { 0x0306, 0x1e1c }, + { 0x0306, 0x1e1d }, + { 0x0304, 0x0230 }, + { 0x0304, 0x0231 }, + { 0x030c, 0x01ef }, + { 0x0314, 0x1fec }, + { 0x0345, 0x1fb4 }, + { 0x0345, 0x1fc4 }, + { 0x0345, 0x1ff4 }, + { 0x0308, 0x0407 }, + { 0x0301, 0x0403 }, + { 0x0308, 0x04de }, + { 0x0301, 0x040c }, + { 0x0308, 0x04e6 }, + { 0x0308, 0x04f4 }, + { 0x0308, 0x04f8 }, + { 0x0308, 0x04ec }, + { 0x0301, 0x0453 }, + { 0x0308, 0x04df }, + { 0x0301, 0x045c }, + { 0x0308, 0x04e7 }, + { 0x0308, 0x04f5 }, + { 0x0308, 0x04f9 }, + { 0x0308, 0x04ed }, + { 0x0308, 0x0457 }, + { 0x030f, 0x0476 }, + { 0x030f, 0x0477 }, + { 0x0308, 0x04da }, + { 0x0308, 0x04db }, + { 0x0308, 0x04ea }, + { 0x0308, 0x04eb }, + { 0x0654, 0x0624 }, + { 0x0654, 0x0626 }, + { 0x0654, 0x06c2 }, + { 0x0654, 0x06d3 }, + { 0x0654, 0x06c0 }, + { 0x093c, 0x0929 }, + { 0x093c, 0x0931 }, + { 0x093c, 0x0934 }, + { 0x0bd7, 0x0b94 }, + { 0x0bbe, 0x0bcb }, + { 0x0c56, 0x0c48 }, + { 0x0cd5, 0x0cc0 }, + { 0x0cd5, 0x0ccb }, + { 0x0d3e, 0x0d4b }, + { 0x0dca, 0x0ddd }, + { 0x102e, 0x1026 }, + { 0x0304, 0x1e38 }, + { 0x0304, 0x1e39 }, + { 0x0304, 0x1e5c }, + { 0x0304, 0x1e5d }, + { 0x0307, 0x1e68 }, + { 0x0307, 0x1e69 }, + { 0x0302, 0x1ec6 }, + { 0x0302, 0x1ec7 }, + { 0x0302, 0x1ed8 }, + { 0x0302, 0x1ed9 }, + { 0x0345, 0x1f82 }, + { 0x0345, 0x1f83 }, + { 0x0345, 0x1f84 }, + { 0x0345, 0x1f85 }, + { 0x0345, 0x1f86 }, + { 0x0345, 0x1f87 }, + { 0x0345, 0x1f8a }, + { 0x0345, 0x1f8b }, + { 0x0345, 0x1f8c }, + { 0x0345, 0x1f8d }, + { 0x0345, 0x1f8e }, + { 0x0345, 0x1f8f }, + { 0x0345, 0x1f92 }, + { 0x0345, 0x1f93 }, + { 0x0345, 0x1f94 }, + { 0x0345, 0x1f95 }, + { 0x0345, 0x1f96 }, + { 0x0345, 0x1f97 }, + { 0x0345, 0x1f9a }, + { 0x0345, 0x1f9b }, + { 0x0345, 0x1f9c }, + { 0x0345, 0x1f9d }, + { 0x0345, 0x1f9e }, + { 0x0345, 0x1f9f }, + { 0x0345, 0x1fa2 }, + { 0x0345, 0x1fa3 }, + { 0x0345, 0x1fa4 }, + { 0x0345, 0x1fa5 }, + { 0x0345, 0x1fa6 }, + { 0x0345, 0x1fa7 }, + { 0x0345, 0x1faa }, + { 0x0345, 0x1fab }, + { 0x0345, 0x1fac }, + { 0x0345, 0x1fad }, + { 0x0345, 0x1fae }, + { 0x0345, 0x1faf }, + { 0x0345, 0x1fb2 }, + { 0x0345, 0x1fc2 }, + { 0x0345, 0x1ff2 }, + { 0x0345, 0x1fb7 }, + { 0x0345, 0x1fc7 }, + { 0x0345, 0x1ff7 }, + { 0x0338, 0x219a }, + { 0x0338, 0x219b }, + { 0x0338, 0x21ae }, + { 0x0338, 0x21cd }, + { 0x0338, 0x21cf }, + { 0x0338, 0x21ce }, + { 0x0338, 0x2204 }, + { 0x0338, 0x2209 }, + { 0x0338, 0x220c }, + { 0x0338, 0x2224 }, + { 0x0338, 0x2226 }, + { 0x0338, 0x2241 }, + { 0x0338, 0x2244 }, + { 0x0338, 0x2247 }, + { 0x0338, 0x2249 }, + { 0x0338, 0x226d }, + { 0x0338, 0x2262 }, + { 0x0338, 0x2270 }, + { 0x0338, 0x2271 }, + { 0x0338, 0x2274 }, + { 0x0338, 0x2275 }, + { 0x0338, 0x2278 }, + { 0x0338, 0x2279 }, + { 0x0338, 0x2280 }, + { 0x0338, 0x2281 }, + { 0x0338, 0x22e0 }, + { 0x0338, 0x22e1 }, + { 0x0338, 0x2284 }, + { 0x0338, 0x2285 }, + { 0x0338, 0x2288 }, + { 0x0338, 0x2289 }, + { 0x0338, 0x22e2 }, + { 0x0338, 0x22e3 }, + { 0x0338, 0x22ac }, + { 0x0338, 0x22ad }, + { 0x0338, 0x22ae }, + { 0x0338, 0x22af }, + { 0x0338, 0x22ea }, + { 0x0338, 0x22eb }, + { 0x0338, 0x22ec }, + { 0x0338, 0x22ed }, + { 0x3099, 0x3094 }, + { 0x3099, 0x304c }, + { 0x3099, 0x304e }, + { 0x3099, 0x3050 }, + { 0x3099, 0x3052 }, + { 0x3099, 0x3054 }, + { 0x3099, 0x3056 }, + { 0x3099, 0x3058 }, + { 0x3099, 0x305a }, + { 0x3099, 0x305c }, + { 0x3099, 0x305e }, + { 0x3099, 0x3060 }, + { 0x3099, 0x3062 }, + { 0x3099, 0x3065 }, + { 0x3099, 0x3067 }, + { 0x3099, 0x3069 }, + { 0x3099, 0x309e }, + { 0x3099, 0x30f4 }, + { 0x3099, 0x30ac }, + { 0x3099, 0x30ae }, + { 0x3099, 0x30b0 }, + { 0x3099, 0x30b2 }, + { 0x3099, 0x30b4 }, + { 0x3099, 0x30b6 }, + { 0x3099, 0x30b8 }, + { 0x3099, 0x30ba }, + { 0x3099, 0x30bc }, + { 0x3099, 0x30be }, + { 0x3099, 0x30c0 }, + { 0x3099, 0x30c2 }, + { 0x3099, 0x30c5 }, + { 0x3099, 0x30c7 }, + { 0x3099, 0x30c9 }, + { 0x3099, 0x30f7 }, + { 0x3099, 0x30f8 }, + { 0x3099, 0x30f9 }, + { 0x3099, 0x30fa }, + { 0x3099, 0x30fe } +}; +static const unsigned short compose_second_single[][2] = { + { 0x0627, 0x0622 }, + { 0x0627, 0x0623 }, + { 0x0627, 0x0625 }, + { 0x09c7, 0x09cb }, + { 0x09c7, 0x09cc }, + { 0x0b47, 0x0b4b }, + { 0x0b47, 0x0b48 }, + { 0x0b47, 0x0b4c }, + { 0x0bc6, 0x0bca }, + { 0x0bc6, 0x0bcc }, + { 0x0cc6, 0x0cca }, + { 0x0cc6, 0x0cc7 }, + { 0x0cc6, 0x0cc8 }, + { 0x0d46, 0x0d4a }, + { 0x0d46, 0x0d4c }, + { 0x0dd9, 0x0dda }, + { 0x0dd9, 0x0ddc }, + { 0x0dd9, 0x0dde } +}; +static const unsigned short compose_array[146][31] = { + { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 }, + { 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 }, + { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 }, + { 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 }, + { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 }, + { 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 }, + { 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 }, + { 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 }, + { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 }, + { 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 }, + { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 }, + { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 }, + { 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 }, + { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 }, + { 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 }, + { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 }, + { 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 }, + { 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 }, + { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 }, + { 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 }, + { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 }, + { 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 }, + { 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 }, + { 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 }, + { 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 }, + { 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 }, + { 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 }, + { 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 }, + { 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 }, + { 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 }, + { 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 }, + { 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 }, + { 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 }, + { 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 }, + { 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 }, + { 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 }, + { 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 }, + { 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 }, + { 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 }, + { 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 }, + { 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 }, + { 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 }, + { 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 }, + { 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 }, + { 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 }, + { 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 }, + { 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 }, + { 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 }, + { 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 }, + { 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 }, + { 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 }, + { 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 }, + { 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd } +}; diff --git a/poppler/UnicodeDecompTables.h b/poppler/UnicodeDecompTables.h new file mode 100644 index 0000000..4bc34b1 --- /dev/null +++ b/poppler/UnicodeDecompTables.h @@ -0,0 +1,8526 @@ +// Generated by gen-unicode-tables.py + +typedef struct { + Unicode character; + int length; + int offset; +} decomposition; + +#define DECOMP_TABLE_LENGTH 5143 + +static const decomposition decomp_table[] = { + { 0xa0, 1, 0 }, + { 0xa8, 2, 1 }, + { 0xaa, 1, 3 }, + { 0xaf, 2, 4 }, + { 0xb2, 1, 6 }, + { 0xb3, 1, 7 }, + { 0xb4, 2, 8 }, + { 0xb5, 1, 10 }, + { 0xb8, 2, 11 }, + { 0xb9, 1, 13 }, + { 0xba, 1, 14 }, + { 0xbc, 3, 15 }, + { 0xbd, 3, 18 }, + { 0xbe, 3, 21 }, + { 0xc0, 2, 24 }, + { 0xc1, 2, 26 }, + { 0xc2, 2, 28 }, + { 0xc3, 2, 30 }, + { 0xc4, 2, 32 }, + { 0xc5, 2, 34 }, + { 0xc7, 2, 36 }, + { 0xc8, 2, 38 }, + { 0xc9, 2, 40 }, + { 0xca, 2, 42 }, + { 0xcb, 2, 44 }, + { 0xcc, 2, 46 }, + { 0xcd, 2, 48 }, + { 0xce, 2, 50 }, + { 0xcf, 2, 52 }, + { 0xd1, 2, 54 }, + { 0xd2, 2, 56 }, + { 0xd3, 2, 58 }, + { 0xd4, 2, 60 }, + { 0xd5, 2, 62 }, + { 0xd6, 2, 64 }, + { 0xd9, 2, 66 }, + { 0xda, 2, 68 }, + { 0xdb, 2, 70 }, + { 0xdc, 2, 72 }, + { 0xdd, 2, 74 }, + { 0xe0, 2, 76 }, + { 0xe1, 2, 78 }, + { 0xe2, 2, 80 }, + { 0xe3, 2, 82 }, + { 0xe4, 2, 84 }, + { 0xe5, 2, 86 }, + { 0xe7, 2, 88 }, + { 0xe8, 2, 90 }, + { 0xe9, 2, 92 }, + { 0xea, 2, 94 }, + { 0xeb, 2, 96 }, + { 0xec, 2, 98 }, + { 0xed, 2, 100 }, + { 0xee, 2, 102 }, + { 0xef, 2, 104 }, + { 0xf1, 2, 106 }, + { 0xf2, 2, 108 }, + { 0xf3, 2, 110 }, + { 0xf4, 2, 112 }, + { 0xf5, 2, 114 }, + { 0xf6, 2, 116 }, + { 0xf9, 2, 118 }, + { 0xfa, 2, 120 }, + { 0xfb, 2, 122 }, + { 0xfc, 2, 124 }, + { 0xfd, 2, 126 }, + { 0xff, 2, 128 }, + { 0x100, 2, 130 }, + { 0x101, 2, 132 }, + { 0x102, 2, 134 }, + { 0x103, 2, 136 }, + { 0x104, 2, 138 }, + { 0x105, 2, 140 }, + { 0x106, 2, 142 }, + { 0x107, 2, 144 }, + { 0x108, 2, 146 }, + { 0x109, 2, 148 }, + { 0x10a, 2, 150 }, + { 0x10b, 2, 152 }, + { 0x10c, 2, 154 }, + { 0x10d, 2, 156 }, + { 0x10e, 2, 158 }, + { 0x10f, 2, 160 }, + { 0x112, 2, 162 }, + { 0x113, 2, 164 }, + { 0x114, 2, 166 }, + { 0x115, 2, 168 }, + { 0x116, 2, 170 }, + { 0x117, 2, 172 }, + { 0x118, 2, 174 }, + { 0x119, 2, 176 }, + { 0x11a, 2, 178 }, + { 0x11b, 2, 180 }, + { 0x11c, 2, 182 }, + { 0x11d, 2, 184 }, + { 0x11e, 2, 186 }, + { 0x11f, 2, 188 }, + { 0x120, 2, 190 }, + { 0x121, 2, 192 }, + { 0x122, 2, 194 }, + { 0x123, 2, 196 }, + { 0x124, 2, 198 }, + { 0x125, 2, 200 }, + { 0x128, 2, 202 }, + { 0x129, 2, 204 }, + { 0x12a, 2, 206 }, + { 0x12b, 2, 208 }, + { 0x12c, 2, 210 }, + { 0x12d, 2, 212 }, + { 0x12e, 2, 214 }, + { 0x12f, 2, 216 }, + { 0x130, 2, 218 }, + { 0x132, 2, 220 }, + { 0x133, 2, 222 }, + { 0x134, 2, 224 }, + { 0x135, 2, 226 }, + { 0x136, 2, 228 }, + { 0x137, 2, 230 }, + { 0x139, 2, 232 }, + { 0x13a, 2, 234 }, + { 0x13b, 2, 236 }, + { 0x13c, 2, 238 }, + { 0x13d, 2, 240 }, + { 0x13e, 2, 242 }, + { 0x13f, 2, 244 }, + { 0x140, 2, 246 }, + { 0x143, 2, 248 }, + { 0x144, 2, 250 }, + { 0x145, 2, 252 }, + { 0x146, 2, 254 }, + { 0x147, 2, 256 }, + { 0x148, 2, 258 }, + { 0x149, 2, 260 }, + { 0x14c, 2, 262 }, + { 0x14d, 2, 264 }, + { 0x14e, 2, 266 }, + { 0x14f, 2, 268 }, + { 0x150, 2, 270 }, + { 0x151, 2, 272 }, + { 0x154, 2, 274 }, + { 0x155, 2, 276 }, + { 0x156, 2, 278 }, + { 0x157, 2, 280 }, + { 0x158, 2, 282 }, + { 0x159, 2, 284 }, + { 0x15a, 2, 286 }, + { 0x15b, 2, 288 }, + { 0x15c, 2, 290 }, + { 0x15d, 2, 292 }, + { 0x15e, 2, 294 }, + { 0x15f, 2, 296 }, + { 0x160, 2, 298 }, + { 0x161, 2, 300 }, + { 0x162, 2, 302 }, + { 0x163, 2, 304 }, + { 0x164, 2, 306 }, + { 0x165, 2, 308 }, + { 0x168, 2, 310 }, + { 0x169, 2, 312 }, + { 0x16a, 2, 314 }, + { 0x16b, 2, 316 }, + { 0x16c, 2, 318 }, + { 0x16d, 2, 320 }, + { 0x16e, 2, 322 }, + { 0x16f, 2, 324 }, + { 0x170, 2, 326 }, + { 0x171, 2, 328 }, + { 0x172, 2, 330 }, + { 0x173, 2, 332 }, + { 0x174, 2, 334 }, + { 0x175, 2, 336 }, + { 0x176, 2, 338 }, + { 0x177, 2, 340 }, + { 0x178, 2, 342 }, + { 0x179, 2, 344 }, + { 0x17a, 2, 346 }, + { 0x17b, 2, 348 }, + { 0x17c, 2, 350 }, + { 0x17d, 2, 352 }, + { 0x17e, 2, 354 }, + { 0x17f, 1, 356 }, + { 0x1a0, 2, 357 }, + { 0x1a1, 2, 359 }, + { 0x1af, 2, 361 }, + { 0x1b0, 2, 363 }, + { 0x1c4, 3, 365 }, + { 0x1c5, 3, 368 }, + { 0x1c6, 3, 371 }, + { 0x1c7, 2, 374 }, + { 0x1c8, 2, 376 }, + { 0x1c9, 2, 378 }, + { 0x1ca, 2, 380 }, + { 0x1cb, 2, 382 }, + { 0x1cc, 2, 384 }, + { 0x1cd, 2, 386 }, + { 0x1ce, 2, 388 }, + { 0x1cf, 2, 390 }, + { 0x1d0, 2, 392 }, + { 0x1d1, 2, 394 }, + { 0x1d2, 2, 396 }, + { 0x1d3, 2, 398 }, + { 0x1d4, 2, 400 }, + { 0x1d5, 3, 402 }, + { 0x1d6, 3, 405 }, + { 0x1d7, 3, 408 }, + { 0x1d8, 3, 411 }, + { 0x1d9, 3, 414 }, + { 0x1da, 3, 417 }, + { 0x1db, 3, 420 }, + { 0x1dc, 3, 423 }, + { 0x1de, 3, 426 }, + { 0x1df, 3, 429 }, + { 0x1e0, 3, 432 }, + { 0x1e1, 3, 435 }, + { 0x1e2, 2, 438 }, + { 0x1e3, 2, 440 }, + { 0x1e6, 2, 442 }, + { 0x1e7, 2, 444 }, + { 0x1e8, 2, 446 }, + { 0x1e9, 2, 448 }, + { 0x1ea, 2, 450 }, + { 0x1eb, 2, 452 }, + { 0x1ec, 3, 454 }, + { 0x1ed, 3, 457 }, + { 0x1ee, 2, 460 }, + { 0x1ef, 2, 462 }, + { 0x1f0, 2, 464 }, + { 0x1f1, 2, 466 }, + { 0x1f2, 2, 468 }, + { 0x1f3, 2, 470 }, + { 0x1f4, 2, 472 }, + { 0x1f5, 2, 474 }, + { 0x1f8, 2, 476 }, + { 0x1f9, 2, 478 }, + { 0x1fa, 3, 480 }, + { 0x1fb, 3, 483 }, + { 0x1fc, 2, 486 }, + { 0x1fd, 2, 488 }, + { 0x1fe, 2, 490 }, + { 0x1ff, 2, 492 }, + { 0x200, 2, 494 }, + { 0x201, 2, 496 }, + { 0x202, 2, 498 }, + { 0x203, 2, 500 }, + { 0x204, 2, 502 }, + { 0x205, 2, 504 }, + { 0x206, 2, 506 }, + { 0x207, 2, 508 }, + { 0x208, 2, 510 }, + { 0x209, 2, 512 }, + { 0x20a, 2, 514 }, + { 0x20b, 2, 516 }, + { 0x20c, 2, 518 }, + { 0x20d, 2, 520 }, + { 0x20e, 2, 522 }, + { 0x20f, 2, 524 }, + { 0x210, 2, 526 }, + { 0x211, 2, 528 }, + { 0x212, 2, 530 }, + { 0x213, 2, 532 }, + { 0x214, 2, 534 }, + { 0x215, 2, 536 }, + { 0x216, 2, 538 }, + { 0x217, 2, 540 }, + { 0x218, 2, 542 }, + { 0x219, 2, 544 }, + { 0x21a, 2, 546 }, + { 0x21b, 2, 548 }, + { 0x21e, 2, 550 }, + { 0x21f, 2, 552 }, + { 0x226, 2, 554 }, + { 0x227, 2, 556 }, + { 0x228, 2, 558 }, + { 0x229, 2, 560 }, + { 0x22a, 3, 562 }, + { 0x22b, 3, 565 }, + { 0x22c, 3, 568 }, + { 0x22d, 3, 571 }, + { 0x22e, 2, 574 }, + { 0x22f, 2, 576 }, + { 0x230, 3, 578 }, + { 0x231, 3, 581 }, + { 0x232, 2, 584 }, + { 0x233, 2, 586 }, + { 0x2b0, 1, 588 }, + { 0x2b1, 1, 589 }, + { 0x2b2, 1, 590 }, + { 0x2b3, 1, 591 }, + { 0x2b4, 1, 592 }, + { 0x2b5, 1, 593 }, + { 0x2b6, 1, 594 }, + { 0x2b7, 1, 595 }, + { 0x2b8, 1, 596 }, + { 0x2d8, 2, 597 }, + { 0x2d9, 2, 599 }, + { 0x2da, 2, 601 }, + { 0x2db, 2, 603 }, + { 0x2dc, 2, 605 }, + { 0x2dd, 2, 607 }, + { 0x2e0, 1, 609 }, + { 0x2e1, 1, 610 }, + { 0x2e2, 1, 356 }, + { 0x2e3, 1, 611 }, + { 0x2e4, 1, 612 }, + { 0x340, 1, 613 }, + { 0x341, 1, 614 }, + { 0x343, 1, 615 }, + { 0x344, 2, 616 }, + { 0x374, 1, 618 }, + { 0x37a, 2, 619 }, + { 0x37e, 1, 621 }, + { 0x384, 2, 8 }, + { 0x385, 3, 622 }, + { 0x386, 2, 625 }, + { 0x387, 1, 627 }, + { 0x388, 2, 628 }, + { 0x389, 2, 630 }, + { 0x38a, 2, 632 }, + { 0x38c, 2, 634 }, + { 0x38e, 2, 636 }, + { 0x38f, 2, 638 }, + { 0x390, 3, 640 }, + { 0x3aa, 2, 643 }, + { 0x3ab, 2, 645 }, + { 0x3ac, 2, 647 }, + { 0x3ad, 2, 649 }, + { 0x3ae, 2, 651 }, + { 0x3af, 2, 653 }, + { 0x3b0, 3, 655 }, + { 0x3ca, 2, 658 }, + { 0x3cb, 2, 660 }, + { 0x3cc, 2, 662 }, + { 0x3cd, 2, 664 }, + { 0x3ce, 2, 666 }, + { 0x3d0, 1, 668 }, + { 0x3d1, 1, 669 }, + { 0x3d2, 1, 670 }, + { 0x3d3, 2, 636 }, + { 0x3d4, 2, 645 }, + { 0x3d5, 1, 671 }, + { 0x3d6, 1, 672 }, + { 0x3f0, 1, 673 }, + { 0x3f1, 1, 674 }, + { 0x3f2, 1, 675 }, + { 0x3f4, 1, 676 }, + { 0x3f5, 1, 677 }, + { 0x400, 2, 678 }, + { 0x401, 2, 680 }, + { 0x403, 2, 682 }, + { 0x407, 2, 684 }, + { 0x40c, 2, 686 }, + { 0x40d, 2, 688 }, + { 0x40e, 2, 690 }, + { 0x419, 2, 692 }, + { 0x439, 2, 694 }, + { 0x450, 2, 696 }, + { 0x451, 2, 698 }, + { 0x453, 2, 700 }, + { 0x457, 2, 702 }, + { 0x45c, 2, 704 }, + { 0x45d, 2, 706 }, + { 0x45e, 2, 708 }, + { 0x476, 2, 710 }, + { 0x477, 2, 712 }, + { 0x4c1, 2, 714 }, + { 0x4c2, 2, 716 }, + { 0x4d0, 2, 718 }, + { 0x4d1, 2, 720 }, + { 0x4d2, 2, 722 }, + { 0x4d3, 2, 724 }, + { 0x4d6, 2, 726 }, + { 0x4d7, 2, 728 }, + { 0x4da, 2, 730 }, + { 0x4db, 2, 732 }, + { 0x4dc, 2, 734 }, + { 0x4dd, 2, 736 }, + { 0x4de, 2, 738 }, + { 0x4df, 2, 740 }, + { 0x4e2, 2, 742 }, + { 0x4e3, 2, 744 }, + { 0x4e4, 2, 746 }, + { 0x4e5, 2, 748 }, + { 0x4e6, 2, 750 }, + { 0x4e7, 2, 752 }, + { 0x4ea, 2, 754 }, + { 0x4eb, 2, 756 }, + { 0x4ec, 2, 758 }, + { 0x4ed, 2, 760 }, + { 0x4ee, 2, 762 }, + { 0x4ef, 2, 764 }, + { 0x4f0, 2, 766 }, + { 0x4f1, 2, 768 }, + { 0x4f2, 2, 770 }, + { 0x4f3, 2, 772 }, + { 0x4f4, 2, 774 }, + { 0x4f5, 2, 776 }, + { 0x4f8, 2, 778 }, + { 0x4f9, 2, 780 }, + { 0x587, 2, 782 }, + { 0x622, 2, 784 }, + { 0x623, 2, 786 }, + { 0x624, 2, 788 }, + { 0x625, 2, 790 }, + { 0x626, 2, 792 }, + { 0x675, 2, 794 }, + { 0x676, 2, 796 }, + { 0x677, 2, 798 }, + { 0x678, 2, 800 }, + { 0x6c0, 2, 802 }, + { 0x6c2, 2, 804 }, + { 0x6d3, 2, 806 }, + { 0x929, 2, 808 }, + { 0x931, 2, 810 }, + { 0x934, 2, 812 }, + { 0x958, 2, 814 }, + { 0x959, 2, 816 }, + { 0x95a, 2, 818 }, + { 0x95b, 2, 820 }, + { 0x95c, 2, 822 }, + { 0x95d, 2, 824 }, + { 0x95e, 2, 826 }, + { 0x95f, 2, 828 }, + { 0x9cb, 2, 830 }, + { 0x9cc, 2, 832 }, + { 0x9dc, 2, 834 }, + { 0x9dd, 2, 836 }, + { 0x9df, 2, 838 }, + { 0xa33, 2, 840 }, + { 0xa36, 2, 842 }, + { 0xa59, 2, 844 }, + { 0xa5a, 2, 846 }, + { 0xa5b, 2, 848 }, + { 0xa5e, 2, 850 }, + { 0xb48, 2, 852 }, + { 0xb4b, 2, 854 }, + { 0xb4c, 2, 856 }, + { 0xb5c, 2, 858 }, + { 0xb5d, 2, 860 }, + { 0xb94, 2, 862 }, + { 0xbca, 2, 864 }, + { 0xbcb, 2, 866 }, + { 0xbcc, 2, 868 }, + { 0xc48, 2, 870 }, + { 0xcc0, 2, 872 }, + { 0xcc7, 2, 874 }, + { 0xcc8, 2, 876 }, + { 0xcca, 2, 878 }, + { 0xccb, 3, 880 }, + { 0xd4a, 2, 883 }, + { 0xd4b, 2, 885 }, + { 0xd4c, 2, 887 }, + { 0xdda, 2, 889 }, + { 0xddc, 2, 891 }, + { 0xddd, 3, 893 }, + { 0xdde, 2, 896 }, + { 0xe33, 2, 898 }, + { 0xeb3, 2, 900 }, + { 0xedc, 2, 902 }, + { 0xedd, 2, 904 }, + { 0xf0c, 1, 906 }, + { 0xf43, 2, 907 }, + { 0xf4d, 2, 909 }, + { 0xf52, 2, 911 }, + { 0xf57, 2, 913 }, + { 0xf5c, 2, 915 }, + { 0xf69, 2, 917 }, + { 0xf73, 2, 919 }, + { 0xf75, 2, 921 }, + { 0xf76, 2, 923 }, + { 0xf77, 3, 925 }, + { 0xf78, 2, 928 }, + { 0xf79, 3, 930 }, + { 0xf81, 2, 933 }, + { 0xf93, 2, 935 }, + { 0xf9d, 2, 937 }, + { 0xfa2, 2, 939 }, + { 0xfa7, 2, 941 }, + { 0xfac, 2, 943 }, + { 0xfb9, 2, 945 }, + { 0x1026, 2, 947 }, + { 0x1e00, 2, 949 }, + { 0x1e01, 2, 951 }, + { 0x1e02, 2, 953 }, + { 0x1e03, 2, 955 }, + { 0x1e04, 2, 957 }, + { 0x1e05, 2, 959 }, + { 0x1e06, 2, 961 }, + { 0x1e07, 2, 963 }, + { 0x1e08, 3, 965 }, + { 0x1e09, 3, 968 }, + { 0x1e0a, 2, 971 }, + { 0x1e0b, 2, 973 }, + { 0x1e0c, 2, 975 }, + { 0x1e0d, 2, 977 }, + { 0x1e0e, 2, 979 }, + { 0x1e0f, 2, 981 }, + { 0x1e10, 2, 983 }, + { 0x1e11, 2, 985 }, + { 0x1e12, 2, 987 }, + { 0x1e13, 2, 989 }, + { 0x1e14, 3, 991 }, + { 0x1e15, 3, 994 }, + { 0x1e16, 3, 997 }, + { 0x1e17, 3, 1000 }, + { 0x1e18, 2, 1003 }, + { 0x1e19, 2, 1005 }, + { 0x1e1a, 2, 1007 }, + { 0x1e1b, 2, 1009 }, + { 0x1e1c, 3, 1011 }, + { 0x1e1d, 3, 1014 }, + { 0x1e1e, 2, 1017 }, + { 0x1e1f, 2, 1019 }, + { 0x1e20, 2, 1021 }, + { 0x1e21, 2, 1023 }, + { 0x1e22, 2, 1025 }, + { 0x1e23, 2, 1027 }, + { 0x1e24, 2, 1029 }, + { 0x1e25, 2, 1031 }, + { 0x1e26, 2, 1033 }, + { 0x1e27, 2, 1035 }, + { 0x1e28, 2, 1037 }, + { 0x1e29, 2, 1039 }, + { 0x1e2a, 2, 1041 }, + { 0x1e2b, 2, 1043 }, + { 0x1e2c, 2, 1045 }, + { 0x1e2d, 2, 1047 }, + { 0x1e2e, 3, 1049 }, + { 0x1e2f, 3, 1052 }, + { 0x1e30, 2, 1055 }, + { 0x1e31, 2, 1057 }, + { 0x1e32, 2, 1059 }, + { 0x1e33, 2, 1061 }, + { 0x1e34, 2, 1063 }, + { 0x1e35, 2, 1065 }, + { 0x1e36, 2, 1067 }, + { 0x1e37, 2, 1069 }, + { 0x1e38, 3, 1071 }, + { 0x1e39, 3, 1074 }, + { 0x1e3a, 2, 1077 }, + { 0x1e3b, 2, 1079 }, + { 0x1e3c, 2, 1081 }, + { 0x1e3d, 2, 1083 }, + { 0x1e3e, 2, 1085 }, + { 0x1e3f, 2, 1087 }, + { 0x1e40, 2, 1089 }, + { 0x1e41, 2, 1091 }, + { 0x1e42, 2, 1093 }, + { 0x1e43, 2, 1095 }, + { 0x1e44, 2, 1097 }, + { 0x1e45, 2, 1099 }, + { 0x1e46, 2, 1101 }, + { 0x1e47, 2, 1103 }, + { 0x1e48, 2, 1105 }, + { 0x1e49, 2, 1107 }, + { 0x1e4a, 2, 1109 }, + { 0x1e4b, 2, 1111 }, + { 0x1e4c, 3, 1113 }, + { 0x1e4d, 3, 1116 }, + { 0x1e4e, 3, 1119 }, + { 0x1e4f, 3, 1122 }, + { 0x1e50, 3, 1125 }, + { 0x1e51, 3, 1128 }, + { 0x1e52, 3, 1131 }, + { 0x1e53, 3, 1134 }, + { 0x1e54, 2, 1137 }, + { 0x1e55, 2, 1139 }, + { 0x1e56, 2, 1141 }, + { 0x1e57, 2, 1143 }, + { 0x1e58, 2, 1145 }, + { 0x1e59, 2, 1147 }, + { 0x1e5a, 2, 1149 }, + { 0x1e5b, 2, 1151 }, + { 0x1e5c, 3, 1153 }, + { 0x1e5d, 3, 1156 }, + { 0x1e5e, 2, 1159 }, + { 0x1e5f, 2, 1161 }, + { 0x1e60, 2, 1163 }, + { 0x1e61, 2, 1165 }, + { 0x1e62, 2, 1167 }, + { 0x1e63, 2, 1169 }, + { 0x1e64, 3, 1171 }, + { 0x1e65, 3, 1174 }, + { 0x1e66, 3, 1177 }, + { 0x1e67, 3, 1180 }, + { 0x1e68, 3, 1183 }, + { 0x1e69, 3, 1186 }, + { 0x1e6a, 2, 1189 }, + { 0x1e6b, 2, 1191 }, + { 0x1e6c, 2, 1193 }, + { 0x1e6d, 2, 1195 }, + { 0x1e6e, 2, 1197 }, + { 0x1e6f, 2, 1199 }, + { 0x1e70, 2, 1201 }, + { 0x1e71, 2, 1203 }, + { 0x1e72, 2, 1205 }, + { 0x1e73, 2, 1207 }, + { 0x1e74, 2, 1209 }, + { 0x1e75, 2, 1211 }, + { 0x1e76, 2, 1213 }, + { 0x1e77, 2, 1215 }, + { 0x1e78, 3, 1217 }, + { 0x1e79, 3, 1220 }, + { 0x1e7a, 3, 1223 }, + { 0x1e7b, 3, 1226 }, + { 0x1e7c, 2, 1229 }, + { 0x1e7d, 2, 1231 }, + { 0x1e7e, 2, 1233 }, + { 0x1e7f, 2, 1235 }, + { 0x1e80, 2, 1237 }, + { 0x1e81, 2, 1239 }, + { 0x1e82, 2, 1241 }, + { 0x1e83, 2, 1243 }, + { 0x1e84, 2, 1245 }, + { 0x1e85, 2, 1247 }, + { 0x1e86, 2, 1249 }, + { 0x1e87, 2, 1251 }, + { 0x1e88, 2, 1253 }, + { 0x1e89, 2, 1255 }, + { 0x1e8a, 2, 1257 }, + { 0x1e8b, 2, 1259 }, + { 0x1e8c, 2, 1261 }, + { 0x1e8d, 2, 1263 }, + { 0x1e8e, 2, 1265 }, + { 0x1e8f, 2, 1267 }, + { 0x1e90, 2, 1269 }, + { 0x1e91, 2, 1271 }, + { 0x1e92, 2, 1273 }, + { 0x1e93, 2, 1275 }, + { 0x1e94, 2, 1277 }, + { 0x1e95, 2, 1279 }, + { 0x1e96, 2, 1281 }, + { 0x1e97, 2, 1283 }, + { 0x1e98, 2, 1285 }, + { 0x1e99, 2, 1287 }, + { 0x1e9a, 2, 1289 }, + { 0x1e9b, 2, 1165 }, + { 0x1ea0, 2, 1291 }, + { 0x1ea1, 2, 1293 }, + { 0x1ea2, 2, 1295 }, + { 0x1ea3, 2, 1297 }, + { 0x1ea4, 3, 1299 }, + { 0x1ea5, 3, 1302 }, + { 0x1ea6, 3, 1305 }, + { 0x1ea7, 3, 1308 }, + { 0x1ea8, 3, 1311 }, + { 0x1ea9, 3, 1314 }, + { 0x1eaa, 3, 1317 }, + { 0x1eab, 3, 1320 }, + { 0x1eac, 3, 1323 }, + { 0x1ead, 3, 1326 }, + { 0x1eae, 3, 1329 }, + { 0x1eaf, 3, 1332 }, + { 0x1eb0, 3, 1335 }, + { 0x1eb1, 3, 1338 }, + { 0x1eb2, 3, 1341 }, + { 0x1eb3, 3, 1344 }, + { 0x1eb4, 3, 1347 }, + { 0x1eb5, 3, 1350 }, + { 0x1eb6, 3, 1353 }, + { 0x1eb7, 3, 1356 }, + { 0x1eb8, 2, 1359 }, + { 0x1eb9, 2, 1361 }, + { 0x1eba, 2, 1363 }, + { 0x1ebb, 2, 1365 }, + { 0x1ebc, 2, 1367 }, + { 0x1ebd, 2, 1369 }, + { 0x1ebe, 3, 1371 }, + { 0x1ebf, 3, 1374 }, + { 0x1ec0, 3, 1377 }, + { 0x1ec1, 3, 1380 }, + { 0x1ec2, 3, 1383 }, + { 0x1ec3, 3, 1386 }, + { 0x1ec4, 3, 1389 }, + { 0x1ec5, 3, 1392 }, + { 0x1ec6, 3, 1395 }, + { 0x1ec7, 3, 1398 }, + { 0x1ec8, 2, 1401 }, + { 0x1ec9, 2, 1403 }, + { 0x1eca, 2, 1405 }, + { 0x1ecb, 2, 1407 }, + { 0x1ecc, 2, 1409 }, + { 0x1ecd, 2, 1411 }, + { 0x1ece, 2, 1413 }, + { 0x1ecf, 2, 1415 }, + { 0x1ed0, 3, 1417 }, + { 0x1ed1, 3, 1420 }, + { 0x1ed2, 3, 1423 }, + { 0x1ed3, 3, 1426 }, + { 0x1ed4, 3, 1429 }, + { 0x1ed5, 3, 1432 }, + { 0x1ed6, 3, 1435 }, + { 0x1ed7, 3, 1438 }, + { 0x1ed8, 3, 1441 }, + { 0x1ed9, 3, 1444 }, + { 0x1eda, 3, 1447 }, + { 0x1edb, 3, 1450 }, + { 0x1edc, 3, 1453 }, + { 0x1edd, 3, 1456 }, + { 0x1ede, 3, 1459 }, + { 0x1edf, 3, 1462 }, + { 0x1ee0, 3, 1465 }, + { 0x1ee1, 3, 1468 }, + { 0x1ee2, 3, 1471 }, + { 0x1ee3, 3, 1474 }, + { 0x1ee4, 2, 1477 }, + { 0x1ee5, 2, 1479 }, + { 0x1ee6, 2, 1481 }, + { 0x1ee7, 2, 1483 }, + { 0x1ee8, 3, 1485 }, + { 0x1ee9, 3, 1488 }, + { 0x1eea, 3, 1491 }, + { 0x1eeb, 3, 1494 }, + { 0x1eec, 3, 1497 }, + { 0x1eed, 3, 1500 }, + { 0x1eee, 3, 1503 }, + { 0x1eef, 3, 1506 }, + { 0x1ef0, 3, 1509 }, + { 0x1ef1, 3, 1512 }, + { 0x1ef2, 2, 1515 }, + { 0x1ef3, 2, 1517 }, + { 0x1ef4, 2, 1519 }, + { 0x1ef5, 2, 1521 }, + { 0x1ef6, 2, 1523 }, + { 0x1ef7, 2, 1525 }, + { 0x1ef8, 2, 1527 }, + { 0x1ef9, 2, 1529 }, + { 0x1f00, 2, 1531 }, + { 0x1f01, 2, 1533 }, + { 0x1f02, 3, 1535 }, + { 0x1f03, 3, 1538 }, + { 0x1f04, 3, 1541 }, + { 0x1f05, 3, 1544 }, + { 0x1f06, 3, 1547 }, + { 0x1f07, 3, 1550 }, + { 0x1f08, 2, 1553 }, + { 0x1f09, 2, 1555 }, + { 0x1f0a, 3, 1557 }, + { 0x1f0b, 3, 1560 }, + { 0x1f0c, 3, 1563 }, + { 0x1f0d, 3, 1566 }, + { 0x1f0e, 3, 1569 }, + { 0x1f0f, 3, 1572 }, + { 0x1f10, 2, 1575 }, + { 0x1f11, 2, 1577 }, + { 0x1f12, 3, 1579 }, + { 0x1f13, 3, 1582 }, + { 0x1f14, 3, 1585 }, + { 0x1f15, 3, 1588 }, + { 0x1f18, 2, 1591 }, + { 0x1f19, 2, 1593 }, + { 0x1f1a, 3, 1595 }, + { 0x1f1b, 3, 1598 }, + { 0x1f1c, 3, 1601 }, + { 0x1f1d, 3, 1604 }, + { 0x1f20, 2, 1607 }, + { 0x1f21, 2, 1609 }, + { 0x1f22, 3, 1611 }, + { 0x1f23, 3, 1614 }, + { 0x1f24, 3, 1617 }, + { 0x1f25, 3, 1620 }, + { 0x1f26, 3, 1623 }, + { 0x1f27, 3, 1626 }, + { 0x1f28, 2, 1629 }, + { 0x1f29, 2, 1631 }, + { 0x1f2a, 3, 1633 }, + { 0x1f2b, 3, 1636 }, + { 0x1f2c, 3, 1639 }, + { 0x1f2d, 3, 1642 }, + { 0x1f2e, 3, 1645 }, + { 0x1f2f, 3, 1648 }, + { 0x1f30, 2, 1651 }, + { 0x1f31, 2, 1653 }, + { 0x1f32, 3, 1655 }, + { 0x1f33, 3, 1658 }, + { 0x1f34, 3, 1661 }, + { 0x1f35, 3, 1664 }, + { 0x1f36, 3, 1667 }, + { 0x1f37, 3, 1670 }, + { 0x1f38, 2, 1673 }, + { 0x1f39, 2, 1675 }, + { 0x1f3a, 3, 1677 }, + { 0x1f3b, 3, 1680 }, + { 0x1f3c, 3, 1683 }, + { 0x1f3d, 3, 1686 }, + { 0x1f3e, 3, 1689 }, + { 0x1f3f, 3, 1692 }, + { 0x1f40, 2, 1695 }, + { 0x1f41, 2, 1697 }, + { 0x1f42, 3, 1699 }, + { 0x1f43, 3, 1702 }, + { 0x1f44, 3, 1705 }, + { 0x1f45, 3, 1708 }, + { 0x1f48, 2, 1711 }, + { 0x1f49, 2, 1713 }, + { 0x1f4a, 3, 1715 }, + { 0x1f4b, 3, 1718 }, + { 0x1f4c, 3, 1721 }, + { 0x1f4d, 3, 1724 }, + { 0x1f50, 2, 1727 }, + { 0x1f51, 2, 1729 }, + { 0x1f52, 3, 1731 }, + { 0x1f53, 3, 1734 }, + { 0x1f54, 3, 1737 }, + { 0x1f55, 3, 1740 }, + { 0x1f56, 3, 1743 }, + { 0x1f57, 3, 1746 }, + { 0x1f59, 2, 1749 }, + { 0x1f5b, 3, 1751 }, + { 0x1f5d, 3, 1754 }, + { 0x1f5f, 3, 1757 }, + { 0x1f60, 2, 1760 }, + { 0x1f61, 2, 1762 }, + { 0x1f62, 3, 1764 }, + { 0x1f63, 3, 1767 }, + { 0x1f64, 3, 1770 }, + { 0x1f65, 3, 1773 }, + { 0x1f66, 3, 1776 }, + { 0x1f67, 3, 1779 }, + { 0x1f68, 2, 1782 }, + { 0x1f69, 2, 1784 }, + { 0x1f6a, 3, 1786 }, + { 0x1f6b, 3, 1789 }, + { 0x1f6c, 3, 1792 }, + { 0x1f6d, 3, 1795 }, + { 0x1f6e, 3, 1798 }, + { 0x1f6f, 3, 1801 }, + { 0x1f70, 2, 1804 }, + { 0x1f71, 2, 647 }, + { 0x1f72, 2, 1806 }, + { 0x1f73, 2, 649 }, + { 0x1f74, 2, 1808 }, + { 0x1f75, 2, 651 }, + { 0x1f76, 2, 1810 }, + { 0x1f77, 2, 653 }, + { 0x1f78, 2, 1812 }, + { 0x1f79, 2, 662 }, + { 0x1f7a, 2, 1814 }, + { 0x1f7b, 2, 664 }, + { 0x1f7c, 2, 1816 }, + { 0x1f7d, 2, 666 }, + { 0x1f80, 3, 1818 }, + { 0x1f81, 3, 1821 }, + { 0x1f82, 4, 1824 }, + { 0x1f83, 4, 1828 }, + { 0x1f84, 4, 1832 }, + { 0x1f85, 4, 1836 }, + { 0x1f86, 4, 1840 }, + { 0x1f87, 4, 1844 }, + { 0x1f88, 3, 1848 }, + { 0x1f89, 3, 1851 }, + { 0x1f8a, 4, 1854 }, + { 0x1f8b, 4, 1858 }, + { 0x1f8c, 4, 1862 }, + { 0x1f8d, 4, 1866 }, + { 0x1f8e, 4, 1870 }, + { 0x1f8f, 4, 1874 }, + { 0x1f90, 3, 1878 }, + { 0x1f91, 3, 1881 }, + { 0x1f92, 4, 1884 }, + { 0x1f93, 4, 1888 }, + { 0x1f94, 4, 1892 }, + { 0x1f95, 4, 1896 }, + { 0x1f96, 4, 1900 }, + { 0x1f97, 4, 1904 }, + { 0x1f98, 3, 1908 }, + { 0x1f99, 3, 1911 }, + { 0x1f9a, 4, 1914 }, + { 0x1f9b, 4, 1918 }, + { 0x1f9c, 4, 1922 }, + { 0x1f9d, 4, 1926 }, + { 0x1f9e, 4, 1930 }, + { 0x1f9f, 4, 1934 }, + { 0x1fa0, 3, 1938 }, + { 0x1fa1, 3, 1941 }, + { 0x1fa2, 4, 1944 }, + { 0x1fa3, 4, 1948 }, + { 0x1fa4, 4, 1952 }, + { 0x1fa5, 4, 1956 }, + { 0x1fa6, 4, 1960 }, + { 0x1fa7, 4, 1964 }, + { 0x1fa8, 3, 1968 }, + { 0x1fa9, 3, 1971 }, + { 0x1faa, 4, 1974 }, + { 0x1fab, 4, 1978 }, + { 0x1fac, 4, 1982 }, + { 0x1fad, 4, 1986 }, + { 0x1fae, 4, 1990 }, + { 0x1faf, 4, 1994 }, + { 0x1fb0, 2, 1998 }, + { 0x1fb1, 2, 2000 }, + { 0x1fb2, 3, 2002 }, + { 0x1fb3, 2, 2005 }, + { 0x1fb4, 3, 2007 }, + { 0x1fb6, 2, 2010 }, + { 0x1fb7, 3, 2012 }, + { 0x1fb8, 2, 2015 }, + { 0x1fb9, 2, 2017 }, + { 0x1fba, 2, 2019 }, + { 0x1fbb, 2, 625 }, + { 0x1fbc, 2, 2021 }, + { 0x1fbd, 2, 2023 }, + { 0x1fbe, 1, 2025 }, + { 0x1fbf, 2, 2023 }, + { 0x1fc0, 2, 2026 }, + { 0x1fc1, 3, 2028 }, + { 0x1fc2, 3, 2031 }, + { 0x1fc3, 2, 2034 }, + { 0x1fc4, 3, 2036 }, + { 0x1fc6, 2, 2039 }, + { 0x1fc7, 3, 2041 }, + { 0x1fc8, 2, 2044 }, + { 0x1fc9, 2, 628 }, + { 0x1fca, 2, 2046 }, + { 0x1fcb, 2, 630 }, + { 0x1fcc, 2, 2048 }, + { 0x1fcd, 3, 2050 }, + { 0x1fce, 3, 2053 }, + { 0x1fcf, 3, 2056 }, + { 0x1fd0, 2, 2059 }, + { 0x1fd1, 2, 2061 }, + { 0x1fd2, 3, 2063 }, + { 0x1fd3, 3, 640 }, + { 0x1fd6, 2, 2066 }, + { 0x1fd7, 3, 2068 }, + { 0x1fd8, 2, 2071 }, + { 0x1fd9, 2, 2073 }, + { 0x1fda, 2, 2075 }, + { 0x1fdb, 2, 632 }, + { 0x1fdd, 3, 2077 }, + { 0x1fde, 3, 2080 }, + { 0x1fdf, 3, 2083 }, + { 0x1fe0, 2, 2086 }, + { 0x1fe1, 2, 2088 }, + { 0x1fe2, 3, 2090 }, + { 0x1fe3, 3, 655 }, + { 0x1fe4, 2, 2093 }, + { 0x1fe5, 2, 2095 }, + { 0x1fe6, 2, 2097 }, + { 0x1fe7, 3, 2099 }, + { 0x1fe8, 2, 2102 }, + { 0x1fe9, 2, 2104 }, + { 0x1fea, 2, 2106 }, + { 0x1feb, 2, 636 }, + { 0x1fec, 2, 2108 }, + { 0x1fed, 3, 2110 }, + { 0x1fee, 3, 622 }, + { 0x1fef, 1, 2113 }, + { 0x1ff2, 3, 2114 }, + { 0x1ff3, 2, 2117 }, + { 0x1ff4, 3, 2119 }, + { 0x1ff6, 2, 2122 }, + { 0x1ff7, 3, 2124 }, + { 0x1ff8, 2, 2127 }, + { 0x1ff9, 2, 634 }, + { 0x1ffa, 2, 2129 }, + { 0x1ffb, 2, 638 }, + { 0x1ffc, 2, 2131 }, + { 0x1ffd, 2, 8 }, + { 0x1ffe, 2, 2133 }, + { 0x2000, 1, 0 }, + { 0x2001, 1, 0 }, + { 0x2002, 1, 0 }, + { 0x2003, 1, 0 }, + { 0x2004, 1, 0 }, + { 0x2005, 1, 0 }, + { 0x2006, 1, 0 }, + { 0x2007, 1, 0 }, + { 0x2008, 1, 0 }, + { 0x2009, 1, 0 }, + { 0x200a, 1, 0 }, + { 0x2011, 1, 2135 }, + { 0x2017, 2, 2136 }, + { 0x2024, 1, 2138 }, + { 0x2025, 2, 2139 }, + { 0x2026, 3, 2141 }, + { 0x202f, 1, 0 }, + { 0x2033, 2, 2144 }, + { 0x2034, 3, 2146 }, + { 0x2036, 2, 2149 }, + { 0x2037, 3, 2151 }, + { 0x203c, 2, 2154 }, + { 0x203e, 2, 2156 }, + { 0x2047, 2, 2158 }, + { 0x2048, 2, 2160 }, + { 0x2049, 2, 2162 }, + { 0x2057, 4, 2164 }, + { 0x205f, 1, 0 }, + { 0x2070, 1, 2168 }, + { 0x2071, 1, 2169 }, + { 0x2074, 1, 2170 }, + { 0x2075, 1, 2171 }, + { 0x2076, 1, 2172 }, + { 0x2077, 1, 2173 }, + { 0x2078, 1, 2174 }, + { 0x2079, 1, 2175 }, + { 0x207a, 1, 2176 }, + { 0x207b, 1, 2177 }, + { 0x207c, 1, 2178 }, + { 0x207d, 1, 2179 }, + { 0x207e, 1, 2180 }, + { 0x207f, 1, 2181 }, + { 0x2080, 1, 2168 }, + { 0x2081, 1, 13 }, + { 0x2082, 1, 6 }, + { 0x2083, 1, 7 }, + { 0x2084, 1, 2170 }, + { 0x2085, 1, 2171 }, + { 0x2086, 1, 2172 }, + { 0x2087, 1, 2173 }, + { 0x2088, 1, 2174 }, + { 0x2089, 1, 2175 }, + { 0x208a, 1, 2176 }, + { 0x208b, 1, 2177 }, + { 0x208c, 1, 2178 }, + { 0x208d, 1, 2179 }, + { 0x208e, 1, 2180 }, + { 0x20a8, 2, 2182 }, + { 0x2100, 3, 2184 }, + { 0x2101, 3, 2187 }, + { 0x2102, 1, 2190 }, + { 0x2103, 2, 2191 }, + { 0x2105, 3, 2193 }, + { 0x2106, 3, 2196 }, + { 0x2107, 1, 2199 }, + { 0x2109, 2, 2200 }, + { 0x210a, 1, 2202 }, + { 0x210b, 1, 2203 }, + { 0x210c, 1, 2203 }, + { 0x210d, 1, 2203 }, + { 0x210e, 1, 588 }, + { 0x210f, 1, 2204 }, + { 0x2110, 1, 2205 }, + { 0x2111, 1, 2205 }, + { 0x2112, 1, 2206 }, + { 0x2113, 1, 610 }, + { 0x2115, 1, 2207 }, + { 0x2116, 2, 2208 }, + { 0x2119, 1, 2210 }, + { 0x211a, 1, 2211 }, + { 0x211b, 1, 2212 }, + { 0x211c, 1, 2212 }, + { 0x211d, 1, 2212 }, + { 0x2120, 2, 2213 }, + { 0x2121, 3, 2215 }, + { 0x2122, 2, 2218 }, + { 0x2124, 1, 2220 }, + { 0x2126, 1, 2221 }, + { 0x2128, 1, 2220 }, + { 0x212a, 1, 2222 }, + { 0x212b, 2, 34 }, + { 0x212c, 1, 2223 }, + { 0x212d, 1, 2190 }, + { 0x212f, 1, 2224 }, + { 0x2130, 1, 2225 }, + { 0x2131, 1, 2226 }, + { 0x2133, 1, 2227 }, + { 0x2134, 1, 14 }, + { 0x2135, 1, 2228 }, + { 0x2136, 1, 2229 }, + { 0x2137, 1, 2230 }, + { 0x2138, 1, 2231 }, + { 0x2139, 1, 2169 }, + { 0x213d, 1, 2232 }, + { 0x213e, 1, 2233 }, + { 0x213f, 1, 2234 }, + { 0x2140, 1, 2235 }, + { 0x2145, 1, 2236 }, + { 0x2146, 1, 2237 }, + { 0x2147, 1, 2224 }, + { 0x2148, 1, 2169 }, + { 0x2149, 1, 590 }, + { 0x2153, 3, 2238 }, + { 0x2154, 3, 2241 }, + { 0x2155, 3, 2244 }, + { 0x2156, 3, 2247 }, + { 0x2157, 3, 2250 }, + { 0x2158, 3, 2253 }, + { 0x2159, 3, 2256 }, + { 0x215a, 3, 2259 }, + { 0x215b, 3, 2262 }, + { 0x215c, 3, 2265 }, + { 0x215d, 3, 2268 }, + { 0x215e, 3, 2271 }, + { 0x215f, 2, 2274 }, + { 0x2160, 1, 2205 }, + { 0x2161, 2, 2276 }, + { 0x2162, 3, 2278 }, + { 0x2163, 2, 2281 }, + { 0x2164, 1, 2283 }, + { 0x2165, 2, 2284 }, + { 0x2166, 3, 2286 }, + { 0x2167, 4, 2289 }, + { 0x2168, 2, 2293 }, + { 0x2169, 1, 2295 }, + { 0x216a, 2, 2296 }, + { 0x216b, 3, 2298 }, + { 0x216c, 1, 2206 }, + { 0x216d, 1, 2190 }, + { 0x216e, 1, 2236 }, + { 0x216f, 1, 2227 }, + { 0x2170, 1, 2169 }, + { 0x2171, 2, 2301 }, + { 0x2172, 3, 2303 }, + { 0x2173, 2, 2306 }, + { 0x2174, 1, 2308 }, + { 0x2175, 2, 2309 }, + { 0x2176, 3, 2311 }, + { 0x2177, 4, 2314 }, + { 0x2178, 2, 2318 }, + { 0x2179, 1, 611 }, + { 0x217a, 2, 2320 }, + { 0x217b, 3, 2322 }, + { 0x217c, 1, 610 }, + { 0x217d, 1, 2325 }, + { 0x217e, 1, 2237 }, + { 0x217f, 1, 2326 }, + { 0x219a, 2, 2327 }, + { 0x219b, 2, 2329 }, + { 0x21ae, 2, 2331 }, + { 0x21cd, 2, 2333 }, + { 0x21ce, 2, 2335 }, + { 0x21cf, 2, 2337 }, + { 0x2204, 2, 2339 }, + { 0x2209, 2, 2341 }, + { 0x220c, 2, 2343 }, + { 0x2224, 2, 2345 }, + { 0x2226, 2, 2347 }, + { 0x222c, 2, 2349 }, + { 0x222d, 3, 2351 }, + { 0x222f, 2, 2354 }, + { 0x2230, 3, 2356 }, + { 0x2241, 2, 2359 }, + { 0x2244, 2, 2361 }, + { 0x2247, 2, 2363 }, + { 0x2249, 2, 2365 }, + { 0x2260, 2, 2367 }, + { 0x2262, 2, 2369 }, + { 0x226d, 2, 2371 }, + { 0x226e, 2, 2373 }, + { 0x226f, 2, 2375 }, + { 0x2270, 2, 2377 }, + { 0x2271, 2, 2379 }, + { 0x2274, 2, 2381 }, + { 0x2275, 2, 2383 }, + { 0x2278, 2, 2385 }, + { 0x2279, 2, 2387 }, + { 0x2280, 2, 2389 }, + { 0x2281, 2, 2391 }, + { 0x2284, 2, 2393 }, + { 0x2285, 2, 2395 }, + { 0x2288, 2, 2397 }, + { 0x2289, 2, 2399 }, + { 0x22ac, 2, 2401 }, + { 0x22ad, 2, 2403 }, + { 0x22ae, 2, 2405 }, + { 0x22af, 2, 2407 }, + { 0x22e0, 2, 2409 }, + { 0x22e1, 2, 2411 }, + { 0x22e2, 2, 2413 }, + { 0x22e3, 2, 2415 }, + { 0x22ea, 2, 2417 }, + { 0x22eb, 2, 2419 }, + { 0x22ec, 2, 2421 }, + { 0x22ed, 2, 2423 }, + { 0x2329, 1, 2425 }, + { 0x232a, 1, 2426 }, + { 0x2460, 1, 13 }, + { 0x2461, 1, 6 }, + { 0x2462, 1, 7 }, + { 0x2463, 1, 2170 }, + { 0x2464, 1, 2171 }, + { 0x2465, 1, 2172 }, + { 0x2466, 1, 2173 }, + { 0x2467, 1, 2174 }, + { 0x2468, 1, 2175 }, + { 0x2469, 2, 2427 }, + { 0x246a, 2, 2429 }, + { 0x246b, 2, 2431 }, + { 0x246c, 2, 2433 }, + { 0x246d, 2, 2435 }, + { 0x246e, 2, 2437 }, + { 0x246f, 2, 2439 }, + { 0x2470, 2, 2441 }, + { 0x2471, 2, 2443 }, + { 0x2472, 2, 2445 }, + { 0x2473, 2, 2447 }, + { 0x2474, 3, 2449 }, + { 0x2475, 3, 2452 }, + { 0x2476, 3, 2455 }, + { 0x2477, 3, 2458 }, + { 0x2478, 3, 2461 }, + { 0x2479, 3, 2464 }, + { 0x247a, 3, 2467 }, + { 0x247b, 3, 2470 }, + { 0x247c, 3, 2473 }, + { 0x247d, 4, 2476 }, + { 0x247e, 4, 2480 }, + { 0x247f, 4, 2484 }, + { 0x2480, 4, 2488 }, + { 0x2481, 4, 2492 }, + { 0x2482, 4, 2496 }, + { 0x2483, 4, 2500 }, + { 0x2484, 4, 2504 }, + { 0x2485, 4, 2508 }, + { 0x2486, 4, 2512 }, + { 0x2487, 4, 2516 }, + { 0x2488, 2, 2520 }, + { 0x2489, 2, 2522 }, + { 0x248a, 2, 2524 }, + { 0x248b, 2, 2526 }, + { 0x248c, 2, 2528 }, + { 0x248d, 2, 2530 }, + { 0x248e, 2, 2532 }, + { 0x248f, 2, 2534 }, + { 0x2490, 2, 2536 }, + { 0x2491, 3, 2538 }, + { 0x2492, 3, 2541 }, + { 0x2493, 3, 2544 }, + { 0x2494, 3, 2547 }, + { 0x2495, 3, 2550 }, + { 0x2496, 3, 2553 }, + { 0x2497, 3, 2556 }, + { 0x2498, 3, 2559 }, + { 0x2499, 3, 2562 }, + { 0x249a, 3, 2565 }, + { 0x249b, 3, 2568 }, + { 0x249c, 3, 2571 }, + { 0x249d, 3, 2574 }, + { 0x249e, 3, 2577 }, + { 0x249f, 3, 2580 }, + { 0x24a0, 3, 2583 }, + { 0x24a1, 3, 2586 }, + { 0x24a2, 3, 2589 }, + { 0x24a3, 3, 2592 }, + { 0x24a4, 3, 2595 }, + { 0x24a5, 3, 2598 }, + { 0x24a6, 3, 2601 }, + { 0x24a7, 3, 2604 }, + { 0x24a8, 3, 2607 }, + { 0x24a9, 3, 2610 }, + { 0x24aa, 3, 2613 }, + { 0x24ab, 3, 2616 }, + { 0x24ac, 3, 2619 }, + { 0x24ad, 3, 2622 }, + { 0x24ae, 3, 2625 }, + { 0x24af, 3, 2628 }, + { 0x24b0, 3, 2631 }, + { 0x24b1, 3, 2634 }, + { 0x24b2, 3, 2637 }, + { 0x24b3, 3, 2640 }, + { 0x24b4, 3, 2643 }, + { 0x24b5, 3, 2646 }, + { 0x24b6, 1, 2649 }, + { 0x24b7, 1, 2223 }, + { 0x24b8, 1, 2190 }, + { 0x24b9, 1, 2236 }, + { 0x24ba, 1, 2225 }, + { 0x24bb, 1, 2226 }, + { 0x24bc, 1, 2650 }, + { 0x24bd, 1, 2203 }, + { 0x24be, 1, 2205 }, + { 0x24bf, 1, 2651 }, + { 0x24c0, 1, 2222 }, + { 0x24c1, 1, 2206 }, + { 0x24c2, 1, 2227 }, + { 0x24c3, 1, 2207 }, + { 0x24c4, 1, 2652 }, + { 0x24c5, 1, 2210 }, + { 0x24c6, 1, 2211 }, + { 0x24c7, 1, 2212 }, + { 0x24c8, 1, 2653 }, + { 0x24c9, 1, 2654 }, + { 0x24ca, 1, 2655 }, + { 0x24cb, 1, 2283 }, + { 0x24cc, 1, 2656 }, + { 0x24cd, 1, 2295 }, + { 0x24ce, 1, 2657 }, + { 0x24cf, 1, 2220 }, + { 0x24d0, 1, 3 }, + { 0x24d1, 1, 2658 }, + { 0x24d2, 1, 2325 }, + { 0x24d3, 1, 2237 }, + { 0x24d4, 1, 2224 }, + { 0x24d5, 1, 2659 }, + { 0x24d6, 1, 2202 }, + { 0x24d7, 1, 588 }, + { 0x24d8, 1, 2169 }, + { 0x24d9, 1, 590 }, + { 0x24da, 1, 2660 }, + { 0x24db, 1, 610 }, + { 0x24dc, 1, 2326 }, + { 0x24dd, 1, 2181 }, + { 0x24de, 1, 14 }, + { 0x24df, 1, 2661 }, + { 0x24e0, 1, 2662 }, + { 0x24e1, 1, 591 }, + { 0x24e2, 1, 356 }, + { 0x24e3, 1, 2663 }, + { 0x24e4, 1, 2664 }, + { 0x24e5, 1, 2308 }, + { 0x24e6, 1, 595 }, + { 0x24e7, 1, 611 }, + { 0x24e8, 1, 596 }, + { 0x24e9, 1, 2665 }, + { 0x24ea, 1, 2168 }, + { 0x2a0c, 4, 2666 }, + { 0x2a74, 3, 2670 }, + { 0x2a75, 2, 2673 }, + { 0x2a76, 3, 2675 }, + { 0x2adc, 2, 2678 }, + { 0x2e9f, 1, 2680 }, + { 0x2ef3, 1, 2681 }, + { 0x2f00, 1, 2682 }, + { 0x2f01, 1, 2683 }, + { 0x2f02, 1, 2684 }, + { 0x2f03, 1, 2685 }, + { 0x2f04, 1, 2686 }, + { 0x2f05, 1, 2687 }, + { 0x2f06, 1, 2688 }, + { 0x2f07, 1, 2689 }, + { 0x2f08, 1, 2690 }, + { 0x2f09, 1, 2691 }, + { 0x2f0a, 1, 2692 }, + { 0x2f0b, 1, 2693 }, + { 0x2f0c, 1, 2694 }, + { 0x2f0d, 1, 2695 }, + { 0x2f0e, 1, 2696 }, + { 0x2f0f, 1, 2697 }, + { 0x2f10, 1, 2698 }, + { 0x2f11, 1, 2699 }, + { 0x2f12, 1, 2700 }, + { 0x2f13, 1, 2701 }, + { 0x2f14, 1, 2702 }, + { 0x2f15, 1, 2703 }, + { 0x2f16, 1, 2704 }, + { 0x2f17, 1, 2705 }, + { 0x2f18, 1, 2706 }, + { 0x2f19, 1, 2707 }, + { 0x2f1a, 1, 2708 }, + { 0x2f1b, 1, 2709 }, + { 0x2f1c, 1, 2710 }, + { 0x2f1d, 1, 2711 }, + { 0x2f1e, 1, 2712 }, + { 0x2f1f, 1, 2713 }, + { 0x2f20, 1, 2714 }, + { 0x2f21, 1, 2715 }, + { 0x2f22, 1, 2716 }, + { 0x2f23, 1, 2717 }, + { 0x2f24, 1, 2718 }, + { 0x2f25, 1, 2719 }, + { 0x2f26, 1, 2720 }, + { 0x2f27, 1, 2721 }, + { 0x2f28, 1, 2722 }, + { 0x2f29, 1, 2723 }, + { 0x2f2a, 1, 2724 }, + { 0x2f2b, 1, 2725 }, + { 0x2f2c, 1, 2726 }, + { 0x2f2d, 1, 2727 }, + { 0x2f2e, 1, 2728 }, + { 0x2f2f, 1, 2729 }, + { 0x2f30, 1, 2730 }, + { 0x2f31, 1, 2731 }, + { 0x2f32, 1, 2732 }, + { 0x2f33, 1, 2733 }, + { 0x2f34, 1, 2734 }, + { 0x2f35, 1, 2735 }, + { 0x2f36, 1, 2736 }, + { 0x2f37, 1, 2737 }, + { 0x2f38, 1, 2738 }, + { 0x2f39, 1, 2739 }, + { 0x2f3a, 1, 2740 }, + { 0x2f3b, 1, 2741 }, + { 0x2f3c, 1, 2742 }, + { 0x2f3d, 1, 2743 }, + { 0x2f3e, 1, 2744 }, + { 0x2f3f, 1, 2745 }, + { 0x2f40, 1, 2746 }, + { 0x2f41, 1, 2747 }, + { 0x2f42, 1, 2748 }, + { 0x2f43, 1, 2749 }, + { 0x2f44, 1, 2750 }, + { 0x2f45, 1, 2751 }, + { 0x2f46, 1, 2752 }, + { 0x2f47, 1, 2753 }, + { 0x2f48, 1, 2754 }, + { 0x2f49, 1, 2755 }, + { 0x2f4a, 1, 2756 }, + { 0x2f4b, 1, 2757 }, + { 0x2f4c, 1, 2758 }, + { 0x2f4d, 1, 2759 }, + { 0x2f4e, 1, 2760 }, + { 0x2f4f, 1, 2761 }, + { 0x2f50, 1, 2762 }, + { 0x2f51, 1, 2763 }, + { 0x2f52, 1, 2764 }, + { 0x2f53, 1, 2765 }, + { 0x2f54, 1, 2766 }, + { 0x2f55, 1, 2767 }, + { 0x2f56, 1, 2768 }, + { 0x2f57, 1, 2769 }, + { 0x2f58, 1, 2770 }, + { 0x2f59, 1, 2771 }, + { 0x2f5a, 1, 2772 }, + { 0x2f5b, 1, 2773 }, + { 0x2f5c, 1, 2774 }, + { 0x2f5d, 1, 2775 }, + { 0x2f5e, 1, 2776 }, + { 0x2f5f, 1, 2777 }, + { 0x2f60, 1, 2778 }, + { 0x2f61, 1, 2779 }, + { 0x2f62, 1, 2780 }, + { 0x2f63, 1, 2781 }, + { 0x2f64, 1, 2782 }, + { 0x2f65, 1, 2783 }, + { 0x2f66, 1, 2784 }, + { 0x2f67, 1, 2785 }, + { 0x2f68, 1, 2786 }, + { 0x2f69, 1, 2787 }, + { 0x2f6a, 1, 2788 }, + { 0x2f6b, 1, 2789 }, + { 0x2f6c, 1, 2790 }, + { 0x2f6d, 1, 2791 }, + { 0x2f6e, 1, 2792 }, + { 0x2f6f, 1, 2793 }, + { 0x2f70, 1, 2794 }, + { 0x2f71, 1, 2795 }, + { 0x2f72, 1, 2796 }, + { 0x2f73, 1, 2797 }, + { 0x2f74, 1, 2798 }, + { 0x2f75, 1, 2799 }, + { 0x2f76, 1, 2800 }, + { 0x2f77, 1, 2801 }, + { 0x2f78, 1, 2802 }, + { 0x2f79, 1, 2803 }, + { 0x2f7a, 1, 2804 }, + { 0x2f7b, 1, 2805 }, + { 0x2f7c, 1, 2806 }, + { 0x2f7d, 1, 2807 }, + { 0x2f7e, 1, 2808 }, + { 0x2f7f, 1, 2809 }, + { 0x2f80, 1, 2810 }, + { 0x2f81, 1, 2811 }, + { 0x2f82, 1, 2812 }, + { 0x2f83, 1, 2813 }, + { 0x2f84, 1, 2814 }, + { 0x2f85, 1, 2815 }, + { 0x2f86, 1, 2816 }, + { 0x2f87, 1, 2817 }, + { 0x2f88, 1, 2818 }, + { 0x2f89, 1, 2819 }, + { 0x2f8a, 1, 2820 }, + { 0x2f8b, 1, 2821 }, + { 0x2f8c, 1, 2822 }, + { 0x2f8d, 1, 2823 }, + { 0x2f8e, 1, 2824 }, + { 0x2f8f, 1, 2825 }, + { 0x2f90, 1, 2826 }, + { 0x2f91, 1, 2827 }, + { 0x2f92, 1, 2828 }, + { 0x2f93, 1, 2829 }, + { 0x2f94, 1, 2830 }, + { 0x2f95, 1, 2831 }, + { 0x2f96, 1, 2832 }, + { 0x2f97, 1, 2833 }, + { 0x2f98, 1, 2834 }, + { 0x2f99, 1, 2835 }, + { 0x2f9a, 1, 2836 }, + { 0x2f9b, 1, 2837 }, + { 0x2f9c, 1, 2838 }, + { 0x2f9d, 1, 2839 }, + { 0x2f9e, 1, 2840 }, + { 0x2f9f, 1, 2841 }, + { 0x2fa0, 1, 2842 }, + { 0x2fa1, 1, 2843 }, + { 0x2fa2, 1, 2844 }, + { 0x2fa3, 1, 2845 }, + { 0x2fa4, 1, 2846 }, + { 0x2fa5, 1, 2847 }, + { 0x2fa6, 1, 2848 }, + { 0x2fa7, 1, 2849 }, + { 0x2fa8, 1, 2850 }, + { 0x2fa9, 1, 2851 }, + { 0x2faa, 1, 2852 }, + { 0x2fab, 1, 2853 }, + { 0x2fac, 1, 2854 }, + { 0x2fad, 1, 2855 }, + { 0x2fae, 1, 2856 }, + { 0x2faf, 1, 2857 }, + { 0x2fb0, 1, 2858 }, + { 0x2fb1, 1, 2859 }, + { 0x2fb2, 1, 2860 }, + { 0x2fb3, 1, 2861 }, + { 0x2fb4, 1, 2862 }, + { 0x2fb5, 1, 2863 }, + { 0x2fb6, 1, 2864 }, + { 0x2fb7, 1, 2865 }, + { 0x2fb8, 1, 2866 }, + { 0x2fb9, 1, 2867 }, + { 0x2fba, 1, 2868 }, + { 0x2fbb, 1, 2869 }, + { 0x2fbc, 1, 2870 }, + { 0x2fbd, 1, 2871 }, + { 0x2fbe, 1, 2872 }, + { 0x2fbf, 1, 2873 }, + { 0x2fc0, 1, 2874 }, + { 0x2fc1, 1, 2875 }, + { 0x2fc2, 1, 2876 }, + { 0x2fc3, 1, 2877 }, + { 0x2fc4, 1, 2878 }, + { 0x2fc5, 1, 2879 }, + { 0x2fc6, 1, 2880 }, + { 0x2fc7, 1, 2881 }, + { 0x2fc8, 1, 2882 }, + { 0x2fc9, 1, 2883 }, + { 0x2fca, 1, 2884 }, + { 0x2fcb, 1, 2885 }, + { 0x2fcc, 1, 2886 }, + { 0x2fcd, 1, 2887 }, + { 0x2fce, 1, 2888 }, + { 0x2fcf, 1, 2889 }, + { 0x2fd0, 1, 2890 }, + { 0x2fd1, 1, 2891 }, + { 0x2fd2, 1, 2892 }, + { 0x2fd3, 1, 2893 }, + { 0x2fd4, 1, 2894 }, + { 0x2fd5, 1, 2895 }, + { 0x3000, 1, 0 }, + { 0x3036, 1, 2896 }, + { 0x3038, 1, 2705 }, + { 0x3039, 1, 2897 }, + { 0x303a, 1, 2898 }, + { 0x304c, 2, 2899 }, + { 0x304e, 2, 2901 }, + { 0x3050, 2, 2903 }, + { 0x3052, 2, 2905 }, + { 0x3054, 2, 2907 }, + { 0x3056, 2, 2909 }, + { 0x3058, 2, 2911 }, + { 0x305a, 2, 2913 }, + { 0x305c, 2, 2915 }, + { 0x305e, 2, 2917 }, + { 0x3060, 2, 2919 }, + { 0x3062, 2, 2921 }, + { 0x3065, 2, 2923 }, + { 0x3067, 2, 2925 }, + { 0x3069, 2, 2927 }, + { 0x3070, 2, 2929 }, + { 0x3071, 2, 2931 }, + { 0x3073, 2, 2933 }, + { 0x3074, 2, 2935 }, + { 0x3076, 2, 2937 }, + { 0x3077, 2, 2939 }, + { 0x3079, 2, 2941 }, + { 0x307a, 2, 2943 }, + { 0x307c, 2, 2945 }, + { 0x307d, 2, 2947 }, + { 0x3094, 2, 2949 }, + { 0x309b, 2, 2951 }, + { 0x309c, 2, 2953 }, + { 0x309e, 2, 2955 }, + { 0x309f, 2, 2957 }, + { 0x30ac, 2, 2959 }, + { 0x30ae, 2, 2961 }, + { 0x30b0, 2, 2963 }, + { 0x30b2, 2, 2965 }, + { 0x30b4, 2, 2967 }, + { 0x30b6, 2, 2969 }, + { 0x30b8, 2, 2971 }, + { 0x30ba, 2, 2973 }, + { 0x30bc, 2, 2975 }, + { 0x30be, 2, 2977 }, + { 0x30c0, 2, 2979 }, + { 0x30c2, 2, 2981 }, + { 0x30c5, 2, 2983 }, + { 0x30c7, 2, 2985 }, + { 0x30c9, 2, 2987 }, + { 0x30d0, 2, 2989 }, + { 0x30d1, 2, 2991 }, + { 0x30d3, 2, 2993 }, + { 0x30d4, 2, 2995 }, + { 0x30d6, 2, 2997 }, + { 0x30d7, 2, 2999 }, + { 0x30d9, 2, 3001 }, + { 0x30da, 2, 3003 }, + { 0x30dc, 2, 3005 }, + { 0x30dd, 2, 3007 }, + { 0x30f4, 2, 3009 }, + { 0x30f7, 2, 3011 }, + { 0x30f8, 2, 3013 }, + { 0x30f9, 2, 3015 }, + { 0x30fa, 2, 3017 }, + { 0x30fe, 2, 3019 }, + { 0x30ff, 2, 3021 }, + { 0x3131, 1, 3023 }, + { 0x3132, 1, 3024 }, + { 0x3133, 1, 3025 }, + { 0x3134, 1, 3026 }, + { 0x3135, 1, 3027 }, + { 0x3136, 1, 3028 }, + { 0x3137, 1, 3029 }, + { 0x3138, 1, 3030 }, + { 0x3139, 1, 3031 }, + { 0x313a, 1, 3032 }, + { 0x313b, 1, 3033 }, + { 0x313c, 1, 3034 }, + { 0x313d, 1, 3035 }, + { 0x313e, 1, 3036 }, + { 0x313f, 1, 3037 }, + { 0x3140, 1, 3038 }, + { 0x3141, 1, 3039 }, + { 0x3142, 1, 3040 }, + { 0x3143, 1, 3041 }, + { 0x3144, 1, 3042 }, + { 0x3145, 1, 3043 }, + { 0x3146, 1, 3044 }, + { 0x3147, 1, 3045 }, + { 0x3148, 1, 3046 }, + { 0x3149, 1, 3047 }, + { 0x314a, 1, 3048 }, + { 0x314b, 1, 3049 }, + { 0x314c, 1, 3050 }, + { 0x314d, 1, 3051 }, + { 0x314e, 1, 3052 }, + { 0x314f, 1, 3053 }, + { 0x3150, 1, 3054 }, + { 0x3151, 1, 3055 }, + { 0x3152, 1, 3056 }, + { 0x3153, 1, 3057 }, + { 0x3154, 1, 3058 }, + { 0x3155, 1, 3059 }, + { 0x3156, 1, 3060 }, + { 0x3157, 1, 3061 }, + { 0x3158, 1, 3062 }, + { 0x3159, 1, 3063 }, + { 0x315a, 1, 3064 }, + { 0x315b, 1, 3065 }, + { 0x315c, 1, 3066 }, + { 0x315d, 1, 3067 }, + { 0x315e, 1, 3068 }, + { 0x315f, 1, 3069 }, + { 0x3160, 1, 3070 }, + { 0x3161, 1, 3071 }, + { 0x3162, 1, 3072 }, + { 0x3163, 1, 3073 }, + { 0x3164, 1, 3074 }, + { 0x3165, 1, 3075 }, + { 0x3166, 1, 3076 }, + { 0x3167, 1, 3077 }, + { 0x3168, 1, 3078 }, + { 0x3169, 1, 3079 }, + { 0x316a, 1, 3080 }, + { 0x316b, 1, 3081 }, + { 0x316c, 1, 3082 }, + { 0x316d, 1, 3083 }, + { 0x316e, 1, 3084 }, + { 0x316f, 1, 3085 }, + { 0x3170, 1, 3086 }, + { 0x3171, 1, 3087 }, + { 0x3172, 1, 3088 }, + { 0x3173, 1, 3089 }, + { 0x3174, 1, 3090 }, + { 0x3175, 1, 3091 }, + { 0x3176, 1, 3092 }, + { 0x3177, 1, 3093 }, + { 0x3178, 1, 3094 }, + { 0x3179, 1, 3095 }, + { 0x317a, 1, 3096 }, + { 0x317b, 1, 3097 }, + { 0x317c, 1, 3098 }, + { 0x317d, 1, 3099 }, + { 0x317e, 1, 3100 }, + { 0x317f, 1, 3101 }, + { 0x3180, 1, 3102 }, + { 0x3181, 1, 3103 }, + { 0x3182, 1, 3104 }, + { 0x3183, 1, 3105 }, + { 0x3184, 1, 3106 }, + { 0x3185, 1, 3107 }, + { 0x3186, 1, 3108 }, + { 0x3187, 1, 3109 }, + { 0x3188, 1, 3110 }, + { 0x3189, 1, 3111 }, + { 0x318a, 1, 3112 }, + { 0x318b, 1, 3113 }, + { 0x318c, 1, 3114 }, + { 0x318d, 1, 3115 }, + { 0x318e, 1, 3116 }, + { 0x3192, 1, 2682 }, + { 0x3193, 1, 2688 }, + { 0x3194, 1, 3117 }, + { 0x3195, 1, 3118 }, + { 0x3196, 1, 3119 }, + { 0x3197, 1, 3120 }, + { 0x3198, 1, 3121 }, + { 0x3199, 1, 3122 }, + { 0x319a, 1, 2686 }, + { 0x319b, 1, 3123 }, + { 0x319c, 1, 3124 }, + { 0x319d, 1, 3125 }, + { 0x319e, 1, 3126 }, + { 0x319f, 1, 2690 }, + { 0x3200, 3, 3127 }, + { 0x3201, 3, 3130 }, + { 0x3202, 3, 3133 }, + { 0x3203, 3, 3136 }, + { 0x3204, 3, 3139 }, + { 0x3205, 3, 3142 }, + { 0x3206, 3, 3145 }, + { 0x3207, 3, 3148 }, + { 0x3208, 3, 3151 }, + { 0x3209, 3, 3154 }, + { 0x320a, 3, 3157 }, + { 0x320b, 3, 3160 }, + { 0x320c, 3, 3163 }, + { 0x320d, 3, 3166 }, + { 0x320e, 4, 3169 }, + { 0x320f, 4, 3173 }, + { 0x3210, 4, 3177 }, + { 0x3211, 4, 3181 }, + { 0x3212, 4, 3185 }, + { 0x3213, 4, 3189 }, + { 0x3214, 4, 3193 }, + { 0x3215, 4, 3197 }, + { 0x3216, 4, 3201 }, + { 0x3217, 4, 3205 }, + { 0x3218, 4, 3209 }, + { 0x3219, 4, 3213 }, + { 0x321a, 4, 3217 }, + { 0x321b, 4, 3221 }, + { 0x321c, 4, 3225 }, + { 0x3220, 3, 3229 }, + { 0x3221, 3, 3232 }, + { 0x3222, 3, 3235 }, + { 0x3223, 3, 3238 }, + { 0x3224, 3, 3241 }, + { 0x3225, 3, 3244 }, + { 0x3226, 3, 3247 }, + { 0x3227, 3, 3250 }, + { 0x3228, 3, 3253 }, + { 0x3229, 3, 3256 }, + { 0x322a, 3, 3259 }, + { 0x322b, 3, 3262 }, + { 0x322c, 3, 3265 }, + { 0x322d, 3, 3268 }, + { 0x322e, 3, 3271 }, + { 0x322f, 3, 3274 }, + { 0x3230, 3, 3277 }, + { 0x3231, 3, 3280 }, + { 0x3232, 3, 3283 }, + { 0x3233, 3, 3286 }, + { 0x3234, 3, 3289 }, + { 0x3235, 3, 3292 }, + { 0x3236, 3, 3295 }, + { 0x3237, 3, 3298 }, + { 0x3238, 3, 3301 }, + { 0x3239, 3, 3304 }, + { 0x323a, 3, 3307 }, + { 0x323b, 3, 3310 }, + { 0x323c, 3, 3313 }, + { 0x323d, 3, 3316 }, + { 0x323e, 3, 3319 }, + { 0x323f, 3, 3322 }, + { 0x3240, 3, 3325 }, + { 0x3241, 3, 3328 }, + { 0x3242, 3, 3331 }, + { 0x3243, 3, 3334 }, + { 0x3251, 2, 3337 }, + { 0x3252, 2, 3339 }, + { 0x3253, 2, 3341 }, + { 0x3254, 2, 3343 }, + { 0x3255, 2, 3345 }, + { 0x3256, 2, 3347 }, + { 0x3257, 2, 3349 }, + { 0x3258, 2, 3351 }, + { 0x3259, 2, 3353 }, + { 0x325a, 2, 3355 }, + { 0x325b, 2, 3357 }, + { 0x325c, 2, 3359 }, + { 0x325d, 2, 3361 }, + { 0x325e, 2, 3363 }, + { 0x325f, 2, 3365 }, + { 0x3260, 1, 3023 }, + { 0x3261, 1, 3026 }, + { 0x3262, 1, 3029 }, + { 0x3263, 1, 3031 }, + { 0x3264, 1, 3039 }, + { 0x3265, 1, 3040 }, + { 0x3266, 1, 3043 }, + { 0x3267, 1, 3045 }, + { 0x3268, 1, 3046 }, + { 0x3269, 1, 3048 }, + { 0x326a, 1, 3049 }, + { 0x326b, 1, 3050 }, + { 0x326c, 1, 3051 }, + { 0x326d, 1, 3052 }, + { 0x326e, 2, 3367 }, + { 0x326f, 2, 3369 }, + { 0x3270, 2, 3371 }, + { 0x3271, 2, 3373 }, + { 0x3272, 2, 3375 }, + { 0x3273, 2, 3377 }, + { 0x3274, 2, 3379 }, + { 0x3275, 2, 3381 }, + { 0x3276, 2, 3383 }, + { 0x3277, 2, 3385 }, + { 0x3278, 2, 3387 }, + { 0x3279, 2, 3389 }, + { 0x327a, 2, 3391 }, + { 0x327b, 2, 3393 }, + { 0x3280, 1, 2682 }, + { 0x3281, 1, 2688 }, + { 0x3282, 1, 3117 }, + { 0x3283, 1, 3118 }, + { 0x3284, 1, 3395 }, + { 0x3285, 1, 3396 }, + { 0x3286, 1, 3397 }, + { 0x3287, 1, 2693 }, + { 0x3288, 1, 3398 }, + { 0x3289, 1, 2705 }, + { 0x328a, 1, 2755 }, + { 0x328b, 1, 2767 }, + { 0x328c, 1, 2766 }, + { 0x328d, 1, 2756 }, + { 0x328e, 1, 2848 }, + { 0x328f, 1, 2713 }, + { 0x3290, 1, 2753 }, + { 0x3291, 1, 3399 }, + { 0x3292, 1, 3400 }, + { 0x3293, 1, 3401 }, + { 0x3294, 1, 3402 }, + { 0x3295, 1, 3403 }, + { 0x3296, 1, 3404 }, + { 0x3297, 1, 3405 }, + { 0x3298, 1, 3406 }, + { 0x3299, 1, 3407 }, + { 0x329a, 1, 3408 }, + { 0x329b, 1, 2719 }, + { 0x329c, 1, 3409 }, + { 0x329d, 1, 3410 }, + { 0x329e, 1, 3411 }, + { 0x329f, 1, 3412 }, + { 0x32a0, 1, 3413 }, + { 0x32a1, 1, 3414 }, + { 0x32a2, 1, 3415 }, + { 0x32a3, 1, 3416 }, + { 0x32a4, 1, 3119 }, + { 0x32a5, 1, 3120 }, + { 0x32a6, 1, 3121 }, + { 0x32a7, 1, 3417 }, + { 0x32a8, 1, 3418 }, + { 0x32a9, 1, 3419 }, + { 0x32aa, 1, 3420 }, + { 0x32ab, 1, 3421 }, + { 0x32ac, 1, 3422 }, + { 0x32ad, 1, 3423 }, + { 0x32ae, 1, 3424 }, + { 0x32af, 1, 3425 }, + { 0x32b0, 1, 3426 }, + { 0x32b1, 2, 3427 }, + { 0x32b2, 2, 3429 }, + { 0x32b3, 2, 3431 }, + { 0x32b4, 2, 3433 }, + { 0x32b5, 2, 3435 }, + { 0x32b6, 2, 3437 }, + { 0x32b7, 2, 3439 }, + { 0x32b8, 2, 3441 }, + { 0x32b9, 2, 3443 }, + { 0x32ba, 2, 3445 }, + { 0x32bb, 2, 3447 }, + { 0x32bc, 2, 3449 }, + { 0x32bd, 2, 3451 }, + { 0x32be, 2, 3453 }, + { 0x32bf, 2, 3455 }, + { 0x32c0, 2, 3457 }, + { 0x32c1, 2, 3459 }, + { 0x32c2, 2, 3461 }, + { 0x32c3, 2, 3463 }, + { 0x32c4, 2, 3465 }, + { 0x32c5, 2, 3467 }, + { 0x32c6, 2, 3469 }, + { 0x32c7, 2, 3471 }, + { 0x32c8, 2, 3473 }, + { 0x32c9, 3, 3475 }, + { 0x32ca, 3, 3478 }, + { 0x32cb, 3, 3481 }, + { 0x32d0, 1, 3484 }, + { 0x32d1, 1, 3485 }, + { 0x32d2, 1, 3486 }, + { 0x32d3, 1, 3487 }, + { 0x32d4, 1, 3488 }, + { 0x32d5, 1, 3489 }, + { 0x32d6, 1, 3490 }, + { 0x32d7, 1, 3491 }, + { 0x32d8, 1, 3492 }, + { 0x32d9, 1, 3493 }, + { 0x32da, 1, 3494 }, + { 0x32db, 1, 3495 }, + { 0x32dc, 1, 3496 }, + { 0x32dd, 1, 3497 }, + { 0x32de, 1, 3498 }, + { 0x32df, 1, 3499 }, + { 0x32e0, 1, 3500 }, + { 0x32e1, 1, 3501 }, + { 0x32e2, 1, 3502 }, + { 0x32e3, 1, 3503 }, + { 0x32e4, 1, 3504 }, + { 0x32e5, 1, 3505 }, + { 0x32e6, 1, 3506 }, + { 0x32e7, 1, 3507 }, + { 0x32e8, 1, 3508 }, + { 0x32e9, 1, 3509 }, + { 0x32ea, 1, 3510 }, + { 0x32eb, 1, 3511 }, + { 0x32ec, 1, 3512 }, + { 0x32ed, 1, 3513 }, + { 0x32ee, 1, 3514 }, + { 0x32ef, 1, 3515 }, + { 0x32f0, 1, 3516 }, + { 0x32f1, 1, 3517 }, + { 0x32f2, 1, 3518 }, + { 0x32f3, 1, 3519 }, + { 0x32f4, 1, 3520 }, + { 0x32f5, 1, 3521 }, + { 0x32f6, 1, 3522 }, + { 0x32f7, 1, 3523 }, + { 0x32f8, 1, 3524 }, + { 0x32f9, 1, 3525 }, + { 0x32fa, 1, 3526 }, + { 0x32fb, 1, 3527 }, + { 0x32fc, 1, 3528 }, + { 0x32fd, 1, 3529 }, + { 0x32fe, 1, 3530 }, + { 0x3300, 5, 3531 }, + { 0x3301, 4, 3536 }, + { 0x3302, 5, 3540 }, + { 0x3303, 3, 3545 }, + { 0x3304, 5, 3548 }, + { 0x3305, 3, 3553 }, + { 0x3306, 3, 3556 }, + { 0x3307, 6, 3559 }, + { 0x3308, 4, 3565 }, + { 0x3309, 3, 3569 }, + { 0x330a, 3, 3572 }, + { 0x330b, 3, 3575 }, + { 0x330c, 4, 3578 }, + { 0x330d, 4, 3582 }, + { 0x330e, 4, 3586 }, + { 0x330f, 4, 3590 }, + { 0x3310, 4, 3594 }, + { 0x3311, 4, 3598 }, + { 0x3312, 4, 3602 }, + { 0x3313, 6, 3606 }, + { 0x3314, 2, 3612 }, + { 0x3315, 6, 3614 }, + { 0x3316, 6, 3620 }, + { 0x3317, 5, 3626 }, + { 0x3318, 4, 3631 }, + { 0x3319, 6, 3635 }, + { 0x331a, 6, 3641 }, + { 0x331b, 4, 3647 }, + { 0x331c, 3, 3651 }, + { 0x331d, 3, 3654 }, + { 0x331e, 4, 3657 }, + { 0x331f, 4, 3661 }, + { 0x3320, 5, 3665 }, + { 0x3321, 5, 3670 }, + { 0x3322, 3, 3675 }, + { 0x3323, 3, 3678 }, + { 0x3324, 4, 3681 }, + { 0x3325, 3, 3685 }, + { 0x3326, 3, 3688 }, + { 0x3327, 2, 3691 }, + { 0x3328, 2, 3693 }, + { 0x3329, 3, 3695 }, + { 0x332a, 3, 3698 }, + { 0x332b, 6, 3701 }, + { 0x332c, 4, 3707 }, + { 0x332d, 5, 3711 }, + { 0x332e, 6, 3716 }, + { 0x332f, 4, 3722 }, + { 0x3330, 3, 3726 }, + { 0x3331, 3, 3729 }, + { 0x3332, 6, 3732 }, + { 0x3333, 4, 3738 }, + { 0x3334, 6, 3742 }, + { 0x3335, 3, 3748 }, + { 0x3336, 5, 3751 }, + { 0x3337, 3, 3756 }, + { 0x3338, 4, 3759 }, + { 0x3339, 3, 3763 }, + { 0x333a, 4, 3766 }, + { 0x333b, 5, 3770 }, + { 0x333c, 4, 3775 }, + { 0x333d, 5, 3779 }, + { 0x333e, 4, 3784 }, + { 0x333f, 2, 3788 }, + { 0x3340, 5, 3790 }, + { 0x3341, 3, 3795 }, + { 0x3342, 3, 3798 }, + { 0x3343, 4, 3801 }, + { 0x3344, 3, 3805 }, + { 0x3345, 3, 3808 }, + { 0x3346, 3, 3811 }, + { 0x3347, 5, 3814 }, + { 0x3348, 4, 3819 }, + { 0x3349, 2, 3823 }, + { 0x334a, 6, 3825 }, + { 0x334b, 3, 3831 }, + { 0x334c, 5, 3834 }, + { 0x334d, 4, 3839 }, + { 0x334e, 4, 3843 }, + { 0x334f, 3, 3847 }, + { 0x3350, 3, 3850 }, + { 0x3351, 4, 3853 }, + { 0x3352, 2, 3857 }, + { 0x3353, 4, 3859 }, + { 0x3354, 5, 3863 }, + { 0x3355, 2, 3868 }, + { 0x3356, 6, 3870 }, + { 0x3357, 3, 3876 }, + { 0x3358, 2, 3879 }, + { 0x3359, 2, 3881 }, + { 0x335a, 2, 3883 }, + { 0x335b, 2, 3885 }, + { 0x335c, 2, 3887 }, + { 0x335d, 2, 3889 }, + { 0x335e, 2, 3891 }, + { 0x335f, 2, 3893 }, + { 0x3360, 2, 3895 }, + { 0x3361, 2, 3897 }, + { 0x3362, 3, 3899 }, + { 0x3363, 3, 3902 }, + { 0x3364, 3, 3905 }, + { 0x3365, 3, 3908 }, + { 0x3366, 3, 3911 }, + { 0x3367, 3, 3914 }, + { 0x3368, 3, 3917 }, + { 0x3369, 3, 3920 }, + { 0x336a, 3, 3923 }, + { 0x336b, 3, 3926 }, + { 0x336c, 3, 3929 }, + { 0x336d, 3, 3932 }, + { 0x336e, 3, 3935 }, + { 0x336f, 3, 3938 }, + { 0x3370, 3, 3941 }, + { 0x3371, 3, 3944 }, + { 0x3372, 2, 3947 }, + { 0x3373, 2, 3949 }, + { 0x3374, 3, 3951 }, + { 0x3375, 2, 3954 }, + { 0x3376, 2, 3956 }, + { 0x337b, 2, 3958 }, + { 0x337c, 2, 3960 }, + { 0x337d, 2, 3962 }, + { 0x337e, 2, 3964 }, + { 0x337f, 4, 3966 }, + { 0x3380, 2, 3970 }, + { 0x3381, 2, 3972 }, + { 0x3382, 2, 3974 }, + { 0x3383, 2, 3976 }, + { 0x3384, 2, 3978 }, + { 0x3385, 2, 3980 }, + { 0x3386, 2, 3982 }, + { 0x3387, 2, 3984 }, + { 0x3388, 3, 3986 }, + { 0x3389, 4, 3989 }, + { 0x338a, 2, 3993 }, + { 0x338b, 2, 3995 }, + { 0x338c, 2, 3997 }, + { 0x338d, 2, 3999 }, + { 0x338e, 2, 4001 }, + { 0x338f, 2, 4003 }, + { 0x3390, 2, 4005 }, + { 0x3391, 3, 4007 }, + { 0x3392, 3, 4010 }, + { 0x3393, 3, 4013 }, + { 0x3394, 3, 4016 }, + { 0x3395, 2, 4019 }, + { 0x3396, 2, 4021 }, + { 0x3397, 2, 4023 }, + { 0x3398, 2, 4025 }, + { 0x3399, 2, 4027 }, + { 0x339a, 2, 4029 }, + { 0x339b, 2, 4031 }, + { 0x339c, 2, 4033 }, + { 0x339d, 2, 4035 }, + { 0x339e, 2, 4037 }, + { 0x339f, 3, 4039 }, + { 0x33a0, 3, 4042 }, + { 0x33a1, 2, 4045 }, + { 0x33a2, 3, 4047 }, + { 0x33a3, 3, 4050 }, + { 0x33a4, 3, 4053 }, + { 0x33a5, 2, 4056 }, + { 0x33a6, 3, 4058 }, + { 0x33a7, 3, 4061 }, + { 0x33a8, 4, 4064 }, + { 0x33a9, 2, 4068 }, + { 0x33aa, 3, 4070 }, + { 0x33ab, 3, 4073 }, + { 0x33ac, 3, 4076 }, + { 0x33ad, 3, 4079 }, + { 0x33ae, 5, 4082 }, + { 0x33af, 6, 4087 }, + { 0x33b0, 2, 4093 }, + { 0x33b1, 2, 4095 }, + { 0x33b2, 2, 4097 }, + { 0x33b3, 2, 4099 }, + { 0x33b4, 2, 4101 }, + { 0x33b5, 2, 4103 }, + { 0x33b6, 2, 4105 }, + { 0x33b7, 2, 4107 }, + { 0x33b8, 2, 4109 }, + { 0x33b9, 2, 4111 }, + { 0x33ba, 2, 4113 }, + { 0x33bb, 2, 4115 }, + { 0x33bc, 2, 4117 }, + { 0x33bd, 2, 4119 }, + { 0x33be, 2, 4121 }, + { 0x33bf, 2, 4123 }, + { 0x33c0, 2, 4125 }, + { 0x33c1, 2, 4127 }, + { 0x33c2, 4, 4129 }, + { 0x33c3, 2, 4133 }, + { 0x33c4, 2, 4135 }, + { 0x33c5, 2, 4137 }, + { 0x33c6, 4, 4139 }, + { 0x33c7, 3, 4143 }, + { 0x33c8, 2, 4146 }, + { 0x33c9, 2, 4148 }, + { 0x33ca, 2, 4150 }, + { 0x33cb, 2, 4152 }, + { 0x33cc, 2, 4154 }, + { 0x33cd, 2, 4156 }, + { 0x33ce, 2, 4158 }, + { 0x33cf, 2, 4160 }, + { 0x33d0, 2, 4162 }, + { 0x33d1, 2, 4164 }, + { 0x33d2, 3, 4166 }, + { 0x33d3, 2, 4169 }, + { 0x33d4, 2, 4171 }, + { 0x33d5, 3, 4173 }, + { 0x33d6, 3, 4176 }, + { 0x33d7, 2, 4179 }, + { 0x33d8, 4, 4181 }, + { 0x33d9, 3, 4185 }, + { 0x33da, 2, 4188 }, + { 0x33db, 2, 4190 }, + { 0x33dc, 2, 4192 }, + { 0x33dd, 2, 4194 }, + { 0x33e0, 2, 4196 }, + { 0x33e1, 2, 4198 }, + { 0x33e2, 2, 4200 }, + { 0x33e3, 2, 4202 }, + { 0x33e4, 2, 4204 }, + { 0x33e5, 2, 4206 }, + { 0x33e6, 2, 4208 }, + { 0x33e7, 2, 4210 }, + { 0x33e8, 2, 4212 }, + { 0x33e9, 3, 4214 }, + { 0x33ea, 3, 4217 }, + { 0x33eb, 3, 4220 }, + { 0x33ec, 3, 4223 }, + { 0x33ed, 3, 4226 }, + { 0x33ee, 3, 4229 }, + { 0x33ef, 3, 4232 }, + { 0x33f0, 3, 4235 }, + { 0x33f1, 3, 4238 }, + { 0x33f2, 3, 4241 }, + { 0x33f3, 3, 4244 }, + { 0x33f4, 3, 4247 }, + { 0x33f5, 3, 4250 }, + { 0x33f6, 3, 4253 }, + { 0x33f7, 3, 4256 }, + { 0x33f8, 3, 4259 }, + { 0x33f9, 3, 4262 }, + { 0x33fa, 3, 4265 }, + { 0x33fb, 3, 4268 }, + { 0x33fc, 3, 4271 }, + { 0x33fd, 3, 4274 }, + { 0x33fe, 3, 4277 }, + { 0xf900, 1, 4280 }, + { 0xf901, 1, 4281 }, + { 0xf902, 1, 2840 }, + { 0xf903, 1, 4282 }, + { 0xf904, 1, 4283 }, + { 0xf905, 1, 4284 }, + { 0xf906, 1, 4285 }, + { 0xf907, 1, 2894 }, + { 0xf908, 1, 2894 }, + { 0xf909, 1, 4286 }, + { 0xf90a, 1, 2848 }, + { 0xf90b, 1, 4287 }, + { 0xf90c, 1, 4288 }, + { 0xf90d, 1, 4289 }, + { 0xf90e, 1, 4290 }, + { 0xf90f, 1, 4291 }, + { 0xf910, 1, 4292 }, + { 0xf911, 1, 4293 }, + { 0xf912, 1, 4294 }, + { 0xf913, 1, 4295 }, + { 0xf914, 1, 4296 }, + { 0xf915, 1, 4297 }, + { 0xf916, 1, 4298 }, + { 0xf917, 1, 4299 }, + { 0xf918, 1, 4300 }, + { 0xf919, 1, 4301 }, + { 0xf91a, 1, 4302 }, + { 0xf91b, 1, 4303 }, + { 0xf91c, 1, 4304 }, + { 0xf91d, 1, 4305 }, + { 0xf91e, 1, 4306 }, + { 0xf91f, 1, 4307 }, + { 0xf920, 1, 4308 }, + { 0xf921, 1, 4309 }, + { 0xf922, 1, 4310 }, + { 0xf923, 1, 4311 }, + { 0xf924, 1, 4312 }, + { 0xf925, 1, 4313 }, + { 0xf926, 1, 4314 }, + { 0xf927, 1, 4315 }, + { 0xf928, 1, 4316 }, + { 0xf929, 1, 4317 }, + { 0xf92a, 1, 4318 }, + { 0xf92b, 1, 4319 }, + { 0xf92c, 1, 4320 }, + { 0xf92d, 1, 4321 }, + { 0xf92e, 1, 4322 }, + { 0xf92f, 1, 4323 }, + { 0xf930, 1, 4324 }, + { 0xf931, 1, 4325 }, + { 0xf932, 1, 4326 }, + { 0xf933, 1, 4327 }, + { 0xf934, 1, 2806 }, + { 0xf935, 1, 4328 }, + { 0xf936, 1, 4329 }, + { 0xf937, 1, 4330 }, + { 0xf938, 1, 4331 }, + { 0xf939, 1, 4332 }, + { 0xf93a, 1, 4333 }, + { 0xf93b, 1, 4334 }, + { 0xf93c, 1, 4335 }, + { 0xf93d, 1, 4336 }, + { 0xf93e, 1, 4337 }, + { 0xf93f, 1, 4338 }, + { 0xf940, 1, 2879 }, + { 0xf941, 1, 4339 }, + { 0xf942, 1, 4340 }, + { 0xf943, 1, 4341 }, + { 0xf944, 1, 4342 }, + { 0xf945, 1, 4343 }, + { 0xf946, 1, 4344 }, + { 0xf947, 1, 4345 }, + { 0xf948, 1, 4346 }, + { 0xf949, 1, 4347 }, + { 0xf94a, 1, 4348 }, + { 0xf94b, 1, 4349 }, + { 0xf94c, 1, 4350 }, + { 0xf94d, 1, 4351 }, + { 0xf94e, 1, 4352 }, + { 0xf94f, 1, 4353 }, + { 0xf950, 1, 4354 }, + { 0xf951, 1, 4355 }, + { 0xf952, 1, 4356 }, + { 0xf953, 1, 4357 }, + { 0xf954, 1, 4358 }, + { 0xf955, 1, 4359 }, + { 0xf956, 1, 4360 }, + { 0xf957, 1, 4361 }, + { 0xf958, 1, 4362 }, + { 0xf959, 1, 4363 }, + { 0xf95a, 1, 4364 }, + { 0xf95b, 1, 4365 }, + { 0xf95c, 1, 4296 }, + { 0xf95d, 1, 4366 }, + { 0xf95e, 1, 4367 }, + { 0xf95f, 1, 4368 }, + { 0xf960, 1, 4369 }, + { 0xf961, 1, 4370 }, + { 0xf962, 1, 4371 }, + { 0xf963, 1, 4372 }, + { 0xf964, 1, 4373 }, + { 0xf965, 1, 4374 }, + { 0xf966, 1, 4375 }, + { 0xf967, 1, 4376 }, + { 0xf968, 1, 4377 }, + { 0xf969, 1, 4378 }, + { 0xf96a, 1, 4379 }, + { 0xf96b, 1, 4380 }, + { 0xf96c, 1, 4381 }, + { 0xf96d, 1, 4382 }, + { 0xf96e, 1, 4383 }, + { 0xf96f, 1, 4384 }, + { 0xf970, 1, 4385 }, + { 0xf971, 1, 2842 }, + { 0xf972, 1, 4386 }, + { 0xf973, 1, 4387 }, + { 0xf974, 1, 4388 }, + { 0xf975, 1, 4389 }, + { 0xf976, 1, 4390 }, + { 0xf977, 1, 4391 }, + { 0xf978, 1, 4392 }, + { 0xf979, 1, 4393 }, + { 0xf97a, 1, 4394 }, + { 0xf97b, 1, 4395 }, + { 0xf97c, 1, 4396 }, + { 0xf97d, 1, 4397 }, + { 0xf97e, 1, 4398 }, + { 0xf97f, 1, 4399 }, + { 0xf980, 1, 4400 }, + { 0xf981, 1, 2719 }, + { 0xf982, 1, 4401 }, + { 0xf983, 1, 4402 }, + { 0xf984, 1, 4403 }, + { 0xf985, 1, 4404 }, + { 0xf986, 1, 4405 }, + { 0xf987, 1, 4406 }, + { 0xf988, 1, 4407 }, + { 0xf989, 1, 4408 }, + { 0xf98a, 1, 2700 }, + { 0xf98b, 1, 4409 }, + { 0xf98c, 1, 4410 }, + { 0xf98d, 1, 4411 }, + { 0xf98e, 1, 4412 }, + { 0xf98f, 1, 4413 }, + { 0xf990, 1, 4414 }, + { 0xf991, 1, 4415 }, + { 0xf992, 1, 4416 }, + { 0xf993, 1, 4417 }, + { 0xf994, 1, 4418 }, + { 0xf995, 1, 4419 }, + { 0xf996, 1, 4420 }, + { 0xf997, 1, 4421 }, + { 0xf998, 1, 4422 }, + { 0xf999, 1, 4423 }, + { 0xf99a, 1, 4424 }, + { 0xf99b, 1, 4425 }, + { 0xf99c, 1, 4426 }, + { 0xf99d, 1, 4427 }, + { 0xf99e, 1, 4428 }, + { 0xf99f, 1, 4429 }, + { 0xf9a0, 1, 4430 }, + { 0xf9a1, 1, 4384 }, + { 0xf9a2, 1, 4431 }, + { 0xf9a3, 1, 4432 }, + { 0xf9a4, 1, 4433 }, + { 0xf9a5, 1, 4434 }, + { 0xf9a6, 1, 4435 }, + { 0xf9a7, 1, 4436 }, + { 0xf9a8, 1, 4437 }, + { 0xf9a9, 1, 4438 }, + { 0xf9aa, 1, 4368 }, + { 0xf9ab, 1, 4439 }, + { 0xf9ac, 1, 4440 }, + { 0xf9ad, 1, 4441 }, + { 0xf9ae, 1, 4442 }, + { 0xf9af, 1, 4443 }, + { 0xf9b0, 1, 4444 }, + { 0xf9b1, 1, 4445 }, + { 0xf9b2, 1, 4446 }, + { 0xf9b3, 1, 4447 }, + { 0xf9b4, 1, 4448 }, + { 0xf9b5, 1, 4449 }, + { 0xf9b6, 1, 4450 }, + { 0xf9b7, 1, 4451 }, + { 0xf9b8, 1, 4452 }, + { 0xf9b9, 1, 4453 }, + { 0xf9ba, 1, 4454 }, + { 0xf9bb, 1, 4455 }, + { 0xf9bc, 1, 4456 }, + { 0xf9bd, 1, 4457 }, + { 0xf9be, 1, 4458 }, + { 0xf9bf, 1, 4296 }, + { 0xf9c0, 1, 4459 }, + { 0xf9c1, 1, 4460 }, + { 0xf9c2, 1, 4461 }, + { 0xf9c3, 1, 4462 }, + { 0xf9c4, 1, 2893 }, + { 0xf9c5, 1, 4463 }, + { 0xf9c6, 1, 4464 }, + { 0xf9c7, 1, 4465 }, + { 0xf9c8, 1, 4466 }, + { 0xf9c9, 1, 4467 }, + { 0xf9ca, 1, 4468 }, + { 0xf9cb, 1, 4469 }, + { 0xf9cc, 1, 4470 }, + { 0xf9cd, 1, 4471 }, + { 0xf9ce, 1, 4472 }, + { 0xf9cf, 1, 4473 }, + { 0xf9d0, 1, 4474 }, + { 0xf9d1, 1, 3396 }, + { 0xf9d2, 1, 4475 }, + { 0xf9d3, 1, 4476 }, + { 0xf9d4, 1, 4477 }, + { 0xf9d5, 1, 4478 }, + { 0xf9d6, 1, 4479 }, + { 0xf9d7, 1, 4480 }, + { 0xf9d8, 1, 4481 }, + { 0xf9d9, 1, 4482 }, + { 0xf9da, 1, 4483 }, + { 0xf9db, 1, 4370 }, + { 0xf9dc, 1, 4484 }, + { 0xf9dd, 1, 4485 }, + { 0xf9de, 1, 4486 }, + { 0xf9df, 1, 4487 }, + { 0xf9e0, 1, 4488 }, + { 0xf9e1, 1, 4489 }, + { 0xf9e2, 1, 4490 }, + { 0xf9e3, 1, 4491 }, + { 0xf9e4, 1, 4492 }, + { 0xf9e5, 1, 4493 }, + { 0xf9e6, 1, 4494 }, + { 0xf9e7, 1, 4495 }, + { 0xf9e8, 1, 4496 }, + { 0xf9e9, 1, 2847 }, + { 0xf9ea, 1, 4497 }, + { 0xf9eb, 1, 4498 }, + { 0xf9ec, 1, 4499 }, + { 0xf9ed, 1, 4500 }, + { 0xf9ee, 1, 4501 }, + { 0xf9ef, 1, 4502 }, + { 0xf9f0, 1, 4503 }, + { 0xf9f1, 1, 4504 }, + { 0xf9f2, 1, 4505 }, + { 0xf9f3, 1, 4506 }, + { 0xf9f4, 1, 4507 }, + { 0xf9f5, 1, 4508 }, + { 0xf9f6, 1, 4509 }, + { 0xf9f7, 1, 2798 }, + { 0xf9f8, 1, 4510 }, + { 0xf9f9, 1, 4511 }, + { 0xf9fa, 1, 4512 }, + { 0xf9fb, 1, 4513 }, + { 0xf9fc, 1, 4514 }, + { 0xf9fd, 1, 4515 }, + { 0xf9fe, 1, 4516 }, + { 0xf9ff, 1, 4517 }, + { 0xfa00, 1, 4518 }, + { 0xfa01, 1, 4519 }, + { 0xfa02, 1, 4520 }, + { 0xfa03, 1, 4521 }, + { 0xfa04, 1, 4522 }, + { 0xfa05, 1, 4523 }, + { 0xfa06, 1, 4524 }, + { 0xfa07, 1, 4525 }, + { 0xfa08, 1, 2825 }, + { 0xfa09, 1, 4526 }, + { 0xfa0a, 1, 2828 }, + { 0xfa0b, 1, 4527 }, + { 0xfa0c, 1, 4528 }, + { 0xfa0d, 1, 4529 }, + { 0xfa10, 1, 4530 }, + { 0xfa12, 1, 4531 }, + { 0xfa15, 1, 4532 }, + { 0xfa16, 1, 4533 }, + { 0xfa17, 1, 4534 }, + { 0xfa18, 1, 4535 }, + { 0xfa19, 1, 4536 }, + { 0xfa1a, 1, 4537 }, + { 0xfa1b, 1, 4538 }, + { 0xfa1c, 1, 4539 }, + { 0xfa1d, 1, 4540 }, + { 0xfa1e, 1, 2805 }, + { 0xfa20, 1, 4541 }, + { 0xfa22, 1, 4542 }, + { 0xfa25, 1, 4543 }, + { 0xfa26, 1, 4544 }, + { 0xfa2a, 1, 4545 }, + { 0xfa2b, 1, 4546 }, + { 0xfa2c, 1, 4547 }, + { 0xfa2d, 1, 4548 }, + { 0xfa30, 1, 4549 }, + { 0xfa31, 1, 4550 }, + { 0xfa32, 1, 4551 }, + { 0xfa33, 1, 4552 }, + { 0xfa34, 1, 4553 }, + { 0xfa35, 1, 4554 }, + { 0xfa36, 1, 4555 }, + { 0xfa37, 1, 4556 }, + { 0xfa38, 1, 4557 }, + { 0xfa39, 1, 4558 }, + { 0xfa3a, 1, 4559 }, + { 0xfa3b, 1, 4560 }, + { 0xfa3c, 1, 2726 }, + { 0xfa3d, 1, 4561 }, + { 0xfa3e, 1, 4562 }, + { 0xfa3f, 1, 4563 }, + { 0xfa40, 1, 4564 }, + { 0xfa41, 1, 4565 }, + { 0xfa42, 1, 4566 }, + { 0xfa43, 1, 4567 }, + { 0xfa44, 1, 4568 }, + { 0xfa45, 1, 4569 }, + { 0xfa46, 1, 4570 }, + { 0xfa47, 1, 4571 }, + { 0xfa48, 1, 4572 }, + { 0xfa49, 1, 4573 }, + { 0xfa4a, 1, 4574 }, + { 0xfa4b, 1, 4575 }, + { 0xfa4c, 1, 3401 }, + { 0xfa4d, 1, 4576 }, + { 0xfa4e, 1, 4577 }, + { 0xfa4f, 1, 4578 }, + { 0xfa50, 1, 4579 }, + { 0xfa51, 1, 3405 }, + { 0xfa52, 1, 4580 }, + { 0xfa53, 1, 4581 }, + { 0xfa54, 1, 4582 }, + { 0xfa55, 1, 4583 }, + { 0xfa56, 1, 4584 }, + { 0xfa57, 1, 4420 }, + { 0xfa58, 1, 4585 }, + { 0xfa59, 1, 4586 }, + { 0xfa5a, 1, 4587 }, + { 0xfa5b, 1, 4588 }, + { 0xfa5c, 1, 4589 }, + { 0xfa5d, 1, 4590 }, + { 0xfa5e, 1, 4590 }, + { 0xfa5f, 1, 4591 }, + { 0xfa60, 1, 4592 }, + { 0xfa61, 1, 4593 }, + { 0xfa62, 1, 4594 }, + { 0xfa63, 1, 4595 }, + { 0xfa64, 1, 4596 }, + { 0xfa65, 1, 4597 }, + { 0xfa66, 1, 4598 }, + { 0xfa67, 1, 4543 }, + { 0xfa68, 1, 4599 }, + { 0xfa69, 1, 4600 }, + { 0xfa6a, 1, 4601 }, + { 0xfb00, 2, 4602 }, + { 0xfb01, 2, 4604 }, + { 0xfb02, 2, 4606 }, + { 0xfb03, 3, 4608 }, + { 0xfb04, 3, 4611 }, + { 0xfb05, 2, 4614 }, + { 0xfb06, 2, 4614 }, + { 0xfb13, 2, 4616 }, + { 0xfb14, 2, 4618 }, + { 0xfb15, 2, 4620 }, + { 0xfb16, 2, 4622 }, + { 0xfb17, 2, 4624 }, + { 0xfb1d, 2, 4626 }, + { 0xfb1f, 2, 4628 }, + { 0xfb20, 1, 4630 }, + { 0xfb21, 1, 2228 }, + { 0xfb22, 1, 2231 }, + { 0xfb23, 1, 4631 }, + { 0xfb24, 1, 4632 }, + { 0xfb25, 1, 4633 }, + { 0xfb26, 1, 4634 }, + { 0xfb27, 1, 4635 }, + { 0xfb28, 1, 4636 }, + { 0xfb29, 1, 2176 }, + { 0xfb2a, 2, 4637 }, + { 0xfb2b, 2, 4639 }, + { 0xfb2c, 3, 4641 }, + { 0xfb2d, 3, 4644 }, + { 0xfb2e, 2, 4647 }, + { 0xfb2f, 2, 4649 }, + { 0xfb30, 2, 4651 }, + { 0xfb31, 2, 4653 }, + { 0xfb32, 2, 4655 }, + { 0xfb33, 2, 4657 }, + { 0xfb34, 2, 4659 }, + { 0xfb35, 2, 4661 }, + { 0xfb36, 2, 4663 }, + { 0xfb38, 2, 4665 }, + { 0xfb39, 2, 4667 }, + { 0xfb3a, 2, 4669 }, + { 0xfb3b, 2, 4671 }, + { 0xfb3c, 2, 4673 }, + { 0xfb3e, 2, 4675 }, + { 0xfb40, 2, 4677 }, + { 0xfb41, 2, 4679 }, + { 0xfb43, 2, 4681 }, + { 0xfb44, 2, 4683 }, + { 0xfb46, 2, 4685 }, + { 0xfb47, 2, 4687 }, + { 0xfb48, 2, 4689 }, + { 0xfb49, 2, 4691 }, + { 0xfb4a, 2, 4693 }, + { 0xfb4b, 2, 4695 }, + { 0xfb4c, 2, 4697 }, + { 0xfb4d, 2, 4699 }, + { 0xfb4e, 2, 4701 }, + { 0xfb4f, 2, 4703 }, + { 0xfb50, 1, 4705 }, + { 0xfb51, 1, 4705 }, + { 0xfb52, 1, 4706 }, + { 0xfb53, 1, 4706 }, + { 0xfb54, 1, 4706 }, + { 0xfb55, 1, 4706 }, + { 0xfb56, 1, 4707 }, + { 0xfb57, 1, 4707 }, + { 0xfb58, 1, 4707 }, + { 0xfb59, 1, 4707 }, + { 0xfb5a, 1, 4708 }, + { 0xfb5b, 1, 4708 }, + { 0xfb5c, 1, 4708 }, + { 0xfb5d, 1, 4708 }, + { 0xfb5e, 1, 4709 }, + { 0xfb5f, 1, 4709 }, + { 0xfb60, 1, 4709 }, + { 0xfb61, 1, 4709 }, + { 0xfb62, 1, 4710 }, + { 0xfb63, 1, 4710 }, + { 0xfb64, 1, 4710 }, + { 0xfb65, 1, 4710 }, + { 0xfb66, 1, 4711 }, + { 0xfb67, 1, 4711 }, + { 0xfb68, 1, 4711 }, + { 0xfb69, 1, 4711 }, + { 0xfb6a, 1, 4712 }, + { 0xfb6b, 1, 4712 }, + { 0xfb6c, 1, 4712 }, + { 0xfb6d, 1, 4712 }, + { 0xfb6e, 1, 4713 }, + { 0xfb6f, 1, 4713 }, + { 0xfb70, 1, 4713 }, + { 0xfb71, 1, 4713 }, + { 0xfb72, 1, 4714 }, + { 0xfb73, 1, 4714 }, + { 0xfb74, 1, 4714 }, + { 0xfb75, 1, 4714 }, + { 0xfb76, 1, 4715 }, + { 0xfb77, 1, 4715 }, + { 0xfb78, 1, 4715 }, + { 0xfb79, 1, 4715 }, + { 0xfb7a, 1, 4716 }, + { 0xfb7b, 1, 4716 }, + { 0xfb7c, 1, 4716 }, + { 0xfb7d, 1, 4716 }, + { 0xfb7e, 1, 4717 }, + { 0xfb7f, 1, 4717 }, + { 0xfb80, 1, 4717 }, + { 0xfb81, 1, 4717 }, + { 0xfb82, 1, 4718 }, + { 0xfb83, 1, 4718 }, + { 0xfb84, 1, 4719 }, + { 0xfb85, 1, 4719 }, + { 0xfb86, 1, 4720 }, + { 0xfb87, 1, 4720 }, + { 0xfb88, 1, 4721 }, + { 0xfb89, 1, 4721 }, + { 0xfb8a, 1, 4722 }, + { 0xfb8b, 1, 4722 }, + { 0xfb8c, 1, 4723 }, + { 0xfb8d, 1, 4723 }, + { 0xfb8e, 1, 4724 }, + { 0xfb8f, 1, 4724 }, + { 0xfb90, 1, 4724 }, + { 0xfb91, 1, 4724 }, + { 0xfb92, 1, 4725 }, + { 0xfb93, 1, 4725 }, + { 0xfb94, 1, 4725 }, + { 0xfb95, 1, 4725 }, + { 0xfb96, 1, 4726 }, + { 0xfb97, 1, 4726 }, + { 0xfb98, 1, 4726 }, + { 0xfb99, 1, 4726 }, + { 0xfb9a, 1, 4727 }, + { 0xfb9b, 1, 4727 }, + { 0xfb9c, 1, 4727 }, + { 0xfb9d, 1, 4727 }, + { 0xfb9e, 1, 4728 }, + { 0xfb9f, 1, 4728 }, + { 0xfba0, 1, 4729 }, + { 0xfba1, 1, 4729 }, + { 0xfba2, 1, 4729 }, + { 0xfba3, 1, 4729 }, + { 0xfba4, 2, 802 }, + { 0xfba5, 2, 802 }, + { 0xfba6, 1, 4730 }, + { 0xfba7, 1, 4730 }, + { 0xfba8, 1, 4730 }, + { 0xfba9, 1, 4730 }, + { 0xfbaa, 1, 4731 }, + { 0xfbab, 1, 4731 }, + { 0xfbac, 1, 4731 }, + { 0xfbad, 1, 4731 }, + { 0xfbae, 1, 4732 }, + { 0xfbaf, 1, 4732 }, + { 0xfbb0, 2, 806 }, + { 0xfbb1, 2, 806 }, + { 0xfbd3, 1, 4733 }, + { 0xfbd4, 1, 4733 }, + { 0xfbd5, 1, 4733 }, + { 0xfbd6, 1, 4733 }, + { 0xfbd7, 1, 4734 }, + { 0xfbd8, 1, 4734 }, + { 0xfbd9, 1, 4735 }, + { 0xfbda, 1, 4735 }, + { 0xfbdb, 1, 4736 }, + { 0xfbdc, 1, 4736 }, + { 0xfbdd, 2, 798 }, + { 0xfbde, 1, 4737 }, + { 0xfbdf, 1, 4737 }, + { 0xfbe0, 1, 4738 }, + { 0xfbe1, 1, 4738 }, + { 0xfbe2, 1, 4739 }, + { 0xfbe3, 1, 4739 }, + { 0xfbe4, 1, 4740 }, + { 0xfbe5, 1, 4740 }, + { 0xfbe6, 1, 4740 }, + { 0xfbe7, 1, 4740 }, + { 0xfbe8, 1, 4741 }, + { 0xfbe9, 1, 4741 }, + { 0xfbea, 3, 4742 }, + { 0xfbeb, 3, 4742 }, + { 0xfbec, 3, 4745 }, + { 0xfbed, 3, 4745 }, + { 0xfbee, 3, 4748 }, + { 0xfbef, 3, 4748 }, + { 0xfbf0, 3, 4751 }, + { 0xfbf1, 3, 4751 }, + { 0xfbf2, 3, 4754 }, + { 0xfbf3, 3, 4754 }, + { 0xfbf4, 3, 4757 }, + { 0xfbf5, 3, 4757 }, + { 0xfbf6, 3, 4760 }, + { 0xfbf7, 3, 4760 }, + { 0xfbf8, 3, 4760 }, + { 0xfbf9, 3, 4763 }, + { 0xfbfa, 3, 4763 }, + { 0xfbfb, 3, 4763 }, + { 0xfbfc, 1, 4766 }, + { 0xfbfd, 1, 4766 }, + { 0xfbfe, 1, 4766 }, + { 0xfbff, 1, 4766 }, + { 0xfc00, 3, 4767 }, + { 0xfc01, 3, 4770 }, + { 0xfc02, 3, 4773 }, + { 0xfc03, 3, 4763 }, + { 0xfc04, 3, 4776 }, + { 0xfc05, 2, 4779 }, + { 0xfc06, 2, 4781 }, + { 0xfc07, 2, 4783 }, + { 0xfc08, 2, 4785 }, + { 0xfc09, 2, 4787 }, + { 0xfc0a, 2, 4789 }, + { 0xfc0b, 2, 4791 }, + { 0xfc0c, 2, 4793 }, + { 0xfc0d, 2, 4795 }, + { 0xfc0e, 2, 4797 }, + { 0xfc0f, 2, 4799 }, + { 0xfc10, 2, 4801 }, + { 0xfc11, 2, 4803 }, + { 0xfc12, 2, 4805 }, + { 0xfc13, 2, 4807 }, + { 0xfc14, 2, 4809 }, + { 0xfc15, 2, 4811 }, + { 0xfc16, 2, 4813 }, + { 0xfc17, 2, 4815 }, + { 0xfc18, 2, 4817 }, + { 0xfc19, 2, 4819 }, + { 0xfc1a, 2, 4821 }, + { 0xfc1b, 2, 4823 }, + { 0xfc1c, 2, 4825 }, + { 0xfc1d, 2, 4827 }, + { 0xfc1e, 2, 4829 }, + { 0xfc1f, 2, 4831 }, + { 0xfc20, 2, 4833 }, + { 0xfc21, 2, 4835 }, + { 0xfc22, 2, 4837 }, + { 0xfc23, 2, 4839 }, + { 0xfc24, 2, 4841 }, + { 0xfc25, 2, 4843 }, + { 0xfc26, 2, 4845 }, + { 0xfc27, 2, 4847 }, + { 0xfc28, 2, 4849 }, + { 0xfc29, 2, 4851 }, + { 0xfc2a, 2, 4853 }, + { 0xfc2b, 2, 4855 }, + { 0xfc2c, 2, 4857 }, + { 0xfc2d, 2, 4859 }, + { 0xfc2e, 2, 4861 }, + { 0xfc2f, 2, 4863 }, + { 0xfc30, 2, 4865 }, + { 0xfc31, 2, 4867 }, + { 0xfc32, 2, 4869 }, + { 0xfc33, 2, 4871 }, + { 0xfc34, 2, 4873 }, + { 0xfc35, 2, 4875 }, + { 0xfc36, 2, 4877 }, + { 0xfc37, 2, 4879 }, + { 0xfc38, 2, 4881 }, + { 0xfc39, 2, 4883 }, + { 0xfc3a, 2, 4885 }, + { 0xfc3b, 2, 4887 }, + { 0xfc3c, 2, 4889 }, + { 0xfc3d, 2, 4891 }, + { 0xfc3e, 2, 4893 }, + { 0xfc3f, 2, 4895 }, + { 0xfc40, 2, 4897 }, + { 0xfc41, 2, 4899 }, + { 0xfc42, 2, 4901 }, + { 0xfc43, 2, 4903 }, + { 0xfc44, 2, 4905 }, + { 0xfc45, 2, 4907 }, + { 0xfc46, 2, 4909 }, + { 0xfc47, 2, 4911 }, + { 0xfc48, 2, 4913 }, + { 0xfc49, 2, 4915 }, + { 0xfc4a, 2, 4917 }, + { 0xfc4b, 2, 4919 }, + { 0xfc4c, 2, 4921 }, + { 0xfc4d, 2, 4923 }, + { 0xfc4e, 2, 4925 }, + { 0xfc4f, 2, 4927 }, + { 0xfc50, 2, 4929 }, + { 0xfc51, 2, 4931 }, + { 0xfc52, 2, 4933 }, + { 0xfc53, 2, 4935 }, + { 0xfc54, 2, 4937 }, + { 0xfc55, 2, 4939 }, + { 0xfc56, 2, 4941 }, + { 0xfc57, 2, 4943 }, + { 0xfc58, 2, 4945 }, + { 0xfc59, 2, 4947 }, + { 0xfc5a, 2, 4949 }, + { 0xfc5b, 2, 4951 }, + { 0xfc5c, 2, 4953 }, + { 0xfc5d, 2, 4955 }, + { 0xfc5e, 3, 4957 }, + { 0xfc5f, 3, 4960 }, + { 0xfc60, 3, 4963 }, + { 0xfc61, 3, 4966 }, + { 0xfc62, 3, 4969 }, + { 0xfc63, 3, 4972 }, + { 0xfc64, 3, 4975 }, + { 0xfc65, 3, 4978 }, + { 0xfc66, 3, 4773 }, + { 0xfc67, 3, 4981 }, + { 0xfc68, 3, 4763 }, + { 0xfc69, 3, 4776 }, + { 0xfc6a, 2, 4984 }, + { 0xfc6b, 2, 4986 }, + { 0xfc6c, 2, 4785 }, + { 0xfc6d, 2, 4988 }, + { 0xfc6e, 2, 4787 }, + { 0xfc6f, 2, 4789 }, + { 0xfc70, 2, 4990 }, + { 0xfc71, 2, 4992 }, + { 0xfc72, 2, 4797 }, + { 0xfc73, 2, 4994 }, + { 0xfc74, 2, 4799 }, + { 0xfc75, 2, 4801 }, + { 0xfc76, 2, 4996 }, + { 0xfc77, 2, 4998 }, + { 0xfc78, 2, 4805 }, + { 0xfc79, 2, 5000 }, + { 0xfc7a, 2, 4807 }, + { 0xfc7b, 2, 4809 }, + { 0xfc7c, 2, 4867 }, + { 0xfc7d, 2, 4869 }, + { 0xfc7e, 2, 4875 }, + { 0xfc7f, 2, 4877 }, + { 0xfc80, 2, 4879 }, + { 0xfc81, 2, 4887 }, + { 0xfc82, 2, 4889 }, + { 0xfc83, 2, 4891 }, + { 0xfc84, 2, 4893 }, + { 0xfc85, 2, 4901 }, + { 0xfc86, 2, 4903 }, + { 0xfc87, 2, 4905 }, + { 0xfc88, 2, 5002 }, + { 0xfc89, 2, 4913 }, + { 0xfc8a, 2, 5004 }, + { 0xfc8b, 2, 5006 }, + { 0xfc8c, 2, 4925 }, + { 0xfc8d, 2, 5008 }, + { 0xfc8e, 2, 4927 }, + { 0xfc8f, 2, 4929 }, + { 0xfc90, 2, 4955 }, + { 0xfc91, 2, 5010 }, + { 0xfc92, 2, 5012 }, + { 0xfc93, 2, 4945 }, + { 0xfc94, 2, 5014 }, + { 0xfc95, 2, 4947 }, + { 0xfc96, 2, 4949 }, + { 0xfc97, 3, 4767 }, + { 0xfc98, 3, 4770 }, + { 0xfc99, 3, 5016 }, + { 0xfc9a, 3, 4773 }, + { 0xfc9b, 3, 5019 }, + { 0xfc9c, 2, 4779 }, + { 0xfc9d, 2, 4781 }, + { 0xfc9e, 2, 4783 }, + { 0xfc9f, 2, 4785 }, + { 0xfca0, 2, 5022 }, + { 0xfca1, 2, 4791 }, + { 0xfca2, 2, 4793 }, + { 0xfca3, 2, 4795 }, + { 0xfca4, 2, 4797 }, + { 0xfca5, 2, 5024 }, + { 0xfca6, 2, 4805 }, + { 0xfca7, 2, 4811 }, + { 0xfca8, 2, 4813 }, + { 0xfca9, 2, 4815 }, + { 0xfcaa, 2, 4817 }, + { 0xfcab, 2, 4819 }, + { 0xfcac, 2, 4823 }, + { 0xfcad, 2, 4825 }, + { 0xfcae, 2, 4827 }, + { 0xfcaf, 2, 4829 }, + { 0xfcb0, 2, 4831 }, + { 0xfcb1, 2, 4833 }, + { 0xfcb2, 2, 5026 }, + { 0xfcb3, 2, 4835 }, + { 0xfcb4, 2, 4837 }, + { 0xfcb5, 2, 4839 }, + { 0xfcb6, 2, 4841 }, + { 0xfcb7, 2, 4843 }, + { 0xfcb8, 2, 4845 }, + { 0xfcb9, 2, 4849 }, + { 0xfcba, 2, 4851 }, + { 0xfcbb, 2, 4853 }, + { 0xfcbc, 2, 4855 }, + { 0xfcbd, 2, 4857 }, + { 0xfcbe, 2, 4859 }, + { 0xfcbf, 2, 4861 }, + { 0xfcc0, 2, 4863 }, + { 0xfcc1, 2, 4865 }, + { 0xfcc2, 2, 4871 }, + { 0xfcc3, 2, 4873 }, + { 0xfcc4, 2, 4881 }, + { 0xfcc5, 2, 4883 }, + { 0xfcc6, 2, 4885 }, + { 0xfcc7, 2, 4887 }, + { 0xfcc8, 2, 4889 }, + { 0xfcc9, 2, 4895 }, + { 0xfcca, 2, 4897 }, + { 0xfccb, 2, 4899 }, + { 0xfccc, 2, 4901 }, + { 0xfccd, 2, 5028 }, + { 0xfcce, 2, 4907 }, + { 0xfccf, 2, 4909 }, + { 0xfcd0, 2, 4911 }, + { 0xfcd1, 2, 4913 }, + { 0xfcd2, 2, 4919 }, + { 0xfcd3, 2, 4921 }, + { 0xfcd4, 2, 4923 }, + { 0xfcd5, 2, 4925 }, + { 0xfcd6, 2, 5030 }, + { 0xfcd7, 2, 4931 }, + { 0xfcd8, 2, 4933 }, + { 0xfcd9, 2, 5032 }, + { 0xfcda, 2, 4939 }, + { 0xfcdb, 2, 4941 }, + { 0xfcdc, 2, 4943 }, + { 0xfcdd, 2, 4945 }, + { 0xfcde, 2, 5034 }, + { 0xfcdf, 3, 4773 }, + { 0xfce0, 3, 5019 }, + { 0xfce1, 2, 4785 }, + { 0xfce2, 2, 5022 }, + { 0xfce3, 2, 4797 }, + { 0xfce4, 2, 5024 }, + { 0xfce5, 2, 4805 }, + { 0xfce6, 2, 5036 }, + { 0xfce7, 2, 4831 }, + { 0xfce8, 2, 5038 }, + { 0xfce9, 2, 5040 }, + { 0xfcea, 2, 5042 }, + { 0xfceb, 2, 4887 }, + { 0xfcec, 2, 4889 }, + { 0xfced, 2, 4901 }, + { 0xfcee, 2, 4925 }, + { 0xfcef, 2, 5030 }, + { 0xfcf0, 2, 4945 }, + { 0xfcf1, 2, 5034 }, + { 0xfcf2, 3, 5044 }, + { 0xfcf3, 3, 5047 }, + { 0xfcf4, 3, 5050 }, + { 0xfcf5, 2, 5053 }, + { 0xfcf6, 2, 5055 }, + { 0xfcf7, 2, 5057 }, + { 0xfcf8, 2, 5059 }, + { 0xfcf9, 2, 5061 }, + { 0xfcfa, 2, 5063 }, + { 0xfcfb, 2, 5065 }, + { 0xfcfc, 2, 5067 }, + { 0xfcfd, 2, 5069 }, + { 0xfcfe, 2, 5071 }, + { 0xfcff, 2, 5073 }, + { 0xfd00, 2, 5075 }, + { 0xfd01, 2, 5077 }, + { 0xfd02, 2, 5079 }, + { 0xfd03, 2, 5081 }, + { 0xfd04, 2, 5083 }, + { 0xfd05, 2, 5085 }, + { 0xfd06, 2, 5087 }, + { 0xfd07, 2, 5089 }, + { 0xfd08, 2, 5091 }, + { 0xfd09, 2, 5093 }, + { 0xfd0a, 2, 5095 }, + { 0xfd0b, 2, 5097 }, + { 0xfd0c, 2, 5040 }, + { 0xfd0d, 2, 5099 }, + { 0xfd0e, 2, 5101 }, + { 0xfd0f, 2, 5103 }, + { 0xfd10, 2, 5105 }, + { 0xfd11, 2, 5053 }, + { 0xfd12, 2, 5055 }, + { 0xfd13, 2, 5057 }, + { 0xfd14, 2, 5059 }, + { 0xfd15, 2, 5061 }, + { 0xfd16, 2, 5063 }, + { 0xfd17, 2, 5065 }, + { 0xfd18, 2, 5067 }, + { 0xfd19, 2, 5069 }, + { 0xfd1a, 2, 5071 }, + { 0xfd1b, 2, 5073 }, + { 0xfd1c, 2, 5075 }, + { 0xfd1d, 2, 5077 }, + { 0xfd1e, 2, 5079 }, + { 0xfd1f, 2, 5081 }, + { 0xfd20, 2, 5083 }, + { 0xfd21, 2, 5085 }, + { 0xfd22, 2, 5087 }, + { 0xfd23, 2, 5089 }, + { 0xfd24, 2, 5091 }, + { 0xfd25, 2, 5093 }, + { 0xfd26, 2, 5095 }, + { 0xfd27, 2, 5097 }, + { 0xfd28, 2, 5040 }, + { 0xfd29, 2, 5099 }, + { 0xfd2a, 2, 5101 }, + { 0xfd2b, 2, 5103 }, + { 0xfd2c, 2, 5105 }, + { 0xfd2d, 2, 5093 }, + { 0xfd2e, 2, 5095 }, + { 0xfd2f, 2, 5097 }, + { 0xfd30, 2, 5040 }, + { 0xfd31, 2, 5038 }, + { 0xfd32, 2, 5042 }, + { 0xfd33, 2, 4847 }, + { 0xfd34, 2, 4825 }, + { 0xfd35, 2, 4827 }, + { 0xfd36, 2, 4829 }, + { 0xfd37, 2, 5093 }, + { 0xfd38, 2, 5095 }, + { 0xfd39, 2, 5097 }, + { 0xfd3a, 2, 4847 }, + { 0xfd3b, 2, 4849 }, + { 0xfd3c, 2, 5107 }, + { 0xfd3d, 2, 5107 }, + { 0xfd50, 3, 5109 }, + { 0xfd51, 3, 5112 }, + { 0xfd52, 3, 5112 }, + { 0xfd53, 3, 5115 }, + { 0xfd54, 3, 5118 }, + { 0xfd55, 3, 5121 }, + { 0xfd56, 3, 5124 }, + { 0xfd57, 3, 5127 }, + { 0xfd58, 3, 5130 }, + { 0xfd59, 3, 5130 }, + { 0xfd5a, 3, 5133 }, + { 0xfd5b, 3, 5136 }, + { 0xfd5c, 3, 5139 }, + { 0xfd5d, 3, 5142 }, + { 0xfd5e, 3, 5145 }, + { 0xfd5f, 3, 5148 }, + { 0xfd60, 3, 5148 }, + { 0xfd61, 3, 5151 }, + { 0xfd62, 3, 5154 }, + { 0xfd63, 3, 5154 }, + { 0xfd64, 3, 5157 }, + { 0xfd65, 3, 5157 }, + { 0xfd66, 3, 5160 }, + { 0xfd67, 3, 5163 }, + { 0xfd68, 3, 5163 }, + { 0xfd69, 3, 5166 }, + { 0xfd6a, 3, 5169 }, + { 0xfd6b, 3, 5169 }, + { 0xfd6c, 3, 5172 }, + { 0xfd6d, 3, 5172 }, + { 0xfd6e, 3, 5175 }, + { 0xfd6f, 3, 5178 }, + { 0xfd70, 3, 5178 }, + { 0xfd71, 3, 5181 }, + { 0xfd72, 3, 5181 }, + { 0xfd73, 3, 5184 }, + { 0xfd74, 3, 5187 }, + { 0xfd75, 3, 5190 }, + { 0xfd76, 3, 5193 }, + { 0xfd77, 3, 5193 }, + { 0xfd78, 3, 5196 }, + { 0xfd79, 3, 5199 }, + { 0xfd7a, 3, 5202 }, + { 0xfd7b, 3, 5205 }, + { 0xfd7c, 3, 5208 }, + { 0xfd7d, 3, 5208 }, + { 0xfd7e, 3, 5211 }, + { 0xfd7f, 3, 5214 }, + { 0xfd80, 3, 5217 }, + { 0xfd81, 3, 5220 }, + { 0xfd82, 3, 5223 }, + { 0xfd83, 3, 5226 }, + { 0xfd84, 3, 5226 }, + { 0xfd85, 3, 5229 }, + { 0xfd86, 3, 5229 }, + { 0xfd87, 3, 5232 }, + { 0xfd88, 3, 5232 }, + { 0xfd89, 3, 5235 }, + { 0xfd8a, 3, 5238 }, + { 0xfd8b, 3, 5241 }, + { 0xfd8c, 3, 5244 }, + { 0xfd8d, 3, 5247 }, + { 0xfd8e, 3, 5250 }, + { 0xfd8f, 3, 5253 }, + { 0xfd92, 3, 5256 }, + { 0xfd93, 3, 5259 }, + { 0xfd94, 3, 5262 }, + { 0xfd95, 3, 5265 }, + { 0xfd96, 3, 5268 }, + { 0xfd97, 3, 5271 }, + { 0xfd98, 3, 5271 }, + { 0xfd99, 3, 5274 }, + { 0xfd9a, 3, 5277 }, + { 0xfd9b, 3, 5280 }, + { 0xfd9c, 3, 5283 }, + { 0xfd9d, 3, 5283 }, + { 0xfd9e, 3, 5286 }, + { 0xfd9f, 3, 5289 }, + { 0xfda0, 3, 5292 }, + { 0xfda1, 3, 5295 }, + { 0xfda2, 3, 5298 }, + { 0xfda3, 3, 5301 }, + { 0xfda4, 3, 5304 }, + { 0xfda5, 3, 5307 }, + { 0xfda6, 3, 5310 }, + { 0xfda7, 3, 5313 }, + { 0xfda8, 3, 5316 }, + { 0xfda9, 3, 5319 }, + { 0xfdaa, 3, 5322 }, + { 0xfdab, 3, 5325 }, + { 0xfdac, 3, 5328 }, + { 0xfdad, 3, 5331 }, + { 0xfdae, 3, 5334 }, + { 0xfdaf, 3, 5337 }, + { 0xfdb0, 3, 5340 }, + { 0xfdb1, 3, 5343 }, + { 0xfdb2, 3, 5346 }, + { 0xfdb3, 3, 5349 }, + { 0xfdb4, 3, 5211 }, + { 0xfdb5, 3, 5217 }, + { 0xfdb6, 3, 5352 }, + { 0xfdb7, 3, 5355 }, + { 0xfdb8, 3, 5358 }, + { 0xfdb9, 3, 5361 }, + { 0xfdba, 3, 5364 }, + { 0xfdbb, 3, 5367 }, + { 0xfdbc, 3, 5364 }, + { 0xfdbd, 3, 5358 }, + { 0xfdbe, 3, 5370 }, + { 0xfdbf, 3, 5373 }, + { 0xfdc0, 3, 5376 }, + { 0xfdc1, 3, 5379 }, + { 0xfdc2, 3, 5382 }, + { 0xfdc3, 3, 5367 }, + { 0xfdc4, 3, 5190 }, + { 0xfdc5, 3, 5160 }, + { 0xfdc6, 3, 5385 }, + { 0xfdc7, 3, 5388 }, + { 0xfdf0, 3, 5391 }, + { 0xfdf1, 3, 5394 }, + { 0xfdf2, 4, 5397 }, + { 0xfdf3, 4, 5401 }, + { 0xfdf4, 4, 5405 }, + { 0xfdf5, 4, 5409 }, + { 0xfdf6, 4, 5413 }, + { 0xfdf7, 4, 5417 }, + { 0xfdf8, 4, 5421 }, + { 0xfdf9, 3, 5425 }, + { 0xfdfa, 18, 5428 }, + { 0xfdfb, 8, 5446 }, + { 0xfdfc, 4, 5454 }, + { 0xfe30, 2, 2139 }, + { 0xfe31, 1, 5458 }, + { 0xfe32, 1, 5459 }, + { 0xfe33, 1, 5460 }, + { 0xfe34, 1, 5460 }, + { 0xfe35, 1, 2179 }, + { 0xfe36, 1, 2180 }, + { 0xfe37, 1, 5461 }, + { 0xfe38, 1, 5462 }, + { 0xfe39, 1, 5463 }, + { 0xfe3a, 1, 5464 }, + { 0xfe3b, 1, 5465 }, + { 0xfe3c, 1, 5466 }, + { 0xfe3d, 1, 5467 }, + { 0xfe3e, 1, 5468 }, + { 0xfe3f, 1, 2425 }, + { 0xfe40, 1, 2426 }, + { 0xfe41, 1, 5469 }, + { 0xfe42, 1, 5470 }, + { 0xfe43, 1, 5471 }, + { 0xfe44, 1, 5472 }, + { 0xfe49, 2, 2156 }, + { 0xfe4a, 2, 2156 }, + { 0xfe4b, 2, 2156 }, + { 0xfe4c, 2, 2156 }, + { 0xfe4d, 1, 5460 }, + { 0xfe4e, 1, 5460 }, + { 0xfe4f, 1, 5460 }, + { 0xfe50, 1, 5473 }, + { 0xfe51, 1, 5474 }, + { 0xfe52, 1, 2138 }, + { 0xfe54, 1, 621 }, + { 0xfe55, 1, 5475 }, + { 0xfe56, 1, 5476 }, + { 0xfe57, 1, 5477 }, + { 0xfe58, 1, 5458 }, + { 0xfe59, 1, 2179 }, + { 0xfe5a, 1, 2180 }, + { 0xfe5b, 1, 5461 }, + { 0xfe5c, 1, 5462 }, + { 0xfe5d, 1, 5463 }, + { 0xfe5e, 1, 5464 }, + { 0xfe5f, 1, 5478 }, + { 0xfe60, 1, 5479 }, + { 0xfe61, 1, 5480 }, + { 0xfe62, 1, 2176 }, + { 0xfe63, 1, 5481 }, + { 0xfe64, 1, 5482 }, + { 0xfe65, 1, 5483 }, + { 0xfe66, 1, 2178 }, + { 0xfe68, 1, 5484 }, + { 0xfe69, 1, 5485 }, + { 0xfe6a, 1, 5486 }, + { 0xfe6b, 1, 5487 }, + { 0xfe70, 2, 5488 }, + { 0xfe71, 2, 5490 }, + { 0xfe72, 2, 5492 }, + { 0xfe74, 2, 5494 }, + { 0xfe76, 2, 5496 }, + { 0xfe77, 2, 5498 }, + { 0xfe78, 2, 5500 }, + { 0xfe79, 2, 5502 }, + { 0xfe7a, 2, 5504 }, + { 0xfe7b, 2, 5506 }, + { 0xfe7c, 2, 5508 }, + { 0xfe7d, 2, 5510 }, + { 0xfe7e, 2, 5512 }, + { 0xfe7f, 2, 5514 }, + { 0xfe80, 1, 5516 }, + { 0xfe81, 2, 784 }, + { 0xfe82, 2, 784 }, + { 0xfe83, 2, 786 }, + { 0xfe84, 2, 786 }, + { 0xfe85, 2, 788 }, + { 0xfe86, 2, 788 }, + { 0xfe87, 2, 790 }, + { 0xfe88, 2, 790 }, + { 0xfe89, 2, 792 }, + { 0xfe8a, 2, 792 }, + { 0xfe8b, 2, 792 }, + { 0xfe8c, 2, 792 }, + { 0xfe8d, 1, 5517 }, + { 0xfe8e, 1, 5517 }, + { 0xfe8f, 1, 5518 }, + { 0xfe90, 1, 5518 }, + { 0xfe91, 1, 5518 }, + { 0xfe92, 1, 5518 }, + { 0xfe93, 1, 5519 }, + { 0xfe94, 1, 5519 }, + { 0xfe95, 1, 5520 }, + { 0xfe96, 1, 5520 }, + { 0xfe97, 1, 5520 }, + { 0xfe98, 1, 5520 }, + { 0xfe99, 1, 5521 }, + { 0xfe9a, 1, 5521 }, + { 0xfe9b, 1, 5521 }, + { 0xfe9c, 1, 5521 }, + { 0xfe9d, 1, 5522 }, + { 0xfe9e, 1, 5522 }, + { 0xfe9f, 1, 5522 }, + { 0xfea0, 1, 5522 }, + { 0xfea1, 1, 5523 }, + { 0xfea2, 1, 5523 }, + { 0xfea3, 1, 5523 }, + { 0xfea4, 1, 5523 }, + { 0xfea5, 1, 5524 }, + { 0xfea6, 1, 5524 }, + { 0xfea7, 1, 5524 }, + { 0xfea8, 1, 5524 }, + { 0xfea9, 1, 5525 }, + { 0xfeaa, 1, 5525 }, + { 0xfeab, 1, 5526 }, + { 0xfeac, 1, 5526 }, + { 0xfead, 1, 5527 }, + { 0xfeae, 1, 5527 }, + { 0xfeaf, 1, 5528 }, + { 0xfeb0, 1, 5528 }, + { 0xfeb1, 1, 5529 }, + { 0xfeb2, 1, 5529 }, + { 0xfeb3, 1, 5529 }, + { 0xfeb4, 1, 5529 }, + { 0xfeb5, 1, 5530 }, + { 0xfeb6, 1, 5530 }, + { 0xfeb7, 1, 5530 }, + { 0xfeb8, 1, 5530 }, + { 0xfeb9, 1, 5531 }, + { 0xfeba, 1, 5531 }, + { 0xfebb, 1, 5531 }, + { 0xfebc, 1, 5531 }, + { 0xfebd, 1, 5532 }, + { 0xfebe, 1, 5532 }, + { 0xfebf, 1, 5532 }, + { 0xfec0, 1, 5532 }, + { 0xfec1, 1, 5533 }, + { 0xfec2, 1, 5533 }, + { 0xfec3, 1, 5533 }, + { 0xfec4, 1, 5533 }, + { 0xfec5, 1, 5534 }, + { 0xfec6, 1, 5534 }, + { 0xfec7, 1, 5534 }, + { 0xfec8, 1, 5534 }, + { 0xfec9, 1, 5535 }, + { 0xfeca, 1, 5535 }, + { 0xfecb, 1, 5535 }, + { 0xfecc, 1, 5535 }, + { 0xfecd, 1, 5536 }, + { 0xfece, 1, 5536 }, + { 0xfecf, 1, 5536 }, + { 0xfed0, 1, 5536 }, + { 0xfed1, 1, 5537 }, + { 0xfed2, 1, 5537 }, + { 0xfed3, 1, 5537 }, + { 0xfed4, 1, 5537 }, + { 0xfed5, 1, 5538 }, + { 0xfed6, 1, 5538 }, + { 0xfed7, 1, 5538 }, + { 0xfed8, 1, 5538 }, + { 0xfed9, 1, 5539 }, + { 0xfeda, 1, 5539 }, + { 0xfedb, 1, 5539 }, + { 0xfedc, 1, 5539 }, + { 0xfedd, 1, 5540 }, + { 0xfede, 1, 5540 }, + { 0xfedf, 1, 5540 }, + { 0xfee0, 1, 5540 }, + { 0xfee1, 1, 5541 }, + { 0xfee2, 1, 5541 }, + { 0xfee3, 1, 5541 }, + { 0xfee4, 1, 5541 }, + { 0xfee5, 1, 5542 }, + { 0xfee6, 1, 5542 }, + { 0xfee7, 1, 5542 }, + { 0xfee8, 1, 5542 }, + { 0xfee9, 1, 5543 }, + { 0xfeea, 1, 5543 }, + { 0xfeeb, 1, 5543 }, + { 0xfeec, 1, 5543 }, + { 0xfeed, 1, 5544 }, + { 0xfeee, 1, 5544 }, + { 0xfeef, 1, 4741 }, + { 0xfef0, 1, 4741 }, + { 0xfef1, 1, 5545 }, + { 0xfef2, 1, 5545 }, + { 0xfef3, 1, 5545 }, + { 0xfef4, 1, 5545 }, + { 0xfef5, 3, 5546 }, + { 0xfef6, 3, 5546 }, + { 0xfef7, 3, 5549 }, + { 0xfef8, 3, 5549 }, + { 0xfef9, 3, 5552 }, + { 0xfefa, 3, 5552 }, + { 0xfefb, 2, 5555 }, + { 0xfefc, 2, 5555 }, + { 0xff01, 1, 5477 }, + { 0xff02, 1, 5557 }, + { 0xff03, 1, 5478 }, + { 0xff04, 1, 5485 }, + { 0xff05, 1, 5486 }, + { 0xff06, 1, 5479 }, + { 0xff07, 1, 5558 }, + { 0xff08, 1, 2179 }, + { 0xff09, 1, 2180 }, + { 0xff0a, 1, 5480 }, + { 0xff0b, 1, 2176 }, + { 0xff0c, 1, 5473 }, + { 0xff0d, 1, 5481 }, + { 0xff0e, 1, 2138 }, + { 0xff0f, 1, 5559 }, + { 0xff10, 1, 2168 }, + { 0xff11, 1, 13 }, + { 0xff12, 1, 6 }, + { 0xff13, 1, 7 }, + { 0xff14, 1, 2170 }, + { 0xff15, 1, 2171 }, + { 0xff16, 1, 2172 }, + { 0xff17, 1, 2173 }, + { 0xff18, 1, 2174 }, + { 0xff19, 1, 2175 }, + { 0xff1a, 1, 5475 }, + { 0xff1b, 1, 621 }, + { 0xff1c, 1, 5482 }, + { 0xff1d, 1, 2178 }, + { 0xff1e, 1, 5483 }, + { 0xff1f, 1, 5476 }, + { 0xff20, 1, 5487 }, + { 0xff21, 1, 2649 }, + { 0xff22, 1, 2223 }, + { 0xff23, 1, 2190 }, + { 0xff24, 1, 2236 }, + { 0xff25, 1, 2225 }, + { 0xff26, 1, 2226 }, + { 0xff27, 1, 2650 }, + { 0xff28, 1, 2203 }, + { 0xff29, 1, 2205 }, + { 0xff2a, 1, 2651 }, + { 0xff2b, 1, 2222 }, + { 0xff2c, 1, 2206 }, + { 0xff2d, 1, 2227 }, + { 0xff2e, 1, 2207 }, + { 0xff2f, 1, 2652 }, + { 0xff30, 1, 2210 }, + { 0xff31, 1, 2211 }, + { 0xff32, 1, 2212 }, + { 0xff33, 1, 2653 }, + { 0xff34, 1, 2654 }, + { 0xff35, 1, 2655 }, + { 0xff36, 1, 2283 }, + { 0xff37, 1, 2656 }, + { 0xff38, 1, 2295 }, + { 0xff39, 1, 2657 }, + { 0xff3a, 1, 2220 }, + { 0xff3b, 1, 5560 }, + { 0xff3c, 1, 5484 }, + { 0xff3d, 1, 5561 }, + { 0xff3e, 1, 5562 }, + { 0xff3f, 1, 5460 }, + { 0xff40, 1, 2113 }, + { 0xff41, 1, 3 }, + { 0xff42, 1, 2658 }, + { 0xff43, 1, 2325 }, + { 0xff44, 1, 2237 }, + { 0xff45, 1, 2224 }, + { 0xff46, 1, 2659 }, + { 0xff47, 1, 2202 }, + { 0xff48, 1, 588 }, + { 0xff49, 1, 2169 }, + { 0xff4a, 1, 590 }, + { 0xff4b, 1, 2660 }, + { 0xff4c, 1, 610 }, + { 0xff4d, 1, 2326 }, + { 0xff4e, 1, 2181 }, + { 0xff4f, 1, 14 }, + { 0xff50, 1, 2661 }, + { 0xff51, 1, 2662 }, + { 0xff52, 1, 591 }, + { 0xff53, 1, 356 }, + { 0xff54, 1, 2663 }, + { 0xff55, 1, 2664 }, + { 0xff56, 1, 2308 }, + { 0xff57, 1, 595 }, + { 0xff58, 1, 611 }, + { 0xff59, 1, 596 }, + { 0xff5a, 1, 2665 }, + { 0xff5b, 1, 5461 }, + { 0xff5c, 1, 5563 }, + { 0xff5d, 1, 5462 }, + { 0xff5e, 1, 5564 }, + { 0xff5f, 1, 5565 }, + { 0xff60, 1, 5566 }, + { 0xff61, 1, 5567 }, + { 0xff62, 1, 5469 }, + { 0xff63, 1, 5470 }, + { 0xff64, 1, 5474 }, + { 0xff65, 1, 5568 }, + { 0xff66, 1, 3530 }, + { 0xff67, 1, 5569 }, + { 0xff68, 1, 5570 }, + { 0xff69, 1, 5571 }, + { 0xff6a, 1, 5572 }, + { 0xff6b, 1, 5573 }, + { 0xff6c, 1, 5574 }, + { 0xff6d, 1, 5575 }, + { 0xff6e, 1, 5576 }, + { 0xff6f, 1, 5577 }, + { 0xff70, 1, 5578 }, + { 0xff71, 1, 3484 }, + { 0xff72, 1, 3485 }, + { 0xff73, 1, 3486 }, + { 0xff74, 1, 3487 }, + { 0xff75, 1, 3488 }, + { 0xff76, 1, 3489 }, + { 0xff77, 1, 3490 }, + { 0xff78, 1, 3491 }, + { 0xff79, 1, 3492 }, + { 0xff7a, 1, 3493 }, + { 0xff7b, 1, 3494 }, + { 0xff7c, 1, 3495 }, + { 0xff7d, 1, 3496 }, + { 0xff7e, 1, 3497 }, + { 0xff7f, 1, 3498 }, + { 0xff80, 1, 3499 }, + { 0xff81, 1, 3500 }, + { 0xff82, 1, 3501 }, + { 0xff83, 1, 3502 }, + { 0xff84, 1, 3503 }, + { 0xff85, 1, 3504 }, + { 0xff86, 1, 3505 }, + { 0xff87, 1, 3506 }, + { 0xff88, 1, 3507 }, + { 0xff89, 1, 3508 }, + { 0xff8a, 1, 3509 }, + { 0xff8b, 1, 3510 }, + { 0xff8c, 1, 3511 }, + { 0xff8d, 1, 3512 }, + { 0xff8e, 1, 3513 }, + { 0xff8f, 1, 3514 }, + { 0xff90, 1, 3515 }, + { 0xff91, 1, 3516 }, + { 0xff92, 1, 3517 }, + { 0xff93, 1, 3518 }, + { 0xff94, 1, 3519 }, + { 0xff95, 1, 3520 }, + { 0xff96, 1, 3521 }, + { 0xff97, 1, 3522 }, + { 0xff98, 1, 3523 }, + { 0xff99, 1, 3524 }, + { 0xff9a, 1, 3525 }, + { 0xff9b, 1, 3526 }, + { 0xff9c, 1, 3527 }, + { 0xff9d, 1, 5579 }, + { 0xff9e, 1, 5580 }, + { 0xff9f, 1, 5581 }, + { 0xffa0, 1, 3074 }, + { 0xffa1, 1, 3023 }, + { 0xffa2, 1, 3024 }, + { 0xffa3, 1, 3025 }, + { 0xffa4, 1, 3026 }, + { 0xffa5, 1, 3027 }, + { 0xffa6, 1, 3028 }, + { 0xffa7, 1, 3029 }, + { 0xffa8, 1, 3030 }, + { 0xffa9, 1, 3031 }, + { 0xffaa, 1, 3032 }, + { 0xffab, 1, 3033 }, + { 0xffac, 1, 3034 }, + { 0xffad, 1, 3035 }, + { 0xffae, 1, 3036 }, + { 0xffaf, 1, 3037 }, + { 0xffb0, 1, 3038 }, + { 0xffb1, 1, 3039 }, + { 0xffb2, 1, 3040 }, + { 0xffb3, 1, 3041 }, + { 0xffb4, 1, 3042 }, + { 0xffb5, 1, 3043 }, + { 0xffb6, 1, 3044 }, + { 0xffb7, 1, 3045 }, + { 0xffb8, 1, 3046 }, + { 0xffb9, 1, 3047 }, + { 0xffba, 1, 3048 }, + { 0xffbb, 1, 3049 }, + { 0xffbc, 1, 3050 }, + { 0xffbd, 1, 3051 }, + { 0xffbe, 1, 3052 }, + { 0xffc2, 1, 3053 }, + { 0xffc3, 1, 3054 }, + { 0xffc4, 1, 3055 }, + { 0xffc5, 1, 3056 }, + { 0xffc6, 1, 3057 }, + { 0xffc7, 1, 3058 }, + { 0xffca, 1, 3059 }, + { 0xffcb, 1, 3060 }, + { 0xffcc, 1, 3061 }, + { 0xffcd, 1, 3062 }, + { 0xffce, 1, 3063 }, + { 0xffcf, 1, 3064 }, + { 0xffd2, 1, 3065 }, + { 0xffd3, 1, 3066 }, + { 0xffd4, 1, 3067 }, + { 0xffd5, 1, 3068 }, + { 0xffd6, 1, 3069 }, + { 0xffd7, 1, 3070 }, + { 0xffda, 1, 3071 }, + { 0xffdb, 1, 3072 }, + { 0xffdc, 1, 3073 }, + { 0xffe0, 1, 5582 }, + { 0xffe1, 1, 5583 }, + { 0xffe2, 1, 5584 }, + { 0xffe3, 2, 4 }, + { 0xffe4, 1, 5585 }, + { 0xffe5, 1, 5586 }, + { 0xffe6, 1, 5587 }, + { 0xffe8, 1, 5588 }, + { 0xffe9, 1, 5589 }, + { 0xffea, 1, 5590 }, + { 0xffeb, 1, 5591 }, + { 0xffec, 1, 5592 }, + { 0xffed, 1, 5593 }, + { 0xffee, 1, 5594 }, + { 0x1d15e, 2, 5595 }, + { 0x1d15f, 2, 5597 }, + { 0x1d160, 3, 5599 }, + { 0x1d161, 3, 5602 }, + { 0x1d162, 3, 5605 }, + { 0x1d163, 3, 5608 }, + { 0x1d164, 3, 5611 }, + { 0x1d1bb, 2, 5614 }, + { 0x1d1bc, 2, 5616 }, + { 0x1d1bd, 3, 5618 }, + { 0x1d1be, 3, 5621 }, + { 0x1d1bf, 3, 5624 }, + { 0x1d1c0, 3, 5627 }, + { 0x1d400, 1, 2649 }, + { 0x1d401, 1, 2223 }, + { 0x1d402, 1, 2190 }, + { 0x1d403, 1, 2236 }, + { 0x1d404, 1, 2225 }, + { 0x1d405, 1, 2226 }, + { 0x1d406, 1, 2650 }, + { 0x1d407, 1, 2203 }, + { 0x1d408, 1, 2205 }, + { 0x1d409, 1, 2651 }, + { 0x1d40a, 1, 2222 }, + { 0x1d40b, 1, 2206 }, + { 0x1d40c, 1, 2227 }, + { 0x1d40d, 1, 2207 }, + { 0x1d40e, 1, 2652 }, + { 0x1d40f, 1, 2210 }, + { 0x1d410, 1, 2211 }, + { 0x1d411, 1, 2212 }, + { 0x1d412, 1, 2653 }, + { 0x1d413, 1, 2654 }, + { 0x1d414, 1, 2655 }, + { 0x1d415, 1, 2283 }, + { 0x1d416, 1, 2656 }, + { 0x1d417, 1, 2295 }, + { 0x1d418, 1, 2657 }, + { 0x1d419, 1, 2220 }, + { 0x1d41a, 1, 3 }, + { 0x1d41b, 1, 2658 }, + { 0x1d41c, 1, 2325 }, + { 0x1d41d, 1, 2237 }, + { 0x1d41e, 1, 2224 }, + { 0x1d41f, 1, 2659 }, + { 0x1d420, 1, 2202 }, + { 0x1d421, 1, 588 }, + { 0x1d422, 1, 2169 }, + { 0x1d423, 1, 590 }, + { 0x1d424, 1, 2660 }, + { 0x1d425, 1, 610 }, + { 0x1d426, 1, 2326 }, + { 0x1d427, 1, 2181 }, + { 0x1d428, 1, 14 }, + { 0x1d429, 1, 2661 }, + { 0x1d42a, 1, 2662 }, + { 0x1d42b, 1, 591 }, + { 0x1d42c, 1, 356 }, + { 0x1d42d, 1, 2663 }, + { 0x1d42e, 1, 2664 }, + { 0x1d42f, 1, 2308 }, + { 0x1d430, 1, 595 }, + { 0x1d431, 1, 611 }, + { 0x1d432, 1, 596 }, + { 0x1d433, 1, 2665 }, + { 0x1d434, 1, 2649 }, + { 0x1d435, 1, 2223 }, + { 0x1d436, 1, 2190 }, + { 0x1d437, 1, 2236 }, + { 0x1d438, 1, 2225 }, + { 0x1d439, 1, 2226 }, + { 0x1d43a, 1, 2650 }, + { 0x1d43b, 1, 2203 }, + { 0x1d43c, 1, 2205 }, + { 0x1d43d, 1, 2651 }, + { 0x1d43e, 1, 2222 }, + { 0x1d43f, 1, 2206 }, + { 0x1d440, 1, 2227 }, + { 0x1d441, 1, 2207 }, + { 0x1d442, 1, 2652 }, + { 0x1d443, 1, 2210 }, + { 0x1d444, 1, 2211 }, + { 0x1d445, 1, 2212 }, + { 0x1d446, 1, 2653 }, + { 0x1d447, 1, 2654 }, + { 0x1d448, 1, 2655 }, + { 0x1d449, 1, 2283 }, + { 0x1d44a, 1, 2656 }, + { 0x1d44b, 1, 2295 }, + { 0x1d44c, 1, 2657 }, + { 0x1d44d, 1, 2220 }, + { 0x1d44e, 1, 3 }, + { 0x1d44f, 1, 2658 }, + { 0x1d450, 1, 2325 }, + { 0x1d451, 1, 2237 }, + { 0x1d452, 1, 2224 }, + { 0x1d453, 1, 2659 }, + { 0x1d454, 1, 2202 }, + { 0x1d456, 1, 2169 }, + { 0x1d457, 1, 590 }, + { 0x1d458, 1, 2660 }, + { 0x1d459, 1, 610 }, + { 0x1d45a, 1, 2326 }, + { 0x1d45b, 1, 2181 }, + { 0x1d45c, 1, 14 }, + { 0x1d45d, 1, 2661 }, + { 0x1d45e, 1, 2662 }, + { 0x1d45f, 1, 591 }, + { 0x1d460, 1, 356 }, + { 0x1d461, 1, 2663 }, + { 0x1d462, 1, 2664 }, + { 0x1d463, 1, 2308 }, + { 0x1d464, 1, 595 }, + { 0x1d465, 1, 611 }, + { 0x1d466, 1, 596 }, + { 0x1d467, 1, 2665 }, + { 0x1d468, 1, 2649 }, + { 0x1d469, 1, 2223 }, + { 0x1d46a, 1, 2190 }, + { 0x1d46b, 1, 2236 }, + { 0x1d46c, 1, 2225 }, + { 0x1d46d, 1, 2226 }, + { 0x1d46e, 1, 2650 }, + { 0x1d46f, 1, 2203 }, + { 0x1d470, 1, 2205 }, + { 0x1d471, 1, 2651 }, + { 0x1d472, 1, 2222 }, + { 0x1d473, 1, 2206 }, + { 0x1d474, 1, 2227 }, + { 0x1d475, 1, 2207 }, + { 0x1d476, 1, 2652 }, + { 0x1d477, 1, 2210 }, + { 0x1d478, 1, 2211 }, + { 0x1d479, 1, 2212 }, + { 0x1d47a, 1, 2653 }, + { 0x1d47b, 1, 2654 }, + { 0x1d47c, 1, 2655 }, + { 0x1d47d, 1, 2283 }, + { 0x1d47e, 1, 2656 }, + { 0x1d47f, 1, 2295 }, + { 0x1d480, 1, 2657 }, + { 0x1d481, 1, 2220 }, + { 0x1d482, 1, 3 }, + { 0x1d483, 1, 2658 }, + { 0x1d484, 1, 2325 }, + { 0x1d485, 1, 2237 }, + { 0x1d486, 1, 2224 }, + { 0x1d487, 1, 2659 }, + { 0x1d488, 1, 2202 }, + { 0x1d489, 1, 588 }, + { 0x1d48a, 1, 2169 }, + { 0x1d48b, 1, 590 }, + { 0x1d48c, 1, 2660 }, + { 0x1d48d, 1, 610 }, + { 0x1d48e, 1, 2326 }, + { 0x1d48f, 1, 2181 }, + { 0x1d490, 1, 14 }, + { 0x1d491, 1, 2661 }, + { 0x1d492, 1, 2662 }, + { 0x1d493, 1, 591 }, + { 0x1d494, 1, 356 }, + { 0x1d495, 1, 2663 }, + { 0x1d496, 1, 2664 }, + { 0x1d497, 1, 2308 }, + { 0x1d498, 1, 595 }, + { 0x1d499, 1, 611 }, + { 0x1d49a, 1, 596 }, + { 0x1d49b, 1, 2665 }, + { 0x1d49c, 1, 2649 }, + { 0x1d49e, 1, 2190 }, + { 0x1d49f, 1, 2236 }, + { 0x1d4a2, 1, 2650 }, + { 0x1d4a5, 1, 2651 }, + { 0x1d4a6, 1, 2222 }, + { 0x1d4a9, 1, 2207 }, + { 0x1d4aa, 1, 2652 }, + { 0x1d4ab, 1, 2210 }, + { 0x1d4ac, 1, 2211 }, + { 0x1d4ae, 1, 2653 }, + { 0x1d4af, 1, 2654 }, + { 0x1d4b0, 1, 2655 }, + { 0x1d4b1, 1, 2283 }, + { 0x1d4b2, 1, 2656 }, + { 0x1d4b3, 1, 2295 }, + { 0x1d4b4, 1, 2657 }, + { 0x1d4b5, 1, 2220 }, + { 0x1d4b6, 1, 3 }, + { 0x1d4b7, 1, 2658 }, + { 0x1d4b8, 1, 2325 }, + { 0x1d4b9, 1, 2237 }, + { 0x1d4bb, 1, 2659 }, + { 0x1d4bd, 1, 588 }, + { 0x1d4be, 1, 2169 }, + { 0x1d4bf, 1, 590 }, + { 0x1d4c0, 1, 2660 }, + { 0x1d4c2, 1, 2326 }, + { 0x1d4c3, 1, 2181 }, + { 0x1d4c5, 1, 2661 }, + { 0x1d4c6, 1, 2662 }, + { 0x1d4c7, 1, 591 }, + { 0x1d4c8, 1, 356 }, + { 0x1d4c9, 1, 2663 }, + { 0x1d4ca, 1, 2664 }, + { 0x1d4cb, 1, 2308 }, + { 0x1d4cc, 1, 595 }, + { 0x1d4cd, 1, 611 }, + { 0x1d4ce, 1, 596 }, + { 0x1d4cf, 1, 2665 }, + { 0x1d4d0, 1, 2649 }, + { 0x1d4d1, 1, 2223 }, + { 0x1d4d2, 1, 2190 }, + { 0x1d4d3, 1, 2236 }, + { 0x1d4d4, 1, 2225 }, + { 0x1d4d5, 1, 2226 }, + { 0x1d4d6, 1, 2650 }, + { 0x1d4d7, 1, 2203 }, + { 0x1d4d8, 1, 2205 }, + { 0x1d4d9, 1, 2651 }, + { 0x1d4da, 1, 2222 }, + { 0x1d4db, 1, 2206 }, + { 0x1d4dc, 1, 2227 }, + { 0x1d4dd, 1, 2207 }, + { 0x1d4de, 1, 2652 }, + { 0x1d4df, 1, 2210 }, + { 0x1d4e0, 1, 2211 }, + { 0x1d4e1, 1, 2212 }, + { 0x1d4e2, 1, 2653 }, + { 0x1d4e3, 1, 2654 }, + { 0x1d4e4, 1, 2655 }, + { 0x1d4e5, 1, 2283 }, + { 0x1d4e6, 1, 2656 }, + { 0x1d4e7, 1, 2295 }, + { 0x1d4e8, 1, 2657 }, + { 0x1d4e9, 1, 2220 }, + { 0x1d4ea, 1, 3 }, + { 0x1d4eb, 1, 2658 }, + { 0x1d4ec, 1, 2325 }, + { 0x1d4ed, 1, 2237 }, + { 0x1d4ee, 1, 2224 }, + { 0x1d4ef, 1, 2659 }, + { 0x1d4f0, 1, 2202 }, + { 0x1d4f1, 1, 588 }, + { 0x1d4f2, 1, 2169 }, + { 0x1d4f3, 1, 590 }, + { 0x1d4f4, 1, 2660 }, + { 0x1d4f5, 1, 610 }, + { 0x1d4f6, 1, 2326 }, + { 0x1d4f7, 1, 2181 }, + { 0x1d4f8, 1, 14 }, + { 0x1d4f9, 1, 2661 }, + { 0x1d4fa, 1, 2662 }, + { 0x1d4fb, 1, 591 }, + { 0x1d4fc, 1, 356 }, + { 0x1d4fd, 1, 2663 }, + { 0x1d4fe, 1, 2664 }, + { 0x1d4ff, 1, 2308 }, + { 0x1d500, 1, 595 }, + { 0x1d501, 1, 611 }, + { 0x1d502, 1, 596 }, + { 0x1d503, 1, 2665 }, + { 0x1d504, 1, 2649 }, + { 0x1d505, 1, 2223 }, + { 0x1d507, 1, 2236 }, + { 0x1d508, 1, 2225 }, + { 0x1d509, 1, 2226 }, + { 0x1d50a, 1, 2650 }, + { 0x1d50d, 1, 2651 }, + { 0x1d50e, 1, 2222 }, + { 0x1d50f, 1, 2206 }, + { 0x1d510, 1, 2227 }, + { 0x1d511, 1, 2207 }, + { 0x1d512, 1, 2652 }, + { 0x1d513, 1, 2210 }, + { 0x1d514, 1, 2211 }, + { 0x1d516, 1, 2653 }, + { 0x1d517, 1, 2654 }, + { 0x1d518, 1, 2655 }, + { 0x1d519, 1, 2283 }, + { 0x1d51a, 1, 2656 }, + { 0x1d51b, 1, 2295 }, + { 0x1d51c, 1, 2657 }, + { 0x1d51e, 1, 3 }, + { 0x1d51f, 1, 2658 }, + { 0x1d520, 1, 2325 }, + { 0x1d521, 1, 2237 }, + { 0x1d522, 1, 2224 }, + { 0x1d523, 1, 2659 }, + { 0x1d524, 1, 2202 }, + { 0x1d525, 1, 588 }, + { 0x1d526, 1, 2169 }, + { 0x1d527, 1, 590 }, + { 0x1d528, 1, 2660 }, + { 0x1d529, 1, 610 }, + { 0x1d52a, 1, 2326 }, + { 0x1d52b, 1, 2181 }, + { 0x1d52c, 1, 14 }, + { 0x1d52d, 1, 2661 }, + { 0x1d52e, 1, 2662 }, + { 0x1d52f, 1, 591 }, + { 0x1d530, 1, 356 }, + { 0x1d531, 1, 2663 }, + { 0x1d532, 1, 2664 }, + { 0x1d533, 1, 2308 }, + { 0x1d534, 1, 595 }, + { 0x1d535, 1, 611 }, + { 0x1d536, 1, 596 }, + { 0x1d537, 1, 2665 }, + { 0x1d538, 1, 2649 }, + { 0x1d539, 1, 2223 }, + { 0x1d53b, 1, 2236 }, + { 0x1d53c, 1, 2225 }, + { 0x1d53d, 1, 2226 }, + { 0x1d53e, 1, 2650 }, + { 0x1d540, 1, 2205 }, + { 0x1d541, 1, 2651 }, + { 0x1d542, 1, 2222 }, + { 0x1d543, 1, 2206 }, + { 0x1d544, 1, 2227 }, + { 0x1d546, 1, 2652 }, + { 0x1d54a, 1, 2653 }, + { 0x1d54b, 1, 2654 }, + { 0x1d54c, 1, 2655 }, + { 0x1d54d, 1, 2283 }, + { 0x1d54e, 1, 2656 }, + { 0x1d54f, 1, 2295 }, + { 0x1d550, 1, 2657 }, + { 0x1d552, 1, 3 }, + { 0x1d553, 1, 2658 }, + { 0x1d554, 1, 2325 }, + { 0x1d555, 1, 2237 }, + { 0x1d556, 1, 2224 }, + { 0x1d557, 1, 2659 }, + { 0x1d558, 1, 2202 }, + { 0x1d559, 1, 588 }, + { 0x1d55a, 1, 2169 }, + { 0x1d55b, 1, 590 }, + { 0x1d55c, 1, 2660 }, + { 0x1d55d, 1, 610 }, + { 0x1d55e, 1, 2326 }, + { 0x1d55f, 1, 2181 }, + { 0x1d560, 1, 14 }, + { 0x1d561, 1, 2661 }, + { 0x1d562, 1, 2662 }, + { 0x1d563, 1, 591 }, + { 0x1d564, 1, 356 }, + { 0x1d565, 1, 2663 }, + { 0x1d566, 1, 2664 }, + { 0x1d567, 1, 2308 }, + { 0x1d568, 1, 595 }, + { 0x1d569, 1, 611 }, + { 0x1d56a, 1, 596 }, + { 0x1d56b, 1, 2665 }, + { 0x1d56c, 1, 2649 }, + { 0x1d56d, 1, 2223 }, + { 0x1d56e, 1, 2190 }, + { 0x1d56f, 1, 2236 }, + { 0x1d570, 1, 2225 }, + { 0x1d571, 1, 2226 }, + { 0x1d572, 1, 2650 }, + { 0x1d573, 1, 2203 }, + { 0x1d574, 1, 2205 }, + { 0x1d575, 1, 2651 }, + { 0x1d576, 1, 2222 }, + { 0x1d577, 1, 2206 }, + { 0x1d578, 1, 2227 }, + { 0x1d579, 1, 2207 }, + { 0x1d57a, 1, 2652 }, + { 0x1d57b, 1, 2210 }, + { 0x1d57c, 1, 2211 }, + { 0x1d57d, 1, 2212 }, + { 0x1d57e, 1, 2653 }, + { 0x1d57f, 1, 2654 }, + { 0x1d580, 1, 2655 }, + { 0x1d581, 1, 2283 }, + { 0x1d582, 1, 2656 }, + { 0x1d583, 1, 2295 }, + { 0x1d584, 1, 2657 }, + { 0x1d585, 1, 2220 }, + { 0x1d586, 1, 3 }, + { 0x1d587, 1, 2658 }, + { 0x1d588, 1, 2325 }, + { 0x1d589, 1, 2237 }, + { 0x1d58a, 1, 2224 }, + { 0x1d58b, 1, 2659 }, + { 0x1d58c, 1, 2202 }, + { 0x1d58d, 1, 588 }, + { 0x1d58e, 1, 2169 }, + { 0x1d58f, 1, 590 }, + { 0x1d590, 1, 2660 }, + { 0x1d591, 1, 610 }, + { 0x1d592, 1, 2326 }, + { 0x1d593, 1, 2181 }, + { 0x1d594, 1, 14 }, + { 0x1d595, 1, 2661 }, + { 0x1d596, 1, 2662 }, + { 0x1d597, 1, 591 }, + { 0x1d598, 1, 356 }, + { 0x1d599, 1, 2663 }, + { 0x1d59a, 1, 2664 }, + { 0x1d59b, 1, 2308 }, + { 0x1d59c, 1, 595 }, + { 0x1d59d, 1, 611 }, + { 0x1d59e, 1, 596 }, + { 0x1d59f, 1, 2665 }, + { 0x1d5a0, 1, 2649 }, + { 0x1d5a1, 1, 2223 }, + { 0x1d5a2, 1, 2190 }, + { 0x1d5a3, 1, 2236 }, + { 0x1d5a4, 1, 2225 }, + { 0x1d5a5, 1, 2226 }, + { 0x1d5a6, 1, 2650 }, + { 0x1d5a7, 1, 2203 }, + { 0x1d5a8, 1, 2205 }, + { 0x1d5a9, 1, 2651 }, + { 0x1d5aa, 1, 2222 }, + { 0x1d5ab, 1, 2206 }, + { 0x1d5ac, 1, 2227 }, + { 0x1d5ad, 1, 2207 }, + { 0x1d5ae, 1, 2652 }, + { 0x1d5af, 1, 2210 }, + { 0x1d5b0, 1, 2211 }, + { 0x1d5b1, 1, 2212 }, + { 0x1d5b2, 1, 2653 }, + { 0x1d5b3, 1, 2654 }, + { 0x1d5b4, 1, 2655 }, + { 0x1d5b5, 1, 2283 }, + { 0x1d5b6, 1, 2656 }, + { 0x1d5b7, 1, 2295 }, + { 0x1d5b8, 1, 2657 }, + { 0x1d5b9, 1, 2220 }, + { 0x1d5ba, 1, 3 }, + { 0x1d5bb, 1, 2658 }, + { 0x1d5bc, 1, 2325 }, + { 0x1d5bd, 1, 2237 }, + { 0x1d5be, 1, 2224 }, + { 0x1d5bf, 1, 2659 }, + { 0x1d5c0, 1, 2202 }, + { 0x1d5c1, 1, 588 }, + { 0x1d5c2, 1, 2169 }, + { 0x1d5c3, 1, 590 }, + { 0x1d5c4, 1, 2660 }, + { 0x1d5c5, 1, 610 }, + { 0x1d5c6, 1, 2326 }, + { 0x1d5c7, 1, 2181 }, + { 0x1d5c8, 1, 14 }, + { 0x1d5c9, 1, 2661 }, + { 0x1d5ca, 1, 2662 }, + { 0x1d5cb, 1, 591 }, + { 0x1d5cc, 1, 356 }, + { 0x1d5cd, 1, 2663 }, + { 0x1d5ce, 1, 2664 }, + { 0x1d5cf, 1, 2308 }, + { 0x1d5d0, 1, 595 }, + { 0x1d5d1, 1, 611 }, + { 0x1d5d2, 1, 596 }, + { 0x1d5d3, 1, 2665 }, + { 0x1d5d4, 1, 2649 }, + { 0x1d5d5, 1, 2223 }, + { 0x1d5d6, 1, 2190 }, + { 0x1d5d7, 1, 2236 }, + { 0x1d5d8, 1, 2225 }, + { 0x1d5d9, 1, 2226 }, + { 0x1d5da, 1, 2650 }, + { 0x1d5db, 1, 2203 }, + { 0x1d5dc, 1, 2205 }, + { 0x1d5dd, 1, 2651 }, + { 0x1d5de, 1, 2222 }, + { 0x1d5df, 1, 2206 }, + { 0x1d5e0, 1, 2227 }, + { 0x1d5e1, 1, 2207 }, + { 0x1d5e2, 1, 2652 }, + { 0x1d5e3, 1, 2210 }, + { 0x1d5e4, 1, 2211 }, + { 0x1d5e5, 1, 2212 }, + { 0x1d5e6, 1, 2653 }, + { 0x1d5e7, 1, 2654 }, + { 0x1d5e8, 1, 2655 }, + { 0x1d5e9, 1, 2283 }, + { 0x1d5ea, 1, 2656 }, + { 0x1d5eb, 1, 2295 }, + { 0x1d5ec, 1, 2657 }, + { 0x1d5ed, 1, 2220 }, + { 0x1d5ee, 1, 3 }, + { 0x1d5ef, 1, 2658 }, + { 0x1d5f0, 1, 2325 }, + { 0x1d5f1, 1, 2237 }, + { 0x1d5f2, 1, 2224 }, + { 0x1d5f3, 1, 2659 }, + { 0x1d5f4, 1, 2202 }, + { 0x1d5f5, 1, 588 }, + { 0x1d5f6, 1, 2169 }, + { 0x1d5f7, 1, 590 }, + { 0x1d5f8, 1, 2660 }, + { 0x1d5f9, 1, 610 }, + { 0x1d5fa, 1, 2326 }, + { 0x1d5fb, 1, 2181 }, + { 0x1d5fc, 1, 14 }, + { 0x1d5fd, 1, 2661 }, + { 0x1d5fe, 1, 2662 }, + { 0x1d5ff, 1, 591 }, + { 0x1d600, 1, 356 }, + { 0x1d601, 1, 2663 }, + { 0x1d602, 1, 2664 }, + { 0x1d603, 1, 2308 }, + { 0x1d604, 1, 595 }, + { 0x1d605, 1, 611 }, + { 0x1d606, 1, 596 }, + { 0x1d607, 1, 2665 }, + { 0x1d608, 1, 2649 }, + { 0x1d609, 1, 2223 }, + { 0x1d60a, 1, 2190 }, + { 0x1d60b, 1, 2236 }, + { 0x1d60c, 1, 2225 }, + { 0x1d60d, 1, 2226 }, + { 0x1d60e, 1, 2650 }, + { 0x1d60f, 1, 2203 }, + { 0x1d610, 1, 2205 }, + { 0x1d611, 1, 2651 }, + { 0x1d612, 1, 2222 }, + { 0x1d613, 1, 2206 }, + { 0x1d614, 1, 2227 }, + { 0x1d615, 1, 2207 }, + { 0x1d616, 1, 2652 }, + { 0x1d617, 1, 2210 }, + { 0x1d618, 1, 2211 }, + { 0x1d619, 1, 2212 }, + { 0x1d61a, 1, 2653 }, + { 0x1d61b, 1, 2654 }, + { 0x1d61c, 1, 2655 }, + { 0x1d61d, 1, 2283 }, + { 0x1d61e, 1, 2656 }, + { 0x1d61f, 1, 2295 }, + { 0x1d620, 1, 2657 }, + { 0x1d621, 1, 2220 }, + { 0x1d622, 1, 3 }, + { 0x1d623, 1, 2658 }, + { 0x1d624, 1, 2325 }, + { 0x1d625, 1, 2237 }, + { 0x1d626, 1, 2224 }, + { 0x1d627, 1, 2659 }, + { 0x1d628, 1, 2202 }, + { 0x1d629, 1, 588 }, + { 0x1d62a, 1, 2169 }, + { 0x1d62b, 1, 590 }, + { 0x1d62c, 1, 2660 }, + { 0x1d62d, 1, 610 }, + { 0x1d62e, 1, 2326 }, + { 0x1d62f, 1, 2181 }, + { 0x1d630, 1, 14 }, + { 0x1d631, 1, 2661 }, + { 0x1d632, 1, 2662 }, + { 0x1d633, 1, 591 }, + { 0x1d634, 1, 356 }, + { 0x1d635, 1, 2663 }, + { 0x1d636, 1, 2664 }, + { 0x1d637, 1, 2308 }, + { 0x1d638, 1, 595 }, + { 0x1d639, 1, 611 }, + { 0x1d63a, 1, 596 }, + { 0x1d63b, 1, 2665 }, + { 0x1d63c, 1, 2649 }, + { 0x1d63d, 1, 2223 }, + { 0x1d63e, 1, 2190 }, + { 0x1d63f, 1, 2236 }, + { 0x1d640, 1, 2225 }, + { 0x1d641, 1, 2226 }, + { 0x1d642, 1, 2650 }, + { 0x1d643, 1, 2203 }, + { 0x1d644, 1, 2205 }, + { 0x1d645, 1, 2651 }, + { 0x1d646, 1, 2222 }, + { 0x1d647, 1, 2206 }, + { 0x1d648, 1, 2227 }, + { 0x1d649, 1, 2207 }, + { 0x1d64a, 1, 2652 }, + { 0x1d64b, 1, 2210 }, + { 0x1d64c, 1, 2211 }, + { 0x1d64d, 1, 2212 }, + { 0x1d64e, 1, 2653 }, + { 0x1d64f, 1, 2654 }, + { 0x1d650, 1, 2655 }, + { 0x1d651, 1, 2283 }, + { 0x1d652, 1, 2656 }, + { 0x1d653, 1, 2295 }, + { 0x1d654, 1, 2657 }, + { 0x1d655, 1, 2220 }, + { 0x1d656, 1, 3 }, + { 0x1d657, 1, 2658 }, + { 0x1d658, 1, 2325 }, + { 0x1d659, 1, 2237 }, + { 0x1d65a, 1, 2224 }, + { 0x1d65b, 1, 2659 }, + { 0x1d65c, 1, 2202 }, + { 0x1d65d, 1, 588 }, + { 0x1d65e, 1, 2169 }, + { 0x1d65f, 1, 590 }, + { 0x1d660, 1, 2660 }, + { 0x1d661, 1, 610 }, + { 0x1d662, 1, 2326 }, + { 0x1d663, 1, 2181 }, + { 0x1d664, 1, 14 }, + { 0x1d665, 1, 2661 }, + { 0x1d666, 1, 2662 }, + { 0x1d667, 1, 591 }, + { 0x1d668, 1, 356 }, + { 0x1d669, 1, 2663 }, + { 0x1d66a, 1, 2664 }, + { 0x1d66b, 1, 2308 }, + { 0x1d66c, 1, 595 }, + { 0x1d66d, 1, 611 }, + { 0x1d66e, 1, 596 }, + { 0x1d66f, 1, 2665 }, + { 0x1d670, 1, 2649 }, + { 0x1d671, 1, 2223 }, + { 0x1d672, 1, 2190 }, + { 0x1d673, 1, 2236 }, + { 0x1d674, 1, 2225 }, + { 0x1d675, 1, 2226 }, + { 0x1d676, 1, 2650 }, + { 0x1d677, 1, 2203 }, + { 0x1d678, 1, 2205 }, + { 0x1d679, 1, 2651 }, + { 0x1d67a, 1, 2222 }, + { 0x1d67b, 1, 2206 }, + { 0x1d67c, 1, 2227 }, + { 0x1d67d, 1, 2207 }, + { 0x1d67e, 1, 2652 }, + { 0x1d67f, 1, 2210 }, + { 0x1d680, 1, 2211 }, + { 0x1d681, 1, 2212 }, + { 0x1d682, 1, 2653 }, + { 0x1d683, 1, 2654 }, + { 0x1d684, 1, 2655 }, + { 0x1d685, 1, 2283 }, + { 0x1d686, 1, 2656 }, + { 0x1d687, 1, 2295 }, + { 0x1d688, 1, 2657 }, + { 0x1d689, 1, 2220 }, + { 0x1d68a, 1, 3 }, + { 0x1d68b, 1, 2658 }, + { 0x1d68c, 1, 2325 }, + { 0x1d68d, 1, 2237 }, + { 0x1d68e, 1, 2224 }, + { 0x1d68f, 1, 2659 }, + { 0x1d690, 1, 2202 }, + { 0x1d691, 1, 588 }, + { 0x1d692, 1, 2169 }, + { 0x1d693, 1, 590 }, + { 0x1d694, 1, 2660 }, + { 0x1d695, 1, 610 }, + { 0x1d696, 1, 2326 }, + { 0x1d697, 1, 2181 }, + { 0x1d698, 1, 14 }, + { 0x1d699, 1, 2661 }, + { 0x1d69a, 1, 2662 }, + { 0x1d69b, 1, 591 }, + { 0x1d69c, 1, 356 }, + { 0x1d69d, 1, 2663 }, + { 0x1d69e, 1, 2664 }, + { 0x1d69f, 1, 2308 }, + { 0x1d6a0, 1, 595 }, + { 0x1d6a1, 1, 611 }, + { 0x1d6a2, 1, 596 }, + { 0x1d6a3, 1, 2665 }, + { 0x1d6a8, 1, 5630 }, + { 0x1d6a9, 1, 5631 }, + { 0x1d6aa, 1, 2233 }, + { 0x1d6ab, 1, 5632 }, + { 0x1d6ac, 1, 5633 }, + { 0x1d6ad, 1, 5634 }, + { 0x1d6ae, 1, 5635 }, + { 0x1d6af, 1, 676 }, + { 0x1d6b0, 1, 5636 }, + { 0x1d6b1, 1, 5637 }, + { 0x1d6b2, 1, 5638 }, + { 0x1d6b3, 1, 5639 }, + { 0x1d6b4, 1, 5640 }, + { 0x1d6b5, 1, 5641 }, + { 0x1d6b6, 1, 5642 }, + { 0x1d6b7, 1, 2234 }, + { 0x1d6b8, 1, 5643 }, + { 0x1d6b9, 1, 676 }, + { 0x1d6ba, 1, 5644 }, + { 0x1d6bb, 1, 5645 }, + { 0x1d6bc, 1, 670 }, + { 0x1d6bd, 1, 5646 }, + { 0x1d6be, 1, 5647 }, + { 0x1d6bf, 1, 5648 }, + { 0x1d6c0, 1, 2221 }, + { 0x1d6c1, 1, 5649 }, + { 0x1d6c2, 1, 5650 }, + { 0x1d6c3, 1, 668 }, + { 0x1d6c4, 1, 2232 }, + { 0x1d6c5, 1, 5651 }, + { 0x1d6c6, 1, 677 }, + { 0x1d6c7, 1, 5652 }, + { 0x1d6c8, 1, 5653 }, + { 0x1d6c9, 1, 669 }, + { 0x1d6ca, 1, 2025 }, + { 0x1d6cb, 1, 673 }, + { 0x1d6cc, 1, 5654 }, + { 0x1d6cd, 1, 10 }, + { 0x1d6ce, 1, 5655 }, + { 0x1d6cf, 1, 5656 }, + { 0x1d6d0, 1, 5657 }, + { 0x1d6d1, 1, 672 }, + { 0x1d6d2, 1, 674 }, + { 0x1d6d3, 1, 675 }, + { 0x1d6d4, 1, 5658 }, + { 0x1d6d5, 1, 5659 }, + { 0x1d6d6, 1, 5660 }, + { 0x1d6d7, 1, 671 }, + { 0x1d6d8, 1, 5661 }, + { 0x1d6d9, 1, 5662 }, + { 0x1d6da, 1, 5663 }, + { 0x1d6db, 1, 5664 }, + { 0x1d6dc, 1, 677 }, + { 0x1d6dd, 1, 669 }, + { 0x1d6de, 1, 673 }, + { 0x1d6df, 1, 671 }, + { 0x1d6e0, 1, 674 }, + { 0x1d6e1, 1, 672 }, + { 0x1d6e2, 1, 5630 }, + { 0x1d6e3, 1, 5631 }, + { 0x1d6e4, 1, 2233 }, + { 0x1d6e5, 1, 5632 }, + { 0x1d6e6, 1, 5633 }, + { 0x1d6e7, 1, 5634 }, + { 0x1d6e8, 1, 5635 }, + { 0x1d6e9, 1, 676 }, + { 0x1d6ea, 1, 5636 }, + { 0x1d6eb, 1, 5637 }, + { 0x1d6ec, 1, 5638 }, + { 0x1d6ed, 1, 5639 }, + { 0x1d6ee, 1, 5640 }, + { 0x1d6ef, 1, 5641 }, + { 0x1d6f0, 1, 5642 }, + { 0x1d6f1, 1, 2234 }, + { 0x1d6f2, 1, 5643 }, + { 0x1d6f3, 1, 676 }, + { 0x1d6f4, 1, 5644 }, + { 0x1d6f5, 1, 5645 }, + { 0x1d6f6, 1, 670 }, + { 0x1d6f7, 1, 5646 }, + { 0x1d6f8, 1, 5647 }, + { 0x1d6f9, 1, 5648 }, + { 0x1d6fa, 1, 2221 }, + { 0x1d6fb, 1, 5649 }, + { 0x1d6fc, 1, 5650 }, + { 0x1d6fd, 1, 668 }, + { 0x1d6fe, 1, 2232 }, + { 0x1d6ff, 1, 5651 }, + { 0x1d700, 1, 677 }, + { 0x1d701, 1, 5652 }, + { 0x1d702, 1, 5653 }, + { 0x1d703, 1, 669 }, + { 0x1d704, 1, 2025 }, + { 0x1d705, 1, 673 }, + { 0x1d706, 1, 5654 }, + { 0x1d707, 1, 10 }, + { 0x1d708, 1, 5655 }, + { 0x1d709, 1, 5656 }, + { 0x1d70a, 1, 5657 }, + { 0x1d70b, 1, 672 }, + { 0x1d70c, 1, 674 }, + { 0x1d70d, 1, 675 }, + { 0x1d70e, 1, 5658 }, + { 0x1d70f, 1, 5659 }, + { 0x1d710, 1, 5660 }, + { 0x1d711, 1, 671 }, + { 0x1d712, 1, 5661 }, + { 0x1d713, 1, 5662 }, + { 0x1d714, 1, 5663 }, + { 0x1d715, 1, 5664 }, + { 0x1d716, 1, 677 }, + { 0x1d717, 1, 669 }, + { 0x1d718, 1, 673 }, + { 0x1d719, 1, 671 }, + { 0x1d71a, 1, 674 }, + { 0x1d71b, 1, 672 }, + { 0x1d71c, 1, 5630 }, + { 0x1d71d, 1, 5631 }, + { 0x1d71e, 1, 2233 }, + { 0x1d71f, 1, 5632 }, + { 0x1d720, 1, 5633 }, + { 0x1d721, 1, 5634 }, + { 0x1d722, 1, 5635 }, + { 0x1d723, 1, 676 }, + { 0x1d724, 1, 5636 }, + { 0x1d725, 1, 5637 }, + { 0x1d726, 1, 5638 }, + { 0x1d727, 1, 5639 }, + { 0x1d728, 1, 5640 }, + { 0x1d729, 1, 5641 }, + { 0x1d72a, 1, 5642 }, + { 0x1d72b, 1, 2234 }, + { 0x1d72c, 1, 5643 }, + { 0x1d72d, 1, 676 }, + { 0x1d72e, 1, 5644 }, + { 0x1d72f, 1, 5645 }, + { 0x1d730, 1, 670 }, + { 0x1d731, 1, 5646 }, + { 0x1d732, 1, 5647 }, + { 0x1d733, 1, 5648 }, + { 0x1d734, 1, 2221 }, + { 0x1d735, 1, 5649 }, + { 0x1d736, 1, 5650 }, + { 0x1d737, 1, 668 }, + { 0x1d738, 1, 2232 }, + { 0x1d739, 1, 5651 }, + { 0x1d73a, 1, 677 }, + { 0x1d73b, 1, 5652 }, + { 0x1d73c, 1, 5653 }, + { 0x1d73d, 1, 669 }, + { 0x1d73e, 1, 2025 }, + { 0x1d73f, 1, 673 }, + { 0x1d740, 1, 5654 }, + { 0x1d741, 1, 10 }, + { 0x1d742, 1, 5655 }, + { 0x1d743, 1, 5656 }, + { 0x1d744, 1, 5657 }, + { 0x1d745, 1, 672 }, + { 0x1d746, 1, 674 }, + { 0x1d747, 1, 675 }, + { 0x1d748, 1, 5658 }, + { 0x1d749, 1, 5659 }, + { 0x1d74a, 1, 5660 }, + { 0x1d74b, 1, 671 }, + { 0x1d74c, 1, 5661 }, + { 0x1d74d, 1, 5662 }, + { 0x1d74e, 1, 5663 }, + { 0x1d74f, 1, 5664 }, + { 0x1d750, 1, 677 }, + { 0x1d751, 1, 669 }, + { 0x1d752, 1, 673 }, + { 0x1d753, 1, 671 }, + { 0x1d754, 1, 674 }, + { 0x1d755, 1, 672 }, + { 0x1d756, 1, 5630 }, + { 0x1d757, 1, 5631 }, + { 0x1d758, 1, 2233 }, + { 0x1d759, 1, 5632 }, + { 0x1d75a, 1, 5633 }, + { 0x1d75b, 1, 5634 }, + { 0x1d75c, 1, 5635 }, + { 0x1d75d, 1, 676 }, + { 0x1d75e, 1, 5636 }, + { 0x1d75f, 1, 5637 }, + { 0x1d760, 1, 5638 }, + { 0x1d761, 1, 5639 }, + { 0x1d762, 1, 5640 }, + { 0x1d763, 1, 5641 }, + { 0x1d764, 1, 5642 }, + { 0x1d765, 1, 2234 }, + { 0x1d766, 1, 5643 }, + { 0x1d767, 1, 676 }, + { 0x1d768, 1, 5644 }, + { 0x1d769, 1, 5645 }, + { 0x1d76a, 1, 670 }, + { 0x1d76b, 1, 5646 }, + { 0x1d76c, 1, 5647 }, + { 0x1d76d, 1, 5648 }, + { 0x1d76e, 1, 2221 }, + { 0x1d76f, 1, 5649 }, + { 0x1d770, 1, 5650 }, + { 0x1d771, 1, 668 }, + { 0x1d772, 1, 2232 }, + { 0x1d773, 1, 5651 }, + { 0x1d774, 1, 677 }, + { 0x1d775, 1, 5652 }, + { 0x1d776, 1, 5653 }, + { 0x1d777, 1, 669 }, + { 0x1d778, 1, 2025 }, + { 0x1d779, 1, 673 }, + { 0x1d77a, 1, 5654 }, + { 0x1d77b, 1, 10 }, + { 0x1d77c, 1, 5655 }, + { 0x1d77d, 1, 5656 }, + { 0x1d77e, 1, 5657 }, + { 0x1d77f, 1, 672 }, + { 0x1d780, 1, 674 }, + { 0x1d781, 1, 675 }, + { 0x1d782, 1, 5658 }, + { 0x1d783, 1, 5659 }, + { 0x1d784, 1, 5660 }, + { 0x1d785, 1, 671 }, + { 0x1d786, 1, 5661 }, + { 0x1d787, 1, 5662 }, + { 0x1d788, 1, 5663 }, + { 0x1d789, 1, 5664 }, + { 0x1d78a, 1, 677 }, + { 0x1d78b, 1, 669 }, + { 0x1d78c, 1, 673 }, + { 0x1d78d, 1, 671 }, + { 0x1d78e, 1, 674 }, + { 0x1d78f, 1, 672 }, + { 0x1d790, 1, 5630 }, + { 0x1d791, 1, 5631 }, + { 0x1d792, 1, 2233 }, + { 0x1d793, 1, 5632 }, + { 0x1d794, 1, 5633 }, + { 0x1d795, 1, 5634 }, + { 0x1d796, 1, 5635 }, + { 0x1d797, 1, 676 }, + { 0x1d798, 1, 5636 }, + { 0x1d799, 1, 5637 }, + { 0x1d79a, 1, 5638 }, + { 0x1d79b, 1, 5639 }, + { 0x1d79c, 1, 5640 }, + { 0x1d79d, 1, 5641 }, + { 0x1d79e, 1, 5642 }, + { 0x1d79f, 1, 2234 }, + { 0x1d7a0, 1, 5643 }, + { 0x1d7a1, 1, 676 }, + { 0x1d7a2, 1, 5644 }, + { 0x1d7a3, 1, 5645 }, + { 0x1d7a4, 1, 670 }, + { 0x1d7a5, 1, 5646 }, + { 0x1d7a6, 1, 5647 }, + { 0x1d7a7, 1, 5648 }, + { 0x1d7a8, 1, 2221 }, + { 0x1d7a9, 1, 5649 }, + { 0x1d7aa, 1, 5650 }, + { 0x1d7ab, 1, 668 }, + { 0x1d7ac, 1, 2232 }, + { 0x1d7ad, 1, 5651 }, + { 0x1d7ae, 1, 677 }, + { 0x1d7af, 1, 5652 }, + { 0x1d7b0, 1, 5653 }, + { 0x1d7b1, 1, 669 }, + { 0x1d7b2, 1, 2025 }, + { 0x1d7b3, 1, 673 }, + { 0x1d7b4, 1, 5654 }, + { 0x1d7b5, 1, 10 }, + { 0x1d7b6, 1, 5655 }, + { 0x1d7b7, 1, 5656 }, + { 0x1d7b8, 1, 5657 }, + { 0x1d7b9, 1, 672 }, + { 0x1d7ba, 1, 674 }, + { 0x1d7bb, 1, 675 }, + { 0x1d7bc, 1, 5658 }, + { 0x1d7bd, 1, 5659 }, + { 0x1d7be, 1, 5660 }, + { 0x1d7bf, 1, 671 }, + { 0x1d7c0, 1, 5661 }, + { 0x1d7c1, 1, 5662 }, + { 0x1d7c2, 1, 5663 }, + { 0x1d7c3, 1, 5664 }, + { 0x1d7c4, 1, 677 }, + { 0x1d7c5, 1, 669 }, + { 0x1d7c6, 1, 673 }, + { 0x1d7c7, 1, 671 }, + { 0x1d7c8, 1, 674 }, + { 0x1d7c9, 1, 672 }, + { 0x1d7ce, 1, 2168 }, + { 0x1d7cf, 1, 13 }, + { 0x1d7d0, 1, 6 }, + { 0x1d7d1, 1, 7 }, + { 0x1d7d2, 1, 2170 }, + { 0x1d7d3, 1, 2171 }, + { 0x1d7d4, 1, 2172 }, + { 0x1d7d5, 1, 2173 }, + { 0x1d7d6, 1, 2174 }, + { 0x1d7d7, 1, 2175 }, + { 0x1d7d8, 1, 2168 }, + { 0x1d7d9, 1, 13 }, + { 0x1d7da, 1, 6 }, + { 0x1d7db, 1, 7 }, + { 0x1d7dc, 1, 2170 }, + { 0x1d7dd, 1, 2171 }, + { 0x1d7de, 1, 2172 }, + { 0x1d7df, 1, 2173 }, + { 0x1d7e0, 1, 2174 }, + { 0x1d7e1, 1, 2175 }, + { 0x1d7e2, 1, 2168 }, + { 0x1d7e3, 1, 13 }, + { 0x1d7e4, 1, 6 }, + { 0x1d7e5, 1, 7 }, + { 0x1d7e6, 1, 2170 }, + { 0x1d7e7, 1, 2171 }, + { 0x1d7e8, 1, 2172 }, + { 0x1d7e9, 1, 2173 }, + { 0x1d7ea, 1, 2174 }, + { 0x1d7eb, 1, 2175 }, + { 0x1d7ec, 1, 2168 }, + { 0x1d7ed, 1, 13 }, + { 0x1d7ee, 1, 6 }, + { 0x1d7ef, 1, 7 }, + { 0x1d7f0, 1, 2170 }, + { 0x1d7f1, 1, 2171 }, + { 0x1d7f2, 1, 2172 }, + { 0x1d7f3, 1, 2173 }, + { 0x1d7f4, 1, 2174 }, + { 0x1d7f5, 1, 2175 }, + { 0x1d7f6, 1, 2168 }, + { 0x1d7f7, 1, 13 }, + { 0x1d7f8, 1, 6 }, + { 0x1d7f9, 1, 7 }, + { 0x1d7fa, 1, 2170 }, + { 0x1d7fb, 1, 2171 }, + { 0x1d7fc, 1, 2172 }, + { 0x1d7fd, 1, 2173 }, + { 0x1d7fe, 1, 2174 }, + { 0x1d7ff, 1, 2175 }, + { 0x2f800, 1, 5665 }, + { 0x2f801, 1, 5666 }, + { 0x2f802, 1, 5667 }, + { 0x2f803, 1, 5668 }, + { 0x2f804, 1, 5669 }, + { 0x2f805, 1, 4549 }, + { 0x2f806, 1, 5670 }, + { 0x2f807, 1, 5671 }, + { 0x2f808, 1, 5672 }, + { 0x2f809, 1, 5673 }, + { 0x2f80a, 1, 4550 }, + { 0x2f80b, 1, 5674 }, + { 0x2f80c, 1, 5675 }, + { 0x2f80d, 1, 5676 }, + { 0x2f80e, 1, 4551 }, + { 0x2f80f, 1, 5677 }, + { 0x2f810, 1, 5678 }, + { 0x2f811, 1, 5679 }, + { 0x2f812, 1, 5680 }, + { 0x2f813, 1, 5681 }, + { 0x2f814, 1, 5682 }, + { 0x2f815, 1, 5683 }, + { 0x2f816, 1, 5684 }, + { 0x2f817, 1, 5685 }, + { 0x2f818, 1, 5686 }, + { 0x2f819, 1, 5687 }, + { 0x2f81a, 1, 5688 }, + { 0x2f81b, 1, 5689 }, + { 0x2f81c, 1, 5690 }, + { 0x2f81d, 1, 2698 }, + { 0x2f81e, 1, 5691 }, + { 0x2f81f, 1, 5692 }, + { 0x2f820, 1, 5693 }, + { 0x2f821, 1, 5694 }, + { 0x2f822, 1, 5695 }, + { 0x2f823, 1, 5696 }, + { 0x2f824, 1, 5697 }, + { 0x2f825, 1, 5698 }, + { 0x2f826, 1, 4552 }, + { 0x2f827, 1, 4553 }, + { 0x2f828, 1, 5699 }, + { 0x2f829, 1, 5700 }, + { 0x2f82a, 1, 5701 }, + { 0x2f82b, 1, 4372 }, + { 0x2f82c, 1, 5702 }, + { 0x2f82d, 1, 4554 }, + { 0x2f82e, 1, 5703 }, + { 0x2f82f, 1, 5704 }, + { 0x2f830, 1, 5705 }, + { 0x2f831, 1, 5706 }, + { 0x2f832, 1, 5706 }, + { 0x2f833, 1, 5706 }, + { 0x2f834, 1, 5707 }, + { 0x2f835, 1, 5708 }, + { 0x2f836, 1, 5709 }, + { 0x2f837, 1, 5710 }, + { 0x2f838, 1, 5711 }, + { 0x2f839, 1, 5712 }, + { 0x2f83a, 1, 5713 }, + { 0x2f83b, 1, 5714 }, + { 0x2f83c, 1, 5715 }, + { 0x2f83d, 1, 5716 }, + { 0x2f83e, 1, 5717 }, + { 0x2f83f, 1, 5718 }, + { 0x2f840, 1, 5719 }, + { 0x2f841, 1, 5720 }, + { 0x2f842, 1, 5721 }, + { 0x2f843, 1, 5722 }, + { 0x2f844, 1, 5723 }, + { 0x2f845, 1, 5724 }, + { 0x2f846, 1, 5724 }, + { 0x2f847, 1, 5725 }, + { 0x2f848, 1, 5726 }, + { 0x2f849, 1, 5727 }, + { 0x2f84a, 1, 5728 }, + { 0x2f84b, 1, 5729 }, + { 0x2f84c, 1, 4556 }, + { 0x2f84d, 1, 5730 }, + { 0x2f84e, 1, 5731 }, + { 0x2f84f, 1, 5732 }, + { 0x2f850, 1, 4518 }, + { 0x2f851, 1, 5733 }, + { 0x2f852, 1, 5734 }, + { 0x2f853, 1, 5735 }, + { 0x2f854, 1, 5736 }, + { 0x2f855, 1, 5737 }, + { 0x2f856, 1, 5738 }, + { 0x2f857, 1, 5739 }, + { 0x2f858, 1, 5740 }, + { 0x2f859, 1, 5741 }, + { 0x2f85a, 1, 5742 }, + { 0x2f85b, 1, 5743 }, + { 0x2f85c, 1, 5744 }, + { 0x2f85d, 1, 5745 }, + { 0x2f85e, 1, 5746 }, + { 0x2f85f, 1, 5747 }, + { 0x2f860, 1, 5748 }, + { 0x2f861, 1, 5749 }, + { 0x2f862, 1, 5750 }, + { 0x2f863, 1, 5751 }, + { 0x2f864, 1, 5752 }, + { 0x2f865, 1, 5753 }, + { 0x2f866, 1, 5754 }, + { 0x2f867, 1, 5755 }, + { 0x2f868, 1, 5756 }, + { 0x2f869, 1, 5757 }, + { 0x2f86a, 1, 5758 }, + { 0x2f86b, 1, 5758 }, + { 0x2f86c, 1, 5759 }, + { 0x2f86d, 1, 5760 }, + { 0x2f86e, 1, 5761 }, + { 0x2f86f, 1, 4368 }, + { 0x2f870, 1, 5762 }, + { 0x2f871, 1, 5763 }, + { 0x2f872, 1, 5764 }, + { 0x2f873, 1, 5765 }, + { 0x2f874, 1, 5766 }, + { 0x2f875, 1, 2724 }, + { 0x2f876, 1, 5767 }, + { 0x2f877, 1, 5768 }, + { 0x2f878, 1, 2726 }, + { 0x2f879, 1, 5769 }, + { 0x2f87a, 1, 5770 }, + { 0x2f87b, 1, 5771 }, + { 0x2f87c, 1, 5772 }, + { 0x2f87d, 1, 5773 }, + { 0x2f87e, 1, 5774 }, + { 0x2f87f, 1, 5775 }, + { 0x2f880, 1, 5776 }, + { 0x2f881, 1, 5777 }, + { 0x2f882, 1, 5778 }, + { 0x2f883, 1, 5779 }, + { 0x2f884, 1, 5780 }, + { 0x2f885, 1, 5781 }, + { 0x2f886, 1, 5782 }, + { 0x2f887, 1, 5783 }, + { 0x2f888, 1, 5784 }, + { 0x2f889, 1, 5785 }, + { 0x2f88a, 1, 5786 }, + { 0x2f88b, 1, 5787 }, + { 0x2f88c, 1, 5788 }, + { 0x2f88d, 1, 5789 }, + { 0x2f88e, 1, 4316 }, + { 0x2f88f, 1, 5790 }, + { 0x2f890, 1, 2736 }, + { 0x2f891, 1, 5791 }, + { 0x2f892, 1, 5791 }, + { 0x2f893, 1, 5792 }, + { 0x2f894, 1, 5793 }, + { 0x2f895, 1, 5793 }, + { 0x2f896, 1, 5794 }, + { 0x2f897, 1, 5795 }, + { 0x2f898, 1, 5796 }, + { 0x2f899, 1, 5797 }, + { 0x2f89a, 1, 5798 }, + { 0x2f89b, 1, 5799 }, + { 0x2f89c, 1, 5800 }, + { 0x2f89d, 1, 5801 }, + { 0x2f89e, 1, 5802 }, + { 0x2f89f, 1, 5803 }, + { 0x2f8a0, 1, 5804 }, + { 0x2f8a1, 1, 5805 }, + { 0x2f8a2, 1, 5806 }, + { 0x2f8a3, 1, 4561 }, + { 0x2f8a4, 1, 5807 }, + { 0x2f8a5, 1, 5808 }, + { 0x2f8a6, 1, 5809 }, + { 0x2f8a7, 1, 5810 }, + { 0x2f8a8, 1, 5811 }, + { 0x2f8a9, 1, 5810 }, + { 0x2f8aa, 1, 5812 }, + { 0x2f8ab, 1, 4563 }, + { 0x2f8ac, 1, 5813 }, + { 0x2f8ad, 1, 5814 }, + { 0x2f8ae, 1, 5815 }, + { 0x2f8af, 1, 5816 }, + { 0x2f8b0, 1, 4564 }, + { 0x2f8b1, 1, 4289 }, + { 0x2f8b2, 1, 5817 }, + { 0x2f8b3, 1, 5818 }, + { 0x2f8b4, 1, 5819 }, + { 0x2f8b5, 1, 5820 }, + { 0x2f8b6, 1, 5821 }, + { 0x2f8b7, 1, 5822 }, + { 0x2f8b8, 1, 5823 }, + { 0x2f8b9, 1, 5824 }, + { 0x2f8ba, 1, 5825 }, + { 0x2f8bb, 1, 5826 }, + { 0x2f8bc, 1, 5827 }, + { 0x2f8bd, 1, 5828 }, + { 0x2f8be, 1, 5829 }, + { 0x2f8bf, 1, 5830 }, + { 0x2f8c0, 1, 5831 }, + { 0x2f8c1, 1, 5832 }, + { 0x2f8c2, 1, 5833 }, + { 0x2f8c3, 1, 5834 }, + { 0x2f8c4, 1, 5835 }, + { 0x2f8c5, 1, 5836 }, + { 0x2f8c6, 1, 5837 }, + { 0x2f8c7, 1, 5838 }, + { 0x2f8c8, 1, 4565 }, + { 0x2f8c9, 1, 5839 }, + { 0x2f8ca, 1, 5840 }, + { 0x2f8cb, 1, 5841 }, + { 0x2f8cc, 1, 5842 }, + { 0x2f8cd, 1, 5843 }, + { 0x2f8ce, 1, 5844 }, + { 0x2f8cf, 1, 4567 }, + { 0x2f8d0, 1, 5845 }, + { 0x2f8d1, 1, 5846 }, + { 0x2f8d2, 1, 5847 }, + { 0x2f8d3, 1, 5848 }, + { 0x2f8d4, 1, 5849 }, + { 0x2f8d5, 1, 5850 }, + { 0x2f8d6, 1, 5851 }, + { 0x2f8d7, 1, 5852 }, + { 0x2f8d8, 1, 4317 }, + { 0x2f8d9, 1, 5853 }, + { 0x2f8da, 1, 5854 }, + { 0x2f8db, 1, 5855 }, + { 0x2f8dc, 1, 5856 }, + { 0x2f8dd, 1, 5857 }, + { 0x2f8de, 1, 5858 }, + { 0x2f8df, 1, 5859 }, + { 0x2f8e0, 1, 5860 }, + { 0x2f8e1, 1, 5861 }, + { 0x2f8e2, 1, 4568 }, + { 0x2f8e3, 1, 5862 }, + { 0x2f8e4, 1, 5863 }, + { 0x2f8e5, 1, 5864 }, + { 0x2f8e6, 1, 5865 }, + { 0x2f8e7, 1, 5866 }, + { 0x2f8e8, 1, 5867 }, + { 0x2f8e9, 1, 5868 }, + { 0x2f8ea, 1, 5869 }, + { 0x2f8eb, 1, 5870 }, + { 0x2f8ec, 1, 5871 }, + { 0x2f8ed, 1, 5872 }, + { 0x2f8ee, 1, 5873 }, + { 0x2f8ef, 1, 5874 }, + { 0x2f8f0, 1, 5875 }, + { 0x2f8f1, 1, 5876 }, + { 0x2f8f2, 1, 5877 }, + { 0x2f8f3, 1, 5878 }, + { 0x2f8f4, 1, 5879 }, + { 0x2f8f5, 1, 4385 }, + { 0x2f8f6, 1, 5880 }, + { 0x2f8f7, 1, 5881 }, + { 0x2f8f8, 1, 5882 }, + { 0x2f8f9, 1, 5883 }, + { 0x2f8fa, 1, 5884 }, + { 0x2f8fb, 1, 5885 }, + { 0x2f8fc, 1, 5886 }, + { 0x2f8fd, 1, 5887 }, + { 0x2f8fe, 1, 5888 }, + { 0x2f8ff, 1, 5889 }, + { 0x2f900, 1, 5890 }, + { 0x2f901, 1, 4569 }, + { 0x2f902, 1, 4468 }, + { 0x2f903, 1, 5891 }, + { 0x2f904, 1, 5892 }, + { 0x2f905, 1, 5893 }, + { 0x2f906, 1, 5894 }, + { 0x2f907, 1, 5895 }, + { 0x2f908, 1, 5896 }, + { 0x2f909, 1, 5897 }, + { 0x2f90a, 1, 5898 }, + { 0x2f90b, 1, 5899 }, + { 0x2f90c, 1, 5900 }, + { 0x2f90d, 1, 5901 }, + { 0x2f90e, 1, 5902 }, + { 0x2f90f, 1, 5903 }, + { 0x2f910, 1, 5904 }, + { 0x2f911, 1, 5905 }, + { 0x2f912, 1, 5906 }, + { 0x2f913, 1, 5907 }, + { 0x2f914, 1, 5908 }, + { 0x2f915, 1, 5909 }, + { 0x2f916, 1, 5910 }, + { 0x2f917, 1, 5911 }, + { 0x2f918, 1, 5912 }, + { 0x2f919, 1, 5913 }, + { 0x2f91a, 1, 5914 }, + { 0x2f91b, 1, 5915 }, + { 0x2f91c, 1, 5916 }, + { 0x2f91d, 1, 5917 }, + { 0x2f91e, 1, 5918 }, + { 0x2f91f, 1, 5919 }, + { 0x2f920, 1, 5920 }, + { 0x2f921, 1, 5921 }, + { 0x2f922, 1, 5922 }, + { 0x2f923, 1, 5923 }, + { 0x2f924, 1, 5924 }, + { 0x2f925, 1, 5925 }, + { 0x2f926, 1, 5926 }, + { 0x2f927, 1, 5927 }, + { 0x2f928, 1, 5928 }, + { 0x2f929, 1, 5929 }, + { 0x2f92a, 1, 5930 }, + { 0x2f92b, 1, 5931 }, + { 0x2f92c, 1, 5932 }, + { 0x2f92d, 1, 5932 }, + { 0x2f92e, 1, 5933 }, + { 0x2f92f, 1, 5934 }, + { 0x2f930, 1, 5935 }, + { 0x2f931, 1, 5936 }, + { 0x2f932, 1, 5937 }, + { 0x2f933, 1, 5938 }, + { 0x2f934, 1, 5939 }, + { 0x2f935, 1, 5940 }, + { 0x2f936, 1, 5941 }, + { 0x2f937, 1, 5942 }, + { 0x2f938, 1, 4371 }, + { 0x2f939, 1, 5943 }, + { 0x2f93a, 1, 5944 }, + { 0x2f93b, 1, 5945 }, + { 0x2f93c, 1, 5946 }, + { 0x2f93d, 1, 5947 }, + { 0x2f93e, 1, 5948 }, + { 0x2f93f, 1, 5949 }, + { 0x2f940, 1, 5950 }, + { 0x2f941, 1, 5951 }, + { 0x2f942, 1, 5952 }, + { 0x2f943, 1, 5953 }, + { 0x2f944, 1, 5954 }, + { 0x2f945, 1, 5955 }, + { 0x2f946, 1, 5956 }, + { 0x2f947, 1, 5956 }, + { 0x2f948, 1, 5957 }, + { 0x2f949, 1, 5958 }, + { 0x2f94a, 1, 5959 }, + { 0x2f94b, 1, 5960 }, + { 0x2f94c, 1, 5961 }, + { 0x2f94d, 1, 5962 }, + { 0x2f94e, 1, 5963 }, + { 0x2f94f, 1, 4334 }, + { 0x2f950, 1, 5964 }, + { 0x2f951, 1, 5965 }, + { 0x2f952, 1, 5966 }, + { 0x2f953, 1, 4579 }, + { 0x2f954, 1, 5967 }, + { 0x2f955, 1, 5968 }, + { 0x2f956, 1, 4538 }, + { 0x2f957, 1, 5969 }, + { 0x2f958, 1, 5970 }, + { 0x2f959, 1, 4582 }, + { 0x2f95a, 1, 5971 }, + { 0x2f95b, 1, 5972 }, + { 0x2f95c, 1, 5973 }, + { 0x2f95d, 1, 5974 }, + { 0x2f95e, 1, 5974 }, + { 0x2f95f, 1, 5975 }, + { 0x2f960, 1, 5976 }, + { 0x2f961, 1, 5977 }, + { 0x2f962, 1, 5978 }, + { 0x2f963, 1, 5979 }, + { 0x2f964, 1, 5980 }, + { 0x2f965, 1, 5981 }, + { 0x2f966, 1, 5982 }, + { 0x2f967, 1, 5983 }, + { 0x2f968, 1, 5984 }, + { 0x2f969, 1, 5985 }, + { 0x2f96a, 1, 5986 }, + { 0x2f96b, 1, 5987 }, + { 0x2f96c, 1, 5988 }, + { 0x2f96d, 1, 5989 }, + { 0x2f96e, 1, 5990 }, + { 0x2f96f, 1, 5991 }, + { 0x2f970, 1, 5992 }, + { 0x2f971, 1, 5993 }, + { 0x2f972, 1, 5994 }, + { 0x2f973, 1, 5995 }, + { 0x2f974, 1, 5996 }, + { 0x2f975, 1, 5997 }, + { 0x2f976, 1, 5998 }, + { 0x2f977, 1, 5999 }, + { 0x2f978, 1, 6000 }, + { 0x2f979, 1, 6001 }, + { 0x2f97a, 1, 4588 }, + { 0x2f97b, 1, 6002 }, + { 0x2f97c, 1, 6003 }, + { 0x2f97d, 1, 6004 }, + { 0x2f97e, 1, 6005 }, + { 0x2f97f, 1, 6006 }, + { 0x2f980, 1, 6007 }, + { 0x2f981, 1, 6008 }, + { 0x2f982, 1, 6009 }, + { 0x2f983, 1, 6010 }, + { 0x2f984, 1, 6011 }, + { 0x2f985, 1, 6012 }, + { 0x2f986, 1, 6013 }, + { 0x2f987, 1, 6014 }, + { 0x2f988, 1, 6015 }, + { 0x2f989, 1, 6016 }, + { 0x2f98a, 1, 6017 }, + { 0x2f98b, 1, 5792 }, + { 0x2f98c, 1, 6018 }, + { 0x2f98d, 1, 6019 }, + { 0x2f98e, 1, 6020 }, + { 0x2f98f, 1, 6021 }, + { 0x2f990, 1, 6022 }, + { 0x2f991, 1, 6023 }, + { 0x2f992, 1, 6024 }, + { 0x2f993, 1, 6025 }, + { 0x2f994, 1, 6026 }, + { 0x2f995, 1, 6027 }, + { 0x2f996, 1, 6028 }, + { 0x2f997, 1, 6029 }, + { 0x2f998, 1, 4388 }, + { 0x2f999, 1, 6030 }, + { 0x2f99a, 1, 6031 }, + { 0x2f99b, 1, 6032 }, + { 0x2f99c, 1, 6033 }, + { 0x2f99d, 1, 6034 }, + { 0x2f99e, 1, 6035 }, + { 0x2f99f, 1, 4591 }, + { 0x2f9a0, 1, 6036 }, + { 0x2f9a1, 1, 6037 }, + { 0x2f9a2, 1, 6038 }, + { 0x2f9a3, 1, 6039 }, + { 0x2f9a4, 1, 6040 }, + { 0x2f9a5, 1, 6041 }, + { 0x2f9a6, 1, 6042 }, + { 0x2f9a7, 1, 6043 }, + { 0x2f9a8, 1, 6044 }, + { 0x2f9a9, 1, 6045 }, + { 0x2f9aa, 1, 6046 }, + { 0x2f9ab, 1, 6047 }, + { 0x2f9ac, 1, 6048 }, + { 0x2f9ad, 1, 6049 }, + { 0x2f9ae, 1, 6050 }, + { 0x2f9af, 1, 6051 }, + { 0x2f9b0, 1, 6052 }, + { 0x2f9b1, 1, 6053 }, + { 0x2f9b2, 1, 6054 }, + { 0x2f9b3, 1, 6055 }, + { 0x2f9b4, 1, 4329 }, + { 0x2f9b5, 1, 6056 }, + { 0x2f9b6, 1, 6057 }, + { 0x2f9b7, 1, 6058 }, + { 0x2f9b8, 1, 6059 }, + { 0x2f9b9, 1, 6060 }, + { 0x2f9ba, 1, 6061 }, + { 0x2f9bb, 1, 6062 }, + { 0x2f9bc, 1, 6063 }, + { 0x2f9bd, 1, 6064 }, + { 0x2f9be, 1, 6065 }, + { 0x2f9bf, 1, 6066 }, + { 0x2f9c0, 1, 6067 }, + { 0x2f9c1, 1, 6068 }, + { 0x2f9c2, 1, 6069 }, + { 0x2f9c3, 1, 6070 }, + { 0x2f9c4, 1, 2826 }, + { 0x2f9c5, 1, 6071 }, + { 0x2f9c6, 1, 6072 }, + { 0x2f9c7, 1, 6073 }, + { 0x2f9c8, 1, 6074 }, + { 0x2f9c9, 1, 6075 }, + { 0x2f9ca, 1, 6076 }, + { 0x2f9cb, 1, 6077 }, + { 0x2f9cc, 1, 6078 }, + { 0x2f9cd, 1, 6079 }, + { 0x2f9ce, 1, 6080 }, + { 0x2f9cf, 1, 6081 }, + { 0x2f9d0, 1, 6082 }, + { 0x2f9d1, 1, 6083 }, + { 0x2f9d2, 1, 2833 }, + { 0x2f9d3, 1, 6084 }, + { 0x2f9d4, 1, 6085 }, + { 0x2f9d5, 1, 6086 }, + { 0x2f9d6, 1, 6087 }, + { 0x2f9d7, 1, 6088 }, + { 0x2f9d8, 1, 6089 }, + { 0x2f9d9, 1, 6090 }, + { 0x2f9da, 1, 6091 }, + { 0x2f9db, 1, 6092 }, + { 0x2f9dc, 1, 6093 }, + { 0x2f9dd, 1, 6094 }, + { 0x2f9de, 1, 6095 }, + { 0x2f9df, 1, 6096 }, + { 0x2f9e0, 1, 6097 }, + { 0x2f9e1, 1, 6098 }, + { 0x2f9e2, 1, 6099 }, + { 0x2f9e3, 1, 6100 }, + { 0x2f9e4, 1, 6101 }, + { 0x2f9e5, 1, 6102 }, + { 0x2f9e6, 1, 6103 }, + { 0x2f9e7, 1, 6104 }, + { 0x2f9e8, 1, 6105 }, + { 0x2f9e9, 1, 6106 }, + { 0x2f9ea, 1, 6107 }, + { 0x2f9eb, 1, 6108 }, + { 0x2f9ec, 1, 6109 }, + { 0x2f9ed, 1, 6110 }, + { 0x2f9ee, 1, 6111 }, + { 0x2f9ef, 1, 6112 }, + { 0x2f9f0, 1, 6113 }, + { 0x2f9f1, 1, 6114 }, + { 0x2f9f2, 1, 6115 }, + { 0x2f9f3, 1, 6116 }, + { 0x2f9f4, 1, 6117 }, + { 0x2f9f5, 1, 6118 }, + { 0x2f9f6, 1, 6119 }, + { 0x2f9f7, 1, 6120 }, + { 0x2f9f8, 1, 6121 }, + { 0x2f9f9, 1, 6122 }, + { 0x2f9fa, 1, 6123 }, + { 0x2f9fb, 1, 6124 }, + { 0x2f9fc, 1, 6125 }, + { 0x2f9fd, 1, 6126 }, + { 0x2f9fe, 1, 6127 }, + { 0x2f9ff, 1, 6127 }, + { 0x2fa00, 1, 6128 }, + { 0x2fa01, 1, 6129 }, + { 0x2fa02, 1, 6130 }, + { 0x2fa03, 1, 6131 }, + { 0x2fa04, 1, 6132 }, + { 0x2fa05, 1, 6133 }, + { 0x2fa06, 1, 6134 }, + { 0x2fa07, 1, 6135 }, + { 0x2fa08, 1, 6136 }, + { 0x2fa09, 1, 6137 }, + { 0x2fa0a, 1, 6138 }, + { 0x2fa0b, 1, 6139 }, + { 0x2fa0c, 1, 6140 }, + { 0x2fa0d, 1, 6141 }, + { 0x2fa0e, 1, 6142 }, + { 0x2fa0f, 1, 6143 }, + { 0x2fa10, 1, 6144 }, + { 0x2fa11, 1, 6145 }, + { 0x2fa12, 1, 6146 }, + { 0x2fa13, 1, 6147 }, + { 0x2fa14, 1, 6148 }, + { 0x2fa15, 1, 2881 }, + { 0x2fa16, 1, 6149 }, + { 0x2fa17, 1, 2885 }, + { 0x2fa18, 1, 6150 }, + { 0x2fa19, 1, 6151 }, + { 0x2fa1a, 1, 6152 }, + { 0x2fa1b, 1, 6153 }, + { 0x2fa1c, 1, 2890 }, + { 0x2fa1d, 1, 6154 } +}; + +static const Unicode decomp_expansion[] = { + 0x20 /* offset 0 */ , + 0x20, 0x308 /* offset 1 */ , + 0x61 /* offset 3 */ , + 0x20, 0x304 /* offset 4 */ , + 0x32 /* offset 6 */ , + 0x33 /* offset 7 */ , + 0x20, 0x301 /* offset 8 */ , + 0x3bc /* offset 10 */ , + 0x20, 0x327 /* offset 11 */ , + 0x31 /* offset 13 */ , + 0x6f /* offset 14 */ , + 0x31, 0x2044, 0x34 /* offset 15 */ , + 0x31, 0x2044, 0x32 /* offset 18 */ , + 0x33, 0x2044, 0x34 /* offset 21 */ , + 0x41, 0x300 /* offset 24 */ , + 0x41, 0x301 /* offset 26 */ , + 0x41, 0x302 /* offset 28 */ , + 0x41, 0x303 /* offset 30 */ , + 0x41, 0x308 /* offset 32 */ , + 0x41, 0x30a /* offset 34 */ , + 0x43, 0x327 /* offset 36 */ , + 0x45, 0x300 /* offset 38 */ , + 0x45, 0x301 /* offset 40 */ , + 0x45, 0x302 /* offset 42 */ , + 0x45, 0x308 /* offset 44 */ , + 0x49, 0x300 /* offset 46 */ , + 0x49, 0x301 /* offset 48 */ , + 0x49, 0x302 /* offset 50 */ , + 0x49, 0x308 /* offset 52 */ , + 0x4e, 0x303 /* offset 54 */ , + 0x4f, 0x300 /* offset 56 */ , + 0x4f, 0x301 /* offset 58 */ , + 0x4f, 0x302 /* offset 60 */ , + 0x4f, 0x303 /* offset 62 */ , + 0x4f, 0x308 /* offset 64 */ , + 0x55, 0x300 /* offset 66 */ , + 0x55, 0x301 /* offset 68 */ , + 0x55, 0x302 /* offset 70 */ , + 0x55, 0x308 /* offset 72 */ , + 0x59, 0x301 /* offset 74 */ , + 0x61, 0x300 /* offset 76 */ , + 0x61, 0x301 /* offset 78 */ , + 0x61, 0x302 /* offset 80 */ , + 0x61, 0x303 /* offset 82 */ , + 0x61, 0x308 /* offset 84 */ , + 0x61, 0x30a /* offset 86 */ , + 0x63, 0x327 /* offset 88 */ , + 0x65, 0x300 /* offset 90 */ , + 0x65, 0x301 /* offset 92 */ , + 0x65, 0x302 /* offset 94 */ , + 0x65, 0x308 /* offset 96 */ , + 0x69, 0x300 /* offset 98 */ , + 0x69, 0x301 /* offset 100 */ , + 0x69, 0x302 /* offset 102 */ , + 0x69, 0x308 /* offset 104 */ , + 0x6e, 0x303 /* offset 106 */ , + 0x6f, 0x300 /* offset 108 */ , + 0x6f, 0x301 /* offset 110 */ , + 0x6f, 0x302 /* offset 112 */ , + 0x6f, 0x303 /* offset 114 */ , + 0x6f, 0x308 /* offset 116 */ , + 0x75, 0x300 /* offset 118 */ , + 0x75, 0x301 /* offset 120 */ , + 0x75, 0x302 /* offset 122 */ , + 0x75, 0x308 /* offset 124 */ , + 0x79, 0x301 /* offset 126 */ , + 0x79, 0x308 /* offset 128 */ , + 0x41, 0x304 /* offset 130 */ , + 0x61, 0x304 /* offset 132 */ , + 0x41, 0x306 /* offset 134 */ , + 0x61, 0x306 /* offset 136 */ , + 0x41, 0x328 /* offset 138 */ , + 0x61, 0x328 /* offset 140 */ , + 0x43, 0x301 /* offset 142 */ , + 0x63, 0x301 /* offset 144 */ , + 0x43, 0x302 /* offset 146 */ , + 0x63, 0x302 /* offset 148 */ , + 0x43, 0x307 /* offset 150 */ , + 0x63, 0x307 /* offset 152 */ , + 0x43, 0x30c /* offset 154 */ , + 0x63, 0x30c /* offset 156 */ , + 0x44, 0x30c /* offset 158 */ , + 0x64, 0x30c /* offset 160 */ , + 0x45, 0x304 /* offset 162 */ , + 0x65, 0x304 /* offset 164 */ , + 0x45, 0x306 /* offset 166 */ , + 0x65, 0x306 /* offset 168 */ , + 0x45, 0x307 /* offset 170 */ , + 0x65, 0x307 /* offset 172 */ , + 0x45, 0x328 /* offset 174 */ , + 0x65, 0x328 /* offset 176 */ , + 0x45, 0x30c /* offset 178 */ , + 0x65, 0x30c /* offset 180 */ , + 0x47, 0x302 /* offset 182 */ , + 0x67, 0x302 /* offset 184 */ , + 0x47, 0x306 /* offset 186 */ , + 0x67, 0x306 /* offset 188 */ , + 0x47, 0x307 /* offset 190 */ , + 0x67, 0x307 /* offset 192 */ , + 0x47, 0x327 /* offset 194 */ , + 0x67, 0x327 /* offset 196 */ , + 0x48, 0x302 /* offset 198 */ , + 0x68, 0x302 /* offset 200 */ , + 0x49, 0x303 /* offset 202 */ , + 0x69, 0x303 /* offset 204 */ , + 0x49, 0x304 /* offset 206 */ , + 0x69, 0x304 /* offset 208 */ , + 0x49, 0x306 /* offset 210 */ , + 0x69, 0x306 /* offset 212 */ , + 0x49, 0x328 /* offset 214 */ , + 0x69, 0x328 /* offset 216 */ , + 0x49, 0x307 /* offset 218 */ , + 0x49, 0x4a /* offset 220 */ , + 0x69, 0x6a /* offset 222 */ , + 0x4a, 0x302 /* offset 224 */ , + 0x6a, 0x302 /* offset 226 */ , + 0x4b, 0x327 /* offset 228 */ , + 0x6b, 0x327 /* offset 230 */ , + 0x4c, 0x301 /* offset 232 */ , + 0x6c, 0x301 /* offset 234 */ , + 0x4c, 0x327 /* offset 236 */ , + 0x6c, 0x327 /* offset 238 */ , + 0x4c, 0x30c /* offset 240 */ , + 0x6c, 0x30c /* offset 242 */ , + 0x4c, 0xb7 /* offset 244 */ , + 0x6c, 0xb7 /* offset 246 */ , + 0x4e, 0x301 /* offset 248 */ , + 0x6e, 0x301 /* offset 250 */ , + 0x4e, 0x327 /* offset 252 */ , + 0x6e, 0x327 /* offset 254 */ , + 0x4e, 0x30c /* offset 256 */ , + 0x6e, 0x30c /* offset 258 */ , + 0x2bc, 0x6e /* offset 260 */ , + 0x4f, 0x304 /* offset 262 */ , + 0x6f, 0x304 /* offset 264 */ , + 0x4f, 0x306 /* offset 266 */ , + 0x6f, 0x306 /* offset 268 */ , + 0x4f, 0x30b /* offset 270 */ , + 0x6f, 0x30b /* offset 272 */ , + 0x52, 0x301 /* offset 274 */ , + 0x72, 0x301 /* offset 276 */ , + 0x52, 0x327 /* offset 278 */ , + 0x72, 0x327 /* offset 280 */ , + 0x52, 0x30c /* offset 282 */ , + 0x72, 0x30c /* offset 284 */ , + 0x53, 0x301 /* offset 286 */ , + 0x73, 0x301 /* offset 288 */ , + 0x53, 0x302 /* offset 290 */ , + 0x73, 0x302 /* offset 292 */ , + 0x53, 0x327 /* offset 294 */ , + 0x73, 0x327 /* offset 296 */ , + 0x53, 0x30c /* offset 298 */ , + 0x73, 0x30c /* offset 300 */ , + 0x54, 0x327 /* offset 302 */ , + 0x74, 0x327 /* offset 304 */ , + 0x54, 0x30c /* offset 306 */ , + 0x74, 0x30c /* offset 308 */ , + 0x55, 0x303 /* offset 310 */ , + 0x75, 0x303 /* offset 312 */ , + 0x55, 0x304 /* offset 314 */ , + 0x75, 0x304 /* offset 316 */ , + 0x55, 0x306 /* offset 318 */ , + 0x75, 0x306 /* offset 320 */ , + 0x55, 0x30a /* offset 322 */ , + 0x75, 0x30a /* offset 324 */ , + 0x55, 0x30b /* offset 326 */ , + 0x75, 0x30b /* offset 328 */ , + 0x55, 0x328 /* offset 330 */ , + 0x75, 0x328 /* offset 332 */ , + 0x57, 0x302 /* offset 334 */ , + 0x77, 0x302 /* offset 336 */ , + 0x59, 0x302 /* offset 338 */ , + 0x79, 0x302 /* offset 340 */ , + 0x59, 0x308 /* offset 342 */ , + 0x5a, 0x301 /* offset 344 */ , + 0x7a, 0x301 /* offset 346 */ , + 0x5a, 0x307 /* offset 348 */ , + 0x7a, 0x307 /* offset 350 */ , + 0x5a, 0x30c /* offset 352 */ , + 0x7a, 0x30c /* offset 354 */ , + 0x73 /* offset 356 */ , + 0x4f, 0x31b /* offset 357 */ , + 0x6f, 0x31b /* offset 359 */ , + 0x55, 0x31b /* offset 361 */ , + 0x75, 0x31b /* offset 363 */ , + 0x44, 0x5a, 0x30c /* offset 365 */ , + 0x44, 0x7a, 0x30c /* offset 368 */ , + 0x64, 0x7a, 0x30c /* offset 371 */ , + 0x4c, 0x4a /* offset 374 */ , + 0x4c, 0x6a /* offset 376 */ , + 0x6c, 0x6a /* offset 378 */ , + 0x4e, 0x4a /* offset 380 */ , + 0x4e, 0x6a /* offset 382 */ , + 0x6e, 0x6a /* offset 384 */ , + 0x41, 0x30c /* offset 386 */ , + 0x61, 0x30c /* offset 388 */ , + 0x49, 0x30c /* offset 390 */ , + 0x69, 0x30c /* offset 392 */ , + 0x4f, 0x30c /* offset 394 */ , + 0x6f, 0x30c /* offset 396 */ , + 0x55, 0x30c /* offset 398 */ , + 0x75, 0x30c /* offset 400 */ , + 0x55, 0x308, 0x304 /* offset 402 */ , + 0x75, 0x308, 0x304 /* offset 405 */ , + 0x55, 0x308, 0x301 /* offset 408 */ , + 0x75, 0x308, 0x301 /* offset 411 */ , + 0x55, 0x308, 0x30c /* offset 414 */ , + 0x75, 0x308, 0x30c /* offset 417 */ , + 0x55, 0x308, 0x300 /* offset 420 */ , + 0x75, 0x308, 0x300 /* offset 423 */ , + 0x41, 0x308, 0x304 /* offset 426 */ , + 0x61, 0x308, 0x304 /* offset 429 */ , + 0x41, 0x307, 0x304 /* offset 432 */ , + 0x61, 0x307, 0x304 /* offset 435 */ , + 0xc6, 0x304 /* offset 438 */ , + 0xe6, 0x304 /* offset 440 */ , + 0x47, 0x30c /* offset 442 */ , + 0x67, 0x30c /* offset 444 */ , + 0x4b, 0x30c /* offset 446 */ , + 0x6b, 0x30c /* offset 448 */ , + 0x4f, 0x328 /* offset 450 */ , + 0x6f, 0x328 /* offset 452 */ , + 0x4f, 0x328, 0x304 /* offset 454 */ , + 0x6f, 0x328, 0x304 /* offset 457 */ , + 0x1b7, 0x30c /* offset 460 */ , + 0x292, 0x30c /* offset 462 */ , + 0x6a, 0x30c /* offset 464 */ , + 0x44, 0x5a /* offset 466 */ , + 0x44, 0x7a /* offset 468 */ , + 0x64, 0x7a /* offset 470 */ , + 0x47, 0x301 /* offset 472 */ , + 0x67, 0x301 /* offset 474 */ , + 0x4e, 0x300 /* offset 476 */ , + 0x6e, 0x300 /* offset 478 */ , + 0x41, 0x30a, 0x301 /* offset 480 */ , + 0x61, 0x30a, 0x301 /* offset 483 */ , + 0xc6, 0x301 /* offset 486 */ , + 0xe6, 0x301 /* offset 488 */ , + 0xd8, 0x301 /* offset 490 */ , + 0xf8, 0x301 /* offset 492 */ , + 0x41, 0x30f /* offset 494 */ , + 0x61, 0x30f /* offset 496 */ , + 0x41, 0x311 /* offset 498 */ , + 0x61, 0x311 /* offset 500 */ , + 0x45, 0x30f /* offset 502 */ , + 0x65, 0x30f /* offset 504 */ , + 0x45, 0x311 /* offset 506 */ , + 0x65, 0x311 /* offset 508 */ , + 0x49, 0x30f /* offset 510 */ , + 0x69, 0x30f /* offset 512 */ , + 0x49, 0x311 /* offset 514 */ , + 0x69, 0x311 /* offset 516 */ , + 0x4f, 0x30f /* offset 518 */ , + 0x6f, 0x30f /* offset 520 */ , + 0x4f, 0x311 /* offset 522 */ , + 0x6f, 0x311 /* offset 524 */ , + 0x52, 0x30f /* offset 526 */ , + 0x72, 0x30f /* offset 528 */ , + 0x52, 0x311 /* offset 530 */ , + 0x72, 0x311 /* offset 532 */ , + 0x55, 0x30f /* offset 534 */ , + 0x75, 0x30f /* offset 536 */ , + 0x55, 0x311 /* offset 538 */ , + 0x75, 0x311 /* offset 540 */ , + 0x53, 0x326 /* offset 542 */ , + 0x73, 0x326 /* offset 544 */ , + 0x54, 0x326 /* offset 546 */ , + 0x74, 0x326 /* offset 548 */ , + 0x48, 0x30c /* offset 550 */ , + 0x68, 0x30c /* offset 552 */ , + 0x41, 0x307 /* offset 554 */ , + 0x61, 0x307 /* offset 556 */ , + 0x45, 0x327 /* offset 558 */ , + 0x65, 0x327 /* offset 560 */ , + 0x4f, 0x308, 0x304 /* offset 562 */ , + 0x6f, 0x308, 0x304 /* offset 565 */ , + 0x4f, 0x303, 0x304 /* offset 568 */ , + 0x6f, 0x303, 0x304 /* offset 571 */ , + 0x4f, 0x307 /* offset 574 */ , + 0x6f, 0x307 /* offset 576 */ , + 0x4f, 0x307, 0x304 /* offset 578 */ , + 0x6f, 0x307, 0x304 /* offset 581 */ , + 0x59, 0x304 /* offset 584 */ , + 0x79, 0x304 /* offset 586 */ , + 0x68 /* offset 588 */ , + 0x266 /* offset 589 */ , + 0x6a /* offset 590 */ , + 0x72 /* offset 591 */ , + 0x279 /* offset 592 */ , + 0x27b /* offset 593 */ , + 0x281 /* offset 594 */ , + 0x77 /* offset 595 */ , + 0x79 /* offset 596 */ , + 0x20, 0x306 /* offset 597 */ , + 0x20, 0x307 /* offset 599 */ , + 0x20, 0x30a /* offset 601 */ , + 0x20, 0x328 /* offset 603 */ , + 0x20, 0x303 /* offset 605 */ , + 0x20, 0x30b /* offset 607 */ , + 0x263 /* offset 609 */ , + 0x6c /* offset 610 */ , + 0x78 /* offset 611 */ , + 0x295 /* offset 612 */ , + 0x300 /* offset 613 */ , + 0x301 /* offset 614 */ , + 0x313 /* offset 615 */ , + 0x308, 0x301 /* offset 616 */ , + 0x2b9 /* offset 618 */ , + 0x20, 0x345 /* offset 619 */ , + 0x3b /* offset 621 */ , + 0x20, 0x308, 0x301 /* offset 622 */ , + 0x391, 0x301 /* offset 625 */ , + 0xb7 /* offset 627 */ , + 0x395, 0x301 /* offset 628 */ , + 0x397, 0x301 /* offset 630 */ , + 0x399, 0x301 /* offset 632 */ , + 0x39f, 0x301 /* offset 634 */ , + 0x3a5, 0x301 /* offset 636 */ , + 0x3a9, 0x301 /* offset 638 */ , + 0x3b9, 0x308, 0x301 /* offset 640 */ , + 0x399, 0x308 /* offset 643 */ , + 0x3a5, 0x308 /* offset 645 */ , + 0x3b1, 0x301 /* offset 647 */ , + 0x3b5, 0x301 /* offset 649 */ , + 0x3b7, 0x301 /* offset 651 */ , + 0x3b9, 0x301 /* offset 653 */ , + 0x3c5, 0x308, 0x301 /* offset 655 */ , + 0x3b9, 0x308 /* offset 658 */ , + 0x3c5, 0x308 /* offset 660 */ , + 0x3bf, 0x301 /* offset 662 */ , + 0x3c5, 0x301 /* offset 664 */ , + 0x3c9, 0x301 /* offset 666 */ , + 0x3b2 /* offset 668 */ , + 0x3b8 /* offset 669 */ , + 0x3a5 /* offset 670 */ , + 0x3c6 /* offset 671 */ , + 0x3c0 /* offset 672 */ , + 0x3ba /* offset 673 */ , + 0x3c1 /* offset 674 */ , + 0x3c2 /* offset 675 */ , + 0x398 /* offset 676 */ , + 0x3b5 /* offset 677 */ , + 0x415, 0x300 /* offset 678 */ , + 0x415, 0x308 /* offset 680 */ , + 0x413, 0x301 /* offset 682 */ , + 0x406, 0x308 /* offset 684 */ , + 0x41a, 0x301 /* offset 686 */ , + 0x418, 0x300 /* offset 688 */ , + 0x423, 0x306 /* offset 690 */ , + 0x418, 0x306 /* offset 692 */ , + 0x438, 0x306 /* offset 694 */ , + 0x435, 0x300 /* offset 696 */ , + 0x435, 0x308 /* offset 698 */ , + 0x433, 0x301 /* offset 700 */ , + 0x456, 0x308 /* offset 702 */ , + 0x43a, 0x301 /* offset 704 */ , + 0x438, 0x300 /* offset 706 */ , + 0x443, 0x306 /* offset 708 */ , + 0x474, 0x30f /* offset 710 */ , + 0x475, 0x30f /* offset 712 */ , + 0x416, 0x306 /* offset 714 */ , + 0x436, 0x306 /* offset 716 */ , + 0x410, 0x306 /* offset 718 */ , + 0x430, 0x306 /* offset 720 */ , + 0x410, 0x308 /* offset 722 */ , + 0x430, 0x308 /* offset 724 */ , + 0x415, 0x306 /* offset 726 */ , + 0x435, 0x306 /* offset 728 */ , + 0x4d8, 0x308 /* offset 730 */ , + 0x4d9, 0x308 /* offset 732 */ , + 0x416, 0x308 /* offset 734 */ , + 0x436, 0x308 /* offset 736 */ , + 0x417, 0x308 /* offset 738 */ , + 0x437, 0x308 /* offset 740 */ , + 0x418, 0x304 /* offset 742 */ , + 0x438, 0x304 /* offset 744 */ , + 0x418, 0x308 /* offset 746 */ , + 0x438, 0x308 /* offset 748 */ , + 0x41e, 0x308 /* offset 750 */ , + 0x43e, 0x308 /* offset 752 */ , + 0x4e8, 0x308 /* offset 754 */ , + 0x4e9, 0x308 /* offset 756 */ , + 0x42d, 0x308 /* offset 758 */ , + 0x44d, 0x308 /* offset 760 */ , + 0x423, 0x304 /* offset 762 */ , + 0x443, 0x304 /* offset 764 */ , + 0x423, 0x308 /* offset 766 */ , + 0x443, 0x308 /* offset 768 */ , + 0x423, 0x30b /* offset 770 */ , + 0x443, 0x30b /* offset 772 */ , + 0x427, 0x308 /* offset 774 */ , + 0x447, 0x308 /* offset 776 */ , + 0x42b, 0x308 /* offset 778 */ , + 0x44b, 0x308 /* offset 780 */ , + 0x565, 0x582 /* offset 782 */ , + 0x627, 0x653 /* offset 784 */ , + 0x627, 0x654 /* offset 786 */ , + 0x648, 0x654 /* offset 788 */ , + 0x627, 0x655 /* offset 790 */ , + 0x64a, 0x654 /* offset 792 */ , + 0x627, 0x674 /* offset 794 */ , + 0x648, 0x674 /* offset 796 */ , + 0x6c7, 0x674 /* offset 798 */ , + 0x64a, 0x674 /* offset 800 */ , + 0x6d5, 0x654 /* offset 802 */ , + 0x6c1, 0x654 /* offset 804 */ , + 0x6d2, 0x654 /* offset 806 */ , + 0x928, 0x93c /* offset 808 */ , + 0x930, 0x93c /* offset 810 */ , + 0x933, 0x93c /* offset 812 */ , + 0x915, 0x93c /* offset 814 */ , + 0x916, 0x93c /* offset 816 */ , + 0x917, 0x93c /* offset 818 */ , + 0x91c, 0x93c /* offset 820 */ , + 0x921, 0x93c /* offset 822 */ , + 0x922, 0x93c /* offset 824 */ , + 0x92b, 0x93c /* offset 826 */ , + 0x92f, 0x93c /* offset 828 */ , + 0x9c7, 0x9be /* offset 830 */ , + 0x9c7, 0x9d7 /* offset 832 */ , + 0x9a1, 0x9bc /* offset 834 */ , + 0x9a2, 0x9bc /* offset 836 */ , + 0x9af, 0x9bc /* offset 838 */ , + 0xa32, 0xa3c /* offset 840 */ , + 0xa38, 0xa3c /* offset 842 */ , + 0xa16, 0xa3c /* offset 844 */ , + 0xa17, 0xa3c /* offset 846 */ , + 0xa1c, 0xa3c /* offset 848 */ , + 0xa2b, 0xa3c /* offset 850 */ , + 0xb47, 0xb56 /* offset 852 */ , + 0xb47, 0xb3e /* offset 854 */ , + 0xb47, 0xb57 /* offset 856 */ , + 0xb21, 0xb3c /* offset 858 */ , + 0xb22, 0xb3c /* offset 860 */ , + 0xb92, 0xbd7 /* offset 862 */ , + 0xbc6, 0xbbe /* offset 864 */ , + 0xbc7, 0xbbe /* offset 866 */ , + 0xbc6, 0xbd7 /* offset 868 */ , + 0xc46, 0xc56 /* offset 870 */ , + 0xcbf, 0xcd5 /* offset 872 */ , + 0xcc6, 0xcd5 /* offset 874 */ , + 0xcc6, 0xcd6 /* offset 876 */ , + 0xcc6, 0xcc2 /* offset 878 */ , + 0xcc6, 0xcc2, 0xcd5 /* offset 880 */ , + 0xd46, 0xd3e /* offset 883 */ , + 0xd47, 0xd3e /* offset 885 */ , + 0xd46, 0xd57 /* offset 887 */ , + 0xdd9, 0xdca /* offset 889 */ , + 0xdd9, 0xdcf /* offset 891 */ , + 0xdd9, 0xdcf, 0xdca /* offset 893 */ , + 0xdd9, 0xddf /* offset 896 */ , + 0xe4d, 0xe32 /* offset 898 */ , + 0xecd, 0xeb2 /* offset 900 */ , + 0xeab, 0xe99 /* offset 902 */ , + 0xeab, 0xea1 /* offset 904 */ , + 0xf0b /* offset 906 */ , + 0xf42, 0xfb7 /* offset 907 */ , + 0xf4c, 0xfb7 /* offset 909 */ , + 0xf51, 0xfb7 /* offset 911 */ , + 0xf56, 0xfb7 /* offset 913 */ , + 0xf5b, 0xfb7 /* offset 915 */ , + 0xf40, 0xfb5 /* offset 917 */ , + 0xf71, 0xf72 /* offset 919 */ , + 0xf71, 0xf74 /* offset 921 */ , + 0xfb2, 0xf80 /* offset 923 */ , + 0xfb2, 0xf71, 0xf80 /* offset 925 */ , + 0xfb3, 0xf80 /* offset 928 */ , + 0xfb3, 0xf71, 0xf80 /* offset 930 */ , + 0xf71, 0xf80 /* offset 933 */ , + 0xf92, 0xfb7 /* offset 935 */ , + 0xf9c, 0xfb7 /* offset 937 */ , + 0xfa1, 0xfb7 /* offset 939 */ , + 0xfa6, 0xfb7 /* offset 941 */ , + 0xfab, 0xfb7 /* offset 943 */ , + 0xf90, 0xfb5 /* offset 945 */ , + 0x1025, 0x102e /* offset 947 */ , + 0x41, 0x325 /* offset 949 */ , + 0x61, 0x325 /* offset 951 */ , + 0x42, 0x307 /* offset 953 */ , + 0x62, 0x307 /* offset 955 */ , + 0x42, 0x323 /* offset 957 */ , + 0x62, 0x323 /* offset 959 */ , + 0x42, 0x331 /* offset 961 */ , + 0x62, 0x331 /* offset 963 */ , + 0x43, 0x327, 0x301 /* offset 965 */ , + 0x63, 0x327, 0x301 /* offset 968 */ , + 0x44, 0x307 /* offset 971 */ , + 0x64, 0x307 /* offset 973 */ , + 0x44, 0x323 /* offset 975 */ , + 0x64, 0x323 /* offset 977 */ , + 0x44, 0x331 /* offset 979 */ , + 0x64, 0x331 /* offset 981 */ , + 0x44, 0x327 /* offset 983 */ , + 0x64, 0x327 /* offset 985 */ , + 0x44, 0x32d /* offset 987 */ , + 0x64, 0x32d /* offset 989 */ , + 0x45, 0x304, 0x300 /* offset 991 */ , + 0x65, 0x304, 0x300 /* offset 994 */ , + 0x45, 0x304, 0x301 /* offset 997 */ , + 0x65, 0x304, 0x301 /* offset 1000 */ , + 0x45, 0x32d /* offset 1003 */ , + 0x65, 0x32d /* offset 1005 */ , + 0x45, 0x330 /* offset 1007 */ , + 0x65, 0x330 /* offset 1009 */ , + 0x45, 0x327, 0x306 /* offset 1011 */ , + 0x65, 0x327, 0x306 /* offset 1014 */ , + 0x46, 0x307 /* offset 1017 */ , + 0x66, 0x307 /* offset 1019 */ , + 0x47, 0x304 /* offset 1021 */ , + 0x67, 0x304 /* offset 1023 */ , + 0x48, 0x307 /* offset 1025 */ , + 0x68, 0x307 /* offset 1027 */ , + 0x48, 0x323 /* offset 1029 */ , + 0x68, 0x323 /* offset 1031 */ , + 0x48, 0x308 /* offset 1033 */ , + 0x68, 0x308 /* offset 1035 */ , + 0x48, 0x327 /* offset 1037 */ , + 0x68, 0x327 /* offset 1039 */ , + 0x48, 0x32e /* offset 1041 */ , + 0x68, 0x32e /* offset 1043 */ , + 0x49, 0x330 /* offset 1045 */ , + 0x69, 0x330 /* offset 1047 */ , + 0x49, 0x308, 0x301 /* offset 1049 */ , + 0x69, 0x308, 0x301 /* offset 1052 */ , + 0x4b, 0x301 /* offset 1055 */ , + 0x6b, 0x301 /* offset 1057 */ , + 0x4b, 0x323 /* offset 1059 */ , + 0x6b, 0x323 /* offset 1061 */ , + 0x4b, 0x331 /* offset 1063 */ , + 0x6b, 0x331 /* offset 1065 */ , + 0x4c, 0x323 /* offset 1067 */ , + 0x6c, 0x323 /* offset 1069 */ , + 0x4c, 0x323, 0x304 /* offset 1071 */ , + 0x6c, 0x323, 0x304 /* offset 1074 */ , + 0x4c, 0x331 /* offset 1077 */ , + 0x6c, 0x331 /* offset 1079 */ , + 0x4c, 0x32d /* offset 1081 */ , + 0x6c, 0x32d /* offset 1083 */ , + 0x4d, 0x301 /* offset 1085 */ , + 0x6d, 0x301 /* offset 1087 */ , + 0x4d, 0x307 /* offset 1089 */ , + 0x6d, 0x307 /* offset 1091 */ , + 0x4d, 0x323 /* offset 1093 */ , + 0x6d, 0x323 /* offset 1095 */ , + 0x4e, 0x307 /* offset 1097 */ , + 0x6e, 0x307 /* offset 1099 */ , + 0x4e, 0x323 /* offset 1101 */ , + 0x6e, 0x323 /* offset 1103 */ , + 0x4e, 0x331 /* offset 1105 */ , + 0x6e, 0x331 /* offset 1107 */ , + 0x4e, 0x32d /* offset 1109 */ , + 0x6e, 0x32d /* offset 1111 */ , + 0x4f, 0x303, 0x301 /* offset 1113 */ , + 0x6f, 0x303, 0x301 /* offset 1116 */ , + 0x4f, 0x303, 0x308 /* offset 1119 */ , + 0x6f, 0x303, 0x308 /* offset 1122 */ , + 0x4f, 0x304, 0x300 /* offset 1125 */ , + 0x6f, 0x304, 0x300 /* offset 1128 */ , + 0x4f, 0x304, 0x301 /* offset 1131 */ , + 0x6f, 0x304, 0x301 /* offset 1134 */ , + 0x50, 0x301 /* offset 1137 */ , + 0x70, 0x301 /* offset 1139 */ , + 0x50, 0x307 /* offset 1141 */ , + 0x70, 0x307 /* offset 1143 */ , + 0x52, 0x307 /* offset 1145 */ , + 0x72, 0x307 /* offset 1147 */ , + 0x52, 0x323 /* offset 1149 */ , + 0x72, 0x323 /* offset 1151 */ , + 0x52, 0x323, 0x304 /* offset 1153 */ , + 0x72, 0x323, 0x304 /* offset 1156 */ , + 0x52, 0x331 /* offset 1159 */ , + 0x72, 0x331 /* offset 1161 */ , + 0x53, 0x307 /* offset 1163 */ , + 0x73, 0x307 /* offset 1165 */ , + 0x53, 0x323 /* offset 1167 */ , + 0x73, 0x323 /* offset 1169 */ , + 0x53, 0x301, 0x307 /* offset 1171 */ , + 0x73, 0x301, 0x307 /* offset 1174 */ , + 0x53, 0x30c, 0x307 /* offset 1177 */ , + 0x73, 0x30c, 0x307 /* offset 1180 */ , + 0x53, 0x323, 0x307 /* offset 1183 */ , + 0x73, 0x323, 0x307 /* offset 1186 */ , + 0x54, 0x307 /* offset 1189 */ , + 0x74, 0x307 /* offset 1191 */ , + 0x54, 0x323 /* offset 1193 */ , + 0x74, 0x323 /* offset 1195 */ , + 0x54, 0x331 /* offset 1197 */ , + 0x74, 0x331 /* offset 1199 */ , + 0x54, 0x32d /* offset 1201 */ , + 0x74, 0x32d /* offset 1203 */ , + 0x55, 0x324 /* offset 1205 */ , + 0x75, 0x324 /* offset 1207 */ , + 0x55, 0x330 /* offset 1209 */ , + 0x75, 0x330 /* offset 1211 */ , + 0x55, 0x32d /* offset 1213 */ , + 0x75, 0x32d /* offset 1215 */ , + 0x55, 0x303, 0x301 /* offset 1217 */ , + 0x75, 0x303, 0x301 /* offset 1220 */ , + 0x55, 0x304, 0x308 /* offset 1223 */ , + 0x75, 0x304, 0x308 /* offset 1226 */ , + 0x56, 0x303 /* offset 1229 */ , + 0x76, 0x303 /* offset 1231 */ , + 0x56, 0x323 /* offset 1233 */ , + 0x76, 0x323 /* offset 1235 */ , + 0x57, 0x300 /* offset 1237 */ , + 0x77, 0x300 /* offset 1239 */ , + 0x57, 0x301 /* offset 1241 */ , + 0x77, 0x301 /* offset 1243 */ , + 0x57, 0x308 /* offset 1245 */ , + 0x77, 0x308 /* offset 1247 */ , + 0x57, 0x307 /* offset 1249 */ , + 0x77, 0x307 /* offset 1251 */ , + 0x57, 0x323 /* offset 1253 */ , + 0x77, 0x323 /* offset 1255 */ , + 0x58, 0x307 /* offset 1257 */ , + 0x78, 0x307 /* offset 1259 */ , + 0x58, 0x308 /* offset 1261 */ , + 0x78, 0x308 /* offset 1263 */ , + 0x59, 0x307 /* offset 1265 */ , + 0x79, 0x307 /* offset 1267 */ , + 0x5a, 0x302 /* offset 1269 */ , + 0x7a, 0x302 /* offset 1271 */ , + 0x5a, 0x323 /* offset 1273 */ , + 0x7a, 0x323 /* offset 1275 */ , + 0x5a, 0x331 /* offset 1277 */ , + 0x7a, 0x331 /* offset 1279 */ , + 0x68, 0x331 /* offset 1281 */ , + 0x74, 0x308 /* offset 1283 */ , + 0x77, 0x30a /* offset 1285 */ , + 0x79, 0x30a /* offset 1287 */ , + 0x61, 0x2be /* offset 1289 */ , + 0x41, 0x323 /* offset 1291 */ , + 0x61, 0x323 /* offset 1293 */ , + 0x41, 0x309 /* offset 1295 */ , + 0x61, 0x309 /* offset 1297 */ , + 0x41, 0x302, 0x301 /* offset 1299 */ , + 0x61, 0x302, 0x301 /* offset 1302 */ , + 0x41, 0x302, 0x300 /* offset 1305 */ , + 0x61, 0x302, 0x300 /* offset 1308 */ , + 0x41, 0x302, 0x309 /* offset 1311 */ , + 0x61, 0x302, 0x309 /* offset 1314 */ , + 0x41, 0x302, 0x303 /* offset 1317 */ , + 0x61, 0x302, 0x303 /* offset 1320 */ , + 0x41, 0x323, 0x302 /* offset 1323 */ , + 0x61, 0x323, 0x302 /* offset 1326 */ , + 0x41, 0x306, 0x301 /* offset 1329 */ , + 0x61, 0x306, 0x301 /* offset 1332 */ , + 0x41, 0x306, 0x300 /* offset 1335 */ , + 0x61, 0x306, 0x300 /* offset 1338 */ , + 0x41, 0x306, 0x309 /* offset 1341 */ , + 0x61, 0x306, 0x309 /* offset 1344 */ , + 0x41, 0x306, 0x303 /* offset 1347 */ , + 0x61, 0x306, 0x303 /* offset 1350 */ , + 0x41, 0x323, 0x306 /* offset 1353 */ , + 0x61, 0x323, 0x306 /* offset 1356 */ , + 0x45, 0x323 /* offset 1359 */ , + 0x65, 0x323 /* offset 1361 */ , + 0x45, 0x309 /* offset 1363 */ , + 0x65, 0x309 /* offset 1365 */ , + 0x45, 0x303 /* offset 1367 */ , + 0x65, 0x303 /* offset 1369 */ , + 0x45, 0x302, 0x301 /* offset 1371 */ , + 0x65, 0x302, 0x301 /* offset 1374 */ , + 0x45, 0x302, 0x300 /* offset 1377 */ , + 0x65, 0x302, 0x300 /* offset 1380 */ , + 0x45, 0x302, 0x309 /* offset 1383 */ , + 0x65, 0x302, 0x309 /* offset 1386 */ , + 0x45, 0x302, 0x303 /* offset 1389 */ , + 0x65, 0x302, 0x303 /* offset 1392 */ , + 0x45, 0x323, 0x302 /* offset 1395 */ , + 0x65, 0x323, 0x302 /* offset 1398 */ , + 0x49, 0x309 /* offset 1401 */ , + 0x69, 0x309 /* offset 1403 */ , + 0x49, 0x323 /* offset 1405 */ , + 0x69, 0x323 /* offset 1407 */ , + 0x4f, 0x323 /* offset 1409 */ , + 0x6f, 0x323 /* offset 1411 */ , + 0x4f, 0x309 /* offset 1413 */ , + 0x6f, 0x309 /* offset 1415 */ , + 0x4f, 0x302, 0x301 /* offset 1417 */ , + 0x6f, 0x302, 0x301 /* offset 1420 */ , + 0x4f, 0x302, 0x300 /* offset 1423 */ , + 0x6f, 0x302, 0x300 /* offset 1426 */ , + 0x4f, 0x302, 0x309 /* offset 1429 */ , + 0x6f, 0x302, 0x309 /* offset 1432 */ , + 0x4f, 0x302, 0x303 /* offset 1435 */ , + 0x6f, 0x302, 0x303 /* offset 1438 */ , + 0x4f, 0x323, 0x302 /* offset 1441 */ , + 0x6f, 0x323, 0x302 /* offset 1444 */ , + 0x4f, 0x31b, 0x301 /* offset 1447 */ , + 0x6f, 0x31b, 0x301 /* offset 1450 */ , + 0x4f, 0x31b, 0x300 /* offset 1453 */ , + 0x6f, 0x31b, 0x300 /* offset 1456 */ , + 0x4f, 0x31b, 0x309 /* offset 1459 */ , + 0x6f, 0x31b, 0x309 /* offset 1462 */ , + 0x4f, 0x31b, 0x303 /* offset 1465 */ , + 0x6f, 0x31b, 0x303 /* offset 1468 */ , + 0x4f, 0x31b, 0x323 /* offset 1471 */ , + 0x6f, 0x31b, 0x323 /* offset 1474 */ , + 0x55, 0x323 /* offset 1477 */ , + 0x75, 0x323 /* offset 1479 */ , + 0x55, 0x309 /* offset 1481 */ , + 0x75, 0x309 /* offset 1483 */ , + 0x55, 0x31b, 0x301 /* offset 1485 */ , + 0x75, 0x31b, 0x301 /* offset 1488 */ , + 0x55, 0x31b, 0x300 /* offset 1491 */ , + 0x75, 0x31b, 0x300 /* offset 1494 */ , + 0x55, 0x31b, 0x309 /* offset 1497 */ , + 0x75, 0x31b, 0x309 /* offset 1500 */ , + 0x55, 0x31b, 0x303 /* offset 1503 */ , + 0x75, 0x31b, 0x303 /* offset 1506 */ , + 0x55, 0x31b, 0x323 /* offset 1509 */ , + 0x75, 0x31b, 0x323 /* offset 1512 */ , + 0x59, 0x300 /* offset 1515 */ , + 0x79, 0x300 /* offset 1517 */ , + 0x59, 0x323 /* offset 1519 */ , + 0x79, 0x323 /* offset 1521 */ , + 0x59, 0x309 /* offset 1523 */ , + 0x79, 0x309 /* offset 1525 */ , + 0x59, 0x303 /* offset 1527 */ , + 0x79, 0x303 /* offset 1529 */ , + 0x3b1, 0x313 /* offset 1531 */ , + 0x3b1, 0x314 /* offset 1533 */ , + 0x3b1, 0x313, 0x300 /* offset 1535 */ , + 0x3b1, 0x314, 0x300 /* offset 1538 */ , + 0x3b1, 0x313, 0x301 /* offset 1541 */ , + 0x3b1, 0x314, 0x301 /* offset 1544 */ , + 0x3b1, 0x313, 0x342 /* offset 1547 */ , + 0x3b1, 0x314, 0x342 /* offset 1550 */ , + 0x391, 0x313 /* offset 1553 */ , + 0x391, 0x314 /* offset 1555 */ , + 0x391, 0x313, 0x300 /* offset 1557 */ , + 0x391, 0x314, 0x300 /* offset 1560 */ , + 0x391, 0x313, 0x301 /* offset 1563 */ , + 0x391, 0x314, 0x301 /* offset 1566 */ , + 0x391, 0x313, 0x342 /* offset 1569 */ , + 0x391, 0x314, 0x342 /* offset 1572 */ , + 0x3b5, 0x313 /* offset 1575 */ , + 0x3b5, 0x314 /* offset 1577 */ , + 0x3b5, 0x313, 0x300 /* offset 1579 */ , + 0x3b5, 0x314, 0x300 /* offset 1582 */ , + 0x3b5, 0x313, 0x301 /* offset 1585 */ , + 0x3b5, 0x314, 0x301 /* offset 1588 */ , + 0x395, 0x313 /* offset 1591 */ , + 0x395, 0x314 /* offset 1593 */ , + 0x395, 0x313, 0x300 /* offset 1595 */ , + 0x395, 0x314, 0x300 /* offset 1598 */ , + 0x395, 0x313, 0x301 /* offset 1601 */ , + 0x395, 0x314, 0x301 /* offset 1604 */ , + 0x3b7, 0x313 /* offset 1607 */ , + 0x3b7, 0x314 /* offset 1609 */ , + 0x3b7, 0x313, 0x300 /* offset 1611 */ , + 0x3b7, 0x314, 0x300 /* offset 1614 */ , + 0x3b7, 0x313, 0x301 /* offset 1617 */ , + 0x3b7, 0x314, 0x301 /* offset 1620 */ , + 0x3b7, 0x313, 0x342 /* offset 1623 */ , + 0x3b7, 0x314, 0x342 /* offset 1626 */ , + 0x397, 0x313 /* offset 1629 */ , + 0x397, 0x314 /* offset 1631 */ , + 0x397, 0x313, 0x300 /* offset 1633 */ , + 0x397, 0x314, 0x300 /* offset 1636 */ , + 0x397, 0x313, 0x301 /* offset 1639 */ , + 0x397, 0x314, 0x301 /* offset 1642 */ , + 0x397, 0x313, 0x342 /* offset 1645 */ , + 0x397, 0x314, 0x342 /* offset 1648 */ , + 0x3b9, 0x313 /* offset 1651 */ , + 0x3b9, 0x314 /* offset 1653 */ , + 0x3b9, 0x313, 0x300 /* offset 1655 */ , + 0x3b9, 0x314, 0x300 /* offset 1658 */ , + 0x3b9, 0x313, 0x301 /* offset 1661 */ , + 0x3b9, 0x314, 0x301 /* offset 1664 */ , + 0x3b9, 0x313, 0x342 /* offset 1667 */ , + 0x3b9, 0x314, 0x342 /* offset 1670 */ , + 0x399, 0x313 /* offset 1673 */ , + 0x399, 0x314 /* offset 1675 */ , + 0x399, 0x313, 0x300 /* offset 1677 */ , + 0x399, 0x314, 0x300 /* offset 1680 */ , + 0x399, 0x313, 0x301 /* offset 1683 */ , + 0x399, 0x314, 0x301 /* offset 1686 */ , + 0x399, 0x313, 0x342 /* offset 1689 */ , + 0x399, 0x314, 0x342 /* offset 1692 */ , + 0x3bf, 0x313 /* offset 1695 */ , + 0x3bf, 0x314 /* offset 1697 */ , + 0x3bf, 0x313, 0x300 /* offset 1699 */ , + 0x3bf, 0x314, 0x300 /* offset 1702 */ , + 0x3bf, 0x313, 0x301 /* offset 1705 */ , + 0x3bf, 0x314, 0x301 /* offset 1708 */ , + 0x39f, 0x313 /* offset 1711 */ , + 0x39f, 0x314 /* offset 1713 */ , + 0x39f, 0x313, 0x300 /* offset 1715 */ , + 0x39f, 0x314, 0x300 /* offset 1718 */ , + 0x39f, 0x313, 0x301 /* offset 1721 */ , + 0x39f, 0x314, 0x301 /* offset 1724 */ , + 0x3c5, 0x313 /* offset 1727 */ , + 0x3c5, 0x314 /* offset 1729 */ , + 0x3c5, 0x313, 0x300 /* offset 1731 */ , + 0x3c5, 0x314, 0x300 /* offset 1734 */ , + 0x3c5, 0x313, 0x301 /* offset 1737 */ , + 0x3c5, 0x314, 0x301 /* offset 1740 */ , + 0x3c5, 0x313, 0x342 /* offset 1743 */ , + 0x3c5, 0x314, 0x342 /* offset 1746 */ , + 0x3a5, 0x314 /* offset 1749 */ , + 0x3a5, 0x314, 0x300 /* offset 1751 */ , + 0x3a5, 0x314, 0x301 /* offset 1754 */ , + 0x3a5, 0x314, 0x342 /* offset 1757 */ , + 0x3c9, 0x313 /* offset 1760 */ , + 0x3c9, 0x314 /* offset 1762 */ , + 0x3c9, 0x313, 0x300 /* offset 1764 */ , + 0x3c9, 0x314, 0x300 /* offset 1767 */ , + 0x3c9, 0x313, 0x301 /* offset 1770 */ , + 0x3c9, 0x314, 0x301 /* offset 1773 */ , + 0x3c9, 0x313, 0x342 /* offset 1776 */ , + 0x3c9, 0x314, 0x342 /* offset 1779 */ , + 0x3a9, 0x313 /* offset 1782 */ , + 0x3a9, 0x314 /* offset 1784 */ , + 0x3a9, 0x313, 0x300 /* offset 1786 */ , + 0x3a9, 0x314, 0x300 /* offset 1789 */ , + 0x3a9, 0x313, 0x301 /* offset 1792 */ , + 0x3a9, 0x314, 0x301 /* offset 1795 */ , + 0x3a9, 0x313, 0x342 /* offset 1798 */ , + 0x3a9, 0x314, 0x342 /* offset 1801 */ , + 0x3b1, 0x300 /* offset 1804 */ , + 0x3b5, 0x300 /* offset 1806 */ , + 0x3b7, 0x300 /* offset 1808 */ , + 0x3b9, 0x300 /* offset 1810 */ , + 0x3bf, 0x300 /* offset 1812 */ , + 0x3c5, 0x300 /* offset 1814 */ , + 0x3c9, 0x300 /* offset 1816 */ , + 0x3b1, 0x313, 0x345 /* offset 1818 */ , + 0x3b1, 0x314, 0x345 /* offset 1821 */ , + 0x3b1, 0x313, 0x300, 0x345 /* offset 1824 */ , + 0x3b1, 0x314, 0x300, 0x345 /* offset 1828 */ , + 0x3b1, 0x313, 0x301, 0x345 /* offset 1832 */ , + 0x3b1, 0x314, 0x301, 0x345 /* offset 1836 */ , + 0x3b1, 0x313, 0x342, 0x345 /* offset 1840 */ , + 0x3b1, 0x314, 0x342, 0x345 /* offset 1844 */ , + 0x391, 0x313, 0x345 /* offset 1848 */ , + 0x391, 0x314, 0x345 /* offset 1851 */ , + 0x391, 0x313, 0x300, 0x345 /* offset 1854 */ , + 0x391, 0x314, 0x300, 0x345 /* offset 1858 */ , + 0x391, 0x313, 0x301, 0x345 /* offset 1862 */ , + 0x391, 0x314, 0x301, 0x345 /* offset 1866 */ , + 0x391, 0x313, 0x342, 0x345 /* offset 1870 */ , + 0x391, 0x314, 0x342, 0x345 /* offset 1874 */ , + 0x3b7, 0x313, 0x345 /* offset 1878 */ , + 0x3b7, 0x314, 0x345 /* offset 1881 */ , + 0x3b7, 0x313, 0x300, 0x345 /* offset 1884 */ , + 0x3b7, 0x314, 0x300, 0x345 /* offset 1888 */ , + 0x3b7, 0x313, 0x301, 0x345 /* offset 1892 */ , + 0x3b7, 0x314, 0x301, 0x345 /* offset 1896 */ , + 0x3b7, 0x313, 0x342, 0x345 /* offset 1900 */ , + 0x3b7, 0x314, 0x342, 0x345 /* offset 1904 */ , + 0x397, 0x313, 0x345 /* offset 1908 */ , + 0x397, 0x314, 0x345 /* offset 1911 */ , + 0x397, 0x313, 0x300, 0x345 /* offset 1914 */ , + 0x397, 0x314, 0x300, 0x345 /* offset 1918 */ , + 0x397, 0x313, 0x301, 0x345 /* offset 1922 */ , + 0x397, 0x314, 0x301, 0x345 /* offset 1926 */ , + 0x397, 0x313, 0x342, 0x345 /* offset 1930 */ , + 0x397, 0x314, 0x342, 0x345 /* offset 1934 */ , + 0x3c9, 0x313, 0x345 /* offset 1938 */ , + 0x3c9, 0x314, 0x345 /* offset 1941 */ , + 0x3c9, 0x313, 0x300, 0x345 /* offset 1944 */ , + 0x3c9, 0x314, 0x300, 0x345 /* offset 1948 */ , + 0x3c9, 0x313, 0x301, 0x345 /* offset 1952 */ , + 0x3c9, 0x314, 0x301, 0x345 /* offset 1956 */ , + 0x3c9, 0x313, 0x342, 0x345 /* offset 1960 */ , + 0x3c9, 0x314, 0x342, 0x345 /* offset 1964 */ , + 0x3a9, 0x313, 0x345 /* offset 1968 */ , + 0x3a9, 0x314, 0x345 /* offset 1971 */ , + 0x3a9, 0x313, 0x300, 0x345 /* offset 1974 */ , + 0x3a9, 0x314, 0x300, 0x345 /* offset 1978 */ , + 0x3a9, 0x313, 0x301, 0x345 /* offset 1982 */ , + 0x3a9, 0x314, 0x301, 0x345 /* offset 1986 */ , + 0x3a9, 0x313, 0x342, 0x345 /* offset 1990 */ , + 0x3a9, 0x314, 0x342, 0x345 /* offset 1994 */ , + 0x3b1, 0x306 /* offset 1998 */ , + 0x3b1, 0x304 /* offset 2000 */ , + 0x3b1, 0x300, 0x345 /* offset 2002 */ , + 0x3b1, 0x345 /* offset 2005 */ , + 0x3b1, 0x301, 0x345 /* offset 2007 */ , + 0x3b1, 0x342 /* offset 2010 */ , + 0x3b1, 0x342, 0x345 /* offset 2012 */ , + 0x391, 0x306 /* offset 2015 */ , + 0x391, 0x304 /* offset 2017 */ , + 0x391, 0x300 /* offset 2019 */ , + 0x391, 0x345 /* offset 2021 */ , + 0x20, 0x313 /* offset 2023 */ , + 0x3b9 /* offset 2025 */ , + 0x20, 0x342 /* offset 2026 */ , + 0x20, 0x308, 0x342 /* offset 2028 */ , + 0x3b7, 0x300, 0x345 /* offset 2031 */ , + 0x3b7, 0x345 /* offset 2034 */ , + 0x3b7, 0x301, 0x345 /* offset 2036 */ , + 0x3b7, 0x342 /* offset 2039 */ , + 0x3b7, 0x342, 0x345 /* offset 2041 */ , + 0x395, 0x300 /* offset 2044 */ , + 0x397, 0x300 /* offset 2046 */ , + 0x397, 0x345 /* offset 2048 */ , + 0x20, 0x313, 0x300 /* offset 2050 */ , + 0x20, 0x313, 0x301 /* offset 2053 */ , + 0x20, 0x313, 0x342 /* offset 2056 */ , + 0x3b9, 0x306 /* offset 2059 */ , + 0x3b9, 0x304 /* offset 2061 */ , + 0x3b9, 0x308, 0x300 /* offset 2063 */ , + 0x3b9, 0x342 /* offset 2066 */ , + 0x3b9, 0x308, 0x342 /* offset 2068 */ , + 0x399, 0x306 /* offset 2071 */ , + 0x399, 0x304 /* offset 2073 */ , + 0x399, 0x300 /* offset 2075 */ , + 0x20, 0x314, 0x300 /* offset 2077 */ , + 0x20, 0x314, 0x301 /* offset 2080 */ , + 0x20, 0x314, 0x342 /* offset 2083 */ , + 0x3c5, 0x306 /* offset 2086 */ , + 0x3c5, 0x304 /* offset 2088 */ , + 0x3c5, 0x308, 0x300 /* offset 2090 */ , + 0x3c1, 0x313 /* offset 2093 */ , + 0x3c1, 0x314 /* offset 2095 */ , + 0x3c5, 0x342 /* offset 2097 */ , + 0x3c5, 0x308, 0x342 /* offset 2099 */ , + 0x3a5, 0x306 /* offset 2102 */ , + 0x3a5, 0x304 /* offset 2104 */ , + 0x3a5, 0x300 /* offset 2106 */ , + 0x3a1, 0x314 /* offset 2108 */ , + 0x20, 0x308, 0x300 /* offset 2110 */ , + 0x60 /* offset 2113 */ , + 0x3c9, 0x300, 0x345 /* offset 2114 */ , + 0x3c9, 0x345 /* offset 2117 */ , + 0x3c9, 0x301, 0x345 /* offset 2119 */ , + 0x3c9, 0x342 /* offset 2122 */ , + 0x3c9, 0x342, 0x345 /* offset 2124 */ , + 0x39f, 0x300 /* offset 2127 */ , + 0x3a9, 0x300 /* offset 2129 */ , + 0x3a9, 0x345 /* offset 2131 */ , + 0x20, 0x314 /* offset 2133 */ , + 0x2010 /* offset 2135 */ , + 0x20, 0x333 /* offset 2136 */ , + 0x2e /* offset 2138 */ , + 0x2e, 0x2e /* offset 2139 */ , + 0x2e, 0x2e, 0x2e /* offset 2141 */ , + 0x2032, 0x2032 /* offset 2144 */ , + 0x2032, 0x2032, 0x2032 /* offset 2146 */ , + 0x2035, 0x2035 /* offset 2149 */ , + 0x2035, 0x2035, 0x2035 /* offset 2151 */ , + 0x21, 0x21 /* offset 2154 */ , + 0x20, 0x305 /* offset 2156 */ , + 0x3f, 0x3f /* offset 2158 */ , + 0x3f, 0x21 /* offset 2160 */ , + 0x21, 0x3f /* offset 2162 */ , + 0x2032, 0x2032, 0x2032, 0x2032 /* offset 2164 */ , + 0x30 /* offset 2168 */ , + 0x69 /* offset 2169 */ , + 0x34 /* offset 2170 */ , + 0x35 /* offset 2171 */ , + 0x36 /* offset 2172 */ , + 0x37 /* offset 2173 */ , + 0x38 /* offset 2174 */ , + 0x39 /* offset 2175 */ , + 0x2b /* offset 2176 */ , + 0x2212 /* offset 2177 */ , + 0x3d /* offset 2178 */ , + 0x28 /* offset 2179 */ , + 0x29 /* offset 2180 */ , + 0x6e /* offset 2181 */ , + 0x52, 0x73 /* offset 2182 */ , + 0x61, 0x2f, 0x63 /* offset 2184 */ , + 0x61, 0x2f, 0x73 /* offset 2187 */ , + 0x43 /* offset 2190 */ , + 0xb0, 0x43 /* offset 2191 */ , + 0x63, 0x2f, 0x6f /* offset 2193 */ , + 0x63, 0x2f, 0x75 /* offset 2196 */ , + 0x190 /* offset 2199 */ , + 0xb0, 0x46 /* offset 2200 */ , + 0x67 /* offset 2202 */ , + 0x48 /* offset 2203 */ , + 0x127 /* offset 2204 */ , + 0x49 /* offset 2205 */ , + 0x4c /* offset 2206 */ , + 0x4e /* offset 2207 */ , + 0x4e, 0x6f /* offset 2208 */ , + 0x50 /* offset 2210 */ , + 0x51 /* offset 2211 */ , + 0x52 /* offset 2212 */ , + 0x53, 0x4d /* offset 2213 */ , + 0x54, 0x45, 0x4c /* offset 2215 */ , + 0x54, 0x4d /* offset 2218 */ , + 0x5a /* offset 2220 */ , + 0x3a9 /* offset 2221 */ , + 0x4b /* offset 2222 */ , + 0x42 /* offset 2223 */ , + 0x65 /* offset 2224 */ , + 0x45 /* offset 2225 */ , + 0x46 /* offset 2226 */ , + 0x4d /* offset 2227 */ , + 0x5d0 /* offset 2228 */ , + 0x5d1 /* offset 2229 */ , + 0x5d2 /* offset 2230 */ , + 0x5d3 /* offset 2231 */ , + 0x3b3 /* offset 2232 */ , + 0x393 /* offset 2233 */ , + 0x3a0 /* offset 2234 */ , + 0x2211 /* offset 2235 */ , + 0x44 /* offset 2236 */ , + 0x64 /* offset 2237 */ , + 0x31, 0x2044, 0x33 /* offset 2238 */ , + 0x32, 0x2044, 0x33 /* offset 2241 */ , + 0x31, 0x2044, 0x35 /* offset 2244 */ , + 0x32, 0x2044, 0x35 /* offset 2247 */ , + 0x33, 0x2044, 0x35 /* offset 2250 */ , + 0x34, 0x2044, 0x35 /* offset 2253 */ , + 0x31, 0x2044, 0x36 /* offset 2256 */ , + 0x35, 0x2044, 0x36 /* offset 2259 */ , + 0x31, 0x2044, 0x38 /* offset 2262 */ , + 0x33, 0x2044, 0x38 /* offset 2265 */ , + 0x35, 0x2044, 0x38 /* offset 2268 */ , + 0x37, 0x2044, 0x38 /* offset 2271 */ , + 0x31, 0x2044 /* offset 2274 */ , + 0x49, 0x49 /* offset 2276 */ , + 0x49, 0x49, 0x49 /* offset 2278 */ , + 0x49, 0x56 /* offset 2281 */ , + 0x56 /* offset 2283 */ , + 0x56, 0x49 /* offset 2284 */ , + 0x56, 0x49, 0x49 /* offset 2286 */ , + 0x56, 0x49, 0x49, 0x49 /* offset 2289 */ , + 0x49, 0x58 /* offset 2293 */ , + 0x58 /* offset 2295 */ , + 0x58, 0x49 /* offset 2296 */ , + 0x58, 0x49, 0x49 /* offset 2298 */ , + 0x69, 0x69 /* offset 2301 */ , + 0x69, 0x69, 0x69 /* offset 2303 */ , + 0x69, 0x76 /* offset 2306 */ , + 0x76 /* offset 2308 */ , + 0x76, 0x69 /* offset 2309 */ , + 0x76, 0x69, 0x69 /* offset 2311 */ , + 0x76, 0x69, 0x69, 0x69 /* offset 2314 */ , + 0x69, 0x78 /* offset 2318 */ , + 0x78, 0x69 /* offset 2320 */ , + 0x78, 0x69, 0x69 /* offset 2322 */ , + 0x63 /* offset 2325 */ , + 0x6d /* offset 2326 */ , + 0x2190, 0x338 /* offset 2327 */ , + 0x2192, 0x338 /* offset 2329 */ , + 0x2194, 0x338 /* offset 2331 */ , + 0x21d0, 0x338 /* offset 2333 */ , + 0x21d4, 0x338 /* offset 2335 */ , + 0x21d2, 0x338 /* offset 2337 */ , + 0x2203, 0x338 /* offset 2339 */ , + 0x2208, 0x338 /* offset 2341 */ , + 0x220b, 0x338 /* offset 2343 */ , + 0x2223, 0x338 /* offset 2345 */ , + 0x2225, 0x338 /* offset 2347 */ , + 0x222b, 0x222b /* offset 2349 */ , + 0x222b, 0x222b, 0x222b /* offset 2351 */ , + 0x222e, 0x222e /* offset 2354 */ , + 0x222e, 0x222e, 0x222e /* offset 2356 */ , + 0x223c, 0x338 /* offset 2359 */ , + 0x2243, 0x338 /* offset 2361 */ , + 0x2245, 0x338 /* offset 2363 */ , + 0x2248, 0x338 /* offset 2365 */ , + 0x3d, 0x338 /* offset 2367 */ , + 0x2261, 0x338 /* offset 2369 */ , + 0x224d, 0x338 /* offset 2371 */ , + 0x3c, 0x338 /* offset 2373 */ , + 0x3e, 0x338 /* offset 2375 */ , + 0x2264, 0x338 /* offset 2377 */ , + 0x2265, 0x338 /* offset 2379 */ , + 0x2272, 0x338 /* offset 2381 */ , + 0x2273, 0x338 /* offset 2383 */ , + 0x2276, 0x338 /* offset 2385 */ , + 0x2277, 0x338 /* offset 2387 */ , + 0x227a, 0x338 /* offset 2389 */ , + 0x227b, 0x338 /* offset 2391 */ , + 0x2282, 0x338 /* offset 2393 */ , + 0x2283, 0x338 /* offset 2395 */ , + 0x2286, 0x338 /* offset 2397 */ , + 0x2287, 0x338 /* offset 2399 */ , + 0x22a2, 0x338 /* offset 2401 */ , + 0x22a8, 0x338 /* offset 2403 */ , + 0x22a9, 0x338 /* offset 2405 */ , + 0x22ab, 0x338 /* offset 2407 */ , + 0x227c, 0x338 /* offset 2409 */ , + 0x227d, 0x338 /* offset 2411 */ , + 0x2291, 0x338 /* offset 2413 */ , + 0x2292, 0x338 /* offset 2415 */ , + 0x22b2, 0x338 /* offset 2417 */ , + 0x22b3, 0x338 /* offset 2419 */ , + 0x22b4, 0x338 /* offset 2421 */ , + 0x22b5, 0x338 /* offset 2423 */ , + 0x3008 /* offset 2425 */ , + 0x3009 /* offset 2426 */ , + 0x31, 0x30 /* offset 2427 */ , + 0x31, 0x31 /* offset 2429 */ , + 0x31, 0x32 /* offset 2431 */ , + 0x31, 0x33 /* offset 2433 */ , + 0x31, 0x34 /* offset 2435 */ , + 0x31, 0x35 /* offset 2437 */ , + 0x31, 0x36 /* offset 2439 */ , + 0x31, 0x37 /* offset 2441 */ , + 0x31, 0x38 /* offset 2443 */ , + 0x31, 0x39 /* offset 2445 */ , + 0x32, 0x30 /* offset 2447 */ , + 0x28, 0x31, 0x29 /* offset 2449 */ , + 0x28, 0x32, 0x29 /* offset 2452 */ , + 0x28, 0x33, 0x29 /* offset 2455 */ , + 0x28, 0x34, 0x29 /* offset 2458 */ , + 0x28, 0x35, 0x29 /* offset 2461 */ , + 0x28, 0x36, 0x29 /* offset 2464 */ , + 0x28, 0x37, 0x29 /* offset 2467 */ , + 0x28, 0x38, 0x29 /* offset 2470 */ , + 0x28, 0x39, 0x29 /* offset 2473 */ , + 0x28, 0x31, 0x30, 0x29 /* offset 2476 */ , + 0x28, 0x31, 0x31, 0x29 /* offset 2480 */ , + 0x28, 0x31, 0x32, 0x29 /* offset 2484 */ , + 0x28, 0x31, 0x33, 0x29 /* offset 2488 */ , + 0x28, 0x31, 0x34, 0x29 /* offset 2492 */ , + 0x28, 0x31, 0x35, 0x29 /* offset 2496 */ , + 0x28, 0x31, 0x36, 0x29 /* offset 2500 */ , + 0x28, 0x31, 0x37, 0x29 /* offset 2504 */ , + 0x28, 0x31, 0x38, 0x29 /* offset 2508 */ , + 0x28, 0x31, 0x39, 0x29 /* offset 2512 */ , + 0x28, 0x32, 0x30, 0x29 /* offset 2516 */ , + 0x31, 0x2e /* offset 2520 */ , + 0x32, 0x2e /* offset 2522 */ , + 0x33, 0x2e /* offset 2524 */ , + 0x34, 0x2e /* offset 2526 */ , + 0x35, 0x2e /* offset 2528 */ , + 0x36, 0x2e /* offset 2530 */ , + 0x37, 0x2e /* offset 2532 */ , + 0x38, 0x2e /* offset 2534 */ , + 0x39, 0x2e /* offset 2536 */ , + 0x31, 0x30, 0x2e /* offset 2538 */ , + 0x31, 0x31, 0x2e /* offset 2541 */ , + 0x31, 0x32, 0x2e /* offset 2544 */ , + 0x31, 0x33, 0x2e /* offset 2547 */ , + 0x31, 0x34, 0x2e /* offset 2550 */ , + 0x31, 0x35, 0x2e /* offset 2553 */ , + 0x31, 0x36, 0x2e /* offset 2556 */ , + 0x31, 0x37, 0x2e /* offset 2559 */ , + 0x31, 0x38, 0x2e /* offset 2562 */ , + 0x31, 0x39, 0x2e /* offset 2565 */ , + 0x32, 0x30, 0x2e /* offset 2568 */ , + 0x28, 0x61, 0x29 /* offset 2571 */ , + 0x28, 0x62, 0x29 /* offset 2574 */ , + 0x28, 0x63, 0x29 /* offset 2577 */ , + 0x28, 0x64, 0x29 /* offset 2580 */ , + 0x28, 0x65, 0x29 /* offset 2583 */ , + 0x28, 0x66, 0x29 /* offset 2586 */ , + 0x28, 0x67, 0x29 /* offset 2589 */ , + 0x28, 0x68, 0x29 /* offset 2592 */ , + 0x28, 0x69, 0x29 /* offset 2595 */ , + 0x28, 0x6a, 0x29 /* offset 2598 */ , + 0x28, 0x6b, 0x29 /* offset 2601 */ , + 0x28, 0x6c, 0x29 /* offset 2604 */ , + 0x28, 0x6d, 0x29 /* offset 2607 */ , + 0x28, 0x6e, 0x29 /* offset 2610 */ , + 0x28, 0x6f, 0x29 /* offset 2613 */ , + 0x28, 0x70, 0x29 /* offset 2616 */ , + 0x28, 0x71, 0x29 /* offset 2619 */ , + 0x28, 0x72, 0x29 /* offset 2622 */ , + 0x28, 0x73, 0x29 /* offset 2625 */ , + 0x28, 0x74, 0x29 /* offset 2628 */ , + 0x28, 0x75, 0x29 /* offset 2631 */ , + 0x28, 0x76, 0x29 /* offset 2634 */ , + 0x28, 0x77, 0x29 /* offset 2637 */ , + 0x28, 0x78, 0x29 /* offset 2640 */ , + 0x28, 0x79, 0x29 /* offset 2643 */ , + 0x28, 0x7a, 0x29 /* offset 2646 */ , + 0x41 /* offset 2649 */ , + 0x47 /* offset 2650 */ , + 0x4a /* offset 2651 */ , + 0x4f /* offset 2652 */ , + 0x53 /* offset 2653 */ , + 0x54 /* offset 2654 */ , + 0x55 /* offset 2655 */ , + 0x57 /* offset 2656 */ , + 0x59 /* offset 2657 */ , + 0x62 /* offset 2658 */ , + 0x66 /* offset 2659 */ , + 0x6b /* offset 2660 */ , + 0x70 /* offset 2661 */ , + 0x71 /* offset 2662 */ , + 0x74 /* offset 2663 */ , + 0x75 /* offset 2664 */ , + 0x7a /* offset 2665 */ , + 0x222b, 0x222b, 0x222b, 0x222b /* offset 2666 */ , + 0x3a, 0x3a, 0x3d /* offset 2670 */ , + 0x3d, 0x3d /* offset 2673 */ , + 0x3d, 0x3d, 0x3d /* offset 2675 */ , + 0x2add, 0x338 /* offset 2678 */ , + 0x6bcd /* offset 2680 */ , + 0x9f9f /* offset 2681 */ , + 0x4e00 /* offset 2682 */ , + 0x4e28 /* offset 2683 */ , + 0x4e36 /* offset 2684 */ , + 0x4e3f /* offset 2685 */ , + 0x4e59 /* offset 2686 */ , + 0x4e85 /* offset 2687 */ , + 0x4e8c /* offset 2688 */ , + 0x4ea0 /* offset 2689 */ , + 0x4eba /* offset 2690 */ , + 0x513f /* offset 2691 */ , + 0x5165 /* offset 2692 */ , + 0x516b /* offset 2693 */ , + 0x5182 /* offset 2694 */ , + 0x5196 /* offset 2695 */ , + 0x51ab /* offset 2696 */ , + 0x51e0 /* offset 2697 */ , + 0x51f5 /* offset 2698 */ , + 0x5200 /* offset 2699 */ , + 0x529b /* offset 2700 */ , + 0x52f9 /* offset 2701 */ , + 0x5315 /* offset 2702 */ , + 0x531a /* offset 2703 */ , + 0x5338 /* offset 2704 */ , + 0x5341 /* offset 2705 */ , + 0x535c /* offset 2706 */ , + 0x5369 /* offset 2707 */ , + 0x5382 /* offset 2708 */ , + 0x53b6 /* offset 2709 */ , + 0x53c8 /* offset 2710 */ , + 0x53e3 /* offset 2711 */ , + 0x56d7 /* offset 2712 */ , + 0x571f /* offset 2713 */ , + 0x58eb /* offset 2714 */ , + 0x5902 /* offset 2715 */ , + 0x590a /* offset 2716 */ , + 0x5915 /* offset 2717 */ , + 0x5927 /* offset 2718 */ , + 0x5973 /* offset 2719 */ , + 0x5b50 /* offset 2720 */ , + 0x5b80 /* offset 2721 */ , + 0x5bf8 /* offset 2722 */ , + 0x5c0f /* offset 2723 */ , + 0x5c22 /* offset 2724 */ , + 0x5c38 /* offset 2725 */ , + 0x5c6e /* offset 2726 */ , + 0x5c71 /* offset 2727 */ , + 0x5ddb /* offset 2728 */ , + 0x5de5 /* offset 2729 */ , + 0x5df1 /* offset 2730 */ , + 0x5dfe /* offset 2731 */ , + 0x5e72 /* offset 2732 */ , + 0x5e7a /* offset 2733 */ , + 0x5e7f /* offset 2734 */ , + 0x5ef4 /* offset 2735 */ , + 0x5efe /* offset 2736 */ , + 0x5f0b /* offset 2737 */ , + 0x5f13 /* offset 2738 */ , + 0x5f50 /* offset 2739 */ , + 0x5f61 /* offset 2740 */ , + 0x5f73 /* offset 2741 */ , + 0x5fc3 /* offset 2742 */ , + 0x6208 /* offset 2743 */ , + 0x6236 /* offset 2744 */ , + 0x624b /* offset 2745 */ , + 0x652f /* offset 2746 */ , + 0x6534 /* offset 2747 */ , + 0x6587 /* offset 2748 */ , + 0x6597 /* offset 2749 */ , + 0x65a4 /* offset 2750 */ , + 0x65b9 /* offset 2751 */ , + 0x65e0 /* offset 2752 */ , + 0x65e5 /* offset 2753 */ , + 0x66f0 /* offset 2754 */ , + 0x6708 /* offset 2755 */ , + 0x6728 /* offset 2756 */ , + 0x6b20 /* offset 2757 */ , + 0x6b62 /* offset 2758 */ , + 0x6b79 /* offset 2759 */ , + 0x6bb3 /* offset 2760 */ , + 0x6bcb /* offset 2761 */ , + 0x6bd4 /* offset 2762 */ , + 0x6bdb /* offset 2763 */ , + 0x6c0f /* offset 2764 */ , + 0x6c14 /* offset 2765 */ , + 0x6c34 /* offset 2766 */ , + 0x706b /* offset 2767 */ , + 0x722a /* offset 2768 */ , + 0x7236 /* offset 2769 */ , + 0x723b /* offset 2770 */ , + 0x723f /* offset 2771 */ , + 0x7247 /* offset 2772 */ , + 0x7259 /* offset 2773 */ , + 0x725b /* offset 2774 */ , + 0x72ac /* offset 2775 */ , + 0x7384 /* offset 2776 */ , + 0x7389 /* offset 2777 */ , + 0x74dc /* offset 2778 */ , + 0x74e6 /* offset 2779 */ , + 0x7518 /* offset 2780 */ , + 0x751f /* offset 2781 */ , + 0x7528 /* offset 2782 */ , + 0x7530 /* offset 2783 */ , + 0x758b /* offset 2784 */ , + 0x7592 /* offset 2785 */ , + 0x7676 /* offset 2786 */ , + 0x767d /* offset 2787 */ , + 0x76ae /* offset 2788 */ , + 0x76bf /* offset 2789 */ , + 0x76ee /* offset 2790 */ , + 0x77db /* offset 2791 */ , + 0x77e2 /* offset 2792 */ , + 0x77f3 /* offset 2793 */ , + 0x793a /* offset 2794 */ , + 0x79b8 /* offset 2795 */ , + 0x79be /* offset 2796 */ , + 0x7a74 /* offset 2797 */ , + 0x7acb /* offset 2798 */ , + 0x7af9 /* offset 2799 */ , + 0x7c73 /* offset 2800 */ , + 0x7cf8 /* offset 2801 */ , + 0x7f36 /* offset 2802 */ , + 0x7f51 /* offset 2803 */ , + 0x7f8a /* offset 2804 */ , + 0x7fbd /* offset 2805 */ , + 0x8001 /* offset 2806 */ , + 0x800c /* offset 2807 */ , + 0x8012 /* offset 2808 */ , + 0x8033 /* offset 2809 */ , + 0x807f /* offset 2810 */ , + 0x8089 /* offset 2811 */ , + 0x81e3 /* offset 2812 */ , + 0x81ea /* offset 2813 */ , + 0x81f3 /* offset 2814 */ , + 0x81fc /* offset 2815 */ , + 0x820c /* offset 2816 */ , + 0x821b /* offset 2817 */ , + 0x821f /* offset 2818 */ , + 0x826e /* offset 2819 */ , + 0x8272 /* offset 2820 */ , + 0x8278 /* offset 2821 */ , + 0x864d /* offset 2822 */ , + 0x866b /* offset 2823 */ , + 0x8840 /* offset 2824 */ , + 0x884c /* offset 2825 */ , + 0x8863 /* offset 2826 */ , + 0x897e /* offset 2827 */ , + 0x898b /* offset 2828 */ , + 0x89d2 /* offset 2829 */ , + 0x8a00 /* offset 2830 */ , + 0x8c37 /* offset 2831 */ , + 0x8c46 /* offset 2832 */ , + 0x8c55 /* offset 2833 */ , + 0x8c78 /* offset 2834 */ , + 0x8c9d /* offset 2835 */ , + 0x8d64 /* offset 2836 */ , + 0x8d70 /* offset 2837 */ , + 0x8db3 /* offset 2838 */ , + 0x8eab /* offset 2839 */ , + 0x8eca /* offset 2840 */ , + 0x8f9b /* offset 2841 */ , + 0x8fb0 /* offset 2842 */ , + 0x8fb5 /* offset 2843 */ , + 0x9091 /* offset 2844 */ , + 0x9149 /* offset 2845 */ , + 0x91c6 /* offset 2846 */ , + 0x91cc /* offset 2847 */ , + 0x91d1 /* offset 2848 */ , + 0x9577 /* offset 2849 */ , + 0x9580 /* offset 2850 */ , + 0x961c /* offset 2851 */ , + 0x96b6 /* offset 2852 */ , + 0x96b9 /* offset 2853 */ , + 0x96e8 /* offset 2854 */ , + 0x9751 /* offset 2855 */ , + 0x975e /* offset 2856 */ , + 0x9762 /* offset 2857 */ , + 0x9769 /* offset 2858 */ , + 0x97cb /* offset 2859 */ , + 0x97ed /* offset 2860 */ , + 0x97f3 /* offset 2861 */ , + 0x9801 /* offset 2862 */ , + 0x98a8 /* offset 2863 */ , + 0x98db /* offset 2864 */ , + 0x98df /* offset 2865 */ , + 0x9996 /* offset 2866 */ , + 0x9999 /* offset 2867 */ , + 0x99ac /* offset 2868 */ , + 0x9aa8 /* offset 2869 */ , + 0x9ad8 /* offset 2870 */ , + 0x9adf /* offset 2871 */ , + 0x9b25 /* offset 2872 */ , + 0x9b2f /* offset 2873 */ , + 0x9b32 /* offset 2874 */ , + 0x9b3c /* offset 2875 */ , + 0x9b5a /* offset 2876 */ , + 0x9ce5 /* offset 2877 */ , + 0x9e75 /* offset 2878 */ , + 0x9e7f /* offset 2879 */ , + 0x9ea5 /* offset 2880 */ , + 0x9ebb /* offset 2881 */ , + 0x9ec3 /* offset 2882 */ , + 0x9ecd /* offset 2883 */ , + 0x9ed1 /* offset 2884 */ , + 0x9ef9 /* offset 2885 */ , + 0x9efd /* offset 2886 */ , + 0x9f0e /* offset 2887 */ , + 0x9f13 /* offset 2888 */ , + 0x9f20 /* offset 2889 */ , + 0x9f3b /* offset 2890 */ , + 0x9f4a /* offset 2891 */ , + 0x9f52 /* offset 2892 */ , + 0x9f8d /* offset 2893 */ , + 0x9f9c /* offset 2894 */ , + 0x9fa0 /* offset 2895 */ , + 0x3012 /* offset 2896 */ , + 0x5344 /* offset 2897 */ , + 0x5345 /* offset 2898 */ , + 0x304b, 0x3099 /* offset 2899 */ , + 0x304d, 0x3099 /* offset 2901 */ , + 0x304f, 0x3099 /* offset 2903 */ , + 0x3051, 0x3099 /* offset 2905 */ , + 0x3053, 0x3099 /* offset 2907 */ , + 0x3055, 0x3099 /* offset 2909 */ , + 0x3057, 0x3099 /* offset 2911 */ , + 0x3059, 0x3099 /* offset 2913 */ , + 0x305b, 0x3099 /* offset 2915 */ , + 0x305d, 0x3099 /* offset 2917 */ , + 0x305f, 0x3099 /* offset 2919 */ , + 0x3061, 0x3099 /* offset 2921 */ , + 0x3064, 0x3099 /* offset 2923 */ , + 0x3066, 0x3099 /* offset 2925 */ , + 0x3068, 0x3099 /* offset 2927 */ , + 0x306f, 0x3099 /* offset 2929 */ , + 0x306f, 0x309a /* offset 2931 */ , + 0x3072, 0x3099 /* offset 2933 */ , + 0x3072, 0x309a /* offset 2935 */ , + 0x3075, 0x3099 /* offset 2937 */ , + 0x3075, 0x309a /* offset 2939 */ , + 0x3078, 0x3099 /* offset 2941 */ , + 0x3078, 0x309a /* offset 2943 */ , + 0x307b, 0x3099 /* offset 2945 */ , + 0x307b, 0x309a /* offset 2947 */ , + 0x3046, 0x3099 /* offset 2949 */ , + 0x20, 0x3099 /* offset 2951 */ , + 0x20, 0x309a /* offset 2953 */ , + 0x309d, 0x3099 /* offset 2955 */ , + 0x3088, 0x308a /* offset 2957 */ , + 0x30ab, 0x3099 /* offset 2959 */ , + 0x30ad, 0x3099 /* offset 2961 */ , + 0x30af, 0x3099 /* offset 2963 */ , + 0x30b1, 0x3099 /* offset 2965 */ , + 0x30b3, 0x3099 /* offset 2967 */ , + 0x30b5, 0x3099 /* offset 2969 */ , + 0x30b7, 0x3099 /* offset 2971 */ , + 0x30b9, 0x3099 /* offset 2973 */ , + 0x30bb, 0x3099 /* offset 2975 */ , + 0x30bd, 0x3099 /* offset 2977 */ , + 0x30bf, 0x3099 /* offset 2979 */ , + 0x30c1, 0x3099 /* offset 2981 */ , + 0x30c4, 0x3099 /* offset 2983 */ , + 0x30c6, 0x3099 /* offset 2985 */ , + 0x30c8, 0x3099 /* offset 2987 */ , + 0x30cf, 0x3099 /* offset 2989 */ , + 0x30cf, 0x309a /* offset 2991 */ , + 0x30d2, 0x3099 /* offset 2993 */ , + 0x30d2, 0x309a /* offset 2995 */ , + 0x30d5, 0x3099 /* offset 2997 */ , + 0x30d5, 0x309a /* offset 2999 */ , + 0x30d8, 0x3099 /* offset 3001 */ , + 0x30d8, 0x309a /* offset 3003 */ , + 0x30db, 0x3099 /* offset 3005 */ , + 0x30db, 0x309a /* offset 3007 */ , + 0x30a6, 0x3099 /* offset 3009 */ , + 0x30ef, 0x3099 /* offset 3011 */ , + 0x30f0, 0x3099 /* offset 3013 */ , + 0x30f1, 0x3099 /* offset 3015 */ , + 0x30f2, 0x3099 /* offset 3017 */ , + 0x30fd, 0x3099 /* offset 3019 */ , + 0x30b3, 0x30c8 /* offset 3021 */ , + 0x1100 /* offset 3023 */ , + 0x1101 /* offset 3024 */ , + 0x11aa /* offset 3025 */ , + 0x1102 /* offset 3026 */ , + 0x11ac /* offset 3027 */ , + 0x11ad /* offset 3028 */ , + 0x1103 /* offset 3029 */ , + 0x1104 /* offset 3030 */ , + 0x1105 /* offset 3031 */ , + 0x11b0 /* offset 3032 */ , + 0x11b1 /* offset 3033 */ , + 0x11b2 /* offset 3034 */ , + 0x11b3 /* offset 3035 */ , + 0x11b4 /* offset 3036 */ , + 0x11b5 /* offset 3037 */ , + 0x111a /* offset 3038 */ , + 0x1106 /* offset 3039 */ , + 0x1107 /* offset 3040 */ , + 0x1108 /* offset 3041 */ , + 0x1121 /* offset 3042 */ , + 0x1109 /* offset 3043 */ , + 0x110a /* offset 3044 */ , + 0x110b /* offset 3045 */ , + 0x110c /* offset 3046 */ , + 0x110d /* offset 3047 */ , + 0x110e /* offset 3048 */ , + 0x110f /* offset 3049 */ , + 0x1110 /* offset 3050 */ , + 0x1111 /* offset 3051 */ , + 0x1112 /* offset 3052 */ , + 0x1161 /* offset 3053 */ , + 0x1162 /* offset 3054 */ , + 0x1163 /* offset 3055 */ , + 0x1164 /* offset 3056 */ , + 0x1165 /* offset 3057 */ , + 0x1166 /* offset 3058 */ , + 0x1167 /* offset 3059 */ , + 0x1168 /* offset 3060 */ , + 0x1169 /* offset 3061 */ , + 0x116a /* offset 3062 */ , + 0x116b /* offset 3063 */ , + 0x116c /* offset 3064 */ , + 0x116d /* offset 3065 */ , + 0x116e /* offset 3066 */ , + 0x116f /* offset 3067 */ , + 0x1170 /* offset 3068 */ , + 0x1171 /* offset 3069 */ , + 0x1172 /* offset 3070 */ , + 0x1173 /* offset 3071 */ , + 0x1174 /* offset 3072 */ , + 0x1175 /* offset 3073 */ , + 0x1160 /* offset 3074 */ , + 0x1114 /* offset 3075 */ , + 0x1115 /* offset 3076 */ , + 0x11c7 /* offset 3077 */ , + 0x11c8 /* offset 3078 */ , + 0x11cc /* offset 3079 */ , + 0x11ce /* offset 3080 */ , + 0x11d3 /* offset 3081 */ , + 0x11d7 /* offset 3082 */ , + 0x11d9 /* offset 3083 */ , + 0x111c /* offset 3084 */ , + 0x11dd /* offset 3085 */ , + 0x11df /* offset 3086 */ , + 0x111d /* offset 3087 */ , + 0x111e /* offset 3088 */ , + 0x1120 /* offset 3089 */ , + 0x1122 /* offset 3090 */ , + 0x1123 /* offset 3091 */ , + 0x1127 /* offset 3092 */ , + 0x1129 /* offset 3093 */ , + 0x112b /* offset 3094 */ , + 0x112c /* offset 3095 */ , + 0x112d /* offset 3096 */ , + 0x112e /* offset 3097 */ , + 0x112f /* offset 3098 */ , + 0x1132 /* offset 3099 */ , + 0x1136 /* offset 3100 */ , + 0x1140 /* offset 3101 */ , + 0x1147 /* offset 3102 */ , + 0x114c /* offset 3103 */ , + 0x11f1 /* offset 3104 */ , + 0x11f2 /* offset 3105 */ , + 0x1157 /* offset 3106 */ , + 0x1158 /* offset 3107 */ , + 0x1159 /* offset 3108 */ , + 0x1184 /* offset 3109 */ , + 0x1185 /* offset 3110 */ , + 0x1188 /* offset 3111 */ , + 0x1191 /* offset 3112 */ , + 0x1192 /* offset 3113 */ , + 0x1194 /* offset 3114 */ , + 0x119e /* offset 3115 */ , + 0x11a1 /* offset 3116 */ , + 0x4e09 /* offset 3117 */ , + 0x56db /* offset 3118 */ , + 0x4e0a /* offset 3119 */ , + 0x4e2d /* offset 3120 */ , + 0x4e0b /* offset 3121 */ , + 0x7532 /* offset 3122 */ , + 0x4e19 /* offset 3123 */ , + 0x4e01 /* offset 3124 */ , + 0x5929 /* offset 3125 */ , + 0x5730 /* offset 3126 */ , + 0x28, 0x1100, 0x29 /* offset 3127 */ , + 0x28, 0x1102, 0x29 /* offset 3130 */ , + 0x28, 0x1103, 0x29 /* offset 3133 */ , + 0x28, 0x1105, 0x29 /* offset 3136 */ , + 0x28, 0x1106, 0x29 /* offset 3139 */ , + 0x28, 0x1107, 0x29 /* offset 3142 */ , + 0x28, 0x1109, 0x29 /* offset 3145 */ , + 0x28, 0x110b, 0x29 /* offset 3148 */ , + 0x28, 0x110c, 0x29 /* offset 3151 */ , + 0x28, 0x110e, 0x29 /* offset 3154 */ , + 0x28, 0x110f, 0x29 /* offset 3157 */ , + 0x28, 0x1110, 0x29 /* offset 3160 */ , + 0x28, 0x1111, 0x29 /* offset 3163 */ , + 0x28, 0x1112, 0x29 /* offset 3166 */ , + 0x28, 0x1100, 0x1161, 0x29 /* offset 3169 */ , + 0x28, 0x1102, 0x1161, 0x29 /* offset 3173 */ , + 0x28, 0x1103, 0x1161, 0x29 /* offset 3177 */ , + 0x28, 0x1105, 0x1161, 0x29 /* offset 3181 */ , + 0x28, 0x1106, 0x1161, 0x29 /* offset 3185 */ , + 0x28, 0x1107, 0x1161, 0x29 /* offset 3189 */ , + 0x28, 0x1109, 0x1161, 0x29 /* offset 3193 */ , + 0x28, 0x110b, 0x1161, 0x29 /* offset 3197 */ , + 0x28, 0x110c, 0x1161, 0x29 /* offset 3201 */ , + 0x28, 0x110e, 0x1161, 0x29 /* offset 3205 */ , + 0x28, 0x110f, 0x1161, 0x29 /* offset 3209 */ , + 0x28, 0x1110, 0x1161, 0x29 /* offset 3213 */ , + 0x28, 0x1111, 0x1161, 0x29 /* offset 3217 */ , + 0x28, 0x1112, 0x1161, 0x29 /* offset 3221 */ , + 0x28, 0x110c, 0x116e, 0x29 /* offset 3225 */ , + 0x28, 0x4e00, 0x29 /* offset 3229 */ , + 0x28, 0x4e8c, 0x29 /* offset 3232 */ , + 0x28, 0x4e09, 0x29 /* offset 3235 */ , + 0x28, 0x56db, 0x29 /* offset 3238 */ , + 0x28, 0x4e94, 0x29 /* offset 3241 */ , + 0x28, 0x516d, 0x29 /* offset 3244 */ , + 0x28, 0x4e03, 0x29 /* offset 3247 */ , + 0x28, 0x516b, 0x29 /* offset 3250 */ , + 0x28, 0x4e5d, 0x29 /* offset 3253 */ , + 0x28, 0x5341, 0x29 /* offset 3256 */ , + 0x28, 0x6708, 0x29 /* offset 3259 */ , + 0x28, 0x706b, 0x29 /* offset 3262 */ , + 0x28, 0x6c34, 0x29 /* offset 3265 */ , + 0x28, 0x6728, 0x29 /* offset 3268 */ , + 0x28, 0x91d1, 0x29 /* offset 3271 */ , + 0x28, 0x571f, 0x29 /* offset 3274 */ , + 0x28, 0x65e5, 0x29 /* offset 3277 */ , + 0x28, 0x682a, 0x29 /* offset 3280 */ , + 0x28, 0x6709, 0x29 /* offset 3283 */ , + 0x28, 0x793e, 0x29 /* offset 3286 */ , + 0x28, 0x540d, 0x29 /* offset 3289 */ , + 0x28, 0x7279, 0x29 /* offset 3292 */ , + 0x28, 0x8ca1, 0x29 /* offset 3295 */ , + 0x28, 0x795d, 0x29 /* offset 3298 */ , + 0x28, 0x52b4, 0x29 /* offset 3301 */ , + 0x28, 0x4ee3, 0x29 /* offset 3304 */ , + 0x28, 0x547c, 0x29 /* offset 3307 */ , + 0x28, 0x5b66, 0x29 /* offset 3310 */ , + 0x28, 0x76e3, 0x29 /* offset 3313 */ , + 0x28, 0x4f01, 0x29 /* offset 3316 */ , + 0x28, 0x8cc7, 0x29 /* offset 3319 */ , + 0x28, 0x5354, 0x29 /* offset 3322 */ , + 0x28, 0x796d, 0x29 /* offset 3325 */ , + 0x28, 0x4f11, 0x29 /* offset 3328 */ , + 0x28, 0x81ea, 0x29 /* offset 3331 */ , + 0x28, 0x81f3, 0x29 /* offset 3334 */ , + 0x32, 0x31 /* offset 3337 */ , + 0x32, 0x32 /* offset 3339 */ , + 0x32, 0x33 /* offset 3341 */ , + 0x32, 0x34 /* offset 3343 */ , + 0x32, 0x35 /* offset 3345 */ , + 0x32, 0x36 /* offset 3347 */ , + 0x32, 0x37 /* offset 3349 */ , + 0x32, 0x38 /* offset 3351 */ , + 0x32, 0x39 /* offset 3353 */ , + 0x33, 0x30 /* offset 3355 */ , + 0x33, 0x31 /* offset 3357 */ , + 0x33, 0x32 /* offset 3359 */ , + 0x33, 0x33 /* offset 3361 */ , + 0x33, 0x34 /* offset 3363 */ , + 0x33, 0x35 /* offset 3365 */ , + 0x1100, 0x1161 /* offset 3367 */ , + 0x1102, 0x1161 /* offset 3369 */ , + 0x1103, 0x1161 /* offset 3371 */ , + 0x1105, 0x1161 /* offset 3373 */ , + 0x1106, 0x1161 /* offset 3375 */ , + 0x1107, 0x1161 /* offset 3377 */ , + 0x1109, 0x1161 /* offset 3379 */ , + 0x110b, 0x1161 /* offset 3381 */ , + 0x110c, 0x1161 /* offset 3383 */ , + 0x110e, 0x1161 /* offset 3385 */ , + 0x110f, 0x1161 /* offset 3387 */ , + 0x1110, 0x1161 /* offset 3389 */ , + 0x1111, 0x1161 /* offset 3391 */ , + 0x1112, 0x1161 /* offset 3393 */ , + 0x4e94 /* offset 3395 */ , + 0x516d /* offset 3396 */ , + 0x4e03 /* offset 3397 */ , + 0x4e5d /* offset 3398 */ , + 0x682a /* offset 3399 */ , + 0x6709 /* offset 3400 */ , + 0x793e /* offset 3401 */ , + 0x540d /* offset 3402 */ , + 0x7279 /* offset 3403 */ , + 0x8ca1 /* offset 3404 */ , + 0x795d /* offset 3405 */ , + 0x52b4 /* offset 3406 */ , + 0x79d8 /* offset 3407 */ , + 0x7537 /* offset 3408 */ , + 0x9069 /* offset 3409 */ , + 0x512a /* offset 3410 */ , + 0x5370 /* offset 3411 */ , + 0x6ce8 /* offset 3412 */ , + 0x9805 /* offset 3413 */ , + 0x4f11 /* offset 3414 */ , + 0x5199 /* offset 3415 */ , + 0x6b63 /* offset 3416 */ , + 0x5de6 /* offset 3417 */ , + 0x53f3 /* offset 3418 */ , + 0x533b /* offset 3419 */ , + 0x5b97 /* offset 3420 */ , + 0x5b66 /* offset 3421 */ , + 0x76e3 /* offset 3422 */ , + 0x4f01 /* offset 3423 */ , + 0x8cc7 /* offset 3424 */ , + 0x5354 /* offset 3425 */ , + 0x591c /* offset 3426 */ , + 0x33, 0x36 /* offset 3427 */ , + 0x33, 0x37 /* offset 3429 */ , + 0x33, 0x38 /* offset 3431 */ , + 0x33, 0x39 /* offset 3433 */ , + 0x34, 0x30 /* offset 3435 */ , + 0x34, 0x31 /* offset 3437 */ , + 0x34, 0x32 /* offset 3439 */ , + 0x34, 0x33 /* offset 3441 */ , + 0x34, 0x34 /* offset 3443 */ , + 0x34, 0x35 /* offset 3445 */ , + 0x34, 0x36 /* offset 3447 */ , + 0x34, 0x37 /* offset 3449 */ , + 0x34, 0x38 /* offset 3451 */ , + 0x34, 0x39 /* offset 3453 */ , + 0x35, 0x30 /* offset 3455 */ , + 0x31, 0x6708 /* offset 3457 */ , + 0x32, 0x6708 /* offset 3459 */ , + 0x33, 0x6708 /* offset 3461 */ , + 0x34, 0x6708 /* offset 3463 */ , + 0x35, 0x6708 /* offset 3465 */ , + 0x36, 0x6708 /* offset 3467 */ , + 0x37, 0x6708 /* offset 3469 */ , + 0x38, 0x6708 /* offset 3471 */ , + 0x39, 0x6708 /* offset 3473 */ , + 0x31, 0x30, 0x6708 /* offset 3475 */ , + 0x31, 0x31, 0x6708 /* offset 3478 */ , + 0x31, 0x32, 0x6708 /* offset 3481 */ , + 0x30a2 /* offset 3484 */ , + 0x30a4 /* offset 3485 */ , + 0x30a6 /* offset 3486 */ , + 0x30a8 /* offset 3487 */ , + 0x30aa /* offset 3488 */ , + 0x30ab /* offset 3489 */ , + 0x30ad /* offset 3490 */ , + 0x30af /* offset 3491 */ , + 0x30b1 /* offset 3492 */ , + 0x30b3 /* offset 3493 */ , + 0x30b5 /* offset 3494 */ , + 0x30b7 /* offset 3495 */ , + 0x30b9 /* offset 3496 */ , + 0x30bb /* offset 3497 */ , + 0x30bd /* offset 3498 */ , + 0x30bf /* offset 3499 */ , + 0x30c1 /* offset 3500 */ , + 0x30c4 /* offset 3501 */ , + 0x30c6 /* offset 3502 */ , + 0x30c8 /* offset 3503 */ , + 0x30ca /* offset 3504 */ , + 0x30cb /* offset 3505 */ , + 0x30cc /* offset 3506 */ , + 0x30cd /* offset 3507 */ , + 0x30ce /* offset 3508 */ , + 0x30cf /* offset 3509 */ , + 0x30d2 /* offset 3510 */ , + 0x30d5 /* offset 3511 */ , + 0x30d8 /* offset 3512 */ , + 0x30db /* offset 3513 */ , + 0x30de /* offset 3514 */ , + 0x30df /* offset 3515 */ , + 0x30e0 /* offset 3516 */ , + 0x30e1 /* offset 3517 */ , + 0x30e2 /* offset 3518 */ , + 0x30e4 /* offset 3519 */ , + 0x30e6 /* offset 3520 */ , + 0x30e8 /* offset 3521 */ , + 0x30e9 /* offset 3522 */ , + 0x30ea /* offset 3523 */ , + 0x30eb /* offset 3524 */ , + 0x30ec /* offset 3525 */ , + 0x30ed /* offset 3526 */ , + 0x30ef /* offset 3527 */ , + 0x30f0 /* offset 3528 */ , + 0x30f1 /* offset 3529 */ , + 0x30f2 /* offset 3530 */ , + 0x30a2, 0x30cf, 0x309a, 0x30fc, 0x30c8 /* offset 3531 */ , + 0x30a2, 0x30eb, 0x30d5, 0x30a1 /* offset 3536 */ , + 0x30a2, 0x30f3, 0x30d8, 0x309a, 0x30a2 /* offset 3540 */ , + 0x30a2, 0x30fc, 0x30eb /* offset 3545 */ , + 0x30a4, 0x30cb, 0x30f3, 0x30af, 0x3099 /* offset 3548 */ , + 0x30a4, 0x30f3, 0x30c1 /* offset 3553 */ , + 0x30a6, 0x30a9, 0x30f3 /* offset 3556 */ , + 0x30a8, 0x30b9, 0x30af, 0x30fc, 0x30c8, 0x3099 /* offset 3559 */ , + 0x30a8, 0x30fc, 0x30ab, 0x30fc /* offset 3565 */ , + 0x30aa, 0x30f3, 0x30b9 /* offset 3569 */ , + 0x30aa, 0x30fc, 0x30e0 /* offset 3572 */ , + 0x30ab, 0x30a4, 0x30ea /* offset 3575 */ , + 0x30ab, 0x30e9, 0x30c3, 0x30c8 /* offset 3578 */ , + 0x30ab, 0x30ed, 0x30ea, 0x30fc /* offset 3582 */ , + 0x30ab, 0x3099, 0x30ed, 0x30f3 /* offset 3586 */ , + 0x30ab, 0x3099, 0x30f3, 0x30de /* offset 3590 */ , + 0x30ad, 0x3099, 0x30ab, 0x3099 /* offset 3594 */ , + 0x30ad, 0x3099, 0x30cb, 0x30fc /* offset 3598 */ , + 0x30ad, 0x30e5, 0x30ea, 0x30fc /* offset 3602 */ , + 0x30ad, 0x3099, 0x30eb, 0x30bf, 0x3099, 0x30fc /* offset 3606 */ , + 0x30ad, 0x30ed /* offset 3612 */ , + 0x30ad, 0x30ed, 0x30af, 0x3099, 0x30e9, 0x30e0 /* offset 3614 */ , + 0x30ad, 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb /* offset 3620 */ , + 0x30ad, 0x30ed, 0x30ef, 0x30c3, 0x30c8 /* offset 3626 */ , + 0x30af, 0x3099, 0x30e9, 0x30e0 /* offset 3631 */ , + 0x30af, 0x3099, 0x30e9, 0x30e0, 0x30c8, 0x30f3 /* offset 3635 */ , + 0x30af, 0x30eb, 0x30bb, 0x3099, 0x30a4, 0x30ed /* offset 3641 */ , + 0x30af, 0x30ed, 0x30fc, 0x30cd /* offset 3647 */ , + 0x30b1, 0x30fc, 0x30b9 /* offset 3651 */ , + 0x30b3, 0x30eb, 0x30ca /* offset 3654 */ , + 0x30b3, 0x30fc, 0x30db, 0x309a /* offset 3657 */ , + 0x30b5, 0x30a4, 0x30af, 0x30eb /* offset 3661 */ , + 0x30b5, 0x30f3, 0x30c1, 0x30fc, 0x30e0 /* offset 3665 */ , + 0x30b7, 0x30ea, 0x30f3, 0x30af, 0x3099 /* offset 3670 */ , + 0x30bb, 0x30f3, 0x30c1 /* offset 3675 */ , + 0x30bb, 0x30f3, 0x30c8 /* offset 3678 */ , + 0x30bf, 0x3099, 0x30fc, 0x30b9 /* offset 3681 */ , + 0x30c6, 0x3099, 0x30b7 /* offset 3685 */ , + 0x30c8, 0x3099, 0x30eb /* offset 3688 */ , + 0x30c8, 0x30f3 /* offset 3691 */ , + 0x30ca, 0x30ce /* offset 3693 */ , + 0x30ce, 0x30c3, 0x30c8 /* offset 3695 */ , + 0x30cf, 0x30a4, 0x30c4 /* offset 3698 */ , + 0x30cf, 0x309a, 0x30fc, 0x30bb, 0x30f3, 0x30c8 /* offset 3701 */ , + 0x30cf, 0x309a, 0x30fc, 0x30c4 /* offset 3707 */ , + 0x30cf, 0x3099, 0x30fc, 0x30ec, 0x30eb /* offset 3711 */ , + 0x30d2, 0x309a, 0x30a2, 0x30b9, 0x30c8, 0x30eb /* offset 3716 */ , + 0x30d2, 0x309a, 0x30af, 0x30eb /* offset 3722 */ , + 0x30d2, 0x309a, 0x30b3 /* offset 3726 */ , + 0x30d2, 0x3099, 0x30eb /* offset 3729 */ , + 0x30d5, 0x30a1, 0x30e9, 0x30c3, 0x30c8, 0x3099 /* offset 3732 */ , + 0x30d5, 0x30a3, 0x30fc, 0x30c8 /* offset 3738 */ , + 0x30d5, 0x3099, 0x30c3, 0x30b7, 0x30a7, 0x30eb /* offset 3742 */ , + 0x30d5, 0x30e9, 0x30f3 /* offset 3748 */ , + 0x30d8, 0x30af, 0x30bf, 0x30fc, 0x30eb /* offset 3751 */ , + 0x30d8, 0x309a, 0x30bd /* offset 3756 */ , + 0x30d8, 0x309a, 0x30cb, 0x30d2 /* offset 3759 */ , + 0x30d8, 0x30eb, 0x30c4 /* offset 3763 */ , + 0x30d8, 0x309a, 0x30f3, 0x30b9 /* offset 3766 */ , + 0x30d8, 0x309a, 0x30fc, 0x30b7, 0x3099 /* offset 3770 */ , + 0x30d8, 0x3099, 0x30fc, 0x30bf /* offset 3775 */ , + 0x30db, 0x309a, 0x30a4, 0x30f3, 0x30c8 /* offset 3779 */ , + 0x30db, 0x3099, 0x30eb, 0x30c8 /* offset 3784 */ , + 0x30db, 0x30f3 /* offset 3788 */ , + 0x30db, 0x309a, 0x30f3, 0x30c8, 0x3099 /* offset 3790 */ , + 0x30db, 0x30fc, 0x30eb /* offset 3795 */ , + 0x30db, 0x30fc, 0x30f3 /* offset 3798 */ , + 0x30de, 0x30a4, 0x30af, 0x30ed /* offset 3801 */ , + 0x30de, 0x30a4, 0x30eb /* offset 3805 */ , + 0x30de, 0x30c3, 0x30cf /* offset 3808 */ , + 0x30de, 0x30eb, 0x30af /* offset 3811 */ , + 0x30de, 0x30f3, 0x30b7, 0x30e7, 0x30f3 /* offset 3814 */ , + 0x30df, 0x30af, 0x30ed, 0x30f3 /* offset 3819 */ , + 0x30df, 0x30ea /* offset 3823 */ , + 0x30df, 0x30ea, 0x30cf, 0x3099, 0x30fc, 0x30eb /* offset 3825 */ , + 0x30e1, 0x30ab, 0x3099 /* offset 3831 */ , + 0x30e1, 0x30ab, 0x3099, 0x30c8, 0x30f3 /* offset 3834 */ , + 0x30e1, 0x30fc, 0x30c8, 0x30eb /* offset 3839 */ , + 0x30e4, 0x30fc, 0x30c8, 0x3099 /* offset 3843 */ , + 0x30e4, 0x30fc, 0x30eb /* offset 3847 */ , + 0x30e6, 0x30a2, 0x30f3 /* offset 3850 */ , + 0x30ea, 0x30c3, 0x30c8, 0x30eb /* offset 3853 */ , + 0x30ea, 0x30e9 /* offset 3857 */ , + 0x30eb, 0x30d2, 0x309a, 0x30fc /* offset 3859 */ , + 0x30eb, 0x30fc, 0x30d5, 0x3099, 0x30eb /* offset 3863 */ , + 0x30ec, 0x30e0 /* offset 3868 */ , + 0x30ec, 0x30f3, 0x30c8, 0x30b1, 0x3099, 0x30f3 /* offset 3870 */ , + 0x30ef, 0x30c3, 0x30c8 /* offset 3876 */ , + 0x30, 0x70b9 /* offset 3879 */ , + 0x31, 0x70b9 /* offset 3881 */ , + 0x32, 0x70b9 /* offset 3883 */ , + 0x33, 0x70b9 /* offset 3885 */ , + 0x34, 0x70b9 /* offset 3887 */ , + 0x35, 0x70b9 /* offset 3889 */ , + 0x36, 0x70b9 /* offset 3891 */ , + 0x37, 0x70b9 /* offset 3893 */ , + 0x38, 0x70b9 /* offset 3895 */ , + 0x39, 0x70b9 /* offset 3897 */ , + 0x31, 0x30, 0x70b9 /* offset 3899 */ , + 0x31, 0x31, 0x70b9 /* offset 3902 */ , + 0x31, 0x32, 0x70b9 /* offset 3905 */ , + 0x31, 0x33, 0x70b9 /* offset 3908 */ , + 0x31, 0x34, 0x70b9 /* offset 3911 */ , + 0x31, 0x35, 0x70b9 /* offset 3914 */ , + 0x31, 0x36, 0x70b9 /* offset 3917 */ , + 0x31, 0x37, 0x70b9 /* offset 3920 */ , + 0x31, 0x38, 0x70b9 /* offset 3923 */ , + 0x31, 0x39, 0x70b9 /* offset 3926 */ , + 0x32, 0x30, 0x70b9 /* offset 3929 */ , + 0x32, 0x31, 0x70b9 /* offset 3932 */ , + 0x32, 0x32, 0x70b9 /* offset 3935 */ , + 0x32, 0x33, 0x70b9 /* offset 3938 */ , + 0x32, 0x34, 0x70b9 /* offset 3941 */ , + 0x68, 0x50, 0x61 /* offset 3944 */ , + 0x64, 0x61 /* offset 3947 */ , + 0x41, 0x55 /* offset 3949 */ , + 0x62, 0x61, 0x72 /* offset 3951 */ , + 0x6f, 0x56 /* offset 3954 */ , + 0x70, 0x63 /* offset 3956 */ , + 0x5e73, 0x6210 /* offset 3958 */ , + 0x662d, 0x548c /* offset 3960 */ , + 0x5927, 0x6b63 /* offset 3962 */ , + 0x660e, 0x6cbb /* offset 3964 */ , + 0x682a, 0x5f0f, 0x4f1a, 0x793e /* offset 3966 */ , + 0x70, 0x41 /* offset 3970 */ , + 0x6e, 0x41 /* offset 3972 */ , + 0x3bc, 0x41 /* offset 3974 */ , + 0x6d, 0x41 /* offset 3976 */ , + 0x6b, 0x41 /* offset 3978 */ , + 0x4b, 0x42 /* offset 3980 */ , + 0x4d, 0x42 /* offset 3982 */ , + 0x47, 0x42 /* offset 3984 */ , + 0x63, 0x61, 0x6c /* offset 3986 */ , + 0x6b, 0x63, 0x61, 0x6c /* offset 3989 */ , + 0x70, 0x46 /* offset 3993 */ , + 0x6e, 0x46 /* offset 3995 */ , + 0x3bc, 0x46 /* offset 3997 */ , + 0x3bc, 0x67 /* offset 3999 */ , + 0x6d, 0x67 /* offset 4001 */ , + 0x6b, 0x67 /* offset 4003 */ , + 0x48, 0x7a /* offset 4005 */ , + 0x6b, 0x48, 0x7a /* offset 4007 */ , + 0x4d, 0x48, 0x7a /* offset 4010 */ , + 0x47, 0x48, 0x7a /* offset 4013 */ , + 0x54, 0x48, 0x7a /* offset 4016 */ , + 0x3bc, 0x6c /* offset 4019 */ , + 0x6d, 0x6c /* offset 4021 */ , + 0x64, 0x6c /* offset 4023 */ , + 0x6b, 0x6c /* offset 4025 */ , + 0x66, 0x6d /* offset 4027 */ , + 0x6e, 0x6d /* offset 4029 */ , + 0x3bc, 0x6d /* offset 4031 */ , + 0x6d, 0x6d /* offset 4033 */ , + 0x63, 0x6d /* offset 4035 */ , + 0x6b, 0x6d /* offset 4037 */ , + 0x6d, 0x6d, 0x32 /* offset 4039 */ , + 0x63, 0x6d, 0x32 /* offset 4042 */ , + 0x6d, 0x32 /* offset 4045 */ , + 0x6b, 0x6d, 0x32 /* offset 4047 */ , + 0x6d, 0x6d, 0x33 /* offset 4050 */ , + 0x63, 0x6d, 0x33 /* offset 4053 */ , + 0x6d, 0x33 /* offset 4056 */ , + 0x6b, 0x6d, 0x33 /* offset 4058 */ , + 0x6d, 0x2215, 0x73 /* offset 4061 */ , + 0x6d, 0x2215, 0x73, 0x32 /* offset 4064 */ , + 0x50, 0x61 /* offset 4068 */ , + 0x6b, 0x50, 0x61 /* offset 4070 */ , + 0x4d, 0x50, 0x61 /* offset 4073 */ , + 0x47, 0x50, 0x61 /* offset 4076 */ , + 0x72, 0x61, 0x64 /* offset 4079 */ , + 0x72, 0x61, 0x64, 0x2215, 0x73 /* offset 4082 */ , + 0x72, 0x61, 0x64, 0x2215, 0x73, 0x32 /* offset 4087 */ , + 0x70, 0x73 /* offset 4093 */ , + 0x6e, 0x73 /* offset 4095 */ , + 0x3bc, 0x73 /* offset 4097 */ , + 0x6d, 0x73 /* offset 4099 */ , + 0x70, 0x56 /* offset 4101 */ , + 0x6e, 0x56 /* offset 4103 */ , + 0x3bc, 0x56 /* offset 4105 */ , + 0x6d, 0x56 /* offset 4107 */ , + 0x6b, 0x56 /* offset 4109 */ , + 0x4d, 0x56 /* offset 4111 */ , + 0x70, 0x57 /* offset 4113 */ , + 0x6e, 0x57 /* offset 4115 */ , + 0x3bc, 0x57 /* offset 4117 */ , + 0x6d, 0x57 /* offset 4119 */ , + 0x6b, 0x57 /* offset 4121 */ , + 0x4d, 0x57 /* offset 4123 */ , + 0x6b, 0x3a9 /* offset 4125 */ , + 0x4d, 0x3a9 /* offset 4127 */ , + 0x61, 0x2e, 0x6d, 0x2e /* offset 4129 */ , + 0x42, 0x71 /* offset 4133 */ , + 0x63, 0x63 /* offset 4135 */ , + 0x63, 0x64 /* offset 4137 */ , + 0x43, 0x2215, 0x6b, 0x67 /* offset 4139 */ , + 0x43, 0x6f, 0x2e /* offset 4143 */ , + 0x64, 0x42 /* offset 4146 */ , + 0x47, 0x79 /* offset 4148 */ , + 0x68, 0x61 /* offset 4150 */ , + 0x48, 0x50 /* offset 4152 */ , + 0x69, 0x6e /* offset 4154 */ , + 0x4b, 0x4b /* offset 4156 */ , + 0x4b, 0x4d /* offset 4158 */ , + 0x6b, 0x74 /* offset 4160 */ , + 0x6c, 0x6d /* offset 4162 */ , + 0x6c, 0x6e /* offset 4164 */ , + 0x6c, 0x6f, 0x67 /* offset 4166 */ , + 0x6c, 0x78 /* offset 4169 */ , + 0x6d, 0x62 /* offset 4171 */ , + 0x6d, 0x69, 0x6c /* offset 4173 */ , + 0x6d, 0x6f, 0x6c /* offset 4176 */ , + 0x50, 0x48 /* offset 4179 */ , + 0x70, 0x2e, 0x6d, 0x2e /* offset 4181 */ , + 0x50, 0x50, 0x4d /* offset 4185 */ , + 0x50, 0x52 /* offset 4188 */ , + 0x73, 0x72 /* offset 4190 */ , + 0x53, 0x76 /* offset 4192 */ , + 0x57, 0x62 /* offset 4194 */ , + 0x31, 0x65e5 /* offset 4196 */ , + 0x32, 0x65e5 /* offset 4198 */ , + 0x33, 0x65e5 /* offset 4200 */ , + 0x34, 0x65e5 /* offset 4202 */ , + 0x35, 0x65e5 /* offset 4204 */ , + 0x36, 0x65e5 /* offset 4206 */ , + 0x37, 0x65e5 /* offset 4208 */ , + 0x38, 0x65e5 /* offset 4210 */ , + 0x39, 0x65e5 /* offset 4212 */ , + 0x31, 0x30, 0x65e5 /* offset 4214 */ , + 0x31, 0x31, 0x65e5 /* offset 4217 */ , + 0x31, 0x32, 0x65e5 /* offset 4220 */ , + 0x31, 0x33, 0x65e5 /* offset 4223 */ , + 0x31, 0x34, 0x65e5 /* offset 4226 */ , + 0x31, 0x35, 0x65e5 /* offset 4229 */ , + 0x31, 0x36, 0x65e5 /* offset 4232 */ , + 0x31, 0x37, 0x65e5 /* offset 4235 */ , + 0x31, 0x38, 0x65e5 /* offset 4238 */ , + 0x31, 0x39, 0x65e5 /* offset 4241 */ , + 0x32, 0x30, 0x65e5 /* offset 4244 */ , + 0x32, 0x31, 0x65e5 /* offset 4247 */ , + 0x32, 0x32, 0x65e5 /* offset 4250 */ , + 0x32, 0x33, 0x65e5 /* offset 4253 */ , + 0x32, 0x34, 0x65e5 /* offset 4256 */ , + 0x32, 0x35, 0x65e5 /* offset 4259 */ , + 0x32, 0x36, 0x65e5 /* offset 4262 */ , + 0x32, 0x37, 0x65e5 /* offset 4265 */ , + 0x32, 0x38, 0x65e5 /* offset 4268 */ , + 0x32, 0x39, 0x65e5 /* offset 4271 */ , + 0x33, 0x30, 0x65e5 /* offset 4274 */ , + 0x33, 0x31, 0x65e5 /* offset 4277 */ , + 0x8c48 /* offset 4280 */ , + 0x66f4 /* offset 4281 */ , + 0x8cc8 /* offset 4282 */ , + 0x6ed1 /* offset 4283 */ , + 0x4e32 /* offset 4284 */ , + 0x53e5 /* offset 4285 */ , + 0x5951 /* offset 4286 */ , + 0x5587 /* offset 4287 */ , + 0x5948 /* offset 4288 */ , + 0x61f6 /* offset 4289 */ , + 0x7669 /* offset 4290 */ , + 0x7f85 /* offset 4291 */ , + 0x863f /* offset 4292 */ , + 0x87ba /* offset 4293 */ , + 0x88f8 /* offset 4294 */ , + 0x908f /* offset 4295 */ , + 0x6a02 /* offset 4296 */ , + 0x6d1b /* offset 4297 */ , + 0x70d9 /* offset 4298 */ , + 0x73de /* offset 4299 */ , + 0x843d /* offset 4300 */ , + 0x916a /* offset 4301 */ , + 0x99f1 /* offset 4302 */ , + 0x4e82 /* offset 4303 */ , + 0x5375 /* offset 4304 */ , + 0x6b04 /* offset 4305 */ , + 0x721b /* offset 4306 */ , + 0x862d /* offset 4307 */ , + 0x9e1e /* offset 4308 */ , + 0x5d50 /* offset 4309 */ , + 0x6feb /* offset 4310 */ , + 0x85cd /* offset 4311 */ , + 0x8964 /* offset 4312 */ , + 0x62c9 /* offset 4313 */ , + 0x81d8 /* offset 4314 */ , + 0x881f /* offset 4315 */ , + 0x5eca /* offset 4316 */ , + 0x6717 /* offset 4317 */ , + 0x6d6a /* offset 4318 */ , + 0x72fc /* offset 4319 */ , + 0x90ce /* offset 4320 */ , + 0x4f86 /* offset 4321 */ , + 0x51b7 /* offset 4322 */ , + 0x52de /* offset 4323 */ , + 0x64c4 /* offset 4324 */ , + 0x6ad3 /* offset 4325 */ , + 0x7210 /* offset 4326 */ , + 0x76e7 /* offset 4327 */ , + 0x8606 /* offset 4328 */ , + 0x865c /* offset 4329 */ , + 0x8def /* offset 4330 */ , + 0x9732 /* offset 4331 */ , + 0x9b6f /* offset 4332 */ , + 0x9dfa /* offset 4333 */ , + 0x788c /* offset 4334 */ , + 0x797f /* offset 4335 */ , + 0x7da0 /* offset 4336 */ , + 0x83c9 /* offset 4337 */ , + 0x9304 /* offset 4338 */ , + 0x8ad6 /* offset 4339 */ , + 0x58df /* offset 4340 */ , + 0x5f04 /* offset 4341 */ , + 0x7c60 /* offset 4342 */ , + 0x807e /* offset 4343 */ , + 0x7262 /* offset 4344 */ , + 0x78ca /* offset 4345 */ , + 0x8cc2 /* offset 4346 */ , + 0x96f7 /* offset 4347 */ , + 0x58d8 /* offset 4348 */ , + 0x5c62 /* offset 4349 */ , + 0x6a13 /* offset 4350 */ , + 0x6dda /* offset 4351 */ , + 0x6f0f /* offset 4352 */ , + 0x7d2f /* offset 4353 */ , + 0x7e37 /* offset 4354 */ , + 0x964b /* offset 4355 */ , + 0x52d2 /* offset 4356 */ , + 0x808b /* offset 4357 */ , + 0x51dc /* offset 4358 */ , + 0x51cc /* offset 4359 */ , + 0x7a1c /* offset 4360 */ , + 0x7dbe /* offset 4361 */ , + 0x83f1 /* offset 4362 */ , + 0x9675 /* offset 4363 */ , + 0x8b80 /* offset 4364 */ , + 0x62cf /* offset 4365 */ , + 0x8afe /* offset 4366 */ , + 0x4e39 /* offset 4367 */ , + 0x5be7 /* offset 4368 */ , + 0x6012 /* offset 4369 */ , + 0x7387 /* offset 4370 */ , + 0x7570 /* offset 4371 */ , + 0x5317 /* offset 4372 */ , + 0x78fb /* offset 4373 */ , + 0x4fbf /* offset 4374 */ , + 0x5fa9 /* offset 4375 */ , + 0x4e0d /* offset 4376 */ , + 0x6ccc /* offset 4377 */ , + 0x6578 /* offset 4378 */ , + 0x7d22 /* offset 4379 */ , + 0x53c3 /* offset 4380 */ , + 0x585e /* offset 4381 */ , + 0x7701 /* offset 4382 */ , + 0x8449 /* offset 4383 */ , + 0x8aaa /* offset 4384 */ , + 0x6bba /* offset 4385 */ , + 0x6c88 /* offset 4386 */ , + 0x62fe /* offset 4387 */ , + 0x82e5 /* offset 4388 */ , + 0x63a0 /* offset 4389 */ , + 0x7565 /* offset 4390 */ , + 0x4eae /* offset 4391 */ , + 0x5169 /* offset 4392 */ , + 0x51c9 /* offset 4393 */ , + 0x6881 /* offset 4394 */ , + 0x7ce7 /* offset 4395 */ , + 0x826f /* offset 4396 */ , + 0x8ad2 /* offset 4397 */ , + 0x91cf /* offset 4398 */ , + 0x52f5 /* offset 4399 */ , + 0x5442 /* offset 4400 */ , + 0x5eec /* offset 4401 */ , + 0x65c5 /* offset 4402 */ , + 0x6ffe /* offset 4403 */ , + 0x792a /* offset 4404 */ , + 0x95ad /* offset 4405 */ , + 0x9a6a /* offset 4406 */ , + 0x9e97 /* offset 4407 */ , + 0x9ece /* offset 4408 */ , + 0x66c6 /* offset 4409 */ , + 0x6b77 /* offset 4410 */ , + 0x8f62 /* offset 4411 */ , + 0x5e74 /* offset 4412 */ , + 0x6190 /* offset 4413 */ , + 0x6200 /* offset 4414 */ , + 0x649a /* offset 4415 */ , + 0x6f23 /* offset 4416 */ , + 0x7149 /* offset 4417 */ , + 0x7489 /* offset 4418 */ , + 0x79ca /* offset 4419 */ , + 0x7df4 /* offset 4420 */ , + 0x806f /* offset 4421 */ , + 0x8f26 /* offset 4422 */ , + 0x84ee /* offset 4423 */ , + 0x9023 /* offset 4424 */ , + 0x934a /* offset 4425 */ , + 0x5217 /* offset 4426 */ , + 0x52a3 /* offset 4427 */ , + 0x54bd /* offset 4428 */ , + 0x70c8 /* offset 4429 */ , + 0x88c2 /* offset 4430 */ , + 0x5ec9 /* offset 4431 */ , + 0x5ff5 /* offset 4432 */ , + 0x637b /* offset 4433 */ , + 0x6bae /* offset 4434 */ , + 0x7c3e /* offset 4435 */ , + 0x7375 /* offset 4436 */ , + 0x4ee4 /* offset 4437 */ , + 0x56f9 /* offset 4438 */ , + 0x5dba /* offset 4439 */ , + 0x601c /* offset 4440 */ , + 0x73b2 /* offset 4441 */ , + 0x7469 /* offset 4442 */ , + 0x7f9a /* offset 4443 */ , + 0x8046 /* offset 4444 */ , + 0x9234 /* offset 4445 */ , + 0x96f6 /* offset 4446 */ , + 0x9748 /* offset 4447 */ , + 0x9818 /* offset 4448 */ , + 0x4f8b /* offset 4449 */ , + 0x79ae /* offset 4450 */ , + 0x91b4 /* offset 4451 */ , + 0x96b8 /* offset 4452 */ , + 0x60e1 /* offset 4453 */ , + 0x4e86 /* offset 4454 */ , + 0x50da /* offset 4455 */ , + 0x5bee /* offset 4456 */ , + 0x5c3f /* offset 4457 */ , + 0x6599 /* offset 4458 */ , + 0x71ce /* offset 4459 */ , + 0x7642 /* offset 4460 */ , + 0x84fc /* offset 4461 */ , + 0x907c /* offset 4462 */ , + 0x6688 /* offset 4463 */ , + 0x962e /* offset 4464 */ , + 0x5289 /* offset 4465 */ , + 0x677b /* offset 4466 */ , + 0x67f3 /* offset 4467 */ , + 0x6d41 /* offset 4468 */ , + 0x6e9c /* offset 4469 */ , + 0x7409 /* offset 4470 */ , + 0x7559 /* offset 4471 */ , + 0x786b /* offset 4472 */ , + 0x7d10 /* offset 4473 */ , + 0x985e /* offset 4474 */ , + 0x622e /* offset 4475 */ , + 0x9678 /* offset 4476 */ , + 0x502b /* offset 4477 */ , + 0x5d19 /* offset 4478 */ , + 0x6dea /* offset 4479 */ , + 0x8f2a /* offset 4480 */ , + 0x5f8b /* offset 4481 */ , + 0x6144 /* offset 4482 */ , + 0x6817 /* offset 4483 */ , + 0x9686 /* offset 4484 */ , + 0x5229 /* offset 4485 */ , + 0x540f /* offset 4486 */ , + 0x5c65 /* offset 4487 */ , + 0x6613 /* offset 4488 */ , + 0x674e /* offset 4489 */ , + 0x68a8 /* offset 4490 */ , + 0x6ce5 /* offset 4491 */ , + 0x7406 /* offset 4492 */ , + 0x75e2 /* offset 4493 */ , + 0x7f79 /* offset 4494 */ , + 0x88cf /* offset 4495 */ , + 0x88e1 /* offset 4496 */ , + 0x96e2 /* offset 4497 */ , + 0x533f /* offset 4498 */ , + 0x6eba /* offset 4499 */ , + 0x541d /* offset 4500 */ , + 0x71d0 /* offset 4501 */ , + 0x7498 /* offset 4502 */ , + 0x85fa /* offset 4503 */ , + 0x96a3 /* offset 4504 */ , + 0x9c57 /* offset 4505 */ , + 0x9e9f /* offset 4506 */ , + 0x6797 /* offset 4507 */ , + 0x6dcb /* offset 4508 */ , + 0x81e8 /* offset 4509 */ , + 0x7b20 /* offset 4510 */ , + 0x7c92 /* offset 4511 */ , + 0x72c0 /* offset 4512 */ , + 0x7099 /* offset 4513 */ , + 0x8b58 /* offset 4514 */ , + 0x4ec0 /* offset 4515 */ , + 0x8336 /* offset 4516 */ , + 0x523a /* offset 4517 */ , + 0x5207 /* offset 4518 */ , + 0x5ea6 /* offset 4519 */ , + 0x62d3 /* offset 4520 */ , + 0x7cd6 /* offset 4521 */ , + 0x5b85 /* offset 4522 */ , + 0x6d1e /* offset 4523 */ , + 0x66b4 /* offset 4524 */ , + 0x8f3b /* offset 4525 */ , + 0x964d /* offset 4526 */ , + 0x5ed3 /* offset 4527 */ , + 0x5140 /* offset 4528 */ , + 0x55c0 /* offset 4529 */ , + 0x585a /* offset 4530 */ , + 0x6674 /* offset 4531 */ , + 0x51de /* offset 4532 */ , + 0x732a /* offset 4533 */ , + 0x76ca /* offset 4534 */ , + 0x793c /* offset 4535 */ , + 0x795e /* offset 4536 */ , + 0x7965 /* offset 4537 */ , + 0x798f /* offset 4538 */ , + 0x9756 /* offset 4539 */ , + 0x7cbe /* offset 4540 */ , + 0x8612 /* offset 4541 */ , + 0x8af8 /* offset 4542 */ , + 0x9038 /* offset 4543 */ , + 0x90fd /* offset 4544 */ , + 0x98ef /* offset 4545 */ , + 0x98fc /* offset 4546 */ , + 0x9928 /* offset 4547 */ , + 0x9db4 /* offset 4548 */ , + 0x4fae /* offset 4549 */ , + 0x50e7 /* offset 4550 */ , + 0x514d /* offset 4551 */ , + 0x52c9 /* offset 4552 */ , + 0x52e4 /* offset 4553 */ , + 0x5351 /* offset 4554 */ , + 0x559d /* offset 4555 */ , + 0x5606 /* offset 4556 */ , + 0x5668 /* offset 4557 */ , + 0x5840 /* offset 4558 */ , + 0x58a8 /* offset 4559 */ , + 0x5c64 /* offset 4560 */ , + 0x6094 /* offset 4561 */ , + 0x6168 /* offset 4562 */ , + 0x618e /* offset 4563 */ , + 0x61f2 /* offset 4564 */ , + 0x654f /* offset 4565 */ , + 0x65e2 /* offset 4566 */ , + 0x6691 /* offset 4567 */ , + 0x6885 /* offset 4568 */ , + 0x6d77 /* offset 4569 */ , + 0x6e1a /* offset 4570 */ , + 0x6f22 /* offset 4571 */ , + 0x716e /* offset 4572 */ , + 0x722b /* offset 4573 */ , + 0x7422 /* offset 4574 */ , + 0x7891 /* offset 4575 */ , + 0x7949 /* offset 4576 */ , + 0x7948 /* offset 4577 */ , + 0x7950 /* offset 4578 */ , + 0x7956 /* offset 4579 */ , + 0x798d /* offset 4580 */ , + 0x798e /* offset 4581 */ , + 0x7a40 /* offset 4582 */ , + 0x7a81 /* offset 4583 */ , + 0x7bc0 /* offset 4584 */ , + 0x7e09 /* offset 4585 */ , + 0x7e41 /* offset 4586 */ , + 0x7f72 /* offset 4587 */ , + 0x8005 /* offset 4588 */ , + 0x81ed /* offset 4589 */ , + 0x8279 /* offset 4590 */ , + 0x8457 /* offset 4591 */ , + 0x8910 /* offset 4592 */ , + 0x8996 /* offset 4593 */ , + 0x8b01 /* offset 4594 */ , + 0x8b39 /* offset 4595 */ , + 0x8cd3 /* offset 4596 */ , + 0x8d08 /* offset 4597 */ , + 0x8fb6 /* offset 4598 */ , + 0x96e3 /* offset 4599 */ , + 0x97ff /* offset 4600 */ , + 0x983b /* offset 4601 */ , + 0x66, 0x66 /* offset 4602 */ , + 0x66, 0x69 /* offset 4604 */ , + 0x66, 0x6c /* offset 4606 */ , + 0x66, 0x66, 0x69 /* offset 4608 */ , + 0x66, 0x66, 0x6c /* offset 4611 */ , + 0x73, 0x74 /* offset 4614 */ , + 0x574, 0x576 /* offset 4616 */ , + 0x574, 0x565 /* offset 4618 */ , + 0x574, 0x56b /* offset 4620 */ , + 0x57e, 0x576 /* offset 4622 */ , + 0x574, 0x56d /* offset 4624 */ , + 0x5d9, 0x5b4 /* offset 4626 */ , + 0x5f2, 0x5b7 /* offset 4628 */ , + 0x5e2 /* offset 4630 */ , + 0x5d4 /* offset 4631 */ , + 0x5db /* offset 4632 */ , + 0x5dc /* offset 4633 */ , + 0x5dd /* offset 4634 */ , + 0x5e8 /* offset 4635 */ , + 0x5ea /* offset 4636 */ , + 0x5e9, 0x5c1 /* offset 4637 */ , + 0x5e9, 0x5c2 /* offset 4639 */ , + 0x5e9, 0x5bc, 0x5c1 /* offset 4641 */ , + 0x5e9, 0x5bc, 0x5c2 /* offset 4644 */ , + 0x5d0, 0x5b7 /* offset 4647 */ , + 0x5d0, 0x5b8 /* offset 4649 */ , + 0x5d0, 0x5bc /* offset 4651 */ , + 0x5d1, 0x5bc /* offset 4653 */ , + 0x5d2, 0x5bc /* offset 4655 */ , + 0x5d3, 0x5bc /* offset 4657 */ , + 0x5d4, 0x5bc /* offset 4659 */ , + 0x5d5, 0x5bc /* offset 4661 */ , + 0x5d6, 0x5bc /* offset 4663 */ , + 0x5d8, 0x5bc /* offset 4665 */ , + 0x5d9, 0x5bc /* offset 4667 */ , + 0x5da, 0x5bc /* offset 4669 */ , + 0x5db, 0x5bc /* offset 4671 */ , + 0x5dc, 0x5bc /* offset 4673 */ , + 0x5de, 0x5bc /* offset 4675 */ , + 0x5e0, 0x5bc /* offset 4677 */ , + 0x5e1, 0x5bc /* offset 4679 */ , + 0x5e3, 0x5bc /* offset 4681 */ , + 0x5e4, 0x5bc /* offset 4683 */ , + 0x5e6, 0x5bc /* offset 4685 */ , + 0x5e7, 0x5bc /* offset 4687 */ , + 0x5e8, 0x5bc /* offset 4689 */ , + 0x5e9, 0x5bc /* offset 4691 */ , + 0x5ea, 0x5bc /* offset 4693 */ , + 0x5d5, 0x5b9 /* offset 4695 */ , + 0x5d1, 0x5bf /* offset 4697 */ , + 0x5db, 0x5bf /* offset 4699 */ , + 0x5e4, 0x5bf /* offset 4701 */ , + 0x5d0, 0x5dc /* offset 4703 */ , + 0x671 /* offset 4705 */ , + 0x67b /* offset 4706 */ , + 0x67e /* offset 4707 */ , + 0x680 /* offset 4708 */ , + 0x67a /* offset 4709 */ , + 0x67f /* offset 4710 */ , + 0x679 /* offset 4711 */ , + 0x6a4 /* offset 4712 */ , + 0x6a6 /* offset 4713 */ , + 0x684 /* offset 4714 */ , + 0x683 /* offset 4715 */ , + 0x686 /* offset 4716 */ , + 0x687 /* offset 4717 */ , + 0x68d /* offset 4718 */ , + 0x68c /* offset 4719 */ , + 0x68e /* offset 4720 */ , + 0x688 /* offset 4721 */ , + 0x698 /* offset 4722 */ , + 0x691 /* offset 4723 */ , + 0x6a9 /* offset 4724 */ , + 0x6af /* offset 4725 */ , + 0x6b3 /* offset 4726 */ , + 0x6b1 /* offset 4727 */ , + 0x6ba /* offset 4728 */ , + 0x6bb /* offset 4729 */ , + 0x6c1 /* offset 4730 */ , + 0x6be /* offset 4731 */ , + 0x6d2 /* offset 4732 */ , + 0x6ad /* offset 4733 */ , + 0x6c7 /* offset 4734 */ , + 0x6c6 /* offset 4735 */ , + 0x6c8 /* offset 4736 */ , + 0x6cb /* offset 4737 */ , + 0x6c5 /* offset 4738 */ , + 0x6c9 /* offset 4739 */ , + 0x6d0 /* offset 4740 */ , + 0x649 /* offset 4741 */ , + 0x64a, 0x654, 0x627 /* offset 4742 */ , + 0x64a, 0x654, 0x6d5 /* offset 4745 */ , + 0x64a, 0x654, 0x648 /* offset 4748 */ , + 0x64a, 0x654, 0x6c7 /* offset 4751 */ , + 0x64a, 0x654, 0x6c6 /* offset 4754 */ , + 0x64a, 0x654, 0x6c8 /* offset 4757 */ , + 0x64a, 0x654, 0x6d0 /* offset 4760 */ , + 0x64a, 0x654, 0x649 /* offset 4763 */ , + 0x6cc /* offset 4766 */ , + 0x64a, 0x654, 0x62c /* offset 4767 */ , + 0x64a, 0x654, 0x62d /* offset 4770 */ , + 0x64a, 0x654, 0x645 /* offset 4773 */ , + 0x64a, 0x654, 0x64a /* offset 4776 */ , + 0x628, 0x62c /* offset 4779 */ , + 0x628, 0x62d /* offset 4781 */ , + 0x628, 0x62e /* offset 4783 */ , + 0x628, 0x645 /* offset 4785 */ , + 0x628, 0x649 /* offset 4787 */ , + 0x628, 0x64a /* offset 4789 */ , + 0x62a, 0x62c /* offset 4791 */ , + 0x62a, 0x62d /* offset 4793 */ , + 0x62a, 0x62e /* offset 4795 */ , + 0x62a, 0x645 /* offset 4797 */ , + 0x62a, 0x649 /* offset 4799 */ , + 0x62a, 0x64a /* offset 4801 */ , + 0x62b, 0x62c /* offset 4803 */ , + 0x62b, 0x645 /* offset 4805 */ , + 0x62b, 0x649 /* offset 4807 */ , + 0x62b, 0x64a /* offset 4809 */ , + 0x62c, 0x62d /* offset 4811 */ , + 0x62c, 0x645 /* offset 4813 */ , + 0x62d, 0x62c /* offset 4815 */ , + 0x62d, 0x645 /* offset 4817 */ , + 0x62e, 0x62c /* offset 4819 */ , + 0x62e, 0x62d /* offset 4821 */ , + 0x62e, 0x645 /* offset 4823 */ , + 0x633, 0x62c /* offset 4825 */ , + 0x633, 0x62d /* offset 4827 */ , + 0x633, 0x62e /* offset 4829 */ , + 0x633, 0x645 /* offset 4831 */ , + 0x635, 0x62d /* offset 4833 */ , + 0x635, 0x645 /* offset 4835 */ , + 0x636, 0x62c /* offset 4837 */ , + 0x636, 0x62d /* offset 4839 */ , + 0x636, 0x62e /* offset 4841 */ , + 0x636, 0x645 /* offset 4843 */ , + 0x637, 0x62d /* offset 4845 */ , + 0x637, 0x645 /* offset 4847 */ , + 0x638, 0x645 /* offset 4849 */ , + 0x639, 0x62c /* offset 4851 */ , + 0x639, 0x645 /* offset 4853 */ , + 0x63a, 0x62c /* offset 4855 */ , + 0x63a, 0x645 /* offset 4857 */ , + 0x641, 0x62c /* offset 4859 */ , + 0x641, 0x62d /* offset 4861 */ , + 0x641, 0x62e /* offset 4863 */ , + 0x641, 0x645 /* offset 4865 */ , + 0x641, 0x649 /* offset 4867 */ , + 0x641, 0x64a /* offset 4869 */ , + 0x642, 0x62d /* offset 4871 */ , + 0x642, 0x645 /* offset 4873 */ , + 0x642, 0x649 /* offset 4875 */ , + 0x642, 0x64a /* offset 4877 */ , + 0x643, 0x627 /* offset 4879 */ , + 0x643, 0x62c /* offset 4881 */ , + 0x643, 0x62d /* offset 4883 */ , + 0x643, 0x62e /* offset 4885 */ , + 0x643, 0x644 /* offset 4887 */ , + 0x643, 0x645 /* offset 4889 */ , + 0x643, 0x649 /* offset 4891 */ , + 0x643, 0x64a /* offset 4893 */ , + 0x644, 0x62c /* offset 4895 */ , + 0x644, 0x62d /* offset 4897 */ , + 0x644, 0x62e /* offset 4899 */ , + 0x644, 0x645 /* offset 4901 */ , + 0x644, 0x649 /* offset 4903 */ , + 0x644, 0x64a /* offset 4905 */ , + 0x645, 0x62c /* offset 4907 */ , + 0x645, 0x62d /* offset 4909 */ , + 0x645, 0x62e /* offset 4911 */ , + 0x645, 0x645 /* offset 4913 */ , + 0x645, 0x649 /* offset 4915 */ , + 0x645, 0x64a /* offset 4917 */ , + 0x646, 0x62c /* offset 4919 */ , + 0x646, 0x62d /* offset 4921 */ , + 0x646, 0x62e /* offset 4923 */ , + 0x646, 0x645 /* offset 4925 */ , + 0x646, 0x649 /* offset 4927 */ , + 0x646, 0x64a /* offset 4929 */ , + 0x647, 0x62c /* offset 4931 */ , + 0x647, 0x645 /* offset 4933 */ , + 0x647, 0x649 /* offset 4935 */ , + 0x647, 0x64a /* offset 4937 */ , + 0x64a, 0x62c /* offset 4939 */ , + 0x64a, 0x62d /* offset 4941 */ , + 0x64a, 0x62e /* offset 4943 */ , + 0x64a, 0x645 /* offset 4945 */ , + 0x64a, 0x649 /* offset 4947 */ , + 0x64a, 0x64a /* offset 4949 */ , + 0x630, 0x670 /* offset 4951 */ , + 0x631, 0x670 /* offset 4953 */ , + 0x649, 0x670 /* offset 4955 */ , + 0x20, 0x64c, 0x651 /* offset 4957 */ , + 0x20, 0x64d, 0x651 /* offset 4960 */ , + 0x20, 0x64e, 0x651 /* offset 4963 */ , + 0x20, 0x64f, 0x651 /* offset 4966 */ , + 0x20, 0x650, 0x651 /* offset 4969 */ , + 0x20, 0x651, 0x670 /* offset 4972 */ , + 0x64a, 0x654, 0x631 /* offset 4975 */ , + 0x64a, 0x654, 0x632 /* offset 4978 */ , + 0x64a, 0x654, 0x646 /* offset 4981 */ , + 0x628, 0x631 /* offset 4984 */ , + 0x628, 0x632 /* offset 4986 */ , + 0x628, 0x646 /* offset 4988 */ , + 0x62a, 0x631 /* offset 4990 */ , + 0x62a, 0x632 /* offset 4992 */ , + 0x62a, 0x646 /* offset 4994 */ , + 0x62b, 0x631 /* offset 4996 */ , + 0x62b, 0x632 /* offset 4998 */ , + 0x62b, 0x646 /* offset 5000 */ , + 0x645, 0x627 /* offset 5002 */ , + 0x646, 0x631 /* offset 5004 */ , + 0x646, 0x632 /* offset 5006 */ , + 0x646, 0x646 /* offset 5008 */ , + 0x64a, 0x631 /* offset 5010 */ , + 0x64a, 0x632 /* offset 5012 */ , + 0x64a, 0x646 /* offset 5014 */ , + 0x64a, 0x654, 0x62e /* offset 5016 */ , + 0x64a, 0x654, 0x647 /* offset 5019 */ , + 0x628, 0x647 /* offset 5022 */ , + 0x62a, 0x647 /* offset 5024 */ , + 0x635, 0x62e /* offset 5026 */ , + 0x644, 0x647 /* offset 5028 */ , + 0x646, 0x647 /* offset 5030 */ , + 0x647, 0x670 /* offset 5032 */ , + 0x64a, 0x647 /* offset 5034 */ , + 0x62b, 0x647 /* offset 5036 */ , + 0x633, 0x647 /* offset 5038 */ , + 0x634, 0x645 /* offset 5040 */ , + 0x634, 0x647 /* offset 5042 */ , + 0x640, 0x64e, 0x651 /* offset 5044 */ , + 0x640, 0x64f, 0x651 /* offset 5047 */ , + 0x640, 0x650, 0x651 /* offset 5050 */ , + 0x637, 0x649 /* offset 5053 */ , + 0x637, 0x64a /* offset 5055 */ , + 0x639, 0x649 /* offset 5057 */ , + 0x639, 0x64a /* offset 5059 */ , + 0x63a, 0x649 /* offset 5061 */ , + 0x63a, 0x64a /* offset 5063 */ , + 0x633, 0x649 /* offset 5065 */ , + 0x633, 0x64a /* offset 5067 */ , + 0x634, 0x649 /* offset 5069 */ , + 0x634, 0x64a /* offset 5071 */ , + 0x62d, 0x649 /* offset 5073 */ , + 0x62d, 0x64a /* offset 5075 */ , + 0x62c, 0x649 /* offset 5077 */ , + 0x62c, 0x64a /* offset 5079 */ , + 0x62e, 0x649 /* offset 5081 */ , + 0x62e, 0x64a /* offset 5083 */ , + 0x635, 0x649 /* offset 5085 */ , + 0x635, 0x64a /* offset 5087 */ , + 0x636, 0x649 /* offset 5089 */ , + 0x636, 0x64a /* offset 5091 */ , + 0x634, 0x62c /* offset 5093 */ , + 0x634, 0x62d /* offset 5095 */ , + 0x634, 0x62e /* offset 5097 */ , + 0x634, 0x631 /* offset 5099 */ , + 0x633, 0x631 /* offset 5101 */ , + 0x635, 0x631 /* offset 5103 */ , + 0x636, 0x631 /* offset 5105 */ , + 0x627, 0x64b /* offset 5107 */ , + 0x62a, 0x62c, 0x645 /* offset 5109 */ , + 0x62a, 0x62d, 0x62c /* offset 5112 */ , + 0x62a, 0x62d, 0x645 /* offset 5115 */ , + 0x62a, 0x62e, 0x645 /* offset 5118 */ , + 0x62a, 0x645, 0x62c /* offset 5121 */ , + 0x62a, 0x645, 0x62d /* offset 5124 */ , + 0x62a, 0x645, 0x62e /* offset 5127 */ , + 0x62c, 0x645, 0x62d /* offset 5130 */ , + 0x62d, 0x645, 0x64a /* offset 5133 */ , + 0x62d, 0x645, 0x649 /* offset 5136 */ , + 0x633, 0x62d, 0x62c /* offset 5139 */ , + 0x633, 0x62c, 0x62d /* offset 5142 */ , + 0x633, 0x62c, 0x649 /* offset 5145 */ , + 0x633, 0x645, 0x62d /* offset 5148 */ , + 0x633, 0x645, 0x62c /* offset 5151 */ , + 0x633, 0x645, 0x645 /* offset 5154 */ , + 0x635, 0x62d, 0x62d /* offset 5157 */ , + 0x635, 0x645, 0x645 /* offset 5160 */ , + 0x634, 0x62d, 0x645 /* offset 5163 */ , + 0x634, 0x62c, 0x64a /* offset 5166 */ , + 0x634, 0x645, 0x62e /* offset 5169 */ , + 0x634, 0x645, 0x645 /* offset 5172 */ , + 0x636, 0x62d, 0x649 /* offset 5175 */ , + 0x636, 0x62e, 0x645 /* offset 5178 */ , + 0x637, 0x645, 0x62d /* offset 5181 */ , + 0x637, 0x645, 0x645 /* offset 5184 */ , + 0x637, 0x645, 0x64a /* offset 5187 */ , + 0x639, 0x62c, 0x645 /* offset 5190 */ , + 0x639, 0x645, 0x645 /* offset 5193 */ , + 0x639, 0x645, 0x649 /* offset 5196 */ , + 0x63a, 0x645, 0x645 /* offset 5199 */ , + 0x63a, 0x645, 0x64a /* offset 5202 */ , + 0x63a, 0x645, 0x649 /* offset 5205 */ , + 0x641, 0x62e, 0x645 /* offset 5208 */ , + 0x642, 0x645, 0x62d /* offset 5211 */ , + 0x642, 0x645, 0x645 /* offset 5214 */ , + 0x644, 0x62d, 0x645 /* offset 5217 */ , + 0x644, 0x62d, 0x64a /* offset 5220 */ , + 0x644, 0x62d, 0x649 /* offset 5223 */ , + 0x644, 0x62c, 0x62c /* offset 5226 */ , + 0x644, 0x62e, 0x645 /* offset 5229 */ , + 0x644, 0x645, 0x62d /* offset 5232 */ , + 0x645, 0x62d, 0x62c /* offset 5235 */ , + 0x645, 0x62d, 0x645 /* offset 5238 */ , + 0x645, 0x62d, 0x64a /* offset 5241 */ , + 0x645, 0x62c, 0x62d /* offset 5244 */ , + 0x645, 0x62c, 0x645 /* offset 5247 */ , + 0x645, 0x62e, 0x62c /* offset 5250 */ , + 0x645, 0x62e, 0x645 /* offset 5253 */ , + 0x645, 0x62c, 0x62e /* offset 5256 */ , + 0x647, 0x645, 0x62c /* offset 5259 */ , + 0x647, 0x645, 0x645 /* offset 5262 */ , + 0x646, 0x62d, 0x645 /* offset 5265 */ , + 0x646, 0x62d, 0x649 /* offset 5268 */ , + 0x646, 0x62c, 0x645 /* offset 5271 */ , + 0x646, 0x62c, 0x649 /* offset 5274 */ , + 0x646, 0x645, 0x64a /* offset 5277 */ , + 0x646, 0x645, 0x649 /* offset 5280 */ , + 0x64a, 0x645, 0x645 /* offset 5283 */ , + 0x628, 0x62e, 0x64a /* offset 5286 */ , + 0x62a, 0x62c, 0x64a /* offset 5289 */ , + 0x62a, 0x62c, 0x649 /* offset 5292 */ , + 0x62a, 0x62e, 0x64a /* offset 5295 */ , + 0x62a, 0x62e, 0x649 /* offset 5298 */ , + 0x62a, 0x645, 0x64a /* offset 5301 */ , + 0x62a, 0x645, 0x649 /* offset 5304 */ , + 0x62c, 0x645, 0x64a /* offset 5307 */ , + 0x62c, 0x62d, 0x649 /* offset 5310 */ , + 0x62c, 0x645, 0x649 /* offset 5313 */ , + 0x633, 0x62e, 0x649 /* offset 5316 */ , + 0x635, 0x62d, 0x64a /* offset 5319 */ , + 0x634, 0x62d, 0x64a /* offset 5322 */ , + 0x636, 0x62d, 0x64a /* offset 5325 */ , + 0x644, 0x62c, 0x64a /* offset 5328 */ , + 0x644, 0x645, 0x64a /* offset 5331 */ , + 0x64a, 0x62d, 0x64a /* offset 5334 */ , + 0x64a, 0x62c, 0x64a /* offset 5337 */ , + 0x64a, 0x645, 0x64a /* offset 5340 */ , + 0x645, 0x645, 0x64a /* offset 5343 */ , + 0x642, 0x645, 0x64a /* offset 5346 */ , + 0x646, 0x62d, 0x64a /* offset 5349 */ , + 0x639, 0x645, 0x64a /* offset 5352 */ , + 0x643, 0x645, 0x64a /* offset 5355 */ , + 0x646, 0x62c, 0x62d /* offset 5358 */ , + 0x645, 0x62e, 0x64a /* offset 5361 */ , + 0x644, 0x62c, 0x645 /* offset 5364 */ , + 0x643, 0x645, 0x645 /* offset 5367 */ , + 0x62c, 0x62d, 0x64a /* offset 5370 */ , + 0x62d, 0x62c, 0x64a /* offset 5373 */ , + 0x645, 0x62c, 0x64a /* offset 5376 */ , + 0x641, 0x645, 0x64a /* offset 5379 */ , + 0x628, 0x62d, 0x64a /* offset 5382 */ , + 0x633, 0x62e, 0x64a /* offset 5385 */ , + 0x646, 0x62c, 0x64a /* offset 5388 */ , + 0x635, 0x644, 0x6d2 /* offset 5391 */ , + 0x642, 0x644, 0x6d2 /* offset 5394 */ , + 0x627, 0x644, 0x644, 0x647 /* offset 5397 */ , + 0x627, 0x643, 0x628, 0x631 /* offset 5401 */ , + 0x645, 0x62d, 0x645, 0x62f /* offset 5405 */ , + 0x635, 0x644, 0x639, 0x645 /* offset 5409 */ , + 0x631, 0x633, 0x648, 0x644 /* offset 5413 */ , + 0x639, 0x644, 0x64a, 0x647 /* offset 5417 */ , + 0x648, 0x633, 0x644, 0x645 /* offset 5421 */ , + 0x635, 0x644, 0x649 /* offset 5425 */ , + 0x635, 0x644, 0x649, 0x20, 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64a, 0x647, 0x20, 0x648, 0x633, 0x644, 0x645 /* offset 5428 */ , + 0x62c, 0x644, 0x20, 0x62c, 0x644, 0x627, 0x644, 0x647 /* offset 5446 */ , + 0x631, 0x6cc, 0x627, 0x644 /* offset 5454 */ , + 0x2014 /* offset 5458 */ , + 0x2013 /* offset 5459 */ , + 0x5f /* offset 5460 */ , + 0x7b /* offset 5461 */ , + 0x7d /* offset 5462 */ , + 0x3014 /* offset 5463 */ , + 0x3015 /* offset 5464 */ , + 0x3010 /* offset 5465 */ , + 0x3011 /* offset 5466 */ , + 0x300a /* offset 5467 */ , + 0x300b /* offset 5468 */ , + 0x300c /* offset 5469 */ , + 0x300d /* offset 5470 */ , + 0x300e /* offset 5471 */ , + 0x300f /* offset 5472 */ , + 0x2c /* offset 5473 */ , + 0x3001 /* offset 5474 */ , + 0x3a /* offset 5475 */ , + 0x3f /* offset 5476 */ , + 0x21 /* offset 5477 */ , + 0x23 /* offset 5478 */ , + 0x26 /* offset 5479 */ , + 0x2a /* offset 5480 */ , + 0x2d /* offset 5481 */ , + 0x3c /* offset 5482 */ , + 0x3e /* offset 5483 */ , + 0x5c /* offset 5484 */ , + 0x24 /* offset 5485 */ , + 0x25 /* offset 5486 */ , + 0x40 /* offset 5487 */ , + 0x20, 0x64b /* offset 5488 */ , + 0x640, 0x64b /* offset 5490 */ , + 0x20, 0x64c /* offset 5492 */ , + 0x20, 0x64d /* offset 5494 */ , + 0x20, 0x64e /* offset 5496 */ , + 0x640, 0x64e /* offset 5498 */ , + 0x20, 0x64f /* offset 5500 */ , + 0x640, 0x64f /* offset 5502 */ , + 0x20, 0x650 /* offset 5504 */ , + 0x640, 0x650 /* offset 5506 */ , + 0x20, 0x651 /* offset 5508 */ , + 0x640, 0x651 /* offset 5510 */ , + 0x20, 0x652 /* offset 5512 */ , + 0x640, 0x652 /* offset 5514 */ , + 0x621 /* offset 5516 */ , + 0x627 /* offset 5517 */ , + 0x628 /* offset 5518 */ , + 0x629 /* offset 5519 */ , + 0x62a /* offset 5520 */ , + 0x62b /* offset 5521 */ , + 0x62c /* offset 5522 */ , + 0x62d /* offset 5523 */ , + 0x62e /* offset 5524 */ , + 0x62f /* offset 5525 */ , + 0x630 /* offset 5526 */ , + 0x631 /* offset 5527 */ , + 0x632 /* offset 5528 */ , + 0x633 /* offset 5529 */ , + 0x634 /* offset 5530 */ , + 0x635 /* offset 5531 */ , + 0x636 /* offset 5532 */ , + 0x637 /* offset 5533 */ , + 0x638 /* offset 5534 */ , + 0x639 /* offset 5535 */ , + 0x63a /* offset 5536 */ , + 0x641 /* offset 5537 */ , + 0x642 /* offset 5538 */ , + 0x643 /* offset 5539 */ , + 0x644 /* offset 5540 */ , + 0x645 /* offset 5541 */ , + 0x646 /* offset 5542 */ , + 0x647 /* offset 5543 */ , + 0x648 /* offset 5544 */ , + 0x64a /* offset 5545 */ , + 0x644, 0x627, 0x653 /* offset 5546 */ , + 0x644, 0x627, 0x654 /* offset 5549 */ , + 0x644, 0x627, 0x655 /* offset 5552 */ , + 0x644, 0x627 /* offset 5555 */ , + 0x22 /* offset 5557 */ , + 0x27 /* offset 5558 */ , + 0x2f /* offset 5559 */ , + 0x5b /* offset 5560 */ , + 0x5d /* offset 5561 */ , + 0x5e /* offset 5562 */ , + 0x7c /* offset 5563 */ , + 0x7e /* offset 5564 */ , + 0x2985 /* offset 5565 */ , + 0x2986 /* offset 5566 */ , + 0x3002 /* offset 5567 */ , + 0x30fb /* offset 5568 */ , + 0x30a1 /* offset 5569 */ , + 0x30a3 /* offset 5570 */ , + 0x30a5 /* offset 5571 */ , + 0x30a7 /* offset 5572 */ , + 0x30a9 /* offset 5573 */ , + 0x30e3 /* offset 5574 */ , + 0x30e5 /* offset 5575 */ , + 0x30e7 /* offset 5576 */ , + 0x30c3 /* offset 5577 */ , + 0x30fc /* offset 5578 */ , + 0x30f3 /* offset 5579 */ , + 0x3099 /* offset 5580 */ , + 0x309a /* offset 5581 */ , + 0xa2 /* offset 5582 */ , + 0xa3 /* offset 5583 */ , + 0xac /* offset 5584 */ , + 0xa6 /* offset 5585 */ , + 0xa5 /* offset 5586 */ , + 0x20a9 /* offset 5587 */ , + 0x2502 /* offset 5588 */ , + 0x2190 /* offset 5589 */ , + 0x2191 /* offset 5590 */ , + 0x2192 /* offset 5591 */ , + 0x2193 /* offset 5592 */ , + 0x25a0 /* offset 5593 */ , + 0x25cb /* offset 5594 */ , + 0x1d157, 0x1d165 /* offset 5595 */ , + 0x1d158, 0x1d165 /* offset 5597 */ , + 0x1d158, 0x1d165, 0x1d16e /* offset 5599 */ , + 0x1d158, 0x1d165, 0x1d16f /* offset 5602 */ , + 0x1d158, 0x1d165, 0x1d170 /* offset 5605 */ , + 0x1d158, 0x1d165, 0x1d171 /* offset 5608 */ , + 0x1d158, 0x1d165, 0x1d172 /* offset 5611 */ , + 0x1d1b9, 0x1d165 /* offset 5614 */ , + 0x1d1ba, 0x1d165 /* offset 5616 */ , + 0x1d1b9, 0x1d165, 0x1d16e /* offset 5618 */ , + 0x1d1ba, 0x1d165, 0x1d16e /* offset 5621 */ , + 0x1d1b9, 0x1d165, 0x1d16f /* offset 5624 */ , + 0x1d1ba, 0x1d165, 0x1d16f /* offset 5627 */ , + 0x391 /* offset 5630 */ , + 0x392 /* offset 5631 */ , + 0x394 /* offset 5632 */ , + 0x395 /* offset 5633 */ , + 0x396 /* offset 5634 */ , + 0x397 /* offset 5635 */ , + 0x399 /* offset 5636 */ , + 0x39a /* offset 5637 */ , + 0x39b /* offset 5638 */ , + 0x39c /* offset 5639 */ , + 0x39d /* offset 5640 */ , + 0x39e /* offset 5641 */ , + 0x39f /* offset 5642 */ , + 0x3a1 /* offset 5643 */ , + 0x3a3 /* offset 5644 */ , + 0x3a4 /* offset 5645 */ , + 0x3a6 /* offset 5646 */ , + 0x3a7 /* offset 5647 */ , + 0x3a8 /* offset 5648 */ , + 0x2207 /* offset 5649 */ , + 0x3b1 /* offset 5650 */ , + 0x3b4 /* offset 5651 */ , + 0x3b6 /* offset 5652 */ , + 0x3b7 /* offset 5653 */ , + 0x3bb /* offset 5654 */ , + 0x3bd /* offset 5655 */ , + 0x3be /* offset 5656 */ , + 0x3bf /* offset 5657 */ , + 0x3c3 /* offset 5658 */ , + 0x3c4 /* offset 5659 */ , + 0x3c5 /* offset 5660 */ , + 0x3c7 /* offset 5661 */ , + 0x3c8 /* offset 5662 */ , + 0x3c9 /* offset 5663 */ , + 0x2202 /* offset 5664 */ , + 0x4e3d /* offset 5665 */ , + 0x4e38 /* offset 5666 */ , + 0x4e41 /* offset 5667 */ , + 0x20122 /* offset 5668 */ , + 0x4f60 /* offset 5669 */ , + 0x4fbb /* offset 5670 */ , + 0x5002 /* offset 5671 */ , + 0x507a /* offset 5672 */ , + 0x5099 /* offset 5673 */ , + 0x50cf /* offset 5674 */ , + 0x349e /* offset 5675 */ , + 0x2063a /* offset 5676 */ , + 0x5154 /* offset 5677 */ , + 0x5164 /* offset 5678 */ , + 0x5177 /* offset 5679 */ , + 0x2051c /* offset 5680 */ , + 0x34b9 /* offset 5681 */ , + 0x5167 /* offset 5682 */ , + 0x518d /* offset 5683 */ , + 0x2054b /* offset 5684 */ , + 0x5197 /* offset 5685 */ , + 0x51a4 /* offset 5686 */ , + 0x4ecc /* offset 5687 */ , + 0x51ac /* offset 5688 */ , + 0x51b5 /* offset 5689 */ , + 0x291df /* offset 5690 */ , + 0x5203 /* offset 5691 */ , + 0x34df /* offset 5692 */ , + 0x523b /* offset 5693 */ , + 0x5246 /* offset 5694 */ , + 0x5272 /* offset 5695 */ , + 0x5277 /* offset 5696 */ , + 0x3515 /* offset 5697 */ , + 0x52c7 /* offset 5698 */ , + 0x52fa /* offset 5699 */ , + 0x5305 /* offset 5700 */ , + 0x5306 /* offset 5701 */ , + 0x5349 /* offset 5702 */ , + 0x535a /* offset 5703 */ , + 0x5373 /* offset 5704 */ , + 0x537d /* offset 5705 */ , + 0x537f /* offset 5706 */ , + 0x20a2c /* offset 5707 */ , + 0x7070 /* offset 5708 */ , + 0x53ca /* offset 5709 */ , + 0x53df /* offset 5710 */ , + 0x20b63 /* offset 5711 */ , + 0x53eb /* offset 5712 */ , + 0x53f1 /* offset 5713 */ , + 0x5406 /* offset 5714 */ , + 0x549e /* offset 5715 */ , + 0x5438 /* offset 5716 */ , + 0x5448 /* offset 5717 */ , + 0x5468 /* offset 5718 */ , + 0x54a2 /* offset 5719 */ , + 0x54f6 /* offset 5720 */ , + 0x5510 /* offset 5721 */ , + 0x5553 /* offset 5722 */ , + 0x5563 /* offset 5723 */ , + 0x5584 /* offset 5724 */ , + 0x5599 /* offset 5725 */ , + 0x55ab /* offset 5726 */ , + 0x55b3 /* offset 5727 */ , + 0x55c2 /* offset 5728 */ , + 0x5716 /* offset 5729 */ , + 0x5717 /* offset 5730 */ , + 0x5651 /* offset 5731 */ , + 0x5674 /* offset 5732 */ , + 0x58ee /* offset 5733 */ , + 0x57ce /* offset 5734 */ , + 0x57f4 /* offset 5735 */ , + 0x580d /* offset 5736 */ , + 0x578b /* offset 5737 */ , + 0x5832 /* offset 5738 */ , + 0x5831 /* offset 5739 */ , + 0x58ac /* offset 5740 */ , + 0x214e4 /* offset 5741 */ , + 0x58f2 /* offset 5742 */ , + 0x58f7 /* offset 5743 */ , + 0x5906 /* offset 5744 */ , + 0x591a /* offset 5745 */ , + 0x5922 /* offset 5746 */ , + 0x5962 /* offset 5747 */ , + 0x216a8 /* offset 5748 */ , + 0x216ea /* offset 5749 */ , + 0x59ec /* offset 5750 */ , + 0x5a1b /* offset 5751 */ , + 0x5a27 /* offset 5752 */ , + 0x59d8 /* offset 5753 */ , + 0x5a66 /* offset 5754 */ , + 0x36ee /* offset 5755 */ , + 0x2136a /* offset 5756 */ , + 0x5b08 /* offset 5757 */ , + 0x5b3e /* offset 5758 */ , + 0x219c8 /* offset 5759 */ , + 0x5bc3 /* offset 5760 */ , + 0x5bd8 /* offset 5761 */ , + 0x5bf3 /* offset 5762 */ , + 0x21b18 /* offset 5763 */ , + 0x5bff /* offset 5764 */ , + 0x5c06 /* offset 5765 */ , + 0x5f33 /* offset 5766 */ , + 0x3781 /* offset 5767 */ , + 0x5c60 /* offset 5768 */ , + 0x5cc0 /* offset 5769 */ , + 0x5c8d /* offset 5770 */ , + 0x21de4 /* offset 5771 */ , + 0x5d43 /* offset 5772 */ , + 0x21de6 /* offset 5773 */ , + 0x5d6e /* offset 5774 */ , + 0x5d6b /* offset 5775 */ , + 0x5d7c /* offset 5776 */ , + 0x5de1 /* offset 5777 */ , + 0x5de2 /* offset 5778 */ , + 0x382f /* offset 5779 */ , + 0x5dfd /* offset 5780 */ , + 0x5e28 /* offset 5781 */ , + 0x5e3d /* offset 5782 */ , + 0x5e69 /* offset 5783 */ , + 0x3862 /* offset 5784 */ , + 0x22183 /* offset 5785 */ , + 0x387c /* offset 5786 */ , + 0x5eb0 /* offset 5787 */ , + 0x5eb3 /* offset 5788 */ , + 0x5eb6 /* offset 5789 */ , + 0x2a392 /* offset 5790 */ , + 0x22331 /* offset 5791 */ , + 0x8201 /* offset 5792 */ , + 0x5f22 /* offset 5793 */ , + 0x38c7 /* offset 5794 */ , + 0x232b8 /* offset 5795 */ , + 0x261da /* offset 5796 */ , + 0x5f62 /* offset 5797 */ , + 0x5f6b /* offset 5798 */ , + 0x38e3 /* offset 5799 */ , + 0x5f9a /* offset 5800 */ , + 0x5fcd /* offset 5801 */ , + 0x5fd7 /* offset 5802 */ , + 0x5ff9 /* offset 5803 */ , + 0x6081 /* offset 5804 */ , + 0x393a /* offset 5805 */ , + 0x391c /* offset 5806 */ , + 0x226d4 /* offset 5807 */ , + 0x60c7 /* offset 5808 */ , + 0x6148 /* offset 5809 */ , + 0x614c /* offset 5810 */ , + 0x614e /* offset 5811 */ , + 0x617a /* offset 5812 */ , + 0x61b2 /* offset 5813 */ , + 0x61a4 /* offset 5814 */ , + 0x61af /* offset 5815 */ , + 0x61de /* offset 5816 */ , + 0x6210 /* offset 5817 */ , + 0x621b /* offset 5818 */ , + 0x625d /* offset 5819 */ , + 0x62b1 /* offset 5820 */ , + 0x62d4 /* offset 5821 */ , + 0x6350 /* offset 5822 */ , + 0x22b0c /* offset 5823 */ , + 0x633d /* offset 5824 */ , + 0x62fc /* offset 5825 */ , + 0x6368 /* offset 5826 */ , + 0x6383 /* offset 5827 */ , + 0x63e4 /* offset 5828 */ , + 0x22bf1 /* offset 5829 */ , + 0x6422 /* offset 5830 */ , + 0x63c5 /* offset 5831 */ , + 0x63a9 /* offset 5832 */ , + 0x3a2e /* offset 5833 */ , + 0x6469 /* offset 5834 */ , + 0x647e /* offset 5835 */ , + 0x649d /* offset 5836 */ , + 0x6477 /* offset 5837 */ , + 0x3a6c /* offset 5838 */ , + 0x656c /* offset 5839 */ , + 0x2300a /* offset 5840 */ , + 0x65e3 /* offset 5841 */ , + 0x66f8 /* offset 5842 */ , + 0x6649 /* offset 5843 */ , + 0x3b19 /* offset 5844 */ , + 0x3b08 /* offset 5845 */ , + 0x3ae4 /* offset 5846 */ , + 0x5192 /* offset 5847 */ , + 0x5195 /* offset 5848 */ , + 0x6700 /* offset 5849 */ , + 0x669c /* offset 5850 */ , + 0x80ad /* offset 5851 */ , + 0x43d9 /* offset 5852 */ , + 0x671b /* offset 5853 */ , + 0x6721 /* offset 5854 */ , + 0x675e /* offset 5855 */ , + 0x6753 /* offset 5856 */ , + 0x233c3 /* offset 5857 */ , + 0x3b49 /* offset 5858 */ , + 0x67fa /* offset 5859 */ , + 0x6785 /* offset 5860 */ , + 0x6852 /* offset 5861 */ , + 0x2346d /* offset 5862 */ , + 0x688e /* offset 5863 */ , + 0x681f /* offset 5864 */ , + 0x6914 /* offset 5865 */ , + 0x3b9d /* offset 5866 */ , + 0x6942 /* offset 5867 */ , + 0x69a3 /* offset 5868 */ , + 0x69ea /* offset 5869 */ , + 0x6aa8 /* offset 5870 */ , + 0x236a3 /* offset 5871 */ , + 0x6adb /* offset 5872 */ , + 0x3c18 /* offset 5873 */ , + 0x6b21 /* offset 5874 */ , + 0x238a7 /* offset 5875 */ , + 0x6b54 /* offset 5876 */ , + 0x3c4e /* offset 5877 */ , + 0x6b72 /* offset 5878 */ , + 0x6b9f /* offset 5879 */ , + 0x6bbb /* offset 5880 */ , + 0x23a8d /* offset 5881 */ , + 0x21d0b /* offset 5882 */ , + 0x23afa /* offset 5883 */ , + 0x6c4e /* offset 5884 */ , + 0x23cbc /* offset 5885 */ , + 0x6cbf /* offset 5886 */ , + 0x6ccd /* offset 5887 */ , + 0x6c67 /* offset 5888 */ , + 0x6d16 /* offset 5889 */ , + 0x6d3e /* offset 5890 */ , + 0x6d69 /* offset 5891 */ , + 0x6d78 /* offset 5892 */ , + 0x6d85 /* offset 5893 */ , + 0x23d1e /* offset 5894 */ , + 0x6d34 /* offset 5895 */ , + 0x6e2f /* offset 5896 */ , + 0x6e6e /* offset 5897 */ , + 0x3d33 /* offset 5898 */ , + 0x6ecb /* offset 5899 */ , + 0x6ec7 /* offset 5900 */ , + 0x23ed1 /* offset 5901 */ , + 0x6df9 /* offset 5902 */ , + 0x6f6e /* offset 5903 */ , + 0x23f5e /* offset 5904 */ , + 0x23f8e /* offset 5905 */ , + 0x6fc6 /* offset 5906 */ , + 0x7039 /* offset 5907 */ , + 0x701e /* offset 5908 */ , + 0x701b /* offset 5909 */ , + 0x3d96 /* offset 5910 */ , + 0x704a /* offset 5911 */ , + 0x707d /* offset 5912 */ , + 0x7077 /* offset 5913 */ , + 0x70ad /* offset 5914 */ , + 0x20525 /* offset 5915 */ , + 0x7145 /* offset 5916 */ , + 0x24263 /* offset 5917 */ , + 0x719c /* offset 5918 */ , + 0x43ab /* offset 5919 */ , + 0x7228 /* offset 5920 */ , + 0x7235 /* offset 5921 */ , + 0x7250 /* offset 5922 */ , + 0x24608 /* offset 5923 */ , + 0x7280 /* offset 5924 */ , + 0x7295 /* offset 5925 */ , + 0x24735 /* offset 5926 */ , + 0x24814 /* offset 5927 */ , + 0x737a /* offset 5928 */ , + 0x738b /* offset 5929 */ , + 0x3eac /* offset 5930 */ , + 0x73a5 /* offset 5931 */ , + 0x3eb8 /* offset 5932 */ , + 0x7447 /* offset 5933 */ , + 0x745c /* offset 5934 */ , + 0x7471 /* offset 5935 */ , + 0x7485 /* offset 5936 */ , + 0x74ca /* offset 5937 */ , + 0x3f1b /* offset 5938 */ , + 0x7524 /* offset 5939 */ , + 0x24c36 /* offset 5940 */ , + 0x753e /* offset 5941 */ , + 0x24c92 /* offset 5942 */ , + 0x2219f /* offset 5943 */ , + 0x7610 /* offset 5944 */ , + 0x24fa1 /* offset 5945 */ , + 0x24fb8 /* offset 5946 */ , + 0x25044 /* offset 5947 */ , + 0x3ffc /* offset 5948 */ , + 0x4008 /* offset 5949 */ , + 0x76f4 /* offset 5950 */ , + 0x250f3 /* offset 5951 */ , + 0x250f2 /* offset 5952 */ , + 0x25119 /* offset 5953 */ , + 0x25133 /* offset 5954 */ , + 0x771e /* offset 5955 */ , + 0x771f /* offset 5956 */ , + 0x774a /* offset 5957 */ , + 0x4039 /* offset 5958 */ , + 0x778b /* offset 5959 */ , + 0x4046 /* offset 5960 */ , + 0x4096 /* offset 5961 */ , + 0x2541d /* offset 5962 */ , + 0x784e /* offset 5963 */ , + 0x78cc /* offset 5964 */ , + 0x40e3 /* offset 5965 */ , + 0x25626 /* offset 5966 */ , + 0x2569a /* offset 5967 */ , + 0x256c5 /* offset 5968 */ , + 0x79eb /* offset 5969 */ , + 0x412f /* offset 5970 */ , + 0x7a4a /* offset 5971 */ , + 0x7a4f /* offset 5972 */ , + 0x2597c /* offset 5973 */ , + 0x25aa7 /* offset 5974 */ , + 0x7aae /* offset 5975 */ , + 0x4202 /* offset 5976 */ , + 0x25bab /* offset 5977 */ , + 0x7bc6 /* offset 5978 */ , + 0x7bc9 /* offset 5979 */ , + 0x4227 /* offset 5980 */ , + 0x25c80 /* offset 5981 */ , + 0x7cd2 /* offset 5982 */ , + 0x42a0 /* offset 5983 */ , + 0x7ce8 /* offset 5984 */ , + 0x7ce3 /* offset 5985 */ , + 0x7d00 /* offset 5986 */ , + 0x25f86 /* offset 5987 */ , + 0x7d63 /* offset 5988 */ , + 0x4301 /* offset 5989 */ , + 0x7dc7 /* offset 5990 */ , + 0x7e02 /* offset 5991 */ , + 0x7e45 /* offset 5992 */ , + 0x4334 /* offset 5993 */ , + 0x26228 /* offset 5994 */ , + 0x26247 /* offset 5995 */ , + 0x4359 /* offset 5996 */ , + 0x262d9 /* offset 5997 */ , + 0x7f7a /* offset 5998 */ , + 0x2633e /* offset 5999 */ , + 0x7f95 /* offset 6000 */ , + 0x7ffa /* offset 6001 */ , + 0x264da /* offset 6002 */ , + 0x26523 /* offset 6003 */ , + 0x8060 /* offset 6004 */ , + 0x265a8 /* offset 6005 */ , + 0x8070 /* offset 6006 */ , + 0x2335f /* offset 6007 */ , + 0x43d5 /* offset 6008 */ , + 0x80b2 /* offset 6009 */ , + 0x8103 /* offset 6010 */ , + 0x440b /* offset 6011 */ , + 0x813e /* offset 6012 */ , + 0x5ab5 /* offset 6013 */ , + 0x267a7 /* offset 6014 */ , + 0x267b5 /* offset 6015 */ , + 0x23393 /* offset 6016 */ , + 0x2339c /* offset 6017 */ , + 0x8204 /* offset 6018 */ , + 0x8f9e /* offset 6019 */ , + 0x446b /* offset 6020 */ , + 0x8291 /* offset 6021 */ , + 0x828b /* offset 6022 */ , + 0x829d /* offset 6023 */ , + 0x52b3 /* offset 6024 */ , + 0x82b1 /* offset 6025 */ , + 0x82b3 /* offset 6026 */ , + 0x82bd /* offset 6027 */ , + 0x82e6 /* offset 6028 */ , + 0x26b3c /* offset 6029 */ , + 0x831d /* offset 6030 */ , + 0x8363 /* offset 6031 */ , + 0x83ad /* offset 6032 */ , + 0x8323 /* offset 6033 */ , + 0x83bd /* offset 6034 */ , + 0x83e7 /* offset 6035 */ , + 0x8353 /* offset 6036 */ , + 0x83ca /* offset 6037 */ , + 0x83cc /* offset 6038 */ , + 0x83dc /* offset 6039 */ , + 0x26c36 /* offset 6040 */ , + 0x26d6b /* offset 6041 */ , + 0x26cd5 /* offset 6042 */ , + 0x452b /* offset 6043 */ , + 0x84f1 /* offset 6044 */ , + 0x84f3 /* offset 6045 */ , + 0x8516 /* offset 6046 */ , + 0x273ca /* offset 6047 */ , + 0x8564 /* offset 6048 */ , + 0x26f2c /* offset 6049 */ , + 0x455d /* offset 6050 */ , + 0x4561 /* offset 6051 */ , + 0x26fb1 /* offset 6052 */ , + 0x270d2 /* offset 6053 */ , + 0x456b /* offset 6054 */ , + 0x8650 /* offset 6055 */ , + 0x8667 /* offset 6056 */ , + 0x8669 /* offset 6057 */ , + 0x86a9 /* offset 6058 */ , + 0x8688 /* offset 6059 */ , + 0x870e /* offset 6060 */ , + 0x86e2 /* offset 6061 */ , + 0x8779 /* offset 6062 */ , + 0x8728 /* offset 6063 */ , + 0x876b /* offset 6064 */ , + 0x8786 /* offset 6065 */ , + 0x4d57 /* offset 6066 */ , + 0x87e1 /* offset 6067 */ , + 0x8801 /* offset 6068 */ , + 0x45f9 /* offset 6069 */ , + 0x8860 /* offset 6070 */ , + 0x27667 /* offset 6071 */ , + 0x88d7 /* offset 6072 */ , + 0x88de /* offset 6073 */ , + 0x4635 /* offset 6074 */ , + 0x88fa /* offset 6075 */ , + 0x34bb /* offset 6076 */ , + 0x278ae /* offset 6077 */ , + 0x27966 /* offset 6078 */ , + 0x46be /* offset 6079 */ , + 0x46c7 /* offset 6080 */ , + 0x8aa0 /* offset 6081 */ , + 0x8aed /* offset 6082 */ , + 0x8b8a /* offset 6083 */ , + 0x27ca8 /* offset 6084 */ , + 0x8cab /* offset 6085 */ , + 0x8cc1 /* offset 6086 */ , + 0x8d1b /* offset 6087 */ , + 0x8d77 /* offset 6088 */ , + 0x27f2f /* offset 6089 */ , + 0x20804 /* offset 6090 */ , + 0x8dcb /* offset 6091 */ , + 0x8dbc /* offset 6092 */ , + 0x8df0 /* offset 6093 */ , + 0x208de /* offset 6094 */ , + 0x8ed4 /* offset 6095 */ , + 0x8f38 /* offset 6096 */ , + 0x285d2 /* offset 6097 */ , + 0x285ed /* offset 6098 */ , + 0x9094 /* offset 6099 */ , + 0x90f1 /* offset 6100 */ , + 0x9111 /* offset 6101 */ , + 0x2872e /* offset 6102 */ , + 0x911b /* offset 6103 */ , + 0x9238 /* offset 6104 */ , + 0x92d7 /* offset 6105 */ , + 0x92d8 /* offset 6106 */ , + 0x927c /* offset 6107 */ , + 0x93f9 /* offset 6108 */ , + 0x9415 /* offset 6109 */ , + 0x28bfa /* offset 6110 */ , + 0x958b /* offset 6111 */ , + 0x4995 /* offset 6112 */ , + 0x95b7 /* offset 6113 */ , + 0x28d77 /* offset 6114 */ , + 0x49e6 /* offset 6115 */ , + 0x96c3 /* offset 6116 */ , + 0x5db2 /* offset 6117 */ , + 0x9723 /* offset 6118 */ , + 0x29145 /* offset 6119 */ , + 0x2921a /* offset 6120 */ , + 0x4a6e /* offset 6121 */ , + 0x4a76 /* offset 6122 */ , + 0x97e0 /* offset 6123 */ , + 0x2940a /* offset 6124 */ , + 0x4ab2 /* offset 6125 */ , + 0x29496 /* offset 6126 */ , + 0x980b /* offset 6127 */ , + 0x9829 /* offset 6128 */ , + 0x295b6 /* offset 6129 */ , + 0x98e2 /* offset 6130 */ , + 0x4b33 /* offset 6131 */ , + 0x9929 /* offset 6132 */ , + 0x99a7 /* offset 6133 */ , + 0x99c2 /* offset 6134 */ , + 0x99fe /* offset 6135 */ , + 0x4bce /* offset 6136 */ , + 0x29b30 /* offset 6137 */ , + 0x9b12 /* offset 6138 */ , + 0x9c40 /* offset 6139 */ , + 0x9cfd /* offset 6140 */ , + 0x4cce /* offset 6141 */ , + 0x4ced /* offset 6142 */ , + 0x9d67 /* offset 6143 */ , + 0x2a0ce /* offset 6144 */ , + 0x4cf8 /* offset 6145 */ , + 0x2a105 /* offset 6146 */ , + 0x2a20e /* offset 6147 */ , + 0x2a291 /* offset 6148 */ , + 0x4d56 /* offset 6149 */ , + 0x9efe /* offset 6150 */ , + 0x9f05 /* offset 6151 */ , + 0x9f0f /* offset 6152 */ , + 0x9f16 /* offset 6153 */ , + 0x2a600 /* offset 6154 */ +}; + diff --git a/poppler/UnicodeMap.cc b/poppler/UnicodeMap.cc new file mode 100644 index 0000000..0528cdf --- /dev/null +++ b/poppler/UnicodeMap.cc @@ -0,0 +1,311 @@ +//======================================================================== +// +// UnicodeMap.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Jakub Wilk +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "Error.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" + +//------------------------------------------------------------------------ + +#define maxExtCode 16 + +struct UnicodeMapExt { + Unicode u; // Unicode char + char code[maxExtCode]; + Guint nBytes; +}; + +//------------------------------------------------------------------------ + +UnicodeMap *UnicodeMap::parse(GooString *encodingNameA) { + FILE *f; + UnicodeMap *map; + UnicodeMapRange *range; + UnicodeMapExt *eMap; + int size, eMapsSize; + char buf[256]; + int line, nBytes, i, x; + char *tok1, *tok2, *tok3; + char *tokptr; + + if (!(f = globalParams->getUnicodeMapFile(encodingNameA))) { + error(errSyntaxError, -1, + "Couldn't find unicodeMap file for the '{0:t}' encoding", + encodingNameA); + return NULL; + } + + map = new UnicodeMap(encodingNameA->copy()); + + size = 8; + map->ranges = (UnicodeMapRange *)gmallocn(size, sizeof(UnicodeMapRange)); + eMapsSize = 0; + + line = 1; + while (getLine(buf, sizeof(buf), f)) { + if ((tok1 = strtok_r(buf, " \t\r\n", &tokptr)) && + (tok2 = strtok_r(NULL, " \t\r\n", &tokptr))) { + if (!(tok3 = strtok_r(NULL, " \t\r\n", &tokptr))) { + tok3 = tok2; + tok2 = tok1; + } + nBytes = strlen(tok3) / 2; + if (nBytes <= 4) { + if (map->len == size) { + size *= 2; + map->ranges = (UnicodeMapRange *) + greallocn(map->ranges, size, sizeof(UnicodeMapRange)); + } + range = &map->ranges[map->len]; + sscanf(tok1, "%x", &range->start); + sscanf(tok2, "%x", &range->end); + sscanf(tok3, "%x", &range->code); + range->nBytes = nBytes; + ++map->len; + } else if (tok2 == tok1) { + if (map->eMapsLen == eMapsSize) { + eMapsSize += 16; + map->eMaps = (UnicodeMapExt *) + greallocn(map->eMaps, eMapsSize, sizeof(UnicodeMapExt)); + } + eMap = &map->eMaps[map->eMapsLen]; + sscanf(tok1, "%x", &eMap->u); + for (i = 0; i < nBytes; ++i) { + sscanf(tok3 + i*2, "%2x", &x); + eMap->code[i] = (char)x; + } + eMap->nBytes = nBytes; + ++map->eMapsLen; + } else { + error(errSyntaxError, -1, + "Bad line ({0:d}) in unicodeMap file for the '{1:t}' encoding", + line, encodingNameA); + } + } else { + error(errSyntaxError, -1, + "Bad line ({0:d}) in unicodeMap file for the '{1:t}' encoding", + line, encodingNameA); + } + ++line; + } + + fclose(f); + + return map; +} + +UnicodeMap::UnicodeMap(GooString *encodingNameA) { + encodingName = encodingNameA; + unicodeOut = gFalse; + kind = unicodeMapUser; + ranges = NULL; + len = 0; + eMaps = NULL; + eMapsLen = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +UnicodeMap::UnicodeMap(const char *encodingNameA, GBool unicodeOutA, + UnicodeMapRange *rangesA, int lenA) { + encodingName = new GooString(encodingNameA); + unicodeOut = unicodeOutA; + kind = unicodeMapResident; + ranges = rangesA; + len = lenA; + eMaps = NULL; + eMapsLen = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +UnicodeMap::UnicodeMap(const char *encodingNameA, GBool unicodeOutA, + UnicodeMapFunc funcA) { + encodingName = new GooString(encodingNameA); + unicodeOut = unicodeOutA; + kind = unicodeMapFunc; + func = funcA; + eMaps = NULL; + eMapsLen = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +UnicodeMap::~UnicodeMap() { + delete encodingName; + if (kind == unicodeMapUser && ranges) { + gfree(ranges); + } + if (eMaps) { + gfree(eMaps); + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +void UnicodeMap::incRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + ++refCnt; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +void UnicodeMap::decRefCnt() { + GBool done; + +#if MULTITHREADED + gLockMutex(&mutex); +#endif + done = --refCnt == 0; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + if (done) { + delete this; + } +} + +GBool UnicodeMap::match(GooString *encodingNameA) { + return !encodingName->cmp(encodingNameA); +} + +int UnicodeMap::mapUnicode(Unicode u, char *buf, int bufSize) { + int a, b, m, n, i, j; + Guint code; + + if (kind == unicodeMapFunc) { + return (*func)(u, buf, bufSize); + } + + a = 0; + b = len; + if (u >= ranges[a].start) { + // invariant: ranges[a].start <= u < ranges[b].start + while (b - a > 1) { + m = (a + b) / 2; + if (u >= ranges[m].start) { + a = m; + } else if (u < ranges[m].start) { + b = m; + } + } + if (u <= ranges[a].end) { + n = ranges[a].nBytes; + if (n > bufSize) { + return 0; + } + code = ranges[a].code + (u - ranges[a].start); + for (i = n - 1; i >= 0; --i) { + buf[i] = (char)(code & 0xff); + code >>= 8; + } + return n; + } + } + + for (i = 0; i < eMapsLen; ++i) { + if (eMaps[i].u == u) { + n = eMaps[i].nBytes; + for (j = 0; j < n; ++j) { + buf[j] = eMaps[i].code[j]; + } + return n; + } + } + + return 0; +} + +//------------------------------------------------------------------------ + +UnicodeMapCache::UnicodeMapCache() { + int i; + + for (i = 0; i < unicodeMapCacheSize; ++i) { + cache[i] = NULL; + } +} + +UnicodeMapCache::~UnicodeMapCache() { + int i; + + for (i = 0; i < unicodeMapCacheSize; ++i) { + if (cache[i]) { + cache[i]->decRefCnt(); + } + } +} + +UnicodeMap *UnicodeMapCache::getUnicodeMap(GooString *encodingName) { + UnicodeMap *map; + int i, j; + + if (cache[0] && cache[0]->match(encodingName)) { + cache[0]->incRefCnt(); + return cache[0]; + } + for (i = 1; i < unicodeMapCacheSize; ++i) { + if (cache[i] && cache[i]->match(encodingName)) { + map = cache[i]; + for (j = i; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = map; + map->incRefCnt(); + return map; + } + } + if ((map = UnicodeMap::parse(encodingName))) { + if (cache[unicodeMapCacheSize - 1]) { + cache[unicodeMapCacheSize - 1]->decRefCnt(); + } + for (j = unicodeMapCacheSize - 1; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = map; + map->incRefCnt(); + return map; + } + return NULL; +} diff --git a/poppler/UnicodeMap.h b/poppler/UnicodeMap.h new file mode 100644 index 0000000..ba7df2c --- /dev/null +++ b/poppler/UnicodeMap.h @@ -0,0 +1,122 @@ +//======================================================================== +// +// UnicodeMap.h +// +// Mapping from Unicode to an encoding. +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef UNICODEMAP_H +#define UNICODEMAP_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "goo/gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "goo/GooMutex.h" +#endif + +class GooString; + +//------------------------------------------------------------------------ + +enum UnicodeMapKind { + unicodeMapUser, // read from a file + unicodeMapResident, // static list of ranges + unicodeMapFunc // function pointer +}; + +typedef int (*UnicodeMapFunc)(Unicode u, char *buf, int bufSize); + +struct UnicodeMapRange { + Unicode start, end; // range of Unicode chars + Guint code, nBytes; // first output code +}; + +struct UnicodeMapExt; + +//------------------------------------------------------------------------ + +class UnicodeMap { +public: + + // Create the UnicodeMap specified by . Sets the + // initial reference count to 1. Returns NULL on failure. + static UnicodeMap *parse(GooString *encodingNameA); + + // Create a resident UnicodeMap. + UnicodeMap(const char *encodingNameA, GBool unicodeOutA, + UnicodeMapRange *rangesA, int lenA); + + // Create a resident UnicodeMap that uses a function instead of a + // list of ranges. + UnicodeMap(const char *encodingNameA, GBool unicodeOutA, + UnicodeMapFunc funcA); + + ~UnicodeMap(); + + void incRefCnt(); + void decRefCnt(); + + GooString *getEncodingName() { return encodingName; } + + GBool isUnicode() { return unicodeOut; } + + // Return true if this UnicodeMap matches the specified + // . + GBool match(GooString *encodingNameA); + + // Map Unicode to the target encoding. Fills in with the + // output and returns the number of bytes used. Output will be + // truncated at bytes. No string terminator is written. + // Returns 0 if no mapping is found. + int mapUnicode(Unicode u, char *buf, int bufSize); + +private: + + UnicodeMap(GooString *encodingNameA); + + GooString *encodingName; + UnicodeMapKind kind; + GBool unicodeOut; + union { + UnicodeMapRange *ranges; // (user, resident) + UnicodeMapFunc func; // (func) + }; + int len; // (user, resident) + UnicodeMapExt *eMaps; // (user) + int eMapsLen; // (user) + int refCnt; +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ + +#define unicodeMapCacheSize 4 + +class UnicodeMapCache { +public: + + UnicodeMapCache(); + ~UnicodeMapCache(); + + // Get the UnicodeMap for . Increments its reference + // count; there will be one reference for the cache plus one for the + // caller of this function. Returns NULL on failure. + UnicodeMap *getUnicodeMap(GooString *encodingName); + +private: + + UnicodeMap *cache[unicodeMapCacheSize]; +}; + +#endif diff --git a/poppler/UnicodeMapTables.h b/poppler/UnicodeMapTables.h new file mode 100644 index 0000000..073e474 --- /dev/null +++ b/poppler/UnicodeMapTables.h @@ -0,0 +1,365 @@ +//======================================================================== +// +// UnicodeMapTables.h +// +// Copyright 2001-2009 Glyph & Cog, LLC +// +//======================================================================== + +static UnicodeMapRange latin1UnicodeMapRanges[] = { + { 0x000a, 0x000a, 0x0a, 1 }, + { 0x000c, 0x000d, 0x0c, 1 }, + { 0x0020, 0x007e, 0x20, 1 }, + { 0x00a0, 0x00a0, 0x20, 1 }, + { 0x00a1, 0x00ac, 0xa1, 1 }, + { 0x00ae, 0x00ff, 0xae, 1 }, + { 0x010c, 0x010c, 0x43, 1 }, + { 0x010d, 0x010d, 0x63, 1 }, + { 0x0131, 0x0131, 0x69, 1 }, + { 0x0141, 0x0141, 0x4c, 1 }, + { 0x0142, 0x0142, 0x6c, 1 }, + { 0x0152, 0x0152, 0x4f45, 2 }, + { 0x0153, 0x0153, 0x6f65, 2 }, + { 0x0160, 0x0160, 0x53, 1 }, + { 0x0161, 0x0161, 0x73, 1 }, + { 0x0178, 0x0178, 0x59, 1 }, + { 0x017d, 0x017d, 0x5a, 1 }, + { 0x017e, 0x017e, 0x7a, 1 }, + { 0x02c6, 0x02c6, 0x5e, 1 }, + { 0x02da, 0x02da, 0xb0, 1 }, + { 0x02dc, 0x02dc, 0x7e, 1 }, + { 0x2013, 0x2013, 0xad, 1 }, + { 0x2014, 0x2014, 0x2d2d, 2 }, + { 0x2018, 0x2018, 0x60, 1 }, + { 0x2019, 0x2019, 0x27, 1 }, + { 0x201a, 0x201a, 0x2c, 1 }, + { 0x201c, 0x201c, 0x22, 1 }, + { 0x201d, 0x201d, 0x22, 1 }, + { 0x201e, 0x201e, 0x2c2c, 2 }, + { 0x2022, 0x2022, 0xb7, 1 }, + { 0x2026, 0x2026, 0x2e2e2e, 3 }, + { 0x2039, 0x2039, 0x3c, 1 }, + { 0x203a, 0x203a, 0x3e, 1 }, + { 0x2044, 0x2044, 0x2f, 1 }, + { 0x2122, 0x2122, 0x544d, 2 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0xf6f9, 0xf6f9, 0x4c, 1 }, + { 0xf6fa, 0xf6fa, 0x4f45, 2 }, + { 0xf6fc, 0xf6fc, 0xb0, 1 }, + { 0xf6fd, 0xf6fd, 0x53, 1 }, + { 0xf6fe, 0xf6fe, 0x7e, 1 }, + { 0xf6ff, 0xf6ff, 0x5a, 1 }, + { 0xf721, 0xf721, 0x21, 1 }, + { 0xf724, 0xf724, 0x24, 1 }, + { 0xf726, 0xf726, 0x26, 1 }, + { 0xf730, 0xf739, 0x30, 1 }, + { 0xf73f, 0xf73f, 0x3f, 1 }, + { 0xf761, 0xf77a, 0x41, 1 }, + { 0xf7a1, 0xf7a2, 0xa1, 1 }, + { 0xf7bf, 0xf7bf, 0xbf, 1 }, + { 0xf7e0, 0xf7f6, 0xc0, 1 }, + { 0xf7f8, 0xf7fe, 0xd8, 1 }, + { 0xf7ff, 0xf7ff, 0x59, 1 }, + { 0xfb00, 0xfb00, 0x6666, 2 }, + { 0xfb01, 0xfb01, 0x6669, 2 }, + { 0xfb02, 0xfb02, 0x666c, 2 }, + { 0xfb03, 0xfb03, 0x666669, 3 }, + { 0xfb04, 0xfb04, 0x66666c, 3 }, + { 0xfb05, 0xfb05, 0x7374, 2 }, + { 0xfb06, 0xfb06, 0x7374, 2 } +}; +#define latin1UnicodeMapLen (sizeof(latin1UnicodeMapRanges) / sizeof(UnicodeMapRange)) + +static UnicodeMapRange ascii7UnicodeMapRanges[] = { + { 0x000a, 0x000a, 0x0a, 1 }, + { 0x000c, 0x000d, 0x0c, 1 }, + { 0x0020, 0x005f, 0x20, 1 }, + { 0x0061, 0x007e, 0x61, 1 }, + { 0x00a6, 0x00a6, 0x7c, 1 }, + { 0x00a9, 0x00a9, 0x286329, 3 }, + { 0x00ae, 0x00ae, 0x285229, 3 }, + { 0x00b7, 0x00b7, 0x2a, 1 }, + { 0x00bc, 0x00bc, 0x312f34, 3 }, + { 0x00bd, 0x00bd, 0x312f32, 3 }, + { 0x00be, 0x00be, 0x332f34, 3 }, + { 0x00c0, 0x00c0, 0x41, 1 }, + { 0x00c1, 0x00c1, 0x41, 1 }, + { 0x00c2, 0x00c2, 0x41, 1 }, + { 0x00c3, 0x00c3, 0x41, 1 }, + { 0x00c4, 0x00c4, 0x41, 1 }, + { 0x00c5, 0x00c5, 0x41, 1 }, + { 0x00c6, 0x00c6, 0x4145, 2 }, + { 0x00c7, 0x00c7, 0x43, 1 }, + { 0x00c8, 0x00c8, 0x45, 1 }, + { 0x00c9, 0x00c9, 0x45, 1 }, + { 0x00ca, 0x00ca, 0x45, 1 }, + { 0x00cb, 0x00cb, 0x45, 1 }, + { 0x00cc, 0x00cc, 0x49, 1 }, + { 0x00cd, 0x00cd, 0x49, 1 }, + { 0x00ce, 0x00ce, 0x49, 1 }, + { 0x00cf, 0x00cf, 0x49, 1 }, + { 0x00d1, 0x00d2, 0x4e, 1 }, + { 0x00d3, 0x00d3, 0x4f, 1 }, + { 0x00d4, 0x00d4, 0x4f, 1 }, + { 0x00d5, 0x00d5, 0x4f, 1 }, + { 0x00d6, 0x00d6, 0x4f, 1 }, + { 0x00d7, 0x00d7, 0x78, 1 }, + { 0x00d8, 0x00d8, 0x4f, 1 }, + { 0x00d9, 0x00d9, 0x55, 1 }, + { 0x00da, 0x00da, 0x55, 1 }, + { 0x00db, 0x00db, 0x55, 1 }, + { 0x00dc, 0x00dc, 0x55, 1 }, + { 0x00dd, 0x00dd, 0x59, 1 }, + { 0x00e0, 0x00e0, 0x61, 1 }, + { 0x00e1, 0x00e1, 0x61, 1 }, + { 0x00e2, 0x00e2, 0x61, 1 }, + { 0x00e3, 0x00e3, 0x61, 1 }, + { 0x00e4, 0x00e4, 0x61, 1 }, + { 0x00e5, 0x00e5, 0x61, 1 }, + { 0x00e6, 0x00e6, 0x6165, 2 }, + { 0x00e7, 0x00e7, 0x63, 1 }, + { 0x00e8, 0x00e8, 0x65, 1 }, + { 0x00e9, 0x00e9, 0x65, 1 }, + { 0x00ea, 0x00ea, 0x65, 1 }, + { 0x00eb, 0x00eb, 0x65, 1 }, + { 0x00ec, 0x00ec, 0x69, 1 }, + { 0x00ed, 0x00ed, 0x69, 1 }, + { 0x00ee, 0x00ee, 0x69, 1 }, + { 0x00ef, 0x00ef, 0x69, 1 }, + { 0x00f1, 0x00f2, 0x6e, 1 }, + { 0x00f3, 0x00f3, 0x6f, 1 }, + { 0x00f4, 0x00f4, 0x6f, 1 }, + { 0x00f5, 0x00f5, 0x6f, 1 }, + { 0x00f6, 0x00f6, 0x6f, 1 }, + { 0x00f7, 0x00f7, 0x2f, 1 }, + { 0x00f8, 0x00f8, 0x6f, 1 }, + { 0x00f9, 0x00f9, 0x75, 1 }, + { 0x00fa, 0x00fa, 0x75, 1 }, + { 0x00fb, 0x00fb, 0x75, 1 }, + { 0x00fc, 0x00fc, 0x75, 1 }, + { 0x00fd, 0x00fd, 0x79, 1 }, + { 0x00ff, 0x00ff, 0x79, 1 }, + { 0x0131, 0x0131, 0x69, 1 }, + { 0x0141, 0x0141, 0x4c, 1 }, + { 0x0152, 0x0152, 0x4f45, 2 }, + { 0x0153, 0x0153, 0x6f65, 2 }, + { 0x0160, 0x0160, 0x53, 1 }, + { 0x0178, 0x0178, 0x59, 1 }, + { 0x017d, 0x017d, 0x5a, 1 }, + { 0x2013, 0x2013, 0x2d, 1 }, + { 0x2014, 0x2014, 0x2d2d, 2 }, + { 0x2018, 0x2018, 0x60, 1 }, + { 0x2019, 0x2019, 0x27, 1 }, + { 0x201c, 0x201c, 0x22, 1 }, + { 0x201d, 0x201d, 0x22, 1 }, + { 0x2022, 0x2022, 0x2a, 1 }, + { 0x2026, 0x2026, 0x2e2e2e, 3 }, + { 0x2122, 0x2122, 0x544d, 2 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0xf6f9, 0xf6f9, 0x4c, 1 }, + { 0xf6fa, 0xf6fa, 0x4f45, 2 }, + { 0xf6fd, 0xf6fd, 0x53, 1 }, + { 0xf6fe, 0xf6fe, 0x7e, 1 }, + { 0xf6ff, 0xf6ff, 0x5a, 1 }, + { 0xf721, 0xf721, 0x21, 1 }, + { 0xf724, 0xf724, 0x24, 1 }, + { 0xf726, 0xf726, 0x26, 1 }, + { 0xf730, 0xf739, 0x30, 1 }, + { 0xf73f, 0xf73f, 0x3f, 1 }, + { 0xf761, 0xf77a, 0x41, 1 }, + { 0xf7e0, 0xf7e0, 0x41, 1 }, + { 0xf7e1, 0xf7e1, 0x41, 1 }, + { 0xf7e2, 0xf7e2, 0x41, 1 }, + { 0xf7e3, 0xf7e3, 0x41, 1 }, + { 0xf7e4, 0xf7e4, 0x41, 1 }, + { 0xf7e5, 0xf7e5, 0x41, 1 }, + { 0xf7e6, 0xf7e6, 0x4145, 2 }, + { 0xf7e7, 0xf7e7, 0x43, 1 }, + { 0xf7e8, 0xf7e8, 0x45, 1 }, + { 0xf7e9, 0xf7e9, 0x45, 1 }, + { 0xf7ea, 0xf7ea, 0x45, 1 }, + { 0xf7eb, 0xf7eb, 0x45, 1 }, + { 0xf7ec, 0xf7ec, 0x49, 1 }, + { 0xf7ed, 0xf7ed, 0x49, 1 }, + { 0xf7ee, 0xf7ee, 0x49, 1 }, + { 0xf7ef, 0xf7ef, 0x49, 1 }, + { 0xf7f1, 0xf7f2, 0x4e, 1 }, + { 0xf7f3, 0xf7f3, 0x4f, 1 }, + { 0xf7f4, 0xf7f4, 0x4f, 1 }, + { 0xf7f5, 0xf7f5, 0x4f, 1 }, + { 0xf7f6, 0xf7f6, 0x4f, 1 }, + { 0xf7f8, 0xf7f8, 0x4f, 1 }, + { 0xf7f9, 0xf7f9, 0x55, 1 }, + { 0xf7fa, 0xf7fa, 0x55, 1 }, + { 0xf7fb, 0xf7fb, 0x55, 1 }, + { 0xf7fc, 0xf7fc, 0x55, 1 }, + { 0xf7fd, 0xf7fd, 0x59, 1 }, + { 0xf7ff, 0xf7ff, 0x59, 1 }, + { 0xfb00, 0xfb00, 0x6666, 2 }, + { 0xfb01, 0xfb01, 0x6669, 2 }, + { 0xfb02, 0xfb02, 0x666c, 2 }, + { 0xfb03, 0xfb03, 0x666669, 3 }, + { 0xfb04, 0xfb04, 0x66666c, 3 }, + { 0xfb05, 0xfb05, 0x7374, 2 }, + { 0xfb06, 0xfb06, 0x7374, 2 } +}; +#define ascii7UnicodeMapLen (sizeof(ascii7UnicodeMapRanges) / sizeof(UnicodeMapRange)) + +static UnicodeMapRange symbolUnicodeMapRanges[] = { + { 0x0020, 0x0021, 0x20, 1 }, + { 0x0023, 0x0023, 0x23, 1 }, + { 0x0025, 0x0026, 0x25, 1 }, + { 0x0028, 0x0029, 0x28, 1 }, + { 0x002b, 0x002c, 0x2b, 1 }, + { 0x002e, 0x003f, 0x2e, 1 }, + { 0x005b, 0x005b, 0x5b, 1 }, + { 0x005d, 0x005d, 0x5d, 1 }, + { 0x005f, 0x005f, 0x5f, 1 }, + { 0x007b, 0x007d, 0x7b, 1 }, + { 0x00ac, 0x00ac, 0xd8, 1 }, + { 0x00b0, 0x00b1, 0xb0, 1 }, + { 0x00b5, 0x00b5, 0x6d, 1 }, + { 0x00d7, 0x00d7, 0xb4, 1 }, + { 0x00f7, 0x00f7, 0xb8, 1 }, + { 0x0192, 0x0192, 0xa6, 1 }, + { 0x0391, 0x0392, 0x41, 1 }, + { 0x0393, 0x0393, 0x47, 1 }, + { 0x0395, 0x0395, 0x45, 1 }, + { 0x0396, 0x0396, 0x5a, 1 }, + { 0x0397, 0x0397, 0x48, 1 }, + { 0x0398, 0x0398, 0x51, 1 }, + { 0x0399, 0x0399, 0x49, 1 }, + { 0x039a, 0x039d, 0x4b, 1 }, + { 0x039e, 0x039e, 0x58, 1 }, + { 0x039f, 0x03a0, 0x4f, 1 }, + { 0x03a1, 0x03a1, 0x52, 1 }, + { 0x03a3, 0x03a5, 0x53, 1 }, + { 0x03a6, 0x03a6, 0x46, 1 }, + { 0x03a7, 0x03a7, 0x43, 1 }, + { 0x03a8, 0x03a8, 0x59, 1 }, + { 0x03b1, 0x03b2, 0x61, 1 }, + { 0x03b3, 0x03b3, 0x67, 1 }, + { 0x03b4, 0x03b5, 0x64, 1 }, + { 0x03b6, 0x03b6, 0x7a, 1 }, + { 0x03b7, 0x03b7, 0x68, 1 }, + { 0x03b8, 0x03b8, 0x71, 1 }, + { 0x03b9, 0x03b9, 0x69, 1 }, + { 0x03ba, 0x03bb, 0x6b, 1 }, + { 0x03bd, 0x03bd, 0x6e, 1 }, + { 0x03be, 0x03be, 0x78, 1 }, + { 0x03bf, 0x03c0, 0x6f, 1 }, + { 0x03c1, 0x03c1, 0x72, 1 }, + { 0x03c2, 0x03c2, 0x56, 1 }, + { 0x03c3, 0x03c5, 0x73, 1 }, + { 0x03c6, 0x03c6, 0x66, 1 }, + { 0x03c7, 0x03c7, 0x63, 1 }, + { 0x03c8, 0x03c8, 0x79, 1 }, + { 0x03c9, 0x03c9, 0x77, 1 }, + { 0x03d1, 0x03d1, 0x4a, 1 }, + { 0x03d2, 0x03d2, 0xa1, 1 }, + { 0x03d5, 0x03d5, 0x6a, 1 }, + { 0x03d6, 0x03d6, 0x76, 1 }, + { 0x2022, 0x2022, 0xb7, 1 }, + { 0x2026, 0x2026, 0xbc, 1 }, + { 0x2032, 0x2032, 0xa2, 1 }, + { 0x2033, 0x2033, 0xb2, 1 }, + { 0x2044, 0x2044, 0xa4, 1 }, + { 0x2111, 0x2111, 0xc1, 1 }, + { 0x2118, 0x2118, 0xc3, 1 }, + { 0x211c, 0x211c, 0xc2, 1 }, + { 0x2126, 0x2126, 0x57, 1 }, + { 0x2135, 0x2135, 0xc0, 1 }, + { 0x2190, 0x2193, 0xac, 1 }, + { 0x2194, 0x2194, 0xab, 1 }, + { 0x21b5, 0x21b5, 0xbf, 1 }, + { 0x21d0, 0x21d3, 0xdc, 1 }, + { 0x21d4, 0x21d4, 0xdb, 1 }, + { 0x2200, 0x2200, 0x22, 1 }, + { 0x2202, 0x2202, 0xb6, 1 }, + { 0x2203, 0x2203, 0x24, 1 }, + { 0x2205, 0x2205, 0xc6, 1 }, + { 0x2206, 0x2206, 0x44, 1 }, + { 0x2207, 0x2207, 0xd1, 1 }, + { 0x2208, 0x2209, 0xce, 1 }, + { 0x220b, 0x220b, 0x27, 1 }, + { 0x220f, 0x220f, 0xd5, 1 }, + { 0x2211, 0x2211, 0xe5, 1 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0x2217, 0x2217, 0x2a, 1 }, + { 0x221a, 0x221a, 0xd6, 1 }, + { 0x221d, 0x221d, 0xb5, 1 }, + { 0x221e, 0x221e, 0xa5, 1 }, + { 0x2220, 0x2220, 0xd0, 1 }, + { 0x2227, 0x2228, 0xd9, 1 }, + { 0x2229, 0x222a, 0xc7, 1 }, + { 0x222b, 0x222b, 0xf2, 1 }, + { 0x2234, 0x2234, 0x5c, 1 }, + { 0x223c, 0x223c, 0x7e, 1 }, + { 0x2245, 0x2245, 0x40, 1 }, + { 0x2248, 0x2248, 0xbb, 1 }, + { 0x2260, 0x2261, 0xb9, 1 }, + { 0x2264, 0x2264, 0xa3, 1 }, + { 0x2265, 0x2265, 0xb3, 1 }, + { 0x2282, 0x2282, 0xcc, 1 }, + { 0x2283, 0x2283, 0xc9, 1 }, + { 0x2284, 0x2284, 0xcb, 1 }, + { 0x2286, 0x2286, 0xcd, 1 }, + { 0x2287, 0x2287, 0xca, 1 }, + { 0x2295, 0x2295, 0xc5, 1 }, + { 0x2297, 0x2297, 0xc4, 1 }, + { 0x22a5, 0x22a5, 0x5e, 1 }, + { 0x22c5, 0x22c5, 0xd7, 1 }, + { 0x2320, 0x2320, 0xf3, 1 }, + { 0x2321, 0x2321, 0xf5, 1 }, + { 0x2329, 0x2329, 0xe1, 1 }, + { 0x232a, 0x232a, 0xf1, 1 }, + { 0x25ca, 0x25ca, 0xe0, 1 }, + { 0x2660, 0x2660, 0xaa, 1 }, + { 0x2663, 0x2663, 0xa7, 1 }, + { 0x2665, 0x2665, 0xa9, 1 }, + { 0x2666, 0x2666, 0xa8, 1 }, + { 0xf6d9, 0xf6d9, 0xd3, 1 }, + { 0xf6da, 0xf6da, 0xd2, 1 }, + { 0xf6db, 0xf6db, 0xd4, 1 }, + { 0xf8e5, 0xf8e5, 0x60, 1 }, + { 0xf8e6, 0xf8e7, 0xbd, 1 }, + { 0xf8e8, 0xf8ea, 0xe2, 1 }, + { 0xf8eb, 0xf8f4, 0xe6, 1 }, + { 0xf8f5, 0xf8f5, 0xf4, 1 }, + { 0xf8f6, 0xf8fe, 0xf6, 1 } +}; +#define symbolUnicodeMapLen (sizeof(symbolUnicodeMapRanges) / sizeof(UnicodeMapRange)) + +static UnicodeMapRange zapfDingbatsUnicodeMapRanges[] = { + { 0x0020, 0x0020, 0x20, 1 }, + { 0x2192, 0x2192, 0xd5, 1 }, + { 0x2194, 0x2195, 0xd6, 1 }, + { 0x2460, 0x2469, 0xac, 1 }, + { 0x25a0, 0x25a0, 0x6e, 1 }, + { 0x25b2, 0x25b2, 0x73, 1 }, + { 0x25bc, 0x25bc, 0x74, 1 }, + { 0x25c6, 0x25c6, 0x75, 1 }, + { 0x25cf, 0x25cf, 0x6c, 1 }, + { 0x25d7, 0x25d7, 0x77, 1 }, + { 0x2605, 0x2605, 0x48, 1 }, + { 0x260e, 0x260e, 0x25, 1 }, + { 0x261b, 0x261b, 0x2a, 1 }, + { 0x261e, 0x261e, 0x2b, 1 }, + { 0x2660, 0x2660, 0xab, 1 }, + { 0x2663, 0x2663, 0xa8, 1 }, + { 0x2665, 0x2665, 0xaa, 1 }, + { 0x2666, 0x2666, 0xa9, 1 }, + { 0x2701, 0x2704, 0x21, 1 }, + { 0x2706, 0x2709, 0x26, 1 }, + { 0x270c, 0x2727, 0x2c, 1 }, + { 0x2729, 0x274b, 0x49, 1 }, + { 0x274d, 0x274d, 0x6d, 1 }, + { 0x274f, 0x2752, 0x6f, 1 }, + { 0x2756, 0x2756, 0x76, 1 }, + { 0x2758, 0x275e, 0x78, 1 }, + { 0x2761, 0x2767, 0xa1, 1 }, + { 0x2776, 0x2794, 0xb6, 1 }, + { 0x2798, 0x27af, 0xd8, 1 }, + { 0x27b1, 0x27be, 0xf1, 1 } +}; +#define zapfDingbatsUnicodeMapLen (sizeof(zapfDingbatsUnicodeMapRanges) / sizeof(UnicodeMapRange)) diff --git a/poppler/UnicodeTypeTable.cc b/poppler/UnicodeTypeTable.cc new file mode 100644 index 0000000..721af9d --- /dev/null +++ b/poppler/UnicodeTypeTable.cc @@ -0,0 +1,1223 @@ +//======================================================================== +// +// UnicodeTypeTable.cc +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2007 Ed Catmur +// Copyright (C) 2007 Jeff Muizelaar +// Copyright (C) 2008 Albert Astals Cid +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include +#include "CharTypes.h" +#include "UnicodeTypeTable.h" +#include "goo/gmem.h" + +struct UnicodeMapTableEntry { + const char *vector; + const char type; +}; + +struct UnicodeCaseTableVector { + Unicode codes[256]; +}; + +static const UnicodeMapTableEntry typeTable[256] = { + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN###NNNNN################NNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#N####NNNNLNNNNN####NLNNN#LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL", 'X' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLNNNNNNNNNNNNNNLLNNNNNNNNNNNNNNLLLLLNNNNNNNNNLNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLNNNNNNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRNRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' }, + { "RRRR#########RNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNN####################RRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNRNNNNNNNRRNNNNNNNRR##########RRRRRR", 'X' }, + { "RRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'N' }, + { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLNNNNLLLLLLLLLLLLLNNLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLL##LLLLLLLNNNNN", 'X' }, + { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLL##NNNNNNNNNNNNNN", 'X' }, + { "NNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLNLNNNLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNN#NLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNN#####LLLLLLLNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNLNNNNNLNNLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLNLLNNNNNNNNNNNLLLLLLL#LNLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLNNNNNLLLLLLNLLLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNNNLLLLLLLLLLLNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLNNNLLLLLLLLLLLLLNNN", 'X' }, + { "NNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNNNNNLRNLRN#####NNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#L##########NNNL############NNN###################################NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNLNNNNLNNLLLLLLLLLLNLNNNLLLLLNNNNNNLNLNLNLLLL#LLLNLLLLLLLNNLLLLNNNNNLLLLLNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN####################LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'L' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { "NNNNNLLLNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNNNNNNNLLLLLNNLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLL", 'X' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLRRRRRRNRRRRRRRRRR#RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' }, + { NULL, 'R' }, + { "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#N#NN#NNNNNNNNN#NN##NNNNN##NRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' }, + { "NNN###NNNNN################NNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#####NNN##NNNNNNNNNNNNNNNNNNNNNNNLL", 'X' } +}; + +static const UnicodeCaseTableVector caseTable00 = {{ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x03bc, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00d7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}}; +static const UnicodeCaseTableVector caseTable01 = {{ + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010b, 0x010b, 0x010d, 0x010d, 0x010f, 0x010f, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011b, 0x011b, 0x011d, 0x011d, 0x011f, 0x011f, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012b, 0x012b, 0x012d, 0x012d, 0x012f, 0x012f, + 0x0130, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, + 0x0138, 0x013a, 0x013a, 0x013c, 0x013c, 0x013e, 0x013e, 0x0140, + 0x0140, 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, + 0x0148, 0x0149, 0x014b, 0x014b, 0x014d, 0x014d, 0x014f, 0x014f, + 0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, + 0x0159, 0x0159, 0x015b, 0x015b, 0x015d, 0x015d, 0x015f, 0x015f, + 0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, + 0x0169, 0x0169, 0x016b, 0x016b, 0x016d, 0x016d, 0x016f, 0x016f, + 0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, + 0x00ff, 0x017a, 0x017a, 0x017c, 0x017c, 0x017e, 0x017e, 0x0073, + 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, + 0x0188, 0x0256, 0x0257, 0x018c, 0x018c, 0x018d, 0x01dd, 0x0259, + 0x025b, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, + 0x0199, 0x0199, 0x019a, 0x019b, 0x026f, 0x0272, 0x019e, 0x0275, + 0x01a1, 0x01a1, 0x01a3, 0x01a3, 0x01a5, 0x01a5, 0x0280, 0x01a8, + 0x01a8, 0x0283, 0x01aa, 0x01ab, 0x01ad, 0x01ad, 0x0288, 0x01b0, + 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b4, 0x01b6, 0x01b6, 0x0292, + 0x01b9, 0x01b9, 0x01ba, 0x01bb, 0x01bd, 0x01bd, 0x01be, 0x01bf, + 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c6, 0x01c6, 0x01c6, 0x01c9, + 0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01cc, 0x01ce, 0x01ce, 0x01d0, + 0x01d0, 0x01d2, 0x01d2, 0x01d4, 0x01d4, 0x01d6, 0x01d6, 0x01d8, + 0x01d8, 0x01da, 0x01da, 0x01dc, 0x01dc, 0x01dd, 0x01df, 0x01df, + 0x01e1, 0x01e1, 0x01e3, 0x01e3, 0x01e5, 0x01e5, 0x01e7, 0x01e7, + 0x01e9, 0x01e9, 0x01eb, 0x01eb, 0x01ed, 0x01ed, 0x01ef, 0x01ef, + 0x01f0, 0x01f3, 0x01f3, 0x01f3, 0x01f5, 0x01f5, 0x0195, 0x01bf, + 0x01f9, 0x01f9, 0x01fb, 0x01fb, 0x01fd, 0x01fd, 0x01ff, 0x01ff +}}; +static const UnicodeCaseTableVector caseTable02 = {{ + 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, + 0x0209, 0x0209, 0x020b, 0x020b, 0x020d, 0x020d, 0x020f, 0x020f, + 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, + 0x0219, 0x0219, 0x021b, 0x021b, 0x021d, 0x021d, 0x021f, 0x021f, + 0x019e, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, + 0x0229, 0x0229, 0x022b, 0x022b, 0x022d, 0x022d, 0x022f, 0x022f, + 0x0231, 0x0231, 0x0233, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, + 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, + 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, + 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, + 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, + 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, + 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, + 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, + 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, + 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, + 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, + 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, + 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, + 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, + 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, + 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, + 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, + 0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, + 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, + 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, + 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, + 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, + 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, + 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, + 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, + 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff +}}; +static const UnicodeCaseTableVector caseTable03 = {{ + 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, + 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, + 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, + 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, + 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, + 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, + 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x03b9, 0x0346, 0x0347, + 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, + 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, + 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, + 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, + 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, + 0x0378, 0x0379, 0x037a, 0x037b, 0x037c, 0x037d, 0x037e, 0x037f, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x03ac, 0x0387, + 0x03ad, 0x03ae, 0x03af, 0x038b, 0x03cc, 0x038d, 0x03cd, 0x03ce, + 0x0390, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03a2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03ac, 0x03ad, 0x03ae, 0x03af, + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c3, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x03cf, + 0x03b2, 0x03b8, 0x03d2, 0x03d3, 0x03d4, 0x03c6, 0x03c0, 0x03d7, + 0x03d9, 0x03d9, 0x03db, 0x03db, 0x03dd, 0x03dd, 0x03df, 0x03df, + 0x03e1, 0x03e1, 0x03e3, 0x03e3, 0x03e5, 0x03e5, 0x03e7, 0x03e7, + 0x03e9, 0x03e9, 0x03eb, 0x03eb, 0x03ed, 0x03ed, 0x03ef, 0x03ef, + 0x03ba, 0x03c1, 0x03f2, 0x03f3, 0x03b8, 0x03b5, 0x03f6, 0x03f8, + 0x03f8, 0x03f2, 0x03fb, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff +}}; +static const UnicodeCaseTableVector caseTable04 = {{ + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, + 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, + 0x0469, 0x0469, 0x046b, 0x046b, 0x046d, 0x046d, 0x046f, 0x046f, + 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477, + 0x0479, 0x0479, 0x047b, 0x047b, 0x047d, 0x047d, 0x047f, 0x047f, + 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0488, 0x0489, 0x048b, 0x048b, 0x048d, 0x048d, 0x048f, 0x048f, + 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, + 0x0499, 0x0499, 0x049b, 0x049b, 0x049d, 0x049d, 0x049f, 0x049f, + 0x04a1, 0x04a1, 0x04a3, 0x04a3, 0x04a5, 0x04a5, 0x04a7, 0x04a7, + 0x04a9, 0x04a9, 0x04ab, 0x04ab, 0x04ad, 0x04ad, 0x04af, 0x04af, + 0x04b1, 0x04b1, 0x04b3, 0x04b3, 0x04b5, 0x04b5, 0x04b7, 0x04b7, + 0x04b9, 0x04b9, 0x04bb, 0x04bb, 0x04bd, 0x04bd, 0x04bf, 0x04bf, + 0x04c0, 0x04c2, 0x04c2, 0x04c4, 0x04c4, 0x04c6, 0x04c6, 0x04c8, + 0x04c8, 0x04ca, 0x04ca, 0x04cc, 0x04cc, 0x04ce, 0x04ce, 0x04cf, + 0x04d1, 0x04d1, 0x04d3, 0x04d3, 0x04d5, 0x04d5, 0x04d7, 0x04d7, + 0x04d9, 0x04d9, 0x04db, 0x04db, 0x04dd, 0x04dd, 0x04df, 0x04df, + 0x04e1, 0x04e1, 0x04e3, 0x04e3, 0x04e5, 0x04e5, 0x04e7, 0x04e7, + 0x04e9, 0x04e9, 0x04eb, 0x04eb, 0x04ed, 0x04ed, 0x04ef, 0x04ef, + 0x04f1, 0x04f1, 0x04f3, 0x04f3, 0x04f5, 0x04f5, 0x04f6, 0x04f7, + 0x04f9, 0x04f9, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff +}}; +static const UnicodeCaseTableVector caseTable05 = {{ + 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507, + 0x0509, 0x0509, 0x050b, 0x050b, 0x050d, 0x050d, 0x050f, 0x050f, + 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, + 0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f, + 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, + 0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f, + 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, + 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, + 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, + 0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f, + 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, + 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, + 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, + 0x0588, 0x0589, 0x058a, 0x058b, 0x058c, 0x058d, 0x058e, 0x058f, + 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, + 0x0598, 0x0599, 0x059a, 0x059b, 0x059c, 0x059d, 0x059e, 0x059f, + 0x05a0, 0x05a1, 0x05a2, 0x05a3, 0x05a4, 0x05a5, 0x05a6, 0x05a7, + 0x05a8, 0x05a9, 0x05aa, 0x05ab, 0x05ac, 0x05ad, 0x05ae, 0x05af, + 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, + 0x05b8, 0x05b9, 0x05ba, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, + 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, + 0x05c8, 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf, + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0x05eb, 0x05ec, 0x05ed, 0x05ee, 0x05ef, + 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x05f5, 0x05f6, 0x05f7, + 0x05f8, 0x05f9, 0x05fa, 0x05fb, 0x05fc, 0x05fd, 0x05fe, 0x05ff +}}; +static const UnicodeCaseTableVector caseTable1e = {{ + 0x1e01, 0x1e01, 0x1e03, 0x1e03, 0x1e05, 0x1e05, 0x1e07, 0x1e07, + 0x1e09, 0x1e09, 0x1e0b, 0x1e0b, 0x1e0d, 0x1e0d, 0x1e0f, 0x1e0f, + 0x1e11, 0x1e11, 0x1e13, 0x1e13, 0x1e15, 0x1e15, 0x1e17, 0x1e17, + 0x1e19, 0x1e19, 0x1e1b, 0x1e1b, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1f, + 0x1e21, 0x1e21, 0x1e23, 0x1e23, 0x1e25, 0x1e25, 0x1e27, 0x1e27, + 0x1e29, 0x1e29, 0x1e2b, 0x1e2b, 0x1e2d, 0x1e2d, 0x1e2f, 0x1e2f, + 0x1e31, 0x1e31, 0x1e33, 0x1e33, 0x1e35, 0x1e35, 0x1e37, 0x1e37, + 0x1e39, 0x1e39, 0x1e3b, 0x1e3b, 0x1e3d, 0x1e3d, 0x1e3f, 0x1e3f, + 0x1e41, 0x1e41, 0x1e43, 0x1e43, 0x1e45, 0x1e45, 0x1e47, 0x1e47, + 0x1e49, 0x1e49, 0x1e4b, 0x1e4b, 0x1e4d, 0x1e4d, 0x1e4f, 0x1e4f, + 0x1e51, 0x1e51, 0x1e53, 0x1e53, 0x1e55, 0x1e55, 0x1e57, 0x1e57, + 0x1e59, 0x1e59, 0x1e5b, 0x1e5b, 0x1e5d, 0x1e5d, 0x1e5f, 0x1e5f, + 0x1e61, 0x1e61, 0x1e63, 0x1e63, 0x1e65, 0x1e65, 0x1e67, 0x1e67, + 0x1e69, 0x1e69, 0x1e6b, 0x1e6b, 0x1e6d, 0x1e6d, 0x1e6f, 0x1e6f, + 0x1e71, 0x1e71, 0x1e73, 0x1e73, 0x1e75, 0x1e75, 0x1e77, 0x1e77, + 0x1e79, 0x1e79, 0x1e7b, 0x1e7b, 0x1e7d, 0x1e7d, 0x1e7f, 0x1e7f, + 0x1e81, 0x1e81, 0x1e83, 0x1e83, 0x1e85, 0x1e85, 0x1e87, 0x1e87, + 0x1e89, 0x1e89, 0x1e8b, 0x1e8b, 0x1e8d, 0x1e8d, 0x1e8f, 0x1e8f, + 0x1e91, 0x1e91, 0x1e93, 0x1e93, 0x1e95, 0x1e95, 0x1e96, 0x1e97, + 0x1e98, 0x1e99, 0x1e9a, 0x1e61, 0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f, + 0x1ea1, 0x1ea1, 0x1ea3, 0x1ea3, 0x1ea5, 0x1ea5, 0x1ea7, 0x1ea7, + 0x1ea9, 0x1ea9, 0x1eab, 0x1eab, 0x1ead, 0x1ead, 0x1eaf, 0x1eaf, + 0x1eb1, 0x1eb1, 0x1eb3, 0x1eb3, 0x1eb5, 0x1eb5, 0x1eb7, 0x1eb7, + 0x1eb9, 0x1eb9, 0x1ebb, 0x1ebb, 0x1ebd, 0x1ebd, 0x1ebf, 0x1ebf, + 0x1ec1, 0x1ec1, 0x1ec3, 0x1ec3, 0x1ec5, 0x1ec5, 0x1ec7, 0x1ec7, + 0x1ec9, 0x1ec9, 0x1ecb, 0x1ecb, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecf, + 0x1ed1, 0x1ed1, 0x1ed3, 0x1ed3, 0x1ed5, 0x1ed5, 0x1ed7, 0x1ed7, + 0x1ed9, 0x1ed9, 0x1edb, 0x1edb, 0x1edd, 0x1edd, 0x1edf, 0x1edf, + 0x1ee1, 0x1ee1, 0x1ee3, 0x1ee3, 0x1ee5, 0x1ee5, 0x1ee7, 0x1ee7, + 0x1ee9, 0x1ee9, 0x1eeb, 0x1eeb, 0x1eed, 0x1eed, 0x1eef, 0x1eef, + 0x1ef1, 0x1ef1, 0x1ef3, 0x1ef3, 0x1ef5, 0x1ef5, 0x1ef7, 0x1ef7, + 0x1ef9, 0x1ef9, 0x1efa, 0x1efb, 0x1efc, 0x1efd, 0x1efe, 0x1eff +}}; +static const UnicodeCaseTableVector caseTable1f = {{ + 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, + 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, + 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f16, 0x1f17, + 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f1e, 0x1f1f, + 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, + 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, + 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, + 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, + 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f46, 0x1f47, + 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f4e, 0x1f4f, + 0x1f50, 0x1f51, 0x1f52, 0x1f53, 0x1f54, 0x1f55, 0x1f56, 0x1f57, + 0x1f58, 0x1f51, 0x1f5a, 0x1f53, 0x1f5c, 0x1f55, 0x1f5e, 0x1f57, + 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, + 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, + 0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1f76, 0x1f77, + 0x1f78, 0x1f79, 0x1f7a, 0x1f7b, 0x1f7c, 0x1f7d, 0x1f7e, 0x1f7f, + 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, + 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, + 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, + 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, + 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, + 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, + 0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7, + 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0x1fbd, 0x03b9, 0x1fbf, + 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, 0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7, + 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0x1fcd, 0x1fce, 0x1fcf, + 0x1fd0, 0x1fd1, 0x1fd2, 0x1fd3, 0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7, + 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fdc, 0x1fdd, 0x1fde, 0x1fdf, + 0x1fe0, 0x1fe1, 0x1fe2, 0x1fe3, 0x1fe4, 0x1fe5, 0x1fe6, 0x1fe7, + 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1fed, 0x1fee, 0x1fef, + 0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7, + 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0x1ffd, 0x1ffe, 0x1fff +}}; +static const UnicodeCaseTableVector caseTable21 = {{ + 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, + 0x2108, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x210e, 0x210f, + 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, + 0x2118, 0x2119, 0x211a, 0x211b, 0x211c, 0x211d, 0x211e, 0x211f, + 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x03c9, 0x2127, + 0x2128, 0x2129, 0x006b, 0x00e5, 0x212c, 0x212d, 0x212e, 0x212f, + 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, + 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, 0x213f, + 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, + 0x2148, 0x2149, 0x214a, 0x214b, 0x214c, 0x214d, 0x214e, 0x214f, + 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x215f, + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, + 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, + 0x2188, 0x2189, 0x218a, 0x218b, 0x218c, 0x218d, 0x218e, 0x218f, + 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, + 0x2198, 0x2199, 0x219a, 0x219b, 0x219c, 0x219d, 0x219e, 0x219f, + 0x21a0, 0x21a1, 0x21a2, 0x21a3, 0x21a4, 0x21a5, 0x21a6, 0x21a7, + 0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ad, 0x21ae, 0x21af, + 0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b4, 0x21b5, 0x21b6, 0x21b7, + 0x21b8, 0x21b9, 0x21ba, 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21bf, + 0x21c0, 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c6, 0x21c7, + 0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cc, 0x21cd, 0x21ce, 0x21cf, + 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x21d5, 0x21d6, 0x21d7, + 0x21d8, 0x21d9, 0x21da, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df, + 0x21e0, 0x21e1, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e6, 0x21e7, + 0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21ec, 0x21ed, 0x21ee, 0x21ef, + 0x21f0, 0x21f1, 0x21f2, 0x21f3, 0x21f4, 0x21f5, 0x21f6, 0x21f7, + 0x21f8, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fd, 0x21fe, 0x21ff +}}; +static const UnicodeCaseTableVector caseTable24 = {{ + 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, + 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, + 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, + 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, + 0x2420, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, + 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, + 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, + 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, + 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, + 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, + 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, + 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, + 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, + 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, + 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, + 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, + 0x2498, 0x2499, 0x249a, 0x249b, 0x249c, 0x249d, 0x249e, 0x249f, + 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, + 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, + 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x24d0, 0x24d1, + 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, + 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, + 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, + 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, + 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, + 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, + 0x24e8, 0x24e9, 0x24ea, 0x24eb, 0x24ec, 0x24ed, 0x24ee, 0x24ef, + 0x24f0, 0x24f1, 0x24f2, 0x24f3, 0x24f4, 0x24f5, 0x24f6, 0x24f7, + 0x24f8, 0x24f9, 0x24fa, 0x24fb, 0x24fc, 0x24fd, 0x24fe, 0x24ff +}}; +static const UnicodeCaseTableVector caseTableff = {{ + 0xff00, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, + 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, + 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, + 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, + 0xff20, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, + 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, + 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, + 0xff58, 0xff59, 0xff5a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, + 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, + 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, + 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, + 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f, + 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, + 0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, + 0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, + 0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, + 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, + 0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, + 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, + 0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, + 0xffa0, 0xffa1, 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, + 0xffa8, 0xffa9, 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, + 0xffb0, 0xffb1, 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, + 0xffb8, 0xffb9, 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf, + 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, + 0xffc8, 0xffc9, 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, + 0xffd0, 0xffd1, 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, + 0xffd8, 0xffd9, 0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf, + 0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7, + 0xffe8, 0xffe9, 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef, + 0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7, + 0xfff8, 0xfff9, 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff +}}; +static const UnicodeCaseTableVector *caseTable[256] = { + &caseTable00, + &caseTable01, + &caseTable02, + &caseTable03, + &caseTable04, + &caseTable05, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &caseTable1e, + &caseTable1f, + NULL, + &caseTable21, + NULL, + NULL, + &caseTable24, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &caseTableff +}; + +static inline char getType(Unicode c) { + int i; + char type; + + if (c > 0xffff) { + type = 'X'; + } else { + i = (c >> 8) & 0xff; + if ((type = typeTable[i].type) == 'X') { + type = typeTable[i].vector[c & 0xff]; + } + } + return type; +} + +GBool unicodeTypeL(Unicode c) { + return getType(c) == 'L'; +} + +GBool unicodeTypeR(Unicode c) { + return getType(c) == 'R'; +} + +GBool unicodeTypeNum(Unicode c) { + return getType(c) == '#'; +} + +GBool unicodeTypeAlphaNum(Unicode c) { + char t; + + t = getType(c); + return t == 'L' || t == 'R' || t == '#'; +} + +#define UNICODE_ALPHABETIC_PRESENTATION_BLOCK_BEGIN 0xFB00 +#define UNICODE_ALPHABETIC_PRESENTATION_BLOCK_END 0xFB4F + +GBool unicodeIsAlphabeticPresentationForm(Unicode c) { + return c >= UNICODE_ALPHABETIC_PRESENTATION_BLOCK_BEGIN + && c <= UNICODE_ALPHABETIC_PRESENTATION_BLOCK_END; +} + +Unicode unicodeToUpper(Unicode c) { + int i; + + if (c > 0xffff) { + return c; + } + i = (c >> 8) & 0xff; + if (caseTable[i]) { + return caseTable[i]->codes[c & 0xff]; + } + return c; +} + +#define UNICODE_LAST_CHAR 0x10FFFF +#define UNICODE_MAX_TABLE_INDEX (UNICODE_LAST_CHAR / 256 + 1) +// large empty block between U+2FA1D and U+E0001 +#define UNICODE_LAST_CHAR_PART1 0x2FAFF +#define UNICODE_LAST_PAGE_PART1 (UNICODE_LAST_CHAR_PART1 / 256) +#define UNICODE_PART2_START 0xE0000 + +#include "UnicodeCClassTables.h" +#include "UnicodeCompTables.h" +#include "UnicodeDecompTables.h" + +#define CC_PART1(Page, Char) \ + ((combining_class_table_part1[Page] >= UNICODE_MAX_TABLE_INDEX) \ + ? (combining_class_table_part1[Page] - UNICODE_MAX_TABLE_INDEX) \ + : (cclass_data[combining_class_table_part1[Page]][Char])) + +#define CC_PART2(Page, Char) \ + ((combining_class_table_part2[Page] >= UNICODE_MAX_TABLE_INDEX) \ + ? (combining_class_table_part2[Page] - UNICODE_MAX_TABLE_INDEX) \ + : (cclass_data[combining_class_table_part2[Page]][Char])) + +#define COMBINING_CLASS(u) (((u) <= UNICODE_LAST_CHAR_PART1) \ + ? CC_PART1((u) / 256, (u) % 256) \ + : (((u) >= UNICODE_PART2_START && (u) <= UNICODE_LAST_CHAR) \ + ? CC_PART2(((u) - UNICODE_PART2_START) / 256, (u) % 256) \ + : 0)) + +// Write the compatibility decomposition of @u into @buf, returning the number +// of characters written. @buf may be NULL, in which case the length of the +// decomposition is returned but nothing is written. If @u is its own +// decomposition, write @u into @buf and return 1. +static int decomp_compat(Unicode u, Unicode *buf) { + // decomposition tables stored as lists {character, decomp_length, offset} + // so we do a binary search + int start = 0, end = DECOMP_TABLE_LENGTH; + if (u >= decomp_table[start].character + && u <= decomp_table[end - 1].character) + while (gTrue) { + int midpoint = (start + end) / 2; + if (u == decomp_table[midpoint].character) { + int offset = decomp_table[midpoint].offset; + if (offset == -1) + break; + else { + int length = decomp_table[midpoint].length, i; + if (buf) + for (i = 0; i < length; ++i) + buf[i] = decomp_expansion[offset + i]; + return length; + } + } else if (midpoint == start) + break; + else if (u > decomp_table[midpoint].character) + start = midpoint; + else + end = midpoint; + } + if (buf) + *buf = u; + return 1; +} + +#define CI(Page, Char) \ + ((compose_table[Page] >= UNICODE_MAX_TABLE_INDEX) \ + ? (compose_table[Page] - UNICODE_MAX_TABLE_INDEX) \ + : (compose_data[compose_table[Page]][Char])) + +#define COMPOSE_INDEX(u) \ + ((((u) / 256) > (COMPOSE_TABLE_LAST)) ? 0 : CI((u) / 256, (u) % 256)) + +// If @add combines with @base, write the combination to @out and return +// gTrue. Otherwise return gFalse. +static GBool combine(Unicode base, Unicode add, Unicode *out) { + unsigned short idx_base, idx_add; + + idx_base = COMPOSE_INDEX(base); + if (idx_base >= COMPOSE_FIRST_SINGLE_START + && idx_base < COMPOSE_SECOND_START) { + if (compose_first_single[idx_base - COMPOSE_FIRST_SINGLE_START][0] + == add) { + *out = compose_first_single[idx_base - COMPOSE_FIRST_SINGLE_START][1]; + return gTrue; + } else + return gFalse; + } + + idx_add = COMPOSE_INDEX(add); + if (idx_add >= COMPOSE_SECOND_SINGLE_START) { + if (compose_second_single[idx_add - COMPOSE_SECOND_SINGLE_START][0] + == base) { + *out = compose_second_single[idx_add - COMPOSE_SECOND_SINGLE_START][1]; + return gTrue; + } else + return gFalse; + } + + if (idx_base >= COMPOSE_FIRST_START && idx_base < COMPOSE_FIRST_SINGLE_START + && idx_add >= COMPOSE_SECOND_START + && idx_add < COMPOSE_SECOND_SINGLE_START) { + Unicode o = compose_array[idx_base - COMPOSE_FIRST_START] + [idx_add - COMPOSE_SECOND_START]; + if (o) { + *out = o; + return gTrue; + } + } + + return gFalse; +} + +#define HANGUL_S_BASE 0xAC00 +#define HANGUL_L_BASE 0x1100 +#define HANGUL_V_BASE 0x1161 +#define HANGUL_T_BASE 0x11A7 +#define HANGUL_L_COUNT 19 +#define HANGUL_V_COUNT 21 +#define HANGUL_T_COUNT 28 +#define HANGUL_S_COUNT (HANGUL_L_COUNT * HANGUL_V_COUNT * HANGUL_T_COUNT) +#define HANGUL_N_COUNT (HANGUL_V_COUNT * HANGUL_T_COUNT) +#define HANGUL_IS_L(u) (((u) >= HANGUL_L_BASE) \ + && ((u) < HANGUL_L_BASE + HANGUL_L_COUNT)) +#define HANGUL_IS_V(u) (((u) >= HANGUL_V_BASE) \ + && ((u) < HANGUL_V_BASE + HANGUL_V_COUNT)) +#define HANGUL_IS_T(u) (((u) >= HANGUL_T_BASE) \ + && ((u) < HANGUL_T_BASE + HANGUL_T_COUNT)) +#define HANGUL_IS_SYLLABLE(u) (((u) >= HANGUL_S_BASE) \ + && ((u) < HANGUL_S_BASE + HANGUL_S_COUNT)) +#define HANGUL_SYLLABLE_IS_LV(u) (((u) - HANGUL_S_BASE) % HANGUL_T_COUNT == 0) +#define IS_HANGUL(u) (HANGUL_IS_L(u) || HANGUL_IS_V(u) || HANGUL_IS_T(u) \ + || HANGUL_IS_SYLLABLE(u)) +#define HANGUL_COMPOSE_L_V(l, v) (HANGUL_S_BASE + (HANGUL_T_COUNT * \ + (((v) - HANGUL_V_BASE) + (HANGUL_V_COUNT * ((l) - HANGUL_L_BASE))))) +#define HANGUL_COMPOSE_LV_T(lv, t) ((lv) + ((t) - HANGUL_T_BASE)) + +// Converts Unicode string @in of length @len to its normalization in form +// NFKC (compatibility decomposition + canonical composition). The length of +// the resulting Unicode string is returned in @out_len. If non-NULL, @indices +// is assigned the location of a newly-allocated array of length @out_len + 1, +// for each character in the normalized string giving the index in @in of the +// corresponding unnormalized character. @indices is not guaranteed monotone or +// onto. +Unicode *unicodeNormalizeNFKC(Unicode *in, int len, + int *out_len, int **indices) { + Unicode *out; + int i, o, *classes, *idx = NULL; + + for (i = 0, o = 0; i < len; ++i) { + if (HANGUL_IS_L(in[i]) || HANGUL_IS_SYLLABLE(in[i])) { + o += 1; + } else + o += decomp_compat(in[i], NULL); + } + + out = (Unicode *) gmallocn(o, sizeof(Unicode)); + classes = (int *) gmallocn(o, sizeof(int)); + if (indices) + idx = (int *) gmallocn(o + 1, sizeof(int)); + + for (i = 0, o = 0; i < len; ) { + Unicode u = in[i]; + if (IS_HANGUL(u)) { + if (HANGUL_IS_L(u)) { + Unicode l = u; + if (i+1 < len && HANGUL_IS_V(in[i+1])) { + Unicode lv = HANGUL_COMPOSE_L_V(l, in[++i]); + if (i+1 < len && HANGUL_IS_T(in[i+1])) + out[o] = HANGUL_COMPOSE_LV_T(lv, in[++i]); + else + out[o] = lv; + } else + out[o] = l; + } else if (HANGUL_SYLLABLE_IS_LV(u)) { + Unicode lv = u; + if (i+1 < len && HANGUL_IS_T(in[i+1])) + out[o] = HANGUL_COMPOSE_LV_T(lv, in[++i]); + else + out[o] = lv; + } else + out[o] = u; + if (indices) + idx[o] = i; + ++i; ++o; + } else { + int j, p, q, r, s, dlen; + // write compatibility decompositions into out (we have enough space) + // chomp in until a starter is reached + for (j = i, p = o; j < len; ++j) { + u = in[j]; + if (j != i && COMBINING_CLASS(u) == 0) + break; + dlen = decomp_compat(u, out + p); + for (q = p; q < p + dlen; ++q) { + classes[q] = COMBINING_CLASS(out[q]); + if (indices) + idx[q] = j; + } + p += dlen; + } + // put out[o, p) in canonical ordering + for (q = o + 1; q < p; ++q) + for (r = q; r > o + 1; --r) { // FIXME worth using a better sort? + int swap; + if (classes[r] >= classes[r-1]) + break; + u = out[r]; out[r] = out[r - 1]; out[r - 1] = u; + swap = classes[r]; classes[r] = classes[r - 1]; classes[r - 1] = swap; + if (indices) { + swap = idx[r]; + idx[r] = idx[r - 1]; + idx[r - 1] = swap; + } + } + // canonical compose out[o, p) + for (q = o + 1; q < p; ++q) + if (!combine(out[o], out[q], &out[o])) + break; + // move out[q, p) back to [o+1, ?) + if (q != o + 1) + for (r = q, s = o + 1; r < p; ++r, ++s) { + out[s] = out[r]; + if (indices) + idx[s] = idx[r]; + } + else + s = p; + i = j; o = s; + } + } + + *out_len = o; + gfree(classes); + if (indices) { + idx[o] = len; + *indices = idx; + } + return out; +} diff --git a/poppler/UnicodeTypeTable.h b/poppler/UnicodeTypeTable.h new file mode 100644 index 0000000..869aad9 --- /dev/null +++ b/poppler/UnicodeTypeTable.h @@ -0,0 +1,44 @@ +//======================================================================== +// +// UnicodeTypeTable.h +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Ed Catmur +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef UNICODETYPETABLE_H +#define UNICODETYPETABLE_H + +#include "goo/gtypes.h" + +extern GBool unicodeTypeL(Unicode c); + +extern GBool unicodeTypeR(Unicode c); + +extern GBool unicodeTypeNum(Unicode c); + +extern GBool unicodeTypeAlphaNum(Unicode c); + +extern GBool unicodeIsAlphabeticPresentationForm(Unicode c); + +extern Unicode unicodeToUpper(Unicode c); + +extern Unicode *unicodeNormalizeNFKC(Unicode *in, int len, + int *out_len, int **offsets); + +#endif diff --git a/poppler/ViewerPreferences.cc b/poppler/ViewerPreferences.cc new file mode 100644 index 0000000..cba8d0a --- /dev/null +++ b/poppler/ViewerPreferences.cc @@ -0,0 +1,117 @@ +//======================================================================== +// +// ViewerPreferences.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2011 Pino Toscano +// +//======================================================================== + +#include + +#include "ViewerPreferences.h" + +#include "Object.h" +#include "Dict.h" + +ViewerPreferences::ViewerPreferences(Dict *prefDict) +{ + init(); + + Object obj; + + if (prefDict->lookup("HideToolbar", &obj)->isBool()) { + hideToolbar = obj.getBool(); + } + obj.free(); + + if (prefDict->lookup("HideMenubar", &obj)->isBool()) { + hideMenubar = obj.getBool(); + } + obj.free(); + + if (prefDict->lookup("HideWindowUI", &obj)->isBool()) { + hideWindowUI = obj.getBool(); + } + obj.free(); + + if (prefDict->lookup("FitWindow", &obj)->isBool()) { + fitWindow = obj.getBool(); + } + obj.free(); + + if (prefDict->lookup("CenterWindow", &obj)->isBool()) { + centerWindow = obj.getBool(); + } + obj.free(); + + if (prefDict->lookup("DisplayDocTitle", &obj)->isBool()) { + displayDocTitle = obj.getBool(); + } + obj.free(); + + if (prefDict->lookup("NonFullScreenPageMode", &obj)->isName()) { + const char *mode = obj.getName(); + if (!strcmp(mode, "UseNone")) { + nonFullScreenPageMode = nfpmUseNone; + } else if (!strcmp(mode, "UseOutlines")) { + nonFullScreenPageMode = nfpmUseOutlines; + } else if (!strcmp(mode, "UseThumbs")) { + nonFullScreenPageMode = nfpmUseThumbs; + } else if (!strcmp(mode, "UseOC")) { + nonFullScreenPageMode = nfpmUseOC; + } + } + obj.free(); + + if (prefDict->lookup("Direction", &obj)->isName()) { + const char *dir = obj.getName(); + if (!strcmp(dir, "L2R")) { + direction = directionL2R; + } else if (!strcmp(dir, "R2L")) { + direction = directionR2L; + } + } + obj.free(); + + if (prefDict->lookup("PrintScaling", &obj)->isName()) { + const char *ps = obj.getName(); + if (!strcmp(ps, "None")) { + printScaling = printScalingNone; + } else if (!strcmp(ps, "AppDefault")) { + printScaling = printScalingAppDefault; + } + } + obj.free(); + + if (prefDict->lookup("Duplex", &obj)->isName()) { + const char *d = obj.getName(); + if (!strcmp(d, "Simplex")) { + duplex = duplexSimplex; + } else if (!strcmp(d, "DuplexFlipShortEdge")) { + duplex = duplexDuplexFlipShortEdge; + } else if (!strcmp(d, "DuplexFlipLongEdge")) { + duplex = duplexDuplexFlipLongEdge; + } + } + obj.free(); +} + +ViewerPreferences::~ViewerPreferences() +{ +} + +void ViewerPreferences::init() +{ + hideToolbar = gFalse; + hideMenubar = gFalse; + hideWindowUI = gFalse; + fitWindow = gFalse; + centerWindow = gFalse; + displayDocTitle = gFalse; + nonFullScreenPageMode = nfpmUseNone; + direction = directionL2R; + printScaling = printScalingAppDefault; + duplex = duplexNone; +} diff --git a/poppler/ViewerPreferences.h b/poppler/ViewerPreferences.h new file mode 100644 index 0000000..8cdc4d4 --- /dev/null +++ b/poppler/ViewerPreferences.h @@ -0,0 +1,76 @@ +//======================================================================== +// +// ViewerPreferences.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2011 Pino Toscano +// +//======================================================================== + +#ifndef VIEWERPREFERENCES_H +#define VIEWERPREFERENCES_H + +#include "goo/gtypes.h" + +class Dict; + +//------------------------------------------------------------------------ +// ViewerPreferences +//------------------------------------------------------------------------ + +class ViewerPreferences { +public: + + enum NonFullScreenPageMode { + nfpmUseNone, + nfpmUseOutlines, + nfpmUseThumbs, + nfpmUseOC + }; + enum Direction { + directionL2R, + directionR2L + }; + enum PrintScaling { + printScalingNone, + printScalingAppDefault + }; + enum Duplex { + duplexNone, + duplexSimplex, + duplexDuplexFlipShortEdge, + duplexDuplexFlipLongEdge + }; + + ViewerPreferences(Dict *prefDict); + ~ViewerPreferences(); + + GBool getHideToolbar() const { return hideToolbar; } + GBool getHideMenubar() const { return hideMenubar; } + GBool getHideWindowUI() const { return hideWindowUI; } + GBool getFitWindow() const { return fitWindow; } + GBool getCenterWindow() const { return centerWindow; } + GBool getDisplayDocTitle() const { return displayDocTitle; } + NonFullScreenPageMode getNonFullScreenPageMode() const { return nonFullScreenPageMode; } + Direction getDirection() const { return direction; } + PrintScaling getPrintScaling() const { return printScaling; } + Duplex getDuplex() const { return duplex; } + +private: + + void init(); + + GBool hideToolbar; + GBool hideMenubar; + GBool hideWindowUI; + GBool fitWindow; + GBool centerWindow; + GBool displayDocTitle; + NonFullScreenPageMode nonFullScreenPageMode; + Direction direction; + PrintScaling printScaling; + Duplex duplex; +}; + +#endif diff --git a/poppler/XRef.cc b/poppler/XRef.cc new file mode 100644 index 0000000..4d01320 --- /dev/null +++ b/poppler/XRef.cc @@ -0,0 +1,1458 @@ +//======================================================================== +// +// XRef.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Dan Sheridan +// Copyright (C) 2005 Brad Hards +// Copyright (C) 2006, 2008, 2010, 2012 Albert Astals Cid +// Copyright (C) 2007-2008 Julien Rebetez +// Copyright (C) 2007 Carlos Garcia Campos +// Copyright (C) 2009, 2010 Ilya Gorenbein +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2012 Thomas Freitag +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "goo/gmem.h" +#include "Object.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "Dict.h" +#include "Error.h" +#include "ErrorCodes.h" +#include "XRef.h" +#include "PopplerCache.h" + +//------------------------------------------------------------------------ +// Permission bits +// Note that the PDF spec uses 1 base (eg bit 3 is 1<<2) +//------------------------------------------------------------------------ + +#define permPrint (1<<2) // bit 3 +#define permChange (1<<3) // bit 4 +#define permCopy (1<<4) // bit 5 +#define permNotes (1<<5) // bit 6 +#define permFillForm (1<<8) // bit 9 +#define permAccessibility (1<<9) // bit 10 +#define permAssemble (1<<10) // bit 11 +#define permHighResPrint (1<<11) // bit 12 +#define defPermFlags 0xfffc + +//------------------------------------------------------------------------ +// ObjectStream +//------------------------------------------------------------------------ + +class ObjectStream { +public: + + // Create an object stream, using object number , + // generation 0. + ObjectStream(XRef *xref, int objStrNumA); + + GBool isOk() { return ok; } + + ~ObjectStream(); + + // Return the object number of this object stream. + int getObjStrNum() { return objStrNum; } + + // Get the th object from this stream, which should be + // object number , generation 0. + Object *getObject(int objIdx, int objNum, Object *obj); + +private: + + int objStrNum; // object number of the object stream + int nObjects; // number of objects in the stream + Object *objs; // the objects (length = nObjects) + int *objNums; // the object numbers (length = nObjects) + GBool ok; +}; + +class ObjectStreamKey : public PopplerCacheKey +{ + public: + ObjectStreamKey(int num) : objStrNum(num) + { + } + + bool operator==(const PopplerCacheKey &key) const + { + const ObjectStreamKey *k = static_cast(&key); + return objStrNum == k->objStrNum; + } + + const int objStrNum; +}; + +class ObjectStreamItem : public PopplerCacheItem +{ + public: + ObjectStreamItem(ObjectStream *objStr) : objStream(objStr) + { + } + + ~ObjectStreamItem() + { + delete objStream; + } + + ObjectStream *objStream; +}; + +ObjectStream::ObjectStream(XRef *xref, int objStrNumA) { + Stream *str; + Parser *parser; + int *offsets; + Object objStr, obj1, obj2; + int first, i; + + objStrNum = objStrNumA; + nObjects = 0; + objs = NULL; + objNums = NULL; + ok = gFalse; + + if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) { + goto err1; + } + + if (!objStr.streamGetDict()->lookup("N", &obj1)->isInt()) { + obj1.free(); + goto err1; + } + nObjects = obj1.getInt(); + obj1.free(); + if (nObjects <= 0) { + goto err1; + } + + if (!objStr.streamGetDict()->lookup("First", &obj1)->isInt()) { + obj1.free(); + goto err1; + } + first = obj1.getInt(); + obj1.free(); + if (first < 0) { + goto err1; + } + + // this is an arbitrary limit to avoid integer overflow problems + // in the 'new Object[nObjects]' call (Acrobat apparently limits + // object streams to 100-200 objects) + if (nObjects > 1000000) { + error(errSyntaxError, -1, "Too many objects in an object stream"); + goto err1; + } + objs = new Object[nObjects]; + objNums = (int *)gmallocn(nObjects, sizeof(int)); + offsets = (int *)gmallocn(nObjects, sizeof(int)); + + // parse the header: object numbers and offsets + objStr.streamReset(); + obj1.initNull(); + str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first); + parser = new Parser(xref, new Lexer(xref, str), gFalse); + for (i = 0; i < nObjects; ++i) { + parser->getObj(&obj1); + parser->getObj(&obj2); + if (!obj1.isInt() || !obj2.isInt()) { + obj1.free(); + obj2.free(); + delete parser; + gfree(offsets); + goto err1; + } + objNums[i] = obj1.getInt(); + offsets[i] = obj2.getInt(); + obj1.free(); + obj2.free(); + if (objNums[i] < 0 || offsets[i] < 0 || + (i > 0 && offsets[i] < offsets[i-1])) { + delete parser; + gfree(offsets); + goto err1; + } + } + while (str->getChar() != EOF) ; + delete parser; + + // skip to the first object - this shouldn't be necessary because + // the First key is supposed to be equal to offsets[0], but just in + // case... + for (i = first; i < offsets[0]; ++i) { + objStr.getStream()->getChar(); + } + + // parse the objects + for (i = 0; i < nObjects; ++i) { + obj1.initNull(); + if (i == nObjects - 1) { + str = new EmbedStream(objStr.getStream(), &obj1, gFalse, 0); + } else { + str = new EmbedStream(objStr.getStream(), &obj1, gTrue, + offsets[i+1] - offsets[i]); + } + parser = new Parser(xref, new Lexer(xref, str), gFalse); + parser->getObj(&objs[i]); + while (str->getChar() != EOF) ; + delete parser; + } + + gfree(offsets); + ok = gTrue; + + err1: + objStr.free(); +} + +ObjectStream::~ObjectStream() { + int i; + + if (objs) { + for (i = 0; i < nObjects; ++i) { + objs[i].free(); + } + delete[] objs; + } + gfree(objNums); +} + +Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) { + if (objIdx < 0 || objIdx >= nObjects || objNum != objNums[objIdx]) { + return obj->initNull(); + } + return objs[objIdx].copy(obj); +} + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +void XRef::init() { + ok = gTrue; + errCode = errNone; + entries = NULL; + capacity = 0; + size = 0; + streamEnds = NULL; + streamEndsLen = 0; + objStrs = new PopplerCache(5); + mainXRefEntriesOffset = 0; + xRefStream = gFalse; +} + +XRef::XRef() { + init(); +} + +XRef::XRef(Object *trailerDictA) { + init(); + if (trailerDictA->isDict()) + trailerDict.initDict(trailerDictA->getDict()); +} + +XRef::XRef(BaseStream *strA, Guint pos, Guint mainXRefEntriesOffsetA, GBool *wasReconstructed, GBool reconstruct) { + Object obj; + + init(); + mainXRefEntriesOffset = mainXRefEntriesOffsetA; + + encrypted = gFalse; + permFlags = defPermFlags; + ownerPasswordOk = gFalse; + + // read the trailer + str = strA; + start = str->getStart(); + prevXRefOffset = pos; + + if (reconstruct && !(ok = constructXRef(wasReconstructed))) + { + errCode = errDamaged; + return; + } + else + { + // if there was a problem with the 'startxref' position, try to + // reconstruct the xref table + if (prevXRefOffset == 0) { + if (!(ok = constructXRef(wasReconstructed))) { + errCode = errDamaged; + return; + } + + // read the xref table + } else { + std::vector followedXRefStm; + readXRef(&prevXRefOffset, &followedXRefStm); + + // if there was a problem with the xref table, + // try to reconstruct it + if (!ok) { + if (!(ok = constructXRef(wasReconstructed))) { + errCode = errDamaged; + return; + } + } + } + + // set size to (at least) the size specified in trailer dict + trailerDict.dictLookupNF("Size", &obj); + if (!obj.isInt()) { + error(errSyntaxWarning, -1, "No valid XRef size in trailer"); + } else { + if (obj.getInt() > size) { + if (resize(obj.getInt()) != obj.getInt()) { + if (!(ok = constructXRef(wasReconstructed))) { + obj.free(); + errCode = errDamaged; + return; + } + } + } + } + obj.free(); + + // get the root dictionary (catalog) object + trailerDict.dictLookupNF("Root", &obj); + if (obj.isRef()) { + rootNum = obj.getRefNum(); + rootGen = obj.getRefGen(); + obj.free(); + } else { + obj.free(); + if (!(ok = constructXRef(wasReconstructed))) { + errCode = errDamaged; + return; + } + } + } + // now set the trailer dictionary's xref pointer so we can fetch + // indirect objects from it + trailerDict.getDict()->setXRef(this); +} + +XRef::~XRef() { + for(int i=0; i capacity) { + + int realNewSize; + for (realNewSize = capacity ? 2 * capacity : 1024; + newSize > realNewSize && realNewSize > 0; + realNewSize <<= 1) ; + if ((realNewSize < 0) || + (realNewSize >= INT_MAX / (int)sizeof(XRefEntry))) { + return 0; + } + + void *p = greallocn_checkoverflow(entries, realNewSize, sizeof(XRefEntry)); + if (p == NULL) { + return 0; + } + + entries = (XRefEntry *) p; + capacity = realNewSize; + + } + + return capacity; +} + +int XRef::resize(int newSize) +{ + if (newSize > size) { + + if (reserve(newSize) < newSize) return size; + + for (int i = size; i < newSize; ++i) { + entries[i].offset = 0xffffffff; + entries[i].type = xrefEntryNone; + entries[i].obj.initNull (); + entries[i].updated = false; + entries[i].gen = 0; + } + } else { + for (int i = newSize; i < size; i++) { + entries[i].obj.free (); + } + } + + size = newSize; + + return size; +} + +// Read one xref table section. Also reads the associated trailer +// dictionary, and returns the prev pointer (if any). +GBool XRef::readXRef(Guint *pos, std::vector *followedXRefStm) { + Parser *parser; + Object obj; + GBool more; + + // start up a parser, parse one token + obj.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, + str->makeSubStream(start + *pos, gFalse, 0, &obj)), + gTrue); + parser->getObj(&obj, gTrue); + + // parse an old-style xref table + if (obj.isCmd("xref")) { + obj.free(); + more = readXRefTable(parser, pos, followedXRefStm); + + // parse an xref stream + } else if (obj.isInt()) { + obj.free(); + if (!parser->getObj(&obj, gTrue)->isInt()) { + goto err1; + } + obj.free(); + if (!parser->getObj(&obj, gTrue)->isCmd("obj")) { + goto err1; + } + obj.free(); + if (!parser->getObj(&obj)->isStream()) { + goto err1; + } + if (trailerDict.isNone()) { + xRefStream = gTrue; + } + more = readXRefStream(obj.getStream(), pos); + obj.free(); + + } else { + goto err1; + } + + delete parser; + return more; + + err1: + obj.free(); + delete parser; + ok = gFalse; + return gFalse; +} + +GBool XRef::readXRefTable(Parser *parser, Guint *pos, std::vector *followedXRefStm) { + XRefEntry entry; + GBool more; + Object obj, obj2; + Guint pos2; + int first, n, i; + + while (1) { + parser->getObj(&obj, gTrue); + if (obj.isCmd("trailer")) { + obj.free(); + break; + } + if (!obj.isInt()) { + goto err1; + } + first = obj.getInt(); + obj.free(); + if (!parser->getObj(&obj, gTrue)->isInt()) { + goto err1; + } + n = obj.getInt(); + obj.free(); + if (first < 0 || n < 0 || first + n < 0) { + goto err0; + } + if (first + n > size) { + if (resize(first + n) != first + n) { + error(errSyntaxError, -1, "Invalid 'obj' parameters'"); + goto err0; + } + } + for (i = first; i < first + n; ++i) { + if (!parser->getObj(&obj, gTrue)->isInt()) { + goto err1; + } + entry.offset = (Guint)obj.getInt(); + obj.free(); + if (!parser->getObj(&obj, gTrue)->isInt()) { + goto err1; + } + entry.gen = obj.getInt(); + entry.obj.initNull (); + entry.updated = false; + obj.free(); + parser->getObj(&obj, gTrue); + if (obj.isCmd("n")) { + entry.type = xrefEntryUncompressed; + } else if (obj.isCmd("f")) { + entry.type = xrefEntryFree; + } else { + goto err1; + } + obj.free(); + if (entries[i].offset == 0xffffffff) { + entries[i] = entry; + // PDF files of patents from the IBM Intellectual Property + // Network have a bug: the xref table claims to start at 1 + // instead of 0. + if (i == 1 && first == 1 && + entries[1].offset == 0 && entries[1].gen == 65535 && + entries[1].type == xrefEntryFree) { + i = first = 0; + entries[0] = entries[1]; + entries[1].offset = 0xffffffff; + } + } + } + } + + // read the trailer dictionary + if (!parser->getObj(&obj)->isDict()) { + goto err1; + } + + // get the 'Prev' pointer + obj.getDict()->lookupNF("Prev", &obj2); + if (obj2.isInt()) { + pos2 = (Guint)obj2.getInt(); + if (pos2 != *pos) { + *pos = pos2; + more = gTrue; + } else { + error(errSyntaxWarning, -1, "Infinite loop in xref table"); + more = gFalse; + } + } else if (obj2.isRef()) { + // certain buggy PDF generators generate "/Prev NNN 0 R" instead + // of "/Prev NNN" + pos2 = (Guint)obj2.getRefNum(); + if (pos2 != *pos) { + *pos = pos2; + more = gTrue; + } else { + error(errSyntaxWarning, -1, "Infinite loop in xref table"); + more = gFalse; + } + } else { + more = gFalse; + } + obj2.free(); + + // save the first trailer dictionary + if (trailerDict.isNone()) { + obj.copy(&trailerDict); + } + + // check for an 'XRefStm' key + if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) { + pos2 = (Guint)obj2.getInt(); + for (size_t i = 0; ok == gTrue && i < followedXRefStm->size(); ++i) { + if (followedXRefStm->at(i) == pos2) { + ok = gFalse; + } + } + if (ok) { + followedXRefStm->push_back(pos2); + readXRef(&pos2, followedXRefStm); + } + if (!ok) { + obj2.free(); + goto err1; + } + } + obj2.free(); + + obj.free(); + return more; + + err1: + obj.free(); + err0: + ok = gFalse; + return gFalse; +} + +GBool XRef::readXRefStream(Stream *xrefStr, Guint *pos) { + Dict *dict; + int w[3]; + GBool more; + Object obj, obj2, idx; + int newSize, first, n, i; + + dict = xrefStr->getDict(); + + if (!dict->lookupNF("Size", &obj)->isInt()) { + goto err1; + } + newSize = obj.getInt(); + obj.free(); + if (newSize < 0) { + goto err1; + } + if (newSize > size) { + if (resize(newSize) != newSize) { + error(errSyntaxError, -1, "Invalid 'size' parameter"); + goto err0; + } + } + + if (!dict->lookupNF("W", &obj)->isArray() || + obj.arrayGetLength() < 3) { + goto err1; + } + for (i = 0; i < 3; ++i) { + if (!obj.arrayGet(i, &obj2)->isInt()) { + obj2.free(); + goto err1; + } + w[i] = obj2.getInt(); + obj2.free(); + if (w[i] < 0 || w[i] > 4) { + goto err1; + } + } + obj.free(); + + xrefStr->reset(); + dict->lookupNF("Index", &idx); + if (idx.isArray()) { + for (i = 0; i+1 < idx.arrayGetLength(); i += 2) { + if (!idx.arrayGet(i, &obj)->isInt()) { + idx.free(); + goto err1; + } + first = obj.getInt(); + obj.free(); + if (!idx.arrayGet(i+1, &obj)->isInt()) { + idx.free(); + goto err1; + } + n = obj.getInt(); + obj.free(); + if (first < 0 || n < 0 || + !readXRefStreamSection(xrefStr, w, first, n)) { + idx.free(); + goto err0; + } + } + } else { + if (!readXRefStreamSection(xrefStr, w, 0, newSize)) { + idx.free(); + goto err0; + } + } + idx.free(); + + dict->lookupNF("Prev", &obj); + if (obj.isInt()) { + *pos = (Guint)obj.getInt(); + more = gTrue; + } else { + more = gFalse; + } + obj.free(); + if (trailerDict.isNone()) { + trailerDict.initDict(dict); + } + + return more; + + err1: + obj.free(); + err0: + ok = gFalse; + return gFalse; +} + +GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) { + Guint offset; + int type, gen, c, i, j; + + if (first + n < 0) { + return gFalse; + } + if (first + n > size) { + if (resize(first + n) != size) { + error(errSyntaxError, -1, "Invalid 'size' inside xref table"); + return gFalse; + } + if (first + n > size) { + error(errSyntaxError, -1, "Invalid 'first' or 'n' inside xref table"); + return gFalse; + } + } + for (i = first; i < first + n; ++i) { + if (w[0] == 0) { + type = 1; + } else { + for (type = 0, j = 0; j < w[0]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + type = (type << 8) + c; + } + } + for (offset = 0, j = 0; j < w[1]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + offset = (offset << 8) + c; + } + for (gen = 0, j = 0; j < w[2]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + gen = (gen << 8) + c; + } + if (entries[i].offset == 0xffffffff) { + switch (type) { + case 0: + entries[i].offset = offset; + entries[i].gen = gen; + entries[i].type = xrefEntryFree; + break; + case 1: + entries[i].offset = offset; + entries[i].gen = gen; + entries[i].type = xrefEntryUncompressed; + break; + case 2: + entries[i].offset = offset; + entries[i].gen = gen; + entries[i].type = xrefEntryCompressed; + break; + default: + return gFalse; + } + } + } + + return gTrue; +} + +// Attempt to construct an xref table for a damaged file. +GBool XRef::constructXRef(GBool *wasReconstructed, GBool needCatalogDict) { + Parser *parser; + Object newTrailerDict, obj; + char buf[256]; + Guint pos; + int num, gen; + int newSize; + int streamEndsSize; + char *p; + GBool gotRoot; + char* token = NULL; + bool oneCycle = true; + int offset = 0; + + gfree(entries); + capacity = 0; + size = 0; + entries = NULL; + + gotRoot = gFalse; + streamEndsLen = streamEndsSize = 0; + + if (wasReconstructed) + { + *wasReconstructed = true; + } + + str->reset(); + while (1) { + pos = str->getPos(); + if (!str->getLine(buf, 256)) { + break; + } + p = buf; + + // skip whitespace + while (*p && Lexer::isSpace(*p & 0xff)) ++p; + + oneCycle = true; + offset = 0; + + while( ( token = strstr( p, "endobj" ) ) || oneCycle ) { + oneCycle = false; + + if( token ) { + oneCycle = true; + token[0] = '\0'; + offset = token - p; + } + + // got trailer dictionary + if (!strncmp(p, "trailer", 7)) { + obj.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, + str->makeSubStream(pos + 7, gFalse, 0, &obj)), + gFalse); + parser->getObj(&newTrailerDict); + if (newTrailerDict.isDict()) { + newTrailerDict.dictLookupNF("Root", &obj); + if (obj.isRef() && (!gotRoot || !needCatalogDict) && rootNum != obj.getRefNum()) { + rootNum = obj.getRefNum(); + rootGen = obj.getRefGen(); + if (!trailerDict.isNone()) { + trailerDict.free(); + } + newTrailerDict.copy(&trailerDict); + gotRoot = gTrue; + } + obj.free(); + } + newTrailerDict.free(); + delete parser; + + // look for object + } else if (isdigit(*p & 0xff)) { + num = atoi(p); + if (num > 0) { + do { + ++p; + } while (*p && isdigit(*p & 0xff)); + if (isspace(*p & 0xff)) { + do { + ++p; + } while (*p && isspace(*p & 0xff)); + if (isdigit(*p & 0xff)) { + gen = atoi(p); + do { + ++p; + } while (*p && isdigit(*p & 0xff)); + if (isspace(*p & 0xff)) { + do { + ++p; + } while (*p && isspace(*p & 0xff)); + if (!strncmp(p, "obj", 3)) { + if (num >= size) { + newSize = (num + 1 + 255) & ~255; + if (newSize < 0) { + error(errSyntaxError, -1, "Bad object number"); + return gFalse; + } + if (resize(newSize) != newSize) { + error(errSyntaxError, -1, "Invalid 'obj' parameters"); + return gFalse; + } + } + if (entries[num].type == xrefEntryFree || + gen >= entries[num].gen) { + entries[num].offset = pos - start; + entries[num].gen = gen; + entries[num].type = xrefEntryUncompressed; + } + } + } + } + } + } + + } else if (!strncmp(p, "endstream", 9)) { + if (streamEndsLen == streamEndsSize) { + streamEndsSize += 64; + if (streamEndsSize >= INT_MAX / (int)sizeof(int)) { + error(errSyntaxError, -1, "Invalid 'endstream' parameter."); + return gFalse; + } + streamEnds = (Guint *)greallocn(streamEnds, + streamEndsSize, sizeof(Guint)); + } + streamEnds[streamEndsLen++] = pos; + } + if( token ) { + p = token + 6;// strlen( "endobj" ) = 6 + pos += offset + 6;// strlen( "endobj" ) = 6 + while (*p && Lexer::isSpace(*p & 0xff)) { + ++p; + ++pos; + } + } + } + } + + if (gotRoot) + return gTrue; + + error(errSyntaxError, -1, "Couldn't find trailer dictionary"); + return gFalse; +} + +void XRef::setEncryption(int permFlagsA, GBool ownerPasswordOkA, + Guchar *fileKeyA, int keyLengthA, + int encVersionA, int encRevisionA, + CryptAlgorithm encAlgorithmA) { + int i; + + encrypted = gTrue; + permFlags = permFlagsA; + ownerPasswordOk = ownerPasswordOkA; + if (keyLengthA <= 32) { + keyLength = keyLengthA; + } else { + keyLength = 32; + } + for (i = 0; i < keyLength; ++i) { + fileKey[i] = fileKeyA[i]; + } + encVersion = encVersionA; + encRevision = encRevisionA; + encAlgorithm = encAlgorithmA; +} + +GBool XRef::okToPrint(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permPrint); +} + +// we can print at high res if we are only doing security handler revision +// 2 (and we are allowed to print at all), or with security handler rev +// 3 and we are allowed to print, and bit 12 is set. +GBool XRef::okToPrintHighRes(GBool ignoreOwnerPW) { + if (encrypted) { + if (2 == encRevision) { + return (okToPrint(ignoreOwnerPW)); + } else if (encRevision >= 3) { + return (okToPrint(ignoreOwnerPW) && (permFlags & permHighResPrint)); + } else { + // something weird - unknown security handler version + return gFalse; + } + } else { + return gTrue; + } +} + +GBool XRef::okToChange(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permChange); +} + +GBool XRef::okToCopy(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permCopy); +} + +GBool XRef::okToAddNotes(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permNotes); +} + +GBool XRef::okToFillForm(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permFillForm); +} + +GBool XRef::okToAccessibility(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permAccessibility); +} + +GBool XRef::okToAssemble(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permAssemble); +} + +Object *XRef::getCatalog(Object *catalog) { + Object *obj = fetch(rootNum, rootGen, catalog); + if (obj->isDict()) { + return obj; + } + GBool wasReconstructed = false; + GBool ok = constructXRef(&wasReconstructed, gTrue); + return (ok) ? fetch(rootNum, rootGen, catalog) : obj; +} + +Object *XRef::fetch(int num, int gen, Object *obj, int recursion) { + XRefEntry *e; + Parser *parser; + Object obj1, obj2, obj3; + + // check for bogus ref - this can happen in corrupted PDF files + if (num < 0 || num >= size) { + goto err; + } + + e = getEntry(num); + if(!e->obj.isNull ()) { //check for updated object + obj = e->obj.copy(obj); + return obj; + } + + switch (e->type) { + + case xrefEntryUncompressed: + if (e->gen != gen) { + goto err; + } + obj1.initNull(); + parser = new Parser(this, + new Lexer(this, + str->makeSubStream(start + e->offset, gFalse, 0, &obj1)), + gTrue); + parser->getObj(&obj1, recursion); + parser->getObj(&obj2, recursion); + parser->getObj(&obj3, recursion); + if (!obj1.isInt() || obj1.getInt() != num || + !obj2.isInt() || obj2.getInt() != gen || + !obj3.isCmd("obj")) { + // some buggy pdf have obj1234 for ints that represent 1234 + // try to recover here + if (obj1.isInt() && obj1.getInt() == num && + obj2.isInt() && obj2.getInt() == gen && + obj3.isCmd()) { + char *cmd = obj3.getCmd(); + if (strlen(cmd) > 3 && + cmd[0] == 'o' && + cmd[1] == 'b' && + cmd[2] == 'j') { + char *end_ptr; + long longNumber = strtol(cmd + 3, &end_ptr, 0); + if (longNumber <= INT_MAX && longNumber >= INT_MIN && *end_ptr == '\0') { + int number = longNumber; + error(errSyntaxWarning, -1, "Cmd was not obj but {0:s}, assuming the creator meant obj {1:d}", cmd, number); + obj->initInt(number); + obj1.free(); + obj2.free(); + obj3.free(); + delete parser; + break; + } + } + } + obj1.free(); + obj2.free(); + obj3.free(); + delete parser; + goto err; + } + parser->getObj(obj, gFalse, encrypted ? fileKey : (Guchar *)NULL, + encAlgorithm, keyLength, num, gen, recursion); + obj1.free(); + obj2.free(); + obj3.free(); + delete parser; + break; + + case xrefEntryCompressed: + { +#if 0 // Adobe apparently ignores the generation number on compressed objects + if (gen != 0) { + goto err; + } +#endif + if (e->offset >= (Guint)size || + entries[e->offset].type != xrefEntryUncompressed) { + error(errSyntaxError, -1, "Invalid object stream"); + goto err; + } + + ObjectStream *objStr = NULL; + ObjectStreamKey key(e->offset); + PopplerCacheItem *item = objStrs->lookup(key); + if (item) { + ObjectStreamItem *it = static_cast(item); + objStr = it->objStream; + } + + if (!objStr) { + objStr = new ObjectStream(this, e->offset); + if (!objStr->isOk()) { + delete objStr; + objStr = NULL; + goto err; + } else { + // XRef could be reconstructed in constructor of ObjectStream: + e = getEntry(num); + ObjectStreamKey *newkey = new ObjectStreamKey(e->offset); + ObjectStreamItem *newitem = new ObjectStreamItem(objStr); + objStrs->put(newkey, newitem); + } + } + objStr->getObject(e->gen, num, obj); + } + break; + + default: + goto err; + } + + return obj; + + err: + return obj->initNull(); +} + +Object *XRef::getDocInfo(Object *obj) { + return trailerDict.dictLookup("Info", obj); +} + +// Added for the pdftex project. +Object *XRef::getDocInfoNF(Object *obj) { + return trailerDict.dictLookupNF("Info", obj); +} + +GBool XRef::getStreamEnd(Guint streamStart, Guint *streamEnd) { + int a, b, m; + + if (streamEndsLen == 0 || + streamStart > streamEnds[streamEndsLen - 1]) { + return gFalse; + } + + a = -1; + b = streamEndsLen - 1; + // invariant: streamEnds[a] < streamStart <= streamEnds[b] + while (b - a > 1) { + m = (a + b) / 2; + if (streamStart <= streamEnds[m]) { + b = m; + } else { + a = m; + } + } + *streamEnd = streamEnds[b]; + return gTrue; +} + +int XRef::getNumEntry(Guint offset) +{ + if (size > 0) + { + int res = 0; + Guint resOffset = getEntry(0)->offset; + XRefEntry *e; + for (int i = 1; i < size; ++i) + { + e = getEntry(i, gFalse); + if (e->type != xrefEntryFree && e->offset < offset && e->offset >= resOffset) + { + res = i; + resOffset = e->offset; + } + } + return res; + } + else return -1; +} + +void XRef::add(int num, int gen, Guint offs, GBool used) { + if (num >= size) { + if (num >= capacity) { + entries = (XRefEntry *)greallocn(entries, num + 1, sizeof(XRefEntry)); + capacity = num + 1; + } + for (int i = size; i < num + 1; ++i) { + entries[i].offset = 0xffffffff; + entries[i].type = xrefEntryFree; + entries[i].obj.initNull (); + entries[i].updated = false; + entries[i].gen = 0; + } + size = num + 1; + } + XRefEntry *e = getEntry(num); + e->gen = gen; + e->obj.initNull (); + e->updated = false; + if (used) { + e->type = xrefEntryUncompressed; + e->offset = offs; + } else { + e->type = xrefEntryFree; + e->offset = 0; + } +} + +void XRef::setModifiedObject (Object* o, Ref r) { + if (r.num < 0 || r.num >= size) { + error(errInternal, -1,"XRef::setModifiedObject on unknown ref: {0:d}, {1:d}\n", r.num, r.gen); + return; + } + XRefEntry *e = getEntry(r.num); + e->obj.free(); + o->copy(&(e->obj)); + e->updated = true; +} + +Ref XRef::addIndirectObject (Object* o) { + int entryIndexToUse = -1; + for (int i = 1; entryIndexToUse == -1 && i < size; ++i) { + XRefEntry *e = getEntry(i, false /* complainIfMissing */); + if (e->type == xrefEntryFree && e->gen != 65535) { + entryIndexToUse = i; + } + } + + XRefEntry *e; + if (entryIndexToUse == -1) { + entryIndexToUse = size; + add(entryIndexToUse, 0, 0, gFalse); + e = getEntry(entryIndexToUse); + } else { + //reuse a free entry + e = getEntry(entryIndexToUse); + //we don't touch gen number, because it should have been + //incremented when the object was deleted + } + e->type = xrefEntryUncompressed; + o->copy(&e->obj); + e->updated = true; + + Ref r; + r.num = entryIndexToUse; + r.gen = e->gen; + return r; +} + +void XRef::removeIndirectObject(Ref r) { + if (r.num < 0 || r.num >= size) { + error(errInternal, -1,"XRef::removeIndirectObject on unknown ref: {0:d}, {1:d}\n", r.num, r.gen); + return; + } + XRefEntry *e = getEntry(r.num); + if (e->type == xrefEntryFree) + return; + e->obj.free(); + e->type = xrefEntryFree; + e->gen++; + e->updated = true; +} + +void XRef::writeXRef(XRef::XRefWriter *writer, GBool writeAllEntries) { + //create free entries linked-list + if (getEntry(0)->gen != 65535) { + error(errInternal, -1, "XRef::writeXRef, entry 0 of the XRef is invalid (gen != 65535)\n"); + } + int lastFreeEntry = 0; + for (int i=0; itype == xrefEntryFree) { + getEntry(lastFreeEntry)->offset = i; + lastFreeEntry = i; + } + } + + if (writeAllEntries) { + writer->startSection(0, size); + for (int i=0; igen > 65535) e->gen = 65535; //cap generation number to 65535 (required by PDFReference) + writer->writeEntry(e->offset, e->gen, e->type); + } + } else { + int i = 0; + while (i < size) { + int j; + for(j=i; jtype == xrefEntryFree) && (getEntry(j)->gen == 0)) + break; + } + if (j-i != 0) + { + writer->startSection(i, j-i); + for (int k=i; kgen > 65535) e->gen = 65535; //cap generation number to 65535 (required by PDFReference) + writer->writeEntry(e->offset, e->gen, e->type); + } + i = j; + } + else ++i; + } + } +} + +XRef::XRefTableWriter::XRefTableWriter(OutStream* outStrA) { + outStr = outStrA; +} + +void XRef::XRefTableWriter::startSection(int first, int count) { + outStr->printf("%i %i\r\n", first, count); +} + +void XRef::XRefTableWriter::writeEntry(Guint offset, int gen, XRefEntryType type) { + outStr->printf("%010i %05i %c\r\n", offset, gen, (type==xrefEntryFree)?'f':'n'); +} + +void XRef::writeTableToFile(OutStream* outStr, GBool writeAllEntries) { + XRefTableWriter writer(outStr); + outStr->printf("xref\r\n"); + writeXRef(&writer, writeAllEntries); +} + +XRef::XRefStreamWriter::XRefStreamWriter(Object *indexA, GooString *stmBufA) { + index = indexA; + stmBuf = stmBufA; +} + +void XRef::XRefStreamWriter::startSection(int first, int count) { + Object obj; + index->arrayAdd( obj.initInt(first) ); + index->arrayAdd( obj.initInt(count) ); +} + +void XRef::XRefStreamWriter::writeEntry(Guint offset, int gen, XRefEntryType type) { + char data[7]; + data[0] = (type==xrefEntryFree) ? 0 : 1; + data[1] = (offset >> 24) & 0xff; + data[2] = (offset >> 16) & 0xff; + data[3] = (offset >> 8) & 0xff; + data[4] = offset & 0xff; + data[5] = (gen >> 8) & 0xff; + data[6] = gen & 0xff; + stmBuf->append(data, 7); +} + +void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) { + Object index; + index.initArray(xref); + stmBuf->clear(); + + XRefStreamWriter writer(&index, stmBuf); + writeXRef(&writer, gFalse); + + Object obj1, obj2; + xrefDict->set("Type", obj1.initName("XRef")); + xrefDict->set("Index", &index); + obj2.initArray(xref); + obj2.arrayAdd( obj1.initInt(1) ); + obj2.arrayAdd( obj1.initInt(4) ); + obj2.arrayAdd( obj1.initInt(2) ); + xrefDict->set("W", &obj2); +} + +GBool XRef::parseEntry(Guint offset, XRefEntry *entry) +{ + GBool r; + + Object obj; + obj.initNull(); + Parser parser = Parser(NULL, new Lexer(NULL, + str->makeSubStream(offset, gFalse, 20, &obj)), gTrue); + + Object obj1, obj2, obj3; + if ((parser.getObj(&obj1)->isInt()) && + (parser.getObj(&obj2)->isInt()) && + (parser.getObj(&obj3)->isCmd("n") || obj3.isCmd("f"))) { + entry->offset = (Guint) obj1.getInt(); + entry->gen = obj2.getInt(); + entry->type = obj3.isCmd("n") ? xrefEntryUncompressed : xrefEntryFree; + entry->obj.initNull (); + entry->updated = false; + r = gTrue; + } else { + r = gFalse; + } + obj1.free(); + obj2.free(); + obj3.free(); + + return r; +} + +XRefEntry *XRef::getEntry(int i, GBool complainIfMissing) +{ + if (entries[i].type == xrefEntryNone) { + + if ((!xRefStream) && mainXRefEntriesOffset) { + if (!parseEntry(mainXRefEntriesOffset + 20*i, &entries[i])) { + error(errSyntaxError, -1, "Failed to parse XRef entry [{0:d}].", i); + } + } else { + std::vector followedPrev; + while (prevXRefOffset && entries[i].type == xrefEntryNone) { + bool followed = false; + for (size_t j = 0; j < followedPrev.size(); j++) { + if (followedPrev.at(j) == prevXRefOffset) { + followed = true; + break; + } + } + if (followed) { + error(errSyntaxError, -1, "Circular XRef"); + if (!(ok = constructXRef(NULL))) { + errCode = errDamaged; + } + break; + } + + followedPrev.push_back (prevXRefOffset); + + std::vector followedXRefStm; + if (!readXRef(&prevXRefOffset, &followedXRefStm)) { + prevXRefOffset = 0; + } + + // if there was a problem with the xref table, + // try to reconstruct it + if (!ok || (!prevXRefOffset && entries[i].type == xrefEntryNone)) { + GBool wasReconstructed = false; + if (!(ok = constructXRef(&wasReconstructed))) { + errCode = errDamaged; + break; + } + break; + } + } + + // We might have reconstructed the xref + // Check again i is in bounds + if (unlikely(i >= size)) { + static XRefEntry dummy; + dummy.offset = 0; + dummy.gen = -1; + dummy.type = xrefEntryNone; + dummy.updated = false; + return &dummy; + } + + if (entries[i].type == xrefEntryNone) { + if (complainIfMissing) { + error(errSyntaxError, -1, "Invalid XRef entry"); + } + entries[i].type = xrefEntryFree; + } + } + } + + return &entries[i]; +} + + diff --git a/poppler/XRef.h b/poppler/XRef.h new file mode 100644 index 0000000..2add0a1 --- /dev/null +++ b/poppler/XRef.h @@ -0,0 +1,214 @@ +//======================================================================== +// +// XRef.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Brad Hards +// Copyright (C) 2006, 2008, 2010-2012 Albert Astals Cid +// Copyright (C) 2007-2008 Julien Rebetez +// Copyright (C) 2007 Carlos Garcia Campos +// Copyright (C) 2010 Ilya Gorenbein +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2012 Thomas Freitag +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef XREF_H +#define XREF_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" + +#include + +class Dict; +class Stream; +class Parser; +class PopplerCache; + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +enum XRefEntryType { + xrefEntryFree, + xrefEntryUncompressed, + xrefEntryCompressed, + xrefEntryNone +}; + +struct XRefEntry { + Guint offset; + int gen; + XRefEntryType type; + bool updated; + Object obj; //if this entry was updated, obj will contains the updated object +}; + +class XRef { +public: + + // Constructor, create an empty XRef, used for PDF writing + XRef(); + // Constructor, create an empty XRef but with info dict, used for PDF writing + XRef(Object *trailerDictA); + // Constructor. Read xref table from stream. + XRef(BaseStream *strA, Guint pos, Guint mainXRefEntriesOffsetA = 0, GBool *wasReconstructed = NULL, GBool reconstruct = false); + + // Destructor. + ~XRef(); + + // Is xref table valid? + GBool isOk() { return ok; } + + // Is the last XRef section a stream or a table? + GBool isXRefStream() { return xRefStream; } + + // Get the error code (if isOk() returns false). + int getErrorCode() { return errCode; } + + // Set the encryption parameters. + void setEncryption(int permFlagsA, GBool ownerPasswordOkA, + Guchar *fileKeyA, int keyLengthA, + int encVersionA, int encRevisionA, + CryptAlgorithm encAlgorithmA); + + // Is the file encrypted? + GBool isEncrypted() { return encrypted; } + + // Check various permissions. + GBool okToPrint(GBool ignoreOwnerPW = gFalse); + GBool okToPrintHighRes(GBool ignoreOwnerPW = gFalse); + GBool okToChange(GBool ignoreOwnerPW = gFalse); + GBool okToCopy(GBool ignoreOwnerPW = gFalse); + GBool okToAddNotes(GBool ignoreOwnerPW = gFalse); + GBool okToFillForm(GBool ignoreOwnerPW = gFalse); + GBool okToAccessibility(GBool ignoreOwnerPW = gFalse); + GBool okToAssemble(GBool ignoreOwnerPW = gFalse); + int getPermFlags() { return permFlags; } + + // Get catalog object. + Object *getCatalog(Object *obj); + + // Fetch an indirect reference. + Object *fetch(int num, int gen, Object *obj, int recursion = 0); + + // Return the document's Info dictionary (if any). + Object *getDocInfo(Object *obj); + Object *getDocInfoNF(Object *obj); + + // Return the number of objects in the xref table. + int getNumObjects() { return size; } + + // Return the catalog object reference. + int getRootNum() { return rootNum; } + int getRootGen() { return rootGen; } + + // Get end position for a stream in a damaged file. + // Returns false if unknown or file is not damaged. + GBool getStreamEnd(Guint streamStart, Guint *streamEnd); + + // Retuns the entry that belongs to the offset + int getNumEntry(Guint offset); + + // Direct access. + XRefEntry *getEntry(int i, GBool complainIfMissing = gTrue); + Object *getTrailerDict() { return &trailerDict; } + + // Write access + void setModifiedObject(Object* o, Ref r); + Ref addIndirectObject (Object* o); + void removeIndirectObject(Ref r); + void add(int num, int gen, Guint offs, GBool used); + + // Output XRef table to stream + void writeTableToFile(OutStream* outStr, GBool writeAllEntries); + // Output XRef stream contents to GooString and fill trailerDict fields accordingly + void writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref); + +private: + + BaseStream *str; // input stream + Guint start; // offset in file (to allow for garbage + // at beginning of file) + XRefEntry *entries; // xref entries + int capacity; // size of array + int size; // number of entries + int rootNum, rootGen; // catalog dict + GBool ok; // true if xref table is valid + int errCode; // error code (if is false) + Object trailerDict; // trailer dictionary + Guint *streamEnds; // 'endstream' positions - only used in + // damaged files + int streamEndsLen; // number of valid entries in streamEnds + PopplerCache *objStrs; // cached object streams + GBool encrypted; // true if file is encrypted + int encRevision; + int encVersion; // encryption algorithm + CryptAlgorithm encAlgorithm; // encryption algorithm + int keyLength; // length of key, in bytes + int permFlags; // permission bits + Guchar fileKey[32]; // file decryption key + GBool ownerPasswordOk; // true if owner password is correct + Guint prevXRefOffset; // position of prev XRef section (= next to read) + Guint mainXRefEntriesOffset; // offset of entries in main XRef table + GBool xRefStream; // true if last XRef section is a stream + + void init(); + int reserve(int newSize); + int resize(int newSize); + GBool readXRef(Guint *pos, std::vector *followedXRefStm); + GBool readXRefTable(Parser *parser, Guint *pos, std::vector *followedXRefStm); + GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); + GBool readXRefStream(Stream *xrefStr, Guint *pos); + GBool constructXRef(GBool *wasReconstructed, GBool needCatalogDict = gFalse); + GBool parseEntry(Guint offset, XRefEntry *entry); + + class XRefWriter { + public: + virtual void startSection(int first, int count) = 0; + virtual void writeEntry(Guint offset, int gen, XRefEntryType type) = 0; + virtual ~XRefWriter() {}; + }; + + class XRefTableWriter: public XRefWriter { + public: + XRefTableWriter(OutStream* outStrA); + void startSection(int first, int count); + void writeEntry(Guint offset, int gen, XRefEntryType type); + private: + OutStream* outStr; + }; + + class XRefStreamWriter: public XRefWriter { + public: + XRefStreamWriter(Object *index, GooString *stmBuf); + void startSection(int first, int count); + void writeEntry(Guint offset, int gen, XRefEntryType type); + private: + Object *index; + GooString *stmBuf; + }; + + void writeXRef(XRefWriter *writer, GBool writeAllEntries); +}; + +#endif diff --git a/poppler/XpdfPluginAPI.cc b/poppler/XpdfPluginAPI.cc new file mode 100644 index 0000000..834c681 --- /dev/null +++ b/poppler/XpdfPluginAPI.cc @@ -0,0 +1,243 @@ +//======================================================================== +// +// XpdfPluginAPI.cc +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" + +#ifdef ENABLE_PLUGINS + +#include "gmem.h" +#include "GlobalParams.h" +#include "Object.h" +#include "PDFDoc.h" +#include "XpdfPluginAPI.h" + +//------------------------------------------------------------------------ + +//~ This should use a pool of Objects; change xpdfFreeObj to match. +static Object *allocObj() { + return (Object *)gmalloc(sizeof(Object)); +} + +//------------------------------------------------------------------------ +// Document access functions +//------------------------------------------------------------------------ + +XpdfObject _xpdfGetInfoDict(XpdfDoc doc) { + Object *obj; + + obj = allocObj(); + return (XpdfObject)((PDFDoc *)doc)->getDocInfo(obj); +} + +XpdfObject _xpdfGetCatalog(XpdfDoc doc) { + Object *obj; + + obj = allocObj(); + return (XpdfObject)((PDFDoc *)doc)->getXRef()->getCatalog(obj); +} + +//------------------------------------------------------------------------ +// Object access functions. +//------------------------------------------------------------------------ + +XpdfBool _xpdfObjIsBool(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isBool(); +} + +XpdfBool _xpdfObjIsInt(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isInt(); +} + +XpdfBool _xpdfObjIsReal(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isReal(); +} + +XpdfBool _xpdfObjIsNumber(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isNum(); +} + +XpdfBool _xpdfObjIsString(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isString(); +} + +XpdfBool _xpdfObjIsName(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isName(); +} + +XpdfBool _xpdfObjIsNull(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isNull(); +} + +XpdfBool _xpdfObjIsArray(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isArray(); +} + +XpdfBool _xpdfObjIsDict(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isDict(); +} + +XpdfBool _xpdfObjIsStream(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isStream(); +} + +XpdfBool _xpdfObjIsRef(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->isRef(); +} + +XpdfBool _xpdfBoolValue(XpdfObject obj) { + return (XpdfBool)((Object *)obj)->getBool(); +} + +int _xpdfIntValue(XpdfObject obj) { + if (!((Object *)obj)->isInt()) { + return 0; + } + return ((Object *)obj)->getInt(); +} + +double _xpdfRealValue(XpdfObject obj) { + if (!((Object *)obj)->isReal()) { + return 0; + } + return ((Object *)obj)->getReal(); +} + +double _xpdfNumberValue(XpdfObject obj) { + if (!((Object *)obj)->isNum()) { + return 0; + } + return ((Object *)obj)->getNum(); +} + +int _xpdfStringLength(XpdfObject obj) { + if (!((Object *)obj)->isString()) { + return 0; + } + return ((Object *)obj)->getString()->getLength(); +} + +char *_xpdfStringValue(XpdfObject obj) { + if (!((Object *)obj)->isString()) { + return 0; + } + return ((Object *)obj)->getString()->getCString(); +} + +char *_xpdfNameValue(XpdfObject obj) { + if (!((Object *)obj)->isName()) { + return NULL; + } + return ((Object *)obj)->getName(); +} + +int _xpdfArrayLength(XpdfObject obj) { + if (!((Object *)obj)->isArray()) { + return 0; + } + return ((Object *)obj)->arrayGetLength(); +} + +XpdfObject _xpdfArrayGet(XpdfObject obj, int idx) { + Object *elem; + + elem = allocObj(); + if (!((Object *)obj)->isArray()) { + return (XpdfObject)elem->initNull(); + } + return (XpdfObject)((Object *)obj)->arrayGet(idx, elem); +} + +XpdfObject _xpdfDictGet(XpdfObject obj, char *key) { + Object *elem; + + elem = allocObj(); + if (!((Object *)obj)->isDict()) { + return (XpdfObject)elem->initNull(); + } + return (XpdfObject)((Object *)obj)->dictLookup(key, elem); +} + +void _xpdfFreeObj(XpdfObject obj) { + ((Object *)obj)->free(); + gfree(obj); +} + +//------------------------------------------------------------------------ +// Memory allocation functions +//------------------------------------------------------------------------ + +void *_xpdfMalloc(int size) { + return gmalloc(size); +} + +void *_xpdfRealloc(void *p, int size) { + return grealloc(p, size); +} + +void _xpdfFree(void *p) { + gfree(p); +} + +//------------------------------------------------------------------------ +// Security handlers +//------------------------------------------------------------------------ + +void _xpdfRegisterSecurityHandler(XpdfSecurityHandler *handler) { + if (handler->version <= xpdfPluginAPIVersion) { + globalParams->addSecurityHandler(handler); + } +} + +//------------------------------------------------------------------------ + +XpdfPluginVecTable xpdfPluginVecTable = { + xpdfPluginAPIVersion, + &_xpdfGetInfoDict, + &_xpdfGetCatalog, + &_xpdfObjIsBool, + &_xpdfObjIsInt, + &_xpdfObjIsReal, + &_xpdfObjIsString, + &_xpdfObjIsName, + &_xpdfObjIsNull, + &_xpdfObjIsArray, + &_xpdfObjIsDict, + &_xpdfObjIsStream, + &_xpdfObjIsRef, + &_xpdfBoolValue, + &_xpdfIntValue, + &_xpdfRealValue, + &_xpdfStringLength, + &_xpdfStringValue, + &_xpdfNameValue, + &_xpdfArrayLength, + &_xpdfArrayGet, + &_xpdfDictGet, + &_xpdfFreeObj, + &_xpdfMalloc, + &_xpdfRealloc, + &_xpdfFree, + &_xpdfRegisterSecurityHandler, +}; + +#endif // ENABLE_PLUGINS diff --git a/poppler/XpdfPluginAPI.h b/poppler/XpdfPluginAPI.h new file mode 100644 index 0000000..b0165c0 --- /dev/null +++ b/poppler/XpdfPluginAPI.h @@ -0,0 +1,337 @@ +/* + * XpdfPluginAPI.h + * + * Copyright 2004 Glyph & Cog, LLC + */ + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2012 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef XPDFPLUGINAPI_H +#define XPDFPLUGINAPI_H + +#ifdef _WIN32 +#include +#else +#define Object XtObject +#include +#undef Object +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*------------------------------------------------------------------------ + * Macros + *------------------------------------------------------------------------*/ + +/* + * The current API version. + */ +#define xpdfPluginAPIVersion 1 + +#ifdef _WIN32 +# ifdef __cplusplus +# define PLUGINFUNC(retType) extern "C" __declspec(dllexport) retType +# else +# define PLUGINFUNC(retType) extern __declspec(dllexport) retType +# endif +#else +# ifdef __cplusplus +# define PLUGINFUNC(retType) extern "C" retType +# else +# define PLUGINFUNC(retType) extern retType +# endif +#endif + +/*------------------------------------------------------------------------ + * Plugin setup/cleanup + *------------------------------------------------------------------------*/ + +/* + * All plugins are required to implement two functions: + * + * -- Initialize the plugin. Returns non-zero if successful. + * PLUGINFUNC(XpdfBool) xpdfInitPlugin(void); + * + * -- Free the plugin. + * PLUGINFUNC(void) xpdfFreePlugin(void); + */ + +/*------------------------------------------------------------------------ + * Types + *------------------------------------------------------------------------*/ + +/* + * Standard C boolean -- zero = false, non-zero = true. + */ +typedef int XpdfBool; +#define xpdfTrue 1 +#define xpdfFalse 0 + +/* + * PDF document handle. + */ +typedef struct _XpdfDoc *XpdfDoc; + +/* + * PDF object handle. + */ +typedef struct _XpdfObject *XpdfObject; + +/* + * Document access permissions. Any of these can be bitwise 'or'ed + * together. If xpdfPermissionOpen is not included, the document + * cannot be opened at all, and the other bits are ignored. + */ +typedef unsigned int XpdfPermission; +#define xpdfPermissionOpen (1 << 0) +#define xpdfPermissionPrint (1 << 2) +#define xpdfPermissionChange (1 << 3) +#define xpdfPermissionCopy (1 << 4) +#define xpdfPermissionNotes (1 << 5) + +/*------------------------------------------------------------------------ + * Security handler + *------------------------------------------------------------------------*/ + +/* + * XpdfSecurityHandler - a security handler plugin should create one + * of these and pass it to xpdfRegisterSecurityHandler. + */ +#ifdef __cplusplus +struct XpdfSecurityHandler { +#else +typedef struct { +#endif + + /* + * Version of the security handler spec (this document) -- use + * xpdfPluginAPIVersion. + */ + int version; + + /* + * Security handler name. + */ + char *name; + + /* + * Any global data the security handler needs. XpdfViewer will pass + * this pointer to all handler functions as the + * argument. + */ + void *handlerData; + + /* + * Allocate and initialize data for a new document. XpdfViewer will + * pass the returned pointer to all other handler functions as the + * argument. Returns non-zero if successful. + */ + XpdfBool (*newDoc)(void *handlerData, XpdfDoc doc, + XpdfObject encryptDict, void **docData); + + /* + * Free the data allocated by newDoc. + */ + void (*freeDoc)(void *handlerData, void *docData); + + /* + * Construct authorization data based on the supplied owner and user + * passwords (either or both of which may be NULL). This function + * is called in "batch" mode, i.e., if the password was supplied on + * the command line or via an Xpdf library API. It should not + * generate any user interaction (e.g., a password dialog). It is + * not required to support this function: the makeAuthData function + * pointer can be set to NULL. Returns non-zero if successful. + */ + XpdfBool (*makeAuthData)(void *handlerData, void *docData, + char *ownerPassword, char *userPassword, + void **authData); + + /* + * Request any needed information (e.g., a password) from the user, + * and construct an authorization data object. Returns non-zero if + * successful. + */ + XpdfBool (*getAuthData)(void *handlerData, void *docData, + void **authData); + + /* + * Free the data allocated by getAuthData. + */ + void (*freeAuthData)(void *handlerData, void *docData, + void *authData); + + /* + * Request permission to access the document. This returns all + * permissions granted by authData. + */ + XpdfPermission (*authorize)(void *handlerData, void *docData, + void *authData); + + /* + * Get the decryption key and algorithm version associated with the + * document. Returns non-zero if successful. + */ + XpdfBool (*getKey)(void *handlerData, void *docData, + char **key, int *keyLen, int *cryptVersion, int *cryptRevision); + + /* + * Free the data allocated by getKey. + */ + void (*freeKey)(void *handlerData, void *docData, + char *key, int keyLen); + +#ifdef __cplusplus +}; +#else +} XpdfSecurityHandler; +#endif + +/*------------------------------------------------------------------------*/ + +typedef struct { + int version; + +/*------------------------------------------------------------------------ + * Document access functions + *------------------------------------------------------------------------*/ + +/* + * Get a document's info dictionary. (The returned object must be + * freed with xpdfFreeObj.) + */ +XpdfObject (*_xpdfGetInfoDict)(XpdfDoc doc); + +/* + * Get a document's catalog ("root") dictionary. (The returned object + * must be freed with xpdfFreeObj.) + */ +XpdfObject (*_xpdfGetCatalog)(XpdfDoc doc); + +/*------------------------------------------------------------------------ + * Object access functions + *------------------------------------------------------------------------*/ + +/* + * Check an object's type. + */ +XpdfBool (*_xpdfObjIsBool)(XpdfObject obj); +XpdfBool (*_xpdfObjIsInt)(XpdfObject obj); +XpdfBool (*_xpdfObjIsReal)(XpdfObject obj); +XpdfBool (*_xpdfObjIsString)(XpdfObject obj); +XpdfBool (*_xpdfObjIsName)(XpdfObject obj); +XpdfBool (*_xpdfObjIsNull)(XpdfObject obj); +XpdfBool (*_xpdfObjIsArray)(XpdfObject obj); +XpdfBool (*_xpdfObjIsDict)(XpdfObject obj); +XpdfBool (*_xpdfObjIsStream)(XpdfObject obj); +XpdfBool (*_xpdfObjIsRef)(XpdfObject obj); + +/* + * Value access. + * (Objects returned by xpdfArrayGet and xpdfDictGet must be freed + * with xpdfFreeObj.) + */ +XpdfBool (*_xpdfBoolValue)(XpdfObject obj); +int (*_xpdfIntValue)(XpdfObject obj); +double (*_xpdfRealValue)(XpdfObject obj); +int (*_xpdfStringLength)(XpdfObject obj); +char *(*_xpdfStringValue)(XpdfObject obj); +char *(*_xpdfNameValue)(XpdfObject obj); +int (*_xpdfArrayLength)(XpdfObject obj); +XpdfObject (*_xpdfArrayGet)(XpdfObject obj, int idx); +XpdfObject (*_xpdfDictGet)(XpdfObject obj, char *key); + +/* + * Object destruction. NB: *all* objects must be freed after use. + */ +void (*_xpdfFreeObj)(XpdfObject obj); + +/*------------------------------------------------------------------------ + * Memory allocation functions + *------------------------------------------------------------------------*/ + +void *(*_xpdfMalloc)(int size); +void *(*_xpdfRealloc)(void *p, int size); +void (*_xpdfFree)(void *p); + +/*------------------------------------------------------------------------ + * Security handler functions + *------------------------------------------------------------------------*/ + +/* + * Register a new security handler. + */ +void (*_xpdfRegisterSecurityHandler)(XpdfSecurityHandler *handler); + +/*------------------------------------------------------------------------*/ + +} XpdfPluginVecTable; + +#ifdef _WIN32 + +extern __declspec(dllexport) XpdfPluginVecTable xpdfPluginVecTable; + +#define xpdfPluginSetup \ + extern __declspec(dllexport) \ + XpdfPluginVecTable xpdfPluginVecTable = {xpdfPluginAPIVersion}; + +#else + +extern XpdfPluginVecTable xpdfPluginVecTable; + +#define xpdfPluginSetup \ + XpdfPluginVecTable xpdfPluginVecTable = {xpdfPluginAPIVersion}; + +#endif + +#define xpdfGetInfoDict (*xpdfPluginVecTable._xpdfGetInfoDict) +#define xpdfGetCatalog (*xpdfPluginVecTable._xpdfGetCatalog) +#ifdef _WIN32 +#define xpdfWin32GetWindow (*xpdfPluginVecTable._xpdfWin32GetWindow) +#else +#define xpdfXGetWindow (*xpdfPluginVecTable._xpdfXGetWindow) +#endif +#define xpdfObjIsBool (*xpdfPluginVecTable._xpdfObjIsBool) +#define xpdfObjIsInt (*xpdfPluginVecTable._xpdfObjIsInt) +#define xpdfObjIsReal (*xpdfPluginVecTable._xpdfObjIsReal) +#define xpdfObjIsString (*xpdfPluginVecTable._xpdfObjIsString) +#define xpdfObjIsName (*xpdfPluginVecTable._xpdfObjIsName) +#define xpdfObjIsNull (*xpdfPluginVecTable._xpdfObjIsNull) +#define xpdfObjIsArray (*xpdfPluginVecTable._xpdfObjIsArray) +#define xpdfObjIsDict (*xpdfPluginVecTable._xpdfObjIsDict) +#define xpdfObjIsStream (*xpdfPluginVecTable._xpdfObjIsStream) +#define xpdfObjIsRef (*xpdfPluginVecTable._xpdfObjIsRef) +#define xpdfBoolValue (*xpdfPluginVecTable._xpdfBoolValue) +#define xpdfIntValue (*xpdfPluginVecTable._xpdfIntValue) +#define xpdfRealValue (*xpdfPluginVecTable._xpdfRealValue) +#define xpdfStringLength (*xpdfPluginVecTable._xpdfStringLength) +#define xpdfStringValue (*xpdfPluginVecTable._xpdfStringValue) +#define xpdfNameValue (*xpdfPluginVecTable._xpdfNameValue) +#define xpdfArrayLength (*xpdfPluginVecTable._xpdfArrayLength) +#define xpdfArrayGet (*xpdfPluginVecTable._xpdfArrayGet) +#define xpdfDictGet (*xpdfPluginVecTable._xpdfDictGet) +#define xpdfFreeObj (*xpdfPluginVecTable._xpdfFreeObj) +#define xpdfMalloc (*xpdfPluginVecTable._xpdfMalloc) +#define xpdfRealloc (*xpdfPluginVecTable._xpdfRealloc) +#define xpdfFree (*xpdfPluginVecTable._xpdfFree) +#define xpdfRegisterSecurityHandler (*xpdfPluginVecTable._xpdfRegisterSecurityHandler) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/poppler/gen-unicode-tables.py b/poppler/gen-unicode-tables.py new file mode 100644 index 0000000..282f6e5 --- /dev/null +++ b/poppler/gen-unicode-tables.py @@ -0,0 +1,38 @@ +UNICODE_LAST_CHAR_PART1 = 0x2FAFF +HANGUL_S_BASE = 0xAC00 +HANGUL_S_COUNT = 19 * 21 * 28 +import unicodedata + +print """// Generated by gen-unicode-tables.py + +typedef struct { + Unicode character; + int length; + int offset; +} decomposition; +""" + +decomp_table = [] +max_index = 0 +decomp_expansion_index = {} +decomp_expansion = [] +for u in xrange(0, UNICODE_LAST_CHAR_PART1): + if (u >= HANGUL_S_BASE and u < HANGUL_S_BASE + HANGUL_S_COUNT): + continue + norm = tuple(map(ord, unicodedata.normalize("NFKD", unichr(u)))) + if norm != (u,): + try: + i = decomp_expansion_index[norm] + decomp_table.append((u, len(norm), i)) + except KeyError: + decomp_table.append((u, len(norm), max_index)) + decomp_expansion_index[norm] = max_index + decomp_expansion.append((norm, max_index)) + max_index += len(norm) +print "#define DECOMP_TABLE_LENGTH %d\n" % len(decomp_table) +print "static const decomposition decomp_table[] = {\n%s\n};\n" % ", \n".join( + " { 0x%x, %d, %d }" % (character, length, offset) + for character, length, offset in decomp_table) +print "static const Unicode decomp_expansion[] = {\n%s\n};\n" % ", \n".join( + " %s /* offset %d */ " % (", ".join("0x%x" % u for u in norm), + index) for norm, index in decomp_expansion) diff --git a/poppler/poppler-config.h.cmake b/poppler/poppler-config.h.cmake new file mode 100644 index 0000000..94a12aa --- /dev/null +++ b/poppler/poppler-config.h.cmake @@ -0,0 +1,183 @@ +//================================================= -*- mode: c++ -*- ==== +// +// poppler-config.h +// +// Copyright 1996-2011 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef POPPLER_CONFIG_H +#define POPPLER_CONFIG_H + +// We duplicate some of the config.h #define's here since they are +// used in some of the header files we install. The #ifndef/#endif +// around #undef look odd, but it's to silence warnings about +// redefining those symbols. + +/* Defines the poppler version */ +#ifndef POPPLER_VERSION +#define POPPLER_VERSION "${POPPLER_VERSION}" +#endif + +/* Enable multithreading support. */ +#ifndef MULTITHREADED +#cmakedefine MULTITHREADED 1 +#endif + +/* Use fixedpoint. */ +#ifndef USE_FIXEDPOINT +#cmakedefine USE_FIXEDPOINT 1 +#endif + +/* Use single precision arithmetic in the Splash backend */ +#ifndef USE_FLOAT +#cmakedefine USE_FLOAT 1 +#endif + +/* Include support for OPI comments. */ +#ifndef OPI_SUPPORT +#cmakedefine OPI_SUPPORT 1 +#endif + +/* Enable word list support. */ +#ifndef TEXTOUT_WORD_LIST +#cmakedefine TEXTOUT_WORD_LIST 1 +#endif + +/* Use fontconfig font configuration backend */ +#ifndef WITH_FONTCONFIGURATION_FONTCONFIG +#cmakedefine WITH_FONTCONFIGURATION_FONTCONFIG 1 +#endif + +/* Use win32 font configuration backend */ +#ifndef WITH_FONTCONFIGURATION_WIN32 +#cmakedefine WITH_FONTCONFIGURATION_WIN32 1 +#endif + +/* Support for curl is compiled in. */ +#ifndef POPPLER_HAS_CURL_SUPPORT +#cmakedefine POPPLER_HAS_CURL_SUPPORT 1 +#endif + +/* Use libjpeg instead of builtin jpeg decoder. */ +#ifndef ENABLE_LIBJPEG +#cmakedefine ENABLE_LIBJPEG 1 +#endif + +/* Build against libtiff. */ +#ifndef ENABLE_LIBTIFF +#cmakedefine ENABLE_LIBTIFF 1 +#endif + +/* Build against libpng. */ +#ifndef ENABLE_LIBPNG +#cmakedefine ENABLE_LIBPNG 1 +#endif + +/* Use zlib instead of builtin zlib decoder. */ +#ifndef ENABLE_ZLIB +#cmakedefine ENABLE_ZLIB 1 +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#ifndef HAVE_DIRENT_H +#cmakedefine HAVE_DIRENT_H 1 +#endif + +/* Defines if gettimeofday is available on your system */ +#ifndef HAVE_GETTIMEOFDAY +#cmakedefine HAVE_GETTIMEOFDAY 1 +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#ifndef HAVE_NDIR_H +#cmakedefine HAVE_NDIR_H 1 +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#ifndef HAVE_SYS_DIR_H +#cmakedefine HAVE_SYS_DIR_H 1 +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#ifndef HAVE_SYS_NDIR_H +#cmakedefine HAVE_SYS_NDIR_H 1 +#endif + +/* Have FreeType2 include files */ +#ifndef HAVE_FREETYPE_H +#cmakedefine HAVE_FREETYPE_H 1 +#endif + +/* Defines if use cms */ +#ifndef USE_CMS +#cmakedefine USE_CMS 1 +#endif + +// Also, there are preprocessor symbols in the header files +// that are used but never defined when building poppler using configure +// or cmake: DISABLE_OUTLINE, DEBUG_MEM, SPLASH_CMYK, HAVE_T1LIB_H, +// ENABLE_PLUGINS, DEBUG_FORMS, HAVE_FREETYPE_FREETYPE_H + +//------------------------------------------------------------------------ +// version +//------------------------------------------------------------------------ + +// copyright notice +#define popplerCopyright "Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org" +#define xpdfCopyright "Copyright 1996-2011 Glyph & Cog, LLC" + +//------------------------------------------------------------------------ +// popen +//------------------------------------------------------------------------ + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define popen _popen +#define pclose _pclose +#endif + +#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(_WIN32) || defined(__DJGPP__) || defined(MACOS) +#define POPEN_READ_MODE "rb" +#else +#define POPEN_READ_MODE "r" +#endif + +//------------------------------------------------------------------------ +// Win32 stuff +//------------------------------------------------------------------------ + +#if defined(_WIN32) && !defined(_MSC_VER) +#include +#else +#define CDECL +#endif + +#if defined(_WIN32) +#ifdef _MSC_VER +#define strtok_r strtok_s +#elif __MINGW32__ +char * strtok_r (char *s, const char *delim, char **save_ptr); +#endif +#endif + +//------------------------------------------------------------------------ +// Compiler +//------------------------------------------------------------------------ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#else +#define GCC_PRINTF_FORMAT(fmt_index, va_index) +#endif + +#if defined(_MSC_VER) +#define fmax(a, b) max(a, b) +#define fmin(a, b) min(a, b) +#endif + + +#endif /* POPPLER_CONFIG_H */ diff --git a/poppler/poppler-config.h.in b/poppler/poppler-config.h.in new file mode 100644 index 0000000..302d12e --- /dev/null +++ b/poppler/poppler-config.h.in @@ -0,0 +1,183 @@ +//================================================= -*- mode: c++ -*- ==== +// +// poppler-config.h +// +// Copyright 1996-2011 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef POPPLER_CONFIG_H +#define POPPLER_CONFIG_H + +// We duplicate some of the config.h #define's here since they are +// used in some of the header files we install. The #ifndef/#endif +// around #undef look odd, but it's to silence warnings about +// redefining those symbols. + +/* Defines the poppler version. */ +#ifndef POPPLER_VERSION +#undef POPPLER_VERSION +#endif + +/* Enable multithreading support. */ +#ifndef MULTITHREADED +#undef MULTITHREADED +#endif + +/* Use fixedpoint. */ +#ifndef USE_FIXEDPOINT +#undef USE_FIXEDPOINT +#endif + +/* Use single precision arithmetic in the Splash backend */ +#ifndef USE_FLOAT +#undef USE_FLOAT +#endif + +/* Include support for OPI comments. */ +#ifndef OPI_SUPPORT +#undef OPI_SUPPORT +#endif + +/* Enable word list support. */ +#ifndef TEXTOUT_WORD_LIST +#undef TEXTOUT_WORD_LIST +#endif + +/* Use fontconfig font configuration backend */ +#ifndef WITH_FONTCONFIGURATION_FONTCONFIG +#undef WITH_FONTCONFIGURATION_FONTCONFIG +#endif + +/* Use win32 font configuration backend */ +#ifndef WITH_FONTCONFIGURATION_WIN32 +#undef WITH_FONTCONFIGURATION_WIN32 +#endif + +/* Support for curl is compiled in. */ +#ifndef POPPLER_HAS_CURL_SUPPORT +#undef POPPLER_HAS_CURL_SUPPORT +#endif + +/* Use libjpeg instead of builtin jpeg decoder. */ +#ifndef ENABLE_LIBJPEG +#undef ENABLE_LIBJPEG +#endif + +/* Build against libtiff. */ +#ifndef ENABLE_LIBTIFF +#undef ENABLE_LIBTIFF +#endif + +/* Build against libpng. */ +#ifndef ENABLE_LIBPNG +#undef ENABLE_LIBPNG +#endif + +/* Use zlib instead of builtin zlib decoder. */ +#ifndef ENABLE_ZLIB +#undef ENABLE_ZLIB +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#ifndef HAVE_DIRENT_H +#undef HAVE_DIRENT_H +#endif + +/* Defines if gettimeofday is available on your system */ +#ifndef HAVE_GETTIMEOFDAY +#undef HAVE_GETTIMEOFDAY +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#ifndef HAVE_NDIR_H +#undef HAVE_NDIR_H +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#ifndef HAVE_SYS_DIR_H +#undef HAVE_SYS_DIR_H +#endif + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#ifndef HAVE_SYS_NDIR_H +#undef HAVE_SYS_NDIR_H +#endif + +/* Have FreeType2 include files */ +#ifndef HAVE_FREETYPE_H +#undef HAVE_FREETYPE_H +#endif + +/* Defines if use cms */ +#ifndef USE_CMS +#undef USE_CMS +#endif + +// Also, there are preprocessor symbols in the header files +// that are used but never defined when building poppler using configure +// or cmake: DISABLE_OUTLINE, DEBUG_MEM, SPLASH_CMYK, HAVE_T1LIB_H, +// ENABLE_PLUGINS, DEBUG_FORMS, HAVE_FREETYPE_FREETYPE_H + +//------------------------------------------------------------------------ +// version +//------------------------------------------------------------------------ + +// copyright notice +#define popplerCopyright "Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org" +#define xpdfCopyright "Copyright 1996-2011 Glyph & Cog, LLC" + +//------------------------------------------------------------------------ +// popen +//------------------------------------------------------------------------ + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define popen _popen +#define pclose _pclose +#endif + +#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(_WIN32) || defined(__DJGPP__) || defined(MACOS) +#define POPEN_READ_MODE "rb" +#else +#define POPEN_READ_MODE "r" +#endif + +//------------------------------------------------------------------------ +// Win32 stuff +//------------------------------------------------------------------------ + +#if defined(_WIN32) && !defined(_MSC_VER) +#include +#else +#define CDECL +#endif + +#if defined(_WIN32) +#ifdef _MSC_VER +#define strtok_r strtok_s +#elif __MINGW32__ +char * strtok_r (char *s, const char *delim, char **save_ptr); +#endif +#endif + +//------------------------------------------------------------------------ +// Compiler +//------------------------------------------------------------------------ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#else +#define GCC_PRINTF_FORMAT(fmt_index, va_index) +#endif + +#if defined(_MSC_VER) +#define fmax(a, b) max(a, b) +#define fmin(a, b) min(a, b) +#endif + + +#endif /* POPPLER_CONFIG_H */ diff --git a/poppler/strtok_r.cpp b/poppler/strtok_r.cpp new file mode 100644 index 0000000..30e2196 --- /dev/null +++ b/poppler/strtok_r.cpp @@ -0,0 +1,77 @@ +/* Reentrant string tokenizer. Generic version. + Copyright (C) 1991,1996-1999,2001,2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Copyright (C) 1991,93,96,97,99,2000,2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Based on strlen implementation by Torbjorn Granlund (tege@sics.se), + with help from Dan Sahlin (dan@sics.se) and + commentary by Jim Blandy (jimb@ai.mit.edu); + adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), + and implemented by Roland McGrath (roland@ai.mit.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifdef __MINGW32__ +#include + +#define __rawmemchr strchr + +char * strtok_r (char *s, const char *delim, char **save_ptr) +{ + char *token; + + if (s == NULL) + s = *save_ptr; + + /* Scan leading delimiters. */ + s += strspn (s, delim); + if (*s == '\0') + { + *save_ptr = s; + return NULL; + } + + /* Find the end of the token. */ + token = s; + s = strpbrk (token, delim); + if (s == NULL) + /* This token finishes the string. */ + *save_ptr = __rawmemchr (token, '\0'); + else + { + /* Terminate the token and make *SAVE_PTR point past it. */ + *s = '\0'; + *save_ptr = s + 1; + } + return token; +} +#endif diff --git a/qt4/CMakeLists.txt b/qt4/CMakeLists.txt new file mode 100644 index 0000000..a364abf --- /dev/null +++ b/qt4/CMakeLists.txt @@ -0,0 +1,3 @@ +add_subdirectory(src) +add_subdirectory(tests) +add_subdirectory(demos) diff --git a/qt4/Makefile.am b/qt4/Makefile.am new file mode 100644 index 0000000..69a10cb --- /dev/null +++ b/qt4/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src tests demos diff --git a/qt4/Makefile.in b/qt4/Makefile.in new file mode 100644 index 0000000..7a4094d --- /dev/null +++ b/qt4/Makefile.in @@ -0,0 +1,676 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = qt4 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +SUBDIRS = src tests demos +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign qt4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/qt4/demos/CMakeLists.txt b/qt4/demos/CMakeLists.txt new file mode 100644 index 0000000..76accf8 --- /dev/null +++ b/qt4/demos/CMakeLists.txt @@ -0,0 +1,28 @@ +add_definitions(${QT4_DEFINITIONS}) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../src + ${CMAKE_CURRENT_BINARY_DIR} + ${QT4_INCLUDE_DIR} +) + +set(poppler_qt4viewer_SRCS + abstractinfodock.cpp + documentobserver.cpp + embeddedfiles.cpp + fonts.cpp + info.cpp + main_viewer.cpp + metadata.cpp + navigationtoolbar.cpp + optcontent.cpp + pageview.cpp + permissions.cpp + thumbnails.cpp + toc.cpp + viewer.cpp +) +qt4_automoc(${poppler_qt4viewer_SRCS}) +poppler_add_test(poppler_qt4viewer BUILD_QT4_TESTS ${poppler_qt4viewer_SRCS}) +target_link_libraries(poppler_qt4viewer poppler-qt4) diff --git a/qt4/demos/Makefile.am b/qt4/demos/Makefile.am new file mode 100644 index 0000000..155fc1c --- /dev/null +++ b/qt4/demos/Makefile.am @@ -0,0 +1,69 @@ +AM_LDFLAGS = @auto_import_flags@ + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + -I$(top_srcdir)/qt4/src \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_QT4_CFLAGS) + +LDADDS = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/qt4/src/libpoppler-qt4.la \ + $(FONTCONFIG_LIBS) \ + $(POPPLER_QT4_LIBS) + +SUFFIXES: .moc + +# This rule lets GNU make create any *.moc from the equivalent *.h +.h.moc: + $(AM_V_GEN) $(MOCQT4) -i $< -o $@ + +noinst_PROGRAMS = poppler_qt4viewer + +poppler_qt4viewer_SOURCES = \ + abstractinfodock.cpp \ + abstractinfodock.h \ + documentobserver.cpp \ + documentobserver.h \ + embeddedfiles.cpp \ + embeddedfiles.h \ + fonts.cpp \ + fonts.h \ + info.cpp \ + info.h \ + main_viewer.cpp \ + metadata.cpp \ + metadata.h \ + navigationtoolbar.cpp \ + navigationtoolbar.h \ + optcontent.cpp \ + optcontent.h \ + pageview.cpp \ + pageview.h \ + permissions.cpp \ + permissions.h \ + thumbnails.cpp \ + thumbnails.h \ + toc.cpp \ + toc.h \ + viewer.cpp \ + viewer.h + +abstractinfodock.$(OBJEXT): abstractinfodock.moc +embeddedfiles.$(OBJEXT): embeddedfiles.moc +fonts.$(OBJEXT): fonts.moc +info.$(OBJEXT): info.moc +metadata.$(OBJEXT): metadata.moc +navigationtoolbar.$(OBJEXT): navigationtoolbar.moc +optcontent.$(OBJEXT): optcontent.moc +pageview.$(OBJEXT): pageview.moc +permissions.$(OBJEXT): permissions.moc +thumbnails.$(OBJEXT): thumbnails.moc +toc.$(OBJEXT): toc.moc +viewer.$(OBJEXT): viewer.moc + +poppler_qt4viewer_LDADD = $(LDADDS) + +clean-generic: + rm -f *.moc diff --git a/qt4/demos/Makefile.in b/qt4/demos/Makefile.in new file mode 100644 index 0000000..adc2a85 --- /dev/null +++ b/qt4/demos/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = poppler_qt4viewer$(EXEEXT) +subdir = qt4/demos +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_poppler_qt4viewer_OBJECTS = abstractinfodock.$(OBJEXT) \ + documentobserver.$(OBJEXT) embeddedfiles.$(OBJEXT) \ + fonts.$(OBJEXT) info.$(OBJEXT) main_viewer.$(OBJEXT) \ + metadata.$(OBJEXT) navigationtoolbar.$(OBJEXT) \ + optcontent.$(OBJEXT) pageview.$(OBJEXT) permissions.$(OBJEXT) \ + thumbnails.$(OBJEXT) toc.$(OBJEXT) viewer.$(OBJEXT) +poppler_qt4viewer_OBJECTS = $(am_poppler_qt4viewer_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/qt4/src/libpoppler-qt4.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +poppler_qt4viewer_DEPENDENCIES = $(am__DEPENDENCIES_2) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(poppler_qt4viewer_SOURCES) +DIST_SOURCES = $(poppler_qt4viewer_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +AM_LDFLAGS = @auto_import_flags@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + -I$(top_srcdir)/qt4/src \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_QT4_CFLAGS) + +LDADDS = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/qt4/src/libpoppler-qt4.la \ + $(FONTCONFIG_LIBS) \ + $(POPPLER_QT4_LIBS) + +poppler_qt4viewer_SOURCES = \ + abstractinfodock.cpp \ + abstractinfodock.h \ + documentobserver.cpp \ + documentobserver.h \ + embeddedfiles.cpp \ + embeddedfiles.h \ + fonts.cpp \ + fonts.h \ + info.cpp \ + info.h \ + main_viewer.cpp \ + metadata.cpp \ + metadata.h \ + navigationtoolbar.cpp \ + navigationtoolbar.h \ + optcontent.cpp \ + optcontent.h \ + pageview.cpp \ + pageview.h \ + permissions.cpp \ + permissions.h \ + thumbnails.cpp \ + thumbnails.h \ + toc.cpp \ + toc.h \ + viewer.cpp \ + viewer.h + +poppler_qt4viewer_LDADD = $(LDADDS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .h .lo .moc .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/demos/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign qt4/demos/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +poppler_qt4viewer$(EXEEXT): $(poppler_qt4viewer_OBJECTS) $(poppler_qt4viewer_DEPENDENCIES) $(EXTRA_poppler_qt4viewer_DEPENDENCIES) + @rm -f poppler_qt4viewer$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_qt4viewer_OBJECTS) $(poppler_qt4viewer_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abstractinfodock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/documentobserver.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/embeddedfiles.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fonts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_viewer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metadata.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/navigationtoolbar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/optcontent.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pageview.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permissions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumbnails.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viewer.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +SUFFIXES: .moc + +# This rule lets GNU make create any *.moc from the equivalent *.h +.h.moc: + $(AM_V_GEN) $(MOCQT4) -i $< -o $@ + +abstractinfodock.$(OBJEXT): abstractinfodock.moc +embeddedfiles.$(OBJEXT): embeddedfiles.moc +fonts.$(OBJEXT): fonts.moc +info.$(OBJEXT): info.moc +metadata.$(OBJEXT): metadata.moc +navigationtoolbar.$(OBJEXT): navigationtoolbar.moc +optcontent.$(OBJEXT): optcontent.moc +pageview.$(OBJEXT): pageview.moc +permissions.$(OBJEXT): permissions.moc +thumbnails.$(OBJEXT): thumbnails.moc +toc.$(OBJEXT): toc.moc +viewer.$(OBJEXT): viewer.moc + +clean-generic: + rm -f *.moc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/qt4/demos/abstractinfodock.cpp b/qt4/demos/abstractinfodock.cpp new file mode 100644 index 0000000..7b306d8 --- /dev/null +++ b/qt4/demos/abstractinfodock.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "fonts.h" + +AbstractInfoDock::AbstractInfoDock(QWidget *parent) + : QDockWidget(parent), m_filled(false) +{ + connect(this, SIGNAL(visibilityChanged(bool)), SLOT(slotVisibilityChanged(bool))); +} + +AbstractInfoDock::~AbstractInfoDock() +{ +} + +void AbstractInfoDock::documentLoaded() +{ + if (!isHidden()) { + fillInfo(); + m_filled = true; + } +} + +void AbstractInfoDock::documentClosed() +{ + m_filled = false; +} + +void AbstractInfoDock::pageChanged(int page) +{ + Q_UNUSED(page) +} + +void AbstractInfoDock::slotVisibilityChanged(bool visible) +{ + if (visible && document() && !m_filled) { + fillInfo(); + m_filled = true; + } +} + +#include "abstractinfodock.moc" diff --git a/qt4/demos/abstractinfodock.h b/qt4/demos/abstractinfodock.h new file mode 100644 index 0000000..2593325 --- /dev/null +++ b/qt4/demos/abstractinfodock.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef ABSTRACTINFODOCK_H +#define ABSTRACTINFODOCK_H + +#include + +#include "documentobserver.h" + +class AbstractInfoDock : public QDockWidget, public DocumentObserver +{ + Q_OBJECT + +public: + AbstractInfoDock(QWidget *parent = 0); + ~AbstractInfoDock(); + + /*virtual*/ void documentLoaded(); + /*virtual*/ void documentClosed(); + /*virtual*/ void pageChanged(int page); + +protected: + virtual void fillInfo() = 0; + +private Q_SLOTS: + void slotVisibilityChanged(bool visible); + +private: + bool m_filled; +}; + +#endif diff --git a/qt4/demos/documentobserver.cpp b/qt4/demos/documentobserver.cpp new file mode 100644 index 0000000..e5c283d --- /dev/null +++ b/qt4/demos/documentobserver.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "documentobserver.h" + +#include "viewer.h" + +DocumentObserver::DocumentObserver() + : m_viewer(0) +{ +} + +DocumentObserver::~DocumentObserver() +{ +} + +Poppler::Document* DocumentObserver::document() const +{ + return m_viewer->m_doc; +} + +void DocumentObserver::setPage(int page) +{ + m_viewer->setPage(page); +} + +int DocumentObserver::page() const +{ + return m_viewer->page(); +} + +void DocumentObserver::reloadPage() +{ + m_viewer->setPage(m_viewer->page()); +} diff --git a/qt4/demos/documentobserver.h b/qt4/demos/documentobserver.h new file mode 100644 index 0000000..38fe204 --- /dev/null +++ b/qt4/demos/documentobserver.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef DOCUMENTOBSERVER_H +#define DOCUMENTOBSERVER_H + +class PdfViewer; +namespace Poppler { +class Document; +} + +class DocumentObserver +{ +friend class PdfViewer; + +public: + virtual ~DocumentObserver(); + + virtual void documentLoaded() = 0; + virtual void documentClosed() = 0; + virtual void pageChanged(int page) = 0; + +protected: + DocumentObserver(); + + Poppler::Document* document() const; + void setPage(int page); + int page() const; + void reloadPage(); + +private: + PdfViewer *m_viewer; +}; + +#endif diff --git a/qt4/demos/embeddedfiles.cpp b/qt4/demos/embeddedfiles.cpp new file mode 100644 index 0000000..22f9da7 --- /dev/null +++ b/qt4/demos/embeddedfiles.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "embeddedfiles.h" + +#include + +#include + +EmbeddedFilesDock::EmbeddedFilesDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_table = new QTableWidget(this); + setWidget(m_table); + setWindowTitle(tr("Embedded files")); + m_table->setColumnCount(6); + m_table->setHorizontalHeaderLabels( + QStringList() << tr("Name") << tr("Description") << tr("Size") << tr("Creation date") + << tr("Modification date") << tr("Checksum")); + m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +EmbeddedFilesDock::~EmbeddedFilesDock() +{ +} + +void EmbeddedFilesDock::fillInfo() +{ + m_table->setHorizontalHeaderLabels( + QStringList() << tr("Name") << tr("Description") << tr("Size") << tr("Creation date") + << tr("Modification date") << tr("Checksum")); + if (!document()->hasEmbeddedFiles()) { + m_table->setItem(0, 0, new QTableWidgetItem(tr("No files"))); + return; + } + + const QList files = document()->embeddedFiles(); + m_table->setRowCount(files.count()); + int i = 0; + Q_FOREACH(Poppler::EmbeddedFile *file, files) { + m_table->setItem(i, 0, new QTableWidgetItem(file->name())); + m_table->setItem(i, 1, new QTableWidgetItem(file->description())); + m_table->setItem(i, 2, new QTableWidgetItem(QString::number(file->size()))); + m_table->setItem(i, 3, new QTableWidgetItem(file->createDate().toString(Qt::SystemLocaleDate))); + m_table->setItem(i, 4, new QTableWidgetItem(file->modDate().toString(Qt::SystemLocaleDate))); + const QByteArray checksum = file->checksum(); + const QString checksumString = !checksum.isEmpty() ? QString::fromAscii(checksum.toHex()) : QString::fromLatin1("n/a"); + m_table->setItem(i, 5, new QTableWidgetItem(checksumString)); + ++i; + } +} + +void EmbeddedFilesDock::documentLoaded() +{ + if ( document()->pageMode() == Poppler::Document::UseAttach ) { + show(); + } +} + +void EmbeddedFilesDock::documentClosed() +{ + m_table->clear(); + m_table->setRowCount(0); + AbstractInfoDock::documentClosed(); +} + +#include "embeddedfiles.moc" diff --git a/qt4/demos/embeddedfiles.h b/qt4/demos/embeddedfiles.h new file mode 100644 index 0000000..7cd6039 --- /dev/null +++ b/qt4/demos/embeddedfiles.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef ATTACHMENTS_H +#define ATTACHMENTS_H + +#include "abstractinfodock.h" + +class QTableWidget; + +class EmbeddedFilesDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + EmbeddedFilesDock(QWidget *parent = 0); + ~EmbeddedFilesDock(); + + virtual void documentLoaded(); + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private: + QTableWidget *m_table; +}; + +#endif diff --git a/qt4/demos/fonts.cpp b/qt4/demos/fonts.cpp new file mode 100644 index 0000000..bd342bd --- /dev/null +++ b/qt4/demos/fonts.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "fonts.h" + +#include + +#include + +static QString yesNoStatement(bool value) +{ + return value ? QString::fromLatin1("yes") : QString::fromLatin1("no"); +} + +FontsDock::FontsDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_table = new QTableWidget(this); + setWidget(m_table); + setWindowTitle(tr("Fonts")); + m_table->setColumnCount(5); + m_table->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Type") << tr("Embedded") << tr("Subset") << tr("File")); + m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +FontsDock::~FontsDock() +{ +} + +void FontsDock::fillInfo() +{ + const QList fonts = document()->fonts(); + m_table->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Type") << tr("Embedded") << tr("Subset") << tr("File")); + m_table->setRowCount(fonts.count()); + int i = 0; + Q_FOREACH(const Poppler::FontInfo &font, fonts) { + if (font.name().isNull()) { + m_table->setItem(i, 0, new QTableWidgetItem(QString::fromLatin1("[none]"))); + } else { + m_table->setItem(i, 0, new QTableWidgetItem(font.name())); + } + m_table->setItem(i, 1, new QTableWidgetItem(font.typeName())); + m_table->setItem(i, 2, new QTableWidgetItem(yesNoStatement(font.isEmbedded()))); + m_table->setItem(i, 3, new QTableWidgetItem(yesNoStatement(font.isSubset()))); + m_table->setItem(i, 4, new QTableWidgetItem(font.file())); + ++i; + } +} + +void FontsDock::documentClosed() +{ + m_table->clear(); + m_table->setRowCount(0); + AbstractInfoDock::documentClosed(); +} + +#include "fonts.moc" diff --git a/qt4/demos/fonts.h b/qt4/demos/fonts.h new file mode 100644 index 0000000..81afa57 --- /dev/null +++ b/qt4/demos/fonts.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FONTS_H +#define FONTS_H + +#include "abstractinfodock.h" + +class QTableWidget; + +class FontsDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + FontsDock(QWidget *parent = 0); + ~FontsDock(); + + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private: + QTableWidget *m_table; +}; + +#endif diff --git a/qt4/demos/info.cpp b/qt4/demos/info.cpp new file mode 100644 index 0000000..6491e0e --- /dev/null +++ b/qt4/demos/info.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "info.h" + +#include + +#include + +InfoDock::InfoDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_table = new QTableWidget(this); + setWidget(m_table); + setWindowTitle(tr("Information")); + m_table->setColumnCount(2); + m_table->setHorizontalHeaderLabels(QStringList() << tr("Key") << tr("Value")); + m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +InfoDock::~InfoDock() +{ +} + +void InfoDock::fillInfo() +{ + QStringList keys = document()->infoKeys(); + m_table->setHorizontalHeaderLabels(QStringList() << tr("Key") << tr("Value")); + m_table->setRowCount(keys.count()); + QStringList dateKeys; + dateKeys << QString::fromLatin1("CreationDate"); + dateKeys << QString::fromLatin1("ModDate"); + int i = 0; + Q_FOREACH(const QString &date, dateKeys) { + const int id = keys.indexOf(date); + if (id != -1) { + m_table->setItem(i, 0, new QTableWidgetItem(date)); + m_table->setItem(i, 1, new QTableWidgetItem(document()->date(date).toString(Qt::SystemLocaleDate))); + ++i; + keys.removeAt(id); + } + } + Q_FOREACH(const QString &key, keys) { + m_table->setItem(i, 0, new QTableWidgetItem(key)); + m_table->setItem(i, 1, new QTableWidgetItem(document()->info(key))); + ++i; + } +} + +void InfoDock::documentClosed() +{ + m_table->clear(); + m_table->setRowCount(0); + AbstractInfoDock::documentClosed(); +} + +#include "info.moc" diff --git a/qt4/demos/info.h b/qt4/demos/info.h new file mode 100644 index 0000000..d294b43 --- /dev/null +++ b/qt4/demos/info.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef INFO_H +#define INFO_H + +#include "abstractinfodock.h" + +class QTableWidget; + +class InfoDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + InfoDock(QWidget *parent = 0); + ~InfoDock(); + + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private: + QTableWidget *m_table; +}; + +#endif diff --git a/qt4/demos/main_viewer.cpp b/qt4/demos/main_viewer.cpp new file mode 100644 index 0000000..3f7080f --- /dev/null +++ b/qt4/demos/main_viewer.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "viewer.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + const QStringList args = QCoreApplication::arguments(); + PdfViewer *viewer = new PdfViewer(); + viewer->show(); + if (args.count() > 1) { + viewer->loadDocument(args.at(1)); + } + return app.exec(); +} diff --git a/qt4/demos/metadata.cpp b/qt4/demos/metadata.cpp new file mode 100644 index 0000000..e5c7111 --- /dev/null +++ b/qt4/demos/metadata.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "metadata.h" + +#include + +#include + +MetadataDock::MetadataDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_edit = new QTextEdit(this); + setWidget(m_edit); + setWindowTitle(tr("Metadata")); + m_edit->setAcceptRichText(false); + m_edit->setReadOnly(true); +} + +MetadataDock::~MetadataDock() +{ +} + +void MetadataDock::fillInfo() +{ + m_edit->setPlainText(document()->metadata()); +} + +void MetadataDock::documentClosed() +{ + m_edit->clear(); + AbstractInfoDock::documentClosed(); +} + +#include "metadata.moc" diff --git a/qt4/demos/metadata.h b/qt4/demos/metadata.h new file mode 100644 index 0000000..6f1507a --- /dev/null +++ b/qt4/demos/metadata.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef METADATA_H +#define METADATA_H + +#include "abstractinfodock.h" + +class QTextEdit; + +class MetadataDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + MetadataDock(QWidget *parent = 0); + ~MetadataDock(); + + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private: + QTextEdit *m_edit; +}; + +#endif diff --git a/qt4/demos/navigationtoolbar.cpp b/qt4/demos/navigationtoolbar.cpp new file mode 100644 index 0000000..e9ebafa --- /dev/null +++ b/qt4/demos/navigationtoolbar.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "navigationtoolbar.h" + +#include + +#include +#include + +NavigationToolBar::NavigationToolBar(QWidget *parent) + : QToolBar(parent) +{ + m_firstAct = addAction(tr("First"), this, SLOT(slotGoFirst())); + m_prevAct = addAction(tr("Previous"), this, SLOT(slotGoPrev())); + m_pageCombo = new QComboBox(this); + connect(m_pageCombo, SIGNAL(activated(int)), this, SLOT(slotComboActivated(int))); + addWidget(m_pageCombo); + m_nextAct = addAction(tr("Next"), this, SLOT(slotGoNext())); + m_lastAct = addAction(tr("Last"), this, SLOT(slotGoLast())); + + addSeparator(); + + m_zoomCombo = new QComboBox(this); + m_zoomCombo->setEditable(true); + m_zoomCombo->addItem(tr("10%")); + m_zoomCombo->addItem(tr("25%")); + m_zoomCombo->addItem(tr("33%")); + m_zoomCombo->addItem(tr("50%")); + m_zoomCombo->addItem(tr("66%")); + m_zoomCombo->addItem(tr("75%")); + m_zoomCombo->addItem(tr("100%")); + m_zoomCombo->addItem(tr("125%")); + m_zoomCombo->addItem(tr("150%")); + m_zoomCombo->addItem(tr("200%")); + m_zoomCombo->addItem(tr("300%")); + m_zoomCombo->addItem(tr("400%")); + m_zoomCombo->setCurrentIndex(6); // "100%" + connect(m_zoomCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotZoomComboChanged(QString))); + addWidget(m_zoomCombo); + + documentClosed(); +} + +NavigationToolBar::~NavigationToolBar() +{ +} + +void NavigationToolBar::documentLoaded() +{ + const int pageCount = document()->numPages(); + for (int i = 0; i < pageCount; ++i) { + m_pageCombo->addItem(QString::number(i + 1)); + } + m_pageCombo->setEnabled(true); +} + +void NavigationToolBar::documentClosed() +{ + m_firstAct->setEnabled(false); + m_prevAct->setEnabled(false); + m_nextAct->setEnabled(false); + m_lastAct->setEnabled(false); + m_pageCombo->clear(); + m_pageCombo->setEnabled(false); +} + +void NavigationToolBar::pageChanged(int page) +{ + const int pageCount = document()->numPages(); + m_firstAct->setEnabled(page > 0); + m_prevAct->setEnabled(page > 0); + m_nextAct->setEnabled(page < (pageCount - 1)); + m_lastAct->setEnabled(page < (pageCount - 1)); + m_pageCombo->setCurrentIndex(page); +} + +void NavigationToolBar::slotGoFirst() +{ + setPage(0); +} + +void NavigationToolBar::slotGoPrev() +{ + setPage(page() - 1); +} + +void NavigationToolBar::slotGoNext() +{ + setPage(page() + 1); +} + +void NavigationToolBar::slotGoLast() +{ + setPage(document()->numPages() - 1); +} + +void NavigationToolBar::slotComboActivated(int index) +{ + setPage(index); +} + +void NavigationToolBar::slotZoomComboChanged(const QString &_text) +{ + QString text = _text; + text.remove(QLatin1Char('%')); + bool ok = false; + int value = text.toInt(&ok); + if (ok && value >= 10) { + emit zoomChanged(qreal(value) / 100); + } +} + +#include "navigationtoolbar.moc" diff --git a/qt4/demos/navigationtoolbar.h b/qt4/demos/navigationtoolbar.h new file mode 100644 index 0000000..3469f01 --- /dev/null +++ b/qt4/demos/navigationtoolbar.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef NAVIGATIONTOOLBAR_H +#define NAVIGATIONTOOLBAR_H + +#include + +#include "documentobserver.h" + +class QAction; +class QComboBox; + +class NavigationToolBar : public QToolBar, public DocumentObserver +{ + Q_OBJECT + +public: + NavigationToolBar(QWidget *parent = 0); + ~NavigationToolBar(); + + /*virtual*/ void documentLoaded(); + /*virtual*/ void documentClosed(); + /*virtual*/ void pageChanged(int page); + +Q_SIGNALS: + void zoomChanged(qreal value); + +private Q_SLOTS: + void slotGoFirst(); + void slotGoPrev(); + void slotGoNext(); + void slotGoLast(); + void slotComboActivated(int index); + void slotZoomComboChanged(const QString &text); + +private: + QAction *m_firstAct; + QAction *m_prevAct; + QComboBox *m_pageCombo; + QAction *m_nextAct; + QAction *m_lastAct; + QComboBox *m_zoomCombo; +}; + +#endif diff --git a/qt4/demos/optcontent.cpp b/qt4/demos/optcontent.cpp new file mode 100644 index 0000000..0c1015b --- /dev/null +++ b/qt4/demos/optcontent.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "optcontent.h" + +#include + +#include + +OptContentDock::OptContentDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_view = new QTreeView(this); + setWidget(m_view); + setWindowTitle(tr("Optional content")); + m_view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +OptContentDock::~OptContentDock() +{ +} + + +void OptContentDock::documentLoaded() +{ + AbstractInfoDock::documentLoaded(); + if ( document()->pageMode() == Poppler::Document::UseOC ) { + show(); + } +} + +void OptContentDock::fillInfo() +{ + if (!document()->hasOptionalContent()) { + return; + } + + m_view->setModel(document()->optionalContentModel()); + connect(m_view->model(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(reloadImage())); + m_view->expandToDepth(1); +} + +void OptContentDock::documentClosed() +{ + m_view->setModel(0); + AbstractInfoDock::documentClosed(); +} + +void OptContentDock::reloadImage() +{ + reloadPage(); +} + +#include "optcontent.moc" diff --git a/qt4/demos/optcontent.h b/qt4/demos/optcontent.h new file mode 100644 index 0000000..b933f5c --- /dev/null +++ b/qt4/demos/optcontent.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef OPTCONTENT_H +#define OPTCONTENT_H + +#include "abstractinfodock.h" + +class QTreeView; + +class OptContentDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + OptContentDock(QWidget *parent = 0); + ~OptContentDock(); + + /*virtual*/ void documentLoaded(); + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private Q_SLOTS: + void reloadImage(); + +private: + QTreeView *m_view; +}; + +#endif diff --git a/qt4/demos/pageview.cpp b/qt4/demos/pageview.cpp new file mode 100644 index 0000000..734dacb --- /dev/null +++ b/qt4/demos/pageview.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "pageview.h" + +#include + +#include +#include +#include +#include +#include + +PageView::PageView(QWidget *parent) + : QScrollArea(parent) + , m_zoom(1.0) + , m_dpiX(QApplication::desktop()->physicalDpiX()) + , m_dpiY(QApplication::desktop()->physicalDpiY()) +{ + m_imageLabel = new QLabel(this); + m_imageLabel->resize(0, 0); + setWidget(m_imageLabel); +} + +PageView::~PageView() +{ +} + +void PageView::documentLoaded() +{ +} + +void PageView::documentClosed() +{ + m_imageLabel->clear(); + m_imageLabel->resize(0, 0); +} + +void PageView::pageChanged(int page) +{ + Poppler::Page *popplerPage = document()->page(page); + const double resX = m_dpiX * m_zoom; + const double resY = m_dpiY * m_zoom; + QImage image = popplerPage->renderToImage(resX, resY); + if (!image.isNull()) { + m_imageLabel->resize(image.size()); + m_imageLabel->setPixmap(QPixmap::fromImage(image)); + } else { + m_imageLabel->resize(0, 0); + m_imageLabel->setPixmap(QPixmap()); + } + delete popplerPage; +} + +void PageView::slotZoomChanged(qreal value) +{ + m_zoom = value; + if (!document()) { + return; + } + reloadPage(); +} + +#include "pageview.moc" diff --git a/qt4/demos/pageview.h b/qt4/demos/pageview.h new file mode 100644 index 0000000..2f7ad61 --- /dev/null +++ b/qt4/demos/pageview.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef PAGEVIEW_H +#define PAGEVIEW_H + +#include + +#include "documentobserver.h" + +class QLabel; + +class PageView : public QScrollArea, public DocumentObserver +{ + Q_OBJECT + +public: + PageView(QWidget *parent = 0); + ~PageView(); + + /*virtual*/ void documentLoaded(); + /*virtual*/ void documentClosed(); + /*virtual*/ void pageChanged(int page); + +private Q_SLOTS: + void slotZoomChanged(qreal value); + +private: + QLabel *m_imageLabel; + qreal m_zoom; + int m_dpiX; + int m_dpiY; +}; + +#endif diff --git a/qt4/demos/permissions.cpp b/qt4/demos/permissions.cpp new file mode 100644 index 0000000..38205b2 --- /dev/null +++ b/qt4/demos/permissions.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "permissions.h" + +#include + +#include + +PermissionsDock::PermissionsDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_table = new QListWidget(this); + setWidget(m_table); + setWindowTitle(tr("Permissions")); + m_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +PermissionsDock::~PermissionsDock() +{ +} + +void PermissionsDock::fillInfo() +{ +#define ADD_ROW(title, function) \ +do { \ + QListWidgetItem *item = new QListWidgetItem(); \ + item->setFlags(item->flags() & ~Qt::ItemIsEnabled); \ + item->setText(title); \ + item->setCheckState(document()->function() ? Qt::Checked : Qt::Unchecked); \ + m_table->addItem(item); \ +} while (0) + ADD_ROW("Print", okToPrint); + ADD_ROW("PrintHiRes", okToPrintHighRes); + ADD_ROW("Change", okToChange); + ADD_ROW("Copy", okToCopy); + ADD_ROW("Add Notes", okToAddNotes); + ADD_ROW("Fill Forms", okToFillForm); + ADD_ROW("Create Forms", okToCreateFormFields); + ADD_ROW("Extract for accessibility", okToExtractForAccessibility); + ADD_ROW("Assemble", okToAssemble); +#undef ADD_ROW +} + +void PermissionsDock::documentClosed() +{ + m_table->clear(); + AbstractInfoDock::documentClosed(); +} + +#include "permissions.moc" diff --git a/qt4/demos/permissions.h b/qt4/demos/permissions.h new file mode 100644 index 0000000..13bcbbf --- /dev/null +++ b/qt4/demos/permissions.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef PERMISSIONS_H +#define PERMISSIONS_H + +#include "abstractinfodock.h" + +class QListWidget; + +class PermissionsDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + PermissionsDock(QWidget *parent = 0); + ~PermissionsDock(); + + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private: + QListWidget *m_table; +}; + +#endif diff --git a/qt4/demos/thumbnails.cpp b/qt4/demos/thumbnails.cpp new file mode 100644 index 0000000..07b19ca --- /dev/null +++ b/qt4/demos/thumbnails.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2009, Shawn Rutledge + * Copyright (C) 2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "thumbnails.h" + +#include + +#include + +static const int PageRole = Qt::UserRole + 1; + +ThumbnailsDock::ThumbnailsDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_list = new QListWidget(this); + setWidget(m_list); + setWindowTitle(tr("Thumbnails")); + m_list->setViewMode(QListView::ListMode); + m_list->setMovement(QListView::Static); + m_list->setVerticalScrollMode(QListView::ScrollPerPixel); + connect(m_list, SIGNAL(itemActivated(QListWidgetItem*)), + this, SLOT(slotItemActivated(QListWidgetItem*))); +} + +ThumbnailsDock::~ThumbnailsDock() +{ +} + +void ThumbnailsDock::fillInfo() +{ + const int num = document()->numPages(); + QSize maxSize; + for (int i = 0; i < num; ++i) { + const Poppler::Page *page = document()->page(i); + const QImage image = page->thumbnail(); + if (!image.isNull()) { + QListWidgetItem *item = new QListWidgetItem(); + item->setText(QString::number(i + 1)); + item->setData(Qt::DecorationRole, QPixmap::fromImage(image)); + item->setData(PageRole, i); + m_list->addItem(item); + maxSize.setWidth(qMax(maxSize.width(), image.width())); + maxSize.setHeight(qMax(maxSize.height(), image.height())); + } + delete page; + } + if (num > 0) { + m_list->setGridSize(maxSize); + m_list->setIconSize(maxSize); + } +} + +void ThumbnailsDock::documentClosed() +{ + m_list->clear(); + AbstractInfoDock::documentClosed(); +} + +void ThumbnailsDock::slotItemActivated(QListWidgetItem *item) +{ + if (!item) { + return; + } + + setPage(item->data(PageRole).toInt()); +} + +#include "thumbnails.moc" diff --git a/qt4/demos/thumbnails.h b/qt4/demos/thumbnails.h new file mode 100644 index 0000000..076d5ae --- /dev/null +++ b/qt4/demos/thumbnails.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2009, Shawn Rutledge + * Copyright (C) 2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef THUMBNAILS_H +#define THUMBNAILS_H + +#include "abstractinfodock.h" + +class QListWidget; +class QListWidgetItem; + +class ThumbnailsDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + ThumbnailsDock(QWidget *parent = 0); + ~ThumbnailsDock(); + + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private Q_SLOTS: + void slotItemActivated(QListWidgetItem *item); + +private: + QListWidget *m_list; +}; + +#endif diff --git a/qt4/demos/toc.cpp b/qt4/demos/toc.cpp new file mode 100644 index 0000000..bf3e5cb --- /dev/null +++ b/qt4/demos/toc.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "toc.h" + +#include + +#include +#include + +static void fillToc(const QDomNode &parent, QTreeWidget *tree, QTreeWidgetItem *parentItem) +{ + QTreeWidgetItem *newitem = 0; + for (QDomNode node = parent.firstChild(); !node.isNull(); node = node.nextSibling()) { + QDomElement e = node.toElement(); + + if (!parentItem) { + newitem = new QTreeWidgetItem(tree, newitem); + } else { + newitem = new QTreeWidgetItem(parentItem, newitem); + } + newitem->setText(0, e.tagName()); + + bool isOpen = false; + if (e.hasAttribute(QString::fromLatin1("Open"))) { + isOpen = QVariant(e.attribute(QString::fromLatin1("Open"))).toBool(); + } + if (isOpen) { + tree->expandItem(newitem); + } + + if (e.hasChildNodes()) { + fillToc(node, tree, newitem); + } + } +} + + +TocDock::TocDock(QWidget *parent) + : AbstractInfoDock(parent) +{ + m_tree = new QTreeWidget(this); + setWidget(m_tree); + m_tree->setAlternatingRowColors(true); + m_tree->header()->hide(); + setWindowTitle(tr("TOC")); + m_tree->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +TocDock::~TocDock() +{ +} + +void TocDock::fillInfo() +{ + const QDomDocument *toc = document()->toc(); + if (toc) { + fillToc(*toc, m_tree, 0); + } else { + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(0, tr("No TOC")); + item->setFlags(item->flags() & ~Qt::ItemIsEnabled); + m_tree->addTopLevelItem(item); + } +} + +void TocDock::documentClosed() +{ + m_tree->clear(); + AbstractInfoDock::documentClosed(); +} + +#include "toc.moc" diff --git a/qt4/demos/toc.h b/qt4/demos/toc.h new file mode 100644 index 0000000..bbc9082 --- /dev/null +++ b/qt4/demos/toc.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef TOC_H +#define TOC_H + +#include "abstractinfodock.h" + +class QTreeWidget; + +class TocDock : public AbstractInfoDock +{ + Q_OBJECT + +public: + TocDock(QWidget *parent = 0); + ~TocDock(); + + /*virtual*/ void documentClosed(); + +protected: + /*virtual*/ void fillInfo(); + +private: + QTreeWidget *m_tree; +}; + +#endif diff --git a/qt4/demos/viewer.cpp b/qt4/demos/viewer.cpp new file mode 100644 index 0000000..0201eea --- /dev/null +++ b/qt4/demos/viewer.cpp @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2008-2009, Pino Toscano + * Copyright (C) 2008, Albert Astals Cid + * Copyright (C) 2009, Shawn Rutledge + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "viewer.h" + +#include "embeddedfiles.h" +#include "fonts.h" +#include "info.h" +#include "metadata.h" +#include "navigationtoolbar.h" +#include "optcontent.h" +#include "pageview.h" +#include "permissions.h" +#include "thumbnails.h" +#include "toc.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +PdfViewer::PdfViewer() + : QMainWindow(), m_currentPage(0), m_doc(0) +{ + setWindowTitle(tr("Poppler-Qt4 Demo")); + + // setup the menus + QMenu *fileMenu = menuBar()->addMenu(tr("&File")); + m_fileOpenAct = fileMenu->addAction(tr("&Open"), this, SLOT(slotOpenFile())); + m_fileOpenAct->setShortcut(Qt::CTRL + Qt::Key_O); + fileMenu->addSeparator(); + m_fileSaveCopyAct = fileMenu->addAction(tr("&Save a Copy..."), this, SLOT(slotSaveCopy())); + m_fileSaveCopyAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_S); + m_fileSaveCopyAct->setEnabled(false); + fileMenu->addSeparator(); + QAction *act = fileMenu->addAction(tr("&Quit"), qApp, SLOT(closeAllWindows())); + act->setShortcut(Qt::CTRL + Qt::Key_Q); + + QMenu *viewMenu = menuBar()->addMenu(tr("&View")); + + QMenu *settingsMenu = menuBar()->addMenu(tr("&Settings")); + m_settingsTextAAAct = settingsMenu->addAction(tr("Text Antialias")); + m_settingsTextAAAct->setCheckable(true); + connect(m_settingsTextAAAct, SIGNAL(toggled(bool)), this, SLOT(slotToggleTextAA(bool))); + m_settingsGfxAAAct = settingsMenu->addAction(tr("Graphics Antialias")); + m_settingsGfxAAAct->setCheckable(true); + connect(m_settingsGfxAAAct, SIGNAL(toggled(bool)), this, SLOT(slotToggleGfxAA(bool))); + QMenu *settingsRenderMenu = settingsMenu->addMenu(tr("Render Backend")); + m_settingsRenderBackendGrp = new QActionGroup(settingsRenderMenu); + m_settingsRenderBackendGrp->setExclusive(true); + act = settingsRenderMenu->addAction(tr("Splash")); + act->setCheckable(true); + act->setChecked(true); + act->setData(qVariantFromValue(0)); + m_settingsRenderBackendGrp->addAction(act); + act = settingsRenderMenu->addAction(tr("Arthur")); + act->setCheckable(true); + act->setData(qVariantFromValue(1)); + m_settingsRenderBackendGrp->addAction(act); + connect(m_settingsRenderBackendGrp, SIGNAL(triggered(QAction*)), + this, SLOT(slotRenderBackend(QAction*))); + + QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); + act = helpMenu->addAction(tr("&About"), this, SLOT(slotAbout())); + act = helpMenu->addAction(tr("About &Qt"), this, SLOT(slotAboutQt())); + + NavigationToolBar *navbar = new NavigationToolBar(this); + addToolBar(navbar); + m_observers.append(navbar); + + PageView *view = new PageView(this); + setCentralWidget(view); + m_observers.append(view); + + InfoDock *infoDock = new InfoDock(this); + addDockWidget(Qt::LeftDockWidgetArea, infoDock); + infoDock->hide(); + viewMenu->addAction(infoDock->toggleViewAction()); + m_observers.append(infoDock); + + TocDock *tocDock = new TocDock(this); + addDockWidget(Qt::LeftDockWidgetArea, tocDock); + tocDock->hide(); + viewMenu->addAction(tocDock->toggleViewAction()); + m_observers.append(tocDock); + + FontsDock *fontsDock = new FontsDock(this); + addDockWidget(Qt::LeftDockWidgetArea, fontsDock); + fontsDock->hide(); + viewMenu->addAction(fontsDock->toggleViewAction()); + m_observers.append(fontsDock); + + PermissionsDock *permissionsDock = new PermissionsDock(this); + addDockWidget(Qt::LeftDockWidgetArea, permissionsDock); + permissionsDock->hide(); + viewMenu->addAction(permissionsDock->toggleViewAction()); + m_observers.append(permissionsDock); + + ThumbnailsDock *thumbnailsDock = new ThumbnailsDock(this); + addDockWidget(Qt::LeftDockWidgetArea, thumbnailsDock); + thumbnailsDock->hide(); + viewMenu->addAction(thumbnailsDock->toggleViewAction()); + m_observers.append(thumbnailsDock); + + EmbeddedFilesDock *embfilesDock = new EmbeddedFilesDock(this); + addDockWidget(Qt::BottomDockWidgetArea, embfilesDock); + embfilesDock->hide(); + viewMenu->addAction(embfilesDock->toggleViewAction()); + m_observers.append(embfilesDock); + + MetadataDock *metadataDock = new MetadataDock(this); + addDockWidget(Qt::BottomDockWidgetArea, metadataDock); + metadataDock->hide(); + viewMenu->addAction(metadataDock->toggleViewAction()); + m_observers.append(metadataDock); + + OptContentDock *optContentDock = new OptContentDock(this); + addDockWidget(Qt::LeftDockWidgetArea, optContentDock); + optContentDock->hide(); + viewMenu->addAction(optContentDock->toggleViewAction()); + m_observers.append(optContentDock); + + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->m_viewer = this; + } + + connect(navbar, SIGNAL(zoomChanged(qreal)), view, SLOT(slotZoomChanged(qreal))); + + // activate AA by default + m_settingsTextAAAct->setChecked(true); + m_settingsGfxAAAct->setChecked(true); +} + +PdfViewer::~PdfViewer() +{ + closeDocument(); +} + +QSize PdfViewer::sizeHint() const +{ + return QSize(500, 600); +} + +void PdfViewer::loadDocument(const QString &file) +{ + Poppler::Document *newdoc = Poppler::Document::load(file); + if (!newdoc) { + QMessageBox msgbox(QMessageBox::Critical, tr("Open Error"), tr("Cannot open:\n") + file, + QMessageBox::Ok, this); + msgbox.exec(); + return; + } + + while (newdoc->isLocked()) { + bool ok = true; + QString password = QInputDialog::getText(this, tr("Document Password"), + tr("Please insert the password of the document:"), + QLineEdit::Password, QString(), &ok); + if (!ok) { + delete newdoc; + return; + } + newdoc->unlock(password.toLatin1(), password.toLatin1()); + } + + closeDocument(); + + m_doc = newdoc; + + m_doc->setRenderHint(Poppler::Document::TextAntialiasing, m_settingsTextAAAct->isChecked()); + m_doc->setRenderHint(Poppler::Document::Antialiasing, m_settingsGfxAAAct->isChecked()); + m_doc->setRenderBackend((Poppler::Document::RenderBackend)m_settingsRenderBackendGrp->checkedAction()->data().toInt()); + + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->documentLoaded(); + obs->pageChanged(0); + } + + m_fileSaveCopyAct->setEnabled(true); +} + +void PdfViewer::closeDocument() +{ + if (!m_doc) { + return; + } + + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->documentClosed(); + } + + m_currentPage = 0; + delete m_doc; + m_doc = 0; + + m_fileSaveCopyAct->setEnabled(false); +} + +void PdfViewer::slotOpenFile() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open PDF Document"), QDir::homePath(), tr("PDF Documents (*.pdf)")); + if (fileName.isEmpty()) { + return; + } + + loadDocument(fileName); +} + +void PdfViewer::slotSaveCopy() +{ + if (!m_doc) { + return; + } + + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Copy"), QDir::homePath(), tr("PDF Documents (*.pdf)")); + if (fileName.isEmpty()) { + return; + } + + Poppler::PDFConverter *converter = m_doc->pdfConverter(); + converter->setOutputFileName(fileName); + converter->setPDFOptions(converter->pdfOptions() & ~Poppler::PDFConverter::WithChanges); + if (!converter->convert()) { + QMessageBox msgbox(QMessageBox::Critical, tr("Save Error"), tr("Cannot export to:\n%1").arg(fileName), + QMessageBox::Ok, this); + } + delete converter; +} + +void PdfViewer::slotAbout() +{ + const QString text("This is a demo of the Poppler-Qt4 library."); + QMessageBox::about(this, QString::fromLatin1("About Poppler-Qt4 Demo"), text); +} + +void PdfViewer::slotAboutQt() +{ + QMessageBox::aboutQt(this); +} + +void PdfViewer::slotToggleTextAA(bool value) +{ + if (!m_doc) { + return; + } + + m_doc->setRenderHint(Poppler::Document::TextAntialiasing, value); + + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->pageChanged(m_currentPage); + } +} + +void PdfViewer::slotToggleGfxAA(bool value) +{ + if (!m_doc) { + return; + } + + m_doc->setRenderHint(Poppler::Document::Antialiasing, value); + + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->pageChanged(m_currentPage); + } +} + +void PdfViewer::slotRenderBackend(QAction *act) +{ + if (!m_doc || !act) { + return; + } + + m_doc->setRenderBackend((Poppler::Document::RenderBackend)act->data().toInt()); + + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->pageChanged(m_currentPage); + } +} + +void PdfViewer::setPage(int page) +{ + Q_FOREACH(DocumentObserver *obs, m_observers) { + obs->pageChanged(page); + } + + m_currentPage = page; +} + +int PdfViewer::page() const +{ + return m_currentPage; +} + +#include "viewer.moc" diff --git a/qt4/demos/viewer.h b/qt4/demos/viewer.h new file mode 100644 index 0000000..5e0eaaf --- /dev/null +++ b/qt4/demos/viewer.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef PDFVIEWER_H +#define PDFVIEWER_H + +#include + +class QAction; +class QActionGroup; +class QLabel; +class DocumentObserver; +namespace Poppler { +class Document; +} + +class PdfViewer : public QMainWindow +{ + Q_OBJECT + + friend class DocumentObserver; + +public: + PdfViewer(); + ~PdfViewer(); + + /*virtual*/ QSize sizeHint() const; + + void loadDocument(const QString &file); + void closeDocument(); + +private Q_SLOTS: + void slotOpenFile(); + void slotSaveCopy(); + void slotAbout(); + void slotAboutQt(); + void slotToggleTextAA(bool value); + void slotToggleGfxAA(bool value); + void slotRenderBackend(QAction *act); + +private: + void setPage(int page); + int page() const; + + int m_currentPage; + + QAction *m_fileOpenAct; + QAction *m_fileSaveCopyAct; + QAction *m_settingsTextAAAct; + QAction *m_settingsGfxAAAct; + QActionGroup *m_settingsRenderBackendGrp; + + QList m_observers; + + Poppler::Document *m_doc; +}; + +#endif diff --git a/qt4/src/CMakeLists.txt b/qt4/src/CMakeLists.txt new file mode 100644 index 0000000..8b6edaa --- /dev/null +++ b/qt4/src/CMakeLists.txt @@ -0,0 +1,50 @@ +add_definitions(${QT4_DEFINITIONS}) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${QT4_INCLUDE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) + +set(poppler_qt4_SRCS + poppler-annotation.cc + poppler-document.cc + poppler-embeddedfile.cc + poppler-fontinfo.cc + poppler-form.cc + poppler-link.cc + poppler-link-extractor.cc + poppler-movie.cc + poppler-optcontent.cc + poppler-page.cc + poppler-base-converter.cc + poppler-pdf-converter.cc + poppler-private.cc + poppler-ps-converter.cc + poppler-qiodeviceoutstream.cc + poppler-sound.cc + poppler-textbox.cc + poppler-page-transition.cc + poppler-media.cc + ${CMAKE_SOURCE_DIR}/poppler/ArthurOutputDev.cc +) +qt4_automoc(${poppler_qt4_SRCS}) +add_library(poppler-qt4 SHARED ${poppler_qt4_SRCS}) +set_target_properties(poppler-qt4 PROPERTIES VERSION 4.0.0 SOVERSION 4) +target_link_libraries(poppler-qt4 poppler ${QT4_QTCORE_LIBRARY} ${QT4_QTGUI_LIBRARY} ${QT4_QTXML_LIBRARY}) +if(MSVC) +target_link_libraries(poppler-qt4 poppler ${poppler_LIBS}) +endif(MSVC) +install(TARGETS poppler-qt4 RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) + +install(FILES + poppler-qt4.h + poppler-link.h + poppler-annotation.h + poppler-form.h + poppler-optcontent.h + poppler-export.h + poppler-page-transition.h + poppler-media.h + DESTINATION include/poppler/qt4) + diff --git a/qt4/src/Makefile.am b/qt4/src/Makefile.am new file mode 100644 index 0000000..02e0720 --- /dev/null +++ b/qt4/src/Makefile.am @@ -0,0 +1,74 @@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_QT4_CFLAGS) + +SUFFIXES: .moc + +poppler_includedir = $(includedir)/poppler/qt4 + +poppler_include_HEADERS = \ + poppler-qt4.h \ + poppler-link.h \ + poppler-annotation.h \ + poppler-form.h \ + poppler-optcontent.h \ + poppler-export.h \ + poppler-media.h \ + poppler-page-transition.h + +lib_LTLIBRARIES = libpoppler-qt4.la + +libpoppler_qt4_la_SOURCES = \ + poppler-document.cc \ + poppler-page.cc \ + poppler-fontinfo.cc \ + poppler-embeddedfile.cc \ + poppler-textbox.cc \ + poppler-link.cc \ + poppler-annotation.cc \ + poppler-link-extractor.cc \ + poppler-optcontent.cc \ + poppler-optcontent.h \ + poppler-page-transition.cc \ + poppler-sound.cc \ + poppler-form.cc \ + poppler-base-converter.cc \ + poppler-ps-converter.cc \ + poppler-pdf-converter.cc \ + poppler-qiodeviceoutstream.cc \ + poppler-private.cc \ + poppler-movie.cc \ + poppler-media.cc \ + poppler-annotation-helper.h \ + poppler-page-private.h \ + poppler-link-extractor-private.h \ + poppler-annotation-private.h \ + poppler-converter-private.h \ + poppler-qiodeviceoutstream-private.h \ + poppler-optcontent-private.h \ + poppler-export.h \ + poppler-private.h \ + poppler-page-transition-private.h \ + poppler-embeddedfile-private.h + +libpoppler_qt4_la_CXXFLAGS = \ + -Dpoppler_qt4_EXPORTS + +libpoppler_qt4_la_LIBADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/poppler/libpoppler-arthur.la \ + $(FONTCONFIG_LIBS) \ + $(POPPLER_QT4_LIBS) + +libpoppler_qt4_la_LDFLAGS = -version-info 4:0:0 @create_shared_lib@ @auto_import_flags@ + +# This rule lets GNU make create any *.moc from the equivalent *.h +.h.moc: + $(AM_V_GEN) $(MOCQT4) -i $< -o $@ + +BUILT_SOURCES = poppler-optcontent.moc + +clean-generic: + rm -f *.moc diff --git a/qt4/src/Makefile.in b/qt4/src/Makefile.in new file mode 100644 index 0000000..6308498 --- /dev/null +++ b/qt4/src/Makefile.in @@ -0,0 +1,948 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = qt4/src +DIST_COMMON = $(poppler_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(poppler_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libpoppler_qt4_la_DEPENDENCIES = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/poppler/libpoppler-arthur.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libpoppler_qt4_la_OBJECTS = libpoppler_qt4_la-poppler-document.lo \ + libpoppler_qt4_la-poppler-page.lo \ + libpoppler_qt4_la-poppler-fontinfo.lo \ + libpoppler_qt4_la-poppler-embeddedfile.lo \ + libpoppler_qt4_la-poppler-textbox.lo \ + libpoppler_qt4_la-poppler-link.lo \ + libpoppler_qt4_la-poppler-annotation.lo \ + libpoppler_qt4_la-poppler-link-extractor.lo \ + libpoppler_qt4_la-poppler-optcontent.lo \ + libpoppler_qt4_la-poppler-page-transition.lo \ + libpoppler_qt4_la-poppler-sound.lo \ + libpoppler_qt4_la-poppler-form.lo \ + libpoppler_qt4_la-poppler-base-converter.lo \ + libpoppler_qt4_la-poppler-ps-converter.lo \ + libpoppler_qt4_la-poppler-pdf-converter.lo \ + libpoppler_qt4_la-poppler-qiodeviceoutstream.lo \ + libpoppler_qt4_la-poppler-private.lo \ + libpoppler_qt4_la-poppler-movie.lo \ + libpoppler_qt4_la-poppler-media.lo +libpoppler_qt4_la_OBJECTS = $(am_libpoppler_qt4_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +libpoppler_qt4_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) \ + $(libpoppler_qt4_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libpoppler_qt4_la_SOURCES) +DIST_SOURCES = $(libpoppler_qt4_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(poppler_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_QT4_CFLAGS) + +poppler_includedir = $(includedir)/poppler/qt4 +poppler_include_HEADERS = \ + poppler-qt4.h \ + poppler-link.h \ + poppler-annotation.h \ + poppler-form.h \ + poppler-optcontent.h \ + poppler-export.h \ + poppler-media.h \ + poppler-page-transition.h + +lib_LTLIBRARIES = libpoppler-qt4.la +libpoppler_qt4_la_SOURCES = \ + poppler-document.cc \ + poppler-page.cc \ + poppler-fontinfo.cc \ + poppler-embeddedfile.cc \ + poppler-textbox.cc \ + poppler-link.cc \ + poppler-annotation.cc \ + poppler-link-extractor.cc \ + poppler-optcontent.cc \ + poppler-optcontent.h \ + poppler-page-transition.cc \ + poppler-sound.cc \ + poppler-form.cc \ + poppler-base-converter.cc \ + poppler-ps-converter.cc \ + poppler-pdf-converter.cc \ + poppler-qiodeviceoutstream.cc \ + poppler-private.cc \ + poppler-movie.cc \ + poppler-media.cc \ + poppler-annotation-helper.h \ + poppler-page-private.h \ + poppler-link-extractor-private.h \ + poppler-annotation-private.h \ + poppler-converter-private.h \ + poppler-qiodeviceoutstream-private.h \ + poppler-optcontent-private.h \ + poppler-export.h \ + poppler-private.h \ + poppler-page-transition-private.h \ + poppler-embeddedfile-private.h + +libpoppler_qt4_la_CXXFLAGS = \ + -Dpoppler_qt4_EXPORTS + +libpoppler_qt4_la_LIBADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/poppler/libpoppler-arthur.la \ + $(FONTCONFIG_LIBS) \ + $(POPPLER_QT4_LIBS) + +libpoppler_qt4_la_LDFLAGS = -version-info 4:0:0 @create_shared_lib@ @auto_import_flags@ +BUILT_SOURCES = poppler-optcontent.moc +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cc .h .lo .moc .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign qt4/src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libpoppler-qt4.la: $(libpoppler_qt4_la_OBJECTS) $(libpoppler_qt4_la_DEPENDENCIES) $(EXTRA_libpoppler_qt4_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libpoppler_qt4_la_LINK) -rpath $(libdir) $(libpoppler_qt4_la_OBJECTS) $(libpoppler_qt4_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-document.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-form.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-link.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-media.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-movie.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-page.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-private.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-sound.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libpoppler_qt4_la-poppler-document.lo: poppler-document.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-document.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-document.Tpo -c -o libpoppler_qt4_la-poppler-document.lo `test -f 'poppler-document.cc' || echo '$(srcdir)/'`poppler-document.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-document.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-document.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-document.cc' object='libpoppler_qt4_la-poppler-document.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-document.lo `test -f 'poppler-document.cc' || echo '$(srcdir)/'`poppler-document.cc + +libpoppler_qt4_la-poppler-page.lo: poppler-page.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-page.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-page.Tpo -c -o libpoppler_qt4_la-poppler-page.lo `test -f 'poppler-page.cc' || echo '$(srcdir)/'`poppler-page.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-page.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-page.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-page.cc' object='libpoppler_qt4_la-poppler-page.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-page.lo `test -f 'poppler-page.cc' || echo '$(srcdir)/'`poppler-page.cc + +libpoppler_qt4_la-poppler-fontinfo.lo: poppler-fontinfo.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-fontinfo.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Tpo -c -o libpoppler_qt4_la-poppler-fontinfo.lo `test -f 'poppler-fontinfo.cc' || echo '$(srcdir)/'`poppler-fontinfo.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-fontinfo.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-fontinfo.cc' object='libpoppler_qt4_la-poppler-fontinfo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-fontinfo.lo `test -f 'poppler-fontinfo.cc' || echo '$(srcdir)/'`poppler-fontinfo.cc + +libpoppler_qt4_la-poppler-embeddedfile.lo: poppler-embeddedfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-embeddedfile.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Tpo -c -o libpoppler_qt4_la-poppler-embeddedfile.lo `test -f 'poppler-embeddedfile.cc' || echo '$(srcdir)/'`poppler-embeddedfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-embeddedfile.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-embeddedfile.cc' object='libpoppler_qt4_la-poppler-embeddedfile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-embeddedfile.lo `test -f 'poppler-embeddedfile.cc' || echo '$(srcdir)/'`poppler-embeddedfile.cc + +libpoppler_qt4_la-poppler-textbox.lo: poppler-textbox.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-textbox.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Tpo -c -o libpoppler_qt4_la-poppler-textbox.lo `test -f 'poppler-textbox.cc' || echo '$(srcdir)/'`poppler-textbox.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-textbox.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-textbox.cc' object='libpoppler_qt4_la-poppler-textbox.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-textbox.lo `test -f 'poppler-textbox.cc' || echo '$(srcdir)/'`poppler-textbox.cc + +libpoppler_qt4_la-poppler-link.lo: poppler-link.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-link.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-link.Tpo -c -o libpoppler_qt4_la-poppler-link.lo `test -f 'poppler-link.cc' || echo '$(srcdir)/'`poppler-link.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-link.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-link.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-link.cc' object='libpoppler_qt4_la-poppler-link.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-link.lo `test -f 'poppler-link.cc' || echo '$(srcdir)/'`poppler-link.cc + +libpoppler_qt4_la-poppler-annotation.lo: poppler-annotation.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-annotation.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Tpo -c -o libpoppler_qt4_la-poppler-annotation.lo `test -f 'poppler-annotation.cc' || echo '$(srcdir)/'`poppler-annotation.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-annotation.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-annotation.cc' object='libpoppler_qt4_la-poppler-annotation.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-annotation.lo `test -f 'poppler-annotation.cc' || echo '$(srcdir)/'`poppler-annotation.cc + +libpoppler_qt4_la-poppler-link-extractor.lo: poppler-link-extractor.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-link-extractor.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Tpo -c -o libpoppler_qt4_la-poppler-link-extractor.lo `test -f 'poppler-link-extractor.cc' || echo '$(srcdir)/'`poppler-link-extractor.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-link-extractor.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-link-extractor.cc' object='libpoppler_qt4_la-poppler-link-extractor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-link-extractor.lo `test -f 'poppler-link-extractor.cc' || echo '$(srcdir)/'`poppler-link-extractor.cc + +libpoppler_qt4_la-poppler-optcontent.lo: poppler-optcontent.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-optcontent.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Tpo -c -o libpoppler_qt4_la-poppler-optcontent.lo `test -f 'poppler-optcontent.cc' || echo '$(srcdir)/'`poppler-optcontent.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-optcontent.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-optcontent.cc' object='libpoppler_qt4_la-poppler-optcontent.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-optcontent.lo `test -f 'poppler-optcontent.cc' || echo '$(srcdir)/'`poppler-optcontent.cc + +libpoppler_qt4_la-poppler-page-transition.lo: poppler-page-transition.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-page-transition.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Tpo -c -o libpoppler_qt4_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cc' || echo '$(srcdir)/'`poppler-page-transition.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-page-transition.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-page-transition.cc' object='libpoppler_qt4_la-poppler-page-transition.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-page-transition.lo `test -f 'poppler-page-transition.cc' || echo '$(srcdir)/'`poppler-page-transition.cc + +libpoppler_qt4_la-poppler-sound.lo: poppler-sound.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-sound.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-sound.Tpo -c -o libpoppler_qt4_la-poppler-sound.lo `test -f 'poppler-sound.cc' || echo '$(srcdir)/'`poppler-sound.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-sound.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-sound.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-sound.cc' object='libpoppler_qt4_la-poppler-sound.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-sound.lo `test -f 'poppler-sound.cc' || echo '$(srcdir)/'`poppler-sound.cc + +libpoppler_qt4_la-poppler-form.lo: poppler-form.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-form.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-form.Tpo -c -o libpoppler_qt4_la-poppler-form.lo `test -f 'poppler-form.cc' || echo '$(srcdir)/'`poppler-form.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-form.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-form.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-form.cc' object='libpoppler_qt4_la-poppler-form.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-form.lo `test -f 'poppler-form.cc' || echo '$(srcdir)/'`poppler-form.cc + +libpoppler_qt4_la-poppler-base-converter.lo: poppler-base-converter.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-base-converter.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Tpo -c -o libpoppler_qt4_la-poppler-base-converter.lo `test -f 'poppler-base-converter.cc' || echo '$(srcdir)/'`poppler-base-converter.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-base-converter.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-base-converter.cc' object='libpoppler_qt4_la-poppler-base-converter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-base-converter.lo `test -f 'poppler-base-converter.cc' || echo '$(srcdir)/'`poppler-base-converter.cc + +libpoppler_qt4_la-poppler-ps-converter.lo: poppler-ps-converter.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-ps-converter.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Tpo -c -o libpoppler_qt4_la-poppler-ps-converter.lo `test -f 'poppler-ps-converter.cc' || echo '$(srcdir)/'`poppler-ps-converter.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-ps-converter.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-ps-converter.cc' object='libpoppler_qt4_la-poppler-ps-converter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-ps-converter.lo `test -f 'poppler-ps-converter.cc' || echo '$(srcdir)/'`poppler-ps-converter.cc + +libpoppler_qt4_la-poppler-pdf-converter.lo: poppler-pdf-converter.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-pdf-converter.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Tpo -c -o libpoppler_qt4_la-poppler-pdf-converter.lo `test -f 'poppler-pdf-converter.cc' || echo '$(srcdir)/'`poppler-pdf-converter.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-pdf-converter.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-pdf-converter.cc' object='libpoppler_qt4_la-poppler-pdf-converter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-pdf-converter.lo `test -f 'poppler-pdf-converter.cc' || echo '$(srcdir)/'`poppler-pdf-converter.cc + +libpoppler_qt4_la-poppler-qiodeviceoutstream.lo: poppler-qiodeviceoutstream.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-qiodeviceoutstream.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Tpo -c -o libpoppler_qt4_la-poppler-qiodeviceoutstream.lo `test -f 'poppler-qiodeviceoutstream.cc' || echo '$(srcdir)/'`poppler-qiodeviceoutstream.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-qiodeviceoutstream.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-qiodeviceoutstream.cc' object='libpoppler_qt4_la-poppler-qiodeviceoutstream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-qiodeviceoutstream.lo `test -f 'poppler-qiodeviceoutstream.cc' || echo '$(srcdir)/'`poppler-qiodeviceoutstream.cc + +libpoppler_qt4_la-poppler-private.lo: poppler-private.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-private.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-private.Tpo -c -o libpoppler_qt4_la-poppler-private.lo `test -f 'poppler-private.cc' || echo '$(srcdir)/'`poppler-private.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-private.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-private.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-private.cc' object='libpoppler_qt4_la-poppler-private.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-private.lo `test -f 'poppler-private.cc' || echo '$(srcdir)/'`poppler-private.cc + +libpoppler_qt4_la-poppler-movie.lo: poppler-movie.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-movie.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-movie.Tpo -c -o libpoppler_qt4_la-poppler-movie.lo `test -f 'poppler-movie.cc' || echo '$(srcdir)/'`poppler-movie.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-movie.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-movie.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-movie.cc' object='libpoppler_qt4_la-poppler-movie.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-movie.lo `test -f 'poppler-movie.cc' || echo '$(srcdir)/'`poppler-movie.cc + +libpoppler_qt4_la-poppler-media.lo: poppler-media.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -MT libpoppler_qt4_la-poppler-media.lo -MD -MP -MF $(DEPDIR)/libpoppler_qt4_la-poppler-media.Tpo -c -o libpoppler_qt4_la-poppler-media.lo `test -f 'poppler-media.cc' || echo '$(srcdir)/'`poppler-media.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpoppler_qt4_la-poppler-media.Tpo $(DEPDIR)/libpoppler_qt4_la-poppler-media.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='poppler-media.cc' object='libpoppler_qt4_la-poppler-media.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpoppler_qt4_la_CXXFLAGS) $(CXXFLAGS) -c -o libpoppler_qt4_la-poppler-media.lo `test -f 'poppler-media.cc' || echo '$(srcdir)/'`poppler-media.cc + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-poppler_includeHEADERS: $(poppler_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_includedir)" || exit $$?; \ + done + +uninstall-poppler_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_include_HEADERS)'; test -n "$(poppler_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_includedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(poppler_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-poppler_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES \ + uninstall-poppler_includeHEADERS + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-poppler_includeHEADERS install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-libLTLIBRARIES uninstall-poppler_includeHEADERS + + +SUFFIXES: .moc + +# This rule lets GNU make create any *.moc from the equivalent *.h +.h.moc: + $(AM_V_GEN) $(MOCQT4) -i $< -o $@ + +clean-generic: + rm -f *.moc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/qt4/src/poppler-annotation-helper.h b/qt4/src/poppler-annotation-helper.h new file mode 100644 index 0000000..5f335c0 --- /dev/null +++ b/qt4/src/poppler-annotation-helper.h @@ -0,0 +1,198 @@ +/* poppler-annotation-helper.h: qt interface to poppler + * Copyright (C) 2006, 2008, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * Copyright (C) 2012, Fabio D'Urso + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include + +class QColor; + +class AnnotColor; + +namespace Poppler { + +class XPDFReader +{ + public: + // find named symbol and parse it + static inline void lookupName( Dict *, char *, QString & dest ); + static inline void lookupString( Dict *, char *, QString & dest ); + static inline void lookupBool( Dict *, char *, bool & dest ); + static inline void lookupInt( Dict *, char *, int & dest ); + static inline void lookupNum( Dict *, char *, double & dest ); + static inline int lookupNumArray( Dict *, char *, double * dest, int len ); + static inline void lookupColor( Dict *, char *, QColor & color ); + static inline void lookupIntRef( Dict *, char *, int & dest ); + static inline void lookupDate( Dict *, char *, QDateTime & dest ); + // transform from user coords to normalized ones using the matrix M + static inline void transform( double * M, double x, double y, QPointF &res ); + static inline void invTransform( double * M, const QPointF &p, double &x, double &y ); +}; + +void XPDFReader::lookupName( Dict * dict, char * type, QString & dest ) +{ + Object nameObj; + dict->lookup( type, &nameObj ); + if ( nameObj.isNull() ) + return; + if ( nameObj.isName() ) + dest = nameObj.getName(); + else + qDebug() << type << " is not Name." << endl; + nameObj.free(); +} + +void XPDFReader::lookupString( Dict * dict, char * type, QString & dest ) +{ + Object stringObj; + dict->lookup( type, &stringObj ); + if ( stringObj.isNull() ) + return; + if ( stringObj.isString() ) + dest = stringObj.getString()->getCString(); + else + qDebug() << type << " is not String." << endl; + stringObj.free(); +} + +void XPDFReader::lookupBool( Dict * dict, char * type, bool & dest ) +{ + Object boolObj; + dict->lookup( type, &boolObj ); + if ( boolObj.isNull() ) + return; + if ( boolObj.isBool() ) + dest = boolObj.getBool() == gTrue; + else + qDebug() << type << " is not Bool." << endl; + boolObj.free(); +} + +void XPDFReader::lookupInt( Dict * dict, char * type, int & dest ) +{ + Object intObj; + dict->lookup( type, &intObj ); + if ( intObj.isNull() ) + return; + if ( intObj.isInt() ) + dest = intObj.getInt(); + else + qDebug() << type << " is not Int." << endl; + intObj.free(); +} + +void XPDFReader::lookupNum( Dict * dict, char * type, double & dest ) +{ + Object numObj; + dict->lookup( type, &numObj ); + if ( numObj.isNull() ) + return; + if ( numObj.isNum() ) + dest = numObj.getNum(); + else + qDebug() << type << " is not Num." << endl; + numObj.free(); +} + +int XPDFReader::lookupNumArray( Dict * dict, char * type, double * dest, int len ) +{ + Object arrObj; + dict->lookup( type, &arrObj ); + if ( arrObj.isNull() ) + return 0; + Object numObj; + if ( arrObj.isArray() ) + { + len = qMin( len, arrObj.arrayGetLength() ); + for ( int i = 0; i < len; i++ ) + { + dest[i] = arrObj.arrayGet( i, &numObj )->getNum(); + numObj.free(); + } + } + else + { + len = 0; + qDebug() << type << "is not Array." << endl; + } + arrObj.free(); + return len; +} + +void XPDFReader::lookupColor( Dict * dict, char * type, QColor & dest ) +{ + double c[3]; + if ( XPDFReader::lookupNumArray( dict, type, c, 3 ) == 3 ) + dest = QColor( (int)(c[0]*255.0), (int)(c[1]*255.0), (int)(c[2]*255.0)); +} + +void XPDFReader::lookupIntRef( Dict * dict, char * type, int & dest ) +{ + Object refObj; + dict->lookupNF( type, &refObj ); + if ( refObj.isNull() ) + return; + if ( refObj.isRef() ) + dest = refObj.getRefNum(); + else + qDebug() << type << " is not Ref." << endl; + refObj.free(); +} + +void XPDFReader::lookupDate( Dict * dict, char * type, QDateTime & dest ) +{ + Object dateObj; + dict->lookup( type, &dateObj ); + if ( dateObj.isNull() ) + return; + if ( dateObj.isString() ) + { + dest = convertDate( dateObj.getString()->getCString() ); + } + else + qDebug() << type << " is not Date" << endl; + dateObj.free(); +} + +void XPDFReader::transform( double * M, double x, double y, QPointF &res ) +{ + res.setX( M[0] * x + M[2] * y + M[4] ); + res.setY( M[1] * x + M[3] * y + M[5] ); +} + +void XPDFReader::invTransform( double * M, const QPointF &p, double &x, double &y ) +{ + const double det = M[0]*M[3] - M[1]*M[2]; + Q_ASSERT(det != 0); + + const double invM[4] = { M[3]/det, -M[1]/det, -M[2]/det, M[0]/det }; + const double xt = p.x() - M[4]; + const double yt = p.y() - M[5]; + + x = invM[0] * xt + invM[2] * yt; + y = invM[1] * xt + invM[3] * yt; +} + +QColor convertAnnotColor( AnnotColor *color ); +AnnotColor* convertQColor( const QColor &color ); + +} diff --git a/qt4/src/poppler-annotation-private.h b/qt4/src/poppler-annotation-private.h new file mode 100644 index 0000000..2ee7d77 --- /dev/null +++ b/qt4/src/poppler-annotation-private.h @@ -0,0 +1,107 @@ +/* poppler-link-extractor-private.h: qt interface to poppler + * Copyright (C) 2007, Pino Toscano + * Copyright (C) 2012, Tobias Koenig + * Copyright (C) 2012, Fabio D'Urso + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_ANNOTATION_PRIVATE_H_ +#define _POPPLER_ANNOTATION_PRIVATE_H_ + +#include +#include +#include + +#include "poppler-annotation.h" + +#include + +class Annot; +class AnnotPath; +class Page; +class PDFRectangle; + +namespace Poppler +{ +class DocumentData; + +class AnnotationPrivate : public QSharedData +{ + public: + AnnotationPrivate(); + virtual ~AnnotationPrivate(); + + void addRevision(Annotation *ann, Annotation::RevScope scope, Annotation::RevType type); + + /* Returns an Annotation of the right subclass whose d_ptr points to + * this AnnotationPrivate */ + virtual Annotation * makeAlias() = 0; + + /* properties: contents related */ + QString author; + QString contents; + QString uniqueName; + QDateTime modDate; // before or equal to currentDateTime() + QDateTime creationDate; // before or equal to modifyDate + + /* properties: look/interaction related */ + int flags; + QRectF boundary; + + /* style and popup */ + Annotation::Style style; + Annotation::Popup popup; + + /* revisions */ + Annotation::RevScope revisionScope; + Annotation::RevType revisionType; + QList revisions; + + /* After this call, the Annotation object will behave like a wrapper for + * the specified Annot object. All cached values are discarded */ + void tieToNativeAnnot(Annot *ann, ::Page *page, DocumentData *doc); + + /* Creates a new Annot object on the specified page, flushes current + * values to that object and ties this Annotation to that object */ + virtual Annot* createNativeAnnot(::Page *destPage, DocumentData *doc) = 0; + + /* Inited to 0 (i.e. untied annotation) */ + Annot *pdfAnnot; + ::Page *pdfPage; + DocumentData * parentDoc; + + /* The following helpers only work if pdfPage is set */ + void flushBaseAnnotationProperties(); + void fillMTX(double MTX[6]) const; + QRectF fromPdfRectangle(const PDFRectangle &r) const; + PDFRectangle toPdfRectangle(const QRectF &r) const; + AnnotPath * toAnnotPath(const QLinkedList &l) const; + + /* Scan page for annotations, parentId=0 searches for root annotations */ + static QList findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0); + + /* Add given annotation to given page */ + static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann); + + /* Remove annotation from page and destroy ann */ + static void removeAnnotationFromPage(::Page *pdfPage, const Annotation * ann); + + Ref pdfObjectReference() const; +}; + +} + +#endif diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc new file mode 100644 index 0000000..67dbbae --- /dev/null +++ b/qt4/src/poppler-annotation.cc @@ -0,0 +1,4307 @@ +/* poppler-annotation.cc: qt interface to poppler + * Copyright (C) 2006, 2009, 2012 Albert Astals Cid + * Copyright (C) 2006, 2008, 2010 Pino Toscano + * Copyright (C) 2012, Guillermo A. Amaral B. + * Copyright (C) 2012, Fabio D'Urso + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// qt/kde includes +#include +#include +#include +#include + +// local includes +#include "poppler-annotation.h" +#include "poppler-link.h" +#include "poppler-qt4.h" +#include "poppler-annotation-helper.h" +#include "poppler-annotation-private.h" +#include "poppler-page-private.h" +#include "poppler-private.h" + +// poppler includes +#include +#include +#include +#include +#include + +/* Almost all getters directly query the underlying poppler annotation, with + * the exceptions of link, file attachment, sound, movie and screen annotations, + * Whose data retrieval logic has not been moved yet. Their getters return + * static data set at creation time by findAnnotations + */ + +namespace Poppler { + +//BEGIN AnnotationUtils implementation +Annotation * AnnotationUtils::createAnnotation( const QDomElement & annElement ) +{ + // safety check on annotation element + if ( !annElement.hasAttribute( "type" ) ) + return 0; + + // build annotation of given type + Annotation * annotation = 0; + int typeNumber = annElement.attribute( "type" ).toInt(); + switch ( typeNumber ) + { + case Annotation::AText: + annotation = new TextAnnotation( annElement ); + break; + case Annotation::ALine: + annotation = new LineAnnotation( annElement ); + break; + case Annotation::AGeom: + annotation = new GeomAnnotation( annElement ); + break; + case Annotation::AHighlight: + annotation = new HighlightAnnotation( annElement ); + break; + case Annotation::AStamp: + annotation = new StampAnnotation( annElement ); + break; + case Annotation::AInk: + annotation = new InkAnnotation( annElement ); + break; + case Annotation::ACaret: + annotation = new CaretAnnotation( annElement ); + break; + } + + // return created annotation + return annotation; +} + +void AnnotationUtils::storeAnnotation( const Annotation * ann, QDomElement & annElement, + QDomDocument & document ) +{ + // save annotation's type as element's attribute + annElement.setAttribute( "type", (uint)ann->subType() ); + + // append all annotation data as children of this node + ann->store( annElement, document ); +} + +QDomElement AnnotationUtils::findChildElement( const QDomNode & parentNode, + const QString & name ) +{ + // loop through the whole children and return a 'name' named element + QDomNode subNode = parentNode.firstChild(); + while( subNode.isElement() ) + { + QDomElement element = subNode.toElement(); + if ( element.tagName() == name ) + return element; + subNode = subNode.nextSibling(); + } + // if the name can't be found, return a dummy null element + return QDomElement(); +} +//END AnnotationUtils implementation + + +//BEGIN Annotation implementation +AnnotationPrivate::AnnotationPrivate() + : flags( 0 ), revisionScope ( Annotation::Root ), + revisionType ( Annotation::None ), pdfAnnot ( 0 ), pdfPage ( 0 ), + parentDoc ( 0 ) +{ +} + +void AnnotationPrivate::addRevision( Annotation *ann, Annotation::RevScope scope, Annotation::RevType type ) +{ + /* Since ownership stays with the caller, create an alias of ann */ + revisions.append( ann->d_ptr->makeAlias() ); + + /* Set revision properties */ + revisionScope = scope; + revisionType = type; +} + +AnnotationPrivate::~AnnotationPrivate() +{ + // Delete all children revisions + qDeleteAll( revisions ); + + // Release Annot object + if (pdfAnnot) + pdfAnnot->decRefCnt(); +} + +void AnnotationPrivate::tieToNativeAnnot(Annot *ann, ::Page *page, Poppler::DocumentData * doc) +{ + if (pdfAnnot) + { + error(errIO, -1, "Annotation is already tied"); + return; + } + + pdfAnnot = ann; + pdfPage = page; + parentDoc = doc; + + pdfAnnot->incRefCnt(); +} + +/* This method is called when a new annotation is created, after pdfAnnot and + * pdfPage have been set */ +void AnnotationPrivate::flushBaseAnnotationProperties() +{ + Q_ASSERT ( pdfPage ); + + Annotation *q = makeAlias(); // Setters are defined in the public class + + // Since pdfAnnot has been set, this calls will write in the Annot object + q->setAuthor(author); + q->setContents(contents); + q->setUniqueName(uniqueName); + q->setModificationDate(modDate); + q->setCreationDate(creationDate); + q->setFlags(flags); + //q->setBoundary(boundary); -- already set by subclass-specific code + q->setStyle(style); + q->setPopup(popup); + + // Flush revisions + foreach (Annotation *r, revisions) + { + // TODO: Flush revision + delete r; // Object is no longer needed + } + + delete q; + + // Clear some members to save memory + author.clear(); + contents.clear(); + uniqueName.clear(); + revisions.clear(); +} + +void AnnotationPrivate::fillMTX(double MTX[6]) const +{ + Q_ASSERT ( pdfPage ); + + // build a normalized transform matrix for this page at 100% scale + GfxState * gfxState = new GfxState( 72.0, 72.0, pdfPage->getCropBox(), pdfPage->getRotate(), gTrue ); + double * gfxCTM = gfxState->getCTM(); + + double w = pdfPage->getCropWidth(); + double h = pdfPage->getCropHeight(); + + // Swap width and height if the page is rotated landscape or seascape + if ( pdfPage->getRotate() == 90 || pdfPage->getRotate() == 270 ) + { + double t = w; + w = h; + h = t; + } + + for ( int i = 0; i < 6; i+=2 ) + { + MTX[i] = gfxCTM[i] / w; + MTX[i+1] = gfxCTM[i+1] / h; + } + delete gfxState; +} + +QRectF AnnotationPrivate::fromPdfRectangle(const PDFRectangle &r) const +{ + double swp, MTX[6]; + fillMTX(MTX); + + QPointF p1, p2; + XPDFReader::transform( MTX, r.x1, r.y1, p1 ); + XPDFReader::transform( MTX, r.x2, r.y2, p2 ); + + double tl_x = p1.x(); + double tl_y = p1.y(); + double br_x = p2.x(); + double br_y = p2.y(); + + if (tl_x > br_x) + { + swp = tl_x; + tl_x = br_x; + br_x = swp; + } + + if (tl_y > br_y) + { + swp = tl_y; + tl_y = br_y; + br_y = swp; + } + + return QRectF( QPointF(tl_x,tl_y) , QPointF(br_x,br_y) ); +} + +PDFRectangle AnnotationPrivate::toPdfRectangle(const QRectF &r) const +{ + double MTX[6]; + fillMTX(MTX); + + double tl_x, tl_y, br_x, br_y, swp; + XPDFReader::invTransform( MTX, r.topLeft(), tl_x, tl_y ); + XPDFReader::invTransform( MTX, r.bottomRight(), br_x, br_y ); + + if (tl_x > br_x) + { + swp = tl_x; + tl_x = br_x; + br_x = swp; + } + + if (tl_y > br_y) + { + swp = tl_y; + tl_y = br_y; + br_y = swp; + } + + return PDFRectangle(tl_x, tl_y, br_x, br_y); +} + +AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList &list) const +{ + const int count = list.size(); + AnnotCoord **ac = (AnnotCoord **) gmallocn(count, sizeof(AnnotCoord*)); + + double MTX[6]; + fillMTX(MTX); + + int pos = 0; + foreach (const QPointF &p, list) + { + double x, y; + XPDFReader::invTransform( MTX, p, x, y ); + ac[pos++] = new AnnotCoord(x, y); + } + + return new AnnotPath(ac, count); +} + +QList AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, int parentID) +{ + Annots* annots = pdfPage->getAnnots(); + const uint numAnnotations = annots->getNumAnnots(); + if ( numAnnotations == 0 ) + { + return QList(); + } + + // Create Annotation objects and tie to their native Annot + QList res; + for ( uint j = 0; j < numAnnotations; j++ ) + { + // get the j-th annotation + Annot * ann = annots->getAnnot( j ); + if ( !ann ) + { + error(errInternal, -1, "Annot %u is null", j); + continue; + } + + // Check parent annotation + AnnotMarkup * markupann = dynamic_cast< AnnotMarkup * >( ann ); + if (!markupann) + { + // Assume it's a root annotation, and skip if user didn't request it + if (parentID != 0) + continue; + } + else if (markupann->getInReplyToID() != parentID) + continue; + + /* Create Annotation of the right subclass */ + Annotation * annotation = 0; + Annot::AnnotSubtype subType = ann->getType(); + + switch ( subType ) + { + case Annot::typeText: + annotation = new TextAnnotation(TextAnnotation::Linked); + break; + case Annot::typeFreeText: + annotation = new TextAnnotation(TextAnnotation::InPlace); + break; + case Annot::typeLine: + annotation = new LineAnnotation(LineAnnotation::StraightLine); + break; + case Annot::typePolygon: + case Annot::typePolyLine: + annotation = new LineAnnotation(LineAnnotation::Polyline); + break; + case Annot::typeSquare: + case Annot::typeCircle: + annotation = new GeomAnnotation(); + break; + case Annot::typeHighlight: + case Annot::typeUnderline: + case Annot::typeSquiggly: + case Annot::typeStrikeOut: + annotation = new HighlightAnnotation(); + break; + case Annot::typeStamp: + annotation = new StampAnnotation(); + break; + case Annot::typeInk: + annotation = new InkAnnotation(); + break; + case Annot::typeLink: /* TODO: Move logic to getters */ + { + // parse Link params + AnnotLink * linkann = static_cast< AnnotLink * >( ann ); + LinkAnnotation * l = new LinkAnnotation(); + annotation = l; + + // -> hlMode + l->setLinkHighlightMode( (LinkAnnotation::HighlightMode)linkann->getLinkEffect() ); + + // -> link region + // TODO + + // reading link action + if ( linkann->getAction() ) + { + Link * popplerLink = PageData::convertLinkActionToLink( linkann->getAction(), doc, QRectF() ); + if ( popplerLink ) + { + l->setLinkDestination( popplerLink ); + } + } + break; + } + case Annot::typeCaret: + annotation = new CaretAnnotation(); + break; + case Annot::typeFileAttachment: /* TODO: Move logic to getters */ + { + AnnotFileAttachment * attachann = static_cast< AnnotFileAttachment * >( ann ); + FileAttachmentAnnotation * f = new FileAttachmentAnnotation(); + annotation = f; + // -> fileIcon + f->setFileIconName( QString::fromLatin1( attachann->getName()->getCString() ) ); + // -> embeddedFile + FileSpec *filespec = new FileSpec( attachann->getFile() ); + f->setEmbeddedFile( new EmbeddedFile( *new EmbeddedFileData( filespec ) ) ); + break; + } + case Annot::typeSound: /* TODO: Move logic to getters */ + { + AnnotSound * soundann = static_cast< AnnotSound * >( ann ); + SoundAnnotation * s = new SoundAnnotation(); + annotation = s; + + // -> soundIcon + s->setSoundIconName( QString::fromLatin1( soundann->getName()->getCString() ) ); + // -> sound + s->setSound( new SoundObject( soundann->getSound() ) ); + break; + } + case Annot::typeMovie: /* TODO: Move logic to getters */ + { + AnnotMovie * movieann = static_cast< AnnotMovie * >( ann ); + MovieAnnotation * m = new MovieAnnotation(); + annotation = m; + + // -> movie + MovieObject *movie = new MovieObject( movieann ); + m->setMovie( movie ); + // -> movieTitle + GooString * movietitle = movieann->getTitle(); + if ( movietitle ) + m->setMovieTitle( QString::fromLatin1( movietitle->getCString() ) ); + break; + } + case Annot::typeScreen: + { + AnnotScreen * screenann = static_cast< AnnotScreen * >( ann ); + if (!screenann->getAction()) + continue; + ScreenAnnotation * s = new ScreenAnnotation(); + annotation = s; + + // -> screen + Link * popplerLink = PageData::convertLinkActionToLink( screenann->getAction(), doc, QRectF() ); + s->setAction( static_cast(popplerLink) ); + + // -> screenTitle + GooString * screentitle = screenann->getTitle(); + if ( screentitle ) + s->setScreenTitle( UnicodeParsedString( screentitle ) ); + break; + } + case Annot::typePopup: + continue; // popups are parsed by Annotation's window() getter + case Annot::typeUnknown: + continue; // special case for ignoring unknown annotations + case Annot::typeWidget: + continue; // handled as forms or some other way + default: + { +#define CASE_FOR_TYPE( thetype ) \ + case Annot::type ## thetype: \ + error(errUnimplemented, -1, "Annotation " #thetype " not supported"); \ + break; + switch ( subType ) + { + CASE_FOR_TYPE( PrinterMark ) + CASE_FOR_TYPE( TrapNet ) + CASE_FOR_TYPE( Watermark ) + CASE_FOR_TYPE( 3D ) + default: error(errUnimplemented, -1, "Annotation %u not supported", subType); + } + continue; +#undef CASE_FOR_TYPE + } + } + + annotation->d_ptr->tieToNativeAnnot(ann, pdfPage, doc); + res.append(annotation); + } + + return res; +} + +Ref AnnotationPrivate::pdfObjectReference() const +{ + if (pdfAnnot == 0) + { + const Ref invalid_ref = { -1, -1 }; + return invalid_ref; + } + + return pdfAnnot->getRef(); +} + +void AnnotationPrivate::addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann) +{ + if (ann->d_ptr->pdfAnnot != 0) + { + error(errIO, -1, "Annotation is already tied"); + return; + } + + // Unimplemented annotations can't be created by the user because their ctor + // is private. Therefore, createNativeAnnot will never return 0 + Annot *nativeAnnot = ann->d_ptr->createNativeAnnot(pdfPage, doc); + Q_ASSERT(nativeAnnot); + pdfPage->addAnnot(nativeAnnot); +} + +void AnnotationPrivate::removeAnnotationFromPage(::Page *pdfPage, const Annotation * ann) +{ + if (ann->d_ptr->pdfAnnot == 0) + { + error(errIO, -1, "Annotation is not tied"); + return; + } + + if (ann->d_ptr->pdfPage != pdfPage) + { + error(errIO, -1, "Annotation doesn't belong to the specified page"); + return; + } + + // Remove popup window + AnnotMarkup *markupann = dynamic_cast(ann->d_ptr->pdfAnnot); + if (markupann && markupann->getPopup()) + pdfPage->removeAnnot(markupann->getPopup()); + + // Remove appearance streams (if any) + ann->d_ptr->pdfAnnot->invalidateAppearance(); + + // Remove annotation + pdfPage->removeAnnot(ann->d_ptr->pdfAnnot); + + // Destroy object + delete ann; +} + +class Annotation::Style::Private : public QSharedData +{ + public: + Private() + : opacity( 1.0 ), width( 1.0 ), lineStyle( Solid ), xCorners( 0.0 ), + yCorners( 0.0 ), lineEffect( NoEffect ), effectIntensity( 1.0 ) + { + dashArray.resize(1); + dashArray[0] = 3; + } + + QColor color; + double opacity; + double width; + Annotation::LineStyle lineStyle; + double xCorners; + double yCorners; + QVector dashArray; + Annotation::LineEffect lineEffect; + double effectIntensity; +}; + +Annotation::Style::Style() + : d ( new Private ) +{ +} + +Annotation::Style::Style( const Style &other ) + : d( other.d ) +{ +} + +Annotation::Style& Annotation::Style::operator=( const Style &other ) +{ + if ( this != &other ) + d = other.d; + + return *this; +} + +Annotation::Style::~Style() +{ +} + +QColor Annotation::Style::color() const +{ + return d->color; +} + +void Annotation::Style::setColor(const QColor &color) +{ + d->color = color; +} + +double Annotation::Style::opacity() const +{ + return d->opacity; +} + +void Annotation::Style::setOpacity(double opacity) +{ + d->opacity = opacity; +} + +double Annotation::Style::width() const +{ + return d->width; +} + +void Annotation::Style::setWidth(double width) +{ + d->width = width; +} + +Annotation::LineStyle Annotation::Style::lineStyle() const +{ + return d->lineStyle; +} + +void Annotation::Style::setLineStyle(Annotation::LineStyle style) +{ + d->lineStyle = style; +} + +double Annotation::Style::xCorners() const +{ + return d->xCorners; +} + +void Annotation::Style::setXCorners(double radius) +{ + d->xCorners = radius; +} + +double Annotation::Style::yCorners() const +{ + return d->yCorners; +} + +void Annotation::Style::setYCorners(double radius) +{ + d->yCorners = radius; +} + +const QVector& Annotation::Style::dashArray() const +{ + return d->dashArray; +} + +void Annotation::Style::setDashArray(const QVector &array) +{ + d->dashArray = array; +} + +Annotation::LineEffect Annotation::Style::lineEffect() const +{ + return d->lineEffect; +} + +void Annotation::Style::setLineEffect(Annotation::LineEffect effect) +{ + d->lineEffect = effect; +} + +double Annotation::Style::effectIntensity() const +{ + return d->effectIntensity; +} + +void Annotation::Style::setEffectIntensity(double intens) +{ + d->effectIntensity = intens; +} + +class Annotation::Popup::Private : public QSharedData +{ + public: + Private() + : flags( -1 ) {} + + int flags; + QRectF geometry; + QString title; + QString summary; + QString text; +}; + +Annotation::Popup::Popup() + : d ( new Private ) +{ +} + +Annotation::Popup::Popup( const Popup &other ) + : d( other.d ) +{ +} + +Annotation::Popup& Annotation::Popup::operator=( const Popup &other ) +{ + if ( this != &other ) + d = other.d; + + return *this; +} + +Annotation::Popup::~Popup() +{ +} + +int Annotation::Popup::flags() const +{ + return d->flags; +} + +void Annotation::Popup::setFlags( int flags ) +{ + d->flags = flags; +} + +QRectF Annotation::Popup::geometry() const +{ + return d->geometry; +} + +void Annotation::Popup::setGeometry( const QRectF &geom ) +{ + d->geometry = geom; +} + +QString Annotation::Popup::title() const +{ + return d->title; +} + +void Annotation::Popup::setTitle( const QString &title ) +{ + d->title = title; +} + +QString Annotation::Popup::summary() const +{ + return d->summary; +} + +void Annotation::Popup::setSummary( const QString &summary ) +{ + d->summary = summary; +} + +QString Annotation::Popup::text() const +{ + return d->text; +} + +void Annotation::Popup::setText( const QString &text ) +{ + d->text = text; +} + +Annotation::Annotation( AnnotationPrivate &dd ) + : d_ptr( &dd ) +{ + window.width = window.height = 0; +} + +Annotation::~Annotation() +{ +} + +Annotation::Annotation( AnnotationPrivate &dd, const QDomNode &annNode ) + : d_ptr( &dd ) +{ + Q_D( Annotation ); + + window.width = window.height = 0; + + // get the [base] element of the annotation node + QDomElement e = AnnotationUtils::findChildElement( annNode, "base" ); + if ( e.isNull() ) + return; + + Style s; + Popup w; + + // parse -contents- attributes + if ( e.hasAttribute( "author" ) ) + setAuthor(e.attribute( "author" )); + if ( e.hasAttribute( "contents" ) ) + setContents(e.attribute( "contents" )); + if ( e.hasAttribute( "uniqueName" ) ) + setUniqueName(e.attribute( "uniqueName" )); + if ( e.hasAttribute( "modifyDate" ) ) + setModificationDate(QDateTime::fromString( e.attribute( "modifyDate" ) )); + if ( e.hasAttribute( "creationDate" ) ) + setCreationDate(QDateTime::fromString( e.attribute( "creationDate" ) )); + + // parse -other- attributes + if ( e.hasAttribute( "flags" ) ) + setFlags(e.attribute( "flags" ).toInt()); + if ( e.hasAttribute( "color" ) ) + s.setColor(QColor( e.attribute( "color" ) )); + if ( e.hasAttribute( "opacity" ) ) + s.setOpacity(e.attribute( "opacity" ).toDouble()); + + // parse -the-subnodes- (describing Style, Window, Revision(s) structures) + // Note: all subnodes if present must be 'attributes complete' + QDomNode eSubNode = e.firstChild(); + while ( eSubNode.isElement() ) + { + QDomElement ee = eSubNode.toElement(); + eSubNode = eSubNode.nextSibling(); + + // parse boundary + if ( ee.tagName() == "boundary" ) + { + QRectF brect; + brect.setLeft(ee.attribute( "l" ).toDouble()); + brect.setTop(ee.attribute( "t" ).toDouble()); + brect.setRight(ee.attribute( "r" ).toDouble()); + brect.setBottom(ee.attribute( "b" ).toDouble()); + setBoundary(brect); + } + // parse penStyle if not default + else if ( ee.tagName() == "penStyle" ) + { + s.setWidth(ee.attribute( "width" ).toDouble()); + s.setLineStyle((LineStyle)ee.attribute( "style" ).toInt()); + s.setXCorners(ee.attribute( "xcr" ).toDouble()); + s.setYCorners(ee.attribute( "ycr" ).toDouble()); + + // Try to parse dash array (new format) + QVector dashArray; + + QDomNode eeSubNode = ee.firstChild(); + while ( eeSubNode.isElement() ) + { + QDomElement eee = eeSubNode.toElement(); + eeSubNode = eeSubNode.nextSibling(); + + if ( eee.tagName() != "dashsegm" ) + continue; + + dashArray.append(eee.attribute( "len" ).toDouble()); + } + + // If no segments were found use marks/spaces (old format) + if ( dashArray.size() == 0 ) + { + dashArray.append(ee.attribute( "marks" ).toDouble()); + dashArray.append(ee.attribute( "spaces" ).toDouble()); + } + + s.setDashArray(dashArray); + } + // parse effectStyle if not default + else if ( ee.tagName() == "penEffect" ) + { + s.setLineEffect((LineEffect)ee.attribute( "effect" ).toInt()); + s.setEffectIntensity(ee.attribute( "intensity" ).toDouble()); + } + // parse window if present + else if ( ee.tagName() == "window" ) + { + QRectF geom; + geom.setX(ee.attribute( "top" ).toDouble()); + geom.setY(ee.attribute( "left" ).toDouble()); + + if (ee.hasAttribute("widthDouble")) + geom.setWidth(ee.attribute( "widthDouble" ).toDouble()); + else + geom.setWidth(ee.attribute( "width" ).toDouble()); + + if (ee.hasAttribute("widthDouble")) + geom.setHeight(ee.attribute( "heightDouble" ).toDouble()); + else + geom.setHeight(ee.attribute( "height" ).toDouble()); + + w.setGeometry(geom); + + w.setFlags(ee.attribute( "flags" ).toInt()); + w.setTitle(ee.attribute( "title" )); + w.setSummary(ee.attribute( "summary" )); + // parse window subnodes + QDomNode winNode = ee.firstChild(); + for ( ; winNode.isElement(); winNode = winNode.nextSibling() ) + { + QDomElement winElement = winNode.toElement(); + if ( winElement.tagName() == "text" ) + w.setText(winElement.firstChild().toCDATASection().data()); + } + } + } + + setStyle(s); // assign parsed style + setPopup(w); // assign parsed window + + // get the [revisions] element of the annotation node + QDomNode revNode = annNode.firstChild(); + for ( ; revNode.isElement(); revNode = revNode.nextSibling() ) + { + QDomElement revElement = revNode.toElement(); + if ( revElement.tagName() != "revision" ) + continue; + + Annotation *reply = AnnotationUtils::createAnnotation( revElement ); + + if (reply) // if annotation is valid, add as a revision of this annotation + { + RevScope scope = (RevScope)revElement.attribute( "revScope" ).toInt(); + RevType type = (RevType)revElement.attribute( "revType" ).toInt(); + d->addRevision(reply, scope, type); + delete reply; + } + } +} + +void Annotation::storeBaseAnnotationProperties( QDomNode & annNode, QDomDocument & document ) const +{ + // create [base] element of the annotation node + QDomElement e = document.createElement( "base" ); + annNode.appendChild( e ); + + const Style s = style(); + const Popup w = popup(); + + // store -contents- attributes + if ( !author().isEmpty() ) + e.setAttribute( "author", author() ); + if ( !contents().isEmpty() ) + e.setAttribute( "contents", contents() ); + if ( !uniqueName().isEmpty() ) + e.setAttribute( "uniqueName", uniqueName() ); + if ( modificationDate().isValid() ) + e.setAttribute( "modifyDate", modificationDate().toString() ); + if ( creationDate().isValid() ) + e.setAttribute( "creationDate", creationDate().toString() ); + + // store -other- attributes + if ( flags() ) + e.setAttribute( "flags", flags() ); + if ( s.color().isValid() ) + e.setAttribute( "color", s.color().name() ); + if ( s.opacity() != 1.0 ) + e.setAttribute( "opacity", QString::number( s.opacity() ) ); + + // Sub-Node-1 - boundary + const QRectF brect = boundary(); + QDomElement bE = document.createElement( "boundary" ); + e.appendChild( bE ); + bE.setAttribute( "l", QString::number( (double)brect.left() ) ); + bE.setAttribute( "t", QString::number( (double)brect.top() ) ); + bE.setAttribute( "r", QString::number( (double)brect.right() ) ); + bE.setAttribute( "b", QString::number( (double)brect.bottom() ) ); + + // Sub-Node-2 - penStyle + const QVector dashArray = s.dashArray(); + if ( s.width() != 1 || s.lineStyle() != Solid || s.xCorners() != 0 || + s.yCorners() != 0.0 || dashArray.size() != 1 || dashArray[0] != 3 ) + { + QDomElement psE = document.createElement( "penStyle" ); + e.appendChild( psE ); + psE.setAttribute( "width", QString::number( s.width() ) ); + psE.setAttribute( "style", (int)s.lineStyle() ); + psE.setAttribute( "xcr", QString::number( s.xCorners() ) ); + psE.setAttribute( "ycr", QString::number( s.yCorners() ) ); + + int marks = 3, spaces = 0; // Do not break code relying on marks/spaces + if (dashArray.size() != 0) + marks = (int)dashArray[0]; + if (dashArray.size() > 1) + spaces = (int)dashArray[1]; + + psE.setAttribute( "marks", marks ); + psE.setAttribute( "spaces", spaces ); + + foreach (double segm, dashArray) + { + QDomElement pattE = document.createElement( "dashsegm" ); + pattE.setAttribute( "len", QString::number( segm ) ); + psE.appendChild(pattE); + } + } + + // Sub-Node-3 - penEffect + if ( s.lineEffect() != NoEffect || s.effectIntensity() != 1.0 ) + { + QDomElement peE = document.createElement( "penEffect" ); + e.appendChild( peE ); + peE.setAttribute( "effect", (int)s.lineEffect() ); + peE.setAttribute( "intensity", QString::number( s.effectIntensity() ) ); + } + + // Sub-Node-4 - window + if ( w.flags() != -1 || !w.title().isEmpty() || !w.summary().isEmpty() || + !w.text().isEmpty() ) + { + QDomElement wE = document.createElement( "window" ); + const QRectF geom = w.geometry(); + e.appendChild( wE ); + wE.setAttribute( "flags", w.flags() ); + wE.setAttribute( "top", QString::number( geom.x() ) ); + wE.setAttribute( "left", QString::number( geom.y() ) ); + wE.setAttribute( "width", (int)geom.width() ); + wE.setAttribute( "height", (int)geom.height() ); + wE.setAttribute( "widthDouble", QString::number( geom.width() ) ); + wE.setAttribute( "heightDouble", QString::number( geom.height() ) ); + wE.setAttribute( "title", w.title() ); + wE.setAttribute( "summary", w.summary() ); + // store window.text as a subnode, because we need escaped data + if ( !w.text().isEmpty() ) + { + QDomElement escapedText = document.createElement( "text" ); + wE.appendChild( escapedText ); + QDomCDATASection textCData = document.createCDATASection( w.text() ); + escapedText.appendChild( textCData ); + } + } + + const QList revs = revisions(); + + // create [revision] element of the annotation node (if any) + if ( revs.isEmpty() ) + return; + + // add all revisions as children of revisions element + foreach (const Annotation *rev, revs) + { + QDomElement r = document.createElement( "revision" ); + annNode.appendChild( r ); + // set element attributes + r.setAttribute( "revScope", (int)rev->revisionScope() ); + r.setAttribute( "revType", (int)rev->revisionType() ); + // use revision as the annotation element, so fill it up + AnnotationUtils::storeAnnotation( rev, r, document ); + delete rev; + } +} + +QString Annotation::author() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->author; + + const AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + return markupann ? UnicodeParsedString( markupann->getLabel() ) : QString(); +} + +void Annotation::setAuthor( const QString &author ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->author = author; + return; + } + + AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + if (markupann) + { + GooString *s = QStringToUnicodeGooString(author); + markupann->setLabel(s); + delete s; + } +} + +QString Annotation::contents() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->contents; + + return UnicodeParsedString( d->pdfAnnot->getContents() ); +} + +void Annotation::setContents( const QString &contents ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->contents = contents; + return; + } + + GooString *s = QStringToUnicodeGooString(contents); + d->pdfAnnot->setContents(s); + delete s; + d->pdfAnnot->invalidateAppearance(); +} + +QString Annotation::uniqueName() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->uniqueName; + + return UnicodeParsedString( d->pdfAnnot->getName() ); +} + +void Annotation::setUniqueName( const QString &uniqueName ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->uniqueName = uniqueName; + return; + } + + QByteArray ascii = uniqueName.toAscii(); + GooString s(ascii.constData()); + d->pdfAnnot->setName(&s); +} + +QDateTime Annotation::modificationDate() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->modDate; + + if ( d->pdfAnnot->getModified() ) + return convertDate( d->pdfAnnot->getModified()->getCString() ); + else + return QDateTime(); +} + +void Annotation::setModificationDate( const QDateTime &date ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->modDate = date; + return; + } + +#if 0 // TODO: Conversion routine is broken + if (d->pdfAnnot) + { + time_t t = date.toTime_t(); + GooString *s = timeToDateString(&t); + d->pdfAnnot->setModified(s); + delete s; + } +#endif +} + +QDateTime Annotation::creationDate() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->creationDate; + + const AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + + if (markupann && markupann->getDate()) + return convertDate( markupann->getDate()->getCString() ); + + return modificationDate(); +} + +void Annotation::setCreationDate( const QDateTime &date ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->creationDate = date; + return; + } + +#if 0 // TODO: Conversion routine is broken + AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + if (markupann) + { + time_t t = date.toTime_t(); + GooString *s = timeToDateString(&t); + markupann->setDate(s); + delete s; + } +#endif +} + +static int fromPdfFlags(int flags) +{ + int qtflags = 0; + + if ( flags & Annot::flagHidden ) + qtflags |= Annotation::Hidden; + if ( flags & Annot::flagNoZoom ) + qtflags |= Annotation::FixedSize; + if ( flags & Annot::flagNoRotate ) + qtflags |= Annotation::FixedRotation; + if ( !( flags & Annot::flagPrint ) ) + qtflags |= Annotation::DenyPrint; + if ( flags & Annot::flagReadOnly ) + qtflags |= (Annotation::DenyWrite | Annotation::DenyDelete); + if ( flags & Annot::flagLocked ) + qtflags |= Annotation::DenyDelete; + if ( flags & Annot::flagToggleNoView ) + qtflags |= Annotation::ToggleHidingOnMouse; + + return qtflags; +} + +static int toPdfFlags(int qtflags) +{ + int flags = 0; + + if ( qtflags & Annotation::Hidden ) + flags |= Annot::flagHidden; + if ( qtflags & Annotation::FixedSize ) + flags |= Annot::flagNoZoom; + if ( qtflags & Annotation::FixedRotation ) + flags |= Annot::flagNoRotate; + if ( !( qtflags & Annotation::DenyPrint ) ) + flags |= Annot::flagPrint; + if ( qtflags & Annotation::DenyWrite ) + flags |= Annot::flagReadOnly; + if ( qtflags & Annotation::DenyDelete ) + flags |= Annot::flagLocked; + if ( qtflags & Annotation::ToggleHidingOnMouse ) + flags |= Annot::flagToggleNoView; + + return flags; +} + +int Annotation::flags() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->flags; + + return fromPdfFlags( d->pdfAnnot->getFlags() ); +} + +void Annotation::setFlags( int flags ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->flags = flags; + return; + } + + d->pdfAnnot->setFlags(toPdfFlags( flags )); + d->pdfAnnot->invalidateAppearance(); +} + +QRectF Annotation::boundary() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->boundary; + + const PDFRectangle * rect = d->pdfAnnot->getRect(); + return d->fromPdfRectangle( *rect ); +} + +void Annotation::setBoundary( const QRectF &boundary ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->boundary = boundary; + return; + } + + PDFRectangle rect = d->toPdfRectangle(boundary); + d->pdfAnnot->setRect(&rect); + d->pdfAnnot->invalidateAppearance(); +} + +Annotation::Style Annotation::style() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->style; + + Style s; + s.setColor(convertAnnotColor( d->pdfAnnot->getColor() )); + + const AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + if (markupann) + s.setOpacity( markupann->getOpacity() ); + + const AnnotBorder *border = d->pdfAnnot->getBorder(); + if (border) + { + if ( border->getType() == AnnotBorder::typeArray ) + { + const AnnotBorderArray *border_array = static_cast(border); + s.setXCorners( border_array->getHorizontalCorner() ); + s.setYCorners( border_array->getVerticalCorner() ); + } + + s.setWidth( border->getWidth() ); + s.setLineStyle((Annotation::LineStyle)( 1 << border->getStyle() )); + + const int dashArrLen = border->getDashLength(); + const double* dashArrData = border->getDash(); + QVector dashArrVect( dashArrLen ); + for (int i = 0; i < dashArrLen; ++i) + dashArrVect[i] = dashArrData[i]; + s.setDashArray(dashArrVect); + } + + AnnotBorderEffect *border_effect; + switch (d->pdfAnnot->getType()) + { + case Annot::typeFreeText: + border_effect = static_cast(d->pdfAnnot)->getBorderEffect(); + break; + case Annot::typeSquare: + case Annot::typeCircle: + border_effect = static_cast(d->pdfAnnot)->getBorderEffect(); + break; + default: + border_effect = 0; + } + if (border_effect) + { + s.setLineEffect( (Annotation::LineEffect)border_effect->getEffectType() ); + s.setEffectIntensity( border_effect->getIntensity() ); + } + + return s; +} + +void Annotation::setStyle( const Annotation::Style& style ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->style = style; + return; + } + + d->pdfAnnot->setColor(convertQColor( style.color() )); + + AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + if (markupann) + markupann->setOpacity( style.opacity() ); + + AnnotBorderArray * border = new AnnotBorderArray(); + border->setWidth( style.width() ); + border->setHorizontalCorner( style.xCorners() ); + border->setVerticalCorner( style.yCorners() ); + d->pdfAnnot->setBorder(border); + d->pdfAnnot->invalidateAppearance(); +} + +Annotation::Popup Annotation::popup() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->popup; + + Popup w; + AnnotPopup *popup = 0; + int flags = -1; // Not initialized + + const AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + if (markupann) + { + popup = markupann->getPopup(); + w.setSummary(UnicodeParsedString( markupann->getSubject() )); + } + + if (popup) + { + flags = fromPdfFlags( popup->getFlags() ) & ( Annotation::Hidden | + Annotation::FixedSize | Annotation::FixedRotation ); + + if (!popup->getOpen()) + flags |= Annotation::Hidden; + + const PDFRectangle * rect = popup->getRect(); + w.setGeometry( d->fromPdfRectangle( *rect ) ); + } + + if (d->pdfAnnot->getType() == Annot::typeText) + { + const AnnotText * textann = static_cast(d->pdfAnnot); + + // Text annotations default to same rect as annotation + if (flags == -1) + { + flags = 0; + w.setGeometry( boundary() ); + } + + // If text is not 'opened', force window hiding. if the window + // was parsed from popup, the flag should already be set + if ( !textann->getOpen() && flags != -1 ) + flags |= Annotation::Hidden; + } + + w.setFlags(flags); + + return w; +} + +void Annotation::setPopup( const Annotation::Popup& popup ) +{ + Q_D( Annotation ); + + if (!d->pdfAnnot) + { + d->popup = popup; + return; + } + +#if 0 /* TODO: Remove old popup and add AnnotPopup to page */ + AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + if (!markupann) + return; + + // Create a new AnnotPopup and assign it to pdfAnnot + PDFRectangle rect = d->toPdfRectangle( popup.geometry() ); + AnnotPopup * p = new AnnotPopup( d->pdfPage->getDoc(), &rect ); + p->setOpen( !(popup.flags() & Annotation::Hidden) ); + if (!popup.summary().isEmpty()) + { + GooString *s = QStringToUnicodeGooString(popup.summary()); + markupann->setLabel(s); + delete s; + } + markupann->setPopup(p); +#endif +} + +Annotation::RevScope Annotation::revisionScope() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->revisionScope; + + const AnnotMarkup *markupann = dynamic_cast(d->pdfAnnot); + + if (markupann && markupann->getInReplyToID() != 0) + { + switch (markupann->getReplyTo()) + { + case AnnotMarkup::replyTypeR: + return Annotation::Reply; + case AnnotMarkup::replyTypeGroup: + return Annotation::Group; + } + } + + return Annotation::Root; // It's not a revision +} + +Annotation::RevType Annotation::revisionType() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + return d->revisionType; + + const AnnotText *textann = dynamic_cast(d->pdfAnnot); + + if (textann && textann->getInReplyToID() != 0) + { + switch (textann->getState()) + { + case AnnotText::stateMarked: + return Annotation::Marked; + case AnnotText::stateUnmarked: + return Annotation::Unmarked; + case AnnotText::stateAccepted: + return Annotation::Accepted; + case AnnotText::stateRejected: + return Annotation::Rejected; + case AnnotText::stateCancelled: + return Annotation::Cancelled; + case AnnotText::stateCompleted: + return Annotation::Completed; + default: + break; + } + } + + return Annotation::None; +} + +QList Annotation::revisions() const +{ + Q_D( const Annotation ); + + if (!d->pdfAnnot) + { + /* Return aliases, whose ownership goes to the caller */ + QList res; + foreach (Annotation *rev, d->revisions) + res.append( rev->d_ptr->makeAlias() ); + return res; + } + + /* If the annotation doesn't live in a object on its own (eg bug51361), it + * has no ref, therefore it can't have revisions */ + if ( !d->pdfAnnot->getHasRef() ) + return QList(); + + return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, d->pdfAnnot->getId() ); +} + +//END Annotation implementation + + +/** TextAnnotation [Annotation] */ +class TextAnnotationPrivate : public AnnotationPrivate +{ + public: + TextAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + TextAnnotation::TextType textType; + QString textIcon; + QFont textFont; + int inplaceAlign; // 0:left, 1:center, 2:right + QVector inplaceCallout; + TextAnnotation::InplaceIntent inplaceIntent; + + // Helper + static GooString * toAppearanceString(const QFont &font); +}; + +TextAnnotationPrivate::TextAnnotationPrivate() + : AnnotationPrivate(), textType( TextAnnotation::Linked ), + textIcon( "Note" ), inplaceAlign( 0 ), + inplaceIntent( TextAnnotation::Unknown ) +{ +} + +Annotation * TextAnnotationPrivate::makeAlias() +{ + return new TextAnnotation(*this); +} + +GooString * TextAnnotationPrivate::toAppearanceString(const QFont &font) +{ + GooString * s = GooString::format("/Invalid_font {0:d} Tf", font.pointSize()); + // TODO: Font family, style (bold, italic, ...) and pointSize as float + return s; +} + +Annot* TextAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + // Setters are defined in the public class + TextAnnotation *q = static_cast( makeAlias() ); + + // Set page and contents + pdfPage = destPage; + parentDoc = doc; + + // Set pdfAnnot + PDFRectangle rect = toPdfRectangle(boundary); + if (textType == TextAnnotation::Linked) + { + pdfAnnot = new AnnotText(destPage->getDoc(), &rect); + } + else + { + GooString * da = toAppearanceString(textFont); + pdfAnnot = new AnnotFreeText(destPage->getDoc(), &rect, da); + delete da; + } + + // Set properties + flushBaseAnnotationProperties(); + q->setTextIcon(textIcon); + q->setInplaceAlign(inplaceAlign); + q->setCalloutPoints(inplaceCallout); + q->setInplaceIntent(inplaceIntent); + + delete q; + + return pdfAnnot; +} + +TextAnnotation::TextAnnotation( TextAnnotation::TextType type ) + : Annotation( *new TextAnnotationPrivate() ) +{ + setTextType( type ); +} + +TextAnnotation::TextAnnotation(TextAnnotationPrivate &dd) + : Annotation( dd ) +{} + +TextAnnotation::TextAnnotation( const QDomNode & node ) + : Annotation( *new TextAnnotationPrivate, node ) +{ + // loop through the whole children looking for a 'text' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "text" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "type" ) ) + setTextType((TextAnnotation::TextType)e.attribute( "type" ).toInt()); + if ( e.hasAttribute( "icon" ) ) + setTextIcon(e.attribute( "icon" )); + if ( e.hasAttribute( "font" ) ) + { + QFont font; + font.fromString( e.attribute( "font" ) ); + setTextFont(font); + } + if ( e.hasAttribute( "align" ) ) + setInplaceAlign(e.attribute( "align" ).toInt()); + if ( e.hasAttribute( "intent" ) ) + setInplaceIntent((TextAnnotation::InplaceIntent)e.attribute( "intent" ).toInt()); + + // parse the subnodes + QDomNode eSubNode = e.firstChild(); + while ( eSubNode.isElement() ) + { + QDomElement ee = eSubNode.toElement(); + eSubNode = eSubNode.nextSibling(); + + if ( ee.tagName() == "escapedText" ) + { + setInplaceText(ee.firstChild().toCDATASection().data()); + } + else if ( ee.tagName() == "callout" ) + { + QVector points(3); + points[0] = QPointF(ee.attribute( "ax" ).toDouble(), + ee.attribute( "ay" ).toDouble()); + points[1] = QPointF(ee.attribute( "bx" ).toDouble(), + ee.attribute( "by" ).toDouble()); + points[2] = QPointF(ee.attribute( "cx" ).toDouble(), + ee.attribute( "cy" ).toDouble()); + setCalloutPoints(points); + } + } + + // loading complete + break; + } +} + +TextAnnotation::~TextAnnotation() +{ +} + +void TextAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [text] element + QDomElement textElement = document.createElement( "text" ); + node.appendChild( textElement ); + + // store the optional attributes + if ( textType() != Linked ) + textElement.setAttribute( "type", (int)textType() ); + if ( textIcon() != "Note" ) + textElement.setAttribute( "icon", textIcon() ); + if ( inplaceAlign() ) + textElement.setAttribute( "align", inplaceAlign() ); + if ( inplaceIntent() != Unknown ) + textElement.setAttribute( "intent", (int)inplaceIntent() ); + + textElement.setAttribute( "font", textFont().toString() ); + + // Sub-Node-1 - escapedText + if ( !inplaceText().isEmpty() ) + { + QDomElement escapedText = document.createElement( "escapedText" ); + textElement.appendChild( escapedText ); + QDomCDATASection textCData = document.createCDATASection( inplaceText() ); + escapedText.appendChild( textCData ); + } + + // Sub-Node-2 - callout + if ( calloutPoint(0).x() != 0.0 ) + { + QDomElement calloutElement = document.createElement( "callout" ); + textElement.appendChild( calloutElement ); + calloutElement.setAttribute( "ax", QString::number( calloutPoint(0).x() ) ); + calloutElement.setAttribute( "ay", QString::number( calloutPoint(0).y() ) ); + calloutElement.setAttribute( "bx", QString::number( calloutPoint(1).x() ) ); + calloutElement.setAttribute( "by", QString::number( calloutPoint(1).y() ) ); + calloutElement.setAttribute( "cx", QString::number( calloutPoint(2).x() ) ); + calloutElement.setAttribute( "cy", QString::number( calloutPoint(2).y() ) ); + } +} + +Annotation::SubType TextAnnotation::subType() const +{ + return AText; +} + +TextAnnotation::TextType TextAnnotation::textType() const +{ + Q_D( const TextAnnotation ); + + if (!d->pdfAnnot) + return d->textType; + + return d->pdfAnnot->getType() == Annot::typeText ? + TextAnnotation::Linked : TextAnnotation::InPlace; +} + +void TextAnnotation::setTextType( TextAnnotation::TextType type ) +{ + Q_D( TextAnnotation ); + + if (!d->pdfAnnot) + { + d->textType = type; + return; + } + + // Type cannot be changed if annotation is already tied +} + +QString TextAnnotation::textIcon() const +{ + Q_D( const TextAnnotation ); + + if (!d->pdfAnnot) + return d->textIcon; + + if (d->pdfAnnot->getType() == Annot::typeText) + { + const AnnotText * textann = static_cast(d->pdfAnnot); + return QString::fromLatin1( textann->getIcon()->getCString() ); + } + + return QString(); +} + +void TextAnnotation::setTextIcon( const QString &icon ) +{ + Q_D( TextAnnotation ); + + if (!d->pdfAnnot) + { + d->textIcon = icon; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeText) + { + AnnotText * textann = static_cast(d->pdfAnnot); + QByteArray encoded = icon.toLatin1(); + GooString s(encoded.constData()); + textann->setIcon(&s); + d->pdfAnnot->invalidateAppearance(); + } +} + +QFont TextAnnotation::textFont() const +{ + Q_D( const TextAnnotation ); + + if (!d->pdfAnnot) + return d->textFont; + + QFont font; + + if (d->pdfAnnot->getType() == Annot::typeFreeText) + { + const AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + const GooString * da = ftextann->getAppearanceString(); + if (da) + { + // At the moment, only font size is parsed + QString style = QString::fromLatin1( da->getCString() ); + QRegExp rx("(\\d+)(\\.\\d*)? Tf"); + if (rx.indexIn(style) != -1) + font.setPointSize( rx.cap(1).toInt() ); + // TODO: Other properties + } + } + + return font; +} + +void TextAnnotation::setTextFont( const QFont &font ) +{ + Q_D( TextAnnotation ); + + if (!d->pdfAnnot) + { + d->textFont = font; + return; + } + + if (d->pdfAnnot->getType() != Annot::typeFreeText) + return; + + AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + GooString * da = TextAnnotationPrivate::toAppearanceString(font); + ftextann->setAppearanceString(da); + delete da; + d->pdfAnnot->invalidateAppearance(); +} + +int TextAnnotation::inplaceAlign() const +{ + Q_D( const TextAnnotation ); + + if (!d->pdfAnnot) + return d->inplaceAlign; + + if (d->pdfAnnot->getType() == Annot::typeFreeText) + { + const AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + return ftextann->getQuadding(); + } + + return 0; +} + +void TextAnnotation::setInplaceAlign( int align ) +{ + Q_D( TextAnnotation ); + + if (!d->pdfAnnot) + { + d->inplaceAlign = align; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeFreeText) + { + AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + ftextann->setQuadding((AnnotFreeText::AnnotFreeTextQuadding)align); + d->pdfAnnot->invalidateAppearance(); + } +} + +QString TextAnnotation::inplaceText() const +{ + return contents(); +} + +void TextAnnotation::setInplaceText( const QString &text ) +{ + setContents(text); +} + +QPointF TextAnnotation::calloutPoint( int id ) const +{ + const QVector points = calloutPoints(); + if ( id < 0 || id >= points.size() ) + return QPointF(); + else + return points[id]; +} + +QVector TextAnnotation::calloutPoints() const +{ + Q_D( const TextAnnotation ); + + if (!d->pdfAnnot) + return d->inplaceCallout; + + if (d->pdfAnnot->getType() == Annot::typeText) + return QVector(); + + const AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + const AnnotCalloutLine *callout = ftextann->getCalloutLine(); + + if (!callout) + return QVector(); + + double MTX[6]; + d->fillMTX(MTX); + + const AnnotCalloutMultiLine * callout_v6 = dynamic_cast(callout); + QVector res(callout_v6 ? 3 : 2); + XPDFReader::transform(MTX, callout->getX1(), callout->getY1(), res[0]); + XPDFReader::transform(MTX, callout->getX2(), callout->getY2(), res[1]); + if (callout_v6) + XPDFReader::transform(MTX, callout_v6->getX3(), callout_v6->getY3(), res[2]); + return res; +} + +void TextAnnotation::setCalloutPoints( const QVector &points ) +{ + Q_D( TextAnnotation ); + if (!d->pdfAnnot) + { + d->inplaceCallout = points; + return; + } + + if (d->pdfAnnot->getType() != Annot::typeFreeText) + return; + + AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + const int count = points.size(); + + if (count == 0) + { + ftextann->setCalloutLine(0); + d->pdfAnnot->invalidateAppearance(); + return; + } + + if (count != 2 && count != 3) + { + error(errSyntaxError, -1, "Expected zero, two or three points for callout"); + return; + } + + AnnotCalloutLine *callout; + double x1, y1, x2, y2; + double MTX[6]; + d->fillMTX(MTX); + + XPDFReader::invTransform( MTX, points[0], x1, y1 ); + XPDFReader::invTransform( MTX, points[1], x2, y2 ); + if (count == 3) + { + double x3, y3; + XPDFReader::invTransform( MTX, points[2], x3, y3 ); + callout = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3); + } + else + { + callout = new AnnotCalloutLine(x1, y1, x2, y2); + } + + ftextann->setCalloutLine(callout); + delete callout; + d->pdfAnnot->invalidateAppearance(); +} + +TextAnnotation::InplaceIntent TextAnnotation::inplaceIntent() const +{ + Q_D( const TextAnnotation ); + + if (!d->pdfAnnot) + return d->inplaceIntent; + + if (d->pdfAnnot->getType() == Annot::typeFreeText) + { + const AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + return (TextAnnotation::InplaceIntent)ftextann->getIntent(); + } + + return TextAnnotation::Unknown; +} + +void TextAnnotation::setInplaceIntent( TextAnnotation::InplaceIntent intent ) +{ + Q_D( TextAnnotation ); + + if (d->pdfAnnot) + { + d->inplaceIntent = intent; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeFreeText) + { + AnnotFreeText * ftextann = static_cast(d->pdfAnnot); + ftextann->setIntent((AnnotFreeText::AnnotFreeTextIntent)intent); + d->pdfAnnot->invalidateAppearance(); + } +} + + +/** LineAnnotation [Annotation] */ +class LineAnnotationPrivate : public AnnotationPrivate +{ + public: + LineAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields (note uses border for rendering style) + QLinkedList linePoints; + LineAnnotation::TermStyle lineStartStyle; + LineAnnotation::TermStyle lineEndStyle; + bool lineClosed : 1; // (if true draw close shape) + bool lineShowCaption : 1; + LineAnnotation::LineType lineType; + QColor lineInnerColor; + double lineLeadingFwdPt; + double lineLeadingBackPt; + LineAnnotation::LineIntent lineIntent; +}; + +LineAnnotationPrivate::LineAnnotationPrivate() + : AnnotationPrivate(), lineStartStyle( LineAnnotation::None ), + lineEndStyle( LineAnnotation::None ), lineClosed( false ), + lineShowCaption( false ), lineLeadingFwdPt( 0 ), + lineLeadingBackPt( 0 ), lineIntent( LineAnnotation::Unknown ) +{ +} + +Annotation * LineAnnotationPrivate::makeAlias() +{ + return new LineAnnotation(*this); +} + +Annot* LineAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + // Setters are defined in the public class + LineAnnotation *q = static_cast( makeAlias() ); + + // Set page and document + pdfPage = destPage; + parentDoc = doc; + + // Set pdfAnnot + AnnotPath * path = toAnnotPath(linePoints); + PDFRectangle rect = toPdfRectangle(boundary); + if (lineType == LineAnnotation::StraightLine) + { + PDFRectangle lrect(path->getX(0), path->getY(0), path->getX(1), path->getY(1)); + pdfAnnot = new AnnotLine(doc->doc, &rect, &lrect); + } + else + { + pdfAnnot = new AnnotPolygon(doc->doc, &rect, + lineClosed ? Annot::typePolygon : Annot::typePolyLine, path ); + } + delete path; + + // Set properties + flushBaseAnnotationProperties(); + q->setLineStartStyle(lineStartStyle); + q->setLineEndStyle(lineEndStyle); + q->setLineInnerColor(lineInnerColor); + q->setLineLeadingForwardPoint(lineLeadingFwdPt); + q->setLineLeadingBackPoint(lineLeadingBackPt); + q->setLineShowCaption(lineShowCaption); + q->setLineIntent(lineIntent); + + delete q; + + linePoints.clear(); // Free up memory + + return pdfAnnot; +} + +LineAnnotation::LineAnnotation( LineAnnotation::LineType type ) + : Annotation( *new LineAnnotationPrivate() ) +{ + setLineType(type); +} + +LineAnnotation::LineAnnotation(LineAnnotationPrivate &dd) + : Annotation( dd ) +{} + +LineAnnotation::LineAnnotation( const QDomNode & node ) + : Annotation( *new LineAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'line' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "line" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "startStyle" ) ) + setLineStartStyle((LineAnnotation::TermStyle)e.attribute( "startStyle" ).toInt()); + if ( e.hasAttribute( "endStyle" ) ) + setLineEndStyle((LineAnnotation::TermStyle)e.attribute( "endStyle" ).toInt()); + if ( e.hasAttribute( "closed" ) ) + setLineClosed(e.attribute( "closed" ).toInt()); + if ( e.hasAttribute( "innerColor" ) ) + setLineInnerColor(QColor( e.attribute( "innerColor" ) )); + if ( e.hasAttribute( "leadFwd" ) ) + setLineLeadingForwardPoint(e.attribute( "leadFwd" ).toDouble()); + if ( e.hasAttribute( "leadBack" ) ) + setLineLeadingBackPoint(e.attribute( "leadBack" ).toDouble()); + if ( e.hasAttribute( "showCaption" ) ) + setLineShowCaption(e.attribute( "showCaption" ).toInt()); + if ( e.hasAttribute( "intent" ) ) + setLineIntent((LineAnnotation::LineIntent)e.attribute( "intent" ).toInt()); + + // parse all 'point' subnodes + QLinkedList points; + QDomNode pointNode = e.firstChild(); + while ( pointNode.isElement() ) + { + QDomElement pe = pointNode.toElement(); + pointNode = pointNode.nextSibling(); + + if ( pe.tagName() != "point" ) + continue; + + QPointF p(pe.attribute( "x", "0.0" ).toDouble(), pe.attribute( "y", "0.0" ).toDouble()); + points.append( p ); + } + setLinePoints(points); + setLineType(points.size() == 2 ? StraightLine : Polyline); + + // loading complete + break; + } +} + +LineAnnotation::~LineAnnotation() +{ +} + +void LineAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [line] element + QDomElement lineElement = document.createElement( "line" ); + node.appendChild( lineElement ); + + // store the attributes + if ( lineStartStyle() != None ) + lineElement.setAttribute( "startStyle", (int)lineStartStyle() ); + if ( lineEndStyle() != None ) + lineElement.setAttribute( "endStyle", (int)lineEndStyle() ); + if ( isLineClosed() ) + lineElement.setAttribute( "closed", isLineClosed() ); + if ( lineInnerColor().isValid() ) + lineElement.setAttribute( "innerColor", lineInnerColor().name() ); + if ( lineLeadingForwardPoint() != 0.0 ) + lineElement.setAttribute( "leadFwd", QString::number( lineLeadingForwardPoint() ) ); + if ( lineLeadingBackPoint() != 0.0 ) + lineElement.setAttribute( "leadBack", QString::number( lineLeadingBackPoint() ) ); + if ( lineShowCaption() ) + lineElement.setAttribute( "showCaption", lineShowCaption() ); + if ( lineIntent() != Unknown ) + lineElement.setAttribute( "intent", lineIntent() ); + + // append the list of points + const QLinkedList points = linePoints(); + if ( points.count() > 1 ) + { + QLinkedList::const_iterator it = points.begin(), end = points.end(); + while ( it != end ) + { + const QPointF & p = *it; + QDomElement pElement = document.createElement( "point" ); + lineElement.appendChild( pElement ); + pElement.setAttribute( "x", QString::number( p.x() ) ); + pElement.setAttribute( "y", QString::number( p.y() ) ); + ++it; + } + } +} + +Annotation::SubType LineAnnotation::subType() const +{ + return ALine; +} + +LineAnnotation::LineType LineAnnotation::lineType() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineType; + + return (d->pdfAnnot->getType() == Annot::typeLine) ? + LineAnnotation::StraightLine : LineAnnotation::Polyline; +} + +void LineAnnotation::setLineType( LineAnnotation::LineType type ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineType = type; + return; + } + + // Type cannot be changed if annotation is already tied +} + +QLinkedList LineAnnotation::linePoints() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->linePoints; + + double MTX[6]; + d->fillMTX(MTX); + + QLinkedList res; + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + QPointF p; + XPDFReader::transform(MTX, lineann->getX1(), lineann->getY1(), p); + res.append(p); + XPDFReader::transform(MTX, lineann->getX2(), lineann->getY2(), p); + res.append(p); + } + else + { + const AnnotPolygon * polyann = static_cast(d->pdfAnnot); + const AnnotPath * vertices = polyann->getVertices(); + + for (int i = 0; i < vertices->getCoordsLength(); ++i) + { + QPointF p; + XPDFReader::transform(MTX, vertices->getX(i), vertices->getY(i), p); + res.append(p); + } + } + + return res; +} + +void LineAnnotation::setLinePoints( const QLinkedList &points ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->linePoints = points; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + if (points.size() != 2) + { + error(errSyntaxError, -1, "Expected two points for a straight line"); + return; + } + double x1, y1, x2, y2; + double MTX[6]; + d->fillMTX(MTX); + XPDFReader::invTransform( MTX, points.first(), x1, y1 ); + XPDFReader::invTransform( MTX, points.last(), x2, y2 ); + lineann->setVertices(x1, y1, x2, y2); + } + else + { + AnnotPolygon *polyann = static_cast(d->pdfAnnot); + AnnotPath * p = d->toAnnotPath(points); + polyann->setVertices(p); + delete p; + } + + d->pdfAnnot->invalidateAppearance(); +} + +LineAnnotation::TermStyle LineAnnotation::lineStartStyle() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineStartStyle; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + return (LineAnnotation::TermStyle)lineann->getStartStyle(); + } + else + { + const AnnotPolygon * polyann = static_cast(d->pdfAnnot); + return (LineAnnotation::TermStyle)polyann->getStartStyle(); + } +} + +void LineAnnotation::setLineStartStyle( LineAnnotation::TermStyle style ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineStartStyle = style; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + lineann->setStartEndStyle((AnnotLineEndingStyle)style, lineann->getEndStyle()); + } + else + { + AnnotPolygon *polyann = static_cast(d->pdfAnnot); + polyann->setStartEndStyle((AnnotLineEndingStyle)style, polyann->getEndStyle()); + } + + d->pdfAnnot->invalidateAppearance(); +} + +LineAnnotation::TermStyle LineAnnotation::lineEndStyle() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineEndStyle; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + return (LineAnnotation::TermStyle)lineann->getEndStyle(); + } + else + { + const AnnotPolygon * polyann = static_cast(d->pdfAnnot); + return (LineAnnotation::TermStyle)polyann->getEndStyle(); + } +} + +void LineAnnotation::setLineEndStyle( LineAnnotation::TermStyle style ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineEndStyle = style; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + lineann->setStartEndStyle(lineann->getStartStyle(), (AnnotLineEndingStyle)style); + } + else + { + AnnotPolygon *polyann = static_cast(d->pdfAnnot); + polyann->setStartEndStyle(polyann->getStartStyle(), (AnnotLineEndingStyle)style); + } + + d->pdfAnnot->invalidateAppearance(); +} + +bool LineAnnotation::isLineClosed() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineClosed; + + return d->pdfAnnot->getType() == Annot::typePolygon; +} + +void LineAnnotation::setLineClosed( bool closed ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineClosed = closed; + return; + } + + if (d->pdfAnnot->getType() != Annot::typeLine) + { + AnnotPolygon *polyann = static_cast(d->pdfAnnot); + + // Set new subtype and switch intent if necessary + if (closed) + { + polyann->setType(Annot::typePolygon); + if (polyann->getIntent() == AnnotPolygon::polylineDimension) + polyann->setIntent( AnnotPolygon::polygonDimension ); + } + else + { + polyann->setType(Annot::typePolyLine); + if (polyann->getIntent() == AnnotPolygon::polygonDimension) + polyann->setIntent( AnnotPolygon::polylineDimension ); + } + + d->pdfAnnot->invalidateAppearance(); + } +} + +QColor LineAnnotation::lineInnerColor() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineInnerColor; + + AnnotColor * c; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + c = lineann->getInteriorColor(); + } + else + { + const AnnotPolygon * polyann = static_cast(d->pdfAnnot); + c = polyann->getInteriorColor(); + } + + return convertAnnotColor(c); +} + +void LineAnnotation::setLineInnerColor( const QColor &color ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineInnerColor = color; + return; + } + + AnnotColor * c = convertQColor(color); + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + lineann->setInteriorColor(c); + } + else + { + AnnotPolygon *polyann = static_cast(d->pdfAnnot); + polyann->setInteriorColor(c); + } + + d->pdfAnnot->invalidateAppearance(); +} + +double LineAnnotation::lineLeadingForwardPoint() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineLeadingFwdPt; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + return lineann->getLeaderLineLength(); + } + + return 0; +} + +void LineAnnotation::setLineLeadingForwardPoint( double point ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineLeadingFwdPt = point; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + lineann->setLeaderLineLength(point); + d->pdfAnnot->invalidateAppearance(); + } +} + +double LineAnnotation::lineLeadingBackPoint() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineLeadingBackPt; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + return lineann->getLeaderLineExtension(); + } + + return 0; +} + +void LineAnnotation::setLineLeadingBackPoint( double point ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineLeadingBackPt = point; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + lineann->setLeaderLineExtension(point); + d->pdfAnnot->invalidateAppearance(); + } +} + +bool LineAnnotation::lineShowCaption() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineShowCaption; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + return lineann->getCaption(); + } + + return false; +} + +void LineAnnotation::setLineShowCaption( bool show ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineShowCaption = show; + return; + } + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine *lineann = static_cast(d->pdfAnnot); + lineann->setCaption(show); + d->pdfAnnot->invalidateAppearance(); + } +} + +LineAnnotation::LineIntent LineAnnotation::lineIntent() const +{ + Q_D( const LineAnnotation ); + + if (!d->pdfAnnot) + return d->lineIntent; + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + const AnnotLine * lineann = static_cast(d->pdfAnnot); + return (LineAnnotation::LineIntent)( lineann->getIntent() + 1 ); + } + else + { + const AnnotPolygon * polyann = static_cast(d->pdfAnnot); + if ( polyann->getIntent() == AnnotPolygon::polygonCloud ) + return LineAnnotation::PolygonCloud; + else // AnnotPolygon::polylineDimension, AnnotPolygon::polygonDimension + return LineAnnotation::Dimension; + } +} + +void LineAnnotation::setLineIntent( LineAnnotation::LineIntent intent ) +{ + Q_D( LineAnnotation ); + + if (!d->pdfAnnot) + { + d->lineIntent = intent; + return; + } + + if ( intent == LineAnnotation::Unknown ) + return; // Do not set (actually, it should clear the property) + + if (d->pdfAnnot->getType() == Annot::typeLine) + { + AnnotLine * lineann = static_cast(d->pdfAnnot); + lineann->setIntent((AnnotLine::AnnotLineIntent)( intent - 1 )); + } + else + { + AnnotPolygon * polyann = static_cast(d->pdfAnnot); + if ( intent == LineAnnotation::PolygonCloud) + polyann->setIntent( AnnotPolygon::polygonCloud ); + else // LineAnnotation::Dimension + { + if ( d->pdfAnnot->getType() == Annot::typePolygon ) + polyann->setIntent( AnnotPolygon::polygonDimension ); + else // Annot::typePolyLine + polyann->setIntent( AnnotPolygon::polylineDimension ); + } + } + + d->pdfAnnot->invalidateAppearance(); +} + + +/** GeomAnnotation [Annotation] */ +class GeomAnnotationPrivate : public AnnotationPrivate +{ + public: + GeomAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields (note uses border for rendering style) + GeomAnnotation::GeomType geomType; + QColor geomInnerColor; +}; + +GeomAnnotationPrivate::GeomAnnotationPrivate() + : AnnotationPrivate(), geomType( GeomAnnotation::InscribedSquare ) +{ +} + +Annotation * GeomAnnotationPrivate::makeAlias() +{ + return new GeomAnnotation(*this); +} + +Annot* GeomAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + // Setters are defined in the public class + GeomAnnotation *q = static_cast( makeAlias() ); + + // Set page and document + pdfPage = destPage; + parentDoc = doc; + + Annot::AnnotSubtype type; + if (geomType == GeomAnnotation::InscribedSquare) + type = Annot::typeSquare; + else // GeomAnnotation::InscribedCircle + type = Annot::typeCircle; + + // Set pdfAnnot + PDFRectangle rect = toPdfRectangle(boundary); + pdfAnnot = new AnnotGeometry(destPage->getDoc(), &rect, type); + + // Set properties + flushBaseAnnotationProperties(); + q->setGeomInnerColor(geomInnerColor); + + delete q; + return pdfAnnot; +} + +GeomAnnotation::GeomAnnotation() + : Annotation( *new GeomAnnotationPrivate() ) +{} + +GeomAnnotation::GeomAnnotation(GeomAnnotationPrivate &dd) + : Annotation( dd ) +{} + +GeomAnnotation::GeomAnnotation( const QDomNode & node ) + : Annotation( *new GeomAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'geom' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "geom" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "type" ) ) + setGeomType((GeomAnnotation::GeomType)e.attribute( "type" ).toInt()); + if ( e.hasAttribute( "color" ) ) + setGeomInnerColor(QColor( e.attribute( "color" ) )); + + // loading complete + break; + } +} + +GeomAnnotation::~GeomAnnotation() +{ +} + +void GeomAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [geom] element + QDomElement geomElement = document.createElement( "geom" ); + node.appendChild( geomElement ); + + // append the optional attributes + if ( geomType() != InscribedSquare ) + geomElement.setAttribute( "type", (int)geomType() ); + if ( geomInnerColor().isValid() ) + geomElement.setAttribute( "color", geomInnerColor().name() ); +} + +Annotation::SubType GeomAnnotation::subType() const +{ + return AGeom; +} + +GeomAnnotation::GeomType GeomAnnotation::geomType() const +{ + Q_D( const GeomAnnotation ); + + if (!d->pdfAnnot) + return d->geomType; + + if (d->pdfAnnot->getType() == Annot::typeSquare) + return GeomAnnotation::InscribedSquare; + else // Annot::typeCircle + return GeomAnnotation::InscribedCircle; +} + +void GeomAnnotation::setGeomType( GeomAnnotation::GeomType type ) +{ + Q_D( GeomAnnotation ); + + if (!d->pdfAnnot) + { + d->geomType = type; + return; + } + + AnnotGeometry * geomann = static_cast(d->pdfAnnot); + if (type == GeomAnnotation::InscribedSquare) + geomann->setType(Annot::typeSquare); + else // GeomAnnotation::InscribedCircle + geomann->setType(Annot::typeCircle); + + d->pdfAnnot->invalidateAppearance(); +} + +QColor GeomAnnotation::geomInnerColor() const +{ + Q_D( const GeomAnnotation ); + + if (!d->pdfAnnot) + return d->geomInnerColor; + + const AnnotGeometry * geomann = static_cast(d->pdfAnnot); + return convertAnnotColor( geomann->getInteriorColor() ); +} + +void GeomAnnotation::setGeomInnerColor( const QColor &color ) +{ + Q_D( GeomAnnotation ); + + if (!d->pdfAnnot) + { + d->geomInnerColor = color; + return; + } + + AnnotGeometry * geomann = static_cast(d->pdfAnnot); + geomann->setInteriorColor(convertQColor( color )); + d->pdfAnnot->invalidateAppearance(); +} + + +/** HighlightAnnotation [Annotation] */ +class HighlightAnnotationPrivate : public AnnotationPrivate +{ + public: + HighlightAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + HighlightAnnotation::HighlightType highlightType; + QList< HighlightAnnotation::Quad > highlightQuads; // not empty + + // helpers + static Annot::AnnotSubtype toAnnotSubType( HighlightAnnotation::HighlightType type ); + QList< HighlightAnnotation::Quad > fromQuadrilaterals(AnnotQuadrilaterals *quads) const; + AnnotQuadrilaterals * toQuadrilaterals(const QList< HighlightAnnotation::Quad > &quads) const; +}; + +HighlightAnnotationPrivate::HighlightAnnotationPrivate() + : AnnotationPrivate(), highlightType( HighlightAnnotation::Highlight ) +{ +} + +Annotation * HighlightAnnotationPrivate::makeAlias() +{ + return new HighlightAnnotation(*this); +} + +Annot::AnnotSubtype HighlightAnnotationPrivate::toAnnotSubType( HighlightAnnotation::HighlightType type ) +{ + switch (type) + { + default: // HighlightAnnotation::Highlight: + return Annot::typeHighlight; + case HighlightAnnotation::Underline: + return Annot::typeUnderline; + case HighlightAnnotation::Squiggly: + return Annot::typeSquiggly; + case HighlightAnnotation::StrikeOut: + return Annot::typeStrikeOut; + } +} + +QList< HighlightAnnotation::Quad > HighlightAnnotationPrivate::fromQuadrilaterals(AnnotQuadrilaterals *hlquads) const +{ + QList< HighlightAnnotation::Quad > quads; + + if ( !hlquads || !hlquads->getQuadrilateralsLength() ) + return quads; + const int quadsCount = hlquads->getQuadrilateralsLength(); + + double MTX[6]; + fillMTX(MTX); + + for (int q = 0; q < quadsCount; ++q) + { + HighlightAnnotation::Quad quad; + XPDFReader::transform( MTX, hlquads->getX1( q ), hlquads->getY1( q ), quad.points[ 0 ] ); + XPDFReader::transform( MTX, hlquads->getX2( q ), hlquads->getY2( q ), quad.points[ 1 ] ); + XPDFReader::transform( MTX, hlquads->getX3( q ), hlquads->getY3( q ), quad.points[ 2 ] ); + XPDFReader::transform( MTX, hlquads->getX4( q ), hlquads->getY4( q ), quad.points[ 3 ] ); + // ### PDF1.6 specs says that point are in ccw order, but in fact + // points 3 and 4 are swapped in every PDF around! + QPointF tmpPoint = quad.points[ 2 ]; + quad.points[ 2 ] = quad.points[ 3 ]; + quad.points[ 3 ] = tmpPoint; + // initialize other properties and append quad + quad.capStart = true; // unlinked quads are always capped + quad.capEnd = true; // unlinked quads are always capped + quad.feather = 0.1; // default feather + quads.append( quad ); + } + + return quads; +} + +AnnotQuadrilaterals * HighlightAnnotationPrivate::toQuadrilaterals(const QList< HighlightAnnotation::Quad > &quads) const +{ + const int count = quads.size(); + AnnotQuadrilaterals::AnnotQuadrilateral **ac = + (AnnotQuadrilaterals::AnnotQuadrilateral**) + gmallocn( count, sizeof(AnnotQuadrilaterals::AnnotQuadrilateral*) ); + + double MTX[6]; + fillMTX(MTX); + + int pos = 0; + foreach (const HighlightAnnotation::Quad &q, quads) + { + double x1, y1, x2, y2, x3, y3, x4, y4; + XPDFReader::invTransform( MTX, q.points[0], x1, y1 ); + XPDFReader::invTransform( MTX, q.points[1], x2, y2 ); + // Swap points 3 and 4 (see HighlightAnnotationPrivate::fromQuadrilaterals) + XPDFReader::invTransform( MTX, q.points[3], x3, y3 ); + XPDFReader::invTransform( MTX, q.points[2], x4, y4 ); + ac[pos++] = new AnnotQuadrilaterals::AnnotQuadrilateral(x1, y1, x2, y2, x3, y3, x4, y4); + } + + return new AnnotQuadrilaterals(ac, count); +} + +Annot* HighlightAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + // Set page and document + pdfPage = destPage; + parentDoc = doc; + + // Set pdfAnnot + PDFRectangle rect = toPdfRectangle(boundary); + AnnotQuadrilaterals * quads = toQuadrilaterals(highlightQuads); + pdfAnnot = new AnnotTextMarkup(destPage->getDoc(), &rect, toAnnotSubType(highlightType), quads); + delete quads; + + // Set properties + flushBaseAnnotationProperties(); + + highlightQuads.clear(); // Free up memory + + return pdfAnnot; +} + +HighlightAnnotation::HighlightAnnotation() + : Annotation( *new HighlightAnnotationPrivate() ) +{} + +HighlightAnnotation::HighlightAnnotation(HighlightAnnotationPrivate &dd) + : Annotation( dd ) +{} + +HighlightAnnotation::HighlightAnnotation( const QDomNode & node ) + : Annotation( *new HighlightAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'hl' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "hl" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "type" ) ) + setHighlightType((HighlightAnnotation::HighlightType)e.attribute( "type" ).toInt()); + + // parse all 'quad' subnodes + QList quads; + QDomNode quadNode = e.firstChild(); + for ( ; quadNode.isElement(); quadNode = quadNode.nextSibling() ) + { + QDomElement qe = quadNode.toElement(); + if ( qe.tagName() != "quad" ) + continue; + + Quad q; + q.points[0].setX(qe.attribute( "ax", "0.0" ).toDouble()); + q.points[0].setY(qe.attribute( "ay", "0.0" ).toDouble()); + q.points[1].setX(qe.attribute( "bx", "0.0" ).toDouble()); + q.points[1].setY(qe.attribute( "by", "0.0" ).toDouble()); + q.points[2].setX(qe.attribute( "cx", "0.0" ).toDouble()); + q.points[2].setY(qe.attribute( "cy", "0.0" ).toDouble()); + q.points[3].setX(qe.attribute( "dx", "0.0" ).toDouble()); + q.points[3].setY(qe.attribute( "dy", "0.0" ).toDouble()); + q.capStart = qe.hasAttribute( "start" ); + q.capEnd = qe.hasAttribute( "end" ); + q.feather = qe.attribute( "feather", "0.1" ).toDouble(); + quads.append( q ); + } + setHighlightQuads(quads); + + // loading complete + break; + } +} + +HighlightAnnotation::~HighlightAnnotation() +{ +} + +void HighlightAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [hl] element + QDomElement hlElement = document.createElement( "hl" ); + node.appendChild( hlElement ); + + // append the optional attributes + if ( highlightType() != Highlight ) + hlElement.setAttribute( "type", (int)highlightType() ); + + const QList quads = highlightQuads(); + if ( quads.count() < 1 ) + return; + // append highlight quads, all children describe quads + QList< HighlightAnnotation::Quad >::const_iterator it = quads.begin(), end = quads.end(); + for ( ; it != end; ++it ) + { + QDomElement quadElement = document.createElement( "quad" ); + hlElement.appendChild( quadElement ); + const Quad & q = *it; + quadElement.setAttribute( "ax", QString::number( q.points[0].x() ) ); + quadElement.setAttribute( "ay", QString::number( q.points[0].y() ) ); + quadElement.setAttribute( "bx", QString::number( q.points[1].x() ) ); + quadElement.setAttribute( "by", QString::number( q.points[1].y() ) ); + quadElement.setAttribute( "cx", QString::number( q.points[2].x() ) ); + quadElement.setAttribute( "cy", QString::number( q.points[2].y() ) ); + quadElement.setAttribute( "dx", QString::number( q.points[3].x() ) ); + quadElement.setAttribute( "dy", QString::number( q.points[3].y() ) ); + if ( q.capStart ) + quadElement.setAttribute( "start", 1 ); + if ( q.capEnd ) + quadElement.setAttribute( "end", 1 ); + quadElement.setAttribute( "feather", QString::number( q.feather ) ); + } +} + +Annotation::SubType HighlightAnnotation::subType() const +{ + return AHighlight; +} + +HighlightAnnotation::HighlightType HighlightAnnotation::highlightType() const +{ + Q_D( const HighlightAnnotation ); + + if (!d->pdfAnnot) + return d->highlightType; + + Annot::AnnotSubtype subType = d->pdfAnnot->getType(); + + if ( subType == Annot::typeHighlight ) + return HighlightAnnotation::Highlight; + else if ( subType == Annot::typeUnderline ) + return HighlightAnnotation::Underline; + else if ( subType == Annot::typeSquiggly ) + return HighlightAnnotation::Squiggly; + else // Annot::typeStrikeOut + return HighlightAnnotation::StrikeOut; +} + +void HighlightAnnotation::setHighlightType( HighlightAnnotation::HighlightType type ) +{ + Q_D( HighlightAnnotation ); + + if (!d->pdfAnnot) + { + d->highlightType = type; + return; + } + + AnnotTextMarkup * hlann = static_cast(d->pdfAnnot); + hlann->setType(HighlightAnnotationPrivate::toAnnotSubType( type )); + d->pdfAnnot->invalidateAppearance(); +} + +QList< HighlightAnnotation::Quad > HighlightAnnotation::highlightQuads() const +{ + Q_D( const HighlightAnnotation ); + + if (!d->pdfAnnot) + return d->highlightQuads; + + const AnnotTextMarkup * hlann = static_cast(d->pdfAnnot); + return d->fromQuadrilaterals( hlann->getQuadrilaterals() ); +} + +void HighlightAnnotation::setHighlightQuads( const QList< HighlightAnnotation::Quad > &quads ) +{ + Q_D( HighlightAnnotation ); + + if (!d->pdfAnnot) + { + d->highlightQuads = quads; + return; + } + + AnnotTextMarkup * hlann = static_cast(d->pdfAnnot); + AnnotQuadrilaterals * quadrilaterals = d->toQuadrilaterals(quads); + hlann->setQuadrilaterals(quadrilaterals); + delete quadrilaterals; + d->pdfAnnot->invalidateAppearance(); +} + + +/** StampAnnotation [Annotation] */ +class StampAnnotationPrivate : public AnnotationPrivate +{ + public: + StampAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + QString stampIconName; +}; + +StampAnnotationPrivate::StampAnnotationPrivate() + : AnnotationPrivate(), stampIconName( "Draft" ) +{ +} + +Annotation * StampAnnotationPrivate::makeAlias() +{ + return new StampAnnotation(*this); +} + +Annot* StampAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + StampAnnotation *q = static_cast( makeAlias() ); + + // Set page and document + pdfPage = destPage; + parentDoc = doc; + + // Set pdfAnnot + PDFRectangle rect = toPdfRectangle(boundary); + pdfAnnot = new AnnotStamp(destPage->getDoc(), &rect); + + // Set properties + flushBaseAnnotationProperties(); + q->setStampIconName(stampIconName); + + delete q; + + stampIconName.clear(); // Free up memory + + return pdfAnnot; +} + +StampAnnotation::StampAnnotation() + : Annotation( *new StampAnnotationPrivate() ) +{} + +StampAnnotation::StampAnnotation(StampAnnotationPrivate &dd) + : Annotation( dd ) +{} + +StampAnnotation::StampAnnotation( const QDomNode & node ) + : Annotation( *new StampAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'stamp' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "stamp" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "icon" ) ) + setStampIconName(e.attribute( "icon" )); + + // loading complete + break; + } +} + +StampAnnotation::~StampAnnotation() +{ +} + +void StampAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [stamp] element + QDomElement stampElement = document.createElement( "stamp" ); + node.appendChild( stampElement ); + + // append the optional attributes + if ( stampIconName() != "Draft" ) + stampElement.setAttribute( "icon", stampIconName() ); +} + +Annotation::SubType StampAnnotation::subType() const +{ + return AStamp; +} + +QString StampAnnotation::stampIconName() const +{ + Q_D( const StampAnnotation ); + + if (!d->pdfAnnot) + return d->stampIconName; + + const AnnotStamp * stampann = static_cast(d->pdfAnnot); + return QString::fromLatin1( stampann->getIcon()->getCString() ); +} + +void StampAnnotation::setStampIconName( const QString &name ) +{ + Q_D( StampAnnotation ); + + if (!d->pdfAnnot) + { + d->stampIconName = name; + return; + } + + AnnotStamp * stampann = static_cast(d->pdfAnnot); + QByteArray encoded = name.toLatin1(); + GooString s(encoded.constData()); + stampann->setIcon(&s); + d->pdfAnnot->invalidateAppearance(); +} + +/** InkAnnotation [Annotation] */ +class InkAnnotationPrivate : public AnnotationPrivate +{ + public: + InkAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + QList< QLinkedList > inkPaths; + + // helper + AnnotPath **toAnnotPaths(const QList< QLinkedList > &inkPaths); +}; + +InkAnnotationPrivate::InkAnnotationPrivate() + : AnnotationPrivate() +{ +} + +Annotation * InkAnnotationPrivate::makeAlias() +{ + return new InkAnnotation(*this); +} + +// Note: Caller is required to delete array elements and the array itself after use +AnnotPath **InkAnnotationPrivate::toAnnotPaths(const QList< QLinkedList > &inkPaths) +{ + const int pathsNumber = inkPaths.size(); + AnnotPath **res = new AnnotPath*[pathsNumber]; + for (int i = 0; i < pathsNumber; ++i) + res[i] = toAnnotPath( inkPaths[i] ); + return res; +} + +Annot* InkAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + // Set page and document + pdfPage = destPage; + parentDoc = doc; + + // Set pdfAnnot + PDFRectangle rect = toPdfRectangle(boundary); + AnnotPath **paths = toAnnotPaths(inkPaths); + const int pathsNumber = inkPaths.size(); + pdfAnnot = new AnnotInk(destPage->getDoc(), &rect, paths, pathsNumber); + + for (int i = 0; i < pathsNumber; ++i) + delete paths[i]; + delete[] paths; + + // Set properties + flushBaseAnnotationProperties(); + + inkPaths.clear(); // Free up memory + + return pdfAnnot; +} + +InkAnnotation::InkAnnotation() + : Annotation( *new InkAnnotationPrivate() ) +{} + +InkAnnotation::InkAnnotation(InkAnnotationPrivate &dd) + : Annotation( dd ) +{} + +InkAnnotation::InkAnnotation( const QDomNode & node ) + : Annotation( *new InkAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'ink' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "ink" ) + continue; + + // parse the 'path' subnodes + QList< QLinkedList > paths; + QDomNode pathNode = e.firstChild(); + while ( pathNode.isElement() ) + { + QDomElement pathElement = pathNode.toElement(); + pathNode = pathNode.nextSibling(); + + if ( pathElement.tagName() != "path" ) + continue; + + // build each path parsing 'point' subnodes + QLinkedList path; + QDomNode pointNode = pathElement.firstChild(); + while ( pointNode.isElement() ) + { + QDomElement pointElement = pointNode.toElement(); + pointNode = pointNode.nextSibling(); + + if ( pointElement.tagName() != "point" ) + continue; + + QPointF p(pointElement.attribute( "x", "0.0" ).toDouble(), pointElement.attribute( "y", "0.0" ).toDouble()); + path.append( p ); + } + + // add the path to the path list if it contains at least 2 nodes + if ( path.count() >= 2 ) + paths.append( path ); + } + setInkPaths(paths); + + // loading complete + break; + } +} + +InkAnnotation::~InkAnnotation() +{ +} + +void InkAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [ink] element + QDomElement inkElement = document.createElement( "ink" ); + node.appendChild( inkElement ); + + // append the optional attributes + const QList< QLinkedList > paths = inkPaths(); + if ( paths.count() < 1 ) + return; + QList< QLinkedList >::const_iterator pIt = paths.begin(), pEnd = paths.end(); + for ( ; pIt != pEnd; ++pIt ) + { + QDomElement pathElement = document.createElement( "path" ); + inkElement.appendChild( pathElement ); + const QLinkedList & path = *pIt; + QLinkedList::const_iterator iIt = path.begin(), iEnd = path.end(); + for ( ; iIt != iEnd; ++iIt ) + { + const QPointF & point = *iIt; + QDomElement pointElement = document.createElement( "point" ); + pathElement.appendChild( pointElement ); + pointElement.setAttribute( "x", QString::number( point.x() ) ); + pointElement.setAttribute( "y", QString::number( point.y() ) ); + } + } +} + +Annotation::SubType InkAnnotation::subType() const +{ + return AInk; +} + +QList< QLinkedList > InkAnnotation::inkPaths() const +{ + Q_D( const InkAnnotation ); + + if (!d->pdfAnnot) + return d->inkPaths; + + const AnnotInk * inkann = static_cast(d->pdfAnnot); + + const AnnotPath * const* paths = inkann->getInkList(); + if ( !paths || !inkann->getInkListLength() ) + return QList< QLinkedList >(); + + double MTX[6]; + d->fillMTX(MTX); + + const int pathsNumber = inkann->getInkListLength(); + QList< QLinkedList > inkPaths; + for (int m = 0; m < pathsNumber; ++m) + { + // transform each path in a list of normalized points .. + QLinkedList localList; + const AnnotPath * path = paths[ m ]; + const int pointsNumber = path ? path->getCoordsLength() : 0; + for (int n = 0; n < pointsNumber; ++n) + { + QPointF point; + XPDFReader::transform(MTX, path->getX(n), path->getY(n), point); + localList.append(point); + } + // ..and add it to the annotation + inkPaths.append( localList ); + } + return inkPaths; +} + +void InkAnnotation::setInkPaths( const QList< QLinkedList > &paths ) +{ + Q_D( InkAnnotation ); + + if (!d->pdfAnnot) + { + d->inkPaths = paths; + return; + } + + AnnotInk * inkann = static_cast(d->pdfAnnot); + AnnotPath **annotpaths = d->toAnnotPaths(paths); + const int pathsNumber = paths.size(); + inkann->setInkList(annotpaths, pathsNumber); + + for (int i = 0; i < pathsNumber; ++i) + delete annotpaths[i]; + delete[] annotpaths; + + d->pdfAnnot->invalidateAppearance(); +} + + +/** LinkAnnotation [Annotation] */ +class LinkAnnotationPrivate : public AnnotationPrivate +{ + public: + LinkAnnotationPrivate(); + ~LinkAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + Link * linkDestination; + LinkAnnotation::HighlightMode linkHLMode; + QPointF linkRegion[4]; +}; + +LinkAnnotationPrivate::LinkAnnotationPrivate() + : AnnotationPrivate(), linkDestination( 0 ), linkHLMode( LinkAnnotation::Invert ) +{ +} + +LinkAnnotationPrivate::~LinkAnnotationPrivate() +{ + delete linkDestination; +} + +Annotation * LinkAnnotationPrivate::makeAlias() +{ + return new LinkAnnotation(*this); +} + +Annot* LinkAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + return 0; // Not implemented +} + +LinkAnnotation::LinkAnnotation() + : Annotation( *new LinkAnnotationPrivate() ) +{} + +LinkAnnotation::LinkAnnotation(LinkAnnotationPrivate &dd) + : Annotation( dd ) +{} + +LinkAnnotation::LinkAnnotation( const QDomNode & node ) + : Annotation( *new LinkAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'link' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "link" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "hlmode" ) ) + setLinkHighlightMode((LinkAnnotation::HighlightMode)e.attribute( "hlmode" ).toInt()); + + // parse all 'quad' subnodes + QDomNode quadNode = e.firstChild(); + for ( ; quadNode.isElement(); quadNode = quadNode.nextSibling() ) + { + QDomElement qe = quadNode.toElement(); + if ( qe.tagName() == "quad" ) + { + setLinkRegionPoint(0, QPointF(qe.attribute( "ax", "0.0" ).toDouble(), + qe.attribute( "ay", "0.0" ).toDouble())); + setLinkRegionPoint(1, QPointF(qe.attribute( "bx", "0.0" ).toDouble(), + qe.attribute( "by", "0.0" ).toDouble())); + setLinkRegionPoint(2, QPointF(qe.attribute( "cx", "0.0" ).toDouble(), + qe.attribute( "cy", "0.0" ).toDouble())); + setLinkRegionPoint(3, QPointF(qe.attribute( "dx", "0.0" ).toDouble(), + qe.attribute( "dy", "0.0" ).toDouble())); + } + else if ( qe.tagName() == "link" ) + { + QString type = qe.attribute( "type" ); + if ( type == "GoTo" ) + { + Poppler::LinkGoto * go = new Poppler::LinkGoto( QRect(), qe.attribute( "filename" ), LinkDestination( qe.attribute( "destination" ) ) ); + setLinkDestination(go); + } + else if ( type == "Exec" ) + { + Poppler::LinkExecute * exec = new Poppler::LinkExecute( QRect(), qe.attribute( "filename" ), qe.attribute( "parameters" ) ); + setLinkDestination(exec); + } + else if ( type == "Browse" ) + { + Poppler::LinkBrowse * browse = new Poppler::LinkBrowse( QRect(), qe.attribute( "url" ) ); + setLinkDestination(browse); + } + else if ( type == "Action" ) + { + Poppler::LinkAction::ActionType act; + QString actString = qe.attribute( "action" ); + bool found = true; + if ( actString == "PageFirst" ) + act = Poppler::LinkAction::PageFirst; + else if ( actString == "PagePrev" ) + act = Poppler::LinkAction::PagePrev; + else if ( actString == "PageNext" ) + act = Poppler::LinkAction::PageNext; + else if ( actString == "PageLast" ) + act = Poppler::LinkAction::PageLast; + else if ( actString == "HistoryBack" ) + act = Poppler::LinkAction::HistoryBack; + else if ( actString == "HistoryForward" ) + act = Poppler::LinkAction::HistoryForward; + else if ( actString == "Quit" ) + act = Poppler::LinkAction::Quit; + else if ( actString == "Presentation" ) + act = Poppler::LinkAction::Presentation; + else if ( actString == "EndPresentation" ) + act = Poppler::LinkAction::EndPresentation; + else if ( actString == "Find" ) + act = Poppler::LinkAction::Find; + else if ( actString == "GoToPage" ) + act = Poppler::LinkAction::GoToPage; + else if ( actString == "Close" ) + act = Poppler::LinkAction::Close; + else if ( actString == "Print" ) + act = Poppler::LinkAction::Print; + else + found = false; + if (found) + { + Poppler::LinkAction * action = new Poppler::LinkAction( QRect(), act ); + setLinkDestination(action); + } + } +#if 0 + else if ( type == "Movie" ) + { + Poppler::LinkMovie * movie = new Poppler::LinkMovie( QRect() ); + setLinkDestination(movie); + } +#endif + } + } + + // loading complete + break; + } +} + +LinkAnnotation::~LinkAnnotation() +{ +} + +void LinkAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [hl] element + QDomElement linkElement = document.createElement( "link" ); + node.appendChild( linkElement ); + + // append the optional attributes + if ( linkHighlightMode() != Invert ) + linkElement.setAttribute( "hlmode", (int)linkHighlightMode() ); + + // saving region + QDomElement quadElement = document.createElement( "quad" ); + linkElement.appendChild( quadElement ); + quadElement.setAttribute( "ax", QString::number( linkRegionPoint(0).x() ) ); + quadElement.setAttribute( "ay", QString::number( linkRegionPoint(0).y() ) ); + quadElement.setAttribute( "bx", QString::number( linkRegionPoint(1).x() ) ); + quadElement.setAttribute( "by", QString::number( linkRegionPoint(1).y() ) ); + quadElement.setAttribute( "cx", QString::number( linkRegionPoint(2).x() ) ); + quadElement.setAttribute( "cy", QString::number( linkRegionPoint(2).y() ) ); + quadElement.setAttribute( "dx", QString::number( linkRegionPoint(3).x() ) ); + quadElement.setAttribute( "dy", QString::number( linkRegionPoint(3).y() ) ); + + // saving link + QDomElement hyperlinkElement = document.createElement( "link" ); + linkElement.appendChild( hyperlinkElement ); + if ( linkDestination() ) + { + switch( linkDestination()->linkType() ) + { + case Poppler::Link::Goto: + { + Poppler::LinkGoto * go = static_cast< Poppler::LinkGoto * >( linkDestination() ); + hyperlinkElement.setAttribute( "type", "GoTo" ); + hyperlinkElement.setAttribute( "filename", go->fileName() ); + hyperlinkElement.setAttribute( "destionation", go->destination().toString() ); + break; + } + case Poppler::Link::Execute: + { + Poppler::LinkExecute * exec = static_cast< Poppler::LinkExecute * >( linkDestination() ); + hyperlinkElement.setAttribute( "type", "Exec" ); + hyperlinkElement.setAttribute( "filename", exec->fileName() ); + hyperlinkElement.setAttribute( "parameters", exec->parameters() ); + break; + } + case Poppler::Link::Browse: + { + Poppler::LinkBrowse * browse = static_cast< Poppler::LinkBrowse * >( linkDestination() ); + hyperlinkElement.setAttribute( "type", "Browse" ); + hyperlinkElement.setAttribute( "url", browse->url() ); + break; + } + case Poppler::Link::Action: + { + Poppler::LinkAction * action = static_cast< Poppler::LinkAction * >( linkDestination() ); + hyperlinkElement.setAttribute( "type", "Action" ); + switch ( action->actionType() ) + { + case Poppler::LinkAction::PageFirst: + hyperlinkElement.setAttribute( "action", "PageFirst" ); + break; + case Poppler::LinkAction::PagePrev: + hyperlinkElement.setAttribute( "action", "PagePrev" ); + break; + case Poppler::LinkAction::PageNext: + hyperlinkElement.setAttribute( "action", "PageNext" ); + break; + case Poppler::LinkAction::PageLast: + hyperlinkElement.setAttribute( "action", "PageLast" ); + break; + case Poppler::LinkAction::HistoryBack: + hyperlinkElement.setAttribute( "action", "HistoryBack" ); + break; + case Poppler::LinkAction::HistoryForward: + hyperlinkElement.setAttribute( "action", "HistoryForward" ); + break; + case Poppler::LinkAction::Quit: + hyperlinkElement.setAttribute( "action", "Quit" ); + break; + case Poppler::LinkAction::Presentation: + hyperlinkElement.setAttribute( "action", "Presentation" ); + break; + case Poppler::LinkAction::EndPresentation: + hyperlinkElement.setAttribute( "action", "EndPresentation" ); + break; + case Poppler::LinkAction::Find: + hyperlinkElement.setAttribute( "action", "Find" ); + break; + case Poppler::LinkAction::GoToPage: + hyperlinkElement.setAttribute( "action", "GoToPage" ); + break; + case Poppler::LinkAction::Close: + hyperlinkElement.setAttribute( "action", "Close" ); + break; + case Poppler::LinkAction::Print: + hyperlinkElement.setAttribute( "action", "Print" ); + break; + } + break; + } + case Poppler::Link::Movie: + { + hyperlinkElement.setAttribute( "type", "Movie" ); + break; + } + case Poppler::Link::Rendition: + { + hyperlinkElement.setAttribute( "type", "Rendition" ); + break; + } + case Poppler::Link::Sound: + { + // FIXME: implement me + break; + } + case Poppler::Link::None: + break; + } + } +} + +Annotation::SubType LinkAnnotation::subType() const +{ + return ALink; +} + +Link* LinkAnnotation::linkDestination() const +{ + Q_D( const LinkAnnotation ); + return d->linkDestination; +} + +void LinkAnnotation::setLinkDestination( Link *link ) +{ + Q_D( LinkAnnotation ); + delete d->linkDestination; + d->linkDestination = link; +} + +LinkAnnotation::HighlightMode LinkAnnotation::linkHighlightMode() const +{ + Q_D( const LinkAnnotation ); + return d->linkHLMode; +} + +void LinkAnnotation::setLinkHighlightMode( LinkAnnotation::HighlightMode mode ) +{ + Q_D( LinkAnnotation ); + d->linkHLMode = mode; +} + +QPointF LinkAnnotation::linkRegionPoint( int id ) const +{ + if ( id < 0 || id >= 4 ) + return QPointF(); + + Q_D( const LinkAnnotation ); + return d->linkRegion[id]; +} + +void LinkAnnotation::setLinkRegionPoint( int id, const QPointF &point ) +{ + if ( id < 0 || id >= 4 ) + return; + + Q_D( LinkAnnotation ); + d->linkRegion[id] = point; +} + +/** CaretAnnotation [Annotation] */ +class CaretAnnotationPrivate : public AnnotationPrivate +{ + public: + CaretAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + CaretAnnotation::CaretSymbol symbol; +}; + +static QString caretSymbolToString( CaretAnnotation::CaretSymbol symbol ) +{ + switch ( symbol ) + { + case CaretAnnotation::None: + return QString::fromLatin1( "None" ); + case CaretAnnotation::P: + return QString::fromLatin1( "P" ); + } + return QString(); +} + +static CaretAnnotation::CaretSymbol caretSymbolFromString( const QString &symbol ) +{ + if ( symbol == QLatin1String( "None" ) ) + return CaretAnnotation::None; + else if ( symbol == QLatin1String( "P" ) ) + return CaretAnnotation::P; + return CaretAnnotation::None; +} + +CaretAnnotationPrivate::CaretAnnotationPrivate() + : AnnotationPrivate(), symbol( CaretAnnotation::None ) +{ +} + +Annotation * CaretAnnotationPrivate::makeAlias() +{ + return new CaretAnnotation(*this); +} + +Annot* CaretAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + // Setters are defined in the public class + CaretAnnotation *q = static_cast( makeAlias() ); + + // Set page and document + pdfPage = destPage; + parentDoc = doc; + + // Set pdfAnnot + PDFRectangle rect = toPdfRectangle(boundary); + pdfAnnot = new AnnotCaret(destPage->getDoc(), &rect); + + // Set properties + flushBaseAnnotationProperties(); + q->setCaretSymbol(symbol); + + delete q; + return pdfAnnot; +} + +CaretAnnotation::CaretAnnotation() + : Annotation( *new CaretAnnotationPrivate() ) +{ +} + +CaretAnnotation::CaretAnnotation(CaretAnnotationPrivate &dd) + : Annotation( dd ) +{ +} + +CaretAnnotation::CaretAnnotation( const QDomNode & node ) + : Annotation( *new CaretAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'caret' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "caret" ) + continue; + + // parse the attributes + if ( e.hasAttribute( "symbol" ) ) + setCaretSymbol(caretSymbolFromString( e.attribute( "symbol" ) )); + + // loading complete + break; + } +} + +CaretAnnotation::~CaretAnnotation() +{ +} + +void CaretAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [caret] element + QDomElement caretElement = document.createElement( "caret" ); + node.appendChild( caretElement ); + + // append the optional attributes + if ( caretSymbol() != CaretAnnotation::None ) + caretElement.setAttribute( "symbol", caretSymbolToString( caretSymbol() ) ); +} + +Annotation::SubType CaretAnnotation::subType() const +{ + return ACaret; +} + +CaretAnnotation::CaretSymbol CaretAnnotation::caretSymbol() const +{ + Q_D( const CaretAnnotation ); + + if (!d->pdfAnnot) + return d->symbol; + + const AnnotCaret * caretann = static_cast(d->pdfAnnot); + return (CaretAnnotation::CaretSymbol)caretann->getSymbol(); +} + +void CaretAnnotation::setCaretSymbol( CaretAnnotation::CaretSymbol symbol ) +{ + Q_D( CaretAnnotation ); + + if (!d->pdfAnnot) + { + d->symbol = symbol; + return; + } + + AnnotCaret * caretann = static_cast(d->pdfAnnot); + caretann->setSymbol((AnnotCaret::AnnotCaretSymbol)symbol); + d->pdfAnnot->invalidateAppearance(); +} + +/** FileAttachmentAnnotation [Annotation] */ +class FileAttachmentAnnotationPrivate : public AnnotationPrivate +{ + public: + FileAttachmentAnnotationPrivate(); + ~FileAttachmentAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + QString icon; + EmbeddedFile *embfile; +}; + +FileAttachmentAnnotationPrivate::FileAttachmentAnnotationPrivate() + : AnnotationPrivate(), icon( "PushPin" ), embfile( 0 ) +{ +} + +FileAttachmentAnnotationPrivate::~FileAttachmentAnnotationPrivate() +{ + delete embfile; +} + +Annotation * FileAttachmentAnnotationPrivate::makeAlias() +{ + return new FileAttachmentAnnotation(*this); +} + +Annot* FileAttachmentAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + return 0; // Not implemented +} + +FileAttachmentAnnotation::FileAttachmentAnnotation() + : Annotation( *new FileAttachmentAnnotationPrivate() ) +{ +} + +FileAttachmentAnnotation::FileAttachmentAnnotation(FileAttachmentAnnotationPrivate &dd) + : Annotation( dd ) +{ +} + +FileAttachmentAnnotation::FileAttachmentAnnotation( const QDomNode & node ) + : Annotation( *new FileAttachmentAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'fileattachment' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "fileattachment" ) + continue; + + // loading complete + break; + } +} + +FileAttachmentAnnotation::~FileAttachmentAnnotation() +{ +} + +void FileAttachmentAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [fileattachment] element + QDomElement fileAttachmentElement = document.createElement( "fileattachment" ); + node.appendChild( fileAttachmentElement ); +} + +Annotation::SubType FileAttachmentAnnotation::subType() const +{ + return AFileAttachment; +} + +QString FileAttachmentAnnotation::fileIconName() const +{ + Q_D( const FileAttachmentAnnotation ); + return d->icon; +} + +void FileAttachmentAnnotation::setFileIconName( const QString &icon ) +{ + Q_D( FileAttachmentAnnotation ); + d->icon = icon; +} + +EmbeddedFile* FileAttachmentAnnotation::embeddedFile() const +{ + Q_D( const FileAttachmentAnnotation ); + return d->embfile; +} + +void FileAttachmentAnnotation::setEmbeddedFile( EmbeddedFile *ef ) +{ + Q_D( FileAttachmentAnnotation ); + d->embfile = ef; +} + +/** SoundAnnotation [Annotation] */ +class SoundAnnotationPrivate : public AnnotationPrivate +{ + public: + SoundAnnotationPrivate(); + ~SoundAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + QString icon; + SoundObject *sound; +}; + +SoundAnnotationPrivate::SoundAnnotationPrivate() + : AnnotationPrivate(), icon( "Speaker" ), sound( 0 ) +{ +} + +SoundAnnotationPrivate::~SoundAnnotationPrivate() +{ + delete sound; +} + +Annotation * SoundAnnotationPrivate::makeAlias() +{ + return new SoundAnnotation(*this); +} + +Annot* SoundAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + return 0; // Not implemented +} + +SoundAnnotation::SoundAnnotation() + : Annotation( *new SoundAnnotationPrivate() ) +{ +} + +SoundAnnotation::SoundAnnotation(SoundAnnotationPrivate &dd) + : Annotation( dd ) +{ +} + +SoundAnnotation::SoundAnnotation( const QDomNode & node ) + : Annotation( *new SoundAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'sound' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "sound" ) + continue; + + // loading complete + break; + } +} + +SoundAnnotation::~SoundAnnotation() +{ +} + +void SoundAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [sound] element + QDomElement soundElement = document.createElement( "sound" ); + node.appendChild( soundElement ); +} + +Annotation::SubType SoundAnnotation::subType() const +{ + return ASound; +} + +QString SoundAnnotation::soundIconName() const +{ + Q_D( const SoundAnnotation ); + return d->icon; +} + +void SoundAnnotation::setSoundIconName( const QString &icon ) +{ + Q_D( SoundAnnotation ); + d->icon = icon; +} + +SoundObject* SoundAnnotation::sound() const +{ + Q_D( const SoundAnnotation ); + return d->sound; +} + +void SoundAnnotation::setSound( SoundObject *s ) +{ + Q_D( SoundAnnotation ); + d->sound = s; +} + +/** MovieAnnotation [Annotation] */ +class MovieAnnotationPrivate : public AnnotationPrivate +{ + public: + MovieAnnotationPrivate(); + ~MovieAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + MovieObject *movie; + QString title; +}; + +MovieAnnotationPrivate::MovieAnnotationPrivate() + : AnnotationPrivate(), movie( 0 ) +{ +} + +MovieAnnotationPrivate::~MovieAnnotationPrivate() +{ + delete movie; +} + +Annotation * MovieAnnotationPrivate::makeAlias() +{ + return new MovieAnnotation(*this); +} + +Annot* MovieAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + return 0; // Not implemented +} + +MovieAnnotation::MovieAnnotation() + : Annotation( *new MovieAnnotationPrivate() ) +{ +} + +MovieAnnotation::MovieAnnotation(MovieAnnotationPrivate &dd) + : Annotation( dd ) +{ +} + +MovieAnnotation::MovieAnnotation( const QDomNode & node ) + : Annotation( *new MovieAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'movie' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "movie" ) + continue; + + // loading complete + break; + } +} + +MovieAnnotation::~MovieAnnotation() +{ +} + +void MovieAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [movie] element + QDomElement movieElement = document.createElement( "movie" ); + node.appendChild( movieElement ); +} + +Annotation::SubType MovieAnnotation::subType() const +{ + return AMovie; +} + +MovieObject* MovieAnnotation::movie() const +{ + Q_D( const MovieAnnotation ); + return d->movie; +} + +void MovieAnnotation::setMovie( MovieObject *movie ) +{ + Q_D( MovieAnnotation ); + d->movie = movie; +} + +QString MovieAnnotation::movieTitle() const +{ + Q_D( const MovieAnnotation ); + return d->title; +} + +void MovieAnnotation::setMovieTitle( const QString &title ) +{ + Q_D( MovieAnnotation ); + d->title = title; +} + +/** ScreenAnnotation [Annotation] */ +class ScreenAnnotationPrivate : public AnnotationPrivate +{ + public: + ScreenAnnotationPrivate(); + ~ScreenAnnotationPrivate(); + Annotation * makeAlias(); + Annot* createNativeAnnot(::Page *destPage, DocumentData *doc); + + // data fields + LinkRendition *action; + QString title; +}; + +ScreenAnnotationPrivate::ScreenAnnotationPrivate() + : AnnotationPrivate(), action( 0 ) +{ +} + +ScreenAnnotationPrivate::~ScreenAnnotationPrivate() +{ + delete action; +} + +ScreenAnnotation::ScreenAnnotation(ScreenAnnotationPrivate &dd) + : Annotation( dd ) +{} + +Annotation * ScreenAnnotationPrivate::makeAlias() +{ + return new ScreenAnnotation(*this); +} + +Annot* ScreenAnnotationPrivate::createNativeAnnot(::Page *destPage, DocumentData *doc) +{ + return 0; // Not implemented +} + +ScreenAnnotation::ScreenAnnotation() + : Annotation( *new ScreenAnnotationPrivate() ) +{ +} + +ScreenAnnotation::~ScreenAnnotation() +{ +} + +void ScreenAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // store base annotation properties + storeBaseAnnotationProperties( node, document ); + + // create [screen] element + QDomElement screenElement = document.createElement( "screen" ); + node.appendChild( screenElement ); +} + +Annotation::SubType ScreenAnnotation::subType() const +{ + return AScreen; +} + +LinkRendition* ScreenAnnotation::action() const +{ + Q_D( const ScreenAnnotation ); + return d->action; +} + +void ScreenAnnotation::setAction( LinkRendition *action ) +{ + Q_D( ScreenAnnotation ); + d->action = action; +} + +QString ScreenAnnotation::screenTitle() const +{ + Q_D( const ScreenAnnotation ); + return d->title; +} + +void ScreenAnnotation::setScreenTitle( const QString &title ) +{ + Q_D( ScreenAnnotation ); + d->title = title; +} + +//BEGIN utility annotation functions +QColor convertAnnotColor( AnnotColor *color ) +{ + if ( !color ) + return QColor(); + + QColor newcolor; + const double *color_data = color->getValues(); + switch ( color->getSpace() ) + { + case AnnotColor::colorTransparent: // = 0, + newcolor = Qt::transparent; + break; + case AnnotColor::colorGray: // = 1, + newcolor.setRgbF( color_data[0], color_data[0], color_data[0] ); + break; + case AnnotColor::colorRGB: // = 3, + newcolor.setRgbF( color_data[0], color_data[1], color_data[2] ); + break; + case AnnotColor::colorCMYK: // = 4 + newcolor.setCmykF( color_data[0], color_data[1], color_data[2], color_data[3] ); + break; + } + return newcolor; +} + +AnnotColor* convertQColor( const QColor &c ) +{ + if (!c.isValid() || c.alpha() == 0) + return new AnnotColor(); // Transparent + else + return new AnnotColor(c.redF(), c.greenF(), c.blueF()); +} +//END utility annotation functions + +} diff --git a/qt4/src/poppler-annotation.h b/qt4/src/poppler-annotation.h new file mode 100644 index 0000000..e511ec0 --- /dev/null +++ b/qt4/src/poppler-annotation.h @@ -0,0 +1,853 @@ +/* poppler-annotation.h: qt interface to poppler + * Copyright (C) 2006-2008, 2012 Albert Astals Cid + * Copyright (C) 2006, 2008 Pino Toscano + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2010, Philip Lorenz + * Copyright (C) 2012, Tobias Koenig + * Copyright (C) 2012, Guillermo A. Amaral B. + * Copyright (C) 2012, Fabio D'Urso + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_ANNOTATION_H_ +#define _POPPLER_ANNOTATION_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "poppler-export.h" + +namespace Poppler { + +class Annotation; +class AnnotationPrivate; +class TextAnnotationPrivate; +class LineAnnotationPrivate; +class GeomAnnotationPrivate; +class HighlightAnnotationPrivate; +class StampAnnotationPrivate; +class InkAnnotationPrivate; +class LinkAnnotationPrivate; +class CaretAnnotationPrivate; +class FileAttachmentAnnotationPrivate; +class SoundAnnotationPrivate; +class MovieAnnotationPrivate; +class ScreenAnnotationPrivate; +class EmbeddedFile; +class Link; +class SoundObject; +class MovieObject; +class LinkRendition; +class Page; + +/** + * \short Helper class for (recursive) Annotation retrieval/storage. + * + */ +class POPPLER_QT4_EXPORT AnnotationUtils +{ + public: + /** + * Restore an Annotation (with revisions if needed) from the DOM + * element \p annElement. + * \returns a pointer to the complete Annotation or 0 if element is + * invalid. + */ + static Annotation * createAnnotation( const QDomElement & annElement ); + + /** + * Save the Annotation \p ann as a child of \p annElement taking + * care of saving all revisions if \p ann has any. + */ + static void storeAnnotation( const Annotation * ann, + QDomElement & annElement, QDomDocument & document ); + + /** + * Returns an element called \p name from the direct children of + * \p parentNode or a null element if not found. + */ + static QDomElement findChildElement( const QDomNode & parentNode, + const QString & name ); +}; + + +/** + * \short Annotation class holding properties shared by all annotations. + * + * An Annotation is an object (text note, highlight, sound, popup window, ..) + * contained by a Page in the document. + * + * \warning Different Annotation objects might point to the same annotation. + * Use uniqueName to test for Annotation equality + */ +class POPPLER_QT4_EXPORT Annotation +{ + friend class AnnotationUtils; + friend class LinkMovie; + + public: + // enum definitions + // WARNING!!! oKular uses that very same values so if you change them notify the author! + enum SubType { AText = 1, ALine = 2, AGeom = 3, AHighlight = 4, AStamp = 5, + AInk = 6, ALink = 7, ACaret = 8, AFileAttachment = 9, ASound = 10, + AMovie = 11, AScreen = 12 /** \since 0.20 */, A_BASE = 0 }; + enum Flag { Hidden = 1, FixedSize = 2, FixedRotation = 4, DenyPrint = 8, + DenyWrite = 16, DenyDelete = 32, ToggleHidingOnMouse = 64, External = 128 }; + enum LineStyle { Solid = 1, Dashed = 2, Beveled = 4, Inset = 8, Underline = 16 }; + enum LineEffect { NoEffect = 1, Cloudy = 2}; + enum RevScope { Root = 0 /** \since 0.20 */, Reply = 1, Group = 2, Delete = 4 }; + enum RevType { None = 1, Marked = 2, Unmarked = 4, Accepted = 8, Rejected = 16, Cancelled = 32, Completed = 64 }; + + /** + * Returns the author of the annotation. + */ + QString author() const; + /** + * Sets a new author for the annotation. + */ + void setAuthor( const QString &author ); + + QString contents() const; + void setContents( const QString &contents ); + + /** + * Returns the unique name (ID) of the annotation. + */ + QString uniqueName() const; + /** + * Sets a new unique name for the annotation. + * + * \note no check of the new uniqueName is done + */ + void setUniqueName( const QString &uniqueName ); + + QDateTime modificationDate() const; + void setModificationDate( const QDateTime &date ); + + QDateTime creationDate() const; + void setCreationDate( const QDateTime &date ); + + int flags() const; + void setFlags( int flags ); + + QRectF boundary() const; + void setBoundary( const QRectF &boundary ); + + /** + * \short Container class for Annotation style information + * + * \since 0.20 + */ + class POPPLER_QT4_EXPORT Style + { + public: + Style(); + Style( const Style &other ); + Style& operator=( const Style &other ); + ~Style(); + + // appearance properties + QColor color() const; // black + void setColor(const QColor &color); + double opacity() const; // 1.0 + void setOpacity(double opacity); + + // pen properties + double width() const; // 1.0 + void setWidth(double width); + LineStyle lineStyle() const; // LineStyle::Solid + void setLineStyle(LineStyle style); + double xCorners() const; // 0.0 + void setXCorners(double radius); + double yCorners() const; // 0.0 + void setYCorners(double radius); + const QVector& dashArray() const; // [ 3 ] + void setDashArray(const QVector &array); + + // pen effects + LineEffect lineEffect() const; // LineEffect::NoEffect + void setLineEffect(LineEffect effect); + double effectIntensity() const; // 1.0 + void setEffectIntensity(double intens); + + private: + class Private; + QSharedDataPointer d; + }; + + /// \since 0.20 + Style style() const; + /// \since 0.20 + void setStyle( const Style& style ); + + /** + * \short Container class for Annotation pop-up window information + * + * \since 0.20 + */ + class POPPLER_QT4_EXPORT Popup + { + public: + Popup(); + Popup( const Popup &other ); + Popup& operator=( const Popup &other ); + ~Popup(); + + // window state (Hidden, FixedRotation, Deny* flags allowed) + int flags() const; // -1 (never initialized) -> 0 (if inited and shown) + void setFlags( int flags ); + + // geometric properties + QRectF geometry() const; // no default + void setGeometry( const QRectF &geom ); + + // window contens/override properties + QString title() const; // '' text in the titlebar (overrides author) + void setTitle( const QString &title ); + QString summary() const; // '' short description (displayed if not empty) + void setSummary( const QString &summary ); + QString text() const; // '' text for the window (overrides annot->contents) + void setText( const QString &text ); + + private: + class Private; + QSharedDataPointer d; + }; + + /// \since 0.20 + Popup popup() const; + /// \since 0.20 + void setPopup( const Popup& popup ); + + /// \cond PRIVATE + // This field is deprecated and not used any more. Use popup + Q_DECL_DEPRECATED struct { int width, height; } window; // Always set to zero + /// \endcond + + /// \since 0.20 + RevScope revisionScope() const; // Root + + /// \since 0.20 + RevType revisionType() const; // None + + /** + * Returns the revisions of this annotation + * + * \note The caller owns the returned annotations and they should + * be deleted when no longer required. + * + * \since 0.20 + */ + QList revisions() const; + + /** + * The type of the annotation. + */ + virtual SubType subType() const = 0; + + /** + * Destructor. + */ + virtual ~Annotation(); + + protected: + /// \cond PRIVATE + Annotation( AnnotationPrivate &dd ); + Annotation( AnnotationPrivate &dd, const QDomNode &description ); + void storeBaseAnnotationProperties( QDomNode & parentNode, QDomDocument & document ) const; + Q_DECLARE_PRIVATE( Annotation ) + QExplicitlySharedDataPointer d_ptr; + /// \endcond + + private: + virtual void store( QDomNode & parentNode, QDomDocument & document ) const = 0; + Q_DISABLE_COPY( Annotation ) +}; + +/** + * \short Annotation containing text. + * + * A text annotation is an object showing some text directly on the page, or + * linked to the contents using an icon shown on a page. + */ +class POPPLER_QT4_EXPORT TextAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + // local enums + enum TextType { Linked, InPlace }; + enum InplaceIntent { Unknown, Callout, TypeWriter }; + + TextAnnotation( TextType type ); + virtual ~TextAnnotation(); + virtual SubType subType() const; + + /** + The type of text annotation represented by this object + */ + TextType textType() const; + + /** + The name of the icon for this text annotation. + + Standard names for text annotation icons are: + - Comment + - Help + - Insert + - Key + - NewParagraph + - Note (this is the default icon to use) + - Paragraph + */ + QString textIcon() const; + + /** + Set the name of the icon to use for this text annotation. + + \sa textIcon for the list of standard names + */ + void setTextIcon( const QString &icon ); + + QFont textFont() const; + void setTextFont( const QFont &font ); + + int inplaceAlign() const; + void setInplaceAlign( int align ); + + /** + Synonym for contents() + + \deprecated Use contents() instead + */ + QString inplaceText() const; + /** + Synonym for setContents() + + \deprecated Use setContents() instead + */ + void setInplaceText( const QString &text ); + + QPointF calloutPoint( int id ) const; + /// \since 0.20 + QVector calloutPoints() const; + /// \since 0.20 + void setCalloutPoints( const QVector &points ); + + InplaceIntent inplaceIntent() const; + void setInplaceIntent( InplaceIntent intent ); + + private: + TextAnnotation( const QDomNode &node ); + TextAnnotation( TextAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + void setTextType( TextType type ); + Q_DECLARE_PRIVATE( TextAnnotation ) + Q_DISABLE_COPY( TextAnnotation ) +}; + +/** + * \short Polygon/polyline annotation. + * + * This annotation represents a polygon (or polyline) to be drawn on a page. + */ +class POPPLER_QT4_EXPORT LineAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + // local enums + /// \since 0.20 + enum LineType { StraightLine, Polyline }; + enum TermStyle { Square, Circle, Diamond, OpenArrow, ClosedArrow, None, + Butt, ROpenArrow, RClosedArrow, Slash }; + enum LineIntent { Unknown, Arrow, Dimension, PolygonCloud }; + + /// \since 0.20 + LineAnnotation( LineType type ); + virtual ~LineAnnotation(); + virtual SubType subType() const; + + /// \since 0.20 + LineType lineType() const; + + QLinkedList linePoints() const; + void setLinePoints( const QLinkedList &points ); + + TermStyle lineStartStyle() const; + void setLineStartStyle( TermStyle style ); + + TermStyle lineEndStyle() const; + void setLineEndStyle( TermStyle style ); + + bool isLineClosed() const; + void setLineClosed( bool closed ); + + QColor lineInnerColor() const; + void setLineInnerColor( const QColor &color ); + + double lineLeadingForwardPoint() const; + void setLineLeadingForwardPoint( double point ); + + double lineLeadingBackPoint() const; + void setLineLeadingBackPoint( double point ); + + bool lineShowCaption() const; + void setLineShowCaption( bool show ); + + LineIntent lineIntent() const; + void setLineIntent( LineIntent intent ); + + private: + LineAnnotation( const QDomNode &node ); + LineAnnotation( LineAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + void setLineType( LineType type ); + Q_DECLARE_PRIVATE( LineAnnotation ) + Q_DISABLE_COPY( LineAnnotation ) +}; + +/** + * \short Geometric annotation. + * + * The geometric annotation represents a geometric figure, like a rectangle or + * an ellipse. + */ +class POPPLER_QT4_EXPORT GeomAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + GeomAnnotation(); + virtual ~GeomAnnotation(); + virtual SubType subType() const; + + // common enums + enum GeomType { InscribedSquare, InscribedCircle }; + + GeomType geomType() const; + void setGeomType( GeomType style ); + + QColor geomInnerColor() const; + void setGeomInnerColor( const QColor &color ); + + private: + GeomAnnotation( const QDomNode &node ); + GeomAnnotation( GeomAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( GeomAnnotation ) + Q_DISABLE_COPY( GeomAnnotation ) +}; + +/** + * \short Text highlight annotation. + * + * The higlight annotation represents some areas of text being "highlighted". + */ +class POPPLER_QT4_EXPORT HighlightAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + HighlightAnnotation(); + virtual ~HighlightAnnotation(); + virtual SubType subType() const; + + /** + The type of highlight + */ + enum HighlightType { Highlight, ///< highlighter pen style annotation + Squiggly, ///< jagged or squiggly underline + Underline, ///< straight line underline + StrikeOut ///< straight line through-line + }; + + /** + Structure corresponding to a QuadPoints array. This matches a + quadrilateral that describes the area around a word (or set of + words) that are to be highlighted. + */ + struct Quad + { + QPointF points[4]; // 8 valid coords + bool capStart; // false (vtx 1-4) [K] + bool capEnd; // false (vtx 2-3) [K] + double feather; // 0.1 (in range 0..1) [K] + }; + + /** + The type (style) of highlighting to use for this area + or these areas. + */ + HighlightType highlightType() const; + + /** + Set the type of highlighting to use for the given area + or areas. + */ + void setHighlightType( HighlightType type ); + + /** + The list of areas to highlight. + */ + QList< Quad > highlightQuads() const; + + /** + Set the areas to highlight. + */ + void setHighlightQuads( const QList< Quad > &quads ); + + private: + HighlightAnnotation( const QDomNode &node ); + HighlightAnnotation( HighlightAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( HighlightAnnotation ) + Q_DISABLE_COPY( HighlightAnnotation ) +}; + +/** + * \short Stamp annotation. + * + * A simple annotation drawing a stamp on a page. + */ +class POPPLER_QT4_EXPORT StampAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + StampAnnotation(); + virtual ~StampAnnotation(); + virtual SubType subType() const; + + /** + The name of the icon for this stamp annotation. + + Standard names for stamp annotation icons are: + - Approved + - AsIs + - Confidential + - Departmental + - Draft (this is the default icon type) + - Experimental + - Expired + - Final + - ForComment + - ForPublicRelease + - NotApproved + - NotForPublicRelease + - Sold + - TopSecret + */ + QString stampIconName() const; + + /** + Set the icon type for this stamp annotation. + + \sa stampIconName for the list of standard icon names + */ + void setStampIconName( const QString &name ); + + private: + StampAnnotation( const QDomNode &node ); + StampAnnotation( StampAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( StampAnnotation ) + Q_DISABLE_COPY( StampAnnotation ) +}; + +/** + * \short Ink Annotation. + * + * Annotation representing an ink path on a page. + */ +class POPPLER_QT4_EXPORT InkAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + InkAnnotation(); + virtual ~InkAnnotation(); + virtual SubType subType() const; + + QList< QLinkedList > inkPaths() const; + void setInkPaths( const QList< QLinkedList > &paths ); + + private: + InkAnnotation( const QDomNode &node ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + InkAnnotation(InkAnnotationPrivate &dd); + Q_DECLARE_PRIVATE( InkAnnotation ) + Q_DISABLE_COPY( InkAnnotation ) +}; + +class POPPLER_QT4_EXPORT LinkAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + virtual ~LinkAnnotation(); + virtual SubType subType() const; + + // local enums + enum HighlightMode { None, Invert, Outline, Push }; + + /** \since 0.20 */ + Link* linkDestination() const; + void setLinkDestination( Link *link ); + + HighlightMode linkHighlightMode() const; + void setLinkHighlightMode( HighlightMode mode ); + + QPointF linkRegionPoint( int id ) const; + void setLinkRegionPoint( int id, const QPointF &point ); + + private: + LinkAnnotation(); + LinkAnnotation( const QDomNode &node ); + LinkAnnotation( LinkAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( LinkAnnotation ) + Q_DISABLE_COPY( LinkAnnotation ) +}; + +/** + * \short Caret annotation. + * + * The caret annotation represents a symbol to indicate the presence of text. + */ +class POPPLER_QT4_EXPORT CaretAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + CaretAnnotation(); + virtual ~CaretAnnotation(); + virtual SubType subType() const; + + /** + * The symbols for the caret annotation. + */ + enum CaretSymbol { None, P }; + + CaretSymbol caretSymbol() const; + void setCaretSymbol( CaretSymbol symbol ); + + private: + CaretAnnotation( const QDomNode &node ); + CaretAnnotation( CaretAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( CaretAnnotation ) + Q_DISABLE_COPY( CaretAnnotation ) +}; + +/** + * \short File attachment annotation. + * + * The file attachment annotation represents a file embedded in the document. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT FileAttachmentAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~FileAttachmentAnnotation(); + virtual SubType subType() const; + + /** + * Returns the name of the icon of this annotation. + */ + QString fileIconName() const; + /** + * Sets a new name for the icon of this annotation. + */ + void setFileIconName( const QString &icon ); + + /** + * Returns the EmbeddedFile of this annotation. + */ + EmbeddedFile* embeddedFile() const; + /** + * Sets a new EmbeddedFile for this annotation. + * + * \note FileAttachmentAnnotation takes ownership of the object + */ + void setEmbeddedFile( EmbeddedFile *ef ); + + private: + FileAttachmentAnnotation(); + FileAttachmentAnnotation( const QDomNode &node ); + FileAttachmentAnnotation( FileAttachmentAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( FileAttachmentAnnotation ) + Q_DISABLE_COPY( FileAttachmentAnnotation ) +}; + +/** + * \short Sound annotation. + * + * The sound annotation represents a sound to be played when activated. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT SoundAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~SoundAnnotation(); + virtual SubType subType() const; + + /** + * Returns the name of the icon of this annotation. + */ + QString soundIconName() const; + /** + * Sets a new name for the icon of this annotation. + */ + void setSoundIconName( const QString &icon ); + + /** + * Returns the SoundObject of this annotation. + */ + SoundObject* sound() const; + /** + * Sets a new SoundObject for this annotation. + * + * \note SoundAnnotation takes ownership of the object + */ + void setSound( SoundObject *ef ); + + private: + SoundAnnotation(); + SoundAnnotation( const QDomNode &node ); + SoundAnnotation( SoundAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( SoundAnnotation ) + Q_DISABLE_COPY( SoundAnnotation ) +}; + +/** + * \short Movie annotation. + * + * The movie annotation represents a movie to be played when activated. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT MovieAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~MovieAnnotation(); + virtual SubType subType() const; + + /** + * Returns the MovieObject of this annotation. + */ + MovieObject* movie() const; + /** + * Sets a new MovieObject for this annotation. + * + * \note MovieAnnotation takes ownership of the object + */ + void setMovie( MovieObject *movie ); + + /** + * Returns the title of the movie of this annotation. + */ + QString movieTitle() const; + /** + * Sets a new title for the movie of this annotation. + */ + void setMovieTitle( const QString &title ); + + private: + MovieAnnotation(); + MovieAnnotation( const QDomNode &node ); + MovieAnnotation( MovieAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( MovieAnnotation ) + Q_DISABLE_COPY( MovieAnnotation ) +}; + +/** + * \short Screen annotation. + * + * The screen annotation represents a screen to be played when activated. + * + * \since 0.20 + */ +class POPPLER_QT4_EXPORT ScreenAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~ScreenAnnotation(); + + virtual SubType subType() const; + + /** + * Returns the LinkRendition of this annotation. + */ + LinkRendition* action() const; + + /** + * Sets a new LinkRendition for this annotation. + * + * \note ScreenAnnotation takes ownership of the object + */ + void setAction( LinkRendition *action ); + + /** + * Returns the title of the screen of this annotation. + */ + QString screenTitle() const; + + /** + * Sets a new title for the screen of this annotation. + */ + void setScreenTitle( const QString &title ); + + private: + ScreenAnnotation(); + ScreenAnnotation( ScreenAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; // stub + Q_DECLARE_PRIVATE( ScreenAnnotation ) + Q_DISABLE_COPY( ScreenAnnotation ) +}; + +} + +#endif diff --git a/qt4/src/poppler-base-converter.cc b/qt4/src/poppler-base-converter.cc new file mode 100644 index 0000000..11ff17c --- /dev/null +++ b/qt4/src/poppler-base-converter.cc @@ -0,0 +1,105 @@ +/* poppler-base-converter.cc: qt interface to poppler + * Copyright (C) 2007, 2009, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include "poppler-converter-private.h" + +#include + +namespace Poppler { + +BaseConverterPrivate::BaseConverterPrivate() + : document(0), iodev(0), ownIodev(true) +{ +} + +BaseConverterPrivate::~BaseConverterPrivate() +{ +} + +QIODevice* BaseConverterPrivate::openDevice() +{ + if (!iodev) + { + Q_ASSERT(!outputFileName.isEmpty()); + QFile *f = new QFile(outputFileName); + iodev = f; + ownIodev = true; + } + Q_ASSERT(iodev); + if (!iodev->isOpen()) + { + if (!iodev->open(QIODevice::WriteOnly)) + { + if (ownIodev) + { + delete iodev; + iodev = 0; + } + else + { + return 0; + } + } + } + return iodev; +} + +void BaseConverterPrivate::closeDevice() +{ + if (ownIodev) + { + iodev->close(); + delete iodev; + iodev = 0; + } +} + + +BaseConverter::BaseConverter(BaseConverterPrivate &dd) + : d_ptr(&dd) +{ +} + +BaseConverter::~BaseConverter() +{ + delete d_ptr; +} + +void BaseConverter::setOutputFileName(const QString &outputFileName) +{ + Q_D(BaseConverter); + d->outputFileName = outputFileName; +} + +void BaseConverter::setOutputDevice(QIODevice *device) +{ + Q_D(BaseConverter); + d->iodev = device; + d->ownIodev = false; +} + +BaseConverter::Error BaseConverter::lastError() const +{ + Q_D(const BaseConverter); + return d->lastError; +} + +} diff --git a/qt4/src/poppler-converter-private.h b/qt4/src/poppler-converter-private.h new file mode 100644 index 0000000..dc3e943 --- /dev/null +++ b/qt4/src/poppler-converter-private.h @@ -0,0 +1,49 @@ +/* poppler-converter-private.h: Qt4 interface to poppler + * Copyright (C) 2007, 2009, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_QT4_CONVERTER_PRIVATE_H +#define POPPLER_QT4_CONVERTER_PRIVATE_H + +#include + +class QIODevice; + +namespace Poppler { + +class DocumentData; + +class BaseConverterPrivate +{ + public: + BaseConverterPrivate(); + virtual ~BaseConverterPrivate(); + + QIODevice* openDevice(); + void closeDevice(); + + DocumentData *document; + QString outputFileName; + QIODevice *iodev; + bool ownIodev : 1; + BaseConverter::Error lastError; +}; + +} + +#endif diff --git a/qt4/src/poppler-document.cc b/qt4/src/poppler-document.cc new file mode 100644 index 0000000..550e706 --- /dev/null +++ b/qt4/src/poppler-document.cc @@ -0,0 +1,648 @@ +/* poppler-document.cc: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, 2008, Brad Hards + * Copyright (C) 2005-2010, Albert Astals Cid + * Copyright (C) 2006-2010, Pino Toscano + * Copyright (C) 2010, 2011 Hib Eris + * Copyright (C) 2012 Koji Otani + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "poppler-private.h" +#include "poppler-page-private.h" + +#if defined(USE_CMS) +#if defined(USE_LCMS1) +#include +#else +#include +#endif +#endif + +namespace Poppler { + + int DocumentData::count = 0; + + Document *Document::load(const QString &filePath, const QByteArray &ownerPassword, + const QByteArray &userPassword) + { + DocumentData *doc = new DocumentData(filePath, + new GooString(ownerPassword.data()), + new GooString(userPassword.data())); + return DocumentData::checkDocument(doc); + } + + Document *Document::loadFromData(const QByteArray &fileContents, + const QByteArray &ownerPassword, + const QByteArray &userPassword) + { + // create stream + DocumentData *doc = new DocumentData(fileContents, + new GooString(ownerPassword.data()), + new GooString(userPassword.data())); + return DocumentData::checkDocument(doc); + } + + Document *DocumentData::checkDocument(DocumentData *doc) + { + Document *pdoc; + if (doc->doc->isOk() || doc->doc->getErrorCode() == errEncrypted) { + pdoc = new Document(doc); + if (doc->doc->getErrorCode() == errEncrypted) + pdoc->m_doc->locked = true; + else + { + pdoc->m_doc->locked = false; + pdoc->m_doc->fillMembers(); + } + return pdoc; + } + else + { + delete doc; + } + return NULL; + } + + Document::Document(DocumentData *dataA) + { + m_doc = dataA; + } + + Document::~Document() + { + delete m_doc; + } + + Page *Document::page(int index) const + { + Page *page = new Page(m_doc, index); + if (page->m_page->page == NULL) { + delete page; + return NULL; + } + + return page; + } + + bool Document::isLocked() const + { + return m_doc->locked; + } + + bool Document::unlock(const QByteArray &ownerPassword, + const QByteArray &userPassword) + { + if (m_doc->locked) { + /* racier then it needs to be */ + DocumentData *doc2; + if (!m_doc->fileContents.isEmpty()) + { + doc2 = new DocumentData(m_doc->fileContents, + new GooString(ownerPassword.data()), + new GooString(userPassword.data())); + } + else + { + doc2 = new DocumentData(m_doc->m_filePath, + new GooString(ownerPassword.data()), + new GooString(userPassword.data())); + } + if (!doc2->doc->isOk()) { + delete doc2; + } else { + delete m_doc; + m_doc = doc2; + m_doc->locked = false; + m_doc->fillMembers(); + } + } + return m_doc->locked; + } + + Document::PageMode Document::pageMode() const + { + switch (m_doc->doc->getCatalog()->getPageMode()) { + case Catalog::pageModeNone: + return UseNone; + case Catalog::pageModeOutlines: + return UseOutlines; + case Catalog::pageModeThumbs: + return UseThumbs; + case Catalog::pageModeFullScreen: + return FullScreen; + case Catalog::pageModeOC: + return UseOC; + case Catalog::pageModeAttach: + return UseAttach; + default: + return UseNone; + } + } + + Document::PageLayout Document::pageLayout() const + { + switch (m_doc->doc->getCatalog()->getPageLayout()) { + case Catalog::pageLayoutNone: + return NoLayout; + case Catalog::pageLayoutSinglePage: + return SinglePage; + case Catalog::pageLayoutOneColumn: + return OneColumn; + case Catalog::pageLayoutTwoColumnLeft: + return TwoColumnLeft; + case Catalog::pageLayoutTwoColumnRight: + return TwoColumnRight; + case Catalog::pageLayoutTwoPageLeft: + return TwoPageLeft; + case Catalog::pageLayoutTwoPageRight: + return TwoPageRight; + default: + return NoLayout; + } + } + + int Document::numPages() const + { + return m_doc->doc->getNumPages(); + } + + QList Document::fonts() const + { + QList ourList; + FontIterator it( 0, m_doc ); + while ( it.hasNext() ) + { + ourList += it.next(); + } + return ourList; + } + + QList Document::embeddedFiles() const + { + return m_doc->m_embeddedFiles; + } + + bool Document::scanForFonts( int numPages, QList *fontList ) const + { + if ( !m_doc->m_fontInfoIterator ) + return false; + if ( !m_doc->m_fontInfoIterator->hasNext() ) + return false; + while ( m_doc->m_fontInfoIterator->hasNext() && numPages ) + { + (*fontList) += m_doc->m_fontInfoIterator->next(); + --numPages; + } + return true; + } + + FontIterator* Document::newFontIterator( int startPage ) const + { + return new FontIterator( startPage, m_doc ); + } + + QByteArray Document::fontData(const FontInfo &fi) const + { + QByteArray result; + if (fi.isEmbedded()) + { + Object refObj, strObj; + refObj.initRef(fi.m_data->embRef.num, fi.m_data->embRef.gen); + refObj.fetch(m_doc->doc->getXRef(), &strObj); + refObj.free(); + if (strObj.isStream()) + { + int c; + strObj.streamReset(); + while ((c = strObj.streamGetChar()) != EOF) + { + result.append((char)c); + } + strObj.streamClose(); + } + strObj.free(); + } + return result; + } + + /* borrowed from kpdf */ + QString Document::info( const QString & type ) const + { + // [Albert] Code adapted from pdfinfo.cc on xpdf + Object info; + if ( m_doc->locked ) + return QString(); + + m_doc->doc->getDocInfo( &info ); + if ( !info.isDict() ) + return QString(); + + QString result; + Object obj; + GooString *s1; + Dict *infoDict = info.getDict(); + + if ( infoDict->lookup( type.toLatin1().data(), &obj )->isString() ) + { + s1 = obj.getString(); + result = UnicodeParsedString(s1); + obj.free(); + info.free(); + return result; + } + obj.free(); + info.free(); + return QString(); + } + + QStringList Document::infoKeys() const + { + QStringList keys; + + Object info; + if ( m_doc->locked ) + return QStringList(); + + m_doc->doc->getDocInfo( &info ); + if ( !info.isDict() ) + return QStringList(); + + Dict *infoDict = info.getDict(); + // somehow iterate over keys in infoDict + for( int i=0; i < infoDict->getLength(); ++i ) { + keys.append( QString::fromAscii(infoDict->getKey(i)) ); + } + + info.free(); + return keys; + } + + /* borrowed from kpdf */ + QDateTime Document::date( const QString & type ) const + { + // [Albert] Code adapted from pdfinfo.cc on xpdf + if ( m_doc->locked ) + return QDateTime(); + + Object info; + m_doc->doc->getDocInfo( &info ); + if ( !info.isDict() ) { + info.free(); + return QDateTime(); + } + + Object obj; + Dict *infoDict = info.getDict(); + QDateTime result; + + if ( infoDict->lookup( type.toLatin1().data(), &obj )->isString() ) + { + char *aux = obj.getString()->getCString(); + result = Poppler::convertDate(aux); + } + obj.free(); + info.free(); + return result; + } + + bool Document::isEncrypted() const + { + return m_doc->doc->isEncrypted(); + } + + bool Document::isLinearized() const + { + return m_doc->doc->isLinearized(); + } + + bool Document::okToPrint() const + { + return m_doc->doc->okToPrint(); + } + + bool Document::okToPrintHighRes() const + { + return m_doc->doc->okToPrintHighRes(); + } + + bool Document::okToChange() const + { + return m_doc->doc->okToChange(); + } + + bool Document::okToCopy() const + { + return m_doc->doc->okToCopy(); + } + + bool Document::okToAddNotes() const + { + return m_doc->doc->okToAddNotes(); + } + + bool Document::okToFillForm() const + { + return m_doc->doc->okToFillForm(); + } + + bool Document::okToCreateFormFields() const + { + return ( okToFillForm() && okToChange() ); + } + + bool Document::okToExtractForAccessibility() const + { + return m_doc->doc->okToAccessibility(); + } + + bool Document::okToAssemble() const + { + return m_doc->doc->okToAssemble(); + } + + double Document::pdfVersion() const + { + return m_doc->doc->getPDFMajorVersion () + m_doc->doc->getPDFMinorVersion() / 10.0; + } + + void Document::getPdfVersion(int *major, int *minor) const + { + if (major) + *major = m_doc->doc->getPDFMajorVersion(); + if (minor) + *minor = m_doc->doc->getPDFMinorVersion(); + } + + Page *Document::page(const QString &label) const + { + GooString label_g(label.toAscii().data()); + int index; + + if (!m_doc->doc->getCatalog()->labelToIndex (&label_g, &index)) + return NULL; + + return page(index); + } + + bool Document::hasEmbeddedFiles() const + { + return (!(0 == m_doc->doc->getCatalog()->numEmbeddedFiles())); + } + + QDomDocument *Document::toc() const + { + Outline * outline = m_doc->doc->getOutline(); + if ( !outline ) + return NULL; + + GooList * items = outline->getItems(); + if ( !items || items->getLength() < 1 ) + return NULL; + + QDomDocument *toc = new QDomDocument(); + if ( items->getLength() > 0 ) + m_doc->addTocChildren( toc, toc, items ); + + return toc; + } + + LinkDestination *Document::linkDestination( const QString &name ) + { + GooString * namedDest = QStringToGooString( name ); + LinkDestinationData ldd(NULL, namedDest, m_doc, false); + LinkDestination *ld = new LinkDestination(ldd); + delete namedDest; + return ld; + } + + void Document::setPaperColor(const QColor &color) + { + m_doc->setPaperColor(color); + } + + void Document::setColorDisplayProfile(void* outputProfileA) + { +#if defined(USE_CMS) + GfxColorSpace::setDisplayProfile((cmsHPROFILE)outputProfileA); +#else + Q_UNUSED(outputProfileA); +#endif + } + + void Document::setColorDisplayProfileName(const QString &name) + { +#if defined(USE_CMS) + GooString *profileName = QStringToGooString( name ); + GfxColorSpace::setDisplayProfileName(profileName); + delete profileName; +#else + Q_UNUSED(name); +#endif + } + + void* Document::colorRgbProfile() const + { +#if defined(USE_CMS) + return (void*)GfxColorSpace::getRGBProfile(); +#else + return NULL; +#endif + } + + void* Document::colorDisplayProfile() const + { +#if defined(USE_CMS) + return (void*)GfxColorSpace::getDisplayProfile(); +#else + return NULL; +#endif + } + + QColor Document::paperColor() const + { + return m_doc->paperColor; + } + + void Document::setRenderBackend( Document::RenderBackend backend ) + { + // no need to delete the outputdev as for the moment we always create a splash one + // as the arthur one does not allow "precaching" due to it's signature + // delete m_doc->m_outputDev; + // m_doc->m_outputDev = NULL; + m_doc->m_backend = backend; + } + + Document::RenderBackend Document::renderBackend() const + { + return m_doc->m_backend; + } + + QSet Document::availableRenderBackends() + { + QSet ret; +#if defined(HAVE_SPLASH) + ret << Document::SplashBackend; +#endif + ret << Document::ArthurBackend; + return ret; + } + + void Document::setRenderHint( Document::RenderHint hint, bool on ) + { + if ( on ) + m_doc->m_hints |= hint; + else + m_doc->m_hints &= ~(int)hint; + + // the only way to set antialiasing for Splash is on creation + if ( m_doc->m_backend == Document::SplashBackend && + ( hint & ( Document::Antialiasing || Document::TextAntialiasing || Document::TextHinting ) ) ) + { + delete m_doc->m_outputDev; + m_doc->m_outputDev = NULL; + } + } + + Document::RenderHints Document::renderHints() const + { + return Document::RenderHints( m_doc->m_hints ); + } + + PSConverter *Document::psConverter() const + { + return new PSConverter(m_doc); + } + + PDFConverter *Document::pdfConverter() const + { + return new PDFConverter(m_doc); + } + + QString Document::metadata() const + { + QString result; + Catalog *catalog = m_doc->doc->getCatalog(); + if (catalog && catalog->isOk()) + { + GooString *s = catalog->readMetadata(); + if (s) result = UnicodeParsedString(s); + delete s; + } + return result; + } + + bool Document::hasOptionalContent() const + { + return ( m_doc->doc->getOptContentConfig() && m_doc->doc->getOptContentConfig()->hasOCGs() ); + } + + OptContentModel *Document::optionalContentModel() + { + if (m_doc->m_optContentModel.isNull()) { + m_doc->m_optContentModel = new OptContentModel(m_doc->doc->getOptContentConfig(), 0); + } + return (OptContentModel *)m_doc->m_optContentModel; + } + + QStringList Document::scripts() const + { + Catalog *catalog = m_doc->doc->getCatalog(); + const int numScripts = catalog->numJS(); + QStringList scripts; + for (int i = 0; i < numScripts; ++i) { + GooString *s = catalog->getJS(i); + if (s) { + scripts.append(UnicodeParsedString(s)); + delete s; + } + } + return scripts; + } + + bool Document::getPdfId(QByteArray *permanentId, QByteArray *updateId) const + { + GooString gooPermanentId; + GooString gooUpdateId; + + if (!m_doc->doc->getID(permanentId ? &gooPermanentId : 0, updateId ? &gooUpdateId : 0)) + return false; + + if (permanentId) + *permanentId = gooPermanentId.getCString(); + if (updateId) + *updateId = gooUpdateId.getCString(); + + return true; + } + + QDateTime convertDate( char *dateString ) + { + int year, mon, day, hour, min, sec, tzHours, tzMins; + char tz; + + if ( parseDateString( dateString, &year, &mon, &day, &hour, &min, &sec, &tz, &tzHours, &tzMins ) ) + { + QDate d( year, mon, day ); + QTime t( hour, min, sec ); + if ( d.isValid() && t.isValid() ) { + QDateTime dt( d, t, Qt::UTC ); + if ( tz ) { + // then we have some form of timezone + if ( 'Z' == tz ) { + // We are already at UTC + } else if ( '+' == tz ) { + // local time is ahead of UTC + dt = dt.addSecs(-1*((tzHours*60)+tzMins)*60); + } else if ( '-' == tz ) { + // local time is behind UTC + dt = dt.addSecs(((tzHours*60)+tzMins)*60); + } else { + qWarning("unexpected tz val"); + } + } + return dt; + } + } + return QDateTime(); + } + + bool isCmsAvailable() + { +#if defined(USE_CMS) + return true; +#else + return false; +#endif + } + +} diff --git a/qt4/src/poppler-embeddedfile-private.h b/qt4/src/poppler-embeddedfile-private.h new file mode 100644 index 0000000..83549da --- /dev/null +++ b/qt4/src/poppler-embeddedfile-private.h @@ -0,0 +1,42 @@ +/* poppler-embeddedfile-private.h: Qt4 interface to poppler + * Copyright (C) 2005, 2008, 2009, 2012, Albert Astals Cid + * Copyright (C) 2005, Brad Hards + * Copyright (C) 2008, 2011, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_EMBEDDEDFILE_PRIVATE_H +#define POPPLER_EMBEDDEDFILE_PRIVATE_H + +class FileSpec; + +namespace Poppler +{ + +class EmbeddedFileData +{ +public: + EmbeddedFileData(FileSpec *fs); + ~EmbeddedFileData(); + + EmbFile *embFile() const; + + FileSpec *filespec; +}; + +} + +#endif diff --git a/qt4/src/poppler-embeddedfile.cc b/qt4/src/poppler-embeddedfile.cc new file mode 100644 index 0000000..5b3f7d3 --- /dev/null +++ b/qt4/src/poppler-embeddedfile.cc @@ -0,0 +1,135 @@ +/* poppler-document.cc: qt interface to poppler + * Copyright (C) 2005, 2008, 2009, 2012, Albert Astals Cid + * Copyright (C) 2005, Brad Hards + * Copyright (C) 2008, 2011, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include +#include + +#include "Object.h" +#include "Stream.h" +#include "Catalog.h" +#include "FileSpec.h" + +#include "poppler-private.h" +#include "poppler-embeddedfile-private.h" + +namespace Poppler +{ + +EmbeddedFileData::EmbeddedFileData(FileSpec *fs) + : filespec(fs) +{ +} + +EmbeddedFileData::~EmbeddedFileData() +{ + delete filespec; +} + +EmbFile *EmbeddedFileData::embFile() const +{ + return filespec->isOk() ? filespec->getEmbeddedFile() : NULL; +} + + +EmbeddedFile::EmbeddedFile(EmbFile *embfile) + : m_embeddedFile(0) +{ + assert(!"You must not use this private constructor!"); +} + +EmbeddedFile::EmbeddedFile(EmbeddedFileData &dd) + : m_embeddedFile(&dd) +{ +} + +EmbeddedFile::~EmbeddedFile() +{ + delete m_embeddedFile; +} + +QString EmbeddedFile::name() const +{ + GooString *goo = m_embeddedFile->filespec->getFileName(); + return goo ? QString(goo->getCString()) : QString(); +} + +QString EmbeddedFile::description() const +{ + GooString *goo = m_embeddedFile->filespec->getDescription(); + return goo ? UnicodeParsedString(goo) : QString(); +} + +int EmbeddedFile::size() const +{ + return m_embeddedFile->embFile() ? m_embeddedFile->embFile()->size() : -1; +} + +QDateTime EmbeddedFile::modDate() const +{ + GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->modDate() : NULL; + return goo ? convertDate(goo->getCString()) : QDateTime(); +} + +QDateTime EmbeddedFile::createDate() const +{ + GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->createDate() : NULL; + return goo ? convertDate(goo->getCString()) : QDateTime(); +} + +QByteArray EmbeddedFile::checksum() const +{ + GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->checksum() : NULL; + return goo ? QByteArray::fromRawData(goo->getCString(), goo->getLength()) : QByteArray(); +} + +QString EmbeddedFile::mimeType() const +{ + GooString *goo = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->mimeType() : NULL; + return goo ? QString(goo->getCString()) : QString(); +} + +QByteArray EmbeddedFile::data() +{ + if (!isValid()) + return QByteArray(); + Stream *stream = m_embeddedFile->embFile() ? m_embeddedFile->embFile()->stream() : NULL; + if (!stream) + return QByteArray(); + + stream->reset(); + int dataLen = 0; + QByteArray fileArray; + int i; + while ( (i = stream->getChar()) != EOF) { + fileArray[dataLen] = (char)i; + ++dataLen; + } + fileArray.resize(dataLen); + return fileArray; +} + +bool EmbeddedFile::isValid() const +{ + return m_embeddedFile->filespec->isOk(); +} + +} diff --git a/qt4/src/poppler-export.h b/qt4/src/poppler-export.h new file mode 100644 index 0000000..7661fe9 --- /dev/null +++ b/qt4/src/poppler-export.h @@ -0,0 +1,17 @@ +/* +* This file is used to set the poppler_qt4_EXPORT macros right. +* This is needed for setting the visibility on windows, it will have no effect on other platforms. +*/ +#if defined(_WIN32) +# define LIB_EXPORT __declspec(dllexport) +# define LIB_IMPORT __declspec(dllimport) +#else +# define LIB_EXPORT +# define LIB_IMPORT +#endif + +#ifdef poppler_qt4_EXPORTS +# define POPPLER_QT4_EXPORT LIB_EXPORT +#else +# define POPPLER_QT4_EXPORT LIB_IMPORT +#endif diff --git a/qt4/src/poppler-fontinfo.cc b/qt4/src/poppler-fontinfo.cc new file mode 100644 index 0000000..81aed71 --- /dev/null +++ b/qt4/src/poppler-fontinfo.cc @@ -0,0 +1,149 @@ +/* poppler-qt.h: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, Tobias Koening + * Copyright (C) 2005, Brad Hards + * Copyright (C) 2005-2008, Albert Astals Cid + * Copyright (C) 2008, 2009, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" +#include "poppler-private.h" + +namespace Poppler { + +FontInfo::FontInfo() +{ + m_data = new FontInfoData(); +} + +FontInfo::FontInfo( const FontInfoData &fid ) +{ + m_data = new FontInfoData(fid); +} + +FontInfo::FontInfo( const FontInfo &fi ) +{ + m_data = new FontInfoData(*fi.m_data); +} + +FontInfo::~FontInfo() +{ + delete m_data; +} + +QString FontInfo::name() const +{ + return m_data->fontName; +} + +QString FontInfo::file() const +{ + return m_data->fontFile; +} + +bool FontInfo::isEmbedded() const +{ + return m_data->isEmbedded; +} + +bool FontInfo::isSubset() const +{ + return m_data->isSubset; +} + +FontInfo::Type FontInfo::type() const +{ + return m_data->type; +} + +QString FontInfo::typeName() const +{ + switch (type()) { + case unknown: + return QObject::tr("unknown"); + case Type1: + return QObject::tr("Type 1"); + case Type1C: + return QObject::tr("Type 1C"); + case Type3: + return QObject::tr("Type 3"); + case TrueType: + return QObject::tr("TrueType"); + case CIDType0: + return QObject::tr("CID Type 0"); + case CIDType0C: + return QObject::tr("CID Type 0C"); + case CIDTrueType: + return QObject::tr("CID TrueType"); + case Type1COT: + return QObject::tr("Type 1C (OpenType)"); + case TrueTypeOT: + return QObject::tr("TrueType (OpenType)"); + case CIDType0COT: + return QObject::tr("CID Type 0C (OpenType)"); + case CIDTrueTypeOT: + return QObject::tr("CID TrueType (OpenType)"); + } + return QObject::tr("Bug: unexpected font type. Notify poppler mailing list!"); +} + +FontInfo& FontInfo::operator=( const FontInfo &fi ) +{ + if (this == &fi) + return *this; + + *m_data = *fi.m_data; + return *this; +} + + +FontIterator::FontIterator( int startPage, DocumentData *dd ) + : d( new FontIteratorData( startPage, dd ) ) +{ +} + +FontIterator::~FontIterator() +{ + delete d; +} + +QList FontIterator::next() +{ + ++d->currentPage; + + QList fonts; + GooList *items = d->fontInfoScanner.scan( 1 ); + if ( !items ) + return fonts; + for ( int i = 0; i < items->getLength(); ++i ) { + fonts.append( FontInfo( FontInfoData( ( ::FontInfo* )items->get( i ) ) ) ); + } + deleteGooList( items, ::FontInfo ); + return fonts; +} + +bool FontIterator::hasNext() const +{ + return ( d->currentPage + 1 ) < d->totalPages; +} + +int FontIterator::currentPage() const +{ + return d->currentPage; +} + +} diff --git a/qt4/src/poppler-form.cc b/qt4/src/poppler-form.cc new file mode 100644 index 0000000..82309ff --- /dev/null +++ b/qt4/src/poppler-form.cc @@ -0,0 +1,386 @@ +/* poppler-form.h: qt4 interface to poppler + * Copyright (C) 2007-2008, 2011, Pino Toscano + * Copyright (C) 2008, 2011, 2012 Albert Astals Cid + * Copyright (C) 2011 Carlos Garcia Campos + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include + +#include +#include +#include + +#include "poppler-form.h" +#include "poppler-page-private.h" +#include "poppler-private.h" +#include "poppler-annotation-helper.h" + +#include + +namespace { + +Qt::Alignment formTextAlignment(::FormWidget *fm) +{ + Qt::Alignment qtalign = Qt::AlignLeft; + switch (fm->getField()->getTextQuadding()) + { + case quaddingCentered: + qtalign = Qt::AlignHCenter; + break; + case quaddingRightJustified: + qtalign = Qt::AlignRight; + break; + case quaddingLeftJustified: + qtalign = Qt::AlignLeft; + } + return qtalign; +} + +} + +namespace Poppler { + +FormField::FormField(FormFieldData &dd) + : m_formData(&dd) +{ + const int rotation = m_formData->page->getRotate(); + // reading the coords + double left, top, right, bottom; + m_formData->fm->getRect(&left, &bottom, &right, &top); + // build a normalized transform matrix for this page at 100% scale + GfxState gfxState( 72.0, 72.0, m_formData->page->getCropBox(), rotation, gTrue ); + double * gfxCTM = gfxState.getCTM(); + double MTX[6]; + double pageWidth = m_formData->page->getCropWidth(); + double pageHeight = m_formData->page->getCropHeight(); + // landscape and seascape page rotation: be sure to use the correct (== rotated) page size + if (((rotation / 90) % 2) == 1) + qSwap(pageWidth, pageHeight); + for ( int i = 0; i < 6; i+=2 ) + { + MTX[i] = gfxCTM[i] / pageWidth; + MTX[i+1] = gfxCTM[i+1] / pageHeight; + } + QPointF topLeft; + XPDFReader::transform( MTX, qMin( left, right ), qMax( top, bottom ), topLeft ); + QPointF bottomRight; + XPDFReader::transform( MTX, qMax( left, right ), qMin( top, bottom ), bottomRight ); + m_formData->box = QRectF(topLeft, QSizeF(bottomRight.x() - topLeft.x(), bottomRight.y() - topLeft.y())); +} + +FormField::~FormField() +{ + delete m_formData; + m_formData = 0; +} + +QRectF FormField::rect() const +{ + return m_formData->box; +} + +int FormField::id() const +{ + return m_formData->fm->getID(); +} + +QString FormField::name() const +{ + QString name; + if (GooString *goo = m_formData->fm->getPartialName()) + { + name = QString::fromLatin1(goo->getCString()); + } + return name; +} + +QString FormField::fullyQualifiedName() const +{ + QString name; + if (GooString *goo = m_formData->fm->getFullyQualifiedName()) + { + name = UnicodeParsedString(goo); + } + return name; +} + +QString FormField::uiName() const +{ + QString name; + if (GooString *goo = m_formData->fm->getAlternateUiName()) + { + name = QString::fromLatin1(goo->getCString()); + } + return name; +} + +bool FormField::isReadOnly() const +{ + return m_formData->fm->isReadOnly(); +} + +bool FormField::isVisible() const +{ + return !(m_formData->fm->getWidgetAnnotation()->getFlags() & Annot::flagHidden); +} + +Link* FormField::activationAction() const +{ + Link* action = 0; + if (::LinkAction *act = m_formData->fm->getActivationAction()) + { + action = PageData::convertLinkActionToLink(act, m_formData->doc, QRectF()); + } + return action; +} + + +FormFieldButton::FormFieldButton(DocumentData *doc, ::Page *p, ::FormWidgetButton *w) + : FormField(*new FormFieldData(doc, p, w)) +{ +} + +FormFieldButton::~FormFieldButton() +{ +} + +FormFieldButton::FormType FormFieldButton::type() const +{ + return FormField::FormButton; +} + +FormFieldButton::ButtonType FormFieldButton::buttonType() const +{ + FormWidgetButton* fwb = static_cast(m_formData->fm); + switch (fwb->getButtonType()) + { + case formButtonCheck: + return FormFieldButton::CheckBox; + break; + case formButtonPush: + return FormFieldButton::Push; + break; + case formButtonRadio: + return FormFieldButton::Radio; + break; + } + return FormFieldButton::CheckBox; +} + +QString FormFieldButton::caption() const +{ + FormWidgetButton* fwb = static_cast(m_formData->fm); + QString ret; + if (fwb->getButtonType() == formButtonPush) + { + Dict *dict = m_formData->fm->getObj()->getDict(); + Object obj1; + if (dict->lookup("MK", &obj1)->isDict()) + { + AnnotAppearanceCharacs appearCharacs(obj1.getDict()); + if (appearCharacs.getNormalCaption()) + { + ret = UnicodeParsedString(appearCharacs.getNormalCaption()); + } + } + obj1.free(); + } + else + { + if (const char *goo = fwb->getOnStr()) + { + ret = QString::fromUtf8(goo); + } + } + return ret; +} + +bool FormFieldButton::state() const +{ + FormWidgetButton* fwb = static_cast(m_formData->fm); + return fwb->getState(); +} + +void FormFieldButton::setState( bool state ) +{ + FormWidgetButton* fwb = static_cast(m_formData->fm); + fwb->setState((GBool)state); +} + +QList FormFieldButton::siblings() const +{ + FormWidgetButton* fwb = static_cast(m_formData->fm); + if (fwb->getButtonType() == formButtonPush) + return QList(); + + QList ret; + unsigned *sibls = fwb->getSiblingsID(); + for (int i = 0; i < fwb->getNumSiblingsID(); ++i) + ret.append(sibls[i]); + + return ret; +} + + +FormFieldText::FormFieldText(DocumentData *doc, ::Page *p, ::FormWidgetText *w) + : FormField(*new FormFieldData(doc, p, w)) +{ +} + +FormFieldText::~FormFieldText() +{ +} + +FormField::FormType FormFieldText::type() const +{ + return FormField::FormText; +} + +FormFieldText::TextType FormFieldText::textType() const +{ + FormWidgetText* fwt = static_cast(m_formData->fm); + if (fwt->isFileSelect()) + return FormFieldText::FileSelect; + else if (fwt->isMultiline()) + return FormFieldText::Multiline; + return FormFieldText::Normal; +} + +QString FormFieldText::text() const +{ + GooString *goo = static_cast(m_formData->fm)->getContent(); + return UnicodeParsedString(goo); +} + +void FormFieldText::setText( const QString& text ) +{ + FormWidgetText* fwt = static_cast(m_formData->fm); + GooString * goo = QStringToUnicodeGooString( text ); + fwt->setContent( goo ); + delete goo; +} + +bool FormFieldText::isPassword() const +{ + FormWidgetText* fwt = static_cast(m_formData->fm); + return fwt->isPassword(); +} + +bool FormFieldText::isRichText() const +{ + FormWidgetText* fwt = static_cast(m_formData->fm); + return fwt->isRichText(); +} + +int FormFieldText::maximumLength() const +{ + FormWidgetText* fwt = static_cast(m_formData->fm); + const int maxlen = fwt->getMaxLen(); + return maxlen > 0 ? maxlen : -1; +} + +Qt::Alignment FormFieldText::textAlignment() const +{ + return formTextAlignment(m_formData->fm); +} + +bool FormFieldText::canBeSpellChecked() const +{ + FormWidgetText* fwt = static_cast(m_formData->fm); + return !fwt->noSpellCheck(); +} + + +FormFieldChoice::FormFieldChoice(DocumentData *doc, ::Page *p, ::FormWidgetChoice *w) + : FormField(*new FormFieldData(doc, p, w)) +{ +} + +FormFieldChoice::~FormFieldChoice() +{ +} + +FormFieldChoice::FormType FormFieldChoice::type() const +{ + return FormField::FormChoice; +} + +FormFieldChoice::ChoiceType FormFieldChoice::choiceType() const +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + if (fwc->isCombo()) + return FormFieldChoice::ComboBox; + return FormFieldChoice::ListBox; +} + +QStringList FormFieldChoice::choices() const +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + QStringList ret; + int num = fwc->getNumChoices(); + for (int i = 0; i < num; ++i) + { + ret.append(UnicodeParsedString(fwc->getChoice(i))); + } + return ret; +} + +bool FormFieldChoice::isEditable() const +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + return fwc->isCombo() ? fwc->hasEdit() : false; +} + +bool FormFieldChoice::multiSelect() const +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + return !fwc->isCombo() ? fwc->isMultiSelect() : false; +} + +QList FormFieldChoice::currentChoices() const +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + int num = fwc->getNumChoices(); + QList choices; + for ( int i = 0; i < num; ++i ) + if ( fwc->isSelected( i ) ) + choices.append( i ); + return choices; +} + +void FormFieldChoice::setCurrentChoices( const QList &choice ) +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + fwc->deselectAll(); + for ( int i = 0; i < choice.count(); ++i ) + fwc->select( choice.at( i ) ); +} + +Qt::Alignment FormFieldChoice::textAlignment() const +{ + return formTextAlignment(m_formData->fm); +} + +bool FormFieldChoice::canBeSpellChecked() const +{ + FormWidgetChoice* fwc = static_cast(m_formData->fm); + return !fwc->noSpellCheck(); +} + +} diff --git a/qt4/src/poppler-form.h b/qt4/src/poppler-form.h new file mode 100644 index 0000000..9af367b --- /dev/null +++ b/qt4/src/poppler-form.h @@ -0,0 +1,328 @@ +/* poppler-form.h: qt4 interface to poppler + * Copyright (C) 2007-2008, Pino Toscano + * Copyright (C) 2008, 2011, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_QT4_FORM_H_ +#define _POPPLER_QT4_FORM_H_ + +#include +#include +#include "poppler-export.h" + +class Page; +class FormWidget; +class FormWidgetButton; +class FormWidgetText; +class FormWidgetChoice; + +namespace Poppler { + + class DocumentData; + class Link; + + class FormFieldData; + /** + The base class representing a form field. + + \since 0.6 + */ + class POPPLER_QT4_EXPORT FormField { + public: + + /** + The different types of form field. + */ + enum FormType { + FormButton, ///< A button field. See \ref Poppler::FormFieldButton::ButtonType "ButtonType" + FormText, ///< A text field. See \ref Poppler::FormFieldText::TextType "TextType" + FormChoice, ///< A single choice field. See \ref Poppler::FormFieldChoice::ChoiceType "ChoiceType" + FormSignature ///< A signature field. + }; + + virtual ~FormField(); + + /** + The type of the field. + */ + virtual FormType type() const = 0; + + /** + \return The size of the field, in normalized coordinates, i.e. + [0..1] with regard to the dimensions (cropbox) of the page + */ + QRectF rect() const; + + /** + The ID of the field. + */ + int id() const; + + /** + The internal name of the field. + */ + QString name() const; + + /** + The internal fully qualified name of the field. + \since 0.18 + */ + QString fullyQualifiedName() const; + + /** + The name of the field to be used in user interface (eg messages to + the user). + */ + QString uiName() const; + + /** + Whether this form field is read-only. + */ + bool isReadOnly() const; + + /** + Whether this form field is visible. + */ + bool isVisible() const; + + /** + The activation action of this form field. + + \note It may be null. + */ + Link* activationAction() const; + + protected: + /// \cond PRIVATE + FormField(FormFieldData &dd); + + FormFieldData *m_formData; + /// \endcond + + private: + Q_DISABLE_COPY(FormField) + }; + + /** + A form field that represents a "button". + + \since 0.8 + */ + class POPPLER_QT4_EXPORT FormFieldButton : public FormField { + public: + + /** + * The types of button field. + */ + enum ButtonType + { + Push, ///< A simple push button. + CheckBox, ///< A check box. + Radio ///< A radio button. + }; + + /// \cond PRIVATE + FormFieldButton(DocumentData *doc, ::Page *p, ::FormWidgetButton *w); + /// \endcond + virtual ~FormFieldButton(); + + virtual FormType type() const; + + /** + The particular type of the button field. + */ + ButtonType buttonType() const; + + /** + * The caption to be used for the button. + */ + QString caption() const; + + /** + The state of the button. + */ + bool state() const; + + /** + Sets the state of the button to the new \p state . + */ + void setState( bool state ); + + /** + The list with the IDs of siblings (ie, buttons belonging to the same + group as the current one. + + Valid only for \ref Radio buttons, an empty list otherwise. + */ + QList siblings() const; + + private: + Q_DISABLE_COPY(FormFieldButton) + }; + + /** + A form field that represents a text input. + + \since 0.6 + */ + class POPPLER_QT4_EXPORT FormFieldText : public FormField { + public: + + /** + The particular type of this text field. + */ + enum TextType { + Normal, ///< A simple singleline text field. + Multiline, ///< A multiline text field. + FileSelect ///< An input field to select the path of a file on disk. + }; + + /// \cond PRIVATE + FormFieldText(DocumentData *doc, ::Page *p, ::FormWidgetText *w); + /// \endcond + virtual ~FormFieldText(); + + virtual FormType type() const; + + /** + The text type of the text field. + */ + TextType textType() const; + + /** + The text associated with the text field. + */ + QString text() const; + + /** + Sets the text associated with the text field to the specified + \p text. + */ + void setText( const QString& text ); + + /** + Whether this text field is a password input, eg its text \b must be + replaced with asterisks. + + Always false for \ref FileSelect text fields. + */ + bool isPassword() const; + + /** + Whether this text field should allow rich text. + */ + bool isRichText() const; + + /** + The maximum length for the text of this field, or -1 if not set. + */ + int maximumLength() const; + + /** + The horizontal alignment for the text of this text field. + */ + Qt::Alignment textAlignment() const; + + /** + Whether the text inserted manually in the field (where possible) + can be spell-checked. + */ + bool canBeSpellChecked() const; + + private: + Q_DISABLE_COPY(FormFieldText) + }; + + /** + A form field that represents a choice field. + + \since 0.6 + */ + class POPPLER_QT4_EXPORT FormFieldChoice : public FormField { + public: + + /** + The particular type of this choice field. + */ + enum ChoiceType { + ComboBox, ///< A simple singleline text field. + ListBox ///< A multiline text field. + }; + + /// \cond PRIVATE + FormFieldChoice(DocumentData *doc, ::Page *p, ::FormWidgetChoice *w); + /// \endcond + virtual ~FormFieldChoice(); + + virtual FormType type() const; + + /** + The choice type of the choice field. + */ + ChoiceType choiceType() const; + + /** + The possible choices of the choice field. + */ + QStringList choices() const; + + /** + Whether this FormFieldChoice::ComboBox is editable, i.e. the user + can type in a custom value. + + Always false for the other types of choices. + */ + bool isEditable() const; + + /** + Whether more than one choice of this FormFieldChoice::ListBox + can be selected at the same time. + + Always false for the other types of choices. + */ + bool multiSelect() const; + + /** + The currently selected choices. + */ + QList currentChoices() const; + + /** + Sets the selected choices to \p choice. + */ + void setCurrentChoices( const QList &choice ); + + /** + The horizontal alignment for the text of this text field. + */ + Qt::Alignment textAlignment() const; + + /** + Whether the text inserted manually in the field (where possible) + can be spell-checked. + + Returns false if the field is not an editable text field. + */ + bool canBeSpellChecked() const; + + private: + Q_DISABLE_COPY(FormFieldChoice) + }; + +} + +#endif diff --git a/qt4/src/poppler-link-extractor-private.h b/qt4/src/poppler-link-extractor-private.h new file mode 100644 index 0000000..32ddd03 --- /dev/null +++ b/qt4/src/poppler-link-extractor-private.h @@ -0,0 +1,57 @@ +/* poppler-link-extractor_p.h: qt interface to poppler + * Copyright (C) 2007, 2008, 2011, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_LINK_EXTRACTOR_H_ +#define _POPPLER_LINK_EXTRACTOR_H_ + +#include +#include + +#include + +namespace Poppler +{ + +class Link; +class PageData; + +class LinkExtractorOutputDev : public OutputDev +{ + public: + LinkExtractorOutputDev(PageData *data); + virtual ~LinkExtractorOutputDev(); + + // inherited from OutputDev + virtual GBool upsideDown() { return gFalse; } + virtual GBool useDrawChar() { return gFalse; } + virtual GBool interpretType3Chars() { return gFalse; } + virtual void processLink(::AnnotLink *link); + + // our stuff + QList< Link* > links(); + + private: + PageData *m_data; + double m_pageCropWidth; + double m_pageCropHeight; + QList< Link* > m_links; +}; + +} + +#endif diff --git a/qt4/src/poppler-link-extractor.cc b/qt4/src/poppler-link-extractor.cc new file mode 100644 index 0000000..0b1563b --- /dev/null +++ b/qt4/src/poppler-link-extractor.cc @@ -0,0 +1,84 @@ +/* poppler-link-extractor_p.h: qt interface to poppler + * Copyright (C) 2007, 2008, 2011, Pino Toscano + * Copyright (C) 2008, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-link-extractor-private.h" + +#include +#include +#include +#include +#include + +#include "poppler-qt4.h" +#include "poppler-page-private.h" + +namespace Poppler +{ + +LinkExtractorOutputDev::LinkExtractorOutputDev(PageData *data) + : m_data(data) +{ + Q_ASSERT(m_data); + ::Page *popplerPage = m_data->page; + m_pageCropWidth = popplerPage->getCropWidth(); + m_pageCropHeight = popplerPage->getCropHeight(); + if (popplerPage->getRotate() == 90 || popplerPage->getRotate() == 270) + qSwap(m_pageCropWidth, m_pageCropHeight); + GfxState gfxState(72.0, 72.0, popplerPage->getCropBox(), popplerPage->getRotate(), gTrue); + setDefaultCTM(gfxState.getCTM()); +} + +LinkExtractorOutputDev::~LinkExtractorOutputDev() +{ + qDeleteAll(m_links); +} + +void LinkExtractorOutputDev::processLink(::AnnotLink *link) +{ + if (!link->isOk()) + return; + + double left, top, right, bottom; + int leftAux, topAux, rightAux, bottomAux; + link->getRect(&left, &top, &right, &bottom); + QRectF linkArea; + + cvtUserToDev(left, top, &leftAux, &topAux); + cvtUserToDev(right, bottom, &rightAux, &bottomAux); + linkArea.setLeft((double)leftAux / m_pageCropWidth); + linkArea.setTop((double)topAux / m_pageCropHeight); + linkArea.setRight((double)rightAux / m_pageCropWidth); + linkArea.setBottom((double)bottomAux / m_pageCropHeight); + + Link *popplerLink = m_data->convertLinkActionToLink(link->getAction(), linkArea); + if (popplerLink) + { + m_links.append(popplerLink); + } + OutputDev::processLink(link); +} + +QList< Link* > LinkExtractorOutputDev::links() +{ + QList< Link* > ret = m_links; + m_links.clear(); + return ret; +} + +} diff --git a/qt4/src/poppler-link.cc b/qt4/src/poppler-link.cc new file mode 100644 index 0000000..a4bc55b --- /dev/null +++ b/qt4/src/poppler-link.cc @@ -0,0 +1,659 @@ +/* poppler-link.cc: qt interface to poppler + * Copyright (C) 2006-2007, Albert Astals Cid + * Copyright (C) 2007-2008, Pino Toscano + * Copyright (C) 2010 Hib Eris + * Copyright (C) 2012, Tobias Koenig + * Copyright (C) 2012, Guillermo A. Amaral B. + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include + +#include "poppler-annotation-private.h" + +#include "Link.h" +#include "Rendition.h" + +bool operator==( const Ref &r1, const Ref &r2 ) +{ + return r1.num == r2.num && r1.gen == r2.gen; +} + +namespace Poppler { + +class LinkDestinationPrivate : public QSharedData +{ + public: + LinkDestinationPrivate(); + + LinkDestination::Kind kind; // destination type + QString name; + int pageNum; // page number + double left, bottom; // position + double right, top; + double zoom; // zoom factor + bool changeLeft : 1, changeTop : 1; // for destXYZ links, which position + bool changeZoom : 1; // components to change +}; + + LinkDestinationPrivate::LinkDestinationPrivate() + { + // sane defaults + kind = LinkDestination::destXYZ; + pageNum = 0; + left = 0; + bottom = 0; + right = 0; + top = 0; + zoom = 1; + changeLeft = true; + changeTop = true; + changeZoom = false; + } + +class LinkPrivate +{ + public: + LinkPrivate( const QRectF &area ); + virtual ~LinkPrivate(); + + QRectF linkArea; +}; + + LinkPrivate::LinkPrivate( const QRectF &area ) + : linkArea( area ) + { + } + + LinkPrivate::~LinkPrivate() + { + } + +class LinkGotoPrivate : public LinkPrivate +{ + public: + LinkGotoPrivate( const QRectF &area, const LinkDestination &dest ); + + QString extFileName; + LinkDestination destination; +}; + + LinkGotoPrivate::LinkGotoPrivate( const QRectF &area, const LinkDestination &dest ) + : LinkPrivate( area ), destination( dest ) + { + } + +class LinkExecutePrivate : public LinkPrivate +{ + public: + LinkExecutePrivate( const QRectF &area ); + + QString fileName; + QString parameters; +}; + + LinkExecutePrivate::LinkExecutePrivate( const QRectF &area ) + : LinkPrivate( area ) + { + } + +class LinkBrowsePrivate : public LinkPrivate +{ + public: + LinkBrowsePrivate( const QRectF &area ); + + QString url; +}; + + LinkBrowsePrivate::LinkBrowsePrivate( const QRectF &area ) + : LinkPrivate( area ) + { + } + +class LinkActionPrivate : public LinkPrivate +{ + public: + LinkActionPrivate( const QRectF &area ); + + LinkAction::ActionType type; +}; + + LinkActionPrivate::LinkActionPrivate( const QRectF &area ) + : LinkPrivate( area ) + { + } + +class LinkSoundPrivate : public LinkPrivate +{ + public: + LinkSoundPrivate( const QRectF &area ); + ~LinkSoundPrivate(); + + double volume; + bool sync : 1; + bool repeat : 1; + bool mix : 1; + SoundObject *sound; +}; + + LinkSoundPrivate::LinkSoundPrivate( const QRectF &area ) + : LinkPrivate( area ), sound( 0 ) + { + } + + LinkSoundPrivate::~LinkSoundPrivate() + { + delete sound; + } + +class LinkRenditionPrivate : public LinkPrivate +{ + public: + LinkRenditionPrivate( const QRectF &area, ::MediaRendition *rendition ); + ~LinkRenditionPrivate(); + + MediaRendition *rendition; +}; + + LinkRenditionPrivate::LinkRenditionPrivate( const QRectF &area, ::MediaRendition *r ) + : LinkPrivate( area ) + , rendition( new MediaRendition( r ) ) + { + } + + LinkRenditionPrivate::~LinkRenditionPrivate() + { + delete rendition; + } + +class LinkJavaScriptPrivate : public LinkPrivate +{ + public: + LinkJavaScriptPrivate( const QRectF &area ); + + QString js; +}; + + LinkJavaScriptPrivate::LinkJavaScriptPrivate( const QRectF &area ) + : LinkPrivate( area ) + { + } + +class LinkMoviePrivate : public LinkPrivate +{ + public: + LinkMoviePrivate( const QRectF &area, LinkMovie::Operation operation, const QString &title, const Ref &reference ); + + LinkMovie::Operation operation; + QString annotationTitle; + Ref annotationReference; +}; + + LinkMoviePrivate::LinkMoviePrivate( const QRectF &area, LinkMovie::Operation _operation, const QString &title, const Ref &reference ) + : LinkPrivate( area ), operation( _operation ), annotationTitle( title ), annotationReference( reference ) + { + } + + static void cvtUserToDev(::Page *page, double xu, double yu, int *xd, int *yd) { + double ctm[6]; + + page->getDefaultCTM(ctm, 72.0, 72.0, 0, false, true); + *xd = (int)(ctm[0] * xu + ctm[2] * yu + ctm[4] + 0.5); + *yd = (int)(ctm[1] * xu + ctm[3] * yu + ctm[5] + 0.5); + } + + LinkDestination::LinkDestination(const LinkDestinationData &data) + : d( new LinkDestinationPrivate ) + { + bool deleteDest = false; + LinkDest *ld = data.ld; + + if ( data.namedDest && !ld && !data.externalDest ) + { + deleteDest = true; + ld = data.doc->doc->findDest( data.namedDest ); + } + // in case this destination was named one, and it was not resolved + if ( data.namedDest && !ld ) + { + d->name = QString::fromLatin1( data.namedDest->getCString() ); + } + + if (!ld) return; + + if (ld->getKind() == ::destXYZ) d->kind = destXYZ; + else if (ld->getKind() == ::destFit) d->kind = destFit; + else if (ld->getKind() == ::destFitH) d->kind = destFitH; + else if (ld->getKind() == ::destFitV) d->kind = destFitV; + else if (ld->getKind() == ::destFitR) d->kind = destFitR; + else if (ld->getKind() == ::destFitB) d->kind = destFitB; + else if (ld->getKind() == ::destFitBH) d->kind = destFitBH; + else if (ld->getKind() == ::destFitBV) d->kind = destFitBV; + + if ( !ld->isPageRef() ) d->pageNum = ld->getPageNum(); + else + { + Ref ref = ld->getPageRef(); + d->pageNum = data.doc->doc->findPage( ref.num, ref.gen ); + } + double left = ld->getLeft(); + double bottom = ld->getBottom(); + double right = ld->getRight(); + double top = ld->getTop(); + d->zoom = ld->getZoom(); + d->changeLeft = ld->getChangeLeft(); + d->changeTop = ld->getChangeTop(); + d->changeZoom = ld->getChangeZoom(); + + int leftAux = 0, topAux = 0, rightAux = 0, bottomAux = 0; + + ::Page *page; + if (d->pageNum > 0 && + d->pageNum <= data.doc->doc->getNumPages() && + (page = data.doc->doc->getPage( d->pageNum ))) + { + cvtUserToDev( page, left, top, &leftAux, &topAux ); + cvtUserToDev( page, right, bottom, &rightAux, &bottomAux ); + + d->left = leftAux / (double)page->getCropWidth(); + d->top = topAux / (double)page->getCropHeight(); + d->right = rightAux/ (double)page->getCropWidth(); + d->bottom = bottomAux / (double)page->getCropHeight(); + } + else d->pageNum = 0; + + if (deleteDest) delete ld; + } + + LinkDestination::LinkDestination(const QString &description) + : d( new LinkDestinationPrivate ) + { + QStringList tokens = description.split( ';' ); + d->kind = static_cast(tokens.at(0).toInt()); + d->pageNum = tokens.at(1).toInt(); + d->left = tokens.at(2).toDouble(); + d->bottom = tokens.at(3).toDouble(); + d->right = tokens.at(4).toDouble(); + d->top = tokens.at(5).toDouble(); + d->zoom = tokens.at(6).toDouble(); + d->changeLeft = static_cast(tokens.at(7).toInt()); + d->changeTop = static_cast(tokens.at(8).toInt()); + d->changeZoom = static_cast(tokens.at(9).toInt()); + } + + LinkDestination::LinkDestination(const LinkDestination &other) + : d( other.d ) + { + } + + LinkDestination::~LinkDestination() + { + } + + LinkDestination::Kind LinkDestination::kind() const + { + return d->kind; + } + + int LinkDestination::pageNumber() const + { + return d->pageNum; + } + + double LinkDestination::left() const + { + return d->left; + } + + double LinkDestination::bottom() const + { + return d->bottom; + } + + double LinkDestination::right() const + { + return d->right; + } + + double LinkDestination::top() const + { + return d->top; + } + + double LinkDestination::zoom() const + { + return d->zoom; + } + + bool LinkDestination::isChangeLeft() const + { + return d->changeLeft; + } + + bool LinkDestination::isChangeTop() const + { + return d->changeTop; + } + + bool LinkDestination::isChangeZoom() const + { + return d->changeZoom; + } + + QString LinkDestination::toString() const + { + QString s = QString::number( (qint8)d->kind ); + s += ";" + QString::number( d->pageNum ); + s += ";" + QString::number( d->left ); + s += ";" + QString::number( d->bottom ); + s += ";" + QString::number( d->right ); + s += ";" + QString::number( d->top ); + s += ";" + QString::number( d->zoom ); + s += ";" + QString::number( (qint8)d->changeLeft ); + s += ";" + QString::number( (qint8)d->changeTop ); + s += ";" + QString::number( (qint8)d->changeZoom ); + return s; + } + + QString LinkDestination::destinationName() const + { + return d->name; + } + + LinkDestination& LinkDestination::operator=(const LinkDestination &other) + { + if ( this == &other ) + return *this; + + d = other.d; + return *this; + } + + + // Link + Link::~Link() + { + delete d_ptr; + } + + Link::Link(const QRectF &linkArea) + : d_ptr( new LinkPrivate( linkArea ) ) + { + } + + Link::Link( LinkPrivate &dd ) + : d_ptr( &dd ) + { + } + + Link::LinkType Link::linkType() const + { + return None; + } + + QRectF Link::linkArea() const + { + Q_D( const Link ); + return d->linkArea; + } + + // LinkGoto + LinkGoto::LinkGoto( const QRectF &linkArea, QString extFileName, const LinkDestination & destination ) + : Link( *new LinkGotoPrivate( linkArea, destination ) ) + { + Q_D( LinkGoto ); + d->extFileName = extFileName; + } + + LinkGoto::~LinkGoto() + { + } + + bool LinkGoto::isExternal() const + { + Q_D( const LinkGoto ); + return !d->extFileName.isEmpty(); + } + + QString LinkGoto::fileName() const + { + Q_D( const LinkGoto ); + return d->extFileName; + } + + LinkDestination LinkGoto::destination() const + { + Q_D( const LinkGoto ); + return d->destination; + } + + Link::LinkType LinkGoto::linkType() const + { + return Goto; + } + + // LinkExecute + LinkExecute::LinkExecute( const QRectF &linkArea, const QString & file, const QString & params ) + : Link( *new LinkExecutePrivate( linkArea ) ) + { + Q_D( LinkExecute ); + d->fileName = file; + d->parameters = params; + } + + LinkExecute::~LinkExecute() + { + } + + QString LinkExecute::fileName() const + { + Q_D( const LinkExecute ); + return d->fileName; + } + QString LinkExecute::parameters() const + { + Q_D( const LinkExecute ); + return d->parameters; + } + + Link::LinkType LinkExecute::linkType() const + { + return Execute; + } + + // LinkBrowse + LinkBrowse::LinkBrowse( const QRectF &linkArea, const QString &url ) + : Link( *new LinkBrowsePrivate( linkArea ) ) + { + Q_D( LinkBrowse ); + d->url = url; + } + + LinkBrowse::~LinkBrowse() + { + } + + QString LinkBrowse::url() const + { + Q_D( const LinkBrowse ); + return d->url; + } + + Link::LinkType LinkBrowse::linkType() const + { + return Browse; + } + + // LinkAction + LinkAction::LinkAction( const QRectF &linkArea, ActionType actionType ) + : Link( *new LinkActionPrivate( linkArea ) ) + { + Q_D( LinkAction ); + d->type = actionType; + } + + LinkAction::~LinkAction() + { + } + + LinkAction::ActionType LinkAction::actionType() const + { + Q_D( const LinkAction ); + return d->type; + } + + Link::LinkType LinkAction::linkType() const + { + return Action; + } + + // LinkSound + LinkSound::LinkSound( const QRectF &linkArea, double volume, bool sync, bool repeat, bool mix, SoundObject *sound ) + : Link( *new LinkSoundPrivate( linkArea ) ) + { + Q_D( LinkSound ); + d->volume = volume; + d->sync = sync; + d->repeat = repeat; + d->mix = mix; + d->sound = sound; + } + + LinkSound::~LinkSound() + { + } + + Link::LinkType LinkSound::linkType() const + { + return Sound; + } + + double LinkSound::volume() const + { + Q_D( const LinkSound ); + return d->volume; + } + + bool LinkSound::synchronous() const + { + Q_D( const LinkSound ); + return d->sync; + } + + bool LinkSound::repeat() const + { + Q_D( const LinkSound ); + return d->repeat; + } + + bool LinkSound::mix() const + { + Q_D( const LinkSound ); + return d->mix; + } + + SoundObject *LinkSound::sound() const + { + Q_D( const LinkSound ); + return d->sound; + } + + // LinkRendition + LinkRendition::LinkRendition( const QRectF &linkArea, ::MediaRendition *rendition ) + : Link( *new LinkRenditionPrivate( linkArea, rendition ) ) + { + } + + LinkRendition::~LinkRendition() + { + } + + Link::LinkType LinkRendition::linkType() const + { + return Rendition; + } + + MediaRendition * LinkRendition::rendition() const + { + Q_D( const LinkRendition ); + return d->rendition; + } + + // LinkJavaScript + LinkJavaScript::LinkJavaScript( const QRectF &linkArea, const QString &js ) + : Link( *new LinkJavaScriptPrivate( linkArea ) ) + { + Q_D( LinkJavaScript ); + d->js = js; + } + + LinkJavaScript::~LinkJavaScript() + { + } + + Link::LinkType LinkJavaScript::linkType() const + { + return JavaScript; + } + + QString LinkJavaScript::script() const + { + Q_D( const LinkJavaScript ); + return d->js; + } + + // LinkMovie + LinkMovie::LinkMovie( const QRectF &linkArea, Operation operation, const QString &annotationTitle, const Ref &annotationReference ) + : Link( *new LinkMoviePrivate( linkArea, operation, annotationTitle, annotationReference ) ) + { + } + + LinkMovie::~LinkMovie() + { + } + + Link::LinkType LinkMovie::linkType() const + { + return Movie; + } + + LinkMovie::Operation LinkMovie::operation() const + { + Q_D( const LinkMovie ); + return d->operation; + } + + bool LinkMovie::isReferencedAnnotation( const MovieAnnotation *annotation ) const + { + Q_D( const LinkMovie ); + if ( d->annotationReference.num != -1 && d->annotationReference == annotation->d_ptr->pdfObjectReference() ) + { + return true; + } + else if ( !d->annotationTitle.isNull() ) + { + return ( annotation->movieTitle() == d->annotationTitle ); + } + + return false; + } +} diff --git a/qt4/src/poppler-link.h b/qt4/src/poppler-link.h new file mode 100644 index 0000000..a2ef2d3 --- /dev/null +++ b/qt4/src/poppler-link.h @@ -0,0 +1,562 @@ +/* poppler-link.h: qt interface to poppler + * Copyright (C) 2006, Albert Astals Cid + * Copyright (C) 2007-2008, 2010, Pino Toscano + * Copyright (C) 2010, 2012, Guillermo Amaral + * Copyright (C) 2012, Tobias Koenig + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_LINK_H_ +#define _POPPLER_LINK_H_ + +#include +#include +#include +#include "poppler-export.h" + +struct Ref; +class MediaRendition; + +namespace Poppler { + +class LinkPrivate; +class LinkGotoPrivate; +class LinkExecutePrivate; +class LinkBrowsePrivate; +class LinkActionPrivate; +class LinkSoundPrivate; +class LinkJavaScriptPrivate; +class LinkMoviePrivate; +class LinkDestinationData; +class LinkDestinationPrivate; +class LinkRenditionPrivate; +class MediaRendition; +class SoundObject; + +/** + * \short A destination. + * + * The LinkDestination class represent a "destination" (in terms of visual + * viewport to be displayed) for \link Poppler::LinkGoto GoTo\endlink links, + * and items in the table of contents (TOC) of a document. + * + * Coordinates are in 0..1 range + */ +class POPPLER_QT4_EXPORT LinkDestination +{ + public: + /** + * The possible kind of "viewport destination". + */ + enum Kind + { + /** + * The new viewport is specified in terms of: + * - possibile new left coordinate (see isChangeLeft() ) + * - possibile new top coordinate (see isChangeTop() ) + * - possibile new zoom level (see isChangeZoom() ) + */ + destXYZ = 1, + destFit = 2, + destFitH = 3, + destFitV = 4, + destFitR = 5, + destFitB = 6, + destFitBH = 7, + destFitBV = 8 + }; + + /// \cond PRIVATE + LinkDestination(const LinkDestinationData &data); + LinkDestination(const QString &description); + /// \endcond + /** + * Copy constructor. + */ + LinkDestination(const LinkDestination &other); + /** + * Destructor. + */ + ~LinkDestination(); + + // Accessors. + /** + * The kind of destination. + */ + Kind kind() const; + /** + * Which page is the target of this destination. + * + * \note this number is 1-based, so for a 5 pages document the + * valid page numbers go from 1 to 5 (both included). + */ + int pageNumber() const; + /** + * The new left for the viewport of the target page, in case + * it is specified to be changed (see isChangeLeft() ) + */ + double left() const; + double bottom() const; + double right() const; + /** + * The new top for the viewport of the target page, in case + * it is specified to be changed (see isChangeTop() ) + */ + double top() const; + double zoom() const; + /** + * Whether the left of the viewport on the target page should + * be changed. + * + * \see left() + */ + bool isChangeLeft() const; + /** + * Whether the top of the viewport on the target page should + * be changed. + * + * \see top() + */ + bool isChangeTop() const; + /** + * Whether the zoom level should be changed. + * + * \see zoom() + */ + bool isChangeZoom() const; + + /** + * Return a string repesentation of this destination. + */ + QString toString() const; + + /** + * Return the name of this destination. + * + * \since 0.12 + */ + QString destinationName() const; + + /** + * Assignment operator. + */ + LinkDestination& operator=(const LinkDestination &other); + + private: + QSharedDataPointer< LinkDestinationPrivate > d; +}; + +/** + * \short Encapsulates data that describes a link. + * + * This is the base class for links. It makes mandatory for inherited + * kind of links to reimplement the linkType() method and return the type of + * the link described by the reimplemented class. + */ +class POPPLER_QT4_EXPORT Link +{ + public: + /// \cond PRIVATE + Link( const QRectF &linkArea ); + /// \endcond + + /** + * The possible kinds of link. + * + * Inherited classes must return an unique identifier + */ + enum LinkType + { + None, ///< Unknown link + Goto, ///< A "Go To" link + Execute, ///< A command to be executed + Browse, ///< An URL to be browsed (eg "http://poppler.freedesktop.org") + Action, ///< A "standard" action to be executed in the viewer + Sound, ///< A link representing a sound to be played + Movie, ///< An action to be executed on a movie + Rendition, ///< A rendition link \since 0.20 + JavaScript ///< A JavaScript code to be interpreted \since 0.10 + }; + + /** + * The type of this link. + */ + virtual LinkType linkType() const; + + /** + * Destructor. + */ + virtual ~Link(); + + /** + * The area of a Page where the link should be active. + * + * \note this can be a null rect, in this case the link represents + * a general action. The area is given in 0..1 range + */ + QRectF linkArea() const; + + protected: + /// \cond PRIVATE + Link( LinkPrivate &dd ); + Q_DECLARE_PRIVATE( Link ) + LinkPrivate *d_ptr; + /// \endcond + + private: + Q_DISABLE_COPY( Link ) +}; + + +/** + * \brief Viewport reaching request. + * + * With a LinkGoto link, the document requests the specified viewport to be + * reached (aka, displayed in a viewer). Furthermore, if a file name is specified, + * then the destination refers to that document (and not to the document the + * current LinkGoto belongs to). + */ +class POPPLER_QT4_EXPORT LinkGoto : public Link +{ + public: + /** + * Create a new Goto link. + * + * \param linkArea the active area of the link + * \param extFileName if not empty, the file name to be open + * \param destination the destination to be reached + */ + LinkGoto( const QRectF &linkArea, QString extFileName, const LinkDestination & destination ); + /** + * Destructor. + */ + ~LinkGoto(); + + /** + * Whether the destination is in an external document + * (i.e. not the current document) + */ + bool isExternal() const; + // query for goto parameters + /** + * The file name of the document the destination() refers to, + * or an empty string in case it refers to the current document. + */ + QString fileName() const; + /** + * The destination to reach. + */ + LinkDestination destination() const; + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkGoto ) + Q_DISABLE_COPY( LinkGoto ) +}; + +/** + * \brief Generic execution request. + * + * The LinkExecute link represent a "file name" execution request. The result + * depends on the \link fileName() file name\endlink: + * - if it is a document, then it is requested to be open + * - otherwise, it represents an executable to be run with the specified parameters + */ +class POPPLER_QT4_EXPORT LinkExecute : public Link +{ + public: + /** + * The file name to be executed + */ + QString fileName() const; + /** + * The parameters for the command. + */ + QString parameters() const; + + /** + * Create a new Execute link. + * + * \param linkArea the active area of the link + * \param file the file name to be open, or the program to be execute + * \param params the parameters for the program to execute + */ + LinkExecute( const QRectF &linkArea, const QString & file, const QString & params ); + /** + * Destructor. + */ + ~LinkExecute(); + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkExecute ) + Q_DISABLE_COPY( LinkExecute ) +}; + +/** + * \brief An URL to browse. + * + * The LinkBrowse link holds a URL (eg 'http://poppler.freedesktop.org', + * 'mailto:john@some.org', etc) to be open. + * + * The format of the URL is specified by RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt) + */ +class POPPLER_QT4_EXPORT LinkBrowse : public Link +{ + public: + /** + * The URL to open + */ + QString url() const; + + /** + * Create a new browse link. + * + * \param linkArea the active area of the link + * \param url the URL to be open + */ + LinkBrowse( const QRectF &linkArea, const QString &url ); + /** + * Destructor. + */ + ~LinkBrowse(); + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkBrowse ) + Q_DISABLE_COPY( LinkBrowse ) +}; + +/** + * \brief "Standard" action request. + * + * The LinkAction class represents a link that request a "standard" action + * to be performed by the viewer on the displayed document. + */ +class POPPLER_QT4_EXPORT LinkAction : public Link +{ + public: + /** + * The possible types of actions + */ + enum ActionType { PageFirst = 1, + PagePrev = 2, + PageNext = 3, + PageLast = 4, + HistoryBack = 5, + HistoryForward = 6, + Quit = 7, + Presentation = 8, + EndPresentation = 9, + Find = 10, + GoToPage = 11, + Close = 12, + Print = 13 ///< \since 0.16 + }; + + /** + * The action of the current LinkAction + */ + ActionType actionType() const; + + /** + * Create a new Action link, that executes a specified action + * on the document. + * + * \param linkArea the active area of the link + * \param actionType which action should be executed + */ + LinkAction( const QRectF &linkArea, ActionType actionType ); + /** + * Destructor. + */ + ~LinkAction(); + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkAction ) + Q_DISABLE_COPY( LinkAction ) +}; + +/** + * Sound: a sound to be played. + * + * \since 0.6 + */ +class POPPLER_QT4_EXPORT LinkSound : public Link +{ + public: + // create a Link_Sound + LinkSound( const QRectF &linkArea, double volume, bool sync, bool repeat, bool mix, SoundObject *sound ); + /** + * Destructor. + */ + virtual ~LinkSound(); + + LinkType linkType() const; + + /** + * The volume to be used when playing the sound. + * + * The volume is in the range [ -1, 1 ], where: + * - a negative number: no volume (mute) + * - 1: full volume + */ + double volume() const; + /** + * Whether the playback of the sound should be synchronous + * (thus blocking, waiting for the end of the sound playback). + */ + bool synchronous() const; + /** + * Whether the sound should be played continuously (that is, + * started again when it ends) + */ + bool repeat() const; + /** + * Whether the playback of this sound can be mixed with + * playbacks with other sounds of the same document. + * + * \note When false, any other playback must be stopped before + * playing the sound. + */ + bool mix() const; + /** + * The sound object to be played + */ + SoundObject *sound() const; + + private: + Q_DECLARE_PRIVATE( LinkSound ) + Q_DISABLE_COPY( LinkSound ) +}; + +/** + * Rendition: Rendition link. + * + * \since 0.20 + */ +class POPPLER_QT4_EXPORT LinkRendition : public Link +{ + public: + /** + * Create a new media rendition link. + * + * \param linkArea the active area of the link + * \param rendition + */ + LinkRendition( const QRectF &linkArea, ::MediaRendition *rendition ); + /** + * Destructor. + */ + virtual ~LinkRendition(); + + LinkType linkType() const; + + /** + * + */ + MediaRendition *rendition() const; + + private: + Q_DECLARE_PRIVATE( LinkRendition ) + Q_DISABLE_COPY( LinkRendition ) +}; + +/** + * JavaScript: a JavaScript code to be interpreted. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT LinkJavaScript : public Link +{ + public: + /** + * Create a new JavaScript link. + * + * \param linkArea the active area of the link + * \param js the JS code to be interpreted + */ + LinkJavaScript( const QRectF &linkArea, const QString &js ); + /** + * Destructor. + */ + virtual ~LinkJavaScript(); + + LinkType linkType() const; + + /** + * The JS code + */ + QString script() const; + + private: + Q_DECLARE_PRIVATE( LinkJavaScript ) + Q_DISABLE_COPY( LinkJavaScript ) +}; + +/** + * Movie: a movie to be played. + * + * \since 0.20 + */ +class POPPLER_QT4_EXPORT LinkMovie : public Link +{ + public: + /** + * Describes the operation to be performed on the movie. + */ + enum Operation { Play, + Stop, + Pause, + Resume + }; + + /** + * Create a new Movie link. + * + * \param linkArea the active area of the link + * \param operation the operation to be performed on the movie + * \param annotationTitle the title of the movie annotation identifying the movie to be played + * \param annotationReference the object reference of the movie annotation identifying the movie to be played + * + * Note: This constructor is supposed to be used by Poppler::Page only. + */ + LinkMovie( const QRectF &linkArea, Operation operation, const QString &annotationTitle, const Ref &annotationReference ); + /** + * Destructor. + */ + ~LinkMovie(); + LinkType linkType() const; + /** + * Returns the operation to be performed on the movie. + */ + Operation operation() const; + /** + * Returns whether the given @p annotation is the referenced movie annotation for this movie @p link. + */ + bool isReferencedAnnotation( const MovieAnnotation *annotation ) const; + + private: + Q_DECLARE_PRIVATE( LinkMovie ) + Q_DISABLE_COPY( LinkMovie ) +}; + +} + +#endif diff --git a/qt4/src/poppler-media.cc b/qt4/src/poppler-media.cc new file mode 100644 index 0000000..c318147 --- /dev/null +++ b/qt4/src/poppler-media.cc @@ -0,0 +1,162 @@ +/* poppler-media.cc: qt interface to poppler + * Copyright (C) 2012 Guillermo A. Amaral B. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-media.h" + +#include "Rendition.h" + +#include "poppler-private.h" + +#include + +#define BUFFER_MAX 4096 + +namespace Poppler +{ + +class MediaRenditionPrivate +{ +public: + + MediaRenditionPrivate(::MediaRendition *rendition) + : rendition(rendition) + { + } + + ::MediaRendition *rendition; +}; + +MediaRendition::MediaRendition(::MediaRendition *rendition) + : d_ptr(new MediaRenditionPrivate(rendition)) +{ +} + +MediaRendition::~MediaRendition() +{ + delete d_ptr; +} + +bool +MediaRendition::isValid() const +{ + Q_D( const MediaRendition ); + return d->rendition && d->rendition->isOk(); +} + +QString +MediaRendition::contentType() const +{ + Q_ASSERT(isValid() && "Invalid media rendition."); + Q_D( const MediaRendition ); + return UnicodeParsedString(d->rendition->getContentType()); +} + +QString +MediaRendition::fileName() const +{ + Q_ASSERT(isValid() && "Invalid media rendition."); + Q_D( const MediaRendition ); + return UnicodeParsedString(d->rendition->getFileName()); +} + +bool +MediaRendition::isEmbedded() const +{ + Q_ASSERT(isValid() && "Invalid media rendition."); + Q_D( const MediaRendition ); + return d->rendition->getIsEmbedded(); +} + +QByteArray +MediaRendition::data() const +{ + Q_ASSERT(isValid() && "Invalid media rendition."); + Q_D( const MediaRendition ); + + Stream *s = d->rendition->getEmbbededStream(); + if (!s) + return QByteArray(); + + QBuffer buffer; + Guchar data[BUFFER_MAX]; + int bread; + + buffer.open(QIODevice::WriteOnly); + s->reset(); + while ((bread = s->doGetChars(BUFFER_MAX, data)) != 0) + buffer.write(reinterpret_cast(data), bread); + buffer.close(); + + return buffer.data(); +} + +bool +MediaRendition::autoPlay() const +{ + Q_D( const MediaRendition ); + if (d->rendition->getBEParameters()) { + return d->rendition->getBEParameters()->autoPlay; + } else if (d->rendition->getMHParameters()) { + return d->rendition->getMHParameters()->autoPlay; + } else qDebug("No BE or MH paremeters to reference!"); + return false; +} + +bool +MediaRendition::showControls() const +{ + Q_D( const MediaRendition ); + if (d->rendition->getBEParameters()) { + return d->rendition->getBEParameters()->showControls; + } else if (d->rendition->getMHParameters()) { + return d->rendition->getMHParameters()->showControls; + } else qDebug("No BE or MH paremeters to reference!"); + return false; +} + +float +MediaRendition::repeatCount() const +{ + Q_D( const MediaRendition ); + if (d->rendition->getBEParameters()) { + return d->rendition->getBEParameters()->repeatCount; + } else if (d->rendition->getMHParameters()) { + return d->rendition->getMHParameters()->repeatCount; + } else qDebug("No BE or MH paremeters to reference!"); + return 1.f; +} + +QSize +MediaRendition::size() const +{ + Q_D( const MediaRendition ); + MediaParameters *mp = 0; + + if (d->rendition->getBEParameters()) + mp = d->rendition->getBEParameters(); + else if (d->rendition->getMHParameters()) + mp = d->rendition->getMHParameters(); + else qDebug("No BE or MH paremeters to reference!"); + + if (mp) + return QSize(mp->windowParams.width, mp->windowParams.height); + return QSize(); +} + +} + diff --git a/qt4/src/poppler-media.h b/qt4/src/poppler-media.h new file mode 100644 index 0000000..64ec83c --- /dev/null +++ b/qt4/src/poppler-media.h @@ -0,0 +1,97 @@ +/* poppler-media.h: qt interface to poppler + * Copyright (C) 2012 Guillermo A. Amaral B. + * Copyright (C) 2012 Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_MEDIARENDITION_H__ +#define __POPPLER_MEDIARENDITION_H__ + +#include "poppler-export.h" + +#include +#include + +class MediaRendition; +class QIODevice; + +namespace Poppler +{ + class MediaRenditionPrivate; + + /** + Qt wrapper for MediaRendition. + + \since 0.20 + */ + class POPPLER_QT4_EXPORT MediaRendition { + public: + MediaRendition(::MediaRendition *rendition); + ~MediaRendition(); + + /** + Check if wrapper is holding a valid rendition object. + */ + bool isValid() const; + + /** + Returns content type. + */ + QString contentType() const; + + /** + Returns file name. + */ + QString fileName() const; + + /** + Returns true if media is embedded. + */ + bool isEmbedded() const; + + /** + Returns data buffer. + */ + QByteArray data() const; + + /** + Convenience accessor for auto-play parameter. + */ + bool autoPlay() const; + + /** + Convenience accessor for show controls parameter. + */ + bool showControls() const; + + /** + Convenience accessor for repeat count parameter. + */ + float repeatCount() const; + + /** + Convenience accessor for size parameter. + */ + QSize size() const; + + private: + Q_DECLARE_PRIVATE( MediaRendition ) + MediaRenditionPrivate *d_ptr; + Q_DISABLE_COPY( MediaRendition ) + }; +} + +#endif /* __POPPLER_MEDIARENDITION_H__ */ diff --git a/qt4/src/poppler-movie.cc b/qt4/src/poppler-movie.cc new file mode 100644 index 0000000..869e381 --- /dev/null +++ b/qt4/src/poppler-movie.cc @@ -0,0 +1,95 @@ +/* poppler-sound.cc: qt interface to poppler + * Copyright (C) 2008, 2010, Pino Toscano + * Copyright (C) 2008, Albert Astals Cid + * Copyright (C) 2010, Carlos Garcia Campos + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include "Object.h" +#include "Annot.h" +#include "Movie.h" + +namespace Poppler +{ + +class MovieData +{ +public: + MovieData() + : m_movieObj( 0 ) + { + } + + ~MovieData() + { + delete m_movieObj; + } + + Movie *m_movieObj; + QSize m_size; + int m_rotation; + MovieObject::PlayMode m_playMode : 3; + bool m_showControls : 1; +}; + +MovieObject::MovieObject( AnnotMovie *ann ) +{ + m_movieData = new MovieData(); + m_movieData->m_movieObj = ann->getMovie()->copy(); + + MovieActivationParameters *mp = m_movieData->m_movieObj->getActivationParameters(); + int width, height; + m_movieData->m_movieObj->getFloatingWindowSize(&width, &height); + m_movieData->m_size = QSize(width, height); + m_movieData->m_rotation = m_movieData->m_movieObj->getRotationAngle(); + m_movieData->m_showControls = mp->showControls; + m_movieData->m_playMode = (MovieObject::PlayMode)mp->repeatMode; +} + +MovieObject::~MovieObject() +{ + delete m_movieData; +} + +QString MovieObject::url() const +{ + GooString * goo = m_movieData->m_movieObj->getFileName(); + return goo ? QString( goo->getCString() ) : QString(); +} + +QSize MovieObject::size() const +{ + return m_movieData->m_size; +} + +int MovieObject::rotation() const +{ + return m_movieData->m_rotation; +} + +bool MovieObject::showControls() const +{ + return m_movieData->m_showControls; +} + +MovieObject::PlayMode MovieObject::playMode() const +{ + return m_movieData->m_playMode; +} + +} diff --git a/qt4/src/poppler-optcontent-private.h b/qt4/src/poppler-optcontent-private.h new file mode 100644 index 0000000..98eda07 --- /dev/null +++ b/qt4/src/poppler-optcontent-private.h @@ -0,0 +1,121 @@ +/* poppler-optcontent-private.h: qt interface to poppler + * + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_OPTCONTENT_PRIVATE_H +#define POPPLER_OPTCONTENT_PRIVATE_H + +#include +#include +#include + +class Array; +class OCGs; +class OptionalContentGroup; + +class QModelIndex; + +namespace Poppler +{ + class OptContentItem; + class OptContentModel; + class OptContentModelPrivate; + + class RadioButtonGroup + { + public: + RadioButtonGroup( OptContentModelPrivate *ocModel, Array *rbarray); + ~RadioButtonGroup(); + QSet setItemOn( OptContentItem *itemToSetOn ); + + private: + QList itemsInGroup; + }; + + class OptContentItem + { + public: + enum ItemState { On, Off, HeadingOnly }; + + OptContentItem( OptionalContentGroup *group ); + OptContentItem( const QString &label ); + OptContentItem(); + ~OptContentItem(); + + QString name() const { return m_name; } + ItemState state() const { return m_stateBackup; } + bool setState(ItemState state, QSet &changedItems); + + QList childList() { return m_children; } + + void setParent( OptContentItem* parent) { m_parent = parent; } + OptContentItem* parent() { return m_parent; } + + void addChild( OptContentItem *child ); + + void appendRBGroup( RadioButtonGroup *rbgroup ); + + bool isEnabled() const { return m_enabled; } + + QSet recurseListChildren(bool includeMe = false) const; + + private: + OptionalContentGroup *m_group; + QString m_name; + ItemState m_state; // true for ON, false for OFF + ItemState m_stateBackup; + QList m_children; + OptContentItem *m_parent; + QList m_rbGroups; + bool m_enabled; + }; + + class OptContentModelPrivate + { + public: + OptContentModelPrivate( OptContentModel *qq, OCGs *optContent ); + ~OptContentModelPrivate(); + + void parseRBGroupsArray( Array *rBGroupArray ); + OptContentItem *nodeFromIndex(const QModelIndex &index, bool canBeNull = false) const; + QModelIndex indexFromItem(OptContentItem *node, int column) const; + + /** + Get the OptContentItem corresponding to a given reference value. + + \param ref the reference number (e.g. from Object.getRefNum()) to look up + + \return the matching optional content item, or null if the reference wasn't found + */ + OptContentItem *itemFromRef( const QString &ref ) const; + void setRootNode(OptContentItem *node); + + OptContentModel *q; + + QMap m_optContentItems; + QList m_rbgroups; + OptContentItem *m_rootNode; + + private: + void addChild( OptContentItem *parent, OptContentItem *child); + void parseOrderArray( OptContentItem *parentNode, Array *orderArray ); + }; +} + +#endif diff --git a/qt4/src/poppler-optcontent.cc b/qt4/src/poppler-optcontent.cc new file mode 100644 index 0000000..6a5ffe7 --- /dev/null +++ b/qt4/src/poppler-optcontent.cc @@ -0,0 +1,428 @@ +/* poppler-optcontent.cc: qt interface to poppler + * + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2008, Pino Toscano + * Copyright (C) 2008, Carlos Garcia Campos + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-optcontent.h" + +#include "poppler-optcontent-private.h" + +#include "poppler-private.h" + +#include +#include + +#include "poppler/OptionalContent.h" + +namespace Poppler +{ + + RadioButtonGroup::RadioButtonGroup( OptContentModelPrivate *ocModel, Array *rbarray ) + { + for (int i = 0; i < rbarray->getLength(); ++i) { + Object ref; + rbarray->getNF( i, &ref ); + if ( ! ref.isRef() ) { + qDebug() << "expected ref, but got:" << ref.getType(); + } + OptContentItem *item = ocModel->itemFromRef( QString::number(ref.getRefNum() ) ); + itemsInGroup.append( item ); + } + for (int i = 0; i < itemsInGroup.size(); ++i) { + OptContentItem *item = itemsInGroup.at(i); + item->appendRBGroup( this ); + } + } + + RadioButtonGroup::~RadioButtonGroup() + { + } + + QSet RadioButtonGroup::setItemOn( OptContentItem *itemToSetOn ) + { + QSet changedItems; + for (int i = 0; i < itemsInGroup.size(); ++i) { + OptContentItem *thisItem = itemsInGroup.at(i); + if (thisItem != itemToSetOn) { + QSet newChangedItems; + thisItem->setState(OptContentItem::Off, newChangedItems); + changedItems += newChangedItems; + } + } + return changedItems; + } + + + + OptContentItem::OptContentItem( OptionalContentGroup *group ) + { + m_group = group; + m_parent = 0; + m_name = UnicodeParsedString( group->getName() ); + if ( group->getState() == OptionalContentGroup::On ) { + m_state = OptContentItem::On; + } else { + m_state = OptContentItem::Off; + } + m_stateBackup = m_state; + m_enabled = true; + } + + OptContentItem::OptContentItem( const QString &label ) + { + m_parent = 0; + m_name = label; + m_group = 0; + m_state = OptContentItem::HeadingOnly; + m_stateBackup = m_state; + m_enabled = true; + } + + OptContentItem::OptContentItem() : + m_parent( 0 ), m_enabled(true) + { + } + + OptContentItem::~OptContentItem() + { + } + + void OptContentItem::appendRBGroup( RadioButtonGroup *rbgroup ) + { + m_rbGroups.append( rbgroup ); + } + + + bool OptContentItem::setState(ItemState state, QSet &changedItems) + { + m_state = state; + m_stateBackup = m_state; + changedItems.insert(this); + QSet empty; + Q_FOREACH (OptContentItem *child, m_children) { + ItemState oldState = child->m_stateBackup; + child->setState(state == OptContentItem::On ? child->m_stateBackup : OptContentItem::Off, empty); + child->m_enabled = state == OptContentItem::On; + child->m_stateBackup = oldState; + } + if (!m_group) { + return false; + } + if ( state == OptContentItem::On ) { + m_group->setState( OptionalContentGroup::On ); + for (int i = 0; i < m_rbGroups.size(); ++i) { + RadioButtonGroup *rbgroup = m_rbGroups.at(i); + changedItems += rbgroup->setItemOn( this ); + } + } else if ( state == OptContentItem::Off ) { + m_group->setState( OptionalContentGroup::Off ); + } + return true; + } + + void OptContentItem::addChild( OptContentItem *child ) + { + m_children += child; + child->setParent( this ); + } + + QSet OptContentItem::recurseListChildren(bool includeMe) const + { + QSet ret; + if (includeMe) { + ret.insert(const_cast(this)); + } + Q_FOREACH (OptContentItem *child, m_children) { + ret += child->recurseListChildren(true); + } + return ret; + } + + OptContentModelPrivate::OptContentModelPrivate( OptContentModel *qq, OCGs *optContent ) + : q(qq) + { + m_rootNode = new OptContentItem(); + GooList *ocgs = optContent->getOCGs(); + + for (int i = 0; i < ocgs->getLength(); ++i) { + OptionalContentGroup *ocg = static_cast(ocgs->get(i)); + OptContentItem *node = new OptContentItem( ocg ); + m_optContentItems.insert( QString::number(ocg->getRef().num), node); + } + + if ( optContent->getOrderArray() == 0 ) { + // no Order array, so drop them all at the top level + QMapIterator i(m_optContentItems); + while ( i.hasNext() ) { + i.next(); + qDebug() << "iterator" << i.key() << ":" << i.value(); + addChild( i.value(), m_rootNode ); + } + } else { + parseOrderArray( m_rootNode, optContent->getOrderArray() ); + } + + parseRBGroupsArray( optContent->getRBGroupsArray() ); + } + + OptContentModelPrivate::~OptContentModelPrivate() + { + qDeleteAll( m_optContentItems ); + qDeleteAll( m_rbgroups ); + delete m_rootNode; + } + + void OptContentModelPrivate::parseOrderArray( OptContentItem *parentNode, Array *orderArray ) + { + OptContentItem *lastItem = parentNode; + for (int i = 0; i < orderArray->getLength(); ++i) { + Object orderItem; + orderArray->get(i, &orderItem); + if ( orderItem.isDict() ) { + Object item; + orderArray->getNF(i, &item); + if (item.isRef() ) { + OptContentItem *ocItem = m_optContentItems.value(QString::number(item.getRefNum()), 0); + if (ocItem) { + addChild( parentNode, ocItem ); + lastItem = ocItem; + } else { + qDebug() << "could not find group for object" << item.getRefNum(); + } + } + item.free(); + } else if ( (orderItem.isArray()) && (orderItem.arrayGetLength() > 0) ) { + parseOrderArray(lastItem, orderItem.getArray()); + } else if ( orderItem.isString() ) { + GooString *label = orderItem.getString(); + OptContentItem *header = new OptContentItem ( UnicodeParsedString ( label ) ); + addChild( parentNode, header ); + parentNode = header; + lastItem = header; + } else { + qDebug() << "something unexpected"; + } + orderItem.free(); + } + } + + void OptContentModelPrivate::parseRBGroupsArray( Array *rBGroupArray ) + { + if (! rBGroupArray) { + return; + } + // This is an array of array(s) + for (int i = 0; i < rBGroupArray->getLength(); ++i) { + Object rbObj; + rBGroupArray->get(i, &rbObj); + if ( ! rbObj.isArray() ) { + qDebug() << "expected inner array, got:" << rbObj.getType(); + return; + } + Array *rbarray = rbObj.getArray(); + RadioButtonGroup *rbg = new RadioButtonGroup( this, rbarray ); + m_rbgroups.append( rbg ); + rbObj.free(); + } + } + + OptContentModel::OptContentModel( OCGs *optContent, QObject *parent) + : QAbstractItemModel(parent) + { + d = new OptContentModelPrivate( this, optContent ); + } + + OptContentModel::~OptContentModel() + { + delete d; + } + + void OptContentModelPrivate::setRootNode(OptContentItem *node) + { + delete m_rootNode; + m_rootNode = node; + q->reset(); + } + + QModelIndex OptContentModel::index(int row, int column, const QModelIndex &parent) const + { + if (row < 0 || column != 0) { + return QModelIndex(); + } + + OptContentItem *parentNode = d->nodeFromIndex( parent ); + if (row < parentNode->childList().count()) { + return createIndex(row, column, parentNode->childList().at(row)); + } + return QModelIndex(); + } + + QModelIndex OptContentModel::parent(const QModelIndex &child) const + { + OptContentItem *childNode = d->nodeFromIndex( child ); + if (!childNode) { + return QModelIndex(); + } + return d->indexFromItem(childNode->parent(), child.column()); + } + + QModelIndex OptContentModelPrivate::indexFromItem(OptContentItem *node, int column) const + { + if (!node) { + return QModelIndex(); + } + OptContentItem *parentNode = node->parent(); + if (!parentNode) { + return QModelIndex(); + } + const int row = parentNode->childList().indexOf(node); + return q->createIndex(row, column, node); + } + + int OptContentModel::rowCount(const QModelIndex &parent) const + { + OptContentItem *parentNode = d->nodeFromIndex( parent ); + if (!parentNode) { + return 0; + } else { + return parentNode->childList().count(); + } + } + + int OptContentModel::columnCount(const QModelIndex &parent) const + { + return 1; + } + + + QVariant OptContentModel::data(const QModelIndex &index, int role) const + { + OptContentItem *node = d->nodeFromIndex(index, true); + if (!node) { + return QVariant(); + } + + switch (role) { + case Qt::DisplayRole: + return node->name(); + break; + case Qt::EditRole: + if (node->state() == OptContentItem::On) { + return true; + } else if (node->state() == OptContentItem::Off) { + return false; + } + break; + case Qt::CheckStateRole: + if (node->state() == OptContentItem::On) { + return Qt::Checked; + } else if (node->state() == OptContentItem::Off) { + return Qt::Unchecked; + } + break; + } + + return QVariant(); + } + + bool OptContentModel::setData ( const QModelIndex & index, const QVariant & value, int role ) + { + OptContentItem *node = d->nodeFromIndex(index, true); + if (!node) { + return false; + } + + switch (role) { + case Qt::CheckStateRole: + { + const bool newvalue = value.toBool(); + if (newvalue) { + if (node->state() != OptContentItem::On) { + QSet changedItems; + node->setState(OptContentItem::On, changedItems); + changedItems += node->recurseListChildren(false); + QModelIndexList indexes; + Q_FOREACH (OptContentItem *item, changedItems) { + indexes.append(d->indexFromItem(item, 0)); + } + qStableSort(indexes); + Q_FOREACH (const QModelIndex &changedIndex, indexes) { + emit dataChanged(changedIndex, changedIndex); + } + return true; + } + } else { + if (node->state() != OptContentItem::Off) { + QSet changedItems; + node->setState(OptContentItem::Off, changedItems); + changedItems += node->recurseListChildren(false); + QModelIndexList indexes; + Q_FOREACH (OptContentItem *item, changedItems) { + indexes.append(d->indexFromItem(item, 0)); + } + qStableSort(indexes); + Q_FOREACH (const QModelIndex &changedIndex, indexes) { + emit dataChanged(changedIndex, changedIndex); + } + return true; + } + } + break; + } + } + + return false; + } + + Qt::ItemFlags OptContentModel::flags ( const QModelIndex & index ) const + { + OptContentItem *node = d->nodeFromIndex(index); + Qt::ItemFlags itemFlags = Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; + if (node->isEnabled()) { + itemFlags |= Qt::ItemIsEnabled; + } + return itemFlags; + } + + QVariant OptContentModel::headerData( int section, Qt::Orientation orientation, int role ) const + { + return QAbstractItemModel::headerData( section, orientation, role ); + } + + void OptContentModelPrivate::addChild( OptContentItem *parent, OptContentItem *child ) + { + parent->addChild( child ); + } + + OptContentItem* OptContentModelPrivate::itemFromRef( const QString &ref ) const + { + return m_optContentItems.value(ref, 0); + } + + OptContentItem* OptContentModelPrivate::nodeFromIndex(const QModelIndex &index, bool canBeNull) const + { + if (index.isValid()) { + return static_cast(index.internalPointer()); + } else { + return canBeNull ? 0 : m_rootNode; + } + } +} + +#include "poppler-optcontent.moc" diff --git a/qt4/src/poppler-optcontent.h b/qt4/src/poppler-optcontent.h new file mode 100644 index 0000000..3f47853 --- /dev/null +++ b/qt4/src/poppler-optcontent.h @@ -0,0 +1,76 @@ +/* poppler-optcontent.h: qt interface to poppler + * + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_OPTCONTENT_H +#define POPPLER_OPTCONTENT_H + +#include + +#include "poppler-export.h" + +class OCGs; + +namespace Poppler +{ + class Document; + class OptContentModelPrivate; + + /** + * \brief Model for optional content + * + * OptContentModel is an item model representing the optional content items + * that can be found in PDF documents. + * + * The model offers a mostly read-only display of the data, allowing to + * enable/disable some contents setting the Qt::CheckStateRole data role. + * + * \since 0.8 + */ + class POPPLER_QT4_EXPORT OptContentModel : public QAbstractItemModel + { + friend class Document; + + Q_OBJECT + + public: + virtual ~OptContentModel(); + + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent) const; + + QVariant data(const QModelIndex &index, int role) const; + virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); + + Qt::ItemFlags flags ( const QModelIndex & index ) const; + + virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + + private: + OptContentModel( OCGs *optContent, QObject *parent = 0); + + friend class OptContentModelPrivate; + OptContentModelPrivate *d; + }; +} + +#endif diff --git a/qt4/src/poppler-page-private.h b/qt4/src/poppler-page-private.h new file mode 100644 index 0000000..ecdca17 --- /dev/null +++ b/qt4/src/poppler-page-private.h @@ -0,0 +1,49 @@ +/* poppler-page.cc: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2007, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_PAGE_PRIVATE_H_ +#define _POPPLER_PAGE_PRIVATE_H_ + +class QRectF; + +class LinkAction; +class Page; + +namespace Poppler +{ + +class DocumentData; +class PageTransition; + +class PageData { +public: + Link* convertLinkActionToLink(::LinkAction * a, const QRectF &linkArea); + + DocumentData *parentDoc; + ::Page *page; + int index; + PageTransition *transition; + + static Link* convertLinkActionToLink(::LinkAction * a, DocumentData *parentDoc, const QRectF &linkArea); +}; + +} + +#endif diff --git a/qt4/src/poppler-page-transition-private.h b/qt4/src/poppler-page-transition-private.h new file mode 100644 index 0000000..63febb0 --- /dev/null +++ b/qt4/src/poppler-page-transition-private.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2005, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +class Object; + +namespace Poppler { + +class PageTransitionParams { + public: + Object *dictObj; +}; + +} diff --git a/qt4/src/poppler-page-transition.cc b/qt4/src/poppler-page-transition.cc new file mode 100644 index 0000000..cde8818 --- /dev/null +++ b/qt4/src/poppler-page-transition.cc @@ -0,0 +1,95 @@ +/* PageTransition.cc + * Copyright (C) 2005, Net Integration Technologies, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "PageTransition.h" +#include "poppler-page-transition.h" +#include "poppler-page-transition-private.h" + +namespace Poppler { + +class PageTransitionData +{ + public: + PageTransitionData(Object *trans) + { + pt = new ::PageTransition(trans); + } + + PageTransitionData(const PageTransitionData &ptd) + { + pt = new ::PageTransition(*ptd.pt); + } + + ~PageTransitionData() + { + delete pt; + } + + ::PageTransition *pt; +}; + +PageTransition::PageTransition(const PageTransitionParams ¶ms) +{ + data = new PageTransitionData(params.dictObj); +} + +PageTransition::PageTransition(const PageTransition &pt) +{ + data = new PageTransitionData(*pt.data); +} + +PageTransition::~PageTransition() +{ + delete data; +} + +PageTransition::Type PageTransition::type() const +{ + return (Poppler::PageTransition::Type)data->pt->getType(); +} + +int PageTransition::duration() const +{ + return data->pt->getDuration(); +} + +PageTransition::Alignment PageTransition::alignment() const +{ + return (Poppler::PageTransition::Alignment)data->pt->getAlignment(); +} + +PageTransition::Direction PageTransition::direction() const +{ + return (Poppler::PageTransition::Direction)data->pt->getDirection(); +} + +int PageTransition::angle() const +{ + return data->pt->getAngle(); +} + +double PageTransition::scale() const +{ + return data->pt->getScale(); +} +bool PageTransition::isRectangular() const +{ + return data->pt->isRectangular(); +} + +} diff --git a/qt4/src/poppler-page-transition.h b/qt4/src/poppler-page-transition.h new file mode 100644 index 0000000..e7f39e2 --- /dev/null +++ b/qt4/src/poppler-page-transition.h @@ -0,0 +1,148 @@ +/* PageTransition.h + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, Brad Hards + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __PAGETRANSITION_X_H__ +#define __PAGETRANSITION_X_H__ + +#include "poppler-export.h" + +namespace Poppler { + +class PageTransitionParams; +class PageTransitionData; + +/** + \brief Describes how a PDF file viewer shall perform the transition + from one page to another + + In PDF files there is a way to specify if the viewer shall use + certain effects to perform the transition from one page to + another. This feature can be used, e.g., in a PDF-based beamer + presentation. + + This utility class represents the transition effect, and can be + used to extract the information from a PDF object. +*/ + + +class POPPLER_QT4_EXPORT PageTransition { + public: + + /** \brief transition effect that shall be used + */ + // if changed remember to keep in sync with PageTransition.h enum + enum Type { + Replace = 0, + Split, + Blinds, + Box, + Wipe, + Dissolve, + Glitter, + Fly, + Push, + Cover, + Uncover, + Fade + }; + + /** \brief alignment of the transition effect that shall be used + */ + // if changed remember to keep in sync with PageTransition.h enum + enum Alignment { + Horizontal = 0, + Vertical + }; + + /** \brief direction of the transition effect that shall be used + */ + // if changed remember to keep in sync with PageTransition.h enum + enum Direction { + Inward = 0, + Outward + }; + + /** \brief Construct a new PageTransition object from a page dictionary. + + Users of the library will rarely need to construct a + PageTransition object themselves. Instead, the method + Poppler::Page::transition() can be used to find out if a certain + transition effect is specified. + + @warning In case or error, this method will print an error message to stderr, + and construct a default object. + + @param params an object whose dictionary will be read and + parsed. This must be a valid object, whose dictionaries are + accessed by the constructor. The object is only accessed by this + constructor, and may be deleted after the constructor returns. + */ + PageTransition(const PageTransitionParams ¶ms); + + /** \brief copy constructor */ + PageTransition(const PageTransition &pt); + + /** + Destructor + */ + ~PageTransition(); + + /** + \brief Get type of the transition. + */ + Type type() const; + + /** + \brief Get duration of the transition in seconds. + */ + int duration() const; + + /** + \brief Get dimension in which the transition effect occurs. + */ + Alignment alignment() const; + + /** + \brief Get direction of motion of the transition effect. + */ + Direction direction() const; + + /** + \brief Get direction in which the transition effect moves. + */ + int angle() const; + + /** + \brief Get starting or ending scale. + */ + double scale() const; + + /** + \brief Returns true if the area to be flown is rectangular and + opaque. + */ + bool isRectangular() const; + + private: + PageTransitionData *data; +}; + +} + +#endif diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc new file mode 100644 index 0000000..6a16d03 --- /dev/null +++ b/qt4/src/poppler-page.cc @@ -0,0 +1,646 @@ +/* poppler-page.cc: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, Brad Hards + * Copyright (C) 2005-2011, Albert Astals Cid + * Copyright (C) 2005, Stefan Kebekus + * Copyright (C) 2006-2011, Pino Toscano + * Copyright (C) 2008 Carlos Garcia Campos + * Copyright (C) 2009 Shawn Rutledge + * Copyright (C) 2010, 2012, Guillermo Amaral + * Copyright (C) 2010 Suzuki Toshiya + * Copyright (C) 2010 Matthias Fauconneau + * Copyright (C) 2010 Hib Eris + * Copyright (C) 2012 Tobias Koenig + * Copyright (C) 2012 Fabio D'Urso + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(HAVE_SPLASH) +#include +#include +#endif + +#include "poppler-private.h" +#include "poppler-page-transition-private.h" +#include "poppler-page-private.h" +#include "poppler-link-extractor-private.h" +#include "poppler-annotation-private.h" +#include "poppler-form.h" +#include "poppler-media.h" + +namespace Poppler { + +Link* PageData::convertLinkActionToLink(::LinkAction * a, const QRectF &linkArea) +{ + return convertLinkActionToLink(a, parentDoc, linkArea); +} + +Link* PageData::convertLinkActionToLink(::LinkAction * a, DocumentData *parentDoc, const QRectF &linkArea) +{ + if ( !a ) + return NULL; + + Link * popplerLink = NULL; + switch ( a->getKind() ) + { + case actionGoTo: + { + LinkGoTo * g = (LinkGoTo *) a; + const LinkDestinationData ldd( g->getDest(), g->getNamedDest(), parentDoc, false ); + // create link: no ext file, namedDest, object pointer + popplerLink = new LinkGoto( linkArea, QString::null, LinkDestination( ldd ) ); + } + break; + + case actionGoToR: + { + LinkGoToR * g = (LinkGoToR *) a; + // copy link file + const QString fileName = UnicodeParsedString( g->getFileName() ); + const LinkDestinationData ldd( g->getDest(), g->getNamedDest(), parentDoc, !fileName.isEmpty() ); + // ceate link: fileName, namedDest, object pointer + popplerLink = new LinkGoto( linkArea, fileName, LinkDestination( ldd ) ); + } + break; + + case actionLaunch: + { + LinkLaunch * e = (LinkLaunch *)a; + GooString * p = e->getParams(); + popplerLink = new LinkExecute( linkArea, e->getFileName()->getCString(), p ? p->getCString() : 0 ); + } + break; + + case actionNamed: + { + const char * name = ((LinkNamed *)a)->getName()->getCString(); + if ( !strcmp( name, "NextPage" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::PageNext ); + else if ( !strcmp( name, "PrevPage" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::PagePrev ); + else if ( !strcmp( name, "FirstPage" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::PageFirst ); + else if ( !strcmp( name, "LastPage" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::PageLast ); + else if ( !strcmp( name, "GoBack" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::HistoryBack ); + else if ( !strcmp( name, "GoForward" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::HistoryForward ); + else if ( !strcmp( name, "Quit" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::Quit ); + else if ( !strcmp( name, "GoToPage" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::GoToPage ); + else if ( !strcmp( name, "Find" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::Find ); + else if ( !strcmp( name, "FullScreen" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::Presentation ); + else if ( !strcmp( name, "Print" ) ) + popplerLink = new LinkAction( linkArea, LinkAction::Print ); + else if ( !strcmp( name, "Close" ) ) + { + // acroread closes the document always, doesnt care whether + // its presentation mode or not + // popplerLink = new LinkAction( linkArea, LinkAction::EndPresentation ); + popplerLink = new LinkAction( linkArea, LinkAction::Close ); + } + else + { + // TODO + } + } + break; + + case actionURI: + { + popplerLink = new LinkBrowse( linkArea, ((LinkURI *)a)->getURI()->getCString() ); + } + break; + + case actionSound: + { + ::LinkSound *ls = (::LinkSound *)a; + popplerLink = new LinkSound( linkArea, ls->getVolume(), ls->getSynchronous(), ls->getRepeat(), ls->getMix(), new SoundObject( ls->getSound() ) ); + } + break; + + case actionJavaScript: + { + ::LinkJavaScript *ljs = (::LinkJavaScript *)a; + popplerLink = new LinkJavaScript( linkArea, UnicodeParsedString(ljs->getScript()) ); + } + break; + + case actionMovie: + { + ::LinkMovie *lm = (::LinkMovie *)a; + + const QString title = ( lm->hasAnnotTitle() ? UnicodeParsedString( lm->getAnnotTitle() ) : QString() ); + + Ref reference; + reference.num = reference.gen = -1; + if ( lm->hasAnnotRef() ) + reference = *lm->getAnnotRef(); + + LinkMovie::Operation operation = LinkMovie::Play; + switch ( lm->getOperation() ) + { + case ::LinkMovie::operationTypePlay: + operation = LinkMovie::Play; + break; + case ::LinkMovie::operationTypePause: + operation = LinkMovie::Pause; + break; + case ::LinkMovie::operationTypeResume: + operation = LinkMovie::Resume; + break; + case ::LinkMovie::operationTypeStop: + operation = LinkMovie::Stop; + break; + }; + + popplerLink = new LinkMovie( linkArea, operation, title, reference ); + } + break; + + case actionRendition: + { + ::LinkRendition *lrn = (::LinkRendition *)a; + popplerLink = new LinkRendition( linkArea, lrn->getMedia() ); + } + break; + + case actionUnknown: + break; + } + + return popplerLink; +} + + +Page::Page(DocumentData *doc, int index) { + m_page = new PageData(); + m_page->index = index; + m_page->parentDoc = doc; + m_page->page = doc->doc->getPage(m_page->index + 1); + m_page->transition = 0; +} + +Page::~Page() +{ + delete m_page->transition; + delete m_page; +} + +QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h, Rotation rotate) const +{ + int rotation = (int)rotate * 90; + QImage img; + switch(m_page->parentDoc->m_backend) + { + case Poppler::Document::SplashBackend: + { +#if defined(HAVE_SPLASH) + SplashOutputDev *splash_output = static_cast(m_page->parentDoc->getOutputDev()); + + m_page->parentDoc->doc->displayPageSlice(splash_output, m_page->index + 1, xres, yres, + rotation, false, true, false, x, y, w, h); + + SplashBitmap *bitmap = splash_output->getBitmap(); + int bw = bitmap->getWidth(); + int bh = bitmap->getHeight(); + + SplashColorPtr dataPtr = splash_output->getBitmap()->getDataPtr(); + + if (QSysInfo::BigEndian == QSysInfo::ByteOrder) + { + uchar c; + int count = bw * bh * 4; + for (int k = 0; k < count; k += 4) + { + c = dataPtr[k]; + dataPtr[k] = dataPtr[k+3]; + dataPtr[k+3] = c; + + c = dataPtr[k+1]; + dataPtr[k+1] = dataPtr[k+2]; + dataPtr[k+2] = c; + } + } + + // construct a qimage SHARING the raw bitmap data in memory + QImage tmpimg( dataPtr, bw, bh, QImage::Format_ARGB32 ); + img = tmpimg.copy(); + // unload underlying xpdf bitmap + splash_output->startPage( 0, NULL ); +#endif + break; + } + case Poppler::Document::ArthurBackend: + { + QSize size = pageSize(); + QImage tmpimg(w == -1 ? qRound( size.width() * xres / 72.0 ) : w, h == -1 ? qRound( size.height() * yres / 72.0 ) : h, QImage::Format_ARGB32); + + QPainter painter(&tmpimg); + renderToPainter(&painter, xres, yres, x, y, w, h, rotate, DontSaveAndRestore); + painter.end(); + img = tmpimg; + break; + } + } + + return img; +} + +bool Page::renderToPainter(QPainter* painter, double xres, double yres, int x, int y, int w, int h, Rotation rotate, PainterFlags flags) const +{ + if (!painter) + return false; + + switch(m_page->parentDoc->m_backend) + { + case Poppler::Document::SplashBackend: + return false; + case Poppler::Document::ArthurBackend: + { + const bool savePainter = !(flags & DontSaveAndRestore); + if (savePainter) + painter->save(); + if (m_page->parentDoc->m_hints & Document::Antialiasing) + painter->setRenderHint(QPainter::Antialiasing); + if (m_page->parentDoc->m_hints & Document::TextAntialiasing) + painter->setRenderHint(QPainter::TextAntialiasing); + painter->translate(x == -1 ? 0 : -x, y == -1 ? 0 : -y); + ArthurOutputDev arthur_output(painter); + arthur_output.startDoc(m_page->parentDoc->doc->getXRef()); + m_page->parentDoc->doc->displayPageSlice(&arthur_output, + m_page->index + 1, + xres, + yres, + (int)rotate * 90, + false, + true, + false, + x, + y, + w, + h); + if (savePainter) + painter->restore(); + return true; + } + } + return false; +} + +QImage Page::thumbnail() const +{ + unsigned char* data = 0; + int w = 0; + int h = 0; + int rowstride = 0; + GBool r = m_page->page->loadThumb(&data, &w, &h, &rowstride); + QImage ret; + if (r) + { + // first construct a temporary image with the data got, + // then force a copy of it so we can free the raw thumbnail data + ret = QImage(data, w, h, rowstride, QImage::Format_RGB888).copy(); + gfree(data); + } + return ret; +} + +QString Page::text(const QRectF &r, TextLayout textLayout) const +{ + TextOutputDev *output_dev; + GooString *s; + PDFRectangle *rect; + QString result; + + const GBool rawOrder = textLayout == RawOrderLayout; + output_dev = new TextOutputDev(0, gFalse, 0, rawOrder, gFalse); + m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 72, 72, + 0, false, true, false, -1, -1, -1, -1); + if (r.isNull()) + { + rect = m_page->page->getCropBox(); + s = output_dev->getText(rect->x1, rect->y1, rect->x2, rect->y2); + } + else + { + s = output_dev->getText(r.left(), r.top(), r.right(), r.bottom()); + } + + result = QString::fromUtf8(s->getCString()); + + delete output_dev; + delete s; + return result; +} + +QString Page::text(const QRectF &r) const +{ + return text(r, PhysicalLayout); +} + +bool Page::search(const QString &text, double &sLeft, double &sTop, double &sRight, double &sBottom, SearchDirection direction, SearchMode caseSensitive, Rotation rotate) const +{ + const QChar * str = text.unicode(); + int len = text.length(); + QVector u(len); + for (int i = 0; i < len; ++i) u[i] = str[i].unicode(); + + GBool sCase; + if (caseSensitive == CaseSensitive) sCase = gTrue; + else sCase = gFalse; + + bool found = false; + + int rotation = (int)rotate * 90; + + // fetch ourselves a textpage + TextOutputDev td(NULL, gTrue, 0, gFalse, gFalse); + m_page->parentDoc->doc->displayPage( &td, m_page->index + 1, 72, 72, rotation, false, true, false ); + TextPage *textPage=td.takeText(); + + if (direction == FromTop) + found = textPage->findText( u.data(), len, + gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, &sLeft, &sTop, &sRight, &sBottom ); + else if ( direction == NextResult ) + found = textPage->findText( u.data(), len, + gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft, &sTop, &sRight, &sBottom ); + else if ( direction == PreviousResult ) + found = textPage->findText( u.data(), len, + gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, &sLeft, &sTop, &sRight, &sBottom ); + + textPage->decRefCnt(); + + return found; +} + +bool Page::search(const QString &text, QRectF &rect, SearchDirection direction, SearchMode caseSensitive, Rotation rotate) const +{ + double sLeft, sTop, sRight, sBottom; + sLeft = rect.left(); + sTop = rect.top(); + sRight = rect.right(); + sBottom = rect.bottom(); + + bool found = search(text, sLeft, sTop, sRight, sBottom, direction, caseSensitive, rotate); + + rect.setLeft( sLeft ); + rect.setTop( sTop ); + rect.setRight( sRight ); + rect.setBottom( sBottom ); + + return found; +} + +QList Page::textList(Rotation rotate) const +{ + TextOutputDev *output_dev; + + QList output_list; + + output_dev = new TextOutputDev(0, gFalse, 0, gFalse, gFalse); + + int rotation = (int)rotate * 90; + + m_page->parentDoc->doc->displayPageSlice(output_dev, m_page->index + 1, 72, 72, + rotation, false, false, false, -1, -1, -1, -1); + + TextWordList *word_list = output_dev->makeWordList(); + + if (!word_list) { + delete output_dev; + return output_list; + } + + QHash wordBoxMap; + + for (int i = 0; i < word_list->getLength(); i++) { + TextWord *word = word_list->get(i); + GooString *gooWord = word->getText(); + QString string = QString::fromUtf8(gooWord->getCString()); + delete gooWord; + double xMin, yMin, xMax, yMax; + word->getBBox(&xMin, &yMin, &xMax, &yMax); + + TextBox* text_box = new TextBox(string, QRectF(xMin, yMin, xMax-xMin, yMax-yMin)); + text_box->m_data->hasSpaceAfter = word->hasSpaceAfter() == gTrue; + text_box->m_data->charBBoxes.reserve(word->getLength()); + for (int j = 0; j < word->getLength(); ++j) + { + word->getCharBBox(j, &xMin, &yMin, &xMax, &yMax); + text_box->m_data->charBBoxes.append(QRectF(xMin, yMin, xMax-xMin, yMax-yMin)); + } + + wordBoxMap.insert(word, text_box); + + output_list.append(text_box); + } + + for (int i = 0; i < word_list->getLength(); i++) { + TextWord *word = word_list->get(i); + TextBox* text_box = wordBoxMap.value(word); + text_box->m_data->nextWord = wordBoxMap.value(word->nextWord()); + } + + delete word_list; + delete output_dev; + + return output_list; +} + +PageTransition *Page::transition() const +{ + if (!m_page->transition) { + Object o; + PageTransitionParams params; + params.dictObj = m_page->page->getTrans(&o); + if (params.dictObj->isDict()) m_page->transition = new PageTransition(params); + o.free(); + } + return m_page->transition; +} + +Link *Page::action( PageAction act ) const +{ + if ( act == Page::Opening || act == Page::Closing ) + { + Object o; + m_page->page->getActions(&o); + if (!o.isDict()) + { + o.free(); + return 0; + } + Dict *dict = o.getDict(); + Object o2; + const char *key = act == Page::Opening ? "O" : "C"; + dict->lookup((char*)key, &o2); + ::LinkAction *lact = ::LinkAction::parseAction(&o2, m_page->parentDoc->doc->getCatalog()->getBaseURI() ); + o2.free(); + o.free(); + Link *popplerLink = NULL; + if (lact != NULL) + { + popplerLink = m_page->convertLinkActionToLink(lact, QRectF()); + delete lact; + } + return popplerLink; + } + return 0; +} + +QSizeF Page::pageSizeF() const +{ + Page::Orientation orient = orientation(); + if ( ( Page::Landscape == orient ) || (Page::Seascape == orient ) ) { + return QSizeF( m_page->page->getCropHeight(), m_page->page->getCropWidth() ); + } else { + return QSizeF( m_page->page->getCropWidth(), m_page->page->getCropHeight() ); + } +} + +QSize Page::pageSize() const +{ + return pageSizeF().toSize(); +} + +Page::Orientation Page::orientation() const +{ + const int rotation = m_page->page->getRotate(); + switch (rotation) { + case 90: + return Page::Landscape; + break; + case 180: + return Page::UpsideDown; + break; + case 270: + return Page::Seascape; + break; + default: + return Page::Portrait; + } +} + +void Page::defaultCTM(double *CTM, double dpiX, double dpiY, int rotate, bool upsideDown) +{ + m_page->page->getDefaultCTM(CTM, dpiX, dpiY, rotate, gFalse, upsideDown); +} + +QList Page::links() const +{ + LinkExtractorOutputDev link_dev(m_page); + m_page->parentDoc->doc->processLinks(&link_dev, m_page->index + 1); + QList popplerLinks = link_dev.links(); + + return popplerLinks; +} + +QList Page::annotations() const +{ + return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc); +} + +void Page::addAnnotation( const Annotation *ann ) +{ + AnnotationPrivate::addAnnotationToPage(m_page->page, m_page->parentDoc, ann); +} + +void Page::removeAnnotation( const Annotation *ann ) +{ + AnnotationPrivate::removeAnnotationFromPage(m_page->page, ann); +} + +QList Page::formFields() const +{ + QList fields; + ::Page *p = m_page->page; + ::FormPageWidgets * form = p->getFormWidgets(); + int formcount = form->getNumWidgets(); + for (int i = 0; i < formcount; ++i) + { + ::FormWidget *fm = form->getWidget(i); + FormField * ff = NULL; + switch (fm->getType()) + { + case formButton: + { + ff = new FormFieldButton(m_page->parentDoc, p, static_cast(fm)); + } + break; + + case formText: + { + ff = new FormFieldText(m_page->parentDoc, p, static_cast(fm)); + } + break; + + case formChoice: + { + ff = new FormFieldChoice(m_page->parentDoc, p, static_cast(fm)); + } + break; + + default: ; + } + + if (ff) + fields.append(ff); + } + + delete form; + + return fields; +} + +double Page::duration() const +{ + return m_page->page->getDuration(); +} + +QString Page::label() const +{ + GooString goo; + if (!m_page->parentDoc->doc->getCatalog()->indexToLabel(m_page->index, &goo)) + return QString(); + + return UnicodeParsedString(&goo); +} + + +} diff --git a/qt4/src/poppler-pdf-converter.cc b/qt4/src/poppler-pdf-converter.cc new file mode 100644 index 0000000..9699b75 --- /dev/null +++ b/qt4/src/poppler-pdf-converter.cc @@ -0,0 +1,115 @@ +/* poppler-pdf-converter.cc: qt4 interface to poppler + * Copyright (C) 2008, Pino Toscano + * Copyright (C) 2008, 2009, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include "poppler-private.h" +#include "poppler-converter-private.h" +#include "poppler-qiodeviceoutstream-private.h" + +#include + +#include + +namespace Poppler { + +class PDFConverterPrivate : public BaseConverterPrivate +{ + public: + PDFConverterPrivate(); + + PDFConverter::PDFOptions opts; +}; + +PDFConverterPrivate::PDFConverterPrivate() + : BaseConverterPrivate(), opts(0) +{ +} + + +PDFConverter::PDFConverter(DocumentData *document) + : BaseConverter(*new PDFConverterPrivate()) +{ + Q_D(PDFConverter); + d->document = document; +} + +PDFConverter::~PDFConverter() +{ +} + +void PDFConverter::setPDFOptions(PDFConverter::PDFOptions options) +{ + Q_D(PDFConverter); + d->opts = options; +} + +PDFConverter::PDFOptions PDFConverter::pdfOptions() const +{ + Q_D(const PDFConverter); + return d->opts; +} + +bool PDFConverter::convert() +{ + Q_D(PDFConverter); + d->lastError = NoError; + + if (d->document->locked) + { + d->lastError = FileLockedError; + return false; + } + + QIODevice *dev = d->openDevice(); + if (!dev) + { + d->lastError = OpenOutputError; + return false; + } + + bool deleteFile = false; + if (QFile *file = qobject_cast(dev)) + deleteFile = !file->exists(); + + int errorCode = errNone; + QIODeviceOutStream stream(dev); + if (d->opts & WithChanges) + { + errorCode = d->document->doc->saveAs(&stream); + } + else + { + errorCode = d->document->doc->saveWithoutChangesAs(&stream); + } + d->closeDevice(); + if (errorCode != errNone) + { + if (deleteFile) + { + qobject_cast(dev)->remove(); + } + if (errorCode == errOpenFile) d->lastError = OpenOutputError; + else d->lastError = NotSupportedInputFileError; + } + + return (errorCode == errNone); +} + +} diff --git a/qt4/src/poppler-private.cc b/qt4/src/poppler-private.cc new file mode 100644 index 0000000..ffb5b92 --- /dev/null +++ b/qt4/src/poppler-private.cc @@ -0,0 +1,292 @@ +/* poppler-private.cc: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2006, 2011 by Albert Astals Cid + * Copyright (C) 2008, 2010, 2011 by Pino Toscano + * Inspired on code by + * Copyright (C) 2004 by Albert Astals Cid + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-private.h" + +#include +#include +#include + +#include +#include +#include + +namespace Poppler { + +namespace Debug { + + void qDebugDebugFunction(const QString &message, const QVariant & /*closure*/) + { + qDebug() << message; + } + + PopplerDebugFunc debugFunction = qDebugDebugFunction; + QVariant debugClosure; + +} + + static UnicodeMap *utf8Map = 0; + + void setDebugErrorFunction(PopplerDebugFunc function, const QVariant &closure) + { + Debug::debugFunction = function ? function : Debug::qDebugDebugFunction; + Debug::debugClosure = closure; + } + + void qt4ErrorFunction(void * /*data*/, ErrorCategory /*category*/, int pos, char *msg) + { + QString emsg; + + if (pos >= 0) + { + emsg = QString::fromLatin1("Error (%1): ").arg(pos); + } + else + { + emsg = QString::fromLatin1("Error: "); + } + emsg += QString::fromAscii(msg); + (*Debug::debugFunction)(emsg, Debug::debugClosure); + } + + QString unicodeToQString(Unicode* u, int len) { + if (!utf8Map) + { + GooString enc("UTF-8"); + utf8Map = globalParams->getUnicodeMap(&enc); + utf8Map->incRefCnt(); + } + + // ignore the last character if it is 0x0 + if ((len > 0) && (u[len - 1] == 0)) + { + --len; + } + + GooString convertedStr; + for (int i = 0; i < len; ++i) + { + char buf[8]; + const int n = utf8Map->mapUnicode(u[i], buf, sizeof(buf)); + convertedStr.append(buf, n); + } + + return QString::fromUtf8(convertedStr.getCString(), convertedStr.getLength()); + } + + QString UnicodeParsedString(GooString *s1) { + if ( !s1 || s1->getLength() == 0 ) + return QString(); + + GBool isUnicode; + int i; + Unicode u; + QString result; + if ( ( s1->getChar(0) & 0xff ) == 0xfe && ( s1->getLength() > 1 && ( s1->getChar(1) & 0xff ) == 0xff ) ) + { + isUnicode = gTrue; + i = 2; + result.reserve( ( s1->getLength() - 2 ) / 2 ); + } + else + { + isUnicode = gFalse; + i = 0; + result.reserve( s1->getLength() ); + } + while ( i < s1->getLength() ) + { + if ( isUnicode ) + { + u = ( ( s1->getChar(i) & 0xff ) << 8 ) | ( s1->getChar(i+1) & 0xff ); + i += 2; + } + else + { + u = s1->getChar(i) & 0xff; + ++i; + } + result += QChar( u ); + } + return result; + } + + GooString *QStringToUnicodeGooString(const QString &s) { + int len = s.length() * 2 + 2; + char *cstring = (char *)gmallocn(len, sizeof(char)); + cstring[0] = 0xfe; + cstring[1] = 0xff; + for (int i = 0; i < s.length(); ++i) + { + cstring[2+i*2] = s.at(i).row(); + cstring[3+i*2] = s.at(i).cell(); + } + GooString *ret = new GooString(cstring, len); + gfree(cstring); + return ret; + } + + GooString *QStringToGooString(const QString &s) { + int len = s.length(); + char *cstring = (char *)gmallocn(s.length(), sizeof(char)); + for (int i = 0; i < len; ++i) + cstring[i] = s.at(i).unicode(); + GooString *ret = new GooString(cstring, len); + gfree(cstring); + return ret; + } + + void linkActionToTocItem( ::LinkAction * a, DocumentData * doc, QDomElement * e ) + { + if ( !a || !e ) + return; + + switch ( a->getKind() ) + { + case actionGoTo: + { + // page number is contained/referenced in a LinkGoTo + LinkGoTo * g = static_cast< LinkGoTo * >( a ); + LinkDest * destination = g->getDest(); + if ( !destination && g->getNamedDest() ) + { + // no 'destination' but an internal 'named reference'. we could + // get the destination for the page now, but it's VERY time consuming, + // so better storing the reference and provide the viewport on demand + GooString *s = g->getNamedDest(); + QChar *charArray = new QChar[s->getLength()]; + for (int i = 0; i < s->getLength(); ++i) charArray[i] = QChar(s->getCString()[i]); + QString aux(charArray, s->getLength()); + e->setAttribute( "DestinationName", aux ); + delete[] charArray; + } + else if ( destination && destination->isOk() ) + { + LinkDestinationData ldd(destination, NULL, doc, false); + e->setAttribute( "Destination", LinkDestination(ldd).toString() ); + } + break; + } + case actionGoToR: + { + // page number is contained/referenced in a LinkGoToR + LinkGoToR * g = static_cast< LinkGoToR * >( a ); + LinkDest * destination = g->getDest(); + if ( !destination && g->getNamedDest() ) + { + // no 'destination' but an internal 'named reference'. we could + // get the destination for the page now, but it's VERY time consuming, + // so better storing the reference and provide the viewport on demand + GooString *s = g->getNamedDest(); + QChar *charArray = new QChar[s->getLength()]; + for (int i = 0; i < s->getLength(); ++i) charArray[i] = QChar(s->getCString()[i]); + QString aux(charArray, s->getLength()); + e->setAttribute( "DestinationName", aux ); + delete[] charArray; + } + else if ( destination && destination->isOk() ) + { + LinkDestinationData ldd(destination, NULL, doc, g->getFileName() != 0); + e->setAttribute( "Destination", LinkDestination(ldd).toString() ); + } + e->setAttribute( "ExternalFileName", g->getFileName()->getCString() ); + break; + } + case actionURI: + { + LinkURI * u = static_cast< LinkURI * >( a ); + e->setAttribute( "DestinationURI", u->getURI()->getCString() ); + } + default: ; + } + } + + DocumentData::~DocumentData() + { + qDeleteAll(m_embeddedFiles); + delete (OptContentModel *)m_optContentModel; + delete doc; + delete m_outputDev; + delete m_fontInfoIterator; + + count --; + if ( count == 0 ) + { + utf8Map = 0; + delete globalParams; + } + } + + void DocumentData::init() + { + m_fontInfoIterator = 0; + m_backend = Document::SplashBackend; + m_outputDev = 0; + paperColor = Qt::white; + m_hints = 0; + m_optContentModel = 0; + + if ( count == 0 ) + { + utf8Map = 0; + globalParams = new GlobalParams(); + setErrorCallback(qt4ErrorFunction, NULL); + } + count ++; + } + + + void DocumentData::addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items ) + { + int numItems = items->getLength(); + for ( int i = 0; i < numItems; ++i ) + { + // iterate over every object in 'items' + OutlineItem * outlineItem = (OutlineItem *)items->get( i ); + + // 1. create element using outlineItem's title as tagName + QString name; + Unicode * uniChar = outlineItem->getTitle(); + int titleLength = outlineItem->getTitleLength(); + name = unicodeToQString(uniChar, titleLength); + if ( name.isEmpty() ) + continue; + + QDomElement item = docSyn->createElement( name ); + parent->appendChild( item ); + + // 2. find the page the link refers to + ::LinkAction * a = outlineItem->getAction(); + linkActionToTocItem( a, this, &item ); + + item.setAttribute( "Open", QVariant( (bool)outlineItem->isOpen() ).toString() ); + + // 3. recursively descend over children + outlineItem->open(); + GooList * children = outlineItem->getKids(); + if ( children ) + addTocChildren( docSyn, &item, children ); + } + } + +} diff --git a/qt4/src/poppler-private.h b/qt4/src/poppler-private.h new file mode 100644 index 0000000..6d2ef2a --- /dev/null +++ b/qt4/src/poppler-private.h @@ -0,0 +1,290 @@ +/* poppler-private.h: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, 2008, Brad Hards + * Copyright (C) 2006-2009, 2011 by Albert Astals Cid + * Copyright (C) 2007-2009, 2011 by Pino Toscano + * Copyright (C) 2011 Andreas Hartmetz + * Copyright (C) 2011 Hib Eris + * Inspired on code by + * Copyright (C) 2004 by Albert Astals Cid + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_PRIVATE_H_ +#define _POPPLER_PRIVATE_H_ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#if defined(HAVE_SPLASH) +#include +#endif + +#include "poppler-qt4.h" +#include "poppler-embeddedfile-private.h" + +class LinkDest; +class FormWidget; + +namespace Poppler { + + /* borrowed from kpdf */ + QString unicodeToQString(Unicode* u, int len); + + QString UnicodeParsedString(GooString *s1); + + GooString *QStringToUnicodeGooString(const QString &s); + + GooString *QStringToGooString(const QString &s); + + void qt4ErrorFunction(int pos, char *msg, va_list args); + + class LinkDestinationData + { + public: + LinkDestinationData( LinkDest *l, GooString *nd, Poppler::DocumentData *pdfdoc, bool external ) + : ld(l), namedDest(nd), doc(pdfdoc), externalDest(external) + { + } + + LinkDest *ld; + GooString *namedDest; + Poppler::DocumentData *doc; + bool externalDest; + }; + + class DocumentData { + public: + DocumentData(const QString &filePath, GooString *ownerPassword, GooString *userPassword) + { + init(); + m_filePath = filePath; + +#if defined(_WIN32) + wchar_t *fileName = new WCHAR[filePath.length()]; + int length = filePath.toWCharArray(fileName); + doc = new PDFDoc(fileName, length, ownerPassword, userPassword); + delete fileName; +#else + GooString *fileName = new GooString(QFile::encodeName(filePath)); + doc = new PDFDoc(fileName, ownerPassword, userPassword); +#endif + + delete ownerPassword; + delete userPassword; + } + + DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword) + { + Object obj; + fileContents = data; + obj.initNull(); + MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), &obj); + init(); + doc = new PDFDoc(str, ownerPassword, userPassword); + delete ownerPassword; + delete userPassword; + } + + void init(); + + ~DocumentData(); + + OutputDev *getOutputDev() + { + if (!m_outputDev) + { + switch (m_backend) + { + case Document::ArthurBackend: + // create a splash backend even in case of the Arthur Backend + case Document::SplashBackend: + { +#if defined(HAVE_SPLASH) + SplashColor bgColor; + bgColor[0] = paperColor.blue(); + bgColor[1] = paperColor.green(); + bgColor[2] = paperColor.red(); + GBool AA = m_hints & Document::TextAntialiasing ? gTrue : gFalse; + SplashOutputDev * splashOutputDev = new SplashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, AA); + splashOutputDev->setVectorAntialias(m_hints & Document::Antialiasing ? gTrue : gFalse); + splashOutputDev->setFreeTypeHinting(m_hints & Document::TextHinting ? gTrue : gFalse, m_hints & Document::TextSlightHinting ? gTrue : gFalse); + splashOutputDev->startDoc(doc); + m_outputDev = splashOutputDev; +#endif + break; + } + } + } + return m_outputDev; + } + + void addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items ); + + void setPaperColor(const QColor &color) + { + if (color == paperColor) + return; + + paperColor = color; + if ( m_outputDev == NULL ) + return; + + switch ( m_backend ) + { + case Document::SplashBackend: + { +#if defined(HAVE_SPLASH) + SplashOutputDev *splash_output = static_cast( m_outputDev ); + SplashColor bgColor; + bgColor[0] = paperColor.blue(); + bgColor[1] = paperColor.green(); + bgColor[2] = paperColor.red(); + splash_output->setPaperColor(bgColor); +#endif + break; + } + default: ; + } + } + + void fillMembers() + { + m_fontInfoIterator = new FontIterator(0, this); + int numEmb = doc->getCatalog()->numEmbeddedFiles(); + if (!(0 == numEmb)) { + // we have some embedded documents, build the list + for (int yalv = 0; yalv < numEmb; ++yalv) { + FileSpec *fs = doc->getCatalog()->embeddedFile(yalv); + m_embeddedFiles.append(new EmbeddedFile(*new EmbeddedFileData(fs))); + } + } + } + + static Document *checkDocument(DocumentData *doc); + + PDFDoc *doc; + QString m_filePath; + QByteArray fileContents; + bool locked; + FontIterator *m_fontInfoIterator; + Document::RenderBackend m_backend; + OutputDev *m_outputDev; + QList m_embeddedFiles; + QPointer m_optContentModel; + QColor paperColor; + int m_hints; + static int count; + }; + + class FontInfoData + { + public: + FontInfoData() + { + isEmbedded = false; + isSubset = false; + type = FontInfo::unknown; + } + + FontInfoData( const FontInfoData &fid ) + { + fontName = fid.fontName; + fontFile = fid.fontFile; + isEmbedded = fid.isEmbedded; + isSubset = fid.isSubset; + type = fid.type; + embRef = fid.embRef; + } + + FontInfoData( ::FontInfo* fi ) + { + if (fi->getName()) fontName = fi->getName()->getCString(); + if (fi->getFile()) fontFile = fi->getFile()->getCString(); + isEmbedded = fi->getEmbedded(); + isSubset = fi->getSubset(); + type = (Poppler::FontInfo::Type)fi->getType(); + embRef = fi->getEmbRef(); + } + + QString fontName; + QString fontFile; + bool isEmbedded : 1; + bool isSubset : 1; + FontInfo::Type type; + Ref embRef; + }; + + class FontIteratorData + { + public: + FontIteratorData( int startPage, DocumentData *dd ) + : fontInfoScanner( dd->doc, startPage ) + , totalPages( dd->doc->getNumPages() ) + , currentPage( qMax( startPage, 0 ) - 1 ) + { + } + + ~FontIteratorData() + { + } + + FontInfoScanner fontInfoScanner; + int totalPages; + int currentPage; + }; + + class TextBoxData + { + public: + TextBoxData() + : nextWord(0), hasSpaceAfter(false) + { + } + + QString text; + QRectF bBox; + TextBox *nextWord; + QVector charBBoxes; // the boundingRect of each character + bool hasSpaceAfter; + }; + + class FormFieldData + { + public: + FormFieldData(DocumentData *_doc, ::Page *p, ::FormWidget *w) : + doc(_doc), page(p), fm(w) + { + } + + DocumentData *doc; + ::Page *page; + ::FormWidget *fm; + QRectF box; + }; + +} + +#endif diff --git a/qt4/src/poppler-ps-converter.cc b/qt4/src/poppler-ps-converter.cc new file mode 100644 index 0000000..63fb7b4 --- /dev/null +++ b/qt4/src/poppler-ps-converter.cc @@ -0,0 +1,272 @@ +/* poppler-ps-converter.cc: qt interface to poppler + * Copyright (C) 2007, 2009, 2010, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * Copyright (C) 2010 Hib Eris + * Copyright (C) 2011 Glad Deschrijver + * Copyright (C) 2012 Fabio D'Urso + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include "poppler-private.h" +#include "poppler-converter-private.h" + +#include "PSOutputDev.h" + +static void outputToQIODevice(void *stream, const char *data, int len) +{ + static_cast(stream)->write(data, len); +} + +namespace Poppler { + +class PSConverterPrivate : public BaseConverterPrivate +{ + public: + PSConverterPrivate(); + + QList pageList; + QString title; + double hDPI; + double vDPI; + int rotate; + int paperWidth; + int paperHeight; + int marginRight; + int marginBottom; + int marginLeft; + int marginTop; + PSConverter::PSOptions opts; + void (* pageConvertedCallback)(int page, void *payload); + void *pageConvertedPayload; +}; + +PSConverterPrivate::PSConverterPrivate() + : BaseConverterPrivate(), + hDPI(72), vDPI(72), rotate(0), paperWidth(-1), paperHeight(-1), + marginRight(0), marginBottom(0), marginLeft(0), marginTop(0), + opts(PSConverter::Printing), pageConvertedCallback(0), + pageConvertedPayload(0) +{ +} + + +PSConverter::PSConverter(DocumentData *document) + : BaseConverter(*new PSConverterPrivate()) +{ + Q_D(PSConverter); + d->document = document; +} + +PSConverter::~PSConverter() +{ +} + +void PSConverter::setPageList(const QList &pageList) +{ + Q_D(PSConverter); + d->pageList = pageList; +} + +void PSConverter::setTitle(const QString &title) +{ + Q_D(PSConverter); + d->title = title; +} + +void PSConverter::setHDPI(double hDPI) +{ + Q_D(PSConverter); + d->hDPI = hDPI; +} + +void PSConverter::setVDPI(double vDPI) +{ + Q_D(PSConverter); + d->vDPI = vDPI; +} + +void PSConverter::setRotate(int rotate) +{ + Q_D(PSConverter); + d->rotate = rotate; +} + +void PSConverter::setPaperWidth(int paperWidth) +{ + Q_D(PSConverter); + d->paperWidth = paperWidth; +} + +void PSConverter::setPaperHeight(int paperHeight) +{ + Q_D(PSConverter); + d->paperHeight = paperHeight; +} + +void PSConverter::setRightMargin(int marginRight) +{ + Q_D(PSConverter); + d->marginRight = marginRight; +} + +void PSConverter::setBottomMargin(int marginBottom) +{ + Q_D(PSConverter); + d->marginBottom = marginBottom; +} + +void PSConverter::setLeftMargin(int marginLeft) +{ + Q_D(PSConverter); + d->marginLeft = marginLeft; +} + +void PSConverter::setTopMargin(int marginTop) +{ + Q_D(PSConverter); + d->marginTop = marginTop; +} + +void PSConverter::setStrictMargins(bool strictMargins) +{ + Q_D(PSConverter); + if (strictMargins) + d->opts |= StrictMargins; + else + d->opts &= ~StrictMargins; +} + +void PSConverter::setForceRasterize(bool forceRasterize) +{ + Q_D(PSConverter); + if (forceRasterize) + d->opts |= ForceRasterization; + else + d->opts &= ~ForceRasterization; +} + +void PSConverter::setPSOptions(PSConverter::PSOptions options) +{ + Q_D(PSConverter); + d->opts = options; +} + +PSConverter::PSOptions PSConverter::psOptions() const +{ + Q_D(const PSConverter); + return d->opts; +} + +void PSConverter::setPageConvertedCallback(void (* callback)(int page, void *payload), void *payload) +{ + Q_D(PSConverter); + d->pageConvertedCallback = callback; + d->pageConvertedPayload = payload; +} + +static GBool annotDisplayDecideCbk(Annot *annot, void *user_data) +{ + if (annot->getType() == Annot::typeWidget) + return gTrue; // Never hide forms + else + return *(GBool*)user_data; +} + +bool PSConverter::convert() +{ + Q_D(PSConverter); + d->lastError = NoError; + + Q_ASSERT(!d->pageList.isEmpty()); + Q_ASSERT(d->paperWidth != -1); + Q_ASSERT(d->paperHeight != -1); + + if (d->document->locked) + { + d->lastError = FileLockedError; + return false; + } + + QIODevice *dev = d->openDevice(); + if (!dev) + { + d->lastError = OpenOutputError; + return false; + } + + QByteArray pstitle8Bit = d->title.toLocal8Bit(); + char* pstitlechar; + if (!d->title.isEmpty()) pstitlechar = pstitle8Bit.data(); + else pstitlechar = 0; + + PSOutputDev *psOut = new PSOutputDev(outputToQIODevice, dev, + pstitlechar, + d->document->doc, + 1, + d->document->doc->getNumPages(), + (d->opts & PrintToEPS) ? psModeEPS : psModePS, + d->paperWidth, + d->paperHeight, + gFalse, + d->marginLeft, + d->marginBottom, + d->paperWidth - d->marginRight, + d->paperHeight - d->marginTop, + (d->opts & ForceRasterization)); + + if (d->opts & StrictMargins) + { + double xScale = ((double)d->paperWidth - (double)d->marginLeft - (double)d->marginRight) / (double)d->paperWidth; + double yScale = ((double)d->paperHeight - (double)d->marginBottom - (double)d->marginTop) / (double)d->paperHeight; + psOut->setScale(xScale, yScale); + } + + if (psOut->isOk()) + { + GBool isPrinting = (d->opts & Printing) ? gTrue : gFalse; + GBool showAnnotations = (d->opts & HideAnnotations) ? gFalse : gTrue; + foreach(int page, d->pageList) + { + d->document->doc->displayPage(psOut, + page, + d->hDPI, + d->vDPI, + d->rotate, + gFalse, + gTrue, + isPrinting, + NULL, + NULL, + annotDisplayDecideCbk, + &showAnnotations); + if (d->pageConvertedCallback) + (*d->pageConvertedCallback)(page, d->pageConvertedPayload); + } + delete psOut; + d->closeDevice(); + return true; + } + else + { + delete psOut; + d->closeDevice(); + return false; + } +} + +} diff --git a/qt4/src/poppler-qiodeviceoutstream-private.h b/qt4/src/poppler-qiodeviceoutstream-private.h new file mode 100644 index 0000000..e7faa29 --- /dev/null +++ b/qt4/src/poppler-qiodeviceoutstream-private.h @@ -0,0 +1,46 @@ +/* poppler-qiodevicestream-private.h: Qt4 interface to poppler + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_QIODEVICESTREAM_PRIVATE_H +#define POPPLER_QIODEVICESTREAM_PRIVATE_H + +#include "Object.h" +#include "Stream.h" + +class QIODevice; + +namespace Poppler { + +class QIODeviceOutStream : public OutStream +{ + public: + QIODeviceOutStream(QIODevice* device); + virtual ~QIODeviceOutStream(); + + virtual void close(); + virtual int getPos(); + virtual void put(char c); + virtual void printf(const char *format, ...); + + private: + QIODevice *m_device; +}; + +} + +#endif diff --git a/qt4/src/poppler-qiodeviceoutstream.cc b/qt4/src/poppler-qiodeviceoutstream.cc new file mode 100644 index 0000000..b0054af --- /dev/null +++ b/qt4/src/poppler-qiodeviceoutstream.cc @@ -0,0 +1,63 @@ +/* poppler-qiodevicestream.cc: Qt4 interface to poppler + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qiodeviceoutstream-private.h" + +#include + +#include + +#define QIODeviceOutStreamBufSize 8192 + +namespace Poppler { + +QIODeviceOutStream::QIODeviceOutStream(QIODevice* device) + : m_device(device) +{ +} + +QIODeviceOutStream::~QIODeviceOutStream() +{ +} + +void QIODeviceOutStream::close() +{ +} + +int QIODeviceOutStream::getPos() +{ + return (int)m_device->pos(); +} + +void QIODeviceOutStream::put(char c) +{ + m_device->putChar(c); +} + +void QIODeviceOutStream::printf(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + char buf[QIODeviceOutStreamBufSize]; + size_t bufsize = 0; + bufsize = qvsnprintf(buf, QIODeviceOutStreamBufSize - 1, format, ap); + va_end(ap); + m_device->write(buf, bufsize); +} + +} diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h new file mode 100644 index 0000000..f314108 --- /dev/null +++ b/qt4/src/poppler-qt4.h @@ -0,0 +1,1753 @@ +/* poppler-qt.h: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, 2007, Brad Hards + * Copyright (C) 2005-2012, Albert Astals Cid + * Copyright (C) 2005, Stefan Kebekus + * Copyright (C) 2006-2011, Pino Toscano + * Copyright (C) 2009 Shawn Rutledge + * Copyright (C) 2010 Suzuki Toshiya + * Copyright (C) 2010 Matthias Fauconneau + * Copyright (C) 2011 Andreas Hartmetz + * Copyright (C) 2011 Glad Deschrijver + * Copyright (C) 2012, Guillermo A. Amaral B. + * Copyright (C) 2012, Fabio D'Urso + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_QT_H__ +#define __POPPLER_QT_H__ + +#include "poppler-annotation.h" +#include "poppler-link.h" +#include "poppler-optcontent.h" +#include "poppler-page-transition.h" + +#include +#include +#include +#include +#include "poppler-export.h" + +class EmbFile; +class Sound; +class AnnotMovie; + +/** + The %Poppler Qt4 binding. +*/ +namespace Poppler { + + class Document; + class DocumentData; + + class PageData; + + class FormField; + + class TextBoxData; + + class PDFConverter; + class PSConverter; + + /** + Debug/error function. + + This function type is used for debugging & error output; + the first parameter is the actual message, the second is the unaltered + closure argument which was passed to the setDebugErrorFunction call. + + \since 0.16 + */ + typedef void (*PopplerDebugFunc)(const QString & /*message*/, const QVariant & /*closure*/); + + /** + Set a new debug/error output function. + + If not set, by default error and debug messages will be sent to the + Qt \p qDebug() function. + + \param debugFunction the new debug function + \param closure user data which will be passes as-is to the debug function + + \since 0.16 + */ + POPPLER_QT4_EXPORT void setDebugErrorFunction(PopplerDebugFunc debugFunction, const QVariant &closure); + + /** + Describes the physical location of text on a document page + + This very simple class describes the physical location of text + on the page. It consists of + - a QString that contains the text + - a QRectF that gives a box that describes where on the page + the text is found. + */ + class POPPLER_QT4_EXPORT TextBox { + friend class Page; + public: + /** + The default constructor sets the \p text and the rectangle that + contains the text. Coordinated for the \p bBox are in points = + 1/72 of an inch. + */ + TextBox(const QString& text, const QRectF &bBox); + /** + Destructor. + */ + ~TextBox(); + + /** + Returns the text of this text box + */ + QString text() const; + + /** + Returns the position of the text, in point, i.e., 1/72 of + an inch + + \since 0.8 + */ + QRectF boundingBox() const; + + /** + Returns the pointer to the next text box, if there is one. + + Otherwise, it returns a null pointer. + */ + TextBox *nextWord() const; + + /** + Returns the bounding box of the \p i -th characted of the word. + */ + QRectF charBoundingBox(int i) const; + + /** + Returns whether there is a space character after this text box + */ + bool hasSpaceAfter() const; + + private: + Q_DISABLE_COPY(TextBox) + + TextBoxData *m_data; + }; + + + class FontInfoData; + /** + Container class for information about a font within a PDF + document + */ + class POPPLER_QT4_EXPORT FontInfo { + friend class Document; + public: + /** + The type of font. + */ + enum Type { + unknown, + Type1, + Type1C, + Type1COT, + Type3, + TrueType, + TrueTypeOT, + CIDType0, + CIDType0C, + CIDType0COT, + CIDTrueType, + CIDTrueTypeOT + }; + + /// \cond PRIVATE + /** + Create a new font information container. + */ + FontInfo(); + + /** + Create a new font information container. + */ + FontInfo( const FontInfoData &fid ); + /// \endcond + + /** + Copy constructor. + */ + FontInfo( const FontInfo &fi ); + + /** + Destructor. + */ + ~FontInfo(); + + /** + The name of the font. Can be QString::null if the font has no name + */ + QString name() const; + + /** + The path of the font file used to represent this font on this system, + or a null string is the font is embedded + */ + QString file() const; + + /** + Whether the font is embedded in the file, or not + + \return true if the font is embedded + */ + bool isEmbedded() const; + + /** + Whether the font provided is only a subset of the full + font or not. This only has meaning if the font is embedded. + + \return true if the font is only a subset + */ + bool isSubset() const; + + /** + The type of font encoding + + \return a enumerated value corresponding to the font encoding used + + \sa typeName for a string equivalent + */ + Type type() const; + + /** + The name of the font encoding used + + \note if you are looking for the name of the font (as opposed to the + encoding format used), you probably want name(). + + \sa type for a enumeration version + */ + QString typeName() const; + + /** + Standard assignment operator + */ + FontInfo& operator=( const FontInfo &fi ); + + private: + FontInfoData *m_data; + }; + + + class FontIteratorData; + /** + Iterator for reading the fonts in a document. + + FontIterator provides a Java-style iterator for reading the fonts in a + document. + + You can use it in the following way: + \code +Poppler::FontIterator* it = doc->newFontIterator(); +while (it->hasNext()) { + QList fonts = it->next(); + // do something with the fonts +} +// after doing the job, the iterator must be freed +delete it; + \endcode + + \since 0.12 + */ + class POPPLER_QT4_EXPORT FontIterator { + friend class Document; + friend class DocumentData; + public: + /** + Destructor. + */ + ~FontIterator(); + + /** + Returns the fonts of the current page and then advances the iterator + to the next page. + */ + QList next(); + + /** + Checks whether there is at least one more page to iterate, ie returns + false when the iterator is beyond the last page. + */ + bool hasNext() const; + + /** + Returns the current page where the iterator is. + */ + int currentPage() const; + + private: + Q_DISABLE_COPY( FontIterator ) + FontIterator( int, DocumentData *dd ); + + FontIteratorData *d; + }; + + + class EmbeddedFileData; + /** + Container class for an embedded file with a PDF document + */ + class POPPLER_QT4_EXPORT EmbeddedFile { + friend class DocumentData; + friend class AnnotationPrivate; + public: + /// \cond PRIVATE + EmbeddedFile(EmbFile *embfile); + /// \endcond + + /** + Destructor. + */ + ~EmbeddedFile(); + + /** + The name associated with the file + */ + QString name() const; + + /** + The description associated with the file, if any. + + This will return an empty QString if there is no description element + */ + QString description() const; + + /** + The size of the file. + + This will return < 0 if there is no size element + */ + int size() const; + + /** + The modification date for the embedded file, if known. + */ + QDateTime modDate() const; + + /** + The creation date for the embedded file, if known. + */ + QDateTime createDate() const; + + /** + The MD5 checksum of the file. + + This will return an empty QByteArray if there is no checksum element. + */ + QByteArray checksum() const; + + /** + The MIME type of the file, if known. + + \since 0.8 + */ + QString mimeType() const; + + /** + The data as a byte array + */ + QByteArray data(); + + /** + Is the embedded file valid? + + \since 0.12 + */ + bool isValid() const; + + /** + A QDataStream for the actual data? + */ + //QDataStream dataStream() const; + + private: + Q_DISABLE_COPY(EmbeddedFile) + EmbeddedFile(EmbeddedFileData &dd); + + EmbeddedFileData *m_embeddedFile; + }; + + + /** + \brief A page in a document. + + The Page class represents a single page within a PDF document. + + You cannot construct a Page directly, but you have to use the Document + functions that return a new Page out of an index or a label. + */ + class POPPLER_QT4_EXPORT Page { + friend class Document; + public: + /** + Destructor. + */ + ~Page(); + + /** + The type of rotation to apply for an operation + */ + enum Rotation { Rotate0 = 0, ///< Do not rotate + Rotate90 = 1, ///< Rotate 90 degrees clockwise + Rotate180 = 2, ///< Rotate 180 degrees + Rotate270 = 3 ///< Rotate 270 degrees clockwise (90 degrees counterclockwise) + }; + + /** + The kinds of page actions + */ + enum PageAction { + Opening, ///< The action when a page is "opened" + Closing ///< The action when a page is "closed" + }; + + /** + How the text is going to be returned + \since 0.16 + */ + enum TextLayout { + PhysicalLayout, ///< The text is layouted to resemble the real page layout + RawOrderLayout ///< The text is returned without any type of processing + }; + + /** + Additional flags for the renderToPainter method + \since 0.16 + */ + enum PainterFlag { + /** + Do not save/restore the caller-owned painter. + + renderToPainter() by default preserves, using save() + restore(), + the state of the painter specified; if this is not needed, this + flag can avoid this job + */ + DontSaveAndRestore = 0x00000001 + }; + Q_DECLARE_FLAGS( PainterFlags, PainterFlag ) + + /** + Render the page to a QImage using the current + \link Document::renderBackend() Document renderer\endlink. + + If \p x = \p y = \p w = \p h = -1, the method will automatically + compute the size of the image from the horizontal and vertical + resolutions specified in \p xres and \p yres. Otherwise, the + method renders only a part of the page, specified by the + parameters (\p x, \p y, \p w, \p h) in pixel coordinates. The returned + QImage then has size (\p w, \p h), independent of the page + size. + + \param x specifies the left x-coordinate of the box, in + pixels. + + \param y specifies the top y-coordinate of the box, in + pixels. + + \param w specifies the width of the box, in pixels. + + \param h specifies the height of the box, in pixels. + + \param xres horizontal resolution of the graphics device, + in dots per inch + + \param yres vertical resolution of the graphics device, in + dots per inch + + \param rotate how to rotate the page + + \warning The parameter (\p x, \p y, \p w, \p h) are not + well-tested. Unusual or meaningless parameters may lead to + rather unexpected results. + + \returns a QImage of the page, or a null image on failure. + + \since 0.6 + */ + QImage renderToImage(double xres=72.0, double yres=72.0, int x=-1, int y=-1, int w=-1, int h=-1, Rotation rotate = Rotate0) const; + + /** + Render the page to the specified QPainter using the current + \link Document::renderBackend() Document renderer\endlink. + + If \p x = \p y = \p w = \p h = -1, the method will automatically + compute the size of the page area from the horizontal and vertical + resolutions specified in \p xres and \p yres. Otherwise, the + method renders only a part of the page, specified by the + parameters (\p x, \p y, \p w, \p h) in pixel coordinates. + + \param painter the painter to paint on + + \param x specifies the left x-coordinate of the box, in + pixels. + + \param y specifies the top y-coordinate of the box, in + pixels. + + \param w specifies the width of the box, in pixels. + + \param h specifies the height of the box, in pixels. + + \param xres horizontal resolution of the graphics device, + in dots per inch + + \param yres vertical resolution of the graphics device, in + dots per inch + + \param rotate how to rotate the page + + \param flags additional painter flags + + \warning The parameter (\p x, \p y, \p w, \p h) are not + well-tested. Unusual or meaningless parameters may lead to + rather unexpected results. + + \returns whether the painting succeeded + + \note This method is only supported for Arthur + + \since 0.16 + */ + bool renderToPainter(QPainter* painter, double xres=72.0, double yres=72.0, int x=-1, int y=-1, int w=-1, int h=-1, + Rotation rotate = Rotate0, PainterFlags flags = 0) const; + + /** + Get the page thumbnail if it exists. + + \return a QImage of the thumbnail, or a null image + if the PDF does not contain one for this page + + \since 0.12 + */ + QImage thumbnail() const; + + /** + Returns the text that is inside a specified rectangle + + \param rect the rectangle specifying the area of interest, + with coordinates given in points, i.e., 1/72th of an inch. + If rect is null, all text on the page is given + + \since 0.16 + **/ + QString text(const QRectF &rect, TextLayout textLayout) const; + + /** + Returns the text that is inside a specified rectangle. + The text is returned using the physical layout of the page + + \param rect the rectangle specifying the area of interest, + with coordinates given in points, i.e., 1/72th of an inch. + If rect is null, all text on the page is given + **/ + QString text(const QRectF &rect) const; + + /** + The starting point for a search + */ + enum SearchDirection { FromTop, ///< Start sorting at the top of the document + NextResult, ///< Find the next result, moving "down the page" + PreviousResult ///< Find the previous result, moving "up the page" + }; + + /** + The type of search to perform + */ + enum SearchMode { CaseSensitive, ///< Case differences cause no match in searching + CaseInsensitive ///< Case differences are ignored in matching + }; + + /** + Returns true if the specified text was found. + + \param text the text the search + \param rect in all directions is used to return where the text was found, for NextResult and PreviousResult + indicates where to continue searching for + \param direction in which direction do the search + \param caseSensitive be case sensitive? + \param rotate the rotation to apply for the search order + **/ + Q_DECL_DEPRECATED bool search(const QString &text, QRectF &rect, SearchDirection direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const; + + /** + Returns true if the specified text was found. + + \param text the text the search + \param rectXXX in all directions is used to return where the text was found, for NextResult and PreviousResult + indicates where to continue searching for + \param direction in which direction do the search + \param caseSensitive be case sensitive? + \param rotate the rotation to apply for the search order + \since 0.14 + **/ + bool search(const QString &text, double &rectLeft, double &rectTop, double &rectRight, double &rectBottom, SearchDirection direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const; + + /** + Returns a list of text of the page + + This method returns a QList of TextBoxes that contain all + the text of the page, with roughly one text word of text + per TextBox item. + + For text written in western languages (left-to-right and + up-to-down), the QList contains the text in the proper + order. + + \note The caller owns the text boxes and they should + be deleted when no longer required. + + \warning This method is not tested with Asian scripts + */ + QList textList(Rotation rotate = Rotate0) const; + + /** + \return The dimensions (cropbox) of the page, in points (i.e. 1/72th of an inch) + */ + QSizeF pageSizeF() const; + + /** + \return The dimensions (cropbox) of the page, in points (i.e. 1/72th of an inch) + */ + QSize pageSize() const; + + /** + Returns the transition of this page + + \returns a pointer to a PageTransition structure that + defines how transition to this page shall be performed. + + \note The PageTransition structure is owned by this page, and will + automatically be destroyed when this page class is + destroyed. + **/ + PageTransition *transition() const; + + /** + Gets the page action specified, or NULL if there is no action. + + \since 0.6 + **/ + Link *action( PageAction act ) const; + + /** + Types of orientations that are possible + */ + enum Orientation { + Landscape, ///< Landscape orientation (portrait, with 90 degrees clockwise rotation ) + Portrait, ///< Normal portrait orientation + Seascape, ///< Seascape orientation (portrait, with 270 degrees clockwise rotation) + UpsideDown ///< Upside down orientation (portrait, with 180 degrees rotation) + }; + + /** + The orientation of the page + */ + Orientation orientation() const; + + /** + The default CTM + */ + void defaultCTM(double *CTM, double dpiX, double dpiY, int rotate, bool upsideDown); + + /** + Gets the links of the page + */ + QList links() const; + + /** + Returns the annotations of the page + + \note If you call this method twice, you get different objects + pointing to the same annotations (see Annotation). + The caller owns the returned objects and they should be deleted + when no longer required. + */ + QList annotations() const; + + /** + Adds an annotation to the page + + \note Ownership of the annotation object stays with the caller, who can + delete it at any time. + \since 0.20 + */ + void addAnnotation( const Annotation *ann ); + + /** + Removes an annotation from the page and destroys the annotation object + + \note There mustn't be other Annotation objects pointing this annotation + \since 0.20 + */ + void removeAnnotation( const Annotation *ann ); + + /** + Returns the form fields on the page + The caller gets the ownership of the returned objects. + + \since 0.6 + */ + QList formFields() const; + + /** + Returns the page duration. That is the time, in seconds, that the page + should be displayed before the presentation automatically advances to the next page. + Returns < 0 if duration is not set. + + \since 0.6 + */ + double duration() const; + + /** + Returns the label of the page, or a null string is the page has no label. + + \since 0.6 + **/ + QString label() const; + + private: + Q_DISABLE_COPY(Page) + + Page(DocumentData *doc, int index); + PageData *m_page; + }; + +/** + \brief PDF document. + + The Document class represents a PDF document: its pages, and all the global + properties, metadata, etc. + + \section ownership Ownership of the returned objects + + All the functions that returns class pointers create new object, and the + responsability of those is given to the callee. + + The only exception is \link Poppler::Page::transition() Page::transition()\endlink. + + \section document-loading Loading + + To get a Document, you have to load it via the load() & loadFromData() + functions. + + In all the functions that have passwords as arguments, they \b must be Latin1 + encoded. If you have a password that is a UTF-8 string, you need to use + QString::toLatin1() (or similar) to convert the password first. + If you have a UTF-8 character array, consider converting it to a QString first + (QString::fromUtf8(), or similar) before converting to Latin1 encoding. + + \section document-rendering Rendering + + To render pages of a document, you have different Document functions to set + various options. + + \subsection document-rendering-backend Backends + + %Poppler offers a different backends for rendering the pages. Currently + there are two backends (see #RenderBackend), but only the Splash engine works + well and has been tested. + + The available rendering backends can be discovered via availableRenderBackends(). + The current rendering backend can be changed using setRenderBackend(). + Please note that setting a backend not listed in the available ones + will always result in null QImage's. + + \section document-cms Color management support + + %Poppler, if compiled with this support, provides functions to handle color + profiles. + + To know whether the %Poppler version you are using has support for color + management, you can query Poppler::isCmsAvailable(). In case it is not + avilable, all the color management-related functions will either do nothing + or return null. +*/ + class POPPLER_QT4_EXPORT Document { + friend class Page; + friend class DocumentData; + + public: + /** + The page mode + */ + enum PageMode { + UseNone, ///< No mode - neither document outline nor thumbnail images are visible + UseOutlines, ///< Document outline visible + UseThumbs, ///< Thumbnail images visible + FullScreen, ///< Fullscreen mode (no menubar, windows controls etc) + UseOC, ///< Optional content group panel visible + UseAttach ///< Attachments panel visible + }; + + /** + The page layout + */ + enum PageLayout { + NoLayout, ///< Layout not specified + SinglePage, ///< Display a single page + OneColumn, ///< Display a single column of pages + TwoColumnLeft, ///< Display the pages in two columns, with odd-numbered pages on the left + TwoColumnRight, ///< Display the pages in two columns, with odd-numbered pages on the right + TwoPageLeft, ///< Display the pages two at a time, with odd-numbered pages on the left + TwoPageRight ///< Display the pages two at a time, with odd-numbered pages on the right + }; + + /** + The render backends available + + \since 0.6 + */ + enum RenderBackend { + SplashBackend, ///< Splash backend + ArthurBackend ///< Arthur (Qt4) backend + }; + + /** + The render hints available + + \since 0.6 + */ + enum RenderHint { + Antialiasing = 0x00000001, ///< Antialiasing for graphics + TextAntialiasing = 0x00000002, ///< Antialiasing for text + TextHinting = 0x00000004, ///< Hinting for text \since 0.12.1 + TextSlightHinting = 0x00000008 ///< Lighter hinting for text when combined with TextHinting \since 0.18 + }; + Q_DECLARE_FLAGS( RenderHints, RenderHint ) + + /** + Set a color display profile for the current document. + + \param outputProfileA is a \c cmsHPROFILE of the LCMS library. + + \since 0.12 + */ + void setColorDisplayProfile(void *outputProfileA); + /** + Set a color display profile for the current document. + + \param name is the name of the display profile to set. + + \since 0.12 + */ + void setColorDisplayProfileName(const QString &name); + /** + Return the current RGB profile. + + \return a \c cmsHPROFILE of the LCMS library. + + \since 0.12 + */ + void* colorRgbProfile() const; + /** + Return the current display profile. + + \return a \c cmsHPROFILE of the LCMS library. + + \since 0.12 + */ + void *colorDisplayProfile() const; + + /** + Load the document from a file on disk + + \param filePath the name (and path, if required) of the file to load + \param ownerPassword the Latin1-encoded owner password to use in + loading the file + \param userPassword the Latin1-encoded user ("open") password + to use in loading the file + + \return the loaded document, or NULL on error + + \note The caller owns the pointer to Document, and this should + be deleted when no longer required. + + \warning The returning document may be locked if a password is required + to open the file, and one is not provided (as the userPassword). + */ + static Document *load(const QString & filePath, + const QByteArray &ownerPassword=QByteArray(), + const QByteArray &userPassword=QByteArray()); + + /** + Load the document from memory + + \param fileContents the file contents. They are copied so there is no need + to keep the byte array around for the full life time of + the document. + \param ownerPassword the Latin1-encoded owner password to use in + loading the file + \param userPassword the Latin1-encoded user ("open") password + to use in loading the file + + \return the loaded document, or NULL on error + + \note The caller owns the pointer to Document, and this should + be deleted when no longer required. + + \warning The returning document may be locked if a password is required + to open the file, and one is not provided (as the userPassword). + + \since 0.6 + */ + static Document *loadFromData(const QByteArray &fileContents, + const QByteArray &ownerPassword=QByteArray(), + const QByteArray &userPassword=QByteArray()); + + /** + Get a specified Page + + Note that this follows the PDF standard of being zero based - if you + want the first page, then you need an index of zero. + + The caller gets the ownership of the returned object. + + \param index the page number index + */ + Page *page(int index) const; + + /** + \overload + + + The intent is that you can pass in a label like \c "ix" and + get the page with that label (which might be in the table of + contents), or pass in \c "1" and get the page that the user + expects (which might not be the first page, if there is a + title page and a table of contents). + + \param label the page label + */ + Page *page(const QString &label) const; + + /** + The number of pages in the document + */ + int numPages() const; + + /** + The type of mode that should be used by the application + when the document is opened. Note that while this is + called page mode, it is really viewer application mode. + */ + PageMode pageMode() const; + + /** + The layout that pages should be shown in when the document + is first opened. This basically describes how pages are + shown relative to each other. + */ + PageLayout pageLayout() const; + + /** + Provide the passwords required to unlock the document + + \param ownerPassword the Latin1-encoded owner password to use in + loading the file + \param userPassword the Latin1-encoded user ("open") password + to use in loading the file + */ + bool unlock(const QByteArray &ownerPassword, const QByteArray &userPassword); + + /** + Determine if the document is locked + */ + bool isLocked() const; + + /** + The date associated with the document + + You would use this method with something like: + \code +QDateTime created = m_doc->date("CreationDate"); +QDateTime modified = m_doc->date("ModDate"); + \endcode + + The available dates are: + - CreationDate: the date of creation of the document + - ModDate: the date of the last change in the document + + \param data the type of date that is required + */ + QDateTime date( const QString & data ) const; + + /** + Get specified information associated with the document + + You would use this method with something like: + \code +QString title = m_doc->info("Title"); +QString subject = m_doc->info("Subject"); + \endcode + + In addition to \c Title and \c Subject, other information that may + be available include \c Author, \c Keywords, \c Creator and \c Producer. + + \param data the information that is required + + \sa infoKeys() to get a list of the available keys + */ + QString info( const QString & data ) const; + + /** + Obtain a list of the available string information keys. + */ + QStringList infoKeys() const; + + /** + Test if the document is encrypted + */ + bool isEncrypted() const; + + /** + Test if the document is linearised + + In some cases, this is called "fast web view", since it + is mostly an optimisation for viewing over the Web. + */ + bool isLinearized() const; + + /** + Test if the permissions on the document allow it to be + printed + */ + bool okToPrint() const; + + /** + Test if the permissions on the document allow it to be + printed at high resolution + */ + bool okToPrintHighRes() const; + + /** + Test if the permissions on the document allow it to be + changed. + + \note depending on the type of change, it may be more + appropriate to check other properties as well. + */ + bool okToChange() const; + + /** + Test if the permissions on the document allow the + contents to be copied / extracted + */ + bool okToCopy() const; + + /** + Test if the permissions on the document allow annotations + to be added or modified, and interactive form fields (including + signature fields) to be completed. + */ + bool okToAddNotes() const; + + /** + Test if the permissions on the document allow interactive + form fields (including signature fields) to be completed. + + \note this can be true even if okToAddNotes() is false - this + means that only form completion is permitted. + */ + bool okToFillForm() const; + + /** + Test if the permissions on the document allow interactive + form fields (including signature fields) to be set, created and + modified + */ + bool okToCreateFormFields() const; + + /** + Test if the permissions on the document allow content extraction + (text and perhaps other content) for accessibility usage (eg for + a screen reader) + */ + bool okToExtractForAccessibility() const; + + /** + Test if the permissions on the document allow it to be + "assembled" - insertion, rotation and deletion of pages; + or creation of bookmarks and thumbnail images. + + \note this can be true even if okToChange() is false + */ + bool okToAssemble() const; + + /** + The version of the PDF specification that the document + conforms to + + \deprecated use getPdfVersion and avoid float point + comparisons/handling + */ + Q_DECL_DEPRECATED double pdfVersion() const; + + /** + The version of the PDF specification that the document + conforms to + + \param major an optional pointer to a variable where store the + "major" number of the version + \param minor an optional pointer to a variable where store the + "minor" number of the version + + \since 0.12 + */ + void getPdfVersion(int *major, int *minor) const; + + /** + The fonts within the PDF document. + + This is a shorthand for getting all the fonts at once. + + \note this can take a very long time to run with a large + document. You may wish to use a FontIterator if you have more + than say 20 pages + + \see newFontIterator() + */ + QList fonts() const; + + /** + Scans for fonts within the PDF document. + + \param numPages the number of pages to scan + \param fontList pointer to the list where the font information + should be placed + + \note with this method you can scan for fonts only \em once for each + document; once the end is reached, no more scanning with this method + can be done + + \return false if the end of the document has been reached + + \deprecated this function is quite limited in its job (see note), + better use fonts() or newFontIterator() + + \see fonts(), newFontIterator() + */ + Q_DECL_DEPRECATED bool scanForFonts( int numPages, QList *fontList ) const; + + /** + Creates a new FontIterator object for font scanning. + + The new iterator can be used for reading the font information of the + document, reading page by page. + + The caller is responsible for the returned object, ie it should freed + it when no more useful. + + \param startPage the initial page from which start reading fonts + + \see fonts() + + \since 0.12 + */ + FontIterator* newFontIterator( int startPage = 0 ) const; + + /** + The font data if the font is an embedded one. + + \since 0.10 + */ + QByteArray fontData(const FontInfo &font) const; + + /** + The documents embedded within the PDF document. + + \note there are two types of embedded document - this call + only accesses documents that are embedded at the document level. + */ + QList embeddedFiles() const; + + /** + Whether there are any documents embedded in this PDF document. + */ + bool hasEmbeddedFiles() const; + + /** + Gets the table of contents (TOC) of the Document. + + The caller is responsable for the returned object. + + In the tree the tag name is the 'screen' name of the entry. A tag can have + attributes. Here follows the list of tag attributes with meaning: + - Destination: A string description of the referred destination + - DestinationName: A 'named reference' to the viewport + - ExternalFileName: A link to a external filename + - Open: A bool value that tells whether the subbranch of the item is open or not + + Resolving the final destination for each item can be done in the following way: + - first, checking for 'Destination': if not empty, then a LinkDestination + can be constructed straight with it + - as second step, if the 'DestinationName' is not empty, then the destination + can be resolved using linkDestination() + + Note also that if 'ExternalFileName' is not emtpy, then the destination refers + to that document (and not to the current one). + + \returns the TOC, or NULL if the Document does not have one + */ + QDomDocument *toc() const; + + /** + Tries to resolve the named destination \p name. + + \note this operation starts a search through the whole document + + \returns a new LinkDestination object if the named destination was + actually found, or NULL otherwise + */ + LinkDestination *linkDestination( const QString &name ); + + /** + Sets the paper color + + \param color the new paper color + */ + void setPaperColor(const QColor &color); + /** + The paper color + + The default color is white. + */ + QColor paperColor() const; + + /** + Sets the backend used to render the pages. + + \param backend the new rendering backend + + \since 0.6 + */ + void setRenderBackend( RenderBackend backend ); + /** + The currently set render backend + + The default backend is \ref SplashBackend + + \since 0.6 + */ + RenderBackend renderBackend() const; + + /** + The available rendering backends. + + \since 0.6 + */ + static QSet availableRenderBackends(); + + /** + Sets the render \p hint . + + \note some hints may not be supported by some rendering backends. + + \param on whether the flag should be added or removed. + + \since 0.6 + */ + void setRenderHint( RenderHint hint, bool on = true ); + /** + The currently set render hints. + + \since 0.6 + */ + RenderHints renderHints() const; + + /** + Gets a new PS converter for this document. + + The caller gets the ownership of the returned converter. + + \since 0.6 + */ + PSConverter *psConverter() const; + + /** + Gets a new PDF converter for this document. + + The caller gets the ownership of the returned converter. + + \since 0.8 + */ + PDFConverter *pdfConverter() const; + + /** + Gets the metadata stream contents + + \since 0.6 + */ + QString metadata() const; + + /** + Test whether this document has "optional content". + + Optional content is used to optionally turn on (display) + and turn off (not display) some elements of the document. + The most common use of this is for layers in design + applications, but it can be used for a range of things, + such as not including some content in printing, and + displaying content in the appropriate language. + + \since 0.8 + */ + bool hasOptionalContent() const; + + /** + Itemviews model for optional content. + + The model is owned by the document. + + \since 0.8 + */ + OptContentModel *optionalContentModel(); + + /** + Document-level JavaScript scripts. + + Returns the list of document level JavaScript scripts to be always + executed before any other script. + + \since 0.10 + */ + QStringList scripts() const; + + /** + The PDF identifiers. + + \param permanentId an optional pointer to a variable where store the + permanent ID of the document + \param updateId an optional pointer to a variable where store the + update ID of the document + + \return whether the document has the IDs + + \since 0.16 + */ + bool getPdfId(QByteArray *permanentId, QByteArray *updateId) const; + + /** + Destructor. + */ + ~Document(); + + private: + Q_DISABLE_COPY(Document) + + DocumentData *m_doc; + + Document(DocumentData *dataA); + }; + + class BaseConverterPrivate; + class PSConverterPrivate; + class PDFConverterPrivate; + /** + \brief Base converter. + + This is the base class for the converters. + + \since 0.8 + */ + class POPPLER_QT4_EXPORT BaseConverter + { + friend class Document; + public: + /** + Destructor. + */ + virtual ~BaseConverter(); + + /** Sets the output file name. You must set this or the output device. */ + void setOutputFileName(const QString &outputFileName); + + /** + * Sets the output device. You must set this or the output file name. + * + * \since 0.8 + */ + void setOutputDevice(QIODevice *device); + + /** + Does the conversion. + + \return whether the conversion succeeded + */ + virtual bool convert() = 0; + + enum Error + { + NoError, + FileLockedError, + OpenOutputError, + NotSupportedInputFileError + }; + + /** + Returns the last error + \since 0.12.1 + */ + Error lastError() const; + + protected: + /// \cond PRIVATE + BaseConverter(BaseConverterPrivate &dd); + Q_DECLARE_PRIVATE(BaseConverter) + BaseConverterPrivate *d_ptr; + /// \endcond + + private: + Q_DISABLE_COPY(BaseConverter) + }; + + /** + Converts a PDF to PS + + Sizes have to be in Points (1/72 inch) + + If you are using QPrinter you can get paper size by doing: + \code +QPrinter dummy(QPrinter::PrinterResolution); +dummy.setFullPage(true); +dummy.setPageSize(myPageSize); +width = dummy.width(); +height = dummy.height(); + \endcode + + \since 0.6 + */ + class POPPLER_QT4_EXPORT PSConverter : public BaseConverter + { + friend class Document; + public: + /** + Options for the PS export. + + \since 0.10 + */ + enum PSOption { + Printing = 0x00000001, ///< The PS is generated for printing purposes + StrictMargins = 0x00000002, + ForceRasterization = 0x00000004, + PrintToEPS = 0x00000008, ///< Output EPS instead of PS \since 0.20 + HideAnnotations = 0x00000010 ///< Don't print annotations \since 0.20 + }; + Q_DECLARE_FLAGS( PSOptions, PSOption ) + + /** + Destructor. + */ + ~PSConverter(); + + /** Sets the list of pages to print. Mandatory. */ + void setPageList(const QList &pageList); + + /** + Sets the title of the PS Document. Optional + */ + void setTitle(const QString &title); + + /** + Sets the horizontal DPI. Defaults to 72.0 + */ + void setHDPI(double hDPI); + + /** + Sets the vertical DPI. Defaults to 72.0 + */ + void setVDPI(double vDPI); + + /** + Sets the rotate. Defaults to not rotated + */ + void setRotate(int rotate); + + /** + Sets the output paper width. Has to be set. + */ + void setPaperWidth(int paperWidth); + + /** + Sets the output paper height. Has to be set. + */ + void setPaperHeight(int paperHeight); + + /** + Sets the output right margin. Defaults to 0 + */ + void setRightMargin(int marginRight); + + /** + Sets the output bottom margin. Defaults to 0 + */ + void setBottomMargin(int marginBottom); + + /** + Sets the output left margin. Defaults to 0 + */ + void setLeftMargin(int marginLeft); + + /** + Sets the output top margin. Defaults to 0 + */ + void setTopMargin(int marginTop); + + /** + Defines if margins have to be strictly followed (even if that + means changing aspect ratio), or if the margins can be adapted + to keep aspect ratio. + + Defaults to false. + */ + void setStrictMargins(bool strictMargins); + + /** Defines if the page will be rasterized to an image before printing. Defaults to false */ + void setForceRasterize(bool forceRasterize); + + /** + Sets the options for the PS export. + + \since 0.10 + */ + void setPSOptions(PSOptions options); + + /** + The currently set options for the PS export. + + The default flags are: Printing. + + \since 0.10 + */ + PSOptions psOptions() const; + + /** + Sets a function that will be called each time a page is converted. + + The payload belongs to the caller. + + \since 0.16 + */ + void setPageConvertedCallback(void (* callback)(int page, void *payload), void *payload); + + bool convert(); + + private: + Q_DECLARE_PRIVATE(PSConverter) + Q_DISABLE_COPY(PSConverter) + + PSConverter(DocumentData *document); + }; + + /** + Converts a PDF to PDF (thus saves a copy of the document). + + \since 0.8 + */ + class POPPLER_QT4_EXPORT PDFConverter : public BaseConverter + { + friend class Document; + public: + /** + Options for the PDF export. + */ + enum PDFOption { + WithChanges = 0x00000001 ///< The changes done to the document are saved as well + }; + Q_DECLARE_FLAGS( PDFOptions, PDFOption ) + + /** + Destructor. + */ + virtual ~PDFConverter(); + + /** + Sets the options for the PDF export. + */ + void setPDFOptions(PDFOptions options); + /** + The currently set options for the PDF export. + */ + PDFOptions pdfOptions() const; + + bool convert(); + + private: + Q_DECLARE_PRIVATE(PDFConverter) + Q_DISABLE_COPY(PDFConverter) + + PDFConverter(DocumentData *document); + }; + + /** + Conversion from PDF date string format to QDateTime + */ + POPPLER_QT4_EXPORT QDateTime convertDate( char *dateString ); + + /** + Whether the color management functions are available. + + \since 0.12 + */ + POPPLER_QT4_EXPORT bool isCmsAvailable(); + + class SoundData; + /** + Container class for a sound file in a PDF document. + + A sound can be either External (in that case should be loaded the file + whose url is represented by url() ), or Embedded, and the player has to + play the data contained in data(). + + \since 0.6 + */ + class POPPLER_QT4_EXPORT SoundObject { + public: + /** + The type of sound + */ + enum SoundType { + External, ///< The real sound file is external + Embedded ///< The sound is contained in the data + }; + + /** + The encoding format used for the sound + */ + enum SoundEncoding { + Raw, ///< Raw encoding, with unspecified or unsigned values in the range [ 0, 2^B - 1 ] + Signed, ///< Twos-complement values + muLaw, ///< mu-law-encoded samples + ALaw ///< A-law-encoded samples + }; + + /// \cond PRIVATE + SoundObject(Sound *popplersound); + /// \endcond + + ~SoundObject(); + + /** + Is the sound embedded (SoundObject::Embedded) or external (SoundObject::External)? + */ + SoundType soundType() const; + + /** + The URL of the sound file to be played, in case of SoundObject::External + */ + QString url() const; + + /** + The data of the sound, in case of SoundObject::Embedded + */ + QByteArray data() const; + + /** + The sampling rate of the sound + */ + double samplingRate() const; + + /** + The number of sound channels to use to play the sound + */ + int channels() const; + + /** + The number of bits per sample value per channel + */ + int bitsPerSample() const; + + /** + The encoding used for the sound + */ + SoundEncoding soundEncoding() const; + + private: + Q_DISABLE_COPY(SoundObject) + + SoundData *m_soundData; + }; + + class MovieData; + /** + Container class for a movie object in a PDF document. + + \since 0.10 + */ + class POPPLER_QT4_EXPORT MovieObject { + friend class AnnotationPrivate; + public: + /** + The play mode for playing the movie + */ + enum PlayMode { + PlayOnce, ///< Play the movie once, closing the movie controls at the end + PlayOpen, ///< Like PlayOnce, but leaving the controls open + PlayRepeat, ///< Play continuously until stopped + PlayPalindrome ///< Play forward, then backward, then again foward and so on until stopped + }; + + ~MovieObject(); + + /** + The URL of the movie to be played + */ + QString url() const; + + /** + The size of the movie + */ + QSize size() const; + + /** + The rotation (either 0, 90, 180, or 270 degrees clockwise) for the movie, + */ + int rotation() const; + + /** + Whether show a bar with movie controls + */ + bool showControls() const; + + /** + How to play the movie + */ + PlayMode playMode() const; + + private: + /// \cond PRIVATE + MovieObject( AnnotMovie *ann ); + /// \endcond + + Q_DISABLE_COPY(MovieObject) + + MovieData *m_movieData; + }; + +} + +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags) +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints) +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions) +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions) + +#endif diff --git a/qt4/src/poppler-sound.cc b/qt4/src/poppler-sound.cc new file mode 100644 index 0000000..eb19b9d --- /dev/null +++ b/qt4/src/poppler-sound.cc @@ -0,0 +1,132 @@ +/* poppler-sound.cc: qt interface to poppler + * Copyright (C) 2006-2007, Pino Toscano + * Copyright (C) 2008, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" + +#include "Object.h" +#include "Stream.h" +#include "Sound.h" + +namespace Poppler +{ + +class SoundData +{ +public: + SoundData() + : m_soundObj( 0 ) + { + } + + ~SoundData() + { + delete m_soundObj; + } + + SoundObject::SoundType m_type; + Sound *m_soundObj; +}; + +SoundObject::SoundObject(Sound *popplersound) +{ + m_soundData = new SoundData(); + switch ( popplersound->getSoundKind() ) + { + case soundEmbedded: + m_soundData->m_type = SoundObject::Embedded; + break; + case soundExternal: + default: + m_soundData->m_type = SoundObject::External; + break; + } + + m_soundData->m_soundObj = popplersound->copy(); +} + +SoundObject::~SoundObject() +{ + delete m_soundData; +} + +SoundObject::SoundType SoundObject::soundType() const +{ + return m_soundData->m_type; +} + +QString SoundObject::url() const +{ + if ( m_soundData->m_type != SoundObject::External ) + return QString(); + + GooString * goo = m_soundData->m_soundObj->getFileName(); + return goo ? QString( goo->getCString() ) : QString(); +} + +QByteArray SoundObject::data() const +{ + if ( m_soundData->m_type != SoundObject::Embedded ) + return QByteArray(); + + Stream *stream = m_soundData->m_soundObj->getStream(); + stream->reset(); + int dataLen = 0; + QByteArray fileArray; + int i; + while ( (i = stream->getChar()) != EOF) { + fileArray[dataLen] = (char)i; + ++dataLen; + } + fileArray.resize(dataLen); + + return fileArray; +} + +double SoundObject::samplingRate() const +{ + return m_soundData->m_soundObj->getSamplingRate(); +} + +int SoundObject::channels() const +{ + return m_soundData->m_soundObj->getChannels(); +} + +int SoundObject::bitsPerSample() const +{ + return m_soundData->m_soundObj->getBitsPerSample(); +} + +SoundObject::SoundEncoding SoundObject::soundEncoding() const +{ + switch ( m_soundData->m_soundObj->getEncoding() ) + { + case soundRaw: + return SoundObject::Raw; + case soundSigned: + return SoundObject::Signed; + case soundMuLaw: + return SoundObject::muLaw; + case soundALaw: + return SoundObject::ALaw; + } + return SoundObject::Raw; +} + +} diff --git a/qt4/src/poppler-textbox.cc b/qt4/src/poppler-textbox.cc new file mode 100644 index 0000000..88cf2a9 --- /dev/null +++ b/qt4/src/poppler-textbox.cc @@ -0,0 +1,63 @@ +/* poppler-qt.h: qt interface to poppler + * Copyright (C) 2005, Brad Hards + * Copyright (C) 2006-2008, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "poppler-qt4.h" +#include "poppler-private.h" + +namespace Poppler { + +TextBox::TextBox(const QString& text, const QRectF &bBox) +{ + m_data = new TextBoxData(); + m_data->text = text; + m_data->bBox = bBox; +} + +TextBox::~TextBox() +{ + delete m_data; +} + +QString TextBox::text() const +{ + return m_data->text; +} + +QRectF TextBox::boundingBox() const +{ + return m_data->bBox; +} + +TextBox *TextBox::nextWord() const +{ + return m_data->nextWord; +} + +QRectF TextBox::charBoundingBox(int i) const +{ + return m_data->charBBoxes.value(i); +} + +bool TextBox::hasSpaceAfter() const +{ + return m_data->hasSpaceAfter; +} + +} diff --git a/qt4/tests/CMakeLists.txt b/qt4/tests/CMakeLists.txt new file mode 100644 index 0000000..028c1e1 --- /dev/null +++ b/qt4/tests/CMakeLists.txt @@ -0,0 +1,61 @@ +add_definitions(${QT4_DEFINITIONS}) +add_definitions(-DTESTDATADIR=\"${TESTDATADIR}\") + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../src + ${CMAKE_CURRENT_BINARY_DIR} + ${QT4_INCLUDE_DIR} +) + +macro(QT4_ADD_SIMPLETEST exe source) + string(REPLACE "-" "" test_name ${exe}) + set(${test_name}_SOURCES + ${source} + ) + poppler_add_test(${exe} BUILD_QT4_TESTS ${${test_name}_SOURCES}) + target_link_libraries(${exe} poppler-qt4) + if(MSVC) + target_link_libraries(${exe} poppler ${poppler_LIBS}) + endif(MSVC) +endmacro(QT4_ADD_SIMPLETEST) + +macro(QT4_ADD_QTEST exe source) + if (QT4_QTTEST_FOUND) + string(REPLACE "-" "" test_name ${exe}) + set(${test_name}_SOURCES + ${source} + ) + poppler_add_unittest(${exe} BUILD_QT4_TESTS ${${test_name}_SOURCES}) + qt4_automoc(${${test_name}_SOURCES}) + target_link_libraries(${exe} poppler-qt4 ${QT4_QTTEST_LIBRARY}) + if(MSVC) + target_link_libraries(${exe} poppler ${poppler_LIBS}) + endif(MSVC) + endif (QT4_QTTEST_FOUND) +endmacro(QT4_ADD_QTEST) + + +qt4_add_simpletest(test-poppler-qt4 test-poppler-qt4.cpp) +qt4_add_simpletest(test-password-qt4 test-password-qt4.cpp) +qt4_add_simpletest(poppler-fonts poppler-fonts.cpp) +qt4_add_simpletest(poppler_attachments poppler-attachments.cpp) +qt4_add_simpletest(stress-poppler-qt4 stress-poppler-qt4.cpp) +qt4_add_simpletest(stress-poppler-dir stress-poppler-dir.cpp) +qt4_add_simpletest(poppler-texts poppler-texts.cpp) + +qt4_add_qtest(check_attachments check_attachments.cpp) +qt4_add_qtest(check_dateConversion check_dateConversion.cpp) +qt4_add_qtest(check_fonts check_fonts.cpp) +qt4_add_qtest(check_links check_links.cpp) +qt4_add_qtest(check_metadata check_metadata.cpp) +qt4_add_qtest(check_optcontent check_optcontent.cpp) +qt4_add_qtest(check_pagelayout check_pagelayout.cpp) +qt4_add_qtest(check_pagemode check_pagemode.cpp) +qt4_add_qtest(check_password check_password.cpp) +qt4_add_qtest(check_permissions check_permissions.cpp) +qt4_add_qtest(check_search check_search.cpp) +qt4_add_qtest(check_actualtext check_actualtext.cpp) +if (NOT WIN32) + qt4_add_qtest(check_strings check_strings.cpp) +endif (NOT WIN32) diff --git a/qt4/tests/Makefile.am b/qt4/tests/Makefile.am new file mode 100644 index 0000000..be8ea35 --- /dev/null +++ b/qt4/tests/Makefile.am @@ -0,0 +1,139 @@ +AM_LDFLAGS = @auto_import_flags@ + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + -I$(top_srcdir)/qt4/src \ + -DTESTDATADIR=\"$(TESTDATADIR)\" \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_QT4_CFLAGS) + +LDADDS = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/qt4/src/libpoppler-qt4.la \ + $(FONTCONFIG_LIBS) \ + $(POPPLER_QT4_LIBS) + +SUFFIXES: .moc + +.cpp.moc: + $(AM_V_GEN) $(MOCQT4) -i $< -o $@ + +noinst_PROGRAMS = test-poppler-qt4 stress-poppler-qt4 \ + poppler-fonts test-password-qt4 stress-poppler-dir \ + poppler-attachments poppler-texts + + +test_poppler_qt4_SOURCES = \ + test-poppler-qt4.cpp + +test_poppler_qt4_LDADD = $(LDADDS) + + +test_password_qt4_SOURCES = \ + test-password-qt4.cpp + +test_password_qt4_LDADD = $(LDADDS) + + +poppler_fonts_SOURCES = \ + poppler-fonts.cpp + +poppler_fonts_LDADD = $(LDADDS) + +poppler_attachments_SOURCES = \ + poppler-attachments.cpp + +poppler_attachments_LDADD = $(LDADDS) + +poppler_texts_SOURCES = \ + poppler-texts.cpp + +poppler_texts_LDADD = $(LDADDS) + + +stress_poppler_qt4_SOURCES = \ + stress-poppler-qt4.cpp + +stress_poppler_qt4_LDADD = $(LDADDS) + +stress_poppler_dir_SOURCES = \ + stress-poppler-dir.cpp + +stress_poppler_dir_LDADD = $(LDADDS) + +clean-generic: + rm -f *.moc + +if BUILD_POPPLER_QT4 +TESTS = \ + check_attachments \ + check_actualtext \ + check_dateConversion \ + check_fonts \ + check_links \ + check_metadata \ + check_optcontent \ + check_permissions \ + check_pagemode \ + check_password \ + check_pagelayout \ + check_search \ + check_strings + +check_PROGRAMS = $(TESTS) + +check_attachments_SOURCES = check_attachments.cpp +check_attachments.$(OBJEXT): check_attachments.moc +check_attachments_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_actualtext_SOURCES = check_actualtext.cpp +check_actualtext.$(OBJEXT): check_actualtext.moc +check_actualtext_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_dateConversion_SOURCES = check_dateConversion.cpp +check_dateConversion.$(OBJEXT): check_dateConversion.moc +check_dateConversion_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_fonts_SOURCES = check_fonts.cpp +check_fonts.$(OBJEXT): check_fonts.moc +check_fonts_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_links_SOURCES = check_links.cpp +check_links.$(OBJEXT): check_links.moc +check_links_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_metadata_SOURCES = check_metadata.cpp +check_metadata.$(OBJEXT): check_metadata.moc +check_metadata_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_optcontent_SOURCES = check_optcontent.cpp +check_optcontent.$(OBJEXT): check_optcontent.moc +check_optcontent_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_pagemode_SOURCES = check_pagemode.cpp +check_pagemode.$(OBJEXT): check_pagemode.moc +check_pagemode_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_permissions_SOURCES = check_permissions.cpp +check_permissions.$(OBJEXT): check_permissions.moc +check_permissions_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_pagelayout_SOURCES = check_pagelayout.cpp +check_pagelayout.$(OBJEXT): check_pagelayout.moc +check_pagelayout_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_password_SOURCES = check_password.cpp +check_password.$(OBJEXT): check_password.moc +check_password_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_search_SOURCES = check_search.cpp +check_search.$(OBJEXT): check_search.moc +check_search_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +check_strings_SOURCES = check_strings.cpp +check_strings.$(OBJEXT): check_strings.moc +check_strings_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + +endif + diff --git a/qt4/tests/Makefile.in b/qt4/tests/Makefile.in new file mode 100644 index 0000000..53c79e5 --- /dev/null +++ b/qt4/tests/Makefile.in @@ -0,0 +1,1041 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = test-poppler-qt4$(EXEEXT) \ + stress-poppler-qt4$(EXEEXT) poppler-fonts$(EXEEXT) \ + test-password-qt4$(EXEEXT) stress-poppler-dir$(EXEEXT) \ + poppler-attachments$(EXEEXT) poppler-texts$(EXEEXT) +@BUILD_POPPLER_QT4_TRUE@TESTS = check_attachments$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_actualtext$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_dateConversion$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_fonts$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_links$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_metadata$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_optcontent$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_permissions$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_pagemode$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_password$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_pagelayout$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_search$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_strings$(EXEEXT) +@BUILD_POPPLER_QT4_TRUE@check_PROGRAMS = $(am__EXEEXT_1) +subdir = qt4/tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@BUILD_POPPLER_QT4_TRUE@am__EXEEXT_1 = check_attachments$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_actualtext$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_dateConversion$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_fonts$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_links$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_metadata$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_optcontent$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_permissions$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_pagemode$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_password$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_pagelayout$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_search$(EXEEXT) \ +@BUILD_POPPLER_QT4_TRUE@ check_strings$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am__check_actualtext_SOURCES_DIST = check_actualtext.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_actualtext_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_actualtext.$(OBJEXT) +check_actualtext_OBJECTS = $(am_check_actualtext_OBJECTS) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/qt4/src/libpoppler-qt4.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +@BUILD_POPPLER_QT4_TRUE@check_actualtext_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__check_attachments_SOURCES_DIST = check_attachments.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_attachments_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_attachments.$(OBJEXT) +check_attachments_OBJECTS = $(am_check_attachments_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_attachments_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_dateConversion_SOURCES_DIST = check_dateConversion.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_dateConversion_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_dateConversion.$(OBJEXT) +check_dateConversion_OBJECTS = $(am_check_dateConversion_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_dateConversion_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_fonts_SOURCES_DIST = check_fonts.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_fonts_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_fonts.$(OBJEXT) +check_fonts_OBJECTS = $(am_check_fonts_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_fonts_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_links_SOURCES_DIST = check_links.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_links_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_links.$(OBJEXT) +check_links_OBJECTS = $(am_check_links_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_links_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_metadata_SOURCES_DIST = check_metadata.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_metadata_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_metadata.$(OBJEXT) +check_metadata_OBJECTS = $(am_check_metadata_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_metadata_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_optcontent_SOURCES_DIST = check_optcontent.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_optcontent_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_optcontent.$(OBJEXT) +check_optcontent_OBJECTS = $(am_check_optcontent_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_optcontent_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_pagelayout_SOURCES_DIST = check_pagelayout.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_pagelayout_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_pagelayout.$(OBJEXT) +check_pagelayout_OBJECTS = $(am_check_pagelayout_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_pagelayout_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_pagemode_SOURCES_DIST = check_pagemode.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_pagemode_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_pagemode.$(OBJEXT) +check_pagemode_OBJECTS = $(am_check_pagemode_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_pagemode_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_password_SOURCES_DIST = check_password.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_password_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_password.$(OBJEXT) +check_password_OBJECTS = $(am_check_password_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_password_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_permissions_SOURCES_DIST = check_permissions.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_permissions_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_permissions.$(OBJEXT) +check_permissions_OBJECTS = $(am_check_permissions_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_permissions_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_search_SOURCES_DIST = check_search.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_search_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_search.$(OBJEXT) +check_search_OBJECTS = $(am_check_search_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_search_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am__check_strings_SOURCES_DIST = check_strings.cpp +@BUILD_POPPLER_QT4_TRUE@am_check_strings_OBJECTS = \ +@BUILD_POPPLER_QT4_TRUE@ check_strings.$(OBJEXT) +check_strings_OBJECTS = $(am_check_strings_OBJECTS) +@BUILD_POPPLER_QT4_TRUE@check_strings_DEPENDENCIES = \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_POPPLER_QT4_TRUE@ $(am__DEPENDENCIES_1) +am_poppler_attachments_OBJECTS = poppler-attachments.$(OBJEXT) +poppler_attachments_OBJECTS = $(am_poppler_attachments_OBJECTS) +poppler_attachments_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_poppler_fonts_OBJECTS = poppler-fonts.$(OBJEXT) +poppler_fonts_OBJECTS = $(am_poppler_fonts_OBJECTS) +poppler_fonts_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_poppler_texts_OBJECTS = poppler-texts.$(OBJEXT) +poppler_texts_OBJECTS = $(am_poppler_texts_OBJECTS) +poppler_texts_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_stress_poppler_dir_OBJECTS = stress-poppler-dir.$(OBJEXT) +stress_poppler_dir_OBJECTS = $(am_stress_poppler_dir_OBJECTS) +stress_poppler_dir_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_stress_poppler_qt4_OBJECTS = stress-poppler-qt4.$(OBJEXT) +stress_poppler_qt4_OBJECTS = $(am_stress_poppler_qt4_OBJECTS) +stress_poppler_qt4_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_test_password_qt4_OBJECTS = test-password-qt4.$(OBJEXT) +test_password_qt4_OBJECTS = $(am_test_password_qt4_OBJECTS) +test_password_qt4_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_test_poppler_qt4_OBJECTS = test-poppler-qt4.$(OBJEXT) +test_poppler_qt4_OBJECTS = $(am_test_poppler_qt4_OBJECTS) +test_poppler_qt4_DEPENDENCIES = $(am__DEPENDENCIES_2) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(check_actualtext_SOURCES) $(check_attachments_SOURCES) \ + $(check_dateConversion_SOURCES) $(check_fonts_SOURCES) \ + $(check_links_SOURCES) $(check_metadata_SOURCES) \ + $(check_optcontent_SOURCES) $(check_pagelayout_SOURCES) \ + $(check_pagemode_SOURCES) $(check_password_SOURCES) \ + $(check_permissions_SOURCES) $(check_search_SOURCES) \ + $(check_strings_SOURCES) $(poppler_attachments_SOURCES) \ + $(poppler_fonts_SOURCES) $(poppler_texts_SOURCES) \ + $(stress_poppler_dir_SOURCES) $(stress_poppler_qt4_SOURCES) \ + $(test_password_qt4_SOURCES) $(test_poppler_qt4_SOURCES) +DIST_SOURCES = $(am__check_actualtext_SOURCES_DIST) \ + $(am__check_attachments_SOURCES_DIST) \ + $(am__check_dateConversion_SOURCES_DIST) \ + $(am__check_fonts_SOURCES_DIST) \ + $(am__check_links_SOURCES_DIST) \ + $(am__check_metadata_SOURCES_DIST) \ + $(am__check_optcontent_SOURCES_DIST) \ + $(am__check_pagelayout_SOURCES_DIST) \ + $(am__check_pagemode_SOURCES_DIST) \ + $(am__check_password_SOURCES_DIST) \ + $(am__check_permissions_SOURCES_DIST) \ + $(am__check_search_SOURCES_DIST) \ + $(am__check_strings_SOURCES_DIST) \ + $(poppler_attachments_SOURCES) $(poppler_fonts_SOURCES) \ + $(poppler_texts_SOURCES) $(stress_poppler_dir_SOURCES) \ + $(stress_poppler_qt4_SOURCES) $(test_password_qt4_SOURCES) \ + $(test_poppler_qt4_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +AM_LDFLAGS = @auto_import_flags@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + -I$(top_srcdir)/qt4/src \ + -DTESTDATADIR=\"$(TESTDATADIR)\" \ + $(FONTCONFIG_CFLAGS) \ + $(POPPLER_QT4_CFLAGS) + +LDADDS = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/qt4/src/libpoppler-qt4.la \ + $(FONTCONFIG_LIBS) \ + $(POPPLER_QT4_LIBS) + +test_poppler_qt4_SOURCES = \ + test-poppler-qt4.cpp + +test_poppler_qt4_LDADD = $(LDADDS) +test_password_qt4_SOURCES = \ + test-password-qt4.cpp + +test_password_qt4_LDADD = $(LDADDS) +poppler_fonts_SOURCES = \ + poppler-fonts.cpp + +poppler_fonts_LDADD = $(LDADDS) +poppler_attachments_SOURCES = \ + poppler-attachments.cpp + +poppler_attachments_LDADD = $(LDADDS) +poppler_texts_SOURCES = \ + poppler-texts.cpp + +poppler_texts_LDADD = $(LDADDS) +stress_poppler_qt4_SOURCES = \ + stress-poppler-qt4.cpp + +stress_poppler_qt4_LDADD = $(LDADDS) +stress_poppler_dir_SOURCES = \ + stress-poppler-dir.cpp + +stress_poppler_dir_LDADD = $(LDADDS) +@BUILD_POPPLER_QT4_TRUE@check_attachments_SOURCES = check_attachments.cpp +@BUILD_POPPLER_QT4_TRUE@check_attachments_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_actualtext_SOURCES = check_actualtext.cpp +@BUILD_POPPLER_QT4_TRUE@check_actualtext_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_dateConversion_SOURCES = check_dateConversion.cpp +@BUILD_POPPLER_QT4_TRUE@check_dateConversion_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_fonts_SOURCES = check_fonts.cpp +@BUILD_POPPLER_QT4_TRUE@check_fonts_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_links_SOURCES = check_links.cpp +@BUILD_POPPLER_QT4_TRUE@check_links_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_metadata_SOURCES = check_metadata.cpp +@BUILD_POPPLER_QT4_TRUE@check_metadata_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_optcontent_SOURCES = check_optcontent.cpp +@BUILD_POPPLER_QT4_TRUE@check_optcontent_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_pagemode_SOURCES = check_pagemode.cpp +@BUILD_POPPLER_QT4_TRUE@check_pagemode_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_permissions_SOURCES = check_permissions.cpp +@BUILD_POPPLER_QT4_TRUE@check_permissions_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_pagelayout_SOURCES = check_pagelayout.cpp +@BUILD_POPPLER_QT4_TRUE@check_pagelayout_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_password_SOURCES = check_password.cpp +@BUILD_POPPLER_QT4_TRUE@check_password_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_search_SOURCES = check_search.cpp +@BUILD_POPPLER_QT4_TRUE@check_search_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +@BUILD_POPPLER_QT4_TRUE@check_strings_SOURCES = check_strings.cpp +@BUILD_POPPLER_QT4_TRUE@check_strings_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .moc .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign qt4/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign qt4/tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +check_actualtext$(EXEEXT): $(check_actualtext_OBJECTS) $(check_actualtext_DEPENDENCIES) $(EXTRA_check_actualtext_DEPENDENCIES) + @rm -f check_actualtext$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_actualtext_OBJECTS) $(check_actualtext_LDADD) $(LIBS) +check_attachments$(EXEEXT): $(check_attachments_OBJECTS) $(check_attachments_DEPENDENCIES) $(EXTRA_check_attachments_DEPENDENCIES) + @rm -f check_attachments$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_attachments_OBJECTS) $(check_attachments_LDADD) $(LIBS) +check_dateConversion$(EXEEXT): $(check_dateConversion_OBJECTS) $(check_dateConversion_DEPENDENCIES) $(EXTRA_check_dateConversion_DEPENDENCIES) + @rm -f check_dateConversion$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_dateConversion_OBJECTS) $(check_dateConversion_LDADD) $(LIBS) +check_fonts$(EXEEXT): $(check_fonts_OBJECTS) $(check_fonts_DEPENDENCIES) $(EXTRA_check_fonts_DEPENDENCIES) + @rm -f check_fonts$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_fonts_OBJECTS) $(check_fonts_LDADD) $(LIBS) +check_links$(EXEEXT): $(check_links_OBJECTS) $(check_links_DEPENDENCIES) $(EXTRA_check_links_DEPENDENCIES) + @rm -f check_links$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_links_OBJECTS) $(check_links_LDADD) $(LIBS) +check_metadata$(EXEEXT): $(check_metadata_OBJECTS) $(check_metadata_DEPENDENCIES) $(EXTRA_check_metadata_DEPENDENCIES) + @rm -f check_metadata$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_metadata_OBJECTS) $(check_metadata_LDADD) $(LIBS) +check_optcontent$(EXEEXT): $(check_optcontent_OBJECTS) $(check_optcontent_DEPENDENCIES) $(EXTRA_check_optcontent_DEPENDENCIES) + @rm -f check_optcontent$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_optcontent_OBJECTS) $(check_optcontent_LDADD) $(LIBS) +check_pagelayout$(EXEEXT): $(check_pagelayout_OBJECTS) $(check_pagelayout_DEPENDENCIES) $(EXTRA_check_pagelayout_DEPENDENCIES) + @rm -f check_pagelayout$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_pagelayout_OBJECTS) $(check_pagelayout_LDADD) $(LIBS) +check_pagemode$(EXEEXT): $(check_pagemode_OBJECTS) $(check_pagemode_DEPENDENCIES) $(EXTRA_check_pagemode_DEPENDENCIES) + @rm -f check_pagemode$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_pagemode_OBJECTS) $(check_pagemode_LDADD) $(LIBS) +check_password$(EXEEXT): $(check_password_OBJECTS) $(check_password_DEPENDENCIES) $(EXTRA_check_password_DEPENDENCIES) + @rm -f check_password$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_password_OBJECTS) $(check_password_LDADD) $(LIBS) +check_permissions$(EXEEXT): $(check_permissions_OBJECTS) $(check_permissions_DEPENDENCIES) $(EXTRA_check_permissions_DEPENDENCIES) + @rm -f check_permissions$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_permissions_OBJECTS) $(check_permissions_LDADD) $(LIBS) +check_search$(EXEEXT): $(check_search_OBJECTS) $(check_search_DEPENDENCIES) $(EXTRA_check_search_DEPENDENCIES) + @rm -f check_search$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_search_OBJECTS) $(check_search_LDADD) $(LIBS) +check_strings$(EXEEXT): $(check_strings_OBJECTS) $(check_strings_DEPENDENCIES) $(EXTRA_check_strings_DEPENDENCIES) + @rm -f check_strings$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(check_strings_OBJECTS) $(check_strings_LDADD) $(LIBS) +poppler-attachments$(EXEEXT): $(poppler_attachments_OBJECTS) $(poppler_attachments_DEPENDENCIES) $(EXTRA_poppler_attachments_DEPENDENCIES) + @rm -f poppler-attachments$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_attachments_OBJECTS) $(poppler_attachments_LDADD) $(LIBS) +poppler-fonts$(EXEEXT): $(poppler_fonts_OBJECTS) $(poppler_fonts_DEPENDENCIES) $(EXTRA_poppler_fonts_DEPENDENCIES) + @rm -f poppler-fonts$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_fonts_OBJECTS) $(poppler_fonts_LDADD) $(LIBS) +poppler-texts$(EXEEXT): $(poppler_texts_OBJECTS) $(poppler_texts_DEPENDENCIES) $(EXTRA_poppler_texts_DEPENDENCIES) + @rm -f poppler-texts$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(poppler_texts_OBJECTS) $(poppler_texts_LDADD) $(LIBS) +stress-poppler-dir$(EXEEXT): $(stress_poppler_dir_OBJECTS) $(stress_poppler_dir_DEPENDENCIES) $(EXTRA_stress_poppler_dir_DEPENDENCIES) + @rm -f stress-poppler-dir$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(stress_poppler_dir_OBJECTS) $(stress_poppler_dir_LDADD) $(LIBS) +stress-poppler-qt4$(EXEEXT): $(stress_poppler_qt4_OBJECTS) $(stress_poppler_qt4_DEPENDENCIES) $(EXTRA_stress_poppler_qt4_DEPENDENCIES) + @rm -f stress-poppler-qt4$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(stress_poppler_qt4_OBJECTS) $(stress_poppler_qt4_LDADD) $(LIBS) +test-password-qt4$(EXEEXT): $(test_password_qt4_OBJECTS) $(test_password_qt4_DEPENDENCIES) $(EXTRA_test_password_qt4_DEPENDENCIES) + @rm -f test-password-qt4$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(test_password_qt4_OBJECTS) $(test_password_qt4_LDADD) $(LIBS) +test-poppler-qt4$(EXEEXT): $(test_poppler_qt4_OBJECTS) $(test_poppler_qt4_DEPENDENCIES) $(EXTRA_test_poppler_qt4_DEPENDENCIES) + @rm -f test-poppler-qt4$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(test_poppler_qt4_OBJECTS) $(test_poppler_qt4_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_actualtext.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_attachments.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_dateConversion.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_fonts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_links.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_metadata.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_optcontent.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_pagelayout.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_pagemode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_password.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_permissions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_search.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_strings.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-attachments.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-fonts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poppler-texts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress-poppler-dir.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress-poppler-qt4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-password-qt4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-poppler-qt4.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + fi; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstPROGRAMS ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +SUFFIXES: .moc + +.cpp.moc: + $(AM_V_GEN) $(MOCQT4) -i $< -o $@ + +clean-generic: + rm -f *.moc +@BUILD_POPPLER_QT4_TRUE@check_attachments.$(OBJEXT): check_attachments.moc +@BUILD_POPPLER_QT4_TRUE@check_actualtext.$(OBJEXT): check_actualtext.moc +@BUILD_POPPLER_QT4_TRUE@check_dateConversion.$(OBJEXT): check_dateConversion.moc +@BUILD_POPPLER_QT4_TRUE@check_fonts.$(OBJEXT): check_fonts.moc +@BUILD_POPPLER_QT4_TRUE@check_links.$(OBJEXT): check_links.moc +@BUILD_POPPLER_QT4_TRUE@check_metadata.$(OBJEXT): check_metadata.moc +@BUILD_POPPLER_QT4_TRUE@check_optcontent.$(OBJEXT): check_optcontent.moc +@BUILD_POPPLER_QT4_TRUE@check_pagemode.$(OBJEXT): check_pagemode.moc +@BUILD_POPPLER_QT4_TRUE@check_permissions.$(OBJEXT): check_permissions.moc +@BUILD_POPPLER_QT4_TRUE@check_pagelayout.$(OBJEXT): check_pagelayout.moc +@BUILD_POPPLER_QT4_TRUE@check_password.$(OBJEXT): check_password.moc +@BUILD_POPPLER_QT4_TRUE@check_search.$(OBJEXT): check_search.moc +@BUILD_POPPLER_QT4_TRUE@check_strings.$(OBJEXT): check_strings.moc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/qt4/tests/check_actualtext.cpp b/qt4/tests/check_actualtext.cpp new file mode 100644 index 0000000..5c765c5 --- /dev/null +++ b/qt4/tests/check_actualtext.cpp @@ -0,0 +1,33 @@ +#include + +#include + +#include + +class TestActualText: public QObject +{ + Q_OBJECT +private slots: + void checkActualText1(); +}; + +void TestActualText::checkActualText1() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(0); + QVERIFY( page ); + + QCOMPARE( page->text(QRectF()), QString("The slow brown fox jumps over the black dog.") ); + + delete page; + + delete doc; +} + +QTEST_MAIN(TestActualText) + +#include "check_actualtext.moc" + diff --git a/qt4/tests/check_attachments.cpp b/qt4/tests/check_attachments.cpp new file mode 100644 index 0000000..73e3150 --- /dev/null +++ b/qt4/tests/check_attachments.cpp @@ -0,0 +1,157 @@ +#include + +#include + +#include + +class TestAttachments: public QObject +{ + Q_OBJECT +private slots: + void checkNoAttachments(); + void checkAttach1(); + void checkAttach2(); + void checkAttach3(); + void checkAttach4(); +}; + +void TestAttachments::checkNoAttachments() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->hasEmbeddedFiles(), false ); + + delete doc; +} + +void TestAttachments::checkAttach1() +{ + + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithAttachments.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasEmbeddedFiles() ); + + QList fileList = doc->embeddedFiles(); + QCOMPARE( fileList.size(), 2 ); + + Poppler::EmbeddedFile *embfile = fileList.at(0); + QCOMPARE( embfile->name(), QString( "kroller.png" ) ); + QCOMPARE( embfile->description(), QString() ); + QCOMPARE( embfile->createDate(), QDateTime( QDate(), QTime() ) ); + QCOMPARE( embfile->modDate(), QDateTime( QDate(), QTime() ) ); + QCOMPARE( embfile->mimeType(), QString() ); + + QFile file(TESTDATADIR "/unittestcases/kroller.png" ); + QVERIFY( file.open( QIODevice::ReadOnly ) ); + QByteArray krollerData = file.readAll(); + QByteArray embdata = embfile->data(); + QCOMPARE( krollerData, embdata ); + + + Poppler::EmbeddedFile *embfile2 = fileList.at(1); + QCOMPARE( embfile2->name(), QString("gnome-64.gif") ); + QCOMPARE( embfile2->description(), QString() ); + QCOMPARE( embfile2->modDate(), QDateTime( QDate(), QTime() ) ); + QCOMPARE( embfile2->createDate(), QDateTime( QDate(), QTime() ) ); + QCOMPARE( embfile2->mimeType(), QString() ); + + QFile file2(TESTDATADIR "/unittestcases/gnome-64.gif" ); + QVERIFY( file2.open( QIODevice::ReadOnly ) ); + QByteArray g64Data = file2.readAll(); + QByteArray emb2data = embfile2->data(); + QCOMPARE( g64Data, emb2data ); + + delete doc; +} + + +void TestAttachments::checkAttach2() +{ + + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/A6EmbeddedFiles.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasEmbeddedFiles() ); + + QList fileList; + fileList = doc->embeddedFiles(); + QCOMPARE( fileList.size(), 3 ); + + Poppler::EmbeddedFile *embfile1 = fileList.at(0); + QCOMPARE( embfile1->name(), QString("Acro7 thoughts") ); + QCOMPARE( embfile1->description(), QString() ); + QCOMPARE( embfile1->createDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 13, 54, 54), Qt::UTC ) ); + QCOMPARE( embfile1->modDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 14, 15, 27), Qt::UTC ) ); + QCOMPARE( embfile1->mimeType(), QString("text/xml") ); + + Poppler::EmbeddedFile *embfile2 = fileList.at(1); + QCOMPARE( embfile2->name(), QString("acro transitions 1.xls") ); + QCOMPARE( embfile2->description(), QString() ); + QCOMPARE( embfile2->createDate(), QDateTime( QDate( 2003, 7, 18 ), QTime( 21, 7, 16), Qt::UTC ) ); + QCOMPARE( embfile2->modDate(), QDateTime( QDate( 2003, 7, 22 ), QTime( 13, 4, 40), Qt::UTC ) ); + QCOMPARE( embfile2->mimeType(), QString("application/excel") ); + + Poppler::EmbeddedFile *embfile3 = fileList.at(2); + QCOMPARE( embfile3->name(), QString("apago_pdfe_wide.gif") ); + QCOMPARE( embfile3->description(), QString() ); + QCOMPARE( embfile3->createDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 54, 29), Qt::UTC ) ); + QCOMPARE( embfile3->modDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 52, 58), Qt::UTC ) ); + QCOMPARE( embfile3->mimeType(), QString() ); + + delete doc; +} + +void TestAttachments::checkAttach3() +{ + + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/shapes+attachments.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasEmbeddedFiles() ); + + QList fileList; + fileList = doc->embeddedFiles(); + QCOMPARE( fileList.size(), 1 ); + + Poppler::EmbeddedFile *embfile = fileList.at(0); + QCOMPARE( embfile->name(), QString( "ADEX1.xpdf.pgp" ) ); + QCOMPARE( embfile->description(), QString() ); + QCOMPARE( embfile->createDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) ); + QCOMPARE( embfile->modDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) ); + QCOMPARE( embfile->mimeType(), QString() ); + delete doc; + +} + +void TestAttachments::checkAttach4() +{ + + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/imageretrieve+attachment.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasEmbeddedFiles() ); + + QList fileList; + fileList = doc->embeddedFiles(); + QCOMPARE( fileList.size(), 1 ); + + Poppler::EmbeddedFile *embfile = fileList.at(0); + QCOMPARE( embfile->name(), QString( "export-altona.csv" ) ); + QCOMPARE( embfile->description(), QString("Altona Export") ); + QCOMPARE( embfile->createDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 35), Qt::UTC ) ); + QCOMPARE( embfile->modDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 52), Qt::UTC ) ); + QCOMPARE( embfile->mimeType(), QString("application/vnd.ms-excel") ); + delete doc; + +} + +QTEST_MAIN(TestAttachments) +#include "check_attachments.moc" + diff --git a/qt4/tests/check_dateConversion.cpp b/qt4/tests/check_dateConversion.cpp new file mode 100644 index 0000000..c1f84e2 --- /dev/null +++ b/qt4/tests/check_dateConversion.cpp @@ -0,0 +1,142 @@ +#include + +Q_DECLARE_METATYPE(QDate) +Q_DECLARE_METATYPE(QTime) + +#include + +class TestDateConv: public QObject +{ + Q_OBJECT +private slots: + void initTestCase(); + void checkDates_data(); + void checkDates(); + void checkInvalidDates_data(); + void checkInvalidDates(); +}; + +void TestDateConv::initTestCase() +{ + qRegisterMetaType("QDate"); + qRegisterMetaType("QTime"); +} + +void TestDateConv::checkDates_data() +{ + QTest::addColumn("input"); + QTest::addColumn("day"); + QTest::addColumn("time"); + + // This is a typical case - all data provided + QTest::newRow("D:20040101121110") + << QByteArray("D:20040101121110Z") + << QDate( 2004, 1, 1) + << QTime( 12, 11, 10); + + // The D: is strongly recommended, but optional + QTest::newRow("20040101121110") + << QByteArray("20040101121110Z") + << QDate( 2004, 1, 1) + << QTime( 12, 11, 10); + + // Only the year is actually required + QTest::newRow("D:2006") + << QByteArray("D:2006") + << QDate( 2006, 1, 1) + << QTime( 0, 0, 0); + + QTest::newRow("D:200602") + << QByteArray("D:200602") + << QDate( 2006, 2, 1) + << QTime( 0, 0, 0); + + QTest::newRow("D:20060304") + << QByteArray("D:20060304") + << QDate( 2006, 3, 4) + << QTime( 0, 0, 0); + + QTest::newRow("D:2006030405") + << QByteArray("D:2006030405") + << QDate( 2006, 3, 4) + << QTime( 5, 0, 0); + + QTest::newRow("D:200603040512") + << QByteArray("D:200603040512") + << QDate( 2006, 3, 4) + << QTime( 5, 12, 0); + + // If the timezone isn't specified, I assume UTC + QTest::newRow("D:20060304051226") + << QByteArray("D:20060304051226") + << QDate( 2006, 3, 4) + << QTime( 5, 12, 26); + + // Check for real timezone conversions + QTest::newRow("D:20030131115258-04'00'") + << QByteArray("D:20030131115258-04'00'") + << QDate( 2003, 1, 31) + << QTime( 15, 52, 58); + + QTest::newRow("D:20030131115258+05'00'") + << QByteArray("D:20030131115258+05'00'") + << QDate( 2003, 1, 31) + << QTime( 6, 52, 58); + + // There are places that have non-hour offsets + // Yep, that means you Adelaide. + QTest::newRow("D:20030131115258+08'30'") + << QByteArray("D:20030131115258+08'30'") + << QDate( 2003, 1, 31) + << QTime( 3, 22, 58); + + QTest::newRow("D:20030131115258-08'30'") + << QByteArray("D:20030131115258-08'30'") + << QDate( 2003, 1, 31) + << QTime( 20, 22, 58); +} + +void TestDateConv::checkDates() +{ + QFETCH(QByteArray, input); + QFETCH(QDate, day); + QFETCH(QTime, time); + + QCOMPARE( Poppler::convertDate(input.data()), QDateTime(day, time, Qt::UTC) ); +} + +void TestDateConv::checkInvalidDates_data() +{ + QTest::addColumn("input"); + + // Null data + QTest::newRow("Null data") + << QByteArray(); + + // Empty data + QTest::newRow("Empty data") + << QByteArray(""); + + // Empty data + QTest::newRow("One character") + << QByteArray("D"); + + // Empty data + QTest::newRow("'D:'") + << QByteArray("D:"); + + // Empty data + QTest::newRow("Not a date") + << QByteArray("D:IAmNotAValidDate"); +} + +void TestDateConv::checkInvalidDates() +{ + QFETCH(QByteArray, input); + + QCOMPARE(Poppler::convertDate(input.data()), QDateTime()); +} + +QTEST_MAIN(TestDateConv) + +#include "check_dateConversion.moc" diff --git a/qt4/tests/check_fonts.cpp b/qt4/tests/check_fonts.cpp new file mode 100644 index 0000000..c57b6da --- /dev/null +++ b/qt4/tests/check_fonts.cpp @@ -0,0 +1,246 @@ +#include + +#include + +#include + +class TestFontsData: public QObject +{ + Q_OBJECT +private slots: + void checkNoFonts(); + void checkType1(); + void checkType3(); + void checkTrueType(); + void checkFontIterator(); + void checkSecondDocumentQuery(); + void checkMultipleIterations(); + void checkScanForFonts(); +}; + + +QList loadFontsViaIterator( Poppler::Document *doc, int from = 0, int count = -1 ) +{ + int num = count == -1 ? doc->numPages() - from : count; + QList list; + std::auto_ptr< Poppler::FontIterator > it( doc->newFontIterator( from ) ); + while ( it->hasNext() && num ) + { + list += it->next(); + --num; + } + return list; +} + +bool operator==( const Poppler::FontInfo &f1, const Poppler::FontInfo &f2 ) +{ + if ( f1.name() != f2.name() ) + return false; + if ( f1.file() != f2.file() ) + return false; + if ( f1.isEmbedded() != f2.isEmbedded() ) + return false; + if ( f1.isSubset() != f2.isSubset() ) + return false; + if ( f1.type() != f2.type() ) + return false; + if ( f1.typeName() != f2.typeName() ) + return false; + return true; +} + + +void TestFontsData::checkNoFonts() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/image.pdf"); + QVERIFY( doc ); + + QList listOfFonts = doc->fonts(); + QCOMPARE( listOfFonts.size(), 0 ); + + delete doc; +} + +void TestFontsData::checkType1() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/text.pdf"); + QVERIFY( doc ); + + QList listOfFonts = doc->fonts(); + QCOMPARE( listOfFonts.size(), 1 ); + QCOMPARE( listOfFonts.at(0).name(), QString("Helvetica") ); + QCOMPARE( listOfFonts.at(0).type(), Poppler::FontInfo::Type1 ); + QCOMPARE( listOfFonts.at(0).typeName(), QString("Type 1") ); + + QCOMPARE( listOfFonts.at(0).isEmbedded(), false ); + QCOMPARE( listOfFonts.at(0).isSubset(), false ); + + delete doc; +} + +void TestFontsData::checkType3() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf"); + QVERIFY( doc ); + + QList listOfFonts = doc->fonts(); + QCOMPARE( listOfFonts.size(), 2 ); + QCOMPARE( listOfFonts.at(0).name(), QString("Helvetica") ); + QCOMPARE( listOfFonts.at(0).type(), Poppler::FontInfo::Type1 ); + QCOMPARE( listOfFonts.at(0).typeName(), QString("Type 1") ); + + QCOMPARE( listOfFonts.at(0).isEmbedded(), false ); + QCOMPARE( listOfFonts.at(0).isSubset(), false ); + + QCOMPARE( listOfFonts.at(1).name(), QString("") ); + QCOMPARE( listOfFonts.at(1).type(), Poppler::FontInfo::Type3 ); + QCOMPARE( listOfFonts.at(1).typeName(), QString("Type 3") ); + + QCOMPARE( listOfFonts.at(1).isEmbedded(), true ); + QCOMPARE( listOfFonts.at(1).isSubset(), false ); + + delete doc; +} + +void TestFontsData::checkTrueType() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + + QList listOfFonts = doc->fonts(); + QCOMPARE( listOfFonts.size(), 2 ); + QCOMPARE( listOfFonts.at(0).name(), QString("Arial-BoldMT") ); + QCOMPARE( listOfFonts.at(0).type(), Poppler::FontInfo::TrueType ); + QCOMPARE( listOfFonts.at(0).typeName(), QString("TrueType") ); + + QCOMPARE( listOfFonts.at(0).isEmbedded(), false ); + QCOMPARE( listOfFonts.at(0).isSubset(), false ); + + QCOMPARE( listOfFonts.at(1).name(), QString("ArialMT") ); + QCOMPARE( listOfFonts.at(1).type(), Poppler::FontInfo::TrueType ); + QCOMPARE( listOfFonts.at(1).typeName(), QString("TrueType") ); + + QCOMPARE( listOfFonts.at(1).isEmbedded(), false ); + QCOMPARE( listOfFonts.at(1).isSubset(), false ); + + delete doc; +} + +void TestFontsData::checkFontIterator() +{ + // loading a 1-page document + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf"); + QVERIFY( doc ); + // loading a 6-pages document + Poppler::Document *doc6 = Poppler::Document::load(TESTDATADIR "/tests/cropbox.pdf"); + QVERIFY( doc6 ); + + std::auto_ptr< Poppler::FontIterator > it; + + // some tests with the 1-page document: + // - check a default iterator + it.reset( doc->newFontIterator() ); + QVERIFY( it->hasNext() ); + // - check an iterator for negative pages to behave as 0 + it.reset( doc->newFontIterator( -1 ) ); + QVERIFY( it->hasNext() ); + // - check an iterator for pages out of the page limit + it.reset( doc->newFontIterator( 1 ) ); + QVERIFY( !it->hasNext() ); + // - check that it reaches the end after 1 iteration + it.reset( doc->newFontIterator() ); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( !it->hasNext() ); + + // some tests with the 6-page document: + // - check a default iterator + it.reset( doc6->newFontIterator() ); + QVERIFY( it->hasNext() ); + // - check an iterator for pages out of the page limit + it.reset( doc6->newFontIterator( 6 ) ); + QVERIFY( !it->hasNext() ); + // - check that it reaches the end after 6 iterations + it.reset( doc6->newFontIterator() ); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( it->hasNext() ); + it->next(); + QVERIFY( !it->hasNext() ); + + delete doc; + delete doc6; +} + +void TestFontsData::checkSecondDocumentQuery() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf"); + QVERIFY( doc ); + + QList listOfFonts = doc->fonts(); + QCOMPARE( listOfFonts.size(), 2 ); + // check we get the very same result when calling fonts() again (#19405) + QList listOfFonts2 = doc->fonts(); + QCOMPARE( listOfFonts, listOfFonts2 ); + + delete doc; +} + +void TestFontsData::checkMultipleIterations() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/type3.pdf"); + QVERIFY( doc ); + + QList listOfFonts = loadFontsViaIterator( doc ); + QCOMPARE( listOfFonts.size(), 2 ); + QList listOfFonts2 = loadFontsViaIterator( doc ); + QCOMPARE( listOfFonts, listOfFonts2 ); + + delete doc; +} + +void TestFontsData::checkScanForFonts() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/tests/fonts.pdf"); + QVERIFY( doc ); + + QList listOfFonts = doc->fonts(); + QCOMPARE( listOfFonts.size(), 3 ); + // check we get the very same result when gatering fonts using scanForFonts + QList listOfFonts2; + for ( int i = 0; i < doc->numPages(); ++i ) + { + doc->scanForFonts( 1, &listOfFonts2 ); + } + QCOMPARE( listOfFonts, listOfFonts2 ); + + // check doing a second scanForFonts gives no result + QList listOfFonts3; + for ( int i = 0; i < doc->numPages(); ++i ) + { + doc->scanForFonts( 1, &listOfFonts3 ); + } + QVERIFY( listOfFonts3.isEmpty() ); + + delete doc; +} + +QTEST_MAIN(TestFontsData) +#include "check_fonts.moc" + diff --git a/qt4/tests/check_links.cpp b/qt4/tests/check_links.cpp new file mode 100644 index 0000000..b5b2dee --- /dev/null +++ b/qt4/tests/check_links.cpp @@ -0,0 +1,96 @@ +#include + +#include + +#include + +class TestLinks : public QObject +{ + Q_OBJECT +private slots: + void checkDocumentWithNoDests(); + void checkDests_xr01(); + void checkDests_xr02(); +}; + +bool isDestinationValid_pageNumber( const Poppler::LinkDestination *dest, const Poppler::Document *doc ) +{ + return dest->pageNumber() > 0 && dest->pageNumber() <= doc->numPages(); +} + +bool isDestinationValid_name( const Poppler::LinkDestination *dest ) +{ + return !dest->destinationName().isEmpty(); +} + + +void TestLinks::checkDocumentWithNoDests() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithAttachments.pdf"); + QVERIFY( doc ); + + std::auto_ptr< Poppler::LinkDestination > dest; + dest.reset( doc->linkDestination("no.dests.in.this.document") ); + QVERIFY( !isDestinationValid_pageNumber( dest.get(), doc ) ); + QVERIFY( isDestinationValid_name( dest.get() ) ); + + delete doc; +} + +void TestLinks::checkDests_xr01() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(0); + QVERIFY( page ); + + QList< Poppler::Link* > links = page->links(); + QCOMPARE( links.count(), 2 ); + + { + QCOMPARE( links.at(0)->linkType(), Poppler::Link::Goto ); + Poppler::LinkGoto *link = static_cast< Poppler::LinkGoto * >( links.at(0) ); + const Poppler::LinkDestination dest = link->destination(); + QVERIFY( !isDestinationValid_pageNumber( &dest, doc ) ); + QVERIFY( isDestinationValid_name( &dest ) ); + QCOMPARE( dest.destinationName(), QString::fromLatin1("section.1") ); + } + + { + QCOMPARE( links.at(1)->linkType(), Poppler::Link::Goto ); + Poppler::LinkGoto *link = static_cast< Poppler::LinkGoto * >( links.at(1) ); + const Poppler::LinkDestination dest = link->destination(); + QVERIFY( !isDestinationValid_pageNumber( &dest, doc ) ); + QVERIFY( isDestinationValid_name( &dest ) ); + QCOMPARE( dest.destinationName(), QString::fromLatin1("section.2") ); + } + + delete doc; +} + +void TestLinks::checkDests_xr02() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr02.pdf"); + QVERIFY( doc ); + + std::auto_ptr< Poppler::LinkDestination > dest; + dest.reset( doc->linkDestination("section.1") ); + QVERIFY( isDestinationValid_pageNumber( dest.get(), doc ) ); + QVERIFY( !isDestinationValid_name( dest.get() ) ); + dest.reset( doc->linkDestination("section.2") ); + QVERIFY( isDestinationValid_pageNumber( dest.get(), doc ) ); + QVERIFY( !isDestinationValid_name( dest.get() ) ); + dest.reset( doc->linkDestination("section.3") ); + QVERIFY( !isDestinationValid_pageNumber( dest.get(), doc ) ); + QVERIFY( isDestinationValid_name( dest.get() ) ); + + delete doc; +} + +QTEST_MAIN(TestLinks) + +#include "check_links.moc" diff --git a/qt4/tests/check_metadata.cpp b/qt4/tests/check_metadata.cpp new file mode 100644 index 0000000..fb4f716 --- /dev/null +++ b/qt4/tests/check_metadata.cpp @@ -0,0 +1,275 @@ +#include + +#include + +class TestMetaData: public QObject +{ + Q_OBJECT +private slots: + void checkStrings_data(); + void checkStrings(); + void checkStrings2_data(); + void checkStrings2(); + void checkStringKeys(); + void checkLinearised(); + void checkNumPages(); + void checkDate(); + void checkPageSize(); + void checkPortraitOrientation(); + void checkLandscapeOrientation(); + void checkUpsideDownOrientation(); + void checkSeascapeOrientation(); + void checkVersion(); + void checkPdfId(); + void checkNoPdfId(); +}; + +void TestMetaData::checkStrings_data() +{ + QTest::addColumn("key"); + QTest::addColumn("value"); + + QTest::newRow( "Author" ) << "Author" << "Brad Hards"; + QTest::newRow( "Title" ) << "Title" << "Two pages"; + QTest::newRow( "Subject" ) << "Subject" + << "A two page layout for poppler testing"; + QTest::newRow( "Keywords" ) << "Keywords" << "Qt4 bindings"; + QTest::newRow( "Creator" ) << "Creator" << "iText: cgpdftops CUPS filter"; + QTest::newRow( "Producer" ) << "Producer" << "Acrobat Distiller 7.0 for Macintosh"; +} + +void TestMetaData::checkStrings() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf"); + QVERIFY( doc ); + + QFETCH( QString, key ); + QFETCH( QString, value ); + QCOMPARE( doc->info(key), value ); + + delete doc; +} + +void TestMetaData::checkStrings2_data() +{ + QTest::addColumn("key"); + QTest::addColumn("value"); + + QTest::newRow( "Title" ) << "Title" << "Malaga hotels"; + QTest::newRow( "Author" ) << "Author" << "Brad Hards"; + QTest::newRow( "Creator" ) << "Creator" << "Safari: cgpdftops CUPS filter"; + QTest::newRow( "Producer" ) << "Producer" << "Acrobat Distiller 7.0 for Macintosh"; + QTest::newRow( "Keywords" ) << "Keywords" << "First\rSecond\rthird"; + QTest::newRow( "Custom1" ) << "Custom1" << "CustomValue1"; + QTest::newRow( "Custom2" ) << "Custom2" << "CustomValue2"; +} + +void TestMetaData::checkStrings2() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + + QFETCH( QString, key ); + QFETCH( QString, value ); + QCOMPARE( doc->info(key), value ); + + delete doc; +} + +void TestMetaData::checkStringKeys() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + + QStringList keyList; + keyList << "Title" << "Author" << "Creator" << "Keywords" << "CreationDate"; + keyList << "Producer" << "ModDate" << "Custom1" << "Custom2"; + keyList.sort(); + QStringList keysInDoc = doc->infoKeys(); + keysInDoc.sort(); + QCOMPARE( keysInDoc, keyList ); + + delete doc; +} + +void TestMetaData::checkLinearised() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->isLinearized() ); + + delete doc; + + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + QCOMPARE( doc->isLinearized(), false ); + + delete doc; +} + +void TestMetaData::checkPortraitOrientation() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(0); + QCOMPARE( page->orientation(), Poppler::Page::Portrait ); + + delete page; + delete doc; +} + +void TestMetaData::checkNumPages() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf"); + QVERIFY( doc ); + QCOMPARE( doc->numPages(), 2 ); + + delete doc; + + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + QCOMPARE( doc->numPages(), 1 ); + + delete doc; +} + +void TestMetaData::checkDate() +{ + Poppler::Document *doc; + + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + QCOMPARE( doc->date("ModDate"), QDateTime(QDate(2005, 12, 5), QTime(9,44,46), Qt::UTC ) ); + QCOMPARE( doc->date("CreationDate"), QDateTime(QDate(2005, 8, 13), QTime(1,12,11), Qt::UTC ) ); + + delete doc; +} + +void TestMetaData::checkPageSize() +{ + Poppler::Document *doc; + + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/truetype.pdf"); + QVERIFY( doc ); + Poppler::Page *page = doc->page(0); + QCOMPARE( page->pageSize(), QSize(595, 842) ); + QCOMPARE( page->pageSizeF(), QSizeF(595.22, 842) ); + + delete page; + delete doc; +} + + +void TestMetaData::checkLandscapeOrientation() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(1); + QCOMPARE( page->orientation(), Poppler::Page::Landscape ); + + delete page; + delete doc; +} + +void TestMetaData::checkUpsideDownOrientation() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(2); + QCOMPARE( page->orientation(), Poppler::Page::UpsideDown ); + + delete page; + delete doc; +} + +void TestMetaData::checkSeascapeOrientation() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(3); + QCOMPARE( page->orientation(), Poppler::Page::Seascape ); + + delete page; + delete doc; +} + +void TestMetaData::checkVersion() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pdfVersion(), 1.6 ); + int major = 0, minor = 0; + doc->getPdfVersion( &major, &minor ); + QCOMPARE( major, 1 ); + QCOMPARE( minor, 6 ); + + delete doc; +} + +void TestMetaData::checkPdfId() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/A6EmbeddedFiles.pdf"); + QVERIFY( doc ); + + const QByteArray referencePermanentId( "00C9D5B6D8FB11D7A902003065D630AA" ); + const QByteArray referenceUpdateId( "39AECAE6D8FB11D7A902003065D630AA" ); + + { + // no IDs wanted, just existance check + QVERIFY( doc->getPdfId( 0, 0 ) ); + } + { + // only permanent ID + QByteArray permanentId; + QVERIFY( doc->getPdfId( &permanentId, 0 ) ); + QCOMPARE( permanentId.toUpper(), referencePermanentId ); + } + { + // only update ID + QByteArray updateId; + QVERIFY( doc->getPdfId( 0, &updateId ) ); + QCOMPARE( updateId.toUpper(), referenceUpdateId ); + } + { + // both IDs + QByteArray permanentId; + QByteArray updateId; + QVERIFY( doc->getPdfId( &permanentId, &updateId ) ); + QCOMPARE( permanentId.toUpper(), referencePermanentId ); + QCOMPARE( updateId.toUpper(), referenceUpdateId ); + } + + delete doc; +} + +void TestMetaData::checkNoPdfId() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/WithActualText.pdf"); + QVERIFY( doc ); + + QVERIFY( !doc->getPdfId( 0, 0 ) ); + + delete doc; +} + +QTEST_MAIN(TestMetaData) +#include "check_metadata.moc" + diff --git a/qt4/tests/check_optcontent.cpp b/qt4/tests/check_optcontent.cpp new file mode 100644 index 0000000..22b14a4 --- /dev/null +++ b/qt4/tests/check_optcontent.cpp @@ -0,0 +1,484 @@ +#include + +#include "PDFDoc.h" +#include "GlobalParams.h" + +#include + +class TestOptionalContent: public QObject +{ + Q_OBJECT +private slots: + void checkVisPolicy(); + void checkNestedLayers(); + void checkNoOptionalContent(); + void checkIsVisible(); + void checkVisibilitySetting(); + void checkRadioButtons(); +}; + +void TestOptionalContent::checkVisPolicy() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/vis_policy_test.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasOptionalContent() ); + + Poppler::OptContentModel *optContent = doc->optionalContentModel(); + QModelIndex index; + index = optContent->index( 0, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "A" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + index = optContent->index( 1, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "B" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + delete doc; +} + +void TestOptionalContent::checkNestedLayers() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/NestedLayers.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasOptionalContent() ); + + Poppler::OptContentModel *optContent = doc->optionalContentModel(); + QModelIndex index; + + index = optContent->index( 0, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Black Text and Green Snow" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + index = optContent->index( 1, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Mountains and Image" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + // This is a sub-item of "Mountains and Image" + QModelIndex subindex = optContent->index( 0, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Image" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + index = optContent->index( 2, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Starburst" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + index = optContent->index( 3, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Watermark" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + delete doc; +} + +void TestOptionalContent::checkNoOptionalContent() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->hasOptionalContent(), false ); + + delete doc; +} + +void TestOptionalContent::checkIsVisible() +{ + GooString *fileName = new GooString(TESTDATADIR "/unittestcases/vis_policy_test.pdf"); + globalParams = new GlobalParams(); + PDFDoc *doc = new PDFDoc( fileName ); + QVERIFY( doc ); + + OCGs *ocgs = doc->getOptContentConfig(); + QVERIFY( ocgs ); + + XRef *xref = doc->getXRef(); + + Object obj; + + // In this test, both Ref(21,0) and Ref(2,0) are set to On + + // AnyOn, one element array: + // 22 0 obj<>endobj + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QVERIFY( ocgs->optContentIsVisible( &obj ) ); + obj.free(); + + // Same again, looking for any leaks or dubious free()'s + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QVERIFY( ocgs->optContentIsVisible( &obj ) ); + obj.free(); + + // AnyOff, one element array: + // 29 0 obj<>endobj + xref->fetch( 29, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOn, one element array: + // 36 0 obj<>endobj + xref->fetch( 36, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + + // AllOff, one element array: + // 43 0 obj<>endobj + xref->fetch( 43, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AnyOn, multi-element array: + // 50 0 obj<>endobj + xref->fetch( 50, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AnyOff, multi-element array: + // 57 0 obj<>endobj + xref->fetch( 57, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOn, multi-element array: + // 64 0 obj<>endobj + xref->fetch( 64, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOff, multi-element array: + // 71 0 obj<>endobj + xref->fetch( 71, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + delete doc; + delete globalParams; +} + +void TestOptionalContent::checkVisibilitySetting() +{ + globalParams = new GlobalParams(); + GooString *fileName = new GooString(TESTDATADIR "/unittestcases/vis_policy_test.pdf"); + PDFDoc *doc = new PDFDoc( fileName ); + QVERIFY( doc ); + + OCGs *ocgs = doc->getOptContentConfig(); + QVERIFY( ocgs ); + + XRef *xref = doc->getXRef(); + + Object obj; + + // In this test, both Ref(21,0) and Ref(28,0) start On, + // based on the file settings + Object ref21obj; + ref21obj.initRef( 21, 0 ); + Ref ref21 = ref21obj.getRef(); + OptionalContentGroup *ocgA = ocgs->findOcgByRef( ref21 ); + QVERIFY( ocgA ); + + QVERIFY( (ocgA->getName()->cmp("A")) == 0 ); + QCOMPARE( ocgA->getState(), OptionalContentGroup::On ); + + Object ref28obj; + ref28obj.initRef( 28, 0 ); + Ref ref28 = ref28obj.getRef(); + OptionalContentGroup *ocgB = ocgs->findOcgByRef( ref28 ); + QVERIFY( ocgB ); + + QVERIFY( (ocgB->getName()->cmp("B")) == 0 ); + QCOMPARE( ocgB->getState(), OptionalContentGroup::On ); + + // turn one Off + ocgA->setState( OptionalContentGroup::Off ); + + // AnyOn, one element array: + // 22 0 obj<>endobj + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // Same again, looking for any leaks or dubious free()'s + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AnyOff, one element array: + // 29 0 obj<>endobj + xref->fetch( 29, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOn, one element array: + // 36 0 obj<>endobj + xref->fetch( 36, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOff, one element array: + // 43 0 obj<>endobj + xref->fetch( 43, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AnyOn, multi-element array: + // 50 0 obj<>endobj + xref->fetch( 50, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AnyOff, multi-element array: + // 57 0 obj<>endobj + xref->fetch( 57, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOn, multi-element array: + // 64 0 obj<>endobj + xref->fetch( 64, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOff, multi-element array: + // 71 0 obj<>endobj + xref->fetch( 71, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + + // Turn the other one off as well (i.e. both are Off) + ocgB->setState(OptionalContentGroup::Off); + + // AnyOn, one element array: + // 22 0 obj<>endobj + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // Same again, looking for any leaks or dubious free()'s + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AnyOff, one element array: + // 29 0 obj<>endobj + xref->fetch( 29, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOn, one element array: + // 36 0 obj<>endobj + xref->fetch( 36, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOff, one element array: + // 43 0 obj<>endobj + xref->fetch( 43, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AnyOn, multi-element array: + // 50 0 obj<>endobj + xref->fetch( 50, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AnyOff, multi-element array: + // 57 0 obj<>endobj + xref->fetch( 57, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOn, multi-element array: + // 64 0 obj<>endobj + xref->fetch( 64, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOff, multi-element array: + // 71 0 obj<>endobj + xref->fetch( 71, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + + // Turn the first one on again (21 is On, 28 is Off) + ocgA->setState(OptionalContentGroup::On); + + // AnyOn, one element array: + // 22 0 obj<>endobj + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // Same again, looking for any leaks or dubious free()'s + xref->fetch( 22, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AnyOff, one element array: + // 29 0 obj<>endobj + xref->fetch( 29, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOn, one element array: + // 36 0 obj<>endobj + xref->fetch( 36, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOff, one element array: + // 43 0 obj<>endobj + xref->fetch( 43, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AnyOn, multi-element array: + // 50 0 obj<>endobj + xref->fetch( 50, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AnyOff, multi-element array: + // 57 0 obj<>endobj + xref->fetch( 57, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), true ); + obj.free(); + + // AllOn, multi-element array: + // 64 0 obj<>endobj + xref->fetch( 64, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + // AllOff, multi-element array: + // 71 0 obj<>endobj + xref->fetch( 71, 0, &obj ); + QVERIFY( obj.isDict() ); + QCOMPARE( ocgs->optContentIsVisible( &obj ), false ); + obj.free(); + + delete doc; + delete globalParams; +} + +void TestOptionalContent::checkRadioButtons() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/ClarityOCGs.pdf"); + QVERIFY( doc ); + + QVERIFY( doc->hasOptionalContent() ); + + Poppler::OptContentModel *optContent = doc->optionalContentModel(); + QModelIndex index; + + index = optContent->index( 0, 0, QModelIndex() ); + QCOMPARE( optContent->data( index, Qt::DisplayRole ).toString(), QString( "Languages" ) ); + QCOMPARE( static_cast( optContent->data( index, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + // These are sub-items of the "Languages" label + QModelIndex subindex = optContent->index( 0, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + subindex = optContent->index( 1, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + subindex = optContent->index( 2, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + // RBGroup of languages, so turning on Japanese should turn off English + QVERIFY( optContent->setData( subindex, QVariant( true ), Qt::CheckStateRole ) ); + + subindex = optContent->index( 0, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + subindex = optContent->index( 2, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + subindex = optContent->index( 1, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + // and turning on French should turn off Japanese + QVERIFY( optContent->setData( subindex, QVariant( true ), Qt::CheckStateRole ) ); + + subindex = optContent->index( 0, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + subindex = optContent->index( 2, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + subindex = optContent->index( 1, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Checked ); + + + // and turning off French should leave them all off + QVERIFY( optContent->setData( subindex, QVariant( false ), Qt::CheckStateRole ) ); + + subindex = optContent->index( 0, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "English" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + subindex = optContent->index( 2, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "Japanese" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + subindex = optContent->index( 1, 0, index ); + QCOMPARE( optContent->data( subindex, Qt::DisplayRole ).toString(), QString( "French" ) ); + QCOMPARE( static_cast( optContent->data( subindex, Qt::CheckStateRole ).toInt() ), Qt::Unchecked ); + + delete doc; +} + +QTEST_MAIN(TestOptionalContent) + +#include "check_optcontent.moc" + diff --git a/qt4/tests/check_pagelayout.cpp b/qt4/tests/check_pagelayout.cpp new file mode 100644 index 0000000..6108f88 --- /dev/null +++ b/qt4/tests/check_pagelayout.cpp @@ -0,0 +1,49 @@ +#include + +#include + +class TestPageLayout: public QObject +{ + Q_OBJECT +private slots: + void checkNone(); + void checkSingle(); + void checkFacing(); +}; + +void TestPageLayout::checkNone() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseNone.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageLayout(), Poppler::Document::NoLayout ); + + delete doc; +} + +void TestPageLayout::checkSingle() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/FullScreen.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageLayout(), Poppler::Document::SinglePage ); + + delete doc; +} + +void TestPageLayout::checkFacing() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/doublepage.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageLayout(), Poppler::Document::TwoPageRight ); + + delete doc; +} + +QTEST_MAIN(TestPageLayout) +#include "check_pagelayout.moc" + diff --git a/qt4/tests/check_pagemode.cpp b/qt4/tests/check_pagemode.cpp new file mode 100644 index 0000000..0565fe2 --- /dev/null +++ b/qt4/tests/check_pagemode.cpp @@ -0,0 +1,73 @@ +#include + +#include + +class TestPageMode: public QObject +{ + Q_OBJECT +private slots: + void checkNone(); + void checkFullScreen(); + void checkAttachments(); + void checkThumbs(); + void checkOC(); +}; + +void TestPageMode::checkNone() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseNone.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageMode(), Poppler::Document::UseNone ); + + delete doc; +} + +void TestPageMode::checkFullScreen() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/FullScreen.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageMode(), Poppler::Document::FullScreen ); + + delete doc; +} + +void TestPageMode::checkAttachments() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseAttachments.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageMode(), Poppler::Document::UseAttach ); + + delete doc; +} + +void TestPageMode::checkThumbs() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseThumbs.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageMode(), Poppler::Document::UseThumbs ); + + delete doc; +} + +void TestPageMode::checkOC() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/UseOC.pdf"); + QVERIFY( doc ); + + QCOMPARE( doc->pageMode(), Poppler::Document::UseOC ); + + delete doc; +} + +QTEST_MAIN(TestPageMode) +#include "check_pagemode.moc" + diff --git a/qt4/tests/check_password.cpp b/qt4/tests/check_password.cpp new file mode 100644 index 0000000..4c7dcd1 --- /dev/null +++ b/qt4/tests/check_password.cpp @@ -0,0 +1,88 @@ +#include + +#include + +class TestPassword: public QObject +{ + Q_OBJECT +private slots: + void password1(); + void password1a(); + void password2(); + void password2a(); + void password2b(); + void password3(); +}; + + +// BUG:4557 +void TestPassword::password1() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - open.pdf"), "", QString::fromUtf8("garçon").toLatin1() ); + QVERIFY( doc ); + QVERIFY( !doc->isLocked() ); + + delete doc; +} + + +void TestPassword::password1a() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - open.pdf") ); + QVERIFY( doc ); + QVERIFY( doc->isLocked() ); + QVERIFY( !doc->unlock( "", QString::fromUtf8("garçon").toLatin1() ) ); + QVERIFY( !doc->isLocked() ); + + delete doc; +} + +void TestPassword::password2() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - owner.pdf"), QString::fromUtf8("garçon").toLatin1(), "" ); + QVERIFY( doc ); + QVERIFY( !doc->isLocked() ); + + delete doc; +} + +void TestPassword::password2a() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - owner.pdf"), QString::fromUtf8("garçon").toLatin1() ); + QVERIFY( doc ); + QVERIFY( !doc->isLocked() ); + + delete doc; +} + +void TestPassword::password2b() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(QString::fromUtf8(TESTDATADIR "/unittestcases/Gday garçon - owner.pdf") ); + QVERIFY( doc ); + QVERIFY( !doc->isLocked() ); + QVERIFY( !doc->unlock( QString::fromUtf8("garçon").toLatin1(), "" ) ); + QVERIFY( !doc->isLocked() ); + + delete doc; +} + +void TestPassword::password3() +{ + Poppler::Document *doc; + doc = Poppler::Document::load( QString::fromUtf8(TESTDATADIR "/unittestcases/PasswordEncrypted.pdf") ); + QVERIFY( doc ); + QVERIFY( doc->isLocked() ); + QVERIFY( !doc->unlock( "", "password" ) ); + QVERIFY( !doc->isLocked() ); + + delete doc; +} + +QTEST_MAIN(TestPassword) +#include "check_password.moc" + diff --git a/qt4/tests/check_permissions.cpp b/qt4/tests/check_permissions.cpp new file mode 100644 index 0000000..a3f3bdc --- /dev/null +++ b/qt4/tests/check_permissions.cpp @@ -0,0 +1,44 @@ +#include + +#include + +class TestPermissions: public QObject +{ + Q_OBJECT +private slots: + void permissions1(); +}; + +void TestPermissions::permissions1() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/orientation.pdf"); + QVERIFY( doc ); + + // we are allowed to print + QVERIFY( doc->okToPrint() ); + + // we are not allowed to change + QVERIFY( !(doc->okToChange()) ); + + // we are not allowed to copy or extract content + QVERIFY( !(doc->okToCopy()) ); + + // we are not allowed to print at high resolution + QVERIFY( !(doc->okToPrintHighRes()) ); + + // we are not allowed to fill forms + QVERIFY( !(doc->okToFillForm()) ); + + // we are allowed to extract content for accessibility + QVERIFY( doc->okToExtractForAccessibility() ); + + // we are allowed to assemble this document + QVERIFY( doc->okToAssemble() ); + + delete doc; +} + +QTEST_MAIN(TestPermissions) +#include "check_permissions.moc" + diff --git a/qt4/tests/check_search.cpp b/qt4/tests/check_search.cpp new file mode 100644 index 0000000..cabf82d --- /dev/null +++ b/qt4/tests/check_search.cpp @@ -0,0 +1,91 @@ +#include + +#include + +class TestSearch: public QObject +{ + Q_OBJECT +private slots: + void bug7063(); + void testNextAndPrevious(); +}; + +void TestSearch::bug7063() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/bug7063.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(0); + QRectF pageRegion( QPointF(0,0), page->pageSize() ); + + QCOMPARE( page->search(QString("non-ascii:"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + + QCOMPARE( page->search(QString("Ascii"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false ); + QCOMPARE( page->search(QString("Ascii"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseInsensitive), true ); + + QCOMPARE( page->search(QString("latin1:"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false ); + + QCOMPARE( page->search(QString::fromUtf8("é"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + QCOMPARE( page->search(QString::fromUtf8("à"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + QCOMPARE( page->search(QString::fromUtf8("ç"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à\" or \"ç\""), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + QCOMPARE( page->search(QString::fromUtf8("¥µ©"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + QCOMPARE( page->search(QString::fromUtf8("¥©"), pageRegion, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false ); + + delete doc; +} + +void TestSearch::testNextAndPrevious() +{ + Poppler::Document *doc; + doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"); + QVERIFY( doc ); + + Poppler::Page *page = doc->page(0); + QRectF region( QPointF(0,0), page->pageSize() ); + + QCOMPARE( page->search(QString("is"), region, Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 161.44) < 0.01 ); + QVERIFY( qAbs(region.y() - 127.85) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 171.46) < 0.01 ); + QVERIFY( qAbs(region.y() - 127.85) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 161.44) < 0.01 ); + QVERIFY( qAbs(region.y() - 139.81) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 171.46) < 0.01 ); + QVERIFY( qAbs(region.y() - 139.81) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::NextResult, Poppler::Page::CaseSensitive), false ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 161.44) < 0.01 ); + QVERIFY( qAbs(region.y() - 139.81) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 171.46) < 0.01 ); + QVERIFY( qAbs(region.y() - 127.85) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), true ); + QVERIFY( qAbs(region.x() - 161.44) < 0.01 ); + QVERIFY( qAbs(region.y() - 127.85) < 0.01 ); + QVERIFY( qAbs(region.width() - 6.70) < 0.01 ); + QVERIFY( qAbs(region.height() - 8.85) < 0.01 ); + QCOMPARE( page->search(QString("is"), region, Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), false ); + + delete doc; +} + +QTEST_MAIN(TestSearch) +#include "check_search.moc" + diff --git a/qt4/tests/check_strings.cpp b/qt4/tests/check_strings.cpp new file mode 100644 index 0000000..700ae9c --- /dev/null +++ b/qt4/tests/check_strings.cpp @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2010, 2011, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include +#include + +#include + +Q_DECLARE_METATYPE(GooString*) +Q_DECLARE_METATYPE(Unicode*) + +class TestStrings : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanupTestCase(); + void check_unicodeToQString_data(); + void check_unicodeToQString(); + void check_UnicodeParsedString_data(); + void check_UnicodeParsedString(); + void check_QStringToUnicodeGooString_data(); + void check_QStringToUnicodeGooString(); + void check_QStringToGooString_data(); + void check_QStringToGooString(); + +private: + GooString* newGooString(const char *s); + GooString* newGooString(const char *s, int l); + + QVector m_gooStrings; +}; + +void TestStrings::initTestCase() +{ + qRegisterMetaType("GooString*"); + qRegisterMetaType("Unicode*"); + + globalParams = new GlobalParams(); +} + +void TestStrings::cleanupTestCase() +{ + qDeleteAll(m_gooStrings); + + delete globalParams; +} + +void TestStrings::check_unicodeToQString_data() +{ + QTest::addColumn("data"); + QTest::addColumn("length"); + QTest::addColumn("result"); + + { + const int l = 1; + Unicode *u = new Unicode[l]; + u[0] = int('a'); + QTest::newRow("a") << u << l << QString::fromUtf8("a"); + } + { + const int l = 1; + Unicode *u = new Unicode[l]; + u[0] = 0x0161; + QTest::newRow("\u0161") << u << l << QString::fromUtf8("\u0161"); + } + { + const int l = 2; + Unicode *u = new Unicode[l]; + u[0] = int('a'); + u[1] = int('b'); + QTest::newRow("ab") << u << l << QString::fromUtf8("ab"); + } + { + const int l = 2; + Unicode *u = new Unicode[l]; + u[0] = int('a'); + u[1] = 0x0161; + QTest::newRow("a\u0161") << u << l << QString::fromUtf8("a\u0161"); + } + { + const int l = 2; + Unicode *u = new Unicode[l]; + u[0] = 0x5c01; + u[1] = 0x9762; + QTest::newRow("\xe5\xb0\x81\xe9\x9d\xa2") << u << l << QString::fromUtf8("\xe5\xb0\x81\xe9\x9d\xa2"); + } + { + const int l = 3; + Unicode *u = new Unicode[l]; + u[0] = 0x5c01; + u[1] = 0x9762; + u[2] = 0x0; + QTest::newRow("\xe5\xb0\x81\xe9\x9d\xa2 + 0") << u << l << QString::fromUtf8("\xe5\xb0\x81\xe9\x9d\xa2"); + } +} + +void TestStrings::check_unicodeToQString() +{ + QFETCH(Unicode*, data); + QFETCH(int, length); + QFETCH(QString, result); + + QCOMPARE(Poppler::unicodeToQString(data, length), result); + + delete [] data; +} + +void TestStrings::check_UnicodeParsedString_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + + // non-unicode strings + QTest::newRow("") << newGooString("") + << QString(); + QTest::newRow("a") << newGooString("a") + << QString::fromUtf8("a"); + QTest::newRow("ab") << newGooString("ab") + << QString::fromUtf8("ab"); + QTest::newRow("~") << newGooString("~") + << QString::fromUtf8("~"); + QTest::newRow("test string") << newGooString("test string") + << QString::fromUtf8("test string"); + + // unicode strings + QTest::newRow("") << newGooString("\xFE\xFF") + << QString(); + QTest::newRow("U a") << newGooString("\xFE\xFF\0a", 4) + << QString::fromUtf8("a"); + QTest::newRow("U ~") << newGooString("\xFE\xFF\0~", 4) + << QString::fromUtf8("~"); + QTest::newRow("U aa") << newGooString("\xFE\xFF\0a\0a", 6) + << QString::fromUtf8("aa"); + QTest::newRow("U \xC3\x9F") << newGooString("\xFE\xFF\0\xDF", 4) + << QString::fromUtf8("\xC3\x9F"); + QTest::newRow("U \xC3\x9F\x61") << newGooString("\xFE\xFF\0\xDF\0\x61", 6) + << QString::fromUtf8("\xC3\x9F\x61"); + QTest::newRow("U \xC5\xA1") << newGooString("\xFE\xFF\x01\x61", 4) + << QString::fromUtf8("\xC5\xA1"); + QTest::newRow("U \xC5\xA1\x61") << newGooString("\xFE\xFF\x01\x61\0\x61", 6) + << QString::fromUtf8("\xC5\xA1\x61"); + QTest::newRow("test string") << newGooString("\xFE\xFF\0t\0e\0s\0t\0 \0s\0t\0r\0i\0n\0g", 24) + << QString::fromUtf8("test string"); +} + +void TestStrings::check_UnicodeParsedString() +{ + QFETCH(GooString*, string); + QFETCH(QString, result); + + QCOMPARE(Poppler::UnicodeParsedString(string), result); +} + +void TestStrings::check_QStringToUnicodeGooString_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + + + QTest::newRow("") << QString() + << QByteArray(""); + QTest::newRow("") << QString::fromUtf8("") + << QByteArray(""); + QTest::newRow("a") << QString::fromUtf8("a") + << QByteArray("\0a", 2); + QTest::newRow("ab") << QString::fromUtf8("ab") + << QByteArray("\0a\0b", 4); + QTest::newRow("test string") << QString::fromUtf8("test string") + << QByteArray("\0t\0e\0s\0t\0 \0s\0t\0r\0i\0n\0g", 22); + QTest::newRow("\xC3\x9F") << QString::fromUtf8("\xC3\x9F") + << QByteArray("\0\xDF", 2); + QTest::newRow("\xC3\x9F\x61") << QString::fromUtf8("\xC3\x9F\x61") + << QByteArray("\0\xDF\0\x61", 4); +} + +void TestStrings::check_QStringToUnicodeGooString() +{ + QFETCH(QString, string); + QFETCH(QByteArray, result); + + GooString *goo = Poppler::QStringToUnicodeGooString(string); + QVERIFY(goo->hasUnicodeMarker()); + QCOMPARE(goo->getLength(), string.length() * 2 + 2); + QCOMPARE(result, QByteArray::fromRawData(goo->getCString() + 2, goo->getLength() - 2)); + + delete goo; +} + +void TestStrings::check_QStringToGooString_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + + QTest::newRow("") << QString() + << newGooString(""); + QTest::newRow("") << QString::fromUtf8("") + << newGooString(""); + QTest::newRow("a") << QString::fromUtf8("a") + << newGooString("a"); + QTest::newRow("ab") << QString::fromUtf8("ab") + << newGooString("ab"); +} + +void TestStrings::check_QStringToGooString() +{ + QFETCH(QString, string); + QFETCH(GooString*, result); + + GooString *goo = Poppler::QStringToGooString(string); + QCOMPARE(goo->getCString(), result->getCString()); + + delete goo; +} + +GooString* TestStrings::newGooString(const char *s) +{ + GooString *goo = new GooString(s); + m_gooStrings.append(goo); + return goo; +} + +GooString* TestStrings::newGooString(const char *s, int l) +{ + GooString *goo = new GooString(s, l); + m_gooStrings.append(goo); + return goo; +} + +QTEST_MAIN(TestStrings) + +#include "check_strings.moc" diff --git a/qt4/tests/poppler-attachments.cpp b/qt4/tests/poppler-attachments.cpp new file mode 100644 index 0000000..992dc56 --- /dev/null +++ b/qt4/tests/poppler-attachments.cpp @@ -0,0 +1,39 @@ +#include +#include + +#include + +#include + +int main( int argc, char **argv ) +{ + QCoreApplication a( argc, argv ); // QApplication required! + + if (!( argc == 2 )) + { + qWarning() << "usage: poppler-attachments filename"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(argv[1]); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + if (doc->hasEmbeddedFiles()) { + std::cout << "Embedded files: " << std::endl; + foreach(Poppler::EmbeddedFile *file, doc->embeddedFiles()) { + std::cout << " " << qPrintable(file->name()) << std::endl; + std::cout << " desc:" << qPrintable(file->description()) << std::endl; + QByteArray data = file->data(); + std::cout << " data: " << data.constData() << std::endl; + } + + } else { + std::cout << "There are no embedded document at the top level" << std::endl; + } + delete doc; + +} diff --git a/qt4/tests/poppler-fonts.cpp b/qt4/tests/poppler-fonts.cpp new file mode 100644 index 0000000..6b66ec4 --- /dev/null +++ b/qt4/tests/poppler-fonts.cpp @@ -0,0 +1,89 @@ +#include +#include + +#include + +#include + +int main( int argc, char **argv ) +{ + QCoreApplication a( argc, argv ); // QApplication required! + + if (!( argc == 2 )) + { + qWarning() << "usage: poppler-fonts filename"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(argv[1]); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + std::cout << "name type emb sub font file"; + std::cout << std::endl; + std::cout << "------------------------------------ ------------ --- --- ---------"; + std::cout << std::endl; + + foreach( const Poppler::FontInfo &font, doc->fonts() ) { + if (font.name().isNull()) { + std::cout << qPrintable( QString("%1").arg(QString("[none]"), -37) ); + } else { + std::cout << qPrintable( QString("%1").arg(font.name(), -37) ); + } + switch( font.type() ) { + case Poppler::FontInfo::unknown: + std::cout << "unknown "; + break; + case Poppler::FontInfo::Type1: + std::cout << "Type 1 "; + break; + case Poppler::FontInfo::Type1C: + std::cout << "Type 1C "; + break; + case Poppler::FontInfo::Type3: + std::cout << "Type 3 "; + break; + case Poppler::FontInfo::TrueType: + std::cout << "TrueType "; + break; + case Poppler::FontInfo::CIDType0: + std::cout << "CID Type 0 "; + break; + case Poppler::FontInfo::CIDType0C: + std::cout << "CID Type 0C "; + break; + case Poppler::FontInfo::CIDTrueType: + std::cout << "CID TrueType "; + break; + case Poppler::FontInfo::Type1COT: + std::cout << "Type 1C (OT) "; + break; + case Poppler::FontInfo::TrueTypeOT: + std::cout << "TrueType (OT) "; + break; + case Poppler::FontInfo::CIDType0COT: + std::cout << "CID Type 0C (OT) "; + break; + case Poppler::FontInfo::CIDTrueTypeOT: + std::cout << "CID TrueType (OT) "; + break; + } + + if ( font.isEmbedded() ) { + std::cout << "yes "; + } else { + std::cout << "no "; + } + if ( font.isSubset() ) { + std::cout << "yes "; + } else { + std::cout << "no "; + } + std::cout << qPrintable( QString("%1").arg(font.file()) ); + std::cout << std::endl; + } + delete doc; +} diff --git a/qt4/tests/poppler-texts.cpp b/qt4/tests/poppler-texts.cpp new file mode 100644 index 0000000..ec28353 --- /dev/null +++ b/qt4/tests/poppler-texts.cpp @@ -0,0 +1,40 @@ +#include +#include + +#include + +#include + +int main( int argc, char **argv ) +{ + QCoreApplication a( argc, argv ); // QApplication required! + + if (!( argc == 2 )) + { + qWarning() << "usage: poppler-texts filename"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(argv[1]); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + for ( int i = 0; i < doc->numPages(); i++ ) + { + int j = 0; + std::cout << "*** Page " << i << std::endl; + std::cout << std::flush; + + Poppler::Page *page = doc->page(i); + const QByteArray utf8str = page->text( QRectF(), Poppler::Page::RawOrderLayout ).toUtf8(); + std::cout << std::flush; + for ( j = 0; j < utf8str.size(); j++ ) + std::cout << utf8str[j]; + std::cout << std::endl; + delete page; + } + delete doc; +} diff --git a/qt4/tests/stress-poppler-dir.cpp b/qt4/tests/stress-poppler-dir.cpp new file mode 100644 index 0000000..6eeab6f --- /dev/null +++ b/qt4/tests/stress-poppler-dir.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include + +#include + +#include + +int main( int argc, char **argv ) +{ + QApplication a( argc, argv ); // QApplication required! + + QTime t; + t.start(); + + QDir directory( argv[1] ); + foreach ( const QString &fileName, directory.entryList() ) { + if (fileName.endsWith("pdf") ) { + qDebug() << "Doing" << fileName.toLatin1().data() << ":"; + Poppler::Document *doc = Poppler::Document::load( directory.canonicalPath()+"/"+fileName ); + if (!doc) { + qWarning() << "doc not loaded"; + } else if ( doc->isLocked() ) { + if (! doc->unlock( "", "password" ) ) { + qWarning() << "couldn't unlock document"; + delete doc; + } + } else { + int major = 0, minor = 0; + doc->getPdfVersion( &major, &minor ); + doc->info("Title"); + doc->info("Subject"); + doc->info("Author"); + doc->info("Keywords"); + doc->info("Creator"); + doc->info("Producer"); + doc->date("CreationDate").toString(); + doc->date("ModDate").toString(); + doc->numPages(); + doc->isLinearized(); + doc->isEncrypted(); + doc->okToPrint(); + doc->okToCopy(); + doc->okToChange(); + doc->okToAddNotes(); + doc->pageMode(); + + for( int index = 0; index < doc->numPages(); ++index ) { + Poppler::Page *page = doc->page( index ); + QImage image = page->renderToImage(); + page->pageSize(); + page->orientation(); + delete page; + std::cout << "."; + std::cout.flush(); + } + std::cout << std::endl; + delete doc; + } + } + } + + std::cout << "Elapsed time: " << (t.elapsed()/1000) << "seconds" << std::endl; + +} diff --git a/qt4/tests/stress-poppler-qt4.cpp b/qt4/tests/stress-poppler-qt4.cpp new file mode 100644 index 0000000..5684454 --- /dev/null +++ b/qt4/tests/stress-poppler-qt4.cpp @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include + +#include + +#include + +int main( int argc, char **argv ) +{ + QApplication a( argc, argv ); // QApplication required! + + Q_UNUSED( argc ); + Q_UNUSED( argv ); + + QTime t; + t.start(); + QDir dbDir( QString( "./pdfdb" ) ); + if ( !dbDir.exists() ) { + qWarning() << "Database directory does not exist"; + } + + QStringList excludeSubDirs; + excludeSubDirs << "000048" << "000607"; + + foreach ( const QString &subdir, dbDir.entryList(QStringList() << "0000*", QDir::Dirs) ) { + if ( excludeSubDirs.contains(subdir) ) { + // then skip it + } else { + QString path = "./pdfdb/" + subdir + "/data.pdf"; + std::cout <<"Doing " << path.toLatin1().data() << " :"; + Poppler::Document *doc = Poppler::Document::load( path ); + if (!doc) { + qWarning() << "doc not loaded"; + } else { + int major = 0, minor = 0; + doc->getPdfVersion( &major, &minor ); + doc->info("Title"); + doc->info("Subject"); + doc->info("Author"); + doc->info("Keywords"); + doc->info("Creator"); + doc->info("Producer"); + doc->date("CreationDate").toString(); + doc->date("ModDate").toString(); + doc->numPages(); + doc->isLinearized(); + doc->isEncrypted(); + doc->okToPrint(); + doc->okToCopy(); + doc->okToChange(); + doc->okToAddNotes(); + doc->pageMode(); + + for( int index = 0; index < doc->numPages(); ++index ) { + Poppler::Page *page = doc->page( index ); + QImage image = page->renderToImage(); + page->pageSize(); + page->orientation(); + delete page; + std::cout << "."; + std::cout.flush(); + } + std::cout << std::endl; + delete doc; + } + } + } + + std::cout << "Elapsed time: " << (t.elapsed()/1000) << std::endl; + +} diff --git a/qt4/tests/test-password-qt4.cpp b/qt4/tests/test-password-qt4.cpp new file mode 100644 index 0000000..c961874 --- /dev/null +++ b/qt4/tests/test-password-qt4.cpp @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include + +#include + +class PDFDisplay : public QWidget // picture display widget +{ +public: + PDFDisplay( Poppler::Document *d ); + ~PDFDisplay(); +protected: + void paintEvent( QPaintEvent * ); + void keyPressEvent( QKeyEvent * ); +private: + void display(); + int m_currentPage; + QImage image; + Poppler::Document *doc; +}; + +PDFDisplay::PDFDisplay( Poppler::Document *d ) +{ + doc = d; + m_currentPage = 0; + display(); +} + +void PDFDisplay::display() +{ + if (doc) { + Poppler::Page *page = doc->page(m_currentPage); + if (page) { + qDebug() << "Displaying page: " << m_currentPage; + image = page->renderToImage(); + update(); + delete page; + } + } else { + qWarning() << "doc not loaded"; + } +} + +PDFDisplay::~PDFDisplay() +{ + delete doc; +} + +void PDFDisplay::paintEvent( QPaintEvent *e ) +{ + QPainter paint( this ); // paint widget + if (!image.isNull()) { + paint.drawImage(0, 0, image); + } else { + qWarning() << "null image"; + } +} + +void PDFDisplay::keyPressEvent( QKeyEvent *e ) +{ + if (e->key() == Qt::Key_Down) + { + if (m_currentPage + 1 < doc->numPages()) + { + m_currentPage++; + display(); + } + } + else if (e->key() == Qt::Key_Up) + { + if (m_currentPage > 0) + { + m_currentPage--; + display(); + } + } + else if (e->key() == Qt::Key_Q) + { + exit(0); + } +} + +int main( int argc, char **argv ) +{ + QApplication a( argc, argv ); // QApplication required! + + if ( argc != 3) + { + qWarning() << "usage: test-password-qt4 owner-password filename"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(argv[2], argv[1]); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + // output some meta-data + int major = 0, minor = 0; + doc->getPdfVersion( &major, &minor ); + qDebug() << " PDF Version: " << qPrintable(QString::fromLatin1("%1.%2").arg(major).arg(minor)); + qDebug() << " Title: " << doc->info("Title"); + qDebug() << " Subject: " << doc->info("Subject"); + qDebug() << " Author: " << doc->info("Author"); + qDebug() << " Key words: " << doc->info("Keywords"); + qDebug() << " Creator: " << doc->info("Creator"); + qDebug() << " Producer: " << doc->info("Producer"); + qDebug() << " Date created: " << doc->date("CreationDate").toString(); + qDebug() << " Date modified: " << doc->date("ModDate").toString(); + qDebug() << "Number of pages: " << doc->numPages(); + qDebug() << " Linearised: " << doc->isLinearized(); + qDebug() << " Encrypted: " << doc->isEncrypted(); + qDebug() << " OK to print: " << doc->okToPrint(); + qDebug() << " OK to copy: " << doc->okToCopy(); + qDebug() << " OK to change: " << doc->okToChange(); + qDebug() << "OK to add notes: " << doc->okToAddNotes(); + qDebug() << " Page mode: " << doc->pageMode(); + QStringList fontNameList; + foreach( const Poppler::FontInfo &font, doc->fonts() ) + fontNameList += font.name(); + qDebug() << " Fonts: " << fontNameList.join( ", " ); + + Poppler::Page *page = doc->page(0); + qDebug() << " Page 1 size: " << page->pageSize().width()/72 << "inches x " << page->pageSize().height()/72 << "inches"; + + PDFDisplay test( doc ); // create picture display + test.setWindowTitle("Poppler-Qt4 Test"); + test.show(); // show it + + return a.exec(); // start event loop +} diff --git a/qt4/tests/test-poppler-qt4.cpp b/qt4/tests/test-poppler-qt4.cpp new file mode 100644 index 0000000..503b35a --- /dev/null +++ b/qt4/tests/test-poppler-qt4.cpp @@ -0,0 +1,239 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class PDFDisplay : public QWidget // picture display widget +{ +public: + PDFDisplay( Poppler::Document *d, bool arthur ); + ~PDFDisplay(); + void setShowTextRects(bool show); + void display(); +protected: + void paintEvent( QPaintEvent * ); + void keyPressEvent( QKeyEvent * ); + void mousePressEvent( QMouseEvent * ); +private: + int m_currentPage; + QImage image; + Poppler::Document *doc; + QString backendString; + bool showTextRects; + QList textRects; +}; + +PDFDisplay::PDFDisplay( Poppler::Document *d, bool arthur ) +{ + showTextRects = false; + doc = d; + m_currentPage = 0; + if (arthur) + { + backendString = "Arthur"; + doc->setRenderBackend(Poppler::Document::ArthurBackend); + } + else + { + backendString = "Splash"; + doc->setRenderBackend(Poppler::Document::SplashBackend); + } + doc->setRenderHint(Poppler::Document::Antialiasing, true); + doc->setRenderHint(Poppler::Document::TextAntialiasing, true); +} + +void PDFDisplay::setShowTextRects(bool show) +{ + showTextRects = show; +} + +void PDFDisplay::display() +{ + if (doc) { + Poppler::Page *page = doc->page(m_currentPage); + if (page) { + qDebug() << "Displaying page using" << backendString << "backend: " << m_currentPage; + QTime t = QTime::currentTime(); + image = page->renderToImage(); + qDebug() << "Rendering took" << t.msecsTo(QTime::currentTime()) << "msecs"; + qDeleteAll(textRects); + if (showTextRects) + { + QPainter painter(&image); + painter.setPen(Qt::red); + textRects = page->textList(); + foreach(Poppler::TextBox *tb, textRects) + { + painter.drawRect(tb->boundingBox()); + } + } + else textRects.clear(); + update(); + delete page; + } + } else { + qWarning() << "doc not loaded"; + } +} + +PDFDisplay::~PDFDisplay() +{ + qDeleteAll(textRects); + delete doc; +} + +void PDFDisplay::paintEvent( QPaintEvent *e ) +{ + QPainter paint( this ); // paint widget + if (!image.isNull()) { + paint.drawImage(0, 0, image); + } else { + qWarning() << "null image"; + } +} + +void PDFDisplay::keyPressEvent( QKeyEvent *e ) +{ + if (e->key() == Qt::Key_Down) + { + if (m_currentPage + 1 < doc->numPages()) + { + m_currentPage++; + display(); + } + } + else if (e->key() == Qt::Key_Up) + { + if (m_currentPage > 0) + { + m_currentPage--; + display(); + } + } + else if (e->key() == Qt::Key_Q) + { + exit(0); + } +} + +void PDFDisplay::mousePressEvent( QMouseEvent *e ) +{ + int i = 0; + foreach(Poppler::TextBox *tb, textRects) + { + if (tb->boundingBox().contains(e->pos())) + { + QString tt = QString("Text: \"%1\"\nIndex in text list: %2").arg(tb->text()).arg(i); + QToolTip::showText(e->globalPos(), tt, this); + break; + } + ++i; + } +} + +int main( int argc, char **argv ) +{ + QApplication a( argc, argv ); // QApplication required! + + if ( argc < 2 || + (argc == 3 && strcmp(argv[2], "-extract") != 0 && strcmp(argv[2], "-arthur") != 0 && strcmp(argv[2], "-textRects") != 0) || + argc > 3) + { + // use argument as file name + qWarning() << "usage: test-poppler-qt filename [-extract|-arthur|-textRects]"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(QFile::decodeName(argv[1])); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + if (doc->isLocked()) + { + qWarning() << "document locked (needs password)"; + exit(0); + } + + // output some meta-data + int major = 0, minor = 0; + doc->getPdfVersion( &major, &minor ); + qDebug() << " PDF Version: " << qPrintable(QString::fromLatin1("%1.%2").arg(major).arg(minor)); + qDebug() << " Title: " << doc->info("Title"); + qDebug() << " Subject: " << doc->info("Subject"); + qDebug() << " Author: " << doc->info("Author"); + qDebug() << " Key words: " << doc->info("Keywords"); + qDebug() << " Creator: " << doc->info("Creator"); + qDebug() << " Producer: " << doc->info("Producer"); + qDebug() << " Date created: " << doc->date("CreationDate").toString(); + qDebug() << " Date modified: " << doc->date("ModDate").toString(); + qDebug() << "Number of pages: " << doc->numPages(); + qDebug() << " Linearised: " << doc->isLinearized(); + qDebug() << " Encrypted: " << doc->isEncrypted(); + qDebug() << " OK to print: " << doc->okToPrint(); + qDebug() << " OK to copy: " << doc->okToCopy(); + qDebug() << " OK to change: " << doc->okToChange(); + qDebug() << "OK to add notes: " << doc->okToAddNotes(); + qDebug() << " Page mode: " << doc->pageMode(); + qDebug() << " Metadata: " << doc->metadata(); + QStringList fontNameList; + foreach( const Poppler::FontInfo &font, doc->fonts() ) + fontNameList += font.name(); + qDebug() << " Fonts: " << fontNameList.join( ", " ); + + if ( doc->hasEmbeddedFiles() ) { + qDebug() << "Embedded files:"; + foreach( Poppler::EmbeddedFile *file, doc->embeddedFiles() ) { + qDebug() << " " << file->name(); + } + qDebug(); + } else { + qDebug() << "No embedded files"; + } + + if (doc->numPages() <= 0) + { + delete doc; + qDebug() << "Doc has no pages"; + return 0; + } + + Poppler::Page *page = doc->page(0); + if (page) + { + qDebug() << "Page 1 size: " << page->pageSize().width()/72 << "inches x " << page->pageSize().height()/72 << "inches"; + delete page; + } + + if (argc == 2 || (argc == 3 && strcmp(argv[2], "-arthur") == 0) || (argc == 3 && strcmp(argv[2], "-textRects") == 0)) + { + bool useArthur = (argc == 3 && strcmp(argv[2], "-arthur") == 0); + PDFDisplay test( doc, useArthur ); // create picture display + test.setWindowTitle("Poppler-Qt4 Test"); + test.setShowTextRects(argc == 3 && strcmp(argv[2], "-textRects") == 0); + test.display(); + test.show(); // show it + + return a.exec(); // start event loop + } + else + { + Poppler::Page *page = doc->page(0); + + QLabel *l = new QLabel(page->text(QRectF()), 0); + l->show(); + delete page; + delete doc; + return a.exec(); + } +} diff --git a/splash/Makefile.am b/splash/Makefile.am new file mode 100644 index 0000000..4330c53 --- /dev/null +++ b/splash/Makefile.am @@ -0,0 +1,73 @@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libpng_includes) \ + $(FREETYPE_CFLAGS) + +# SplashBitmap includes JpegWriter.h, TiffWriter.h, PNGWriter.h +if BUILD_LIBJPEG +libjpeg_includes = $(LIBJPEG_CFLAGS) +endif + +if BUILD_LIBTIFF +libtiff_includes = $(LIBTIFF_CFLAGS) +endif + +if BUILD_LIBPNG +libpng_includes = $(LIBPNG_CFLAGS) +endif + +noinst_LTLIBRARIES = libsplash.la + +if ENABLE_XPDF_HEADERS + +poppler_splash_includedir = $(includedir)/poppler/splash +poppler_splash_include_HEADERS = \ + Splash.h \ + SplashBitmap.h \ + SplashClip.h \ + SplashErrorCodes.h \ + SplashFTFont.h \ + SplashFTFontEngine.h \ + SplashFTFontFile.h \ + SplashFont.h \ + SplashFontEngine.h \ + SplashFontFile.h \ + SplashFontFileID.h \ + SplashGlyphBitmap.h \ + SplashMath.h \ + SplashPath.h \ + SplashPattern.h \ + SplashScreen.h \ + SplashState.h \ + SplashT1Font.h \ + SplashT1FontEngine.h \ + SplashT1FontFile.h \ + SplashTypes.h \ + SplashXPath.h \ + SplashXPathScanner.h + +endif + +libsplash_la_SOURCES = \ + Splash.cc \ + SplashBitmap.cc \ + SplashClip.cc \ + SplashFTFont.cc \ + SplashFTFontEngine.cc \ + SplashFTFontFile.cc \ + SplashFont.cc \ + SplashFontEngine.cc \ + SplashFontFile.cc \ + SplashFontFileID.cc \ + SplashPath.cc \ + SplashPattern.cc \ + SplashScreen.cc \ + SplashState.cc \ + SplashT1Font.cc \ + SplashT1FontEngine.cc \ + SplashT1FontFile.cc \ + SplashXPath.cc \ + SplashXPathScanner.cc diff --git a/splash/Makefile.in b/splash/Makefile.in new file mode 100644 index 0000000..cf39bcf --- /dev/null +++ b/splash/Makefile.in @@ -0,0 +1,750 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = splash +DIST_COMMON = $(am__poppler_splash_include_HEADERS_DIST) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsplash_la_LIBADD = +am_libsplash_la_OBJECTS = Splash.lo SplashBitmap.lo SplashClip.lo \ + SplashFTFont.lo SplashFTFontEngine.lo SplashFTFontFile.lo \ + SplashFont.lo SplashFontEngine.lo SplashFontFile.lo \ + SplashFontFileID.lo SplashPath.lo SplashPattern.lo \ + SplashScreen.lo SplashState.lo SplashT1Font.lo \ + SplashT1FontEngine.lo SplashT1FontFile.lo SplashXPath.lo \ + SplashXPathScanner.lo +libsplash_la_OBJECTS = $(am_libsplash_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libsplash_la_SOURCES) +DIST_SOURCES = $(libsplash_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__poppler_splash_include_HEADERS_DIST = Splash.h SplashBitmap.h \ + SplashClip.h SplashErrorCodes.h SplashFTFont.h \ + SplashFTFontEngine.h SplashFTFontFile.h SplashFont.h \ + SplashFontEngine.h SplashFontFile.h SplashFontFileID.h \ + SplashGlyphBitmap.h SplashMath.h SplashPath.h SplashPattern.h \ + SplashScreen.h SplashState.h SplashT1Font.h \ + SplashT1FontEngine.h SplashT1FontFile.h SplashTypes.h \ + SplashXPath.h SplashXPathScanner.h +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(poppler_splash_includedir)" +HEADERS = $(poppler_splash_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libpng_includes) \ + $(FREETYPE_CFLAGS) + + +# SplashBitmap includes JpegWriter.h, TiffWriter.h, PNGWriter.h +@BUILD_LIBJPEG_TRUE@libjpeg_includes = $(LIBJPEG_CFLAGS) +@BUILD_LIBTIFF_TRUE@libtiff_includes = $(LIBTIFF_CFLAGS) +@BUILD_LIBPNG_TRUE@libpng_includes = $(LIBPNG_CFLAGS) +noinst_LTLIBRARIES = libsplash.la +@ENABLE_XPDF_HEADERS_TRUE@poppler_splash_includedir = $(includedir)/poppler/splash +@ENABLE_XPDF_HEADERS_TRUE@poppler_splash_include_HEADERS = \ +@ENABLE_XPDF_HEADERS_TRUE@ Splash.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashBitmap.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashClip.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashErrorCodes.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFTFont.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFTFontEngine.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFTFontFile.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFont.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFontEngine.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFontFile.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashFontFileID.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashGlyphBitmap.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashMath.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashPath.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashPattern.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashScreen.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashState.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashT1Font.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashT1FontEngine.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashT1FontFile.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashTypes.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashXPath.h \ +@ENABLE_XPDF_HEADERS_TRUE@ SplashXPathScanner.h + +libsplash_la_SOURCES = \ + Splash.cc \ + SplashBitmap.cc \ + SplashClip.cc \ + SplashFTFont.cc \ + SplashFTFontEngine.cc \ + SplashFTFontFile.cc \ + SplashFont.cc \ + SplashFontEngine.cc \ + SplashFontFile.cc \ + SplashFontFileID.cc \ + SplashPath.cc \ + SplashPattern.cc \ + SplashScreen.cc \ + SplashState.cc \ + SplashT1Font.cc \ + SplashT1FontEngine.cc \ + SplashT1FontFile.cc \ + SplashXPath.cc \ + SplashXPathScanner.cc + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign splash/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign splash/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsplash.la: $(libsplash_la_OBJECTS) $(libsplash_la_DEPENDENCIES) $(EXTRA_libsplash_la_DEPENDENCIES) + $(AM_V_CXXLD)$(CXXLINK) $(libsplash_la_OBJECTS) $(libsplash_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Splash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashBitmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashClip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFTFont.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFTFontEngine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFTFontFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFont.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFontEngine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFontFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashFontFileID.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashPath.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashPattern.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashScreen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashState.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashT1Font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashT1FontEngine.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashT1FontFile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashXPath.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplashXPathScanner.Plo@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-poppler_splash_includeHEADERS: $(poppler_splash_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(poppler_splash_include_HEADERS)'; test -n "$(poppler_splash_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(poppler_splash_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(poppler_splash_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(poppler_splash_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(poppler_splash_includedir)" || exit $$?; \ + done + +uninstall-poppler_splash_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(poppler_splash_include_HEADERS)'; test -n "$(poppler_splash_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(poppler_splash_includedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(poppler_splash_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-poppler_splash_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-poppler_splash_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am \ + install-poppler_splash_includeHEADERS install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-poppler_splash_includeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/splash/Splash.cc b/splash/Splash.cc new file mode 100644 index 0000000..e6559f4 --- /dev/null +++ b/splash/Splash.cc @@ -0,0 +1,5866 @@ +//======================================================================== +// +// Splash.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2012 Albert Astals Cid +// Copyright (C) 2005 Marco Pesenti Gritti +// Copyright (C) 2010-2012 Thomas Freitag +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2011, 2012 William Bader +// Copyright (C) 2012 Markus Trippelsdorf +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "goo/gmem.h" +#include "goo/GooLikely.h" +#include "poppler/Error.h" +#include "SplashErrorCodes.h" +#include "SplashMath.h" +#include "SplashBitmap.h" +#include "SplashState.h" +#include "SplashPath.h" +#include "SplashXPath.h" +#include "SplashXPathScanner.h" +#include "SplashPattern.h" +#include "SplashScreen.h" +#include "SplashFont.h" +#include "SplashGlyphBitmap.h" +#include "Splash.h" +#include + +//------------------------------------------------------------------------ + +#define splashAAGamma 1.5 + +// distance of Bezier control point from center for circle approximation +// = (4 * (sqrt(2) - 1) / 3) * r +#define bezierCircle ((SplashCoord)0.55228475) +#define bezierCircle2 ((SplashCoord)(0.5 * 0.55228475)) + +// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result. +static inline Guchar div255(int x) { + return (Guchar)((x + (x >> 8) + 0x80) >> 8); +} + +// Clip x to lie in [0, 255]. +static inline Guchar clip255(int x) { + return x < 0 ? 0 : x > 255 ? 255 : x; +} + +template +inline void Guswap( T&a, T&b ) { T tmp = a; a=b; b=tmp; } + +// The PDF spec says that all pixels whose *centers* lie within the +// image target region get painted, so we want to round n+0.5 down to +// n. But this causes problems, e.g., with PDF files that fill a +// rectangle with black and then draw an image to the exact same +// rectangle, so we instead use the fill scan conversion rule. +// However, the correct rule works better for glyphs, so we also +// provide that option in fillImageMask. +#if 0 +static inline int imgCoordMungeLower(SplashCoord x) { + return splashCeil(x + 0.5) - 1; +} +static inline int imgCoordMungeUpper(SplashCoord x) { + return splashCeil(x + 0.5) - 1; +} +#else +static inline int imgCoordMungeLower(SplashCoord x) { + return splashFloor(x); +} +static inline int imgCoordMungeUpper(SplashCoord x) { + return splashFloor(x) + 1; +} +static inline int imgCoordMungeLowerC(SplashCoord x, GBool glyphMode) { + return glyphMode ? (splashCeil(x + 0.5) - 1) : splashFloor(x); +} +static inline int imgCoordMungeUpperC(SplashCoord x, GBool glyphMode) { + return glyphMode ? (splashCeil(x + 0.5) - 1) : (splashFloor(x) + 1); +} +#endif + +// Used by drawImage and fillImageMask to divide the target +// quadrilateral into sections. +struct ImageSection { + int y0, y1; // actual y range + int ia0, ia1; // vertex indices for edge A + int ib0, ib1; // vertex indices for edge A + SplashCoord xa0, ya0, xa1, ya1; // edge A + SplashCoord dxdya; // slope of edge A + SplashCoord xb0, yb0, xb1, yb1; // edge B + SplashCoord dxdyb; // slope of edge B +}; + +//------------------------------------------------------------------------ +// SplashPipe +//------------------------------------------------------------------------ + +#define splashPipeMaxStages 9 + +struct SplashPipe { + // pixel coordinates + int x, y; + + // source pattern + SplashPattern *pattern; + + // source alpha and color + Guchar aInput; + GBool usesShape; + SplashColorPtr cSrc; + SplashColor cSrcVal; + + // non-isolated group alpha0 + Guchar *alpha0Ptr; + + // knockout groups + GBool knockout; + Guchar knockoutOpacity; + + // soft mask + SplashColorPtr softMaskPtr; + + // destination alpha and color + SplashColorPtr destColorPtr; + int destColorMask; + Guchar *destAlphaPtr; + + // shape + Guchar shape; + + // result alpha and color + GBool noTransparency; + SplashPipeResultColorCtrl resultColorCtrl; + + // non-isolated group correction + GBool nonIsolatedGroup; + + // the "run" function + void (Splash::*run)(SplashPipe *pipe); +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorNoAlphaBlend[] = { + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorNoAlphaBlendCMYK +#endif +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = { + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendRGB, + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorAlphaNoBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaNoBlendCMYK +#endif +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = { + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaBlendCMYK +#endif +}; + +//------------------------------------------------------------------------ + +static void blendXor(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = src[i] ^ dest[i]; + } +} + +//------------------------------------------------------------------------ +// modified region +//------------------------------------------------------------------------ + +void Splash::clearModRegion() { + modXMin = bitmap->getWidth(); + modYMin = bitmap->getHeight(); + modXMax = -1; + modYMax = -1; +} + +inline void Splash::updateModX(int x) { + if (x < modXMin) { + modXMin = x; + } + if (x > modXMax) { + modXMax = x; + } +} + +inline void Splash::updateModY(int y) { + if (y < modYMin) { + modYMin = y; + } + if (y > modYMax) { + modYMax = y; + } +} + +//------------------------------------------------------------------------ +// pipeline +//------------------------------------------------------------------------ + +inline void Splash::pipeInit(SplashPipe *pipe, int x, int y, + SplashPattern *pattern, SplashColorPtr cSrc, + Guchar aInput, GBool usesShape, + GBool nonIsolatedGroup, + GBool knockout, Guchar knockoutOpacity) { + pipeSetXY(pipe, x, y); + pipe->pattern = NULL; + + // source color + if (pattern) { + if (pattern->isStatic()) { + pattern->getColor(x, y, pipe->cSrcVal); + } else { + pipe->pattern = pattern; + } + pipe->cSrc = pipe->cSrcVal; + } else { + pipe->cSrc = cSrc; + } + + // source alpha + pipe->aInput = aInput; + pipe->usesShape = usesShape; + + // knockout + pipe->knockout = knockout; + pipe->knockoutOpacity = knockoutOpacity; + + // result alpha + if (aInput == 255 && !state->softMask && !usesShape && + !state->inNonIsolatedGroup && !nonIsolatedGroup) { + pipe->noTransparency = gTrue; + } else { + pipe->noTransparency = gFalse; + } + + // result color + if (pipe->noTransparency) { + // the !state->blendFunc case is handled separately in pipeRun + pipe->resultColorCtrl = pipeResultColorNoAlphaBlend[bitmap->mode]; + } else if (!state->blendFunc) { + pipe->resultColorCtrl = pipeResultColorAlphaNoBlend[bitmap->mode]; + } else { + pipe->resultColorCtrl = pipeResultColorAlphaBlend[bitmap->mode]; + } + + // non-isolated group correction + pipe->nonIsolatedGroup = nonIsolatedGroup; + + // select the 'run' function + pipe->run = &Splash::pipeRun; + if (!pipe->pattern && pipe->noTransparency && !state->blendFunc) { + if (bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleMono1; + } else if (bitmap->mode == splashModeMono8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleMono8; + } else if (bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleRGB8; + } else if (bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleXBGR8; + } else if (bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleBGR8; +#if SPLASH_CMYK + } else if (bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleCMYK8; +#endif + } + } else if (!pipe->pattern && !pipe->noTransparency && !state->softMask && + pipe->usesShape && + !(state->inNonIsolatedGroup && alpha0Bitmap->alpha) && + !state->blendFunc && !pipe->nonIsolatedGroup) { + if (bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAAMono1; + } else if (bitmap->mode == splashModeMono8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAAMono8; + } else if (bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAARGB8; + } else if (bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAAXBGR8; + } else if (bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAABGR8; +#if SPLASH_CMYK + } else if (bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAACMYK8; +#endif + } + } +} + +// general case +void Splash::pipeRun(SplashPipe *pipe) { + Guchar aSrc, aDest, alphaI, alphaIm1, alpha0, aResult; + SplashColor cSrcNonIso, cDest, cBlend; + SplashColorPtr cSrc; + Guchar cResult0, cResult1, cResult2, cResult3; + int t; + + //----- source color + + // static pattern: handled in pipeInit + // fixed color: handled in pipeInit + + // dynamic pattern + if (pipe->pattern) { + if (!pipe->pattern->getColor(pipe->x, pipe->y, pipe->cSrcVal)) { + pipeIncX(pipe); + return; + } + } + + if (pipe->noTransparency && !state->blendFunc) { + + //----- write destination pixel + + switch (bitmap->mode) { + case splashModeMono1: + cResult0 = state->grayTransfer[pipe->cSrc[0]]; + if (state->screen->test(pipe->x, pipe->y, cResult0)) { + *pipe->destColorPtr |= pipe->destColorMask; + } else { + *pipe->destColorPtr &= ~pipe->destColorMask; + } + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + break; + case splashModeMono8: + *pipe->destColorPtr++ = state->grayTransfer[pipe->cSrc[0]]; + break; + case splashModeRGB8: + *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]]; + *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]]; + *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]]; + break; + case splashModeXBGR8: + *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]]; + *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]]; + *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]]; + *pipe->destColorPtr++ = 255; + break; + case splashModeBGR8: + *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]]; + *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]]; + *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + if (state->overprintMask & 1) { + pipe->destColorPtr[0] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[0] + state->cmykTransferC[pipe->cSrc[0]], 255) : + state->cmykTransferC[pipe->cSrc[0]]; + } + if (state->overprintMask & 2) { + pipe->destColorPtr[1] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[1] + state->cmykTransferM[pipe->cSrc[1]], 255) : + state->cmykTransferM[pipe->cSrc[1]]; + } + if (state->overprintMask & 4) { + pipe->destColorPtr[2] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[2] + state->cmykTransferY[pipe->cSrc[2]], 255) : + state->cmykTransferY[pipe->cSrc[2]]; + } + if (state->overprintMask & 8) { + pipe->destColorPtr[3] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[3] + state->cmykTransferK[pipe->cSrc[3]], 255) : + state->cmykTransferK[pipe->cSrc[3]]; + } + pipe->destColorPtr += 4; + break; +#endif + } + if (pipe->destAlphaPtr) { + *pipe->destAlphaPtr++ = 255; + } + + } else { + + //----- read destination pixel + + switch (bitmap->mode) { + case splashModeMono1: + cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00; + break; + case splashModeMono8: + cDest[0] = *pipe->destColorPtr; + break; + case splashModeRGB8: + cDest[0] = pipe->destColorPtr[0]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[2]; + break; + case splashModeXBGR8: + cDest[0] = pipe->destColorPtr[2]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[0]; + cDest[3] = 255; + break; + case splashModeBGR8: + cDest[0] = pipe->destColorPtr[2]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + cDest[0] = pipe->destColorPtr[0]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[2]; + cDest[3] = pipe->destColorPtr[3]; + break; +#endif + } + if (pipe->destAlphaPtr) { + aDest = *pipe->destAlphaPtr; + } else { + aDest = 0xff; + } + + //----- source alpha + + if (state->softMask) { + if (pipe->usesShape) { + aSrc = div255(div255(pipe->aInput * *pipe->softMaskPtr++) * + pipe->shape); + } else { + aSrc = div255(pipe->aInput * *pipe->softMaskPtr++); + } + } else if (pipe->usesShape) { + aSrc = div255(pipe->aInput * pipe->shape); + } else { + aSrc = pipe->aInput; + } + + //----- non-isolated group correction + + if (pipe->nonIsolatedGroup) { + // This path is only used when Splash::composite() is called to + // composite a non-isolated group onto the backdrop. In this + // case, pipe->shape is the source (group) alpha. + if (pipe->shape == 0) { + // this value will be multiplied by zero later, so it doesn't + // matter what we use + cSrc = pipe->cSrc; + } else { + t = (aDest * 255) / pipe->shape - aDest; + switch (bitmap->mode) { +#if SPLASH_CMYK + case splashModeCMYK8: + cSrcNonIso[3] = clip255(pipe->cSrc[3] + + ((pipe->cSrc[3] - cDest[3]) * t) / 255); +#endif + case splashModeRGB8: + case splashModeXBGR8: + case splashModeBGR8: + cSrcNonIso[2] = clip255(pipe->cSrc[2] + + ((pipe->cSrc[2] - cDest[2]) * t) / 255); + cSrcNonIso[1] = clip255(pipe->cSrc[1] + + ((pipe->cSrc[1] - cDest[1]) * t) / 255); + case splashModeMono1: + case splashModeMono8: + cSrcNonIso[0] = clip255(pipe->cSrc[0] + + ((pipe->cSrc[0] - cDest[0]) * t) / 255); + break; + } + cSrc = cSrcNonIso; + // knockout: remove backdrop color + if (pipe->knockout && pipe->shape >= pipe->knockoutOpacity) { + aDest = 0; + } + } + } else { + cSrc = pipe->cSrc; + } + + //----- blend function + + if (state->blendFunc) { + (*state->blendFunc)(cSrc, cDest, cBlend, bitmap->mode); + } + + //----- result alpha and non-isolated group element correction + + if (pipe->noTransparency) { + alphaI = alphaIm1 = aResult = 255; + } else { + aResult = aSrc + aDest - div255(aSrc * aDest); + + // alphaI = alpha_i + // alphaIm1 = alpha_(i-1) + if (pipe->alpha0Ptr) { + alpha0 = *pipe->alpha0Ptr++; + alphaI = aResult + alpha0 - div255(aResult * alpha0); + alphaIm1 = alpha0 + aDest - div255(alpha0 * aDest); + } else { + alphaI = aResult; + alphaIm1 = aDest; + } + } + + //----- result color + + cResult0 = cResult1 = cResult2 = cResult3 = 0; // make gcc happy + + switch (pipe->resultColorCtrl) { + + case splashPipeResultColorNoAlphaBlendMono: + cResult0 = state->grayTransfer[div255((255 - aDest) * cSrc[0] + + aDest * cBlend[0])]; + break; + case splashPipeResultColorNoAlphaBlendRGB: + cResult0 = state->rgbTransferR[div255((255 - aDest) * cSrc[0] + + aDest * cBlend[0])]; + cResult1 = state->rgbTransferG[div255((255 - aDest) * cSrc[1] + + aDest * cBlend[1])]; + cResult2 = state->rgbTransferB[div255((255 - aDest) * cSrc[2] + + aDest * cBlend[2])]; + break; +#if SPLASH_CMYK + case splashPipeResultColorNoAlphaBlendCMYK: + cResult0 = state->cmykTransferC[div255((255 - aDest) * cSrc[0] + + aDest * cBlend[0])]; + cResult1 = state->cmykTransferM[div255((255 - aDest) * cSrc[1] + + aDest * cBlend[1])]; + cResult2 = state->cmykTransferY[div255((255 - aDest) * cSrc[2] + + aDest * cBlend[2])]; + cResult3 = state->cmykTransferK[div255((255 - aDest) * cSrc[3] + + aDest * cBlend[3])]; + break; +#endif + + case splashPipeResultColorAlphaNoBlendMono: + if (alphaI == 0) { + cResult0 = 0; + } else { + cResult0 = state->grayTransfer[((alphaI - aSrc) * cDest[0] + + aSrc * cSrc[0]) / alphaI]; + } + break; + case splashPipeResultColorAlphaNoBlendRGB: + if (alphaI == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = state->rgbTransferR[((alphaI - aSrc) * cDest[0] + + aSrc * cSrc[0]) / alphaI]; + cResult1 = state->rgbTransferG[((alphaI - aSrc) * cDest[1] + + aSrc * cSrc[1]) / alphaI]; + cResult2 = state->rgbTransferB[((alphaI - aSrc) * cDest[2] + + aSrc * cSrc[2]) / alphaI]; + } + break; +#if SPLASH_CMYK + case splashPipeResultColorAlphaNoBlendCMYK: + if (alphaI == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + cResult3 = 0; + } else { + cResult0 = state->cmykTransferC[((alphaI - aSrc) * cDest[0] + + aSrc * cSrc[0]) / alphaI]; + cResult1 = state->cmykTransferM[((alphaI - aSrc) * cDest[1] + + aSrc * cSrc[1]) / alphaI]; + cResult2 = state->cmykTransferY[((alphaI - aSrc) * cDest[2] + + aSrc * cSrc[2]) / alphaI]; + cResult3 = state->cmykTransferK[((alphaI - aSrc) * cDest[3] + + aSrc * cSrc[3]) / alphaI]; + } + break; +#endif + + case splashPipeResultColorAlphaBlendMono: + if (alphaI == 0) { + cResult0 = 0; + } else { + cResult0 = state->grayTransfer[((alphaI - aSrc) * cDest[0] + + aSrc * ((255 - alphaIm1) * cSrc[0] + + alphaIm1 * cBlend[0]) / 255) / + alphaI]; + } + break; + case splashPipeResultColorAlphaBlendRGB: + if (alphaI == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = state->rgbTransferR[((alphaI - aSrc) * cDest[0] + + aSrc * ((255 - alphaIm1) * cSrc[0] + + alphaIm1 * cBlend[0]) / 255) / + alphaI]; + cResult1 = state->rgbTransferG[((alphaI - aSrc) * cDest[1] + + aSrc * ((255 - alphaIm1) * cSrc[1] + + alphaIm1 * cBlend[1]) / 255) / + alphaI]; + cResult2 = state->rgbTransferB[((alphaI - aSrc) * cDest[2] + + aSrc * ((255 - alphaIm1) * cSrc[2] + + alphaIm1 * cBlend[2]) / 255) / + alphaI]; + } + break; +#if SPLASH_CMYK + case splashPipeResultColorAlphaBlendCMYK: + if (alphaI == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + cResult3 = 0; + } else { + cResult0 = state->cmykTransferC[((alphaI - aSrc) * cDest[0] + + aSrc * ((255 - alphaIm1) * cSrc[0] + + alphaIm1 * cBlend[0]) / 255) / + alphaI]; + cResult1 = state->cmykTransferM[((alphaI - aSrc) * cDest[1] + + aSrc * ((255 - alphaIm1) * cSrc[1] + + alphaIm1 * cBlend[1]) / 255) / + alphaI]; + cResult2 = state->cmykTransferY[((alphaI - aSrc) * cDest[2] + + aSrc * ((255 - alphaIm1) * cSrc[2] + + alphaIm1 * cBlend[2]) / 255) / + alphaI]; + cResult3 = state->cmykTransferK[((alphaI - aSrc) * cDest[3] + + aSrc * ((255 - alphaIm1) * cSrc[3] + + alphaIm1 * cBlend[3]) / 255) / + alphaI]; + } + break; +#endif + } + + //----- write destination pixel + + switch (bitmap->mode) { + case splashModeMono1: + if (state->screen->test(pipe->x, pipe->y, cResult0)) { + *pipe->destColorPtr |= pipe->destColorMask; + } else { + *pipe->destColorPtr &= ~pipe->destColorMask; + } + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + break; + case splashModeMono8: + *pipe->destColorPtr++ = cResult0; + break; + case splashModeRGB8: + *pipe->destColorPtr++ = cResult0; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult2; + break; + case splashModeXBGR8: + *pipe->destColorPtr++ = cResult2; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult0; + *pipe->destColorPtr++ = 255; + break; + case splashModeBGR8: + *pipe->destColorPtr++ = cResult2; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult0; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + if (state->overprintMask & 1) { + pipe->destColorPtr[0] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[0] + cResult0, 255) : + cResult0; + } + if (state->overprintMask & 2) { + pipe->destColorPtr[1] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[1] + cResult1, 255) : + cResult1; + } + if (state->overprintMask & 4) { + pipe->destColorPtr[2] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[2] + cResult2, 255) : + cResult2; + } + if (state->overprintMask & 8) { + pipe->destColorPtr[3] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[3] + cResult3, 255) : + cResult3; + } + pipe->destColorPtr += 4; + break; +#endif + } + if (pipe->destAlphaPtr) { + *pipe->destAlphaPtr++ = aResult; + } + + } + + ++pipe->x; +} + +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr) { +void Splash::pipeRunSimpleMono1(SplashPipe *pipe) { + Guchar cResult0; + + //----- write destination pixel + cResult0 = state->grayTransfer[pipe->cSrc[0]]; + if (state->screen->test(pipe->x, pipe->y, cResult0)) { + *pipe->destColorPtr |= pipe->destColorMask; + } else { + *pipe->destColorPtr &= ~pipe->destColorMask; + } + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + + ++pipe->x; +} + +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeMono8 && pipe->destAlphaPtr) { +void Splash::pipeRunSimpleMono8(SplashPipe *pipe) { + //----- write destination pixel + *pipe->destColorPtr++ = state->grayTransfer[pipe->cSrc[0]]; + *pipe->destAlphaPtr++ = 255; + + ++pipe->x; +} + +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr) { +void Splash::pipeRunSimpleRGB8(SplashPipe *pipe) { + //----- write destination pixel + *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]]; + *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]]; + *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]]; + *pipe->destAlphaPtr++ = 255; + + ++pipe->x; +} + +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr) { +void Splash::pipeRunSimpleXBGR8(SplashPipe *pipe) { + //----- write destination pixel + *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]]; + *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]]; + *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]]; + *pipe->destColorPtr++ = 255; + *pipe->destAlphaPtr++ = 255; + + ++pipe->x; +} + +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr) { +void Splash::pipeRunSimpleBGR8(SplashPipe *pipe) { + //----- write destination pixel + *pipe->destColorPtr++ = state->rgbTransferB[pipe->cSrc[2]]; + *pipe->destColorPtr++ = state->rgbTransferG[pipe->cSrc[1]]; + *pipe->destColorPtr++ = state->rgbTransferR[pipe->cSrc[0]]; + *pipe->destAlphaPtr++ = 255; + + ++pipe->x; +} + +#if SPLASH_CMYK +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr) { +void Splash::pipeRunSimpleCMYK8(SplashPipe *pipe) { + //----- write destination pixel + if (state->overprintMask & 1) { + pipe->destColorPtr[0] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[0] + state->cmykTransferC[pipe->cSrc[0]], 255) : + state->cmykTransferC[pipe->cSrc[0]]; + } + if (state->overprintMask & 2) { + pipe->destColorPtr[1] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[1] + state->cmykTransferM[pipe->cSrc[1]], 255) : + state->cmykTransferM[pipe->cSrc[1]]; + } + if (state->overprintMask & 4) { + pipe->destColorPtr[2] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[2] + state->cmykTransferY[pipe->cSrc[2]], 255) : + state->cmykTransferY[pipe->cSrc[2]]; + } + if (state->overprintMask & 8) { + pipe->destColorPtr[3] = (state->overprintAdditive) ? + std::min(pipe->destColorPtr[3] + state->cmykTransferK[pipe->cSrc[3]], 255) : + state->cmykTransferK[pipe->cSrc[3]]; + } + pipe->destColorPtr += 4; + *pipe->destAlphaPtr++ = 255; + + ++pipe->x; +} +#endif + + +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeMono1 && !pipe->destAlphaPtr +void Splash::pipeRunAAMono1(SplashPipe *pipe) { + Guchar aSrc; + SplashColor cDest; + Guchar cResult0; + + //----- read destination pixel + cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00; + + //----- source alpha + aSrc = div255(pipe->aInput * pipe->shape); + + //----- result color + // note: aDest = alpha2 = aResult = 0xff + cResult0 = state->grayTransfer[(Guchar)div255((0xff - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0])]; + + //----- write destination pixel + if (state->screen->test(pipe->x, pipe->y, cResult0)) { + *pipe->destColorPtr |= pipe->destColorMask; + } else { + *pipe->destColorPtr &= ~pipe->destColorMask; + } + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + + ++pipe->x; +} + +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeMono8 && pipe->destAlphaPtr +void Splash::pipeRunAAMono8(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, aResult; + SplashColor cDest; + Guchar cResult0; + + //----- read destination pixel + cDest[0] = *pipe->destColorPtr; + aDest = *pipe->destAlphaPtr; + + //----- source alpha + aSrc = div255(pipe->aInput * pipe->shape); + + //----- result alpha and non-isolated group element correction + aResult = aSrc + aDest - div255(aSrc * aDest); + alpha2 = aResult; + + //----- result color + if (alpha2 == 0) { + cResult0 = 0; + } else { + cResult0 = state->grayTransfer[(Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2)]; + } + + //----- write destination pixel + *pipe->destColorPtr++ = cResult0; + *pipe->destAlphaPtr++ = aResult; + + ++pipe->x; +} + +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeRGB8 && pipe->destAlphaPtr +void Splash::pipeRunAARGB8(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, aResult; + SplashColor cDest; + Guchar cResult0, cResult1, cResult2; + + //----- read destination pixel + cDest[0] = pipe->destColorPtr[0]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[2]; + aDest = *pipe->destAlphaPtr; + + //----- source alpha + aSrc = div255(pipe->aInput * pipe->shape); + + //----- result alpha and non-isolated group element correction + aResult = aSrc + aDest - div255(aSrc * aDest); + alpha2 = aResult; + + //----- result color + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = state->rgbTransferR[(Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2)]; + cResult1 = state->rgbTransferG[(Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * pipe->cSrc[1]) / alpha2)]; + cResult2 = state->rgbTransferB[(Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * pipe->cSrc[2]) / alpha2)]; + } + + //----- write destination pixel + *pipe->destColorPtr++ = cResult0; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult2; + *pipe->destAlphaPtr++ = aResult; + + ++pipe->x; +} + +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeXBGR8 && pipe->destAlphaPtr +void Splash::pipeRunAAXBGR8(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, aResult; + SplashColor cDest; + Guchar cResult0, cResult1, cResult2; + + //----- read destination pixel + cDest[0] = pipe->destColorPtr[2]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[0]; + aDest = *pipe->destAlphaPtr; + + //----- source alpha + aSrc = div255(pipe->aInput * pipe->shape); + + //----- result alpha and non-isolated group element correction + aResult = aSrc + aDest - div255(aSrc * aDest); + alpha2 = aResult; + + //----- result color + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = state->rgbTransferR[(Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2)]; + cResult1 = state->rgbTransferG[(Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * pipe->cSrc[1]) / alpha2)]; + cResult2 = state->rgbTransferB[(Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * pipe->cSrc[2]) / alpha2)]; + } + + //----- write destination pixel + *pipe->destColorPtr++ = cResult2; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult0; + *pipe->destColorPtr++ = 255; + *pipe->destAlphaPtr++ = aResult; + + ++pipe->x; +} + +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeBGR8 && pipe->destAlphaPtr +void Splash::pipeRunAABGR8(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, aResult; + SplashColor cDest; + Guchar cResult0, cResult1, cResult2; + + //----- read destination pixel + cDest[0] = pipe->destColorPtr[2]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[0]; + aDest = *pipe->destAlphaPtr; + + //----- source alpha + aSrc = div255(pipe->aInput * pipe->shape); + + //----- result alpha and non-isolated group element correction + aResult = aSrc + aDest - div255(aSrc * aDest); + alpha2 = aResult; + + //----- result color + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = state->rgbTransferR[(Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2)]; + cResult1 = state->rgbTransferG[(Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * pipe->cSrc[1]) / alpha2)]; + cResult2 = state->rgbTransferB[(Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * pipe->cSrc[2]) / alpha2)]; + } + + //----- write destination pixel + *pipe->destColorPtr++ = cResult2; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult0; + *pipe->destAlphaPtr++ = aResult; + + ++pipe->x; +} + +#if SPLASH_CMYK +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeCMYK8 && pipe->destAlphaPtr +void Splash::pipeRunAACMYK8(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, aResult; + SplashColor cDest; + Guchar cResult0, cResult1, cResult2, cResult3; + + //----- read destination pixel + cDest[0] = pipe->destColorPtr[0]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[2]; + cDest[3] = pipe->destColorPtr[3]; + aDest = *pipe->destAlphaPtr; + + //----- source alpha + aSrc = div255(pipe->aInput * pipe->shape); + + //----- result alpha and non-isolated group element correction + aResult = aSrc + aDest - div255(aSrc * aDest); + alpha2 = aResult; + + //----- result color + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + cResult3 = 0; + } else { + cResult0 = state->cmykTransferC[(Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2)]; + cResult1 = state->cmykTransferM[(Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * pipe->cSrc[1]) / alpha2)]; + cResult2 = state->cmykTransferY[(Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * pipe->cSrc[2]) / alpha2)]; + cResult3 = state->cmykTransferK[(Guchar)(((alpha2 - aSrc) * cDest[3] + + aSrc * pipe->cSrc[3]) / alpha2)]; + } + + //----- write destination pixel + if (state->overprintMask & 1) { + pipe->destColorPtr[0] = (state->overprintAdditive && pipe->shape != 0) ? + std::min(pipe->destColorPtr[0] + cResult0, 255) : + cResult0; + } + if (state->overprintMask & 2) { + pipe->destColorPtr[1] = (state->overprintAdditive && pipe->shape != 0) ? + std::min(pipe->destColorPtr[1] + cResult1, 255) : + cResult1; + } + if (state->overprintMask & 4) { + pipe->destColorPtr[2] = (state->overprintAdditive && pipe->shape != 0) ? + std::min(pipe->destColorPtr[2] + cResult2, 255) : + cResult2; + } + if (state->overprintMask & 8) { + pipe->destColorPtr[3] = (state->overprintAdditive && pipe->shape != 0) ? + std::min(pipe->destColorPtr[3] + cResult3, 255) : + cResult3; + } + pipe->destColorPtr += 4; + *pipe->destAlphaPtr++ = aResult; + + ++pipe->x; +} +#endif + +inline void Splash::pipeSetXY(SplashPipe *pipe, int x, int y) { + pipe->x = x; + pipe->y = y; + if (state->softMask) { + pipe->softMaskPtr = + &state->softMask->data[y * state->softMask->rowSize + x]; + } + switch (bitmap->mode) { + case splashModeMono1: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (x >> 3)]; + pipe->destColorMask = 0x80 >> (x & 7); + break; + case splashModeMono8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + x]; + break; + case splashModeRGB8: + case splashModeBGR8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 3 * x]; + break; + case splashModeXBGR8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x]; + break; +#endif + } + if (bitmap->alpha) { + pipe->destAlphaPtr = &bitmap->alpha[y * bitmap->width + x]; + } else { + pipe->destAlphaPtr = NULL; + } + if (state->inNonIsolatedGroup && alpha0Bitmap->alpha) { + pipe->alpha0Ptr = + &alpha0Bitmap->alpha[(alpha0Y + y) * alpha0Bitmap->width + + (alpha0X + x)]; + } else { + pipe->alpha0Ptr = NULL; + } +} + +inline void Splash::pipeIncX(SplashPipe *pipe) { + ++pipe->x; + if (state->softMask) { + ++pipe->softMaskPtr; + } + switch (bitmap->mode) { + case splashModeMono1: + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + break; + case splashModeMono8: + ++pipe->destColorPtr; + break; + case splashModeRGB8: + case splashModeBGR8: + pipe->destColorPtr += 3; + break; + case splashModeXBGR8: + pipe->destColorPtr += 4; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + pipe->destColorPtr += 4; + break; +#endif + } + if (pipe->destAlphaPtr) { + ++pipe->destAlphaPtr; + } + if (pipe->alpha0Ptr) { + ++pipe->alpha0Ptr; + } +} + +inline void Splash::drawPixel(SplashPipe *pipe, int x, int y, GBool noClip) { + if (unlikely(y < 0)) + return; + + if (noClip || state->clip->test(x, y)) { + pipeSetXY(pipe, x, y); + (this->*pipe->run)(pipe); + updateModX(x); + updateModY(y); + } +} + +inline void Splash::drawAAPixelInit() { + aaBufY = -1; +} + +inline void Splash::drawAAPixel(SplashPipe *pipe, int x, int y) { +#if splashAASize == 4 + static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, + 1, 2, 2, 3, 2, 3, 3, 4 }; + int w; +#else + int xx, yy; +#endif + SplashColorPtr p; + int x0, x1, t; + + if (x < 0 || x >= bitmap->width || + y < state->clip->getYMinI() || y > state->clip->getYMaxI()) { + return; + } + + // update aaBuf + if (y != aaBufY) { + memset(aaBuf->getDataPtr(), 0xff, + aaBuf->getRowSize() * aaBuf->getHeight()); + x0 = 0; + x1 = bitmap->width - 1; + state->clip->clipAALine(aaBuf, &x0, &x1, y); + aaBufY = y; + } + + // compute the shape value +#if splashAASize == 4 + p = aaBuf->getDataPtr() + (x >> 1); + w = aaBuf->getRowSize(); + if (x & 1) { + t = bitCount4[*p & 0x0f] + bitCount4[p[w] & 0x0f] + + bitCount4[p[2*w] & 0x0f] + bitCount4[p[3*w] & 0x0f]; + } else { + t = bitCount4[*p >> 4] + bitCount4[p[w] >> 4] + + bitCount4[p[2*w] >> 4] + bitCount4[p[3*w] >> 4]; + } +#else + t = 0; + for (yy = 0; yy < splashAASize; ++yy) { + for (xx = 0; xx < splashAASize; ++xx) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + + ((x * splashAASize + xx) >> 3); + t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1; + } + } +#endif + + // draw the pixel + if (t != 0) { + pipeSetXY(pipe, x, y); + pipe->shape = div255(aaGamma[t] * pipe->shape); + (this->*pipe->run)(pipe); + updateModX(x); + updateModY(y); + } +} + +inline void Splash::drawSpan(SplashPipe *pipe, int x0, int x1, int y, + GBool noClip) { + int x; + + if (noClip) { + pipeSetXY(pipe, x0, y); + for (x = x0; x <= x1; ++x) { + (this->*pipe->run)(pipe); + } + updateModX(x0); + updateModX(x1); + updateModY(y); + } else { + if (x0 < state->clip->getXMinI()) { + x0 = state->clip->getXMinI(); + } + if (x1 > state->clip->getXMaxI()) { + x1 = state->clip->getXMaxI(); + } + pipeSetXY(pipe, x0, y); + for (x = x0; x <= x1; ++x) { + if (state->clip->test(x, y)) { + (this->*pipe->run)(pipe); + updateModX(x); + updateModY(y); + } else { + pipeIncX(pipe); + } + } + } +} + +inline void Splash::drawAALine(SplashPipe *pipe, int x0, int x1, int y) { +#if splashAASize == 4 + static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, + 1, 2, 2, 3, 2, 3, 3, 4 }; + SplashColorPtr p0, p1, p2, p3; + int t; +#else + SplashColorPtr p; + int xx, yy, t; +#endif + int x; + +#if splashAASize == 4 + p0 = aaBuf->getDataPtr() + (x0 >> 1); + p1 = p0 + aaBuf->getRowSize(); + p2 = p1 + aaBuf->getRowSize(); + p3 = p2 + aaBuf->getRowSize(); +#endif + pipeSetXY(pipe, x0, y); + for (x = x0; x <= x1; ++x) { + + // compute the shape value +#if splashAASize == 4 + if (x & 1) { + t = bitCount4[*p0 & 0x0f] + bitCount4[*p1 & 0x0f] + + bitCount4[*p2 & 0x0f] + bitCount4[*p3 & 0x0f]; + ++p0; ++p1; ++p2; ++p3; + } else { + t = bitCount4[*p0 >> 4] + bitCount4[*p1 >> 4] + + bitCount4[*p2 >> 4] + bitCount4[*p3 >> 4]; + } +#else + t = 0; + for (yy = 0; yy < splashAASize; ++yy) { + for (xx = 0; xx < splashAASize; ++xx) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + + ((x * splashAASize + xx) >> 3); + t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1; + } + } +#endif + + if (t != 0) { + pipe->shape = aaGamma[t]; + (this->*pipe->run)(pipe); + updateModX(x); + updateModY(y); + } else { + pipeIncX(pipe); + } + } +} + +//------------------------------------------------------------------------ + +// Transform a point from user space to device space. +inline void Splash::transform(SplashCoord *matrix, + SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo) { + // [ m[0] m[1] 0 ] + // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ] + // [ m[4] m[5] 1 ] + *xo = xi * matrix[0] + yi * matrix[2] + matrix[4]; + *yo = xi * matrix[1] + yi * matrix[3] + matrix[5]; +} + +//------------------------------------------------------------------------ +// Splash +//------------------------------------------------------------------------ + +Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreenParams *screenParams) { + int i; + + bitmap = bitmapA; + vectorAntialias = vectorAntialiasA; + inShading = gFalse; + state = new SplashState(bitmap->width, bitmap->height, vectorAntialias, + screenParams); + if (vectorAntialias) { + aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize, + 1, splashModeMono1, gFalse); + for (i = 0; i <= splashAASize * splashAASize; ++i) { + aaGamma[i] = (Guchar)splashRound( + splashPow((SplashCoord)i / + (SplashCoord)(splashAASize * splashAASize), + splashAAGamma) * 255); + } + } else { + aaBuf = NULL; + } + minLineWidth = 0; + clearModRegion(); + debugMode = gFalse; +} + +Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreen *screenA) { + int i; + + bitmap = bitmapA; + inShading = gFalse; + vectorAntialias = vectorAntialiasA; + state = new SplashState(bitmap->width, bitmap->height, vectorAntialias, + screenA); + if (vectorAntialias) { + aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize, + 1, splashModeMono1, gFalse); + for (i = 0; i <= splashAASize * splashAASize; ++i) { + aaGamma[i] = (Guchar)splashRound( + splashPow((SplashCoord)i / + (SplashCoord)(splashAASize * splashAASize), + splashAAGamma) * 255); + } + } else { + aaBuf = NULL; + } + minLineWidth = 0; + clearModRegion(); + debugMode = gFalse; +} + +Splash::~Splash() { + while (state->next) { + restoreState(); + } + delete state; + if (vectorAntialias) { + delete aaBuf; + } +} + +//------------------------------------------------------------------------ +// state read +//------------------------------------------------------------------------ + +SplashCoord *Splash::getMatrix() { + return state->matrix; +} + +SplashPattern *Splash::getStrokePattern() { + return state->strokePattern; +} + +SplashPattern *Splash::getFillPattern() { + return state->fillPattern; +} + +SplashScreen *Splash::getScreen() { + return state->screen; +} + +SplashBlendFunc Splash::getBlendFunc() { + return state->blendFunc; +} + +SplashCoord Splash::getStrokeAlpha() { + return state->strokeAlpha; +} + +SplashCoord Splash::getFillAlpha() { + return state->fillAlpha; +} + +SplashCoord Splash::getLineWidth() { + return state->lineWidth; +} + +int Splash::getLineCap() { + return state->lineCap; +} + +int Splash::getLineJoin() { + return state->lineJoin; +} + +SplashCoord Splash::getMiterLimit() { + return state->miterLimit; +} + +SplashCoord Splash::getFlatness() { + return state->flatness; +} + +SplashCoord *Splash::getLineDash() { + return state->lineDash; +} + +int Splash::getLineDashLength() { + return state->lineDashLength; +} + +SplashCoord Splash::getLineDashPhase() { + return state->lineDashPhase; +} + +GBool Splash::getStrokeAdjust() { + return state->strokeAdjust; +} + +SplashClip *Splash::getClip() { + return state->clip; +} + +SplashBitmap *Splash::getSoftMask() { + return state->softMask; +} + +GBool Splash::getInNonIsolatedGroup() { + return state->inNonIsolatedGroup; +} + +//------------------------------------------------------------------------ +// state write +//------------------------------------------------------------------------ + +void Splash::setMatrix(SplashCoord *matrix) { + memcpy(state->matrix, matrix, 6 * sizeof(SplashCoord)); +} + +void Splash::setStrokePattern(SplashPattern *strokePattern) { + state->setStrokePattern(strokePattern); +} + +void Splash::setFillPattern(SplashPattern *fillPattern) { + state->setFillPattern(fillPattern); +} + +void Splash::setScreen(SplashScreen *screen) { + state->setScreen(screen); +} + +void Splash::setBlendFunc(SplashBlendFunc func) { + state->blendFunc = func; +} + +void Splash::setStrokeAlpha(SplashCoord alpha) { + state->strokeAlpha = alpha; +} + +void Splash::setFillAlpha(SplashCoord alpha) { + state->fillAlpha = alpha; +} + +void Splash::setFillOverprint(GBool fop) { + state->fillOverprint = fop; +} + +void Splash::setStrokeOverprint(GBool gop) { + state->strokeOverprint = gop; +} + +void Splash::setOverprintMode(int opm) { + state->overprintMode = opm; +} + +void Splash::setLineWidth(SplashCoord lineWidth) { + state->lineWidth = lineWidth; +} + +void Splash::setLineCap(int lineCap) { + state->lineCap = lineCap; +} + +void Splash::setLineJoin(int lineJoin) { + state->lineJoin = lineJoin; +} + +void Splash::setMiterLimit(SplashCoord miterLimit) { + state->miterLimit = miterLimit; +} + +void Splash::setFlatness(SplashCoord flatness) { + if (flatness < 1) { + state->flatness = 1; + } else { + state->flatness = flatness; + } +} + +void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength, + SplashCoord lineDashPhase) { + state->setLineDash(lineDash, lineDashLength, lineDashPhase); +} + +void Splash::setStrokeAdjust(GBool strokeAdjust) { + state->strokeAdjust = strokeAdjust; +} + +void Splash::clipResetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + state->clip->resetToRect(x0, y0, x1, y1); +} + +SplashError Splash::clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + return state->clip->clipToRect(x0, y0, x1, y1); +} + +SplashError Splash::clipToPath(SplashPath *path, GBool eo) { + return state->clip->clipToPath(path, state->matrix, state->flatness, eo); +} + +void Splash::setSoftMask(SplashBitmap *softMask) { + state->setSoftMask(softMask); +} + +void Splash::setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, + int alpha0XA, int alpha0YA) { + alpha0Bitmap = alpha0BitmapA; + alpha0X = alpha0XA; + alpha0Y = alpha0YA; + state->inNonIsolatedGroup = gTrue; +} + +void Splash::setTransfer(Guchar *red, Guchar *green, Guchar *blue, + Guchar *gray) { + state->setTransfer(red, green, blue, gray); +} + +void Splash::setOverprintMask(Guint overprintMask, GBool additive) { + state->overprintMask = overprintMask; + state->overprintAdditive = additive; +} + +//------------------------------------------------------------------------ +// state save/restore +//------------------------------------------------------------------------ + +void Splash::saveState() { + SplashState *newState; + + newState = state->copy(); + newState->next = state; + state = newState; +} + +SplashError Splash::restoreState() { + SplashState *oldState; + + if (!state->next) { + return splashErrNoSave; + } + oldState = state; + state = state->next; + delete oldState; + return splashOk; +} + +//------------------------------------------------------------------------ +// drawing operations +//------------------------------------------------------------------------ + +void Splash::clear(SplashColorPtr color, Guchar alpha) { + SplashColorPtr row, p; + Guchar mono; + int x, y; + + switch (bitmap->mode) { + case splashModeMono1: + mono = (color[0] & 0x80) ? 0xff : 0x00; + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + mono, -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, mono, bitmap->rowSize * bitmap->height); + } + break; + case splashModeMono8: + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + break; + case splashModeRGB8: + if (color[0] == color[1] && color[1] == color[2]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[2]; + *p++ = color[1]; + *p++ = color[0]; + } + row += bitmap->rowSize; + } + } + break; + case splashModeXBGR8: + if (color[0] == color[1] && color[1] == color[2]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[0]; + *p++ = color[1]; + *p++ = color[2]; + *p++ = 255; + } + row += bitmap->rowSize; + } + } + break; + case splashModeBGR8: + if (color[0] == color[1] && color[1] == color[2]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[0]; + *p++ = color[1]; + *p++ = color[2]; + } + row += bitmap->rowSize; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + if (color[0] == color[1] && color[1] == color[2] && color[2] == color[3]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[0]; + *p++ = color[1]; + *p++ = color[2]; + *p++ = color[3]; + } + row += bitmap->rowSize; + } + } + break; +#endif + } + + if (bitmap->alpha) { + memset(bitmap->alpha, alpha, bitmap->width * bitmap->height); + } + + updateModX(0); + updateModY(0); + updateModX(bitmap->width - 1); + updateModY(bitmap->height - 1); +} + +SplashError Splash::stroke(SplashPath *path) { + SplashPath *path2, *dPath; + SplashCoord d1, d2, t1, t2, w; + + if (debugMode) { + printf("stroke [dash:%d] [width:%.2f]:\n", + state->lineDashLength, (double)state->lineWidth); + dumpPath(path); + } + opClipRes = splashClipAllOutside; + if (path->length == 0) { + return splashErrEmptyPath; + } + path2 = flattenPath(path, state->matrix, state->flatness); + if (state->lineDashLength > 0) { + dPath = makeDashedPath(path2); + delete path2; + path2 = dPath; + if (path2->length == 0) { + delete path2; + return splashErrEmptyPath; + } + } + + // transform a unit square, and take the half the max of the two + // diagonals; the product of this number and the line width is the + // (approximate) transformed line width + t1 = state->matrix[0] + state->matrix[2]; + t2 = state->matrix[1] + state->matrix[3]; + d1 = t1 * t1 + t2 * t2; + t1 = state->matrix[0] - state->matrix[2]; + t2 = state->matrix[1] - state->matrix[3]; + d2 = t1 * t1 + t2 * t2; + if (d2 > d1) { + d1 = d2; + } + d1 *= 0.5; + if (d1 > 0 && + d1 * state->lineWidth * state->lineWidth < minLineWidth * minLineWidth) { + w = minLineWidth / splashSqrt(d1); + strokeWide(path2, w); + } else if (bitmap->mode == splashModeMono1) { + // this gets close to Adobe's behavior in mono mode + if (d1 <= 2) { + strokeNarrow(path2); + } else { + strokeWide(path2, state->lineWidth); + } + } else { + if (state->lineWidth == 0) { + strokeNarrow(path2); + } else { + strokeWide(path2, state->lineWidth); + } + } + + delete path2; + return splashOk; +} + +void Splash::strokeNarrow(SplashPath *path) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathSeg *seg; + int x0, x1, y0, y1, xa, xb, y; + SplashCoord dxdy; + SplashClipResult clipRes; + int nClipRes[3]; + int i; + + nClipRes[0] = nClipRes[1] = nClipRes[2] = 0; + + xPath = new SplashXPath(path, state->matrix, state->flatness, gFalse); + + pipeInit(&pipe, 0, 0, state->strokePattern, NULL, + (Guchar)splashRound(state->strokeAlpha * 255), + gFalse, gFalse); + + for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) { + if (seg->y0 <= seg->y1) { + y0 = splashFloor(seg->y0); + y1 = splashFloor(seg->y1); + x0 = splashFloor(seg->x0); + x1 = splashFloor(seg->x1); + } else { + y0 = splashFloor(seg->y1); + y1 = splashFloor(seg->y0); + x0 = splashFloor(seg->x1); + x1 = splashFloor(seg->x0); + } + if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0, + x0 <= x1 ? x1 : x0, y1)) + != splashClipAllOutside) { + if (y0 == y1) { + if (x0 <= x1) { + drawSpan(&pipe, x0, x1, y0, clipRes == splashClipAllInside); + } else { + drawSpan(&pipe, x1, x0, y0, clipRes == splashClipAllInside); + } + } else { + dxdy = seg->dxdy; + if (y0 < state->clip->getYMinI()) { + y0 = state->clip->getYMinI(); + x0 = splashFloor(seg->x0 + ((SplashCoord)y0 - seg->y0) * dxdy); + } + if (y1 > state->clip->getYMaxI()) { + y1 = state->clip->getYMaxI(); + x1 = splashFloor(seg->x0 + ((SplashCoord)y1 - seg->y0) * dxdy); + } + if (x0 <= x1) { + xa = x0; + for (y = y0; y <= y1; ++y) { + if (y < y1) { + xb = splashFloor(seg->x0 + + ((SplashCoord)y + 1 - seg->y0) * dxdy); + } else { + xb = x1 + 1; + } + if (xa == xb) { + drawPixel(&pipe, xa, y, clipRes == splashClipAllInside); + } else { + drawSpan(&pipe, xa, xb - 1, y, clipRes == splashClipAllInside); + } + xa = xb; + } + } else { + xa = x0; + for (y = y0; y <= y1; ++y) { + if (y < y1) { + xb = splashFloor(seg->x0 + + ((SplashCoord)y + 1 - seg->y0) * dxdy); + } else { + xb = x1 - 1; + } + if (xa == xb) { + drawPixel(&pipe, xa, y, clipRes == splashClipAllInside); + } else { + drawSpan(&pipe, xb + 1, xa, y, clipRes == splashClipAllInside); + } + xa = xb; + } + } + } + } + ++nClipRes[clipRes]; + } + if (nClipRes[splashClipPartial] || + (nClipRes[splashClipAllInside] && nClipRes[splashClipAllOutside])) { + opClipRes = splashClipPartial; + } else if (nClipRes[splashClipAllInside]) { + opClipRes = splashClipAllInside; + } else { + opClipRes = splashClipAllOutside; + } + + delete xPath; +} + +void Splash::strokeWide(SplashPath *path, SplashCoord w) { + SplashPath *path2; + + path2 = makeStrokePath(path, w, gFalse); + fillWithPattern(path2, gFalse, state->strokePattern, state->strokeAlpha); + delete path2; +} + +SplashPath *Splash::flattenPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness) { + SplashPath *fPath; + SplashCoord flatness2; + Guchar flag; + int i; + + fPath = new SplashPath(); +#if USE_FIXEDPOINT + flatness2 = flatness; +#else + flatness2 = flatness * flatness; +#endif + i = 0; + while (i < path->length) { + flag = path->flags[i]; + if (flag & splashPathFirst) { + fPath->moveTo(path->pts[i].x, path->pts[i].y); + ++i; + } else { + if (flag & splashPathCurve) { + flattenCurve(path->pts[i-1].x, path->pts[i-1].y, + path->pts[i ].x, path->pts[i ].y, + path->pts[i+1].x, path->pts[i+1].y, + path->pts[i+2].x, path->pts[i+2].y, + matrix, flatness2, fPath); + i += 3; + } else { + fPath->lineTo(path->pts[i].x, path->pts[i].y); + ++i; + } + if (path->flags[i-1] & splashPathClosed) { + fPath->close(); + } + } + } + return fPath; +} + +void Splash::flattenCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord *matrix, SplashCoord flatness2, + SplashPath *fPath) { + SplashCoord cx[splashMaxCurveSplits + 1][3]; + SplashCoord cy[splashMaxCurveSplits + 1][3]; + int cNext[splashMaxCurveSplits + 1]; + SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh; + SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh; + SplashCoord dx, dy, mx, my, tx, ty, d1, d2; + int p1, p2, p3; + + // initial segment + p1 = 0; + p2 = splashMaxCurveSplits; + cx[p1][0] = x0; cy[p1][0] = y0; + cx[p1][1] = x1; cy[p1][1] = y1; + cx[p1][2] = x2; cy[p1][2] = y2; + cx[p2][0] = x3; cy[p2][0] = y3; + cNext[p1] = p2; + + while (p1 < splashMaxCurveSplits) { + + // get the next segment + xl0 = cx[p1][0]; yl0 = cy[p1][0]; + xx1 = cx[p1][1]; yy1 = cy[p1][1]; + xx2 = cx[p1][2]; yy2 = cy[p1][2]; + p2 = cNext[p1]; + xr3 = cx[p2][0]; yr3 = cy[p2][0]; + + // compute the distances (in device space) from the control points + // to the midpoint of the straight line (this is a bit of a hack, + // but it's much faster than computing the actual distances to the + // line) + transform(matrix, (xl0 + xr3) * 0.5, (yl0 + yr3) * 0.5, &mx, &my); + transform(matrix, xx1, yy1, &tx, &ty); +#if USE_FIXEDPOINT + d1 = splashDist(tx, ty, mx, my); +#else + dx = tx - mx; + dy = ty - my; + d1 = dx*dx + dy*dy; +#endif + transform(matrix, xx2, yy2, &tx, &ty); +#if USE_FIXEDPOINT + d2 = splashDist(tx, ty, mx, my); +#else + dx = tx - mx; + dy = ty - my; + d2 = dx*dx + dy*dy; +#endif + + // if the curve is flat enough, or no more subdivisions are + // allowed, add the straight line segment + if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) { + fPath->lineTo(xr3, yr3); + p1 = p2; + + // otherwise, subdivide the curve + } else { + xl1 = splashAvg(xl0, xx1); + yl1 = splashAvg(yl0, yy1); + xh = splashAvg(xx1, xx2); + yh = splashAvg(yy1, yy2); + xl2 = splashAvg(xl1, xh); + yl2 = splashAvg(yl1, yh); + xr2 = splashAvg(xx2, xr3); + yr2 = splashAvg(yy2, yr3); + xr1 = splashAvg(xh, xr2); + yr1 = splashAvg(yh, yr2); + xr0 = splashAvg(xl2, xr1); + yr0 = splashAvg(yl2, yr1); + // add the new subdivision points + p3 = (p1 + p2) / 2; + cx[p1][1] = xl1; cy[p1][1] = yl1; + cx[p1][2] = xl2; cy[p1][2] = yl2; + cNext[p1] = p3; + cx[p3][0] = xr0; cy[p3][0] = yr0; + cx[p3][1] = xr1; cy[p3][1] = yr1; + cx[p3][2] = xr2; cy[p3][2] = yr2; + cNext[p3] = p2; + } + } +} + +SplashPath *Splash::makeDashedPath(SplashPath *path) { + SplashPath *dPath; + SplashCoord lineDashTotal; + SplashCoord lineDashStartPhase, lineDashDist, segLen; + SplashCoord x0, y0, x1, y1, xa, ya; + GBool lineDashStartOn, lineDashOn, newPath; + int lineDashStartIdx, lineDashIdx; + int i, j, k; + + lineDashTotal = 0; + for (i = 0; i < state->lineDashLength; ++i) { + lineDashTotal += state->lineDash[i]; + } + // Acrobat simply draws nothing if the dash array is [0] + if (lineDashTotal == 0) { + return new SplashPath(); + } + lineDashStartPhase = state->lineDashPhase; + i = splashFloor(lineDashStartPhase / lineDashTotal); + lineDashStartPhase -= (SplashCoord)i * lineDashTotal; + lineDashStartOn = gTrue; + lineDashStartIdx = 0; + if (lineDashStartPhase > 0) { + while (lineDashStartPhase >= state->lineDash[lineDashStartIdx]) { + lineDashStartOn = !lineDashStartOn; + lineDashStartPhase -= state->lineDash[lineDashStartIdx]; + ++lineDashStartIdx; + } + } + + dPath = new SplashPath(); + + // process each subpath + i = 0; + while (i < path->length) { + + // find the end of the subpath + for (j = i; + j < path->length - 1 && !(path->flags[j] & splashPathLast); + ++j) ; + + // initialize the dash parameters + lineDashOn = lineDashStartOn; + lineDashIdx = lineDashStartIdx; + lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase; + + // process each segment of the subpath + newPath = gTrue; + for (k = i; k < j; ++k) { + + // grab the segment + x0 = path->pts[k].x; + y0 = path->pts[k].y; + x1 = path->pts[k+1].x; + y1 = path->pts[k+1].y; + segLen = splashDist(x0, y0, x1, y1); + + // process the segment + while (segLen > 0) { + + if (lineDashDist >= segLen) { + if (lineDashOn) { + if (newPath) { + dPath->moveTo(x0, y0); + newPath = gFalse; + } + dPath->lineTo(x1, y1); + } + lineDashDist -= segLen; + segLen = 0; + + } else { + xa = x0 + (lineDashDist / segLen) * (x1 - x0); + ya = y0 + (lineDashDist / segLen) * (y1 - y0); + if (lineDashOn) { + if (newPath) { + dPath->moveTo(x0, y0); + newPath = gFalse; + } + dPath->lineTo(xa, ya); + } + x0 = xa; + y0 = ya; + segLen -= lineDashDist; + lineDashDist = 0; + } + + // get the next entry in the dash array + if (lineDashDist <= 0) { + lineDashOn = !lineDashOn; + if (++lineDashIdx == state->lineDashLength) { + lineDashIdx = 0; + } + lineDashDist = state->lineDash[lineDashIdx]; + newPath = gTrue; + } + } + } + i = j + 1; + } + + if (dPath->length == 0) { + GBool allSame = gTrue; + for (int i = 0; allSame && i < path->length - 1; ++i) { + allSame = path->pts[i].x == path->pts[i + 1].x && path->pts[i].y == path->pts[i + 1].y; + } + if (allSame) { + x0 = path->pts[0].x; + y0 = path->pts[0].y; + dPath->moveTo(x0, y0); + dPath->lineTo(x0, y0); + } + } + + return dPath; +} + +SplashError Splash::fill(SplashPath *path, GBool eo) { + if (debugMode) { + printf("fill [eo:%d]:\n", eo); + dumpPath(path); + } + return fillWithPattern(path, eo, state->fillPattern, state->fillAlpha); +} + +SplashError Splash::fillWithPattern(SplashPath *path, GBool eo, + SplashPattern *pattern, + SplashCoord alpha) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathScanner *scanner; + int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; + SplashClipResult clipRes, clipRes2; + + if (path->length == 0) { + return splashErrEmptyPath; + } + if (pathAllOutside(path)) { + opClipRes = splashClipAllOutside; + return splashOk; + } + + // add stroke adjustment hints for filled rectangles -- this only + // applies to paths that consist of a single subpath + // (this appears to match Acrobat's behavior) + if (state->strokeAdjust && !path->hints) { + int n; + n = path->getLength(); + if (n == 4 && + !(path->flags[0] & splashPathClosed) && + !(path->flags[1] & splashPathLast) && + !(path->flags[2] & splashPathLast)) { + path->close(gTrue); + path->addStrokeAdjustHint(0, 2, 0, 4); + path->addStrokeAdjustHint(1, 3, 0, 4); + } else if (n == 5 && + (path->flags[0] & splashPathClosed) && + !(path->flags[1] & splashPathLast) && + !(path->flags[2] & splashPathLast) && + !(path->flags[3] & splashPathLast)) { + path->addStrokeAdjustHint(0, 2, 0, 4); + path->addStrokeAdjustHint(1, 3, 0, 4); + } + } + + xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); + if (vectorAntialias && !inShading) { + xPath->aaScale(); + } + xPath->sort(); + yMinI = state->clip->getYMinI(); + yMaxI = state->clip->getYMaxI(); + if (vectorAntialias && !inShading) { + yMinI = yMinI * splashAASize; + yMaxI = (yMaxI + 1) * splashAASize - 1; + } + scanner = new SplashXPathScanner(xPath, eo, yMinI, yMaxI); + + // get the min and max x and y values + if (vectorAntialias && !inShading) { + scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI); + } else { + scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); + } + + // check clipping + if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) + != splashClipAllOutside) { + if (scanner->hasPartialClip()) { + clipRes = splashClipPartial; + } + + pipeInit(&pipe, 0, yMinI, pattern, NULL, (Guchar)splashRound(alpha * 255), + vectorAntialias && !inShading, gFalse); + + // draw the spans + if (vectorAntialias && !inShading) { + for (y = yMinI; y <= yMaxI; ++y) { + scanner->renderAALine(aaBuf, &x0, &x1, y); + if (clipRes != splashClipAllInside) { + state->clip->clipAALine(aaBuf, &x0, &x1, y); + } + drawAALine(&pipe, x0, x1, y); + } + } else { + for (y = yMinI; y <= yMaxI; ++y) { + while (scanner->getNextSpan(y, &x0, &x1)) { + if (clipRes == splashClipAllInside) { + drawSpan(&pipe, x0, x1, y, gTrue); + } else { + // limit the x range + if (x0 < state->clip->getXMinI()) { + x0 = state->clip->getXMinI(); + } + if (x1 > state->clip->getXMaxI()) { + x1 = state->clip->getXMaxI(); + } + clipRes2 = state->clip->testSpan(x0, x1, y); + drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); + } + } + } + } + } + opClipRes = clipRes; + + delete scanner; + delete xPath; + return splashOk; +} + +GBool Splash::pathAllOutside(SplashPath *path) { + SplashCoord xMin1, yMin1, xMax1, yMax1; + SplashCoord xMin2, yMin2, xMax2, yMax2; + SplashCoord x, y; + int xMinI, yMinI, xMaxI, yMaxI; + int i; + + xMin1 = xMax1 = path->pts[0].x; + yMin1 = yMax1 = path->pts[0].y; + for (i = 1; i < path->length; ++i) { + if (path->pts[i].x < xMin1) { + xMin1 = path->pts[i].x; + } else if (path->pts[i].x > xMax1) { + xMax1 = path->pts[i].x; + } + if (path->pts[i].y < yMin1) { + yMin1 = path->pts[i].y; + } else if (path->pts[i].y > yMax1) { + yMax1 = path->pts[i].y; + } + } + + transform(state->matrix, xMin1, yMin1, &x, &y); + xMin2 = xMax2 = x; + yMin2 = yMax2 = y; + transform(state->matrix, xMin1, yMax1, &x, &y); + if (x < xMin2) { + xMin2 = x; + } else if (x > xMax2) { + xMax2 = x; + } + if (y < yMin2) { + yMin2 = y; + } else if (y > yMax2) { + yMax2 = y; + } + transform(state->matrix, xMax1, yMin1, &x, &y); + if (x < xMin2) { + xMin2 = x; + } else if (x > xMax2) { + xMax2 = x; + } + if (y < yMin2) { + yMin2 = y; + } else if (y > yMax2) { + yMax2 = y; + } + transform(state->matrix, xMax1, yMax1, &x, &y); + if (x < xMin2) { + xMin2 = x; + } else if (x > xMax2) { + xMax2 = x; + } + if (y < yMin2) { + yMin2 = y; + } else if (y > yMax2) { + yMax2 = y; + } + xMinI = splashFloor(xMin2); + yMinI = splashFloor(yMin2); + xMaxI = splashFloor(xMax2); + yMaxI = splashFloor(yMax2); + + return state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI) == + splashClipAllOutside; +} + +SplashError Splash::xorFill(SplashPath *path, GBool eo) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathScanner *scanner; + int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; + SplashClipResult clipRes, clipRes2; + SplashBlendFunc origBlendFunc; + + if (path->length == 0) { + return splashErrEmptyPath; + } + xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); + xPath->sort(); + scanner = new SplashXPathScanner(xPath, eo, state->clip->getYMinI(), + state->clip->getYMaxI()); + + // get the min and max x and y values + scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); + + // check clipping + if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) + != splashClipAllOutside) { + if (scanner->hasPartialClip()) { + clipRes = splashClipPartial; + } + + origBlendFunc = state->blendFunc; + state->blendFunc = &blendXor; + pipeInit(&pipe, 0, yMinI, state->fillPattern, NULL, 255, gFalse, gFalse); + + // draw the spans + for (y = yMinI; y <= yMaxI; ++y) { + while (scanner->getNextSpan(y, &x0, &x1)) { + if (clipRes == splashClipAllInside) { + drawSpan(&pipe, x0, x1, y, gTrue); + } else { + // limit the x range + if (x0 < state->clip->getXMinI()) { + x0 = state->clip->getXMinI(); + } + if (x1 > state->clip->getXMaxI()) { + x1 = state->clip->getXMaxI(); + } + clipRes2 = state->clip->testSpan(x0, x1, y); + drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); + } + } + } + state->blendFunc = origBlendFunc; + } + opClipRes = clipRes; + + delete scanner; + delete xPath; + return splashOk; +} + +SplashError Splash::fillChar(SplashCoord x, SplashCoord y, + int c, SplashFont *font) { + SplashGlyphBitmap glyph; + SplashCoord xt, yt; + int x0, y0, xFrac, yFrac; + SplashClipResult clipRes; + + if (debugMode) { + printf("fillChar: x=%.2f y=%.2f c=%3d=0x%02x='%c'\n", + (double)x, (double)y, c, c, c); + } + transform(state->matrix, x, y, &xt, &yt); + x0 = splashFloor(xt); + xFrac = splashFloor((xt - x0) * splashFontFraction); + y0 = splashFloor(yt); + yFrac = splashFloor((yt - y0) * splashFontFraction); + if (!font->getGlyph(c, xFrac, yFrac, &glyph, x0, y0, state->clip, &clipRes)) { + return splashErrNoGlyph; + } + if (clipRes != splashClipAllOutside) { + fillGlyph2(x0, y0, &glyph, clipRes == splashClipAllInside); + } + opClipRes = clipRes; + if (glyph.freeData) { + gfree(glyph.data); + } + return splashOk; +} + +void Splash::fillGlyph(SplashCoord x, SplashCoord y, + SplashGlyphBitmap *glyph) { + SplashCoord xt, yt; + int x0, y0; + + transform(state->matrix, x, y, &xt, &yt); + x0 = splashFloor(xt); + y0 = splashFloor(yt); + SplashClipResult clipRes = state->clip->testRect(x0 - glyph->x, + y0 - glyph->y, + x0 - glyph->x + glyph->w - 1, + y0 - glyph->y + glyph->h - 1); + if (clipRes != splashClipAllOutside) { + fillGlyph2(x0, y0, glyph, clipRes == splashClipAllInside); + } + opClipRes = clipRes; +} + +void Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noClip) { + SplashPipe pipe; + int alpha0; + Guchar alpha; + Guchar *p; + int x1, y1, xx, xx1, yy; + + p = glyph->data; + int xStart = x0 - glyph->x; + int yStart = y0 - glyph->y; + int xxLimit = glyph->w; + int yyLimit = glyph->h; + int xShift = 0; + + if (yStart < 0) + { + p += (glyph->aa ? glyph->w : splashCeil(glyph->w / 8.0)) * -yStart; // move p to the beginning of the first painted row + yyLimit += yStart; + yStart = 0; + } + + if (xStart < 0) + { + if (glyph->aa) { + p += -xStart; + } else { + p += (-xStart) / 8; + xShift = (-xStart) % 8; + } + xxLimit += xStart; + xStart = 0; + } + + if (xxLimit + xStart >= bitmap->width) xxLimit = bitmap->width - xStart; + if (yyLimit + yStart >= bitmap->height) yyLimit = bitmap->height - yStart; + + if (noClip) { + if (glyph->aa) { + pipeInit(&pipe, xStart, yStart, + state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) { + pipeSetXY(&pipe, xStart, y1); + for (xx = 0, x1 = xStart; xx < xxLimit; ++xx, ++x1) { + alpha = p[xx]; + if (alpha != 0) { + pipe.shape = alpha; + (this->*pipe.run)(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + } + p += glyph->w; + } + } else { + const int widthEight = splashCeil(glyph->w / 8.0); + + pipeInit(&pipe, xStart, yStart, + state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gFalse, gFalse); + for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) { + pipeSetXY(&pipe, xStart, y1); + for (xx = 0, x1 = xStart; xx < xxLimit; xx += 8) { + alpha0 = (xShift > 0 ? (p[xx / 8] << xShift) | (p[xx / 8 + 1] >> (8 - xShift)) : p[xx / 8]); + for (xx1 = 0; xx1 < 8 && xx + xx1 < xxLimit; ++xx1, ++x1) { + if (alpha0 & 0x80) { + (this->*pipe.run)(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + alpha0 <<= 1; + } + } + p += widthEight; + } + } + } else { + if (glyph->aa) { + pipeInit(&pipe, xStart, yStart, + state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) { + pipeSetXY(&pipe, xStart, y1); + for (xx = 0, x1 = xStart; xx < xxLimit; ++xx, ++x1) { + if (state->clip->test(x1, y1)) { + alpha = p[xx]; + if (alpha != 0) { + pipe.shape = alpha; + (this->*pipe.run)(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + } else { + pipeIncX(&pipe); + } + } + p += glyph->w; + } + } else { + const int widthEight = splashCeil(glyph->w / 8.0); + + pipeInit(&pipe, xStart, yStart, + state->fillPattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), gFalse, gFalse); + for (yy = 0, y1 = yStart; yy < yyLimit; ++yy, ++y1) { + pipeSetXY(&pipe, xStart, y1); + for (xx = 0, x1 = xStart; xx < xxLimit; xx += 8) { + alpha0 = (xShift > 0 ? (p[xx / 8] << xShift) | (p[xx / 8 + 1] >> (8 - xShift)) : p[xx / 8]); + for (xx1 = 0; xx1 < 8 && xx + xx1 < xxLimit; ++xx1, ++x1) { + if (state->clip->test(x1, y1)) { + if (alpha0 & 0x80) { + (this->*pipe.run)(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + } else { + pipeIncX(&pipe); + } + alpha0 <<= 1; + } + } + p += widthEight; + } + } + } +} + +SplashError Splash::fillImageMask(SplashImageMaskSource src, void *srcData, + int w, int h, SplashCoord *mat, + GBool glyphMode) { + SplashBitmap *scaledMask; + SplashClipResult clipRes; + GBool minorAxisZero; + int x0, y0, x1, y1, scaledWidth, scaledHeight; + int yp; + + if (debugMode) { + printf("fillImageMask: w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n", + w, h, (double)mat[0], (double)mat[1], (double)mat[2], + (double)mat[3], (double)mat[4], (double)mat[5]); + } + + if (w == 0 && h == 0) return splashErrZeroImage; + + // check for singular matrix + if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.000001)) { + return splashErrSingularMatrix; + } + + minorAxisZero = mat[1] == 0 && mat[2] == 0; + + // scaling only + if (mat[0] > 0 && minorAxisZero && mat[3] > 0) { + x0 = imgCoordMungeLowerC(mat[4], glyphMode); + y0 = imgCoordMungeLowerC(mat[5], glyphMode); + x1 = imgCoordMungeUpperC(mat[0] + mat[4], glyphMode); + y1 = imgCoordMungeUpperC(mat[3] + mat[5], glyphMode); + // make sure narrow images cover at least one pixel + if (x0 == x1) { + ++x1; + } + if (y0 == y1) { + ++y1; + } + clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1); + opClipRes = clipRes; + if (clipRes != splashClipAllOutside) { + scaledWidth = x1 - x0; + scaledHeight = y1 - y0; + yp = h / scaledHeight; + if (yp < 0 || yp > INT_MAX - 1) { + return splashErrBadArg; + } + scaledMask = scaleMask(src, srcData, w, h, scaledWidth, scaledHeight); + blitMask(scaledMask, x0, y0, clipRes); + delete scaledMask; + } + + // scaling plus vertical flip + } else if (mat[0] > 0 && minorAxisZero && mat[3] < 0) { + x0 = imgCoordMungeLowerC(mat[4], glyphMode); + y0 = imgCoordMungeLowerC(mat[3] + mat[5], glyphMode); + x1 = imgCoordMungeUpperC(mat[0] + mat[4], glyphMode); + y1 = imgCoordMungeUpperC(mat[5], glyphMode); + // make sure narrow images cover at least one pixel + if (x0 == x1) { + ++x1; + } + if (y0 == y1) { + ++y1; + } + clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1); + opClipRes = clipRes; + if (clipRes != splashClipAllOutside) { + scaledWidth = x1 - x0; + scaledHeight = y1 - y0; + yp = h / scaledHeight; + if (yp < 0 || yp > INT_MAX - 1) { + return splashErrBadArg; + } + scaledMask = scaleMask(src, srcData, w, h, scaledWidth, scaledHeight); + vertFlipImage(scaledMask, scaledWidth, scaledHeight, 1); + blitMask(scaledMask, x0, y0, clipRes); + delete scaledMask; + } + + // all other cases + } else { + arbitraryTransformMask(src, srcData, w, h, mat, glyphMode); + } + + return splashOk; +} + +void Splash::arbitraryTransformMask(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + SplashCoord *mat, GBool glyphMode) { + SplashBitmap *scaledMask; + SplashClipResult clipRes, clipRes2; + SplashPipe pipe; + int scaledWidth, scaledHeight, t0, t1; + SplashCoord r00, r01, r10, r11, det, ir00, ir01, ir10, ir11; + SplashCoord vx[4], vy[4]; + int xMin, yMin, xMax, yMax; + ImageSection section[3]; + int nSections; + int y, xa, xb, x, i, xx, yy; + + // compute the four vertices of the target quadrilateral + vx[0] = mat[4]; vy[0] = mat[5]; + vx[1] = mat[2] + mat[4]; vy[1] = mat[3] + mat[5]; + vx[2] = mat[0] + mat[2] + mat[4]; vy[2] = mat[1] + mat[3] + mat[5]; + vx[3] = mat[0] + mat[4]; vy[3] = mat[1] + mat[5]; + + // clipping + xMin = imgCoordMungeLowerC(vx[0], glyphMode); + xMax = imgCoordMungeUpperC(vx[0], glyphMode); + yMin = imgCoordMungeLowerC(vy[0], glyphMode); + yMax = imgCoordMungeUpperC(vy[0], glyphMode); + for (i = 1; i < 4; ++i) { + t0 = imgCoordMungeLowerC(vx[i], glyphMode); + if (t0 < xMin) { + xMin = t0; + } + t0 = imgCoordMungeUpperC(vx[i], glyphMode); + if (t0 > xMax) { + xMax = t0; + } + t1 = imgCoordMungeLowerC(vy[i], glyphMode); + if (t1 < yMin) { + yMin = t1; + } + t1 = imgCoordMungeUpperC(vy[i], glyphMode); + if (t1 > yMax) { + yMax = t1; + } + } + clipRes = state->clip->testRect(xMin, yMin, xMax - 1, yMax - 1); + opClipRes = clipRes; + if (clipRes == splashClipAllOutside) { + return; + } + + // compute the scale factors + if (mat[0] >= 0) { + t0 = imgCoordMungeUpperC(mat[0] + mat[4], glyphMode) - + imgCoordMungeLowerC(mat[4], glyphMode); + } else { + t0 = imgCoordMungeUpperC(mat[4], glyphMode) - + imgCoordMungeLowerC(mat[0] + mat[4], glyphMode); + } + if (mat[1] >= 0) { + t1 = imgCoordMungeUpperC(mat[1] + mat[5], glyphMode) - + imgCoordMungeLowerC(mat[5], glyphMode); + } else { + t1 = imgCoordMungeUpperC(mat[5], glyphMode) - + imgCoordMungeLowerC(mat[1] + mat[5], glyphMode); + } + scaledWidth = t0 > t1 ? t0 : t1; + if (mat[2] >= 0) { + t0 = imgCoordMungeUpperC(mat[2] + mat[4], glyphMode) - + imgCoordMungeLowerC(mat[4], glyphMode); + } else { + t0 = imgCoordMungeUpperC(mat[4], glyphMode) - + imgCoordMungeLowerC(mat[2] + mat[4], glyphMode); + } + if (mat[3] >= 0) { + t1 = imgCoordMungeUpperC(mat[3] + mat[5], glyphMode) - + imgCoordMungeLowerC(mat[5], glyphMode); + } else { + t1 = imgCoordMungeUpperC(mat[5], glyphMode) - + imgCoordMungeLowerC(mat[3] + mat[5], glyphMode); + } + scaledHeight = t0 > t1 ? t0 : t1; + if (scaledWidth == 0) { + scaledWidth = 1; + } + if (scaledHeight == 0) { + scaledHeight = 1; + } + + // compute the inverse transform (after scaling) matrix + r00 = mat[0] / scaledWidth; + r01 = mat[1] / scaledWidth; + r10 = mat[2] / scaledHeight; + r11 = mat[3] / scaledHeight; + det = r00 * r11 - r01 * r10; + if (splashAbs(det) < 1e-6) { + // this should be caught by the singular matrix check in fillImageMask + return; + } + ir00 = r11 / det; + ir01 = -r01 / det; + ir10 = -r10 / det; + ir11 = r00 / det; + + // scale the input image + scaledMask = scaleMask(src, srcData, srcWidth, srcHeight, + scaledWidth, scaledHeight); + + // construct the three sections + i = (vy[2] <= vy[3]) ? 2 : 3; + if (vy[1] <= vy[i]) { + i = 1; + } + if (vy[0] < vy[i] || (i != 3 && vy[0] == vy[i])) { + i = 0; + } + if (vy[i] == vy[(i+1) & 3]) { + section[0].y0 = imgCoordMungeLowerC(vy[i], glyphMode); + section[0].y1 = imgCoordMungeUpperC(vy[(i+2) & 3], glyphMode) - 1; + if (vx[i] < vx[(i+1) & 3]) { + section[0].ia0 = i; + section[0].ia1 = (i+3) & 3; + section[0].ib0 = (i+1) & 3; + section[0].ib1 = (i+2) & 3; + } else { + section[0].ia0 = (i+1) & 3; + section[0].ia1 = (i+2) & 3; + section[0].ib0 = i; + section[0].ib1 = (i+3) & 3; + } + nSections = 1; + } else { + section[0].y0 = imgCoordMungeLowerC(vy[i], glyphMode); + section[2].y1 = imgCoordMungeUpperC(vy[(i+2) & 3], glyphMode) - 1; + section[0].ia0 = section[0].ib0 = i; + section[2].ia1 = section[2].ib1 = (i+2) & 3; + if (vx[(i+1) & 3] < vx[(i+3) & 3]) { + section[0].ia1 = section[2].ia0 = (i+1) & 3; + section[0].ib1 = section[2].ib0 = (i+3) & 3; + } else { + section[0].ia1 = section[2].ia0 = (i+3) & 3; + section[0].ib1 = section[2].ib0 = (i+1) & 3; + } + if (vy[(i+1) & 3] < vy[(i+3) & 3]) { + section[1].y0 = imgCoordMungeLowerC(vy[(i+1) & 3], glyphMode); + section[2].y0 = imgCoordMungeUpperC(vy[(i+3) & 3], glyphMode); + if (vx[(i+1) & 3] < vx[(i+3) & 3]) { + section[1].ia0 = (i+1) & 3; + section[1].ia1 = (i+2) & 3; + section[1].ib0 = i; + section[1].ib1 = (i+3) & 3; + } else { + section[1].ia0 = i; + section[1].ia1 = (i+3) & 3; + section[1].ib0 = (i+1) & 3; + section[1].ib1 = (i+2) & 3; + } + } else { + section[1].y0 = imgCoordMungeLowerC(vy[(i+3) & 3], glyphMode); + section[2].y0 = imgCoordMungeUpperC(vy[(i+1) & 3], glyphMode); + if (vx[(i+1) & 3] < vx[(i+3) & 3]) { + section[1].ia0 = i; + section[1].ia1 = (i+1) & 3; + section[1].ib0 = (i+3) & 3; + section[1].ib1 = (i+2) & 3; + } else { + section[1].ia0 = (i+3) & 3; + section[1].ia1 = (i+2) & 3; + section[1].ib0 = i; + section[1].ib1 = (i+1) & 3; + } + } + section[0].y1 = section[1].y0 - 1; + section[1].y1 = section[2].y0 - 1; + nSections = 3; + } + for (i = 0; i < nSections; ++i) { + section[i].xa0 = vx[section[i].ia0]; + section[i].ya0 = vy[section[i].ia0]; + section[i].xa1 = vx[section[i].ia1]; + section[i].ya1 = vy[section[i].ia1]; + section[i].xb0 = vx[section[i].ib0]; + section[i].yb0 = vy[section[i].ib0]; + section[i].xb1 = vx[section[i].ib1]; + section[i].yb1 = vy[section[i].ib1]; + section[i].dxdya = (section[i].xa1 - section[i].xa0) / + (section[i].ya1 - section[i].ya0); + section[i].dxdyb = (section[i].xb1 - section[i].xb0) / + (section[i].yb1 - section[i].yb0); + } + + // initialize the pixel pipe + pipeInit(&pipe, 0, 0, state->fillPattern, NULL, + (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + if (vectorAntialias) { + drawAAPixelInit(); + } + + // make sure narrow images cover at least one pixel + if (nSections == 1) { + if (section[0].y0 == section[0].y1) { + ++section[0].y1; + clipRes = opClipRes = splashClipPartial; + } + } else { + if (section[0].y0 == section[2].y1) { + ++section[1].y1; + clipRes = opClipRes = splashClipPartial; + } + } + + // scan all pixels inside the target region + for (i = 0; i < nSections; ++i) { + for (y = section[i].y0; y <= section[i].y1; ++y) { + xa = imgCoordMungeLowerC(section[i].xa0 + + ((SplashCoord)y + 0.5 - section[i].ya0) * + section[i].dxdya, + glyphMode); + xb = imgCoordMungeUpperC(section[i].xb0 + + ((SplashCoord)y + 0.5 - section[i].yb0) * + section[i].dxdyb, + glyphMode); + // make sure narrow images cover at least one pixel + if (xa == xb) { + ++xb; + } + if (clipRes != splashClipAllInside) { + clipRes2 = state->clip->testSpan(xa, xb - 1, y); + } else { + clipRes2 = clipRes; + } + for (x = xa; x < xb; ++x) { + // map (x+0.5, y+0.5) back to the scaled image + xx = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir00 + + ((SplashCoord)y + 0.5 - mat[5]) * ir10); + yy = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir01 + + ((SplashCoord)y + 0.5 - mat[5]) * ir11); + // xx should always be within bounds, but floating point + // inaccuracy can cause problems + if (xx < 0) { + xx = 0; + } else if (xx >= scaledWidth) { + xx = scaledWidth - 1; + } + if (yy < 0) { + yy = 0; + } else if (yy >= scaledHeight) { + yy = scaledHeight - 1; + } + pipe.shape = scaledMask->data[yy * scaledWidth + xx]; + if (vectorAntialias && clipRes2 != splashClipAllInside) { + drawAAPixel(&pipe, x, y); + } else { + drawPixel(&pipe, x, y, clipRes2 == splashClipAllInside); + } + } + } + } + + delete scaledMask; +} + +// Scale an image mask into a SplashBitmap. +SplashBitmap *Splash::scaleMask(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight) { + SplashBitmap *dest; + + dest = new SplashBitmap(scaledWidth, scaledHeight, 1, splashModeMono8, + gFalse); + if (scaledHeight < srcHeight) { + if (scaledWidth < srcWidth) { + scaleMaskYdXd(src, srcData, srcWidth, srcHeight, + scaledWidth, scaledHeight, dest); + } else { + scaleMaskYdXu(src, srcData, srcWidth, srcHeight, + scaledWidth, scaledHeight, dest); + } + } else { + if (scaledWidth < srcWidth) { + scaleMaskYuXd(src, srcData, srcWidth, srcHeight, + scaledWidth, scaledHeight, dest); + } else { + scaleMaskYuXu(src, srcData, srcWidth, srcHeight, + scaledWidth, scaledHeight, dest); + } + } + return dest; +} + +void Splash::scaleMaskYdXd(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf; + Guint *pixBuf; + Guint pix; + Guchar *destPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, d, d0, d1; + int i, j; + + // Bresenham parameters for y scale + yp = srcHeight / scaledHeight; + yq = srcHeight % scaledHeight; + + // Bresenham parameters for x scale + xp = srcWidth / scaledWidth; + xq = srcWidth % scaledWidth; + + // allocate buffers + lineBuf = (Guchar *)gmalloc(srcWidth); + pixBuf = (Guint *)gmallocn(srcWidth, sizeof(int)); + + // init y scale Bresenham + yt = 0; + + destPtr = dest->data; + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= scaledHeight) { + yt -= scaledHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read rows from image + memset(pixBuf, 0, srcWidth * sizeof(int)); + for (i = 0; i < yStep; ++i) { + (*src)(srcData, lineBuf); + for (j = 0; j < srcWidth; ++j) { + pixBuf[j] += lineBuf[j]; + } + } + + // init x scale Bresenham + xt = 0; + d0 = (255 << 23) / (yStep * xp); + d1 = (255 << 23) / (yStep * (xp + 1)); + + xx = 0; + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= scaledWidth) { + xt -= scaledWidth; + xStep = xp + 1; + d = d1; + } else { + xStep = xp; + d = d0; + } + + // compute the final pixel + pix = 0; + for (i = 0; i < xStep; ++i) { + pix += pixBuf[xx++]; + } + // (255 * pix) / xStep * yStep + pix = (pix * d) >> 23; + + // store the pixel + *destPtr++ = (Guchar)pix; + } + } + + gfree(pixBuf); + gfree(lineBuf); +} + +void Splash::scaleMaskYdXu(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf; + Guint *pixBuf; + Guint pix; + Guchar *destPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, d; + int i, j; + + // Bresenham parameters for y scale + yp = srcHeight / scaledHeight; + yq = srcHeight % scaledHeight; + + // Bresenham parameters for x scale + xp = scaledWidth / srcWidth; + xq = scaledWidth % srcWidth; + + // allocate buffers + lineBuf = (Guchar *)gmalloc(srcWidth); + pixBuf = (Guint *)gmallocn(srcWidth, sizeof(int)); + + // init y scale Bresenham + yt = 0; + + destPtr = dest->data; + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= scaledHeight) { + yt -= scaledHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read rows from image + memset(pixBuf, 0, srcWidth * sizeof(int)); + for (i = 0; i < yStep; ++i) { + (*src)(srcData, lineBuf); + for (j = 0; j < srcWidth; ++j) { + pixBuf[j] += lineBuf[j]; + } + } + + // init x scale Bresenham + xt = 0; + d = (255 << 23) / yStep; + + for (x = 0; x < srcWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= srcWidth) { + xt -= srcWidth; + xStep = xp + 1; + } else { + xStep = xp; + } + + // compute the final pixel + pix = pixBuf[x]; + // (255 * pix) / yStep + pix = (pix * d) >> 23; + + // store the pixel + for (i = 0; i < xStep; ++i) { + *destPtr++ = (Guchar)pix; + } + } + } + + gfree(pixBuf); + gfree(lineBuf); +} + +void Splash::scaleMaskYuXd(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf; + Guint pix; + Guchar *destPtr0, *destPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, d, d0, d1; + int i; + + // Bresenham parameters for y scale + yp = scaledHeight / srcHeight; + yq = scaledHeight % srcHeight; + + // Bresenham parameters for x scale + xp = srcWidth / scaledWidth; + xq = srcWidth % scaledWidth; + + // allocate buffers + lineBuf = (Guchar *)gmalloc(srcWidth); + + // init y scale Bresenham + yt = 0; + + destPtr0 = dest->data; + for (y = 0; y < srcHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= srcHeight) { + yt -= srcHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read row from image + (*src)(srcData, lineBuf); + + // init x scale Bresenham + xt = 0; + d0 = (255 << 23) / xp; + d1 = (255 << 23) / (xp + 1); + + xx = 0; + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= scaledWidth) { + xt -= scaledWidth; + xStep = xp + 1; + d = d1; + } else { + xStep = xp; + d = d0; + } + + // compute the final pixel + pix = 0; + for (i = 0; i < xStep; ++i) { + pix += lineBuf[xx++]; + } + // (255 * pix) / xStep + pix = (pix * d) >> 23; + + // store the pixel + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + i * scaledWidth + x; + *destPtr = (Guchar)pix; + } + } + + destPtr0 += yStep * scaledWidth; + } + + gfree(lineBuf); +} + +void Splash::scaleMaskYuXu(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf; + Guint pix; + Guchar *destPtr0, *destPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx; + int i, j; + + // Bresenham parameters for y scale + yp = scaledHeight / srcHeight; + yq = scaledHeight % srcHeight; + + // Bresenham parameters for x scale + xp = scaledWidth / srcWidth; + xq = scaledWidth % srcWidth; + + // allocate buffers + lineBuf = (Guchar *)gmalloc(srcWidth); + + // init y scale Bresenham + yt = 0; + + destPtr0 = dest->data; + for (y = 0; y < srcHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= srcHeight) { + yt -= srcHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read row from image + (*src)(srcData, lineBuf); + + // init x scale Bresenham + xt = 0; + + xx = 0; + for (x = 0; x < srcWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= srcWidth) { + xt -= srcWidth; + xStep = xp + 1; + } else { + xStep = xp; + } + + // compute the final pixel + pix = lineBuf[x] ? 255 : 0; + + // store the pixel + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + i * scaledWidth + xx + j; + *destPtr++ = (Guchar)pix; + } + } + + xx += xStep; + } + + destPtr0 += yStep * scaledWidth; + } + + gfree(lineBuf); +} + +void Splash::blitMask(SplashBitmap *src, int xDest, int yDest, + SplashClipResult clipRes) { + SplashPipe pipe; + Guchar *p; + int w, h, x, y; + + w = src->getWidth(); + h = src->getHeight(); + if (vectorAntialias && clipRes != splashClipAllInside) { + pipeInit(&pipe, xDest, yDest, state->fillPattern, NULL, + (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + drawAAPixelInit(); + p = src->getDataPtr(); + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + pipe.shape = *p++; + drawAAPixel(&pipe, xDest + x, yDest + y); + } + } + } else { + pipeInit(&pipe, xDest, yDest, state->fillPattern, NULL, + (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + p = src->getDataPtr(); + if (clipRes == splashClipAllInside) { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + if (*p) { + pipe.shape = *p; + (this->*pipe.run)(&pipe); + } else { + pipeIncX(&pipe); + } + ++p; + } + } + updateModX(xDest); + updateModX(xDest + w - 1); + updateModY(yDest); + updateModY(yDest + h - 1); + } else { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + if (*p && state->clip->test(xDest + x, yDest + y)) { + pipe.shape = *p; + (this->*pipe.run)(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + } + ++p; + } + } + } + } +} + +SplashError Splash::drawImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, GBool srcAlpha, + int w, int h, SplashCoord *mat, + GBool tilingPattern) { + GBool ok; + SplashBitmap *scaledImg; + SplashClipResult clipRes; + GBool minorAxisZero; + int x0, y0, x1, y1, scaledWidth, scaledHeight; + int nComps; + int yp; + + if (debugMode) { + printf("drawImage: srcMode=%d srcAlpha=%d w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n", + srcMode, srcAlpha, w, h, (double)mat[0], (double)mat[1], (double)mat[2], + (double)mat[3], (double)mat[4], (double)mat[5]); + } + + // check color modes + ok = gFalse; // make gcc happy + nComps = 0; // make gcc happy + switch (bitmap->mode) { + case splashModeMono1: + case splashModeMono8: + ok = srcMode == splashModeMono8; + nComps = 1; + break; + case splashModeRGB8: + ok = srcMode == splashModeRGB8; + nComps = 3; + break; + case splashModeXBGR8: + ok = srcMode == splashModeXBGR8; + nComps = 4; + break; + case splashModeBGR8: + ok = srcMode == splashModeBGR8; + nComps = 3; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + ok = srcMode == splashModeCMYK8; + nComps = 4; + break; +#endif + default: + ok = gFalse; + break; + } + if (!ok) { + return splashErrModeMismatch; + } + + // check for singular matrix + if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.000001)) { + return splashErrSingularMatrix; + } + + minorAxisZero = mat[1] == 0 && mat[2] == 0; + + // scaling only + if (mat[0] > 0 && minorAxisZero && mat[3] > 0) { + x0 = imgCoordMungeLower(mat[4]); + y0 = imgCoordMungeLower(mat[5]); + x1 = imgCoordMungeUpper(mat[0] + mat[4]); + y1 = imgCoordMungeUpper(mat[3] + mat[5]); + // make sure narrow images cover at least one pixel + if (x0 == x1) { + ++x1; + } + if (y0 == y1) { + ++y1; + } + clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1); + opClipRes = clipRes; + if (clipRes != splashClipAllOutside) { + scaledWidth = x1 - x0; + scaledHeight = y1 - y0; + yp = h / scaledHeight; + if (yp < 0 || yp > INT_MAX - 1) { + return splashErrBadArg; + } + scaledImg = scaleImage(src, srcData, srcMode, nComps, srcAlpha, w, h, + scaledWidth, scaledHeight); + if (scaledImg == NULL) { + return splashErrBadArg; + } + blitImage(scaledImg, srcAlpha, x0, y0, clipRes); + delete scaledImg; + } + + // scaling plus vertical flip + } else if (mat[0] > 0 && minorAxisZero && mat[3] < 0) { + x0 = imgCoordMungeLower(mat[4]); + y0 = imgCoordMungeLower(mat[3] + mat[5]); + x1 = imgCoordMungeUpper(mat[0] + mat[4]); + y1 = imgCoordMungeUpper(mat[5]); + if (x0 == x1) { + if (mat[4] + mat[0] * 0.5 < x0) { + --x0; + } else { + ++x1; + } + } + if (y0 == y1) { + if (mat[5] + mat[1] * 0.5 < y0) { + --y0; + } else { + ++y1; + } + } + clipRes = state->clip->testRect(x0, y0, x1 - 1, y1 - 1); + opClipRes = clipRes; + if (clipRes != splashClipAllOutside) { + scaledWidth = x1 - x0; + scaledHeight = y1 - y0; + yp = h / scaledHeight; + if (yp < 0 || yp > INT_MAX - 1) { + return splashErrBadArg; + } + scaledImg = scaleImage(src, srcData, srcMode, nComps, srcAlpha, w, h, + scaledWidth, scaledHeight); + if (scaledImg == NULL) { + return splashErrBadArg; + } + vertFlipImage(scaledImg, scaledWidth, scaledHeight, nComps); + blitImage(scaledImg, srcAlpha, x0, y0, clipRes); + delete scaledImg; + } + + // all other cases + } else { + return arbitraryTransformImage(src, srcData, srcMode, nComps, srcAlpha, + w, h, mat, tilingPattern); + } + + return splashOk; +} + +SplashError Splash::arbitraryTransformImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, + int srcWidth, int srcHeight, + SplashCoord *mat, + GBool tilingPattern) { + SplashBitmap *scaledImg; + SplashClipResult clipRes, clipRes2; + SplashPipe pipe; + SplashColor pixel; + int scaledWidth, scaledHeight, t0, t1, th; + SplashCoord r00, r01, r10, r11, det, ir00, ir01, ir10, ir11; + SplashCoord vx[4], vy[4]; + int xMin, yMin, xMax, yMax; + ImageSection section[3]; + int nSections; + int y, xa, xb, x, i, xx, yy, yp; + + // compute the four vertices of the target quadrilateral + vx[0] = mat[4]; vy[0] = mat[5]; + vx[1] = mat[2] + mat[4]; vy[1] = mat[3] + mat[5]; + vx[2] = mat[0] + mat[2] + mat[4]; vy[2] = mat[1] + mat[3] + mat[5]; + vx[3] = mat[0] + mat[4]; vy[3] = mat[1] + mat[5]; + + // clipping + xMin = imgCoordMungeLower(vx[0]); + xMax = imgCoordMungeUpper(vx[0]); + yMin = imgCoordMungeLower(vy[0]); + yMax = imgCoordMungeUpper(vy[0]); + for (i = 1; i < 4; ++i) { + t0 = imgCoordMungeLower(vx[i]); + if (t0 < xMin) { + xMin = t0; + } + t0 = imgCoordMungeUpper(vx[i]); + if (t0 > xMax) { + xMax = t0; + } + t1 = imgCoordMungeLower(vy[i]); + if (t1 < yMin) { + yMin = t1; + } + t1 = imgCoordMungeUpper(vy[i]); + if (t1 > yMax) { + yMax = t1; + } + } + clipRes = state->clip->testRect(xMin, yMin, xMax - 1, yMax - 1); + opClipRes = clipRes; + if (clipRes == splashClipAllOutside) { + return splashOk; + } + + // compute the scale factors + if (splashAbs(mat[0]) >= splashAbs(mat[1])) { + scaledWidth = xMax - xMin; + scaledHeight = yMax - yMin; + } else { + scaledWidth = yMax - yMin; + scaledHeight = xMax - xMin; + } + if (scaledHeight <= 1 || scaledHeight <= 1 || tilingPattern) { + if (mat[0] >= 0) { + t0 = imgCoordMungeUpper(mat[0] + mat[4]) - imgCoordMungeLower(mat[4]); + } else { + t0 = imgCoordMungeUpper(mat[4]) - imgCoordMungeLower(mat[0] + mat[4]); + } + if (mat[1] >= 0) { + t1 = imgCoordMungeUpper(mat[1] + mat[5]) - imgCoordMungeLower(mat[5]); + } else { + t1 = imgCoordMungeUpper(mat[5]) - imgCoordMungeLower(mat[1] + mat[5]); + } + scaledWidth = t0 > t1 ? t0 : t1; + if (mat[2] >= 0) { + t0 = imgCoordMungeUpper(mat[2] + mat[4]) - imgCoordMungeLower(mat[4]); + if (splashAbs(mat[1]) >= 1) { + th = imgCoordMungeUpper(mat[2]) - imgCoordMungeLower(mat[0] * mat[3] / mat[1]); + if (th > t0) t0 = th; + } + } else { + t0 = imgCoordMungeUpper(mat[4]) - imgCoordMungeLower(mat[2] + mat[4]); + if (splashAbs(mat[1]) >= 1) { + th = imgCoordMungeUpper(mat[0] * mat[3] / mat[1]) - imgCoordMungeLower(mat[2]); + if (th > t0) t0 = th; + } + } + if (mat[3] >= 0) { + t1 = imgCoordMungeUpper(mat[3] + mat[5]) - imgCoordMungeLower(mat[5]); + if (splashAbs(mat[0]) >= 1) { + th = imgCoordMungeUpper(mat[3]) - imgCoordMungeLower(mat[1] * mat[2] / mat[0]); + if (th > t1) t1 = th; + } + } else { + t1 = imgCoordMungeUpper(mat[5]) - imgCoordMungeLower(mat[3] + mat[5]); + if (splashAbs(mat[0]) >= 1) { + th = imgCoordMungeUpper(mat[1] * mat[2] / mat[0]) - imgCoordMungeLower(mat[3]); + if (th > t1) t1 = th; + } + } + scaledHeight = t0 > t1 ? t0 : t1; + } + if (scaledWidth == 0) { + scaledWidth = 1; + } + if (scaledHeight == 0) { + scaledHeight = 1; + } + + // compute the inverse transform (after scaling) matrix + r00 = mat[0] / scaledWidth; + r01 = mat[1] / scaledWidth; + r10 = mat[2] / scaledHeight; + r11 = mat[3] / scaledHeight; + det = r00 * r11 - r01 * r10; + if (splashAbs(det) < 1e-6) { + // this should be caught by the singular matrix check in drawImage + return splashErrBadArg; + } + ir00 = r11 / det; + ir01 = -r01 / det; + ir10 = -r10 / det; + ir11 = r00 / det; + + // scale the input image + yp = srcHeight / scaledHeight; + if (yp < 0 || yp > INT_MAX - 1) { + return splashErrBadArg; + } + scaledImg = scaleImage(src, srcData, srcMode, nComps, srcAlpha, + srcWidth, srcHeight, scaledWidth, scaledHeight); + + if (scaledImg == NULL) { + return splashErrBadArg; + } + + // construct the three sections + i = 0; + if (vy[1] < vy[i]) { + i = 1; + } + if (vy[2] < vy[i]) { + i = 2; + } + if (vy[3] < vy[i]) { + i = 3; + } + // NB: if using fixed point, 0.000001 will be truncated to zero, + // so these two comparisons must be <=, not < + if (splashAbs(vy[i] - vy[(i-1) & 3]) <= 0.000001 && + vy[(i-1) & 3] < vy[(i+1) & 3]) { + i = (i-1) & 3; + } + if (splashAbs(vy[i] - vy[(i+1) & 3]) <= 0.000001) { + section[0].y0 = imgCoordMungeLower(vy[i]); + section[0].y1 = imgCoordMungeUpper(vy[(i+2) & 3]) - 1; + if (vx[i] < vx[(i+1) & 3]) { + section[0].ia0 = i; + section[0].ia1 = (i+3) & 3; + section[0].ib0 = (i+1) & 3; + section[0].ib1 = (i+2) & 3; + } else { + section[0].ia0 = (i+1) & 3; + section[0].ia1 = (i+2) & 3; + section[0].ib0 = i; + section[0].ib1 = (i+3) & 3; + } + nSections = 1; + } else { + section[0].y0 = imgCoordMungeLower(vy[i]); + section[2].y1 = imgCoordMungeUpper(vy[(i+2) & 3]) - 1; + section[0].ia0 = section[0].ib0 = i; + section[2].ia1 = section[2].ib1 = (i+2) & 3; + if (vx[(i+1) & 3] < vx[(i+3) & 3]) { + section[0].ia1 = section[2].ia0 = (i+1) & 3; + section[0].ib1 = section[2].ib0 = (i+3) & 3; + } else { + section[0].ia1 = section[2].ia0 = (i+3) & 3; + section[0].ib1 = section[2].ib0 = (i+1) & 3; + } + if (vy[(i+1) & 3] < vy[(i+3) & 3]) { + section[1].y0 = imgCoordMungeLower(vy[(i+1) & 3]); + section[2].y0 = imgCoordMungeUpper(vy[(i+3) & 3]); + if (vx[(i+1) & 3] < vx[(i+3) & 3]) { + section[1].ia0 = (i+1) & 3; + section[1].ia1 = (i+2) & 3; + section[1].ib0 = i; + section[1].ib1 = (i+3) & 3; + } else { + section[1].ia0 = i; + section[1].ia1 = (i+3) & 3; + section[1].ib0 = (i+1) & 3; + section[1].ib1 = (i+2) & 3; + } + } else { + section[1].y0 = imgCoordMungeLower(vy[(i+3) & 3]); + section[2].y0 = imgCoordMungeUpper(vy[(i+1) & 3]); + if (vx[(i+1) & 3] < vx[(i+3) & 3]) { + section[1].ia0 = i; + section[1].ia1 = (i+1) & 3; + section[1].ib0 = (i+3) & 3; + section[1].ib1 = (i+2) & 3; + } else { + section[1].ia0 = (i+3) & 3; + section[1].ia1 = (i+2) & 3; + section[1].ib0 = i; + section[1].ib1 = (i+1) & 3; + } + } + section[0].y1 = section[1].y0 - 1; + section[1].y1 = section[2].y0 - 1; + nSections = 3; + } + for (i = 0; i < nSections; ++i) { + section[i].xa0 = vx[section[i].ia0]; + section[i].ya0 = vy[section[i].ia0]; + section[i].xa1 = vx[section[i].ia1]; + section[i].ya1 = vy[section[i].ia1]; + section[i].xb0 = vx[section[i].ib0]; + section[i].yb0 = vy[section[i].ib0]; + section[i].xb1 = vx[section[i].ib1]; + section[i].yb1 = vy[section[i].ib1]; + section[i].dxdya = (section[i].xa1 - section[i].xa0) / + (section[i].ya1 - section[i].ya0); + section[i].dxdyb = (section[i].xb1 - section[i].xb0) / + (section[i].yb1 - section[i].yb0); + } + + // initialize the pixel pipe + pipeInit(&pipe, 0, 0, NULL, pixel, + (Guchar)splashRound(state->fillAlpha * 255), + srcAlpha || (vectorAntialias && clipRes != splashClipAllInside), + gFalse); + if (vectorAntialias) { + drawAAPixelInit(); + } + + // make sure narrow images cover at least one pixel + if (nSections == 1) { + if (section[0].y0 == section[0].y1) { + ++section[0].y1; + clipRes = opClipRes = splashClipPartial; + } + } else { + if (section[0].y0 == section[2].y1) { + ++section[1].y1; + clipRes = opClipRes = splashClipPartial; + } + } + + // scan all pixels inside the target region + for (i = 0; i < nSections; ++i) { + for (y = section[i].y0; y <= section[i].y1; ++y) { + xa = imgCoordMungeLower(section[i].xa0 + + ((SplashCoord)y + 0.5 - section[i].ya0) * + section[i].dxdya); + xb = imgCoordMungeUpper(section[i].xb0 + + ((SplashCoord)y + 0.5 - section[i].yb0) * + section[i].dxdyb); + // make sure narrow images cover at least one pixel + if (xa == xb) { + ++xb; + } + if (clipRes != splashClipAllInside) { + clipRes2 = state->clip->testSpan(xa, xb - 1, y); + } else { + clipRes2 = clipRes; + } + for (x = xa; x < xb; ++x) { + // map (x+0.5, y+0.5) back to the scaled image + xx = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir00 + + ((SplashCoord)y + 0.5 - mat[5]) * ir10); + yy = splashFloor(((SplashCoord)x + 0.5 - mat[4]) * ir01 + + ((SplashCoord)y + 0.5 - mat[5]) * ir11); + // xx should always be within bounds, but floating point + // inaccuracy can cause problems + if (xx < 0) { + xx = 0; + } else if (xx >= scaledWidth) { + xx = scaledWidth - 1; + } + if (yy < 0) { + yy = 0; + } else if (yy >= scaledHeight) { + yy = scaledHeight - 1; + } + scaledImg->getPixel(xx, yy, pixel); + if (srcAlpha) { + pipe.shape = scaledImg->alpha[yy * scaledWidth + xx]; + } else { + pipe.shape = 255; + } + if (vectorAntialias && clipRes2 != splashClipAllInside) { + drawAAPixel(&pipe, x, y); + } else { + drawPixel(&pipe, x, y, clipRes2 == splashClipAllInside); + } + } + } + } + + delete scaledImg; + return splashOk; +} + +// Scale an image into a SplashBitmap. +SplashBitmap *Splash::scaleImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight) { + SplashBitmap *dest; + + dest = new SplashBitmap(scaledWidth, scaledHeight, 1, srcMode, srcAlpha); + if (dest->getDataPtr() != NULL) { + if (scaledHeight < srcHeight) { + if (scaledWidth < srcWidth) { + scaleImageYdXd(src, srcData, srcMode, nComps, srcAlpha, + srcWidth, srcHeight, scaledWidth, scaledHeight, dest); + } else { + scaleImageYdXu(src, srcData, srcMode, nComps, srcAlpha, + srcWidth, srcHeight, scaledWidth, scaledHeight, dest); + } + } else { + if (scaledWidth < srcWidth) { + scaleImageYuXd(src, srcData, srcMode, nComps, srcAlpha, + srcWidth, srcHeight, scaledWidth, scaledHeight, dest); + } else { + scaleImageYuXu(src, srcData, srcMode, nComps, srcAlpha, + srcWidth, srcHeight, scaledWidth, scaledHeight, dest); + } + } + } else { + delete dest; + dest = NULL; + } + return dest; +} + +void Splash::scaleImageYdXd(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf, *alphaLineBuf; + Guint *pixBuf, *alphaPixBuf; + Guint pix0, pix1, pix2; +#if SPLASH_CMYK + Guint pix3; +#endif + Guint alpha; + Guchar *destPtr, *destAlphaPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, xxa, d, d0, d1; + int i, j; + + // Bresenham parameters for y scale + yp = srcHeight / scaledHeight; + yq = srcHeight % scaledHeight; + + // Bresenham parameters for x scale + xp = srcWidth / scaledWidth; + xq = srcWidth % scaledWidth; + + // allocate buffers + lineBuf = (Guchar *)gmallocn(srcWidth, nComps); + pixBuf = (Guint *)gmallocn(srcWidth, nComps * sizeof(int)); + if (srcAlpha) { + alphaLineBuf = (Guchar *)gmalloc(srcWidth); + alphaPixBuf = (Guint *)gmallocn(srcWidth, sizeof(int)); + } else { + alphaLineBuf = NULL; + alphaPixBuf = NULL; + } + + // init y scale Bresenham + yt = 0; + + destPtr = dest->data; + destAlphaPtr = dest->alpha; + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= scaledHeight) { + yt -= scaledHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read rows from image + memset(pixBuf, 0, srcWidth * nComps * sizeof(int)); + if (srcAlpha) { + memset(alphaPixBuf, 0, srcWidth * sizeof(int)); + } + for (i = 0; i < yStep; ++i) { + (*src)(srcData, lineBuf, alphaLineBuf); + for (j = 0; j < srcWidth * nComps; ++j) { + pixBuf[j] += lineBuf[j]; + } + if (srcAlpha) { + for (j = 0; j < srcWidth; ++j) { + alphaPixBuf[j] += alphaLineBuf[j]; + } + } + } + + // init x scale Bresenham + xt = 0; + d0 = (1 << 23) / (yStep * xp); + d1 = (1 << 23) / (yStep * (xp + 1)); + + xx = xxa = 0; + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= scaledWidth) { + xt -= scaledWidth; + xStep = xp + 1; + d = d1; + } else { + xStep = xp; + d = d0; + } + + switch (srcMode) { + + case splashModeMono8: + + // compute the final pixel + pix0 = 0; + for (i = 0; i < xStep; ++i) { + pix0 += pixBuf[xx++]; + } + // pix / xStep * yStep + pix0 = (pix0 * d) >> 23; + + // store the pixel + *destPtr++ = (Guchar)pix0; + break; + + case splashModeRGB8: + + // compute the final pixel + pix0 = pix1 = pix2 = 0; + for (i = 0; i < xStep; ++i) { + pix0 += pixBuf[xx]; + pix1 += pixBuf[xx+1]; + pix2 += pixBuf[xx+2]; + xx += 3; + } + // pix / xStep * yStep + pix0 = (pix0 * d) >> 23; + pix1 = (pix1 * d) >> 23; + pix2 = (pix2 * d) >> 23; + + // store the pixel + *destPtr++ = (Guchar)pix0; + *destPtr++ = (Guchar)pix1; + *destPtr++ = (Guchar)pix2; + break; + + case splashModeXBGR8: + + // compute the final pixel + pix0 = pix1 = pix2 = 0; + for (i = 0; i < xStep; ++i) { + pix0 += pixBuf[xx]; + pix1 += pixBuf[xx+1]; + pix2 += pixBuf[xx+2]; + xx += 4; + } + // pix / xStep * yStep + pix0 = (pix0 * d) >> 23; + pix1 = (pix1 * d) >> 23; + pix2 = (pix2 * d) >> 23; + + // store the pixel + *destPtr++ = (Guchar)pix2; + *destPtr++ = (Guchar)pix1; + *destPtr++ = (Guchar)pix0; + *destPtr++ = (Guchar)255; + break; + + case splashModeBGR8: + + // compute the final pixel + pix0 = pix1 = pix2 = 0; + for (i = 0; i < xStep; ++i) { + pix0 += pixBuf[xx]; + pix1 += pixBuf[xx+1]; + pix2 += pixBuf[xx+2]; + xx += 3; + } + // pix / xStep * yStep + pix0 = (pix0 * d) >> 23; + pix1 = (pix1 * d) >> 23; + pix2 = (pix2 * d) >> 23; + + // store the pixel + *destPtr++ = (Guchar)pix2; + *destPtr++ = (Guchar)pix1; + *destPtr++ = (Guchar)pix0; + break; + +#if SPLASH_CMYK + case splashModeCMYK8: + + // compute the final pixel + pix0 = pix1 = pix2 = pix3 = 0; + for (i = 0; i < xStep; ++i) { + pix0 += pixBuf[xx]; + pix1 += pixBuf[xx+1]; + pix2 += pixBuf[xx+2]; + pix3 += pixBuf[xx+3]; + xx += 4; + } + // pix / xStep * yStep + pix0 = (pix0 * d) >> 23; + pix1 = (pix1 * d) >> 23; + pix2 = (pix2 * d) >> 23; + pix3 = (pix3 * d) >> 23; + + // store the pixel + *destPtr++ = (Guchar)pix0; + *destPtr++ = (Guchar)pix1; + *destPtr++ = (Guchar)pix2; + *destPtr++ = (Guchar)pix3; + break; +#endif + + + case splashModeMono1: // mono1 is not allowed + default: + break; + } + + // process alpha + if (srcAlpha) { + alpha = 0; + for (i = 0; i < xStep; ++i, ++xxa) { + alpha += alphaPixBuf[xxa]; + } + // alpha / xStep * yStep + alpha = (alpha * d) >> 23; + *destAlphaPtr++ = (Guchar)alpha; + } + } + } + + gfree(alphaPixBuf); + gfree(alphaLineBuf); + gfree(pixBuf); + gfree(lineBuf); +} + +void Splash::scaleImageYdXu(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf, *alphaLineBuf; + Guint *pixBuf, *alphaPixBuf; + Guint pix[splashMaxColorComps]; + Guint alpha; + Guchar *destPtr, *destAlphaPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, d; + int i, j; + + // Bresenham parameters for y scale + yp = srcHeight / scaledHeight; + yq = srcHeight % scaledHeight; + + // Bresenham parameters for x scale + xp = scaledWidth / srcWidth; + xq = scaledWidth % srcWidth; + + // allocate buffers + lineBuf = (Guchar *)gmallocn(srcWidth, nComps); + pixBuf = (Guint *)gmallocn(srcWidth, nComps * sizeof(int)); + if (srcAlpha) { + alphaLineBuf = (Guchar *)gmalloc(srcWidth); + alphaPixBuf = (Guint *)gmallocn(srcWidth, sizeof(int)); + } else { + alphaLineBuf = NULL; + alphaPixBuf = NULL; + } + + // init y scale Bresenham + yt = 0; + + destPtr = dest->data; + destAlphaPtr = dest->alpha; + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= scaledHeight) { + yt -= scaledHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read rows from image + memset(pixBuf, 0, srcWidth * nComps * sizeof(int)); + if (srcAlpha) { + memset(alphaPixBuf, 0, srcWidth * sizeof(int)); + } + for (i = 0; i < yStep; ++i) { + (*src)(srcData, lineBuf, alphaLineBuf); + for (j = 0; j < srcWidth * nComps; ++j) { + pixBuf[j] += lineBuf[j]; + } + if (srcAlpha) { + for (j = 0; j < srcWidth; ++j) { + alphaPixBuf[j] += alphaLineBuf[j]; + } + } + } + + // init x scale Bresenham + xt = 0; + d = (1 << 23) / yStep; + + for (x = 0; x < srcWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= srcWidth) { + xt -= srcWidth; + xStep = xp + 1; + } else { + xStep = xp; + } + + // compute the final pixel + for (i = 0; i < nComps; ++i) { + // pixBuf[] / yStep + pix[i] = (pixBuf[x * nComps + i] * d) >> 23; + } + + // store the pixel + switch (srcMode) { + case splashModeMono1: // mono1 is not allowed + break; + case splashModeMono8: + for (i = 0; i < xStep; ++i) { + *destPtr++ = (Guchar)pix[0]; + } + break; + case splashModeRGB8: + for (i = 0; i < xStep; ++i) { + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + } + break; + case splashModeXBGR8: + for (i = 0; i < xStep; ++i) { + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)255; + } + break; + case splashModeBGR8: + for (i = 0; i < xStep; ++i) { + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < xStep; ++i) { + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[3]; + } + break; +#endif + } + + // process alpha + if (srcAlpha) { + // alphaPixBuf[] / yStep + alpha = (alphaPixBuf[x] * d) >> 23; + for (i = 0; i < xStep; ++i) { + *destAlphaPtr++ = (Guchar)alpha; + } + } + } + } + + gfree(alphaPixBuf); + gfree(alphaLineBuf); + gfree(pixBuf); + gfree(lineBuf); +} + +void Splash::scaleImageYuXd(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf, *alphaLineBuf; + Guint pix[splashMaxColorComps]; + Guint alpha; + Guchar *destPtr0, *destPtr, *destAlphaPtr0, *destAlphaPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx, xxa, d, d0, d1; + int i, j; + + // Bresenham parameters for y scale + yp = scaledHeight / srcHeight; + yq = scaledHeight % srcHeight; + + // Bresenham parameters for x scale + xp = srcWidth / scaledWidth; + xq = srcWidth % scaledWidth; + + // allocate buffers + lineBuf = (Guchar *)gmallocn(srcWidth, nComps); + if (srcAlpha) { + alphaLineBuf = (Guchar *)gmalloc(srcWidth); + } else { + alphaLineBuf = NULL; + } + + // init y scale Bresenham + yt = 0; + + destPtr0 = dest->data; + destAlphaPtr0 = dest->alpha; + for (y = 0; y < srcHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= srcHeight) { + yt -= srcHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read row from image + (*src)(srcData, lineBuf, alphaLineBuf); + + // init x scale Bresenham + xt = 0; + d0 = (1 << 23) / xp; + d1 = (1 << 23) / (xp + 1); + + xx = xxa = 0; + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= scaledWidth) { + xt -= scaledWidth; + xStep = xp + 1; + d = d1; + } else { + xStep = xp; + d = d0; + } + + // compute the final pixel + for (i = 0; i < nComps; ++i) { + pix[i] = 0; + } + for (i = 0; i < xStep; ++i) { + for (j = 0; j < nComps; ++j, ++xx) { + pix[j] += lineBuf[xx]; + } + } + for (i = 0; i < nComps; ++i) { + // pix[] / xStep + pix[i] = (pix[i] * d) >> 23; + } + + // store the pixel + switch (srcMode) { + case splashModeMono1: // mono1 is not allowed + break; + case splashModeMono8: + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + (i * scaledWidth + x) * nComps; + *destPtr++ = (Guchar)pix[0]; + } + break; + case splashModeRGB8: + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + (i * scaledWidth + x) * nComps; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + } + break; + case splashModeXBGR8: + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + (i * scaledWidth + x) * nComps; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)255; + } + break; + case splashModeBGR8: + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + (i * scaledWidth + x) * nComps; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + (i * scaledWidth + x) * nComps; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[3]; + } + break; +#endif + } + + // process alpha + if (srcAlpha) { + alpha = 0; + for (i = 0; i < xStep; ++i, ++xxa) { + alpha += alphaLineBuf[xxa]; + } + // alpha / xStep + alpha = (alpha * d) >> 23; + for (i = 0; i < yStep; ++i) { + destAlphaPtr = destAlphaPtr0 + i * scaledWidth + x; + *destAlphaPtr = (Guchar)alpha; + } + } + } + + destPtr0 += yStep * scaledWidth * nComps; + if (srcAlpha) { + destAlphaPtr0 += yStep * scaledWidth; + } + } + + gfree(alphaLineBuf); + gfree(lineBuf); +} + +void Splash::scaleImageYuXu(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *lineBuf, *alphaLineBuf; + Guint pix[splashMaxColorComps]; + Guint alpha; + Guchar *destPtr0, *destPtr, *destAlphaPtr0, *destAlphaPtr; + int yp, yq, xp, xq, yt, y, yStep, xt, x, xStep, xx; + int i, j; + + // Bresenham parameters for y scale + yp = scaledHeight / srcHeight; + yq = scaledHeight % srcHeight; + + // Bresenham parameters for x scale + xp = scaledWidth / srcWidth; + xq = scaledWidth % srcWidth; + + // allocate buffers + lineBuf = (Guchar *)gmallocn(srcWidth, nComps); + if (srcAlpha) { + alphaLineBuf = (Guchar *)gmalloc(srcWidth); + } else { + alphaLineBuf = NULL; + } + + // init y scale Bresenham + yt = 0; + + destPtr0 = dest->data; + destAlphaPtr0 = dest->alpha; + for (y = 0; y < srcHeight; ++y) { + + // y scale Bresenham + if ((yt += yq) >= srcHeight) { + yt -= srcHeight; + yStep = yp + 1; + } else { + yStep = yp; + } + + // read row from image + (*src)(srcData, lineBuf, alphaLineBuf); + + // init x scale Bresenham + xt = 0; + + xx = 0; + for (x = 0; x < srcWidth; ++x) { + + // x scale Bresenham + if ((xt += xq) >= srcWidth) { + xt -= srcWidth; + xStep = xp + 1; + } else { + xStep = xp; + } + + // compute the final pixel + for (i = 0; i < nComps; ++i) { + pix[i] = lineBuf[x * nComps + i]; + } + + // store the pixel + switch (srcMode) { + case splashModeMono1: // mono1 is not allowed + break; + case splashModeMono8: + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; + *destPtr++ = (Guchar)pix[0]; + } + } + break; + case splashModeRGB8: + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + } + } + break; + case splashModeXBGR8: + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)255; + } + } + break; + case splashModeBGR8: + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[3]; + } + } + break; +#endif + } + + // process alpha + if (srcAlpha) { + alpha = alphaLineBuf[x]; + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destAlphaPtr = destAlphaPtr0 + i * scaledWidth + xx + j; + *destAlphaPtr = (Guchar)alpha; + } + } + } + + xx += xStep; + } + + destPtr0 += yStep * scaledWidth * nComps; + if (srcAlpha) { + destAlphaPtr0 += yStep * scaledWidth; + } + } + + gfree(alphaLineBuf); + gfree(lineBuf); +} + +void Splash::vertFlipImage(SplashBitmap *img, int width, int height, + int nComps) { + Guchar *lineBuf; + Guchar *p0, *p1; + int w; + + w = width * nComps; + lineBuf = (Guchar *)gmalloc(w); + for (p0 = img->data, p1 = img->data + (height - 1) * w; + p0 < p1; + p0 += w, p1 -= w) { + memcpy(lineBuf, p0, w); + memcpy(p0, p1, w); + memcpy(p1, lineBuf, w); + } + if (img->alpha) { + for (p0 = img->alpha, p1 = img->alpha + (height - 1) * width; + p0 < p1; + p0 += width, p1 -= width) { + memcpy(lineBuf, p0, width); + memcpy(p0, p1, width); + memcpy(p1, lineBuf, width); + } + } + gfree(lineBuf); +} + +void Splash::blitImage(SplashBitmap *src, GBool srcAlpha, int xDest, int yDest, + SplashClipResult clipRes) { + SplashPipe pipe; + SplashColor pixel; + Guchar *ap; + int w, h, x0, y0, x1, y1, x, y; + + // split the image into clipped and unclipped regions + w = src->getWidth(); + h = src->getHeight(); + if (clipRes == splashClipAllInside) { + x0 = 0; + y0 = 0; + x1 = w; + y1 = h; + } else { + if (state->clip->getNumPaths()) { + x0 = x1 = w; + y0 = y1 = h; + } else { + if ((x0 = splashCeil(state->clip->getXMin()) - xDest) < 0) { + x0 = 0; + } + if ((y0 = splashCeil(state->clip->getYMin()) - yDest) < 0) { + y0 = 0; + } + if ((x1 = splashFloor(state->clip->getXMax()) - xDest) > w) { + x1 = w; + } + if (x1 < x0) { + x1 = x0; + } + if ((y1 = splashFloor(state->clip->getYMax()) - yDest) > h) { + y1 = h; + } + if (y1 < y0) { + y1 = y0; + } + } + } + + // draw the unclipped region + if (x0 < w && y0 < h && x0 < x1 && y0 < y1) { + pipeInit(&pipe, xDest + x0, yDest + y0, NULL, pixel, + (Guchar)splashRound(state->fillAlpha * 255), srcAlpha, gFalse); + if (srcAlpha) { + for (y = y0; y < y1; ++y) { + pipeSetXY(&pipe, xDest + x0, yDest + y); + ap = src->getAlphaPtr() + y * w + x0; + for (x = x0; x < x1; ++x) { + src->getPixel(x, y, pixel); + pipe.shape = *ap++; + (this->*pipe.run)(&pipe); + } + } + } else { + for (y = y0; y < y1; ++y) { + pipeSetXY(&pipe, xDest + x0, yDest + y); + for (x = x0; x < x1; ++x) { + src->getPixel(x, y, pixel); + (this->*pipe.run)(&pipe); + } + } + } + updateModX(xDest + x0); + updateModX(xDest + x1 - 1); + updateModY(yDest + y0); + updateModY(yDest + y1 - 1); + } + + // draw the clipped regions + if (y0 > 0) { + blitImageClipped(src, srcAlpha, 0, 0, xDest, yDest, w, y0); + } + if (y1 < h) { + blitImageClipped(src, srcAlpha, 0, y1, xDest, yDest + y1, w, h - y1); + } + if (x0 > 0 && y0 < y1) { + blitImageClipped(src, srcAlpha, 0, y0, xDest, yDest + y0, x0, y1 - y0); + } + if (x1 < w && y0 < y1) { + blitImageClipped(src, srcAlpha, x1, y0, xDest + x1, yDest + y0, + w - x1, y1 - y0); + } +} + +void Splash::blitImageClipped(SplashBitmap *src, GBool srcAlpha, + int xSrc, int ySrc, int xDest, int yDest, + int w, int h) { + SplashPipe pipe; + SplashColor pixel; + Guchar *ap; + int x, y; + + if (vectorAntialias) { + pipeInit(&pipe, xDest, yDest, NULL, pixel, + (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + drawAAPixelInit(); + if (srcAlpha) { + for (y = 0; y < h; ++y) { + ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + pipe.shape = *ap++; + drawAAPixel(&pipe, xDest + x, yDest + y); + } + } + } else { + for (y = 0; y < h; ++y) { + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + pipe.shape = 255; + drawAAPixel(&pipe, xDest + x, yDest + y); + } + } + } + } else { + pipeInit(&pipe, xDest, yDest, NULL, pixel, + (Guchar)splashRound(state->fillAlpha * 255), srcAlpha, gFalse); + if (srcAlpha) { + for (y = 0; y < h; ++y) { + ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + if (state->clip->test(xDest + x, yDest + y)) { + src->getPixel(xSrc + x, ySrc + y, pixel); + pipe.shape = *ap++; + (this->*pipe.run)(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + ++ap; + } + } + } + } else { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + if (state->clip->test(xDest + x, yDest + y)) { + src->getPixel(xSrc + x, ySrc + y, pixel); + (this->*pipe.run)(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + } + } + } + } + } +} + +SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h, + GBool noClip, GBool nonIsolated, + GBool knockout, SplashCoord knockoutOpacity) { + SplashPipe pipe; + SplashColor pixel; + Guchar alpha; + Guchar *ap; + int x, y; + + if (src->mode != bitmap->mode) { + return splashErrModeMismatch; + } + + if (src->alpha) { + pipeInit(&pipe, xDest, yDest, NULL, pixel, + (Guchar)splashRound(state->fillAlpha * 255), gTrue, nonIsolated, + knockout, (Guchar)splashRound(knockoutOpacity * 255)); + if (noClip) { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + alpha = *ap++; + // this uses shape instead of alpha, which isn't technically + // correct, but works out the same + pipe.shape = alpha; + (this->*pipe.run)(&pipe); + } + } + updateModX(xDest); + updateModX(xDest + w - 1); + updateModY(yDest); + updateModY(yDest + h - 1); + } else { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + alpha = *ap++; + if (state->clip->test(xDest + x, yDest + y)) { + // this uses shape instead of alpha, which isn't technically + // correct, but works out the same + pipe.shape = alpha; + (this->*pipe.run)(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + } + } + } + } + } else { + pipeInit(&pipe, xDest, yDest, NULL, pixel, + (Guchar)splashRound(state->fillAlpha * 255), gFalse, nonIsolated); + if (noClip) { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + (this->*pipe.run)(&pipe); + } + } + updateModX(xDest); + updateModX(xDest + w - 1); + updateModY(yDest); + updateModY(yDest + h - 1); + } else { + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + if (state->clip->test(xDest + x, yDest + y)) { + (this->*pipe.run)(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + } + } + } + } + } + + return splashOk; +} + +void Splash::compositeBackground(SplashColorPtr color) { + SplashColorPtr p; + Guchar *q; + Guchar alpha, alpha1, c, color0, color1, color2; +#if SPLASH_CMYK + Guchar color3; +#endif + int x, y, mask; + + if (unlikely(bitmap->alpha == NULL)) { + error(errInternal, -1, "bitmap->alpha is NULL in Splash::compositeBackground"); + return; + } + + switch (bitmap->mode) { + case splashModeMono1: + color0 = color[0]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + mask = 0x80; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + alpha1 = 255 - alpha; + c = (*p & mask) ? 0xff : 0x00; + c = div255(alpha1 * color0 + alpha * c); + if (c & 0x80) { + *p |= mask; + } else { + *p &= ~mask; + } + if (!(mask >>= 1)) { + mask = 0x80; + ++p; + } + } + } + break; + case splashModeMono8: + color0 = color[0]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + ++p; + } + } + break; + case splashModeRGB8: + case splashModeBGR8: + color0 = color[0]; + color1 = color[1]; + color2 = color[2]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + if (alpha == 0) + { + p[0] = color0; + p[1] = color1; + p[2] = color2; + } + else if (alpha != 255) + { + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + p[1] = div255(alpha1 * color1 + alpha * p[1]); + p[2] = div255(alpha1 * color2 + alpha * p[2]); + } + p += 3; + } + } + break; + case splashModeXBGR8: + color0 = color[0]; + color1 = color[1]; + color2 = color[2]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + if (alpha == 0) + { + p[0] = color0; + p[1] = color1; + p[2] = color2; + } + else if (alpha != 255) + { + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + p[1] = div255(alpha1 * color1 + alpha * p[1]); + p[2] = div255(alpha1 * color2 + alpha * p[2]); + } + p[3] = 255; + p += 4; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + color0 = color[0]; + color1 = color[1]; + color2 = color[2]; + color3 = color[3]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + if (alpha == 0) + { + p[0] = color0; + p[1] = color1; + p[2] = color2; + p[3] = color3; + } + else if (alpha != 255) + { + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + p[1] = div255(alpha1 * color1 + alpha * p[1]); + p[2] = div255(alpha1 * color2 + alpha * p[2]); + p[3] = div255(alpha1 * color3 + alpha * p[3]); + } + p += 4; + } + } + break; +#endif + } + memset(bitmap->alpha, 255, bitmap->width * bitmap->height); +} + +GBool Splash::gouraudTriangleShadedFill(SplashGouraudColor *shading) +{ + double xdbl[3] = {0., 0., 0.}; + double ydbl[3] = {0., 0., 0.}; + int x[3] = {0, 0, 0}; + int y[3] = {0, 0, 0}; + double xt=0., xa=0., yt=0.; + double ca=0., ct=0.; + + // triangle interpolation: + // + double scanLimitMapL[2] = {0., 0.}; + double scanLimitMapR[2] = {0., 0.}; + double scanColorMapL[2] = {0., 0.}; + double scanColorMapR[2] = {0., 0.}; + double scanColorMap[2] = {0., 0.}; + int scanEdgeL[2] = { 0, 0 }; + int scanEdgeR[2] = { 0, 0 }; + GBool hasFurtherSegment = gFalse; + + int scanLineOff = 0; + int bitmapOff = 0; + int scanLimitR = 0, scanLimitL = 0; + + int bitmapWidth = bitmap->getWidth(); + SplashClip* clip = getClip(); + SplashBitmap *blitTarget = bitmap; + SplashColorPtr bitmapData = bitmap->getDataPtr(); + SplashColorPtr bitmapAlpha = bitmap->getAlphaPtr(); + SplashColorPtr cur = NULL; + SplashCoord* userToCanvasMatrix = getMatrix(); + SplashColorMode bitmapMode = bitmap->getMode(); + GBool hasAlpha = (bitmapAlpha != NULL); + int rowSize = bitmap->getRowSize(); + int colorComps = 0; + switch (bitmapMode) { + case splashModeMono1: + break; + case splashModeMono8: + colorComps=1; + break; + case splashModeRGB8: + colorComps=3; + break; + case splashModeBGR8: + colorComps=3; + break; + case splashModeXBGR8: + colorComps=4; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + colorComps=4; + break; +#endif + } + + SplashPipe pipe; + SplashColor cSrcVal; + + pipeInit(&pipe, 0, 0, NULL, cSrcVal, (Guchar)splashRound(state->strokeAlpha * 255), gFalse, gFalse); + + if (vectorAntialias) { + if (aaBuf == NULL) + return gFalse; // fall back to old behaviour + drawAAPixelInit(); + } + + // idea: + // 1. If pipe->noTransparency && !state->blendFunc + // -> blit directly into the drawing surface! + // -> disable alpha manually. + // 2. Otherwise: + // - blit also directly, but into an intermediate surface. + // Afterwards, blit the intermediate surface using the drawing pipeline. + // This is necessary because triangle elements can be on top of each + // other, so the complete shading needs to be drawn before opacity is + // applied. + // - the final step, is performed using a SplashPipe: + // - assign the actual color into cSrcVal: pipe uses cSrcVal by reference + // - invoke drawPixel(&pipe,X,Y,bNoClip); + GBool bDirectBlit = vectorAntialias ? gFalse : pipe.noTransparency && !state->blendFunc; + if (!bDirectBlit) { + blitTarget = new SplashBitmap(bitmap->getWidth(), + bitmap->getHeight(), + bitmap->getRowPad(), + bitmap->getMode(), + gTrue, + bitmap->getRowSize() >= 0); + bitmapData = blitTarget->getDataPtr(); + bitmapAlpha = blitTarget->getAlphaPtr(); + + // initialisation seems to be necessary: + int S = bitmap->getWidth() * bitmap->getHeight(); + for (int i = 0; i < S; ++i) + bitmapAlpha[i] = 0; + hasAlpha = gTrue; + } + + if (shading->isParameterized()) { + double color[3]; + double colorinterp; + + for (int i = 0; i < shading->getNTriangles(); ++i) { + shading->getTriangle(i, + xdbl + 0, ydbl + 0, color + 0, + xdbl + 1, ydbl + 1, color + 1, + xdbl + 2, ydbl + 2, color + 2); + for (int m = 0; m < 3; ++m) { + xt = xdbl[m] * (double)userToCanvasMatrix[0] + ydbl[m] * (double)userToCanvasMatrix[2] + (double)userToCanvasMatrix[4]; + yt = xdbl[m] * (double)userToCanvasMatrix[1] + ydbl[m] * (double)userToCanvasMatrix[3] + (double)userToCanvasMatrix[5]; + xdbl[m] = xt; + ydbl[m] = yt; + // we operate on scanlines which are integer offsets into the + // raster image. The double offsets are of no use here. + x[m] = splashRound(xt); + y[m] = splashRound(yt); + } + // sort according to y coordinate to simplify sweep through scanlines: + // INSERTION SORT. + if (y[0] > y[1]) { + Guswap(x[0], x[1]); + Guswap(y[0], y[1]); + Guswap(color[0], color[1]); + } + // first two are sorted. + assert(y[0] <= y[1]); + if (y[1] > y[2]) { + int tmpX = x[2]; + int tmpY = y[2]; + double tmpC = color[2]; + x[2] = x[1]; y[2] = y[1]; color[2] = color[1]; + + if (y[0] > tmpY) { + x[1] = x[0]; y[1] = y[0]; color[1] = color[0]; + x[0] = tmpX; y[0] = tmpY; color[0] = tmpC; + } else { + x[1] = tmpX; y[1] = tmpY; color[1] = tmpC; + } + } + // first three are sorted + assert(y[0] <= y[1]); + assert(y[1] <= y[2]); + ///// + + // this here is det( T ) == 0 + // where T is the matrix to map to barycentric coordinates. + if ((x[0] - x[2]) * (y[1] - y[2]) - (x[1] - x[2]) * (y[0] - y[2]) == 0) + continue; // degenerate triangle. + + // this here initialises the scanline generation. + // We start with low Y coordinates and sweep up to the large Y + // coordinates. + // + // scanEdgeL[m] in {0,1,2} m=0,1 + // scanEdgeR[m] in {0,1,2} m=0,1 + // + // are the two edges between which scanlines are (currently) + // sweeped. The values {0,1,2} are indices into 'x' and 'y'. + // scanEdgeL[0] = 0 means: the left scan edge has (x[0],y[0]) as vertex. + // + scanEdgeL[0] = 0; + scanEdgeR[0] = 0; + if (y[0] == y[1]) { + scanEdgeL[0] = 1; + scanEdgeL[1] = scanEdgeR[1] = 2; + + } else { + scanEdgeL[1] = 1; scanEdgeR[1] = 2; + } + assert(y[scanEdgeL[0]] < y[scanEdgeL[1]]); + assert(y[scanEdgeR[0]] < y[scanEdgeR[1]]); + + // Ok. Now prepare the linear maps which map the y coordinate of + // the current scanline to the corresponding LEFT and RIGHT x + // coordinate (which define the scanline). + scanLimitMapL[0] = double(x[scanEdgeL[1]] - x[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]); + scanLimitMapL[1] = x[scanEdgeL[0]] - y[scanEdgeL[0]] * scanLimitMapL[0]; + scanLimitMapR[0] = double(x[scanEdgeR[1]] - x[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]); + scanLimitMapR[1] = x[scanEdgeR[0]] - y[scanEdgeR[0]] * scanLimitMapR[0]; + + xa = y[1] * scanLimitMapL[0] + scanLimitMapL[1]; + xt = y[1] * scanLimitMapR[0] + scanLimitMapR[1]; + if (xa > xt) { + // I have "left" is to the right of "right". + // Exchange sides! + Guswap(scanEdgeL[0], scanEdgeR[0]); + Guswap(scanEdgeL[1], scanEdgeR[1]); + Guswap(scanLimitMapL[0], scanLimitMapR[0]); + Guswap(scanLimitMapL[1], scanLimitMapR[1]); + // FIXME I'm sure there is a more efficient way to check this. + } + + // Same game: we can linearly interpolate the color based on the + // current y coordinate (that's correct for triangle + // interpolation due to linearity. We could also have done it in + // barycentric coordinates, but that's slightly more involved) + scanColorMapL[0] = (color[scanEdgeL[1]] - color[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]); + scanColorMapL[1] = color[scanEdgeL[0]] - y[scanEdgeL[0]] * scanColorMapL[0]; + scanColorMapR[0] = (color[scanEdgeR[1]] - color[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]); + scanColorMapR[1] = color[scanEdgeR[0]] - y[scanEdgeR[0]] * scanColorMapR[0]; + + hasFurtherSegment = (y[1] < y[2]); + scanLineOff = y[0] * rowSize; + + for (int Y = y[0]; Y <= y[2]; ++Y, scanLineOff += rowSize) { + if (hasFurtherSegment && Y == y[1]) { + // SWEEP EVENT: we encountered the next segment. + // + // switch to next segment, either at left end or at right + // end: + if (scanEdgeL[1] == 1) { + scanEdgeL[0] = 1; + scanEdgeL[1] = 2; + scanLimitMapL[0] = double(x[scanEdgeL[1]] - x[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]); + scanLimitMapL[1] = x[scanEdgeL[0]] - y[scanEdgeL[0]] * scanLimitMapL[0]; + + scanColorMapL[0] = (color[scanEdgeL[1]] - color[scanEdgeL[0]]) / (y[scanEdgeL[1]] - y[scanEdgeL[0]]); + scanColorMapL[1] = color[scanEdgeL[0]] - y[scanEdgeL[0]] * scanColorMapL[0]; + } else if (scanEdgeR[1] == 1) { + scanEdgeR[0] = 1; + scanEdgeR[1] = 2; + scanLimitMapR[0] = double(x[scanEdgeR[1]] - x[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]); + scanLimitMapR[1] = x[scanEdgeR[0]] - y[scanEdgeR[0]] * scanLimitMapR[0]; + + scanColorMapR[0] = (color[scanEdgeR[1]] - color[scanEdgeR[0]]) / (y[scanEdgeR[1]] - y[scanEdgeR[0]]); + scanColorMapR[1] = color[scanEdgeR[0]] - y[scanEdgeR[0]] * scanColorMapR[0]; + } + assert( y[scanEdgeL[0]] < y[scanEdgeL[1]] ); + assert( y[scanEdgeR[0]] < y[scanEdgeR[1]] ); + hasFurtherSegment = gFalse; + } + + yt = Y; + + xa = yt * scanLimitMapL[0] + scanLimitMapL[1]; + xt = yt * scanLimitMapR[0] + scanLimitMapR[1]; + + ca = yt * scanColorMapL[0] + scanColorMapL[1]; + ct = yt * scanColorMapR[0] + scanColorMapR[1]; + + scanLimitL = splashRound(xa); + scanLimitR = splashRound(xt); + + // Ok. Now: init the color interpolation depending on the X + // coordinate inside of the current scanline: + scanColorMap[0] = (scanLimitR == scanLimitL) ? 0. : ((ct - ca) / (scanLimitR - scanLimitL)); + scanColorMap[1] = ca - scanLimitL * scanColorMap[0]; + + // handled by clipping: + // assert( scanLimitL >= 0 && scanLimitR < bitmap->getWidth() ); + assert(scanLimitL <= scanLimitR || abs(scanLimitL - scanLimitR) <= 2); // allow rounding inaccuracies + assert(scanLineOff == Y * rowSize); + + colorinterp = scanColorMap[0] * scanLimitL + scanColorMap[1]; + + bitmapOff = scanLineOff + scanLimitL * colorComps; + for (int X = scanLimitL; X <= scanLimitR; ++X, colorinterp += scanColorMap[0], bitmapOff += colorComps) { + // FIXME : standard rectangular clipping can be done for a + // complete scanline which is faster + // --> see SplashClip and its methods + if (!clip->test(X, Y)) + continue; + + assert(fabs(colorinterp - (scanColorMap[0] * X + scanColorMap[1])) < 1e-10); + assert(bitmapOff == Y * rowSize + colorComps * X && scanLineOff == Y * rowSize); + + shading->getParameterizedColor(colorinterp, bitmapMode, &bitmapData[bitmapOff]); + + // make the shading visible. + // Note that opacity is handled by the bDirectBlit stuff, see + // above for comments and below for implementation. + if (hasAlpha) + bitmapAlpha[Y * bitmapWidth + X] = 255; + } + } + } + } else { + return gFalse; + } + + if (!bDirectBlit) { + // ok. Finalize the stuff by blitting the shading into the final + // geometry, this time respecting the rendering pipe. + int W = blitTarget->getWidth(); + int H = blitTarget->getHeight(); + cur = cSrcVal; + + for (int X = 0; X < W; ++X) { + for (int Y = 0; Y < H; ++Y) { + if (!bitmapAlpha[Y * bitmapWidth + X]) + continue; // draw only parts of the shading! + bitmapOff = Y * rowSize + colorComps * X; + + for (int m = 0; m < colorComps; ++m) + cur[m] = bitmapData[bitmapOff + m]; + if (vectorAntialias) { + drawAAPixel(&pipe, X, Y); + } else { + drawPixel(&pipe, X, Y, gTrue); // no clipping - has already been done. + } + } + } + + delete blitTarget; + blitTarget = NULL; + } + + return gTrue; +} + +SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h) { + SplashColorPtr p, sp; + Guchar *q; + int x, y, mask, srcMask; + + if (src->mode != bitmap->mode) { + return splashErrModeMismatch; + } + + switch (bitmap->mode) { + case splashModeMono1: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + (xDest >> 3)]; + mask = 0x80 >> (xDest & 7); + sp = &src->data[(ySrc + y) * src->rowSize + (xSrc >> 3)]; + srcMask = 0x80 >> (xSrc & 7); + for (x = 0; x < w; ++x) { + if (*sp & srcMask) { + *p |= mask; + } else { + *p &= ~mask; + } + if (!(mask >>= 1)) { + mask = 0x80; + ++p; + } + if (!(srcMask >>= 1)) { + srcMask = 0x80; + ++sp; + } + } + } + break; + case splashModeMono8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + xDest]; + sp = &src->data[(ySrc + y) * bitmap->rowSize + xSrc]; + for (x = 0; x < w; ++x) { + *p++ = *sp++; + } + } + break; + case splashModeRGB8: + case splashModeBGR8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + 3 * xDest]; + sp = &src->data[(ySrc + y) * src->rowSize + 3 * xSrc]; + for (x = 0; x < w; ++x) { + *p++ = *sp++; + *p++ = *sp++; + *p++ = *sp++; + } + } + break; + case splashModeXBGR8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest]; + sp = &src->data[(ySrc + y) * src->rowSize + 4 * xSrc]; + for (x = 0; x < w; ++x) { + *p++ = *sp++; + *p++ = *sp++; + *p++ = *sp++; + *p++ = 255; + sp++; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest]; + sp = &src->data[(ySrc + y) * src->rowSize + 4 * xSrc]; + for (x = 0; x < w; ++x) { + *p++ = *sp++; + *p++ = *sp++; + *p++ = *sp++; + *p++ = *sp++; + } + } + break; +#endif + } + + if (bitmap->alpha) { + for (y = 0; y < h; ++y) { + q = &bitmap->alpha[(yDest + y) * bitmap->width + xDest]; + memset(q, 0x00, w); + } + } + + return splashOk; +} + +SplashPath *Splash::makeStrokePath(SplashPath *path, SplashCoord w, + GBool flatten) { +SplashPath *pathIn, *dashPath, *pathOut; + SplashCoord d, dx, dy, wdx, wdy, dxNext, dyNext, wdxNext, wdyNext; + SplashCoord crossprod, dotprod, miter, m; + GBool first, last, closed; + int subpathStart0, subpathStart1, seg, i0, i1, j0, j1, k0, k1; + int left0, left1, left2, right0, right1, right2, join0, join1, join2; + int leftFirst, rightFirst, firstPt; + + pathOut = new SplashPath(); + + if (path->length == 0) { + return pathOut; + } + + if (flatten) { + pathIn = flattenPath(path, state->matrix, state->flatness); + if (state->lineDashLength > 0) { + dashPath = makeDashedPath(pathIn); + delete pathIn; + pathIn = dashPath; + if (pathIn->length == 0) { + delete pathIn; + return pathOut; + } + } + } else { + pathIn = path; + } + + subpathStart0 = subpathStart1 = 0; // make gcc happy + seg = 0; // make gcc happy + closed = gFalse; // make gcc happy + left0 = left1 = right0 = right1 = join0 = join1 = 0; // make gcc happy + leftFirst = rightFirst = firstPt = 0; // make gcc happy + + i0 = 0; + for (i1 = i0; + !(pathIn->flags[i1] & splashPathLast) && + i1 + 1 < pathIn->length && + pathIn->pts[i1+1].x == pathIn->pts[i1].x && + pathIn->pts[i1+1].y == pathIn->pts[i1].y; + ++i1) ; + + while (i1 < pathIn->length) { + if ((first = pathIn->flags[i0] & splashPathFirst)) { + subpathStart0 = i0; + subpathStart1 = i1; + seg = 0; + closed = pathIn->flags[i0] & splashPathClosed; + } + j0 = i1 + 1; + if (j0 < pathIn->length) { + for (j1 = j0; + !(pathIn->flags[j1] & splashPathLast) && + j1 + 1 < pathIn->length && + pathIn->pts[j1+1].x == pathIn->pts[j1].x && + pathIn->pts[j1+1].y == pathIn->pts[j1].y; + ++j1) ; + } else { + j1 = j0; + } + if (pathIn->flags[i1] & splashPathLast) { + if (first && state->lineCap == splashLineCapRound) { + // special case: zero-length subpath with round line caps --> + // draw a circle + pathOut->moveTo(pathIn->pts[i0].x + (SplashCoord)0.5 * w, + pathIn->pts[i0].y); + pathOut->curveTo(pathIn->pts[i0].x + (SplashCoord)0.5 * w, + pathIn->pts[i0].y + bezierCircle2 * w, + pathIn->pts[i0].x + bezierCircle2 * w, + pathIn->pts[i0].y + (SplashCoord)0.5 * w, + pathIn->pts[i0].x, + pathIn->pts[i0].y + (SplashCoord)0.5 * w); + pathOut->curveTo(pathIn->pts[i0].x - bezierCircle2 * w, + pathIn->pts[i0].y + (SplashCoord)0.5 * w, + pathIn->pts[i0].x - (SplashCoord)0.5 * w, + pathIn->pts[i0].y + bezierCircle2 * w, + pathIn->pts[i0].x - (SplashCoord)0.5 * w, + pathIn->pts[i0].y); + pathOut->curveTo(pathIn->pts[i0].x - (SplashCoord)0.5 * w, + pathIn->pts[i0].y - bezierCircle2 * w, + pathIn->pts[i0].x - bezierCircle2 * w, + pathIn->pts[i0].y - (SplashCoord)0.5 * w, + pathIn->pts[i0].x, + pathIn->pts[i0].y - (SplashCoord)0.5 * w); + pathOut->curveTo(pathIn->pts[i0].x + bezierCircle2 * w, + pathIn->pts[i0].y - (SplashCoord)0.5 * w, + pathIn->pts[i0].x + (SplashCoord)0.5 * w, + pathIn->pts[i0].y - bezierCircle2 * w, + pathIn->pts[i0].x + (SplashCoord)0.5 * w, + pathIn->pts[i0].y); + pathOut->close(); + } + i0 = j0; + i1 = j1; + continue; + } + last = pathIn->flags[j1] & splashPathLast; + if (last) { + k0 = subpathStart1 + 1; + } else { + k0 = j1 + 1; + } + for (k1 = k0; + !(pathIn->flags[k1] & splashPathLast) && + k1 + 1 < pathIn->length && + pathIn->pts[k1+1].x == pathIn->pts[k1].x && + pathIn->pts[k1+1].y == pathIn->pts[k1].y; + ++k1) ; + + // compute the deltas for segment (i1, j0) +#if USE_FIXEDPOINT + // the 1/d value can be small, which introduces significant + // inaccuracies in fixed point mode + d = splashDist(pathIn->pts[i1].x, pathIn->pts[i1].y, + pathIn->pts[j0].x, pathIn->pts[j0].y); + dx = (pathIn->pts[j0].x - pathIn->pts[i1].x) / d; + dy = (pathIn->pts[j0].y - pathIn->pts[i1].y) / d; +#else + d = (SplashCoord)1 / splashDist(pathIn->pts[i1].x, pathIn->pts[i1].y, + pathIn->pts[j0].x, pathIn->pts[j0].y); + dx = d * (pathIn->pts[j0].x - pathIn->pts[i1].x); + dy = d * (pathIn->pts[j0].y - pathIn->pts[i1].y); +#endif + wdx = (SplashCoord)0.5 * w * dx; + wdy = (SplashCoord)0.5 * w * dy; + + // draw the start cap + pathOut->moveTo(pathIn->pts[i0].x - wdy, pathIn->pts[i0].y + wdx); + if (i0 == subpathStart0) { + firstPt = pathOut->length - 1; + } + if (first && !closed) { + switch (state->lineCap) { + case splashLineCapButt: + pathOut->lineTo(pathIn->pts[i0].x + wdy, pathIn->pts[i0].y - wdx); + break; + case splashLineCapRound: + pathOut->curveTo(pathIn->pts[i0].x - wdy - bezierCircle * wdx, + pathIn->pts[i0].y + wdx - bezierCircle * wdy, + pathIn->pts[i0].x - wdx - bezierCircle * wdy, + pathIn->pts[i0].y - wdy + bezierCircle * wdx, + pathIn->pts[i0].x - wdx, + pathIn->pts[i0].y - wdy); + pathOut->curveTo(pathIn->pts[i0].x - wdx + bezierCircle * wdy, + pathIn->pts[i0].y - wdy - bezierCircle * wdx, + pathIn->pts[i0].x + wdy - bezierCircle * wdx, + pathIn->pts[i0].y - wdx - bezierCircle * wdy, + pathIn->pts[i0].x + wdy, + pathIn->pts[i0].y - wdx); + break; + case splashLineCapProjecting: + pathOut->lineTo(pathIn->pts[i0].x - wdx - wdy, + pathIn->pts[i0].y + wdx - wdy); + pathOut->lineTo(pathIn->pts[i0].x - wdx + wdy, + pathIn->pts[i0].y - wdx - wdy); + pathOut->lineTo(pathIn->pts[i0].x + wdy, + pathIn->pts[i0].y - wdx); + break; + } + } else { + pathOut->lineTo(pathIn->pts[i0].x + wdy, pathIn->pts[i0].y - wdx); + } + + // draw the left side of the segment rectangle + left2 = pathOut->length - 1; + pathOut->lineTo(pathIn->pts[j0].x + wdy, pathIn->pts[j0].y - wdx); + + // draw the end cap + if (last && !closed) { + switch (state->lineCap) { + case splashLineCapButt: + pathOut->lineTo(pathIn->pts[j0].x - wdy, pathIn->pts[j0].y + wdx); + break; + case splashLineCapRound: + pathOut->curveTo(pathIn->pts[j0].x + wdy + bezierCircle * wdx, + pathIn->pts[j0].y - wdx + bezierCircle * wdy, + pathIn->pts[j0].x + wdx + bezierCircle * wdy, + pathIn->pts[j0].y + wdy - bezierCircle * wdx, + pathIn->pts[j0].x + wdx, + pathIn->pts[j0].y + wdy); + pathOut->curveTo(pathIn->pts[j0].x + wdx - bezierCircle * wdy, + pathIn->pts[j0].y + wdy + bezierCircle * wdx, + pathIn->pts[j0].x - wdy + bezierCircle * wdx, + pathIn->pts[j0].y + wdx + bezierCircle * wdy, + pathIn->pts[j0].x - wdy, + pathIn->pts[j0].y + wdx); + break; + case splashLineCapProjecting: + pathOut->lineTo(pathIn->pts[j0].x + wdy + wdx, + pathIn->pts[j0].y - wdx + wdy); + pathOut->lineTo(pathIn->pts[j0].x - wdy + wdx, + pathIn->pts[j0].y + wdx + wdy); + pathOut->lineTo(pathIn->pts[j0].x - wdy, + pathIn->pts[j0].y + wdx); + break; + } + } else { + pathOut->lineTo(pathIn->pts[j0].x - wdy, pathIn->pts[j0].y + wdx); + } + + // draw the right side of the segment rectangle + // (NB: if stroke adjustment is enabled, the closepath operation MUST + // add a segment because this segment is used for a hint) + right2 = pathOut->length - 1; + pathOut->close(state->strokeAdjust); + + // draw the join + join2 = pathOut->length; + if (!last || closed) { + + // compute the deltas for segment (j1, k0) +#if USE_FIXEDPOINT + // the 1/d value can be small, which introduces significant + // inaccuracies in fixed point mode + d = splashDist(pathIn->pts[j1].x, pathIn->pts[j1].y, + pathIn->pts[k0].x, pathIn->pts[k0].y); + dxNext = (pathIn->pts[k0].x - pathIn->pts[j1].x) / d; + dyNext = (pathIn->pts[k0].y - pathIn->pts[j1].y) / d; +#else + d = (SplashCoord)1 / splashDist(pathIn->pts[j1].x, pathIn->pts[j1].y, + pathIn->pts[k0].x, pathIn->pts[k0].y); + dxNext = d * (pathIn->pts[k0].x - pathIn->pts[j1].x); + dyNext = d * (pathIn->pts[k0].y - pathIn->pts[j1].y); +#endif + wdxNext = (SplashCoord)0.5 * w * dxNext; + wdyNext = (SplashCoord)0.5 * w * dyNext; + + // compute the join parameters + crossprod = dx * dyNext - dy * dxNext; + dotprod = -(dx * dxNext + dy * dyNext); + if (dotprod > 0.9999) { + // avoid a divide-by-zero -- set miter to something arbitrary + // such that sqrt(miter) will exceed miterLimit (and m is never + // used in that situation) + // (note: the comparison value (0.9999) has to be less than + // 1-epsilon, where epsilon is the smallest value + // representable in the fixed point format) + miter = (state->miterLimit + 1) * (state->miterLimit + 1); + m = 0; + } else { + miter = (SplashCoord)2 / ((SplashCoord)1 - dotprod); + if (miter < 1) { + // this can happen because of floating point inaccuracies + miter = 1; + } + m = splashSqrt(miter - 1); + } + + // round join + if (state->lineJoin == splashLineJoinRound) { + pathOut->moveTo(pathIn->pts[j0].x + (SplashCoord)0.5 * w, + pathIn->pts[j0].y); + pathOut->curveTo(pathIn->pts[j0].x + (SplashCoord)0.5 * w, + pathIn->pts[j0].y + bezierCircle2 * w, + pathIn->pts[j0].x + bezierCircle2 * w, + pathIn->pts[j0].y + (SplashCoord)0.5 * w, + pathIn->pts[j0].x, + pathIn->pts[j0].y + (SplashCoord)0.5 * w); + pathOut->curveTo(pathIn->pts[j0].x - bezierCircle2 * w, + pathIn->pts[j0].y + (SplashCoord)0.5 * w, + pathIn->pts[j0].x - (SplashCoord)0.5 * w, + pathIn->pts[j0].y + bezierCircle2 * w, + pathIn->pts[j0].x - (SplashCoord)0.5 * w, + pathIn->pts[j0].y); + pathOut->curveTo(pathIn->pts[j0].x - (SplashCoord)0.5 * w, + pathIn->pts[j0].y - bezierCircle2 * w, + pathIn->pts[j0].x - bezierCircle2 * w, + pathIn->pts[j0].y - (SplashCoord)0.5 * w, + pathIn->pts[j0].x, + pathIn->pts[j0].y - (SplashCoord)0.5 * w); + pathOut->curveTo(pathIn->pts[j0].x + bezierCircle2 * w, + pathIn->pts[j0].y - (SplashCoord)0.5 * w, + pathIn->pts[j0].x + (SplashCoord)0.5 * w, + pathIn->pts[j0].y - bezierCircle2 * w, + pathIn->pts[j0].x + (SplashCoord)0.5 * w, + pathIn->pts[j0].y); + + } else { + pathOut->moveTo(pathIn->pts[j0].x, pathIn->pts[j0].y); + + // angle < 180 + if (crossprod < 0) { + pathOut->lineTo(pathIn->pts[j0].x - wdyNext, + pathIn->pts[j0].y + wdxNext); + // miter join inside limit + if (state->lineJoin == splashLineJoinMiter && + splashSqrt(miter) <= state->miterLimit) { + pathOut->lineTo(pathIn->pts[j0].x - wdy + wdx * m, + pathIn->pts[j0].y + wdx + wdy * m); + pathOut->lineTo(pathIn->pts[j0].x - wdy, + pathIn->pts[j0].y + wdx); + // bevel join or miter join outside limit + } else { + pathOut->lineTo(pathIn->pts[j0].x - wdy, + pathIn->pts[j0].y + wdx); + } + + // angle >= 180 + } else { + pathOut->lineTo(pathIn->pts[j0].x + wdy, + pathIn->pts[j0].y - wdx); + // miter join inside limit + if (state->lineJoin == splashLineJoinMiter && + splashSqrt(miter) <= state->miterLimit) { + pathOut->lineTo(pathIn->pts[j0].x + wdy + wdx * m, + pathIn->pts[j0].y - wdx + wdy * m); + pathOut->lineTo(pathIn->pts[j0].x + wdyNext, + pathIn->pts[j0].y - wdxNext); + // bevel join or miter join outside limit + } else { + pathOut->lineTo(pathIn->pts[j0].x + wdyNext, + pathIn->pts[j0].y - wdxNext); + } + } + } + + pathOut->close(); + } + + // add stroke adjustment hints + if (state->strokeAdjust) { + if (seg == 0 && !closed) { + if (state->lineCap == splashLineCapButt) { + pathOut->addStrokeAdjustHint(firstPt, left2 + 1, + firstPt, firstPt + 1); + if (last) { + pathOut->addStrokeAdjustHint(firstPt, left2 + 1, + left2 + 1, left2 + 2); + } + } else if (state->lineCap == splashLineCapProjecting) { + if (last) { + pathOut->addStrokeAdjustHint(firstPt + 1, left2 + 2, + firstPt + 1, firstPt + 2); + pathOut->addStrokeAdjustHint(firstPt + 1, left2 + 2, + left2 + 2, left2 + 3); + } else { + pathOut->addStrokeAdjustHint(firstPt + 1, left2 + 1, + firstPt + 1, firstPt + 2); + } + } + } + if (seg >= 1) { + if (seg >= 2) { + pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0); + pathOut->addStrokeAdjustHint(left1, right1, join0, left2); + } else { + pathOut->addStrokeAdjustHint(left1, right1, firstPt, left2); + } + pathOut->addStrokeAdjustHint(left1, right1, right2 + 1, right2 + 1); + } + left0 = left1; + left1 = left2; + right0 = right1; + right1 = right2; + join0 = join1; + join1 = join2; + if (seg == 0) { + leftFirst = left2; + rightFirst = right2; + } + if (last) { + if (seg >= 2) { + pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0); + pathOut->addStrokeAdjustHint(left1, right1, + join0, pathOut->length - 1); + } else { + pathOut->addStrokeAdjustHint(left1, right1, + firstPt, pathOut->length - 1); + } + if (closed) { + pathOut->addStrokeAdjustHint(left1, right1, firstPt, leftFirst); + pathOut->addStrokeAdjustHint(left1, right1, + rightFirst + 1, rightFirst + 1); + pathOut->addStrokeAdjustHint(leftFirst, rightFirst, + left1 + 1, right1); + pathOut->addStrokeAdjustHint(leftFirst, rightFirst, + join1, pathOut->length - 1); + } + if (!closed && seg > 0) { + if (state->lineCap == splashLineCapButt) { + pathOut->addStrokeAdjustHint(left1 - 1, left1 + 1, + left1 + 1, left1 + 2); + } else if (state->lineCap == splashLineCapProjecting) { + pathOut->addStrokeAdjustHint(left1 - 1, left1 + 2, + left1 + 2, left1 + 3); + } + } + } + } + + i0 = j0; + i1 = j1; + ++seg; + } + + if (pathIn != path) { + delete pathIn; + } + + return pathOut; +} + +void Splash::dumpPath(SplashPath *path) { + int i; + + for (i = 0; i < path->length; ++i) { + printf(" %3d: x=%8.2f y=%8.2f%s%s%s%s\n", + i, (double)path->pts[i].x, (double)path->pts[i].y, + (path->flags[i] & splashPathFirst) ? " first" : "", + (path->flags[i] & splashPathLast) ? " last" : "", + (path->flags[i] & splashPathClosed) ? " closed" : "", + (path->flags[i] & splashPathCurve) ? " curve" : ""); + } +} + +void Splash::dumpXPath(SplashXPath *path) { + int i; + + for (i = 0; i < path->length; ++i) { + printf(" %4d: x0=%8.2f y0=%8.2f x1=%8.2f y1=%8.2f %s%s%s\n", + i, (double)path->segs[i].x0, (double)path->segs[i].y0, + (double)path->segs[i].x1, (double)path->segs[i].y1, + (path->segs[i].flags & splashXPathHoriz) ? "H" : " ", + (path->segs[i].flags & splashXPathVert) ? "V" : " ", + (path->segs[i].flags & splashXPathFlip) ? "P" : " "); + } +} + +SplashError Splash::shadedFill(SplashPath *path, GBool hasBBox, + SplashPattern *pattern) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathScanner *scanner; + int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; + SplashClipResult clipRes; + + if (vectorAntialias && aaBuf == NULL) { // should not happen, but to be secure + return splashErrGeneric; + } + if (path->length == 0) { + return splashErrEmptyPath; + } + xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); + if (vectorAntialias) { + xPath->aaScale(); + } + xPath->sort(); + yMinI = state->clip->getYMinI(); + yMaxI = state->clip->getYMaxI(); + if (vectorAntialias && !inShading) { + yMinI = yMinI * splashAASize; + yMaxI = (yMaxI + 1) * splashAASize - 1; + } + scanner = new SplashXPathScanner(xPath, gFalse, yMinI, yMaxI); + + // get the min and max x and y values + if (vectorAntialias) { + scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI); + } else { + scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); + } + + // check clipping + if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) != splashClipAllOutside) { + // limit the y range + if (yMinI < state->clip->getYMinI()) { + yMinI = state->clip->getYMinI(); + } + if (yMaxI > state->clip->getYMaxI()) { + yMaxI = state->clip->getYMaxI(); + } + + pipeInit(&pipe, 0, yMinI, pattern, NULL, (Guchar)splashRound(state->fillAlpha * 255), vectorAntialias && !hasBBox, gFalse); + + // draw the spans + if (vectorAntialias) { + for (y = yMinI; y <= yMaxI; ++y) { + scanner->renderAALine(aaBuf, &x0, &x1, y); + if (clipRes != splashClipAllInside) { + state->clip->clipAALine(aaBuf, &x0, &x1, y); + } +#if splashAASize == 4 + if (!hasBBox && y > yMinI && y < yMaxI) { + // correct shape on left side if clip is + // vertical through the middle of shading: + Guchar *p0, *p1, *p2, *p3; + Guchar c1, c2, c3, c4; + p0 = aaBuf->getDataPtr() + (x0 >> 1); + p1 = p0 + aaBuf->getRowSize(); + p2 = p1 + aaBuf->getRowSize(); + p3 = p2 + aaBuf->getRowSize(); + if (x0 & 1) { + c1 = (*p0 & 0x0f); c2 =(*p1 & 0x0f); c3 = (*p2 & 0x0f) ; c4 = (*p3 & 0x0f); + } else { + c1 = (*p0 >> 4); c2 = (*p1 >> 4); c3 = (*p2 >> 4); c4 = (*p3 >> 4); + } + if ( (c1 & 0x03) == 0x03 && (c2 & 0x03) == 0x03 && (c3 & 0x03) == 0x03 && (c4 & 0x03) == 0x03 + && c1 == c2 && c2 == c3 && c3 == c4 && + pattern->testPosition(x0 - 1, y) ) + { + Guchar shapeCorrection = (x0 & 1) ? 0x0f : 0xf0; + *p0 |= shapeCorrection; + *p1 |= shapeCorrection; + *p2 |= shapeCorrection; + *p3 |= shapeCorrection; + } + // correct shape on right side if clip is + // through the middle of shading: + p0 = aaBuf->getDataPtr() + (x1 >> 1); + p1 = p0 + aaBuf->getRowSize(); + p2 = p1 + aaBuf->getRowSize(); + p3 = p2 + aaBuf->getRowSize(); + if (x1 & 1) { + c1 = (*p0 & 0x0f); c2 =(*p1 & 0x0f); c3 = (*p2 & 0x0f) ; c4 = (*p3 & 0x0f); + } else { + c1 = (*p0 >> 4); c2 = (*p1 >> 4); c3 = (*p2 >> 4); c4 = (*p3 >> 4); + } + + if ( (c1 & 0xc) == 0x0c && (c2 & 0x0c) == 0x0c && (c3 & 0x0c) == 0x0c && (c4 & 0x0c) == 0x0c + && c1 == c2 && c2 == c3 && c3 == c4 && + pattern->testPosition(x1 + 1, y) ) + { + Guchar shapeCorrection = (x1 & 1) ? 0x0f : 0xf0; + *p0 |= shapeCorrection; + *p1 |= shapeCorrection; + *p2 |= shapeCorrection; + *p3 |= shapeCorrection; + } + } +#endif + drawAALine(&pipe, x0, x1, y); + } + } else { + SplashClipResult clipRes2; + for (y = yMinI; y <= yMaxI; ++y) { + while (scanner->getNextSpan(y, &x0, &x1)) { + if (clipRes == splashClipAllInside) { + drawSpan(&pipe, x0, x1, y, gTrue); + } else { + // limit the x range + if (x0 < state->clip->getXMinI()) { + x0 = state->clip->getXMinI(); + } + if (x1 > state->clip->getXMaxI()) { + x1 = state->clip->getXMaxI(); + } + clipRes2 = state->clip->testSpan(x0, x1, y); + drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); + } + } + } + } + } + opClipRes = clipRes; + + delete scanner; + delete xPath; + return splashOk; +} diff --git a/splash/Splash.h b/splash/Splash.h new file mode 100644 index 0000000..f4fb542 --- /dev/null +++ b/splash/Splash.h @@ -0,0 +1,407 @@ +//======================================================================== +// +// Splash.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005 Marco Pesenti Gritti +// Copyright (C) 2007, 2011 Albert Astals Cid +// Copyright (C) 2010-2012 Thomas Freitag +// Copyright (C) 2010 Christian Feuersänger +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASH_H +#define SPLASH_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "SplashTypes.h" +#include "SplashClip.h" +#include "SplashPattern.h" + +class SplashBitmap; +struct SplashGlyphBitmap; +class SplashState; +class SplashScreen; +class SplashPath; +class SplashXPath; +class SplashFont; +struct SplashPipe; + +//------------------------------------------------------------------------ + +// Retrieves the next line of pixels in an image mask. Normally, +// fills in * and returns true. If the image stream is +// exhausted, returns false. +typedef GBool (*SplashImageMaskSource)(void *data, SplashColorPtr pixel); + +// Retrieves the next line of pixels in an image. Normally, fills in +// * and returns true. If the image stream is exhausted, +// returns false. +typedef GBool (*SplashImageSource)(void *data, SplashColorPtr colorLine, + Guchar *alphaLine); + +//------------------------------------------------------------------------ + +enum SplashPipeResultColorCtrl { +#if SPLASH_CMYK + splashPipeResultColorNoAlphaBlendCMYK, +#endif + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendRGB, +#if SPLASH_CMYK + splashPipeResultColorAlphaNoBlendCMYK, +#endif + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaBlendCMYK +#endif +}; + +//------------------------------------------------------------------------ +// Splash +//------------------------------------------------------------------------ + +class Splash { +public: + + // Create a new rasterizer object. + Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreenParams *screenParams = NULL); + Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreen *screenA); + + ~Splash(); + + //----- state read + + SplashCoord *getMatrix(); + SplashPattern *getStrokePattern(); + SplashPattern *getFillPattern(); + SplashScreen *getScreen(); + SplashBlendFunc getBlendFunc(); + SplashCoord getStrokeAlpha(); + SplashCoord getFillAlpha(); + SplashCoord getLineWidth(); + int getLineCap(); + int getLineJoin(); + SplashCoord getMiterLimit(); + SplashCoord getFlatness(); + SplashCoord *getLineDash(); + int getLineDashLength(); + SplashCoord getLineDashPhase(); + GBool getStrokeAdjust(); + SplashClip *getClip(); + SplashBitmap *getSoftMask(); + GBool getInNonIsolatedGroup(); + + //----- state write + + void setMatrix(SplashCoord *matrix); + void setStrokePattern(SplashPattern *strokeColor); + void setFillPattern(SplashPattern *fillColor); + void setScreen(SplashScreen *screen); + void setBlendFunc(SplashBlendFunc func); + void setStrokeAlpha(SplashCoord alpha); + void setFillAlpha(SplashCoord alpha); + void setFillOverprint(GBool fop); + void setStrokeOverprint(GBool sop); + void setOverprintMode(int opm); + void setLineWidth(SplashCoord lineWidth); + void setLineCap(int lineCap); + void setLineJoin(int lineJoin); + void setMiterLimit(SplashCoord miterLimit); + void setFlatness(SplashCoord flatness); + // the array will be copied + void setLineDash(SplashCoord *lineDash, int lineDashLength, + SplashCoord lineDashPhase); + void setStrokeAdjust(GBool strokeAdjust); + // NB: uses transformed coordinates. + void clipResetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + // NB: uses transformed coordinates. + SplashError clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + // NB: uses untransformed coordinates. + SplashError clipToPath(SplashPath *path, GBool eo); + void setSoftMask(SplashBitmap *softMask); + void setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, + int alpha0XA, int alpha0YA); + void setTransfer(Guchar *red, Guchar *green, Guchar *blue, Guchar *gray); + void setOverprintMask(Guint overprintMask, GBool additive); + + //----- state save/restore + + void saveState(); + SplashError restoreState(); + + //----- drawing operations + + // Fill the bitmap with . This is not subject to clipping. + void clear(SplashColorPtr color, Guchar alpha = 0x00); + + // Stroke a path using the current stroke pattern. + SplashError stroke(SplashPath *path); + + // Fill a path using the current fill pattern. + SplashError fill(SplashPath *path, GBool eo); + + // Fill a path, XORing with the current fill pattern. + SplashError xorFill(SplashPath *path, GBool eo); + + // Draw a character, using the current fill pattern. + SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font); + + // Draw a glyph, using the current fill pattern. This function does + // not free any data, i.e., it ignores glyph->freeData. + void fillGlyph(SplashCoord x, SplashCoord y, + SplashGlyphBitmap *glyph); + + // Draws an image mask using the fill color. This will read + // lines of pixels from , starting with the top line. "1" + // pixels will be drawn with the current fill color; "0" pixels are + // transparent. The matrix: + // [ mat[0] mat[1] 0 ] + // [ mat[2] mat[3] 0 ] + // [ mat[4] mat[5] 1 ] + // maps a unit square to the desired destination for the image, in + // PostScript style: + // [x' y' 1] = [x y 1] * mat + // Note that the Splash y axis points downward, and the image source + // is assumed to produce pixels in raster order, starting from the + // top line. + SplashError fillImageMask(SplashImageMaskSource src, void *srcData, + int w, int h, SplashCoord *mat, + GBool glyphMode); + + // Draw an image. This will read lines of pixels from + // , starting with the top line. These pixels are assumed to + // be in the source mode, . If is true, the + // alpha values returned by are used; otherwise they are + // ignored. The following combinations of source and target modes + // are supported: + // source target + // ------ ------ + // Mono1 Mono1 + // Mono8 Mono1 -- with dithering + // Mono8 Mono8 + // RGB8 RGB8 + // BGR8 BGR8 + // CMYK8 CMYK8 + // The matrix behaves as for fillImageMask. + SplashError drawImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, GBool srcAlpha, + int w, int h, SplashCoord *mat, GBool tilingPattern = gFalse); + + // Composite a rectangular region from onto this Splash + // object. + SplashError composite(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h, + GBool noClip, GBool nonIsolated, + GBool knockout = gFalse, SplashCoord knockoutOpacity = 1.0); + + // Composite this Splash object onto a background color. The + // background alpha is assumed to be 1. + void compositeBackground(SplashColorPtr color); + + // Copy a rectangular region from onto the bitmap belonging to + // this Splash object. The destination alpha values are all set to + // zero. + SplashError blitTransparent(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h); + + //----- misc + + // Construct a path for a stroke, given the path to be stroked and + // the line width . All other stroke parameters are taken from + // the current state. If is true, this function will + // first flatten the path and handle the linedash. + SplashPath *makeStrokePath(SplashPath *path, SplashCoord w, + GBool flatten = gTrue); + + // Return the associated bitmap. + SplashBitmap *getBitmap() { return bitmap; } + + // Set the minimum line width. + void setMinLineWidth(SplashCoord w) { minLineWidth = w; } + + // Get a bounding box which includes all modifications since the + // last call to clearModRegion. + void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax) + { *xMin = modXMin; *yMin = modYMin; *xMax = modXMax; *yMax = modYMax; } + + // Clear the modified region bounding box. + void clearModRegion(); + + // Get clipping status for the last drawing operation subject to + // clipping. + SplashClipResult getClipRes() { return opClipRes; } + + // Toggle debug mode on or off. + void setDebugMode(GBool debugModeA) { debugMode = debugModeA; } + +#if 1 //~tmp: turn off anti-aliasing temporarily + void setInShading(GBool sh) { inShading = sh; } + GBool getVectorAntialias() { return vectorAntialias; } + void setVectorAntialias(GBool vaa) { vectorAntialias = vaa; } +#endif + + // Do shaded fills with dynamic patterns + SplashError shadedFill(SplashPath *path, GBool hasBBox, + SplashPattern *pattern); + // Draw a gouraud triangle shading. + GBool gouraudTriangleShadedFill(SplashGouraudColor *shading); + +private: + + void pipeInit(SplashPipe *pipe, int x, int y, + SplashPattern *pattern, SplashColorPtr cSrc, + Guchar aInput, GBool usesShape, + GBool nonIsolatedGroup, + GBool knockout = gFalse, Guchar knockoutOpacity = 255); + void pipeRun(SplashPipe *pipe); + void pipeRunSimpleMono1(SplashPipe *pipe); + void pipeRunSimpleMono8(SplashPipe *pipe); + void pipeRunSimpleRGB8(SplashPipe *pipe); + void pipeRunSimpleXBGR8(SplashPipe *pipe); + void pipeRunSimpleBGR8(SplashPipe *pipe); +#if SPLASH_CMYK + void pipeRunSimpleCMYK8(SplashPipe *pipe); +#endif + void pipeRunAAMono1(SplashPipe *pipe); + void pipeRunAAMono8(SplashPipe *pipe); + void pipeRunAARGB8(SplashPipe *pipe); + void pipeRunAAXBGR8(SplashPipe *pipe); + void pipeRunAABGR8(SplashPipe *pipe); +#if SPLASH_CMYK + void pipeRunAACMYK8(SplashPipe *pipe); +#endif + void pipeSetXY(SplashPipe *pipe, int x, int y); + void pipeIncX(SplashPipe *pipe); + void drawPixel(SplashPipe *pipe, int x, int y, GBool noClip); + void drawAAPixelInit(); + void drawAAPixel(SplashPipe *pipe, int x, int y); + void drawSpan(SplashPipe *pipe, int x0, int x1, int y, GBool noClip); + void drawAALine(SplashPipe *pipe, int x0, int x1, int y); + void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo); + void updateModX(int x); + void updateModY(int y); + void strokeNarrow(SplashPath *path); + void strokeWide(SplashPath *path, SplashCoord w); + SplashPath *flattenPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness); + void flattenCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord *matrix, SplashCoord flatness2, + SplashPath *fPath); + SplashPath *makeDashedPath(SplashPath *xPath); + SplashError fillWithPattern(SplashPath *path, GBool eo, + SplashPattern *pattern, SplashCoord alpha); + GBool pathAllOutside(SplashPath *path); + void fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph, GBool noclip); + void arbitraryTransformMask(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + SplashCoord *mat, GBool glyphMode); + SplashBitmap *scaleMask(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight); + void scaleMaskYdXd(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void scaleMaskYdXu(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void scaleMaskYuXd(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void scaleMaskYuXu(SplashImageMaskSource src, void *srcData, + int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void blitMask(SplashBitmap *src, int xDest, int yDest, + SplashClipResult clipRes); + SplashError arbitraryTransformImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, + int srcWidth, int srcHeight, + SplashCoord *mat, GBool tilingPattern = gFalse); + SplashBitmap *scaleImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight); + void scaleImageYdXd(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void scaleImageYdXu(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void scaleImageYuXd(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void scaleImageYuXu(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest); + void vertFlipImage(SplashBitmap *img, int width, int height, + int nComps); + void blitImage(SplashBitmap *src, GBool srcAlpha, int xDest, int yDest, + SplashClipResult clipRes); + void blitImageClipped(SplashBitmap *src, GBool srcAlpha, + int xSrc, int ySrc, int xDest, int yDest, + int w, int h); + void dumpPath(SplashPath *path); + void dumpXPath(SplashXPath *path); + + static SplashPipeResultColorCtrl pipeResultColorNoAlphaBlend[]; + static SplashPipeResultColorCtrl pipeResultColorAlphaNoBlend[]; + static SplashPipeResultColorCtrl pipeResultColorAlphaBlend[]; + static int pipeNonIsoGroupCorrection[]; + + SplashBitmap *bitmap; + SplashState *state; + SplashBitmap *aaBuf; + int aaBufY; + SplashBitmap *alpha0Bitmap; // for non-isolated groups, this is the + // bitmap containing the alpha0 values + int alpha0X, alpha0Y; // offset within alpha0Bitmap + SplashCoord aaGamma[splashAASize * splashAASize + 1]; + SplashCoord minLineWidth; + int modXMin, modYMin, modXMax, modYMax; + SplashClipResult opClipRes; + GBool vectorAntialias; + GBool inShading; + GBool debugMode; +}; + +#endif diff --git a/splash/SplashBitmap.cc b/splash/SplashBitmap.cc new file mode 100644 index 0000000..cd85543 --- /dev/null +++ b/splash/SplashBitmap.cc @@ -0,0 +1,532 @@ +//======================================================================== +// +// SplashBitmap.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2009, 2010, 2012 Albert Astals Cid +// Copyright (C) 2007 Ilmari Heikkinen +// Copyright (C) 2009 Shen Liang +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010 Adrian Johnson +// Copyright (C) 2010 Harry Roberts +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2010 William Bader +// Copyright (C) 2011, 2012 Thomas Freitag +// Copyright (C) 2012 Anthony Wesley +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "goo/gmem.h" +#include "SplashErrorCodes.h" +#include "SplashBitmap.h" +#include "poppler/Error.h" +#include "goo/JpegWriter.h" +#include "goo/PNGWriter.h" +#include "goo/TiffWriter.h" +#include "goo/ImgWriter.h" + +//------------------------------------------------------------------------ +// SplashBitmap +//------------------------------------------------------------------------ + +SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPadA, + SplashColorMode modeA, GBool alphaA, + GBool topDown) { + width = widthA; + height = heightA; + mode = modeA; + rowPad = rowPadA; + switch (mode) { + case splashModeMono1: + if (width > 0) { + rowSize = (width + 7) >> 3; + } else { + rowSize = -1; + } + break; + case splashModeMono8: + if (width > 0) { + rowSize = width; + } else { + rowSize = -1; + } + break; + case splashModeRGB8: + case splashModeBGR8: + if (width > 0 && width <= INT_MAX / 3) { + rowSize = width * 3; + } else { + rowSize = -1; + } + break; + case splashModeXBGR8: + if (width > 0 && width <= INT_MAX / 4) { + rowSize = width * 4; + } else { + rowSize = -1; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + if (width > 0 && width <= INT_MAX / 4) { + rowSize = width * 4; + } else { + rowSize = -1; + } + break; +#endif + } + if (rowSize > 0) { + rowSize += rowPad - 1; + rowSize -= rowSize % rowPad; + } + data = (SplashColorPtr)gmallocn_checkoverflow(rowSize, height); + if (data != NULL) { + if (!topDown) { + data += (height - 1) * rowSize; + rowSize = -rowSize; + } + if (alphaA) { + alpha = (Guchar *)gmallocn(width, height); + } else { + alpha = NULL; + } + } else { + alpha = NULL; + } +} + +SplashBitmap *SplashBitmap::copy(SplashBitmap *src) { + SplashBitmap *result = new SplashBitmap(src->getWidth(), src->getHeight(), src->getRowPad(), + src->getMode(), src->getAlphaPtr() != NULL, src->getRowSize() >= 0); + Guchar *dataSource = src->getDataPtr(); + Guchar *dataDest = result->getDataPtr(); + int amount = src->getRowSize(); + if (amount < 0) { + dataSource = dataSource + (src->getHeight() - 1) * amount; + dataDest = dataDest + (src->getHeight() - 1) * amount; + amount *= -src->getHeight(); + } else { + amount *= src->getHeight(); + } + memcpy(dataDest, dataSource, amount); + if (src->getAlphaPtr() != NULL) { + memcpy(result->getAlphaPtr(), src->getAlphaPtr(), src->getWidth() * src->getHeight()); + } + return result; +} + +SplashBitmap::~SplashBitmap() { + if (data) { + if (rowSize < 0) { + gfree(data + (height - 1) * rowSize); + } else { + gfree(data); + } + } + gfree(alpha); +} + + +SplashError SplashBitmap::writePNMFile(char *fileName) { + FILE *f; + SplashError e; + + if (!(f = fopen(fileName, "wb"))) { + return splashErrOpenFile; + } + + e = this->writePNMFile(f); + + fclose(f); + return e; +} + + +SplashError SplashBitmap::writePNMFile(FILE *f) { + SplashColorPtr row, p; + int x, y; + + switch (mode) { + + case splashModeMono1: + fprintf(f, "P4\n%d %d\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; x += 8) { + fputc(*p ^ 0xff, f); + ++p; + } + row += rowSize; + } + break; + + case splashModeMono8: + fprintf(f, "P5\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + fwrite(row, 1, width, f); + row += rowSize; + } + break; + + case splashModeRGB8: + fprintf(f, "P6\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + fwrite(row, 1, 3 * width, f); + row += rowSize; + } + break; + + case splashModeXBGR8: + fprintf(f, "P6\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; ++x) { + fputc(splashBGR8R(p), f); + fputc(splashBGR8G(p), f); + fputc(splashBGR8B(p), f); + p += 4; + } + row += rowSize; + } + break; + + + case splashModeBGR8: + fprintf(f, "P6\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; ++x) { + fputc(splashBGR8R(p), f); + fputc(splashBGR8G(p), f); + fputc(splashBGR8B(p), f); + p += 3; + } + row += rowSize; + } + break; + +#if SPLASH_CMYK + case splashModeCMYK8: + // PNM doesn't support CMYK + error(errInternal, -1, "unsupported SplashBitmap mode"); + return splashErrGeneric; + break; +#endif + } + return splashOk; +} + +SplashError SplashBitmap::writeAlphaPGMFile(char *fileName) { + FILE *f; + + if (!alpha) { + return splashErrModeMismatch; + } + if (!(f = fopen(fileName, "wb"))) { + return splashErrOpenFile; + } + fprintf(f, "P5\n%d %d\n255\n", width, height); + fwrite(alpha, 1, width * height, f); + fclose(f); + return splashOk; +} + +void SplashBitmap::getPixel(int x, int y, SplashColorPtr pixel) { + SplashColorPtr p; + + if (y < 0 || y >= height || x < 0 || x >= width) { + return; + } + switch (mode) { + case splashModeMono1: + p = &data[y * rowSize + (x >> 3)]; + pixel[0] = (p[0] & (0x80 >> (x & 7))) ? 0xff : 0x00; + break; + case splashModeMono8: + p = &data[y * rowSize + x]; + pixel[0] = p[0]; + break; + case splashModeRGB8: + p = &data[y * rowSize + 3 * x]; + pixel[0] = p[0]; + pixel[1] = p[1]; + pixel[2] = p[2]; + break; + case splashModeXBGR8: + p = &data[y * rowSize + 4 * x]; + pixel[0] = p[2]; + pixel[1] = p[1]; + pixel[2] = p[0]; + pixel[3] = p[3]; + break; + case splashModeBGR8: + p = &data[y * rowSize + 3 * x]; + pixel[0] = p[2]; + pixel[1] = p[1]; + pixel[2] = p[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + p = &data[y * rowSize + 4 * x]; + pixel[0] = p[0]; + pixel[1] = p[1]; + pixel[2] = p[2]; + pixel[3] = p[3]; + break; +#endif + } +} + +Guchar SplashBitmap::getAlpha(int x, int y) { + return alpha[y * width + x]; +} + +SplashColorPtr SplashBitmap::takeData() { + SplashColorPtr data2; + + data2 = data; + data = NULL; + return data2; +} + +SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, char *fileName, int hDPI, int vDPI, const char *compressionString) { + FILE *f; + SplashError e; + + if (!(f = fopen(fileName, "wb"))) { + return splashErrOpenFile; + } + + e = writeImgFile(format, f, hDPI, vDPI, compressionString); + + fclose(f); + return e; +} + +SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, const char *compressionString) { + ImgWriter *writer; + SplashError e; + + switch (format) { + #ifdef ENABLE_LIBPNG + case splashFormatPng: + writer = new PNGWriter(); + break; + #endif + + #ifdef ENABLE_LIBJPEG + #ifdef SPLASH_CMYK + case splashFormatJpegCMYK: + writer = new JpegWriter(JCS_CMYK); + break; + #endif + case splashFormatJpeg: + writer = new JpegWriter(); + break; + #endif + + #ifdef ENABLE_LIBTIFF + case splashFormatTiff: + writer = new TiffWriter(); + if (writer) { + ((TiffWriter *)writer)->setCompressionString(compressionString); + ((TiffWriter *)writer)->setSplashMode(mode); + } + break; + #endif + + default: + // Not the greatest error message, but users of this function should + // have already checked whether their desired format is compiled in. + error(errInternal, -1, "Support for this image type not compiled in"); + return splashErrGeneric; + } + + e = writeImgFile(writer, f, hDPI, vDPI); + delete writer; + return e; +} + +#include "poppler/GfxState_helpers.h" + +void SplashBitmap::getRGBLine(int yl, SplashColorPtr line) { + SplashColor col; + double c, m, y, k, c1, m1, y1, k1, r, g, b; + + for (int x = 0; x < width; x++) { + getPixel(x, yl, col); + c = byteToDbl(col[0]); + m = byteToDbl(col[1]); + y = byteToDbl(col[2]); + k = byteToDbl(col[3]); + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); + *line++ = dblToByte(clip01(r)); + *line++ = dblToByte(clip01(g)); + *line++ = dblToByte(clip01(b)); + } +} + +SplashError SplashBitmap::writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI) { + if (mode != splashModeRGB8 && mode != splashModeMono8 && mode != splashModeMono1 && mode != splashModeXBGR8 +#if SPLASH_CMYK + && mode != splashModeCMYK8 +#endif + ) { + error(errInternal, -1, "unsupported SplashBitmap mode"); + return splashErrGeneric; + } + + if (!writer->init(f, width, height, hDPI, vDPI)) { + return splashErrGeneric; + } + + switch (mode) { +#if SPLASH_CMYK + case splashModeCMYK8: + if (writer->supportCMYK()) { + SplashColorPtr row; + unsigned char **row_pointers = new unsigned char*[height]; + row = data; + + for (int y = 0; y < height; ++y) { + row_pointers[y] = row; + row += rowSize; + } + if (!writer->writePointers(row_pointers, height)) { + delete[] row_pointers; + return splashErrGeneric; + } + delete[] row_pointers; + } else { + unsigned char *row = new unsigned char[3 * width]; + for (int y = 0; y < height; y++) { + getRGBLine(y, row); + if (!writer->writeRow(&row)) { + delete[] row; + return splashErrGeneric; + } + } + delete[] row; + } + break; +#endif + case splashModeRGB8: + { + SplashColorPtr row; + unsigned char **row_pointers = new unsigned char*[height]; + row = data; + + for (int y = 0; y < height; ++y) { + row_pointers[y] = row; + row += rowSize; + } + if (!writer->writePointers(row_pointers, height)) { + delete[] row_pointers; + return splashErrGeneric; + } + delete[] row_pointers; + } + break; + + case splashModeXBGR8: + { + unsigned char *row = new unsigned char[3 * width]; + for (int y = 0; y < height; y++) { + // Convert into a PNG row + for (int x = 0; x < width; x++) { + row[3*x] = data[y * rowSize + x * 4 + 2]; + row[3*x+1] = data[y * rowSize + x * 4 + 1]; + row[3*x+2] = data[y * rowSize + x * 4]; + } + + if (!writer->writeRow(&row)) { + delete[] row; + return splashErrGeneric; + } + } + delete[] row; + } + break; + + case splashModeMono8: + { + unsigned char *row = new unsigned char[3 * width]; + for (int y = 0; y < height; y++) { + // Convert into a PNG row + for (int x = 0; x < width; x++) { + row[3*x] = data[y * rowSize + x]; + row[3*x+1] = data[y * rowSize + x]; + row[3*x+2] = data[y * rowSize + x]; + } + + if (!writer->writeRow(&row)) { + delete[] row; + return splashErrGeneric; + } + } + delete[] row; + } + break; + + case splashModeMono1: + { + unsigned char *row = new unsigned char[3 * width]; + for (int y = 0; y < height; y++) { + // Convert into a PNG row + for (int x = 0; x < width; x++) { + getPixel(x, y, &row[3*x]); + row[3*x+1] = row[3*x]; + row[3*x+2] = row[3*x]; + } + + if (!writer->writeRow(&row)) { + delete[] row; + return splashErrGeneric; + } + } + delete[] row; + } + break; + + default: + // can't happen + break; + } + + if (!writer->close()) { + return splashErrGeneric; + } + + return splashOk; +} diff --git a/splash/SplashBitmap.h b/splash/SplashBitmap.h new file mode 100644 index 0000000..5ef5573 --- /dev/null +++ b/splash/SplashBitmap.h @@ -0,0 +1,99 @@ +//======================================================================== +// +// SplashBitmap.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Ilmari Heikkinen +// Copyright (C) 2009 Shen Liang +// Copyright (C) 2009 Albert Astals Cid +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010 Adrian Johnson +// Copyright (C) 2010 Harry Roberts +// Copyright (C) 2010 Christian Feuersänger +// Copyright (C) 2010 William Bader +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHBITMAP_H +#define SPLASHBITMAP_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" +#include + +class ImgWriter; + +//------------------------------------------------------------------------ +// SplashBitmap +//------------------------------------------------------------------------ + +class SplashBitmap { +public: + + // Create a new bitmap. It will have x pixels in + // color mode . Rows will be padded out to a multiple of + // bytes. If is false, the bitmap will be stored + // upside-down, i.e., with the last row first in memory. + SplashBitmap(int widthA, int heightA, int rowPad, + SplashColorMode modeA, GBool alphaA, + GBool topDown = gTrue); + static SplashBitmap *copy(SplashBitmap *src); + + ~SplashBitmap(); + + int getWidth() { return width; } + int getHeight() { return height; } + int getRowSize() { return rowSize; } + int getAlphaRowSize() { return width; } + int getRowPad() { return rowPad; } + SplashColorMode getMode() { return mode; } + SplashColorPtr getDataPtr() { return data; } + Guchar *getAlphaPtr() { return alpha; } + + SplashError writePNMFile(char *fileName); + SplashError writePNMFile(FILE *f); + SplashError writeAlphaPGMFile(char *fileName); + + SplashError writeImgFile(SplashImageFileFormat format, char *fileName, int hDPI, int vDPI, const char *compressionString = ""); + SplashError writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, const char *compressionString = ""); + SplashError writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI); + + void getPixel(int x, int y, SplashColorPtr pixel); + void getRGBLine(int y, SplashColorPtr line); + Guchar getAlpha(int x, int y); + + // Caller takes ownership of the bitmap data. The SplashBitmap + // object is no longer valid -- the next call should be to the + // destructor. + SplashColorPtr takeData(); + +private: + + int width, height; // size of bitmap + int rowPad; + int rowSize; // size of one row of data, in bytes + // - negative for bottom-up bitmaps + SplashColorMode mode; // color mode + SplashColorPtr data; // pointer to row zero of the color data + Guchar *alpha; // pointer to row zero of the alpha data + // (always top-down) + + friend class Splash; +}; + +#endif diff --git a/splash/SplashClip.cc b/splash/SplashClip.cc new file mode 100644 index 0000000..fb18831 --- /dev/null +++ b/splash/SplashClip.cc @@ -0,0 +1,410 @@ +//======================================================================== +// +// SplashClip.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "SplashErrorCodes.h" +#include "SplashPath.h" +#include "SplashXPath.h" +#include "SplashXPathScanner.h" +#include "SplashBitmap.h" +#include "SplashClip.h" + +//------------------------------------------------------------------------ +// SplashClip.flags +//------------------------------------------------------------------------ + +#define splashClipEO 0x01 // use even-odd rule + +//------------------------------------------------------------------------ +// SplashClip +//------------------------------------------------------------------------ + +SplashClip::SplashClip(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + GBool antialiasA) { + antialias = antialiasA; + if (x0 < x1) { + xMin = x0; + xMax = x1; + } else { + xMin = x1; + xMax = x0; + } + if (y0 < y1) { + yMin = y0; + yMax = y1; + } else { + yMin = y1; + yMax = y0; + } + xMinI = splashFloor(xMin); + yMinI = splashFloor(yMin); + xMaxI = splashCeil(xMax) - 1; + yMaxI = splashCeil(yMax) - 1; + paths = NULL; + flags = NULL; + scanners = NULL; + length = size = 0; +} + +SplashClip::SplashClip(SplashClip *clip) { + int yMinAA, yMaxAA; + int i; + + antialias = clip->antialias; + xMin = clip->xMin; + yMin = clip->yMin; + xMax = clip->xMax; + yMax = clip->yMax; + xMinI = clip->xMinI; + yMinI = clip->yMinI; + xMaxI = clip->xMaxI; + yMaxI = clip->yMaxI; + length = clip->length; + size = clip->size; + paths = (SplashXPath **)gmallocn(size, sizeof(SplashXPath *)); + flags = (Guchar *)gmallocn(size, sizeof(Guchar)); + scanners = (SplashXPathScanner **) + gmallocn(size, sizeof(SplashXPathScanner *)); + for (i = 0; i < length; ++i) { + paths[i] = clip->paths[i]->copy(); + flags[i] = clip->flags[i]; + if (antialias) { + yMinAA = yMinI * splashAASize; + yMaxAA = (yMaxI + 1) * splashAASize - 1; + } else { + yMinAA = yMinI; + yMaxAA = yMaxI; + } + scanners[i] = new SplashXPathScanner(paths[i], flags[i] & splashClipEO, + yMinAA, yMaxAA); + } +} + +SplashClip::~SplashClip() { + int i; + + for (i = 0; i < length; ++i) { + delete paths[i]; + delete scanners[i]; + } + gfree(paths); + gfree(flags); + gfree(scanners); +} + +void SplashClip::grow(int nPaths) { + if (length + nPaths > size) { + if (size == 0) { + size = 32; + } + while (size < length + nPaths) { + size *= 2; + } + paths = (SplashXPath **)greallocn(paths, size, sizeof(SplashXPath *)); + flags = (Guchar *)greallocn(flags, size, sizeof(Guchar)); + scanners = (SplashXPathScanner **) + greallocn(scanners, size, sizeof(SplashXPathScanner *)); + } +} + +void SplashClip::resetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + int i; + + for (i = 0; i < length; ++i) { + delete paths[i]; + delete scanners[i]; + } + gfree(paths); + gfree(flags); + gfree(scanners); + paths = NULL; + flags = NULL; + scanners = NULL; + length = size = 0; + + if (x0 < x1) { + xMin = x0; + xMax = x1; + } else { + xMin = x1; + xMax = x0; + } + if (y0 < y1) { + yMin = y0; + yMax = y1; + } else { + yMin = y1; + yMax = y0; + } + xMinI = splashFloor(xMin); + yMinI = splashFloor(yMin); + xMaxI = splashCeil(xMax) - 1; + yMaxI = splashCeil(yMax) - 1; +} + +SplashError SplashClip::clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + if (x0 < x1) { + if (x0 > xMin) { + xMin = x0; + xMinI = splashFloor(xMin); + } + if (x1 < xMax) { + xMax = x1; + xMaxI = splashCeil(xMax) - 1; + } + } else { + if (x1 > xMin) { + xMin = x1; + xMinI = splashFloor(xMin); + } + if (x0 < xMax) { + xMax = x0; + xMaxI = splashCeil(xMax) - 1; + } + } + if (y0 < y1) { + if (y0 > yMin) { + yMin = y0; + yMinI = splashFloor(yMin); + } + if (y1 < yMax) { + yMax = y1; + yMaxI = splashCeil(yMax) - 1; + } + } else { + if (y1 > yMin) { + yMin = y1; + yMinI = splashFloor(yMin); + } + if (y0 < yMax) { + yMax = y0; + yMaxI = splashCeil(yMax) - 1; + } + } + return splashOk; +} + +SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool eo) { + SplashXPath *xPath; + int yMinAA, yMaxAA; + + xPath = new SplashXPath(path, matrix, flatness, gTrue); + + // check for an empty path + if (xPath->length == 0) { + xMax = xMin - 1; + yMax = yMin - 1; + xMaxI = splashCeil(xMax) - 1; + yMaxI = splashCeil(yMax) - 1; + delete xPath; + + // check for a rectangle + } else if (xPath->length == 4 && + ((xPath->segs[0].x0 == xPath->segs[0].x1 && + xPath->segs[0].x0 == xPath->segs[1].x0 && + xPath->segs[0].x0 == xPath->segs[3].x1 && + xPath->segs[2].x0 == xPath->segs[2].x1 && + xPath->segs[2].x0 == xPath->segs[1].x1 && + xPath->segs[2].x0 == xPath->segs[3].x0 && + xPath->segs[1].y0 == xPath->segs[1].y1 && + xPath->segs[1].y0 == xPath->segs[0].y1 && + xPath->segs[1].y0 == xPath->segs[2].y0 && + xPath->segs[3].y0 == xPath->segs[3].y1 && + xPath->segs[3].y0 == xPath->segs[0].y0 && + xPath->segs[3].y0 == xPath->segs[2].y1) || + (xPath->segs[0].y0 == xPath->segs[0].y1 && + xPath->segs[0].y0 == xPath->segs[1].y0 && + xPath->segs[0].y0 == xPath->segs[3].y1 && + xPath->segs[2].y0 == xPath->segs[2].y1 && + xPath->segs[2].y0 == xPath->segs[1].y1 && + xPath->segs[2].y0 == xPath->segs[3].y0 && + xPath->segs[1].x0 == xPath->segs[1].x1 && + xPath->segs[1].x0 == xPath->segs[0].x1 && + xPath->segs[1].x0 == xPath->segs[2].x0 && + xPath->segs[3].x0 == xPath->segs[3].x1 && + xPath->segs[3].x0 == xPath->segs[0].x0 && + xPath->segs[3].x0 == xPath->segs[2].x1))) { + clipToRect(xPath->segs[0].x0, xPath->segs[0].y0, + xPath->segs[2].x0, xPath->segs[2].y0); + delete xPath; + + } else { + grow(1); + if (antialias) { + xPath->aaScale(); + } + xPath->sort(); + paths[length] = xPath; + flags[length] = eo ? splashClipEO : 0; + if (antialias) { + yMinAA = yMinI * splashAASize; + yMaxAA = (yMaxI + 1) * splashAASize - 1; + } else { + yMinAA = yMinI; + yMaxAA = yMaxI; + } + scanners[length] = new SplashXPathScanner(xPath, eo, yMinAA, yMaxAA); + ++length; + } + + return splashOk; +} + +SplashClipResult SplashClip::testRect(int rectXMin, int rectYMin, + int rectXMax, int rectYMax) { + // This tests the rectangle: + // x = [rectXMin, rectXMax + 1) (note: rect coords are ints) + // y = [rectYMin, rectYMax + 1) + // against the clipping region: + // x = [xMin, xMax) (note: clipping coords are fp) + // y = [yMin, yMax) + if ((SplashCoord)(rectXMax + 1) <= xMin || (SplashCoord)rectXMin >= xMax || + (SplashCoord)(rectYMax + 1) <= yMin || (SplashCoord)rectYMin >= yMax) { + return splashClipAllOutside; + } + if ((SplashCoord)rectXMin >= xMin && (SplashCoord)(rectXMax + 1) <= xMax && + (SplashCoord)rectYMin >= yMin && (SplashCoord)(rectYMax + 1) <= yMax && + length == 0) { + return splashClipAllInside; + } + return splashClipPartial; +} + +SplashClipResult SplashClip::testSpan(int spanXMin, int spanXMax, int spanY) { + int i; + + // This tests the rectangle: + // x = [spanXMin, spanXMax + 1) (note: span coords are ints) + // y = [spanY, spanY + 1) + // against the clipping region: + // x = [xMin, xMax) (note: clipping coords are fp) + // y = [yMin, yMax) + if ((SplashCoord)(spanXMax + 1) <= xMin || (SplashCoord)spanXMin >= xMax || + (SplashCoord)(spanY + 1) <= yMin || (SplashCoord)spanY >= yMax) { + return splashClipAllOutside; + } + if (!((SplashCoord)spanXMin >= xMin && (SplashCoord)(spanXMax + 1) <= xMax && + (SplashCoord)spanY >= yMin && (SplashCoord)(spanY + 1) <= yMax)) { + return splashClipPartial; + } + if (antialias) { + for (i = 0; i < length; ++i) { + if (!scanners[i]->testSpan(spanXMin * splashAASize, + spanXMax * splashAASize + (splashAASize - 1), + spanY * splashAASize)) { + return splashClipPartial; + } + } + } else { + for (i = 0; i < length; ++i) { + if (!scanners[i]->testSpan(spanXMin, spanXMax, spanY)) { + return splashClipPartial; + } + } + } + return splashClipAllInside; +} + +void SplashClip::clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y) { + int xx0, xx1, xx, yy, i; + SplashColorPtr p; + + // zero out pixels with x < xMin + xx0 = *x0 * splashAASize; + xx1 = splashFloor(xMin * splashAASize); + if (xx1 > aaBuf->getWidth()) { + xx1 = aaBuf->getWidth(); + } + if (xx0 < xx1) { + xx0 &= ~7; + for (yy = 0; yy < splashAASize; ++yy) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3); + for (xx = xx0; xx + 7 < xx1; xx += 8) { + *p++ = 0; + } + if (xx < xx1) { + *p &= 0xff >> (xx1 & 7); + } + } + *x0 = splashFloor(xMin); + } + + // zero out pixels with x > xMax + xx0 = splashFloor(xMax * splashAASize) + 1; + if (xx0 < 0) { + xx0 = 0; + } + xx1 = (*x1 + 1) * splashAASize; + if (xx0 < xx1) { + for (yy = 0; yy < splashAASize; ++yy) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3); + xx = xx0; + if (xx & 7) { + *p &= 0xff00 >> (xx & 7); + xx = (xx & ~7) + 8; + ++p; + } + for (; xx < xx1; xx += 8) { + *p++ = 0; + } + } + *x1 = splashFloor(xMax); + } + + // check the paths + for (i = 0; i < length; ++i) { + scanners[i]->clipAALine(aaBuf, x0, x1, y); + } + if (*x0 > *x1) { + *x0 = *x1; + } + if (*x0 < 0) { + *x0 = 0; + } + if ((*x0>>1) >= aaBuf->getRowSize()) { + xx0 = *x0; + *x0 = (aaBuf->getRowSize() - 1) << 1; + if (xx0 & 1) { + *x0 = *x0 + 1; + } + } + if (*x1 < *x0) { + *x1 = *x0; + } + if ((*x1>>1) >= aaBuf->getRowSize()) { + xx0 = *x1; + *x1 = (aaBuf->getRowSize() - 1) << 1; + if (xx0 & 1) { + *x1 = *x1 + 1; + } + } +} diff --git a/splash/SplashClip.h b/splash/SplashClip.h new file mode 100644 index 0000000..3eb2d78 --- /dev/null +++ b/splash/SplashClip.h @@ -0,0 +1,150 @@ +//======================================================================== +// +// SplashClip.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHCLIP_H +#define SPLASHCLIP_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" +#include "SplashMath.h" +#include "SplashXPathScanner.h" + +class SplashPath; +class SplashXPath; +class SplashBitmap; + +//------------------------------------------------------------------------ + +enum SplashClipResult { + splashClipAllInside, + splashClipAllOutside, + splashClipPartial +}; + +//------------------------------------------------------------------------ +// SplashClip +//------------------------------------------------------------------------ + +class SplashClip { +public: + + // Create a clip, for the given rectangle. + SplashClip(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + GBool antialiasA); + + // Copy a clip. + SplashClip *copy() { return new SplashClip(this); } + + ~SplashClip(); + + // Reset the clip to a rectangle. + void resetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + + // Intersect the clip with a rectangle. + SplashError clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + + // Interesect the clip with . + SplashError clipToPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool eo); + + // Returns true if (,) is inside the clip. + GBool test(int x, int y) + { + int i; + + // check the rectangle + if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) { + return gFalse; + } + + // check the paths + if (antialias) { + for (i = 0; i < length; ++i) { + if (!scanners[i]->test(x * splashAASize, y * splashAASize)) { + return gFalse; + } + } + } else { + for (i = 0; i < length; ++i) { + if (!scanners[i]->test(x, y)) { + return gFalse; + } + } + } + + return gTrue; + } + + // Tests a rectangle against the clipping region. Returns one of: + // - splashClipAllInside if the entire rectangle is inside the + // clipping region, i.e., all pixels in the rectangle are + // visible + // - splashClipAllOutside if the entire rectangle is outside the + // clipping region, i.e., all the pixels in the rectangle are + // clipped + // - splashClipPartial if the rectangle is part inside and part + // outside the clipping region + SplashClipResult testRect(int rectXMin, int rectYMin, + int rectXMax, int rectYMax); + + // Similar to testRect, but tests a horizontal span. + SplashClipResult testSpan(int spanXMin, int spanXMax, int spanY); + + // Clips an anti-aliased line by setting pixels to zero. On entry, + // all non-zero pixels are between and . This function + // will update and . + void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); + + // Get the rectangle part of the clip region. + SplashCoord getXMin() { return xMin; } + SplashCoord getXMax() { return xMax; } + SplashCoord getYMin() { return yMin; } + SplashCoord getYMax() { return yMax; } + + // Get the rectangle part of the clip region, in integer coordinates. + int getXMinI() { return xMinI; } + int getXMaxI() { return xMaxI; } + int getYMinI() { return yMinI; } + int getYMaxI() { return yMaxI; } + + // Get the number of arbitrary paths used by the clip region. + int getNumPaths() { return length; } + +protected: + + SplashClip(SplashClip *clip); + void grow(int nPaths); + + GBool antialias; + SplashCoord xMin, yMin, xMax, yMax; + int xMinI, yMinI, xMaxI, yMaxI; + SplashXPath **paths; + Guchar *flags; + SplashXPathScanner **scanners; + int length, size; +}; + +#endif diff --git a/splash/SplashErrorCodes.h b/splash/SplashErrorCodes.h new file mode 100644 index 0000000..d1f81f8 --- /dev/null +++ b/splash/SplashErrorCodes.h @@ -0,0 +1,50 @@ +//======================================================================== +// +// SplashErrorCodes.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2009 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHERRORCODES_H +#define SPLASHERRORCODES_H + +//------------------------------------------------------------------------ + +#define splashOk 0 // no error + +#define splashErrNoCurPt 1 // no current point + +#define splashErrEmptyPath 2 // zero points in path + +#define splashErrBogusPath 3 // only one point in subpath + +#define splashErrNoSave 4 // state stack is empty + +#define splashErrOpenFile 5 // couldn't open file + +#define splashErrNoGlyph 6 // couldn't get the requested glyph + +#define splashErrModeMismatch 7 // invalid combination of color modes + +#define splashErrSingularMatrix 8 // matrix is singular + +#define splashErrBadArg 9 // bad argument + +#define splashErrZeroImage 254 // image of 0x0 + +#define splashErrGeneric 255 + +#endif diff --git a/splash/SplashFTFont.cc b/splash/SplashFTFont.cc new file mode 100644 index 0000000..f18b58b --- /dev/null +++ b/splash/SplashFTFont.cc @@ -0,0 +1,517 @@ +//======================================================================== +// +// SplashFTFont.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2007-2011 Albert Astals Cid +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2010 Suzuki Toshiya +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include FT_OUTLINE_H +#include FT_SIZES_H +#include FT_GLYPH_H +#include "goo/gmem.h" +#include "SplashMath.h" +#include "SplashGlyphBitmap.h" +#include "SplashPath.h" +#include "SplashFTFontEngine.h" +#include "SplashFTFontFile.h" +#include "SplashFTFont.h" + +//------------------------------------------------------------------------ + +static int glyphPathMoveTo(const FT_Vector *pt, void *path); +static int glyphPathLineTo(const FT_Vector *pt, void *path); +static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt, + void *path); +static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2, + const FT_Vector *pt, void *path); + +//------------------------------------------------------------------------ +// SplashFTFont +//------------------------------------------------------------------------ + +SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA): + SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa), + enableFreeTypeHinting(fontFileA->engine->enableFreeTypeHinting), + enableSlightHinting(fontFileA->engine->enableSlightHinting) +{ + FT_Face face; + int div; + int x, y; +#if USE_FIXEDPOINT + SplashCoord scale; +#endif + + face = fontFileA->face; + if (FT_New_Size(face, &sizeObj)) { + return; + } + face->size = sizeObj; + size = splashRound(splashDist(0, 0, mat[2], mat[3])); + if (size < 1) { + size = 1; + } + if (FT_Set_Pixel_Sizes(face, 0, size)) { + return; + } + // if the textMat values are too small, FreeType's fixed point + // arithmetic doesn't work so well + textScale = splashDist(0, 0, textMat[2], textMat[3]) / size; + + div = face->bbox.xMax > 20000 ? 65536 : 1; + +#if USE_FIXEDPOINT + scale = (SplashCoord)1 / (SplashCoord)face->units_per_EM; + + // transform the four corners of the font bounding box -- the min + // and max values form the bounding box of the transformed font + x = (int)(mat[0] * (scale * (face->bbox.xMin / div)) + + mat[2] * (scale * (face->bbox.yMin / div))); + xMin = xMax = x; + y = (int)(mat[1] * (scale * (face->bbox.xMin / div)) + + mat[3] * (scale * (face->bbox.yMin / div))); + yMin = yMax = y; + x = (int)(mat[0] * (scale * (face->bbox.xMin / div)) + + mat[2] * (scale * (face->bbox.yMax / div))); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * (scale * (face->bbox.xMin / div)) + + mat[3] * (scale * (face->bbox.yMax / div))); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)(mat[0] * (scale * (face->bbox.xMax / div)) + + mat[2] * (scale * (face->bbox.yMin / div))); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * (scale * (face->bbox.xMax / div)) + + mat[3] * (scale * (face->bbox.yMin / div))); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)(mat[0] * (scale * (face->bbox.xMax / div)) + + mat[2] * (scale * (face->bbox.yMax / div))); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * (scale * (face->bbox.xMax / div)) + + mat[3] * (scale * (face->bbox.yMax / div))); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } +#else // USE_FIXEDPOINT + // transform the four corners of the font bounding box -- the min + // and max values form the bounding box of the transformed font + x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMin) / + (div * face->units_per_EM)); + xMin = xMax = x; + y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMin) / + (div * face->units_per_EM)); + yMin = yMax = y; + x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMin) / + (div * face->units_per_EM)); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMin) / + (div * face->units_per_EM)); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } +#endif // USE_FIXEDPOINT + // This is a kludge: some buggy PDF generators embed fonts with + // zero bounding boxes. + if (xMax == xMin) { + xMin = 0; + xMax = size; + } + if (yMax == yMin) { + yMin = 0; + yMax = (int)((SplashCoord)1.2 * size); + } + + // compute the transform matrix +#if USE_FIXEDPOINT + matrix.xx = (FT_Fixed)((mat[0] / size).get16Dot16()); + matrix.yx = (FT_Fixed)((mat[1] / size).get16Dot16()); + matrix.xy = (FT_Fixed)((mat[2] / size).get16Dot16()); + matrix.yy = (FT_Fixed)((mat[3] / size).get16Dot16()); + textMatrix.xx = (FT_Fixed)((textMat[0] / (textScale * size)).get16Dot16()); + textMatrix.yx = (FT_Fixed)((textMat[1] / (textScale * size)).get16Dot16()); + textMatrix.xy = (FT_Fixed)((textMat[2] / (textScale * size)).get16Dot16()); + textMatrix.yy = (FT_Fixed)((textMat[3] / (textScale * size)).get16Dot16()); +#else + matrix.xx = (FT_Fixed)((mat[0] / size) * 65536); + matrix.yx = (FT_Fixed)((mat[1] / size) * 65536); + matrix.xy = (FT_Fixed)((mat[2] / size) * 65536); + matrix.yy = (FT_Fixed)((mat[3] / size) * 65536); + textMatrix.xx = (FT_Fixed)((textMat[0] / (textScale * size)) * 65536); + textMatrix.yx = (FT_Fixed)((textMat[1] / (textScale * size)) * 65536); + textMatrix.xy = (FT_Fixed)((textMat[2] / (textScale * size)) * 65536); + textMatrix.yy = (FT_Fixed)((textMat[3] / (textScale * size)) * 65536); +#endif +} + +SplashFTFont::~SplashFTFont() { +} + +GBool SplashFTFont::getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) { + return SplashFont::getGlyph(c, xFrac, 0, bitmap, x0, y0, clip, clipRes); +} + +static FT_Int32 getFTLoadFlags(GBool type1, GBool trueType, GBool aa, GBool enableFreeTypeHinting, GBool enableSlightHinting) +{ + int ret = FT_LOAD_DEFAULT; + if (aa) + ret |= FT_LOAD_NO_BITMAP; + + if (enableFreeTypeHinting) { + if (enableSlightHinting) { + ret |= FT_LOAD_TARGET_LIGHT; + } else { + if (trueType) { + // FT2's autohinting doesn't always work very well (especially with + // font subsets), so turn it off if anti-aliasing is enabled; if + // anti-aliasing is disabled, this seems to be a tossup - some fonts + // look better with hinting, some without, so leave hinting on + if (aa) { + ret |= FT_LOAD_NO_AUTOHINT; + } + } else if (type1) { + // Type 1 fonts seem to look better with 'light' hinting mode + ret |= FT_LOAD_TARGET_LIGHT; + } + } + } else { + ret |= FT_LOAD_NO_HINTING; + } + return ret; +} + +GBool SplashFTFont::makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) { + SplashFTFontFile *ff; + FT_Vector offset; + FT_GlyphSlot slot; + FT_UInt gid; + int rowSize; + Guchar *p, *q; + int i; + + ff = (SplashFTFontFile *)fontFile; + + ff->face->size = sizeObj; + offset.x = (FT_Pos)(int)((SplashCoord)xFrac * splashFontFractionMul * 64); + offset.y = 0; + FT_Set_Transform(ff->face, &matrix, &offset); + slot = ff->face->glyph; + + if (ff->codeToGID && c < ff->codeToGIDLen) { + gid = (FT_UInt)ff->codeToGID[c]; + } else { + gid = (FT_UInt)c; + } + + if (FT_Load_Glyph(ff->face, gid, getFTLoadFlags(ff->type1, ff->trueType, aa, enableFreeTypeHinting, enableSlightHinting))) { + return gFalse; + } + + // prelimirary values based on FT_Outline_Get_CBox + // we add two pixels to each side to be in the safe side + FT_BBox cbox; + FT_Outline_Get_CBox(&ff->face->glyph->outline, &cbox); + bitmap->x = -(cbox.xMin / 64) + 2; + bitmap->y = (cbox.yMax / 64) + 2; + bitmap->w = ((cbox.xMax - cbox.xMin) / 64) + 4; + bitmap->h = ((cbox.yMax - cbox.yMin) / 64) + 4; + + *clipRes = clip->testRect(x0 - bitmap->x, + y0 - bitmap->y, + x0 - bitmap->x + bitmap->w, + y0 - bitmap->y + bitmap->h); + if (*clipRes == splashClipAllOutside) { + bitmap->freeData = gFalse; + return gTrue; + } + + if (FT_Render_Glyph(slot, aa ? ft_render_mode_normal + : ft_render_mode_mono)) { + return gFalse; + } + + if (slot->bitmap.width == 0 || slot->bitmap.rows == 0) { + // this can happen if (a) the glyph is really tiny or (b) the + // metrics in the TrueType file are broken + return gFalse; + } + + bitmap->x = -slot->bitmap_left; + bitmap->y = slot->bitmap_top; + bitmap->w = slot->bitmap.width; + bitmap->h = slot->bitmap.rows; + bitmap->aa = aa; + if (aa) { + rowSize = bitmap->w; + } else { + rowSize = (bitmap->w + 7) >> 3; + } + bitmap->data = (Guchar *)gmallocn_checkoverflow(rowSize, bitmap->h); + if (!bitmap->data) { + return gFalse; + } + bitmap->freeData = gTrue; + for (i = 0, p = bitmap->data, q = slot->bitmap.buffer; + i < bitmap->h; + ++i, p += rowSize, q += slot->bitmap.pitch) { + memcpy(p, q, rowSize); + } + + return gTrue; +} + +double SplashFTFont::getGlyphAdvance(int c) +{ + SplashFTFontFile *ff; + FT_Vector offset; + FT_UInt gid; + FT_Matrix identityMatrix; + + ff = (SplashFTFontFile *)fontFile; + + // init the matrix + identityMatrix.xx = 65536; // 1 in 16.16 format + identityMatrix.xy = 0; + identityMatrix.yx = 0; + identityMatrix.yy = 65536; // 1 in 16.16 format + + // init the offset + offset.x = 0; + offset.y = 0; + + ff->face->size = sizeObj; + FT_Set_Transform(ff->face, &identityMatrix, &offset); + + if (ff->codeToGID && c < ff->codeToGIDLen) { + gid = (FT_UInt)ff->codeToGID[c]; + } else { + gid = (FT_UInt)c; + } + if (ff->trueType && gid < 0) { + // skip the TrueType notdef glyph + return -1; + } + + if (FT_Load_Glyph(ff->face, gid, getFTLoadFlags(ff->type1, ff->trueType, aa, enableFreeTypeHinting, enableSlightHinting))) { + return -1; + } + + // 64.0 is 1 in 26.6 format + return ff->face->glyph->metrics.horiAdvance / 64.0 / size; +} + +struct SplashFTFontPath { + SplashPath *path; + SplashCoord textScale; + GBool needClose; +}; + +SplashPath *SplashFTFont::getGlyphPath(int c) { + static FT_Outline_Funcs outlineFuncs = { +#if FREETYPE_MINOR <= 1 + (int (*)(FT_Vector *, void *))&glyphPathMoveTo, + (int (*)(FT_Vector *, void *))&glyphPathLineTo, + (int (*)(FT_Vector *, FT_Vector *, void *))&glyphPathConicTo, + (int (*)(FT_Vector *, FT_Vector *, FT_Vector *, void *))&glyphPathCubicTo, +#else + &glyphPathMoveTo, + &glyphPathLineTo, + &glyphPathConicTo, + &glyphPathCubicTo, +#endif + 0, 0 + }; + SplashFTFontFile *ff; + SplashFTFontPath path; + FT_GlyphSlot slot; + FT_UInt gid; + FT_Glyph glyph; + + ff = (SplashFTFontFile *)fontFile; + ff->face->size = sizeObj; + FT_Set_Transform(ff->face, &textMatrix, NULL); + slot = ff->face->glyph; + if (ff->codeToGID && c < ff->codeToGIDLen) { + gid = ff->codeToGID[c]; + } else { + gid = (FT_UInt)c; + } + if (ff->trueType && gid < 0) { + // skip the TrueType notdef glyph + return NULL; + } + if (FT_Load_Glyph(ff->face, gid, getFTLoadFlags(ff->type1, ff->trueType, aa, enableFreeTypeHinting, enableSlightHinting))) { + return NULL; + } + if (FT_Get_Glyph(slot, &glyph)) { + return NULL; + } + path.path = new SplashPath(); + path.textScale = textScale; + path.needClose = gFalse; + FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline, + &outlineFuncs, &path); + if (path.needClose) { + path.path->close(); + } + FT_Done_Glyph(glyph); + return path.path; +} + +static int glyphPathMoveTo(const FT_Vector *pt, void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + + if (p->needClose) { + p->path->close(); + p->needClose = gFalse; + } + p->path->moveTo((SplashCoord)pt->x * p->textScale / 64.0, + (SplashCoord)pt->y * p->textScale / 64.0); + return 0; +} + +static int glyphPathLineTo(const FT_Vector *pt, void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + + p->path->lineTo((SplashCoord)pt->x * p->textScale / 64.0, + (SplashCoord)pt->y * p->textScale / 64.0); + p->needClose = gTrue; + return 0; +} + +static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt, + void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xc, yc; + + if (!p->path->getCurPt(&x0, &y0)) { + return 0; + } + xc = (SplashCoord)ctrl->x * p->textScale / 64.0; + yc = (SplashCoord)ctrl->y * p->textScale / 64.0; + x3 = (SplashCoord)pt->x * p->textScale / 64.0; + y3 = (SplashCoord)pt->y * p->textScale / 64.0; + + // A second-order Bezier curve is defined by two endpoints, p0 and + // p3, and one control point, pc: + // + // p(t) = (1-t)^2*p0 + t*(1-t)*pc + t^2*p3 + // + // A third-order Bezier curve is defined by the same two endpoints, + // p0 and p3, and two control points, p1 and p2: + // + // p(t) = (1-t)^3*p0 + 3t*(1-t)^2*p1 + 3t^2*(1-t)*p2 + t^3*p3 + // + // Applying some algebra, we can convert a second-order curve to a + // third-order curve: + // + // p1 = (1/3) * (p0 + 2pc) + // p2 = (1/3) * (2pc + p3) + + x1 = (SplashCoord)(1.0 / 3.0) * (x0 + (SplashCoord)2 * xc); + y1 = (SplashCoord)(1.0 / 3.0) * (y0 + (SplashCoord)2 * yc); + x2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * xc + x3); + y2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * yc + y3); + + p->path->curveTo(x1, y1, x2, y2, x3, y3); + p->needClose = gTrue; + return 0; +} + +static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2, + const FT_Vector *pt, void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + + p->path->curveTo((SplashCoord)ctrl1->x * p->textScale / 64.0, + (SplashCoord)ctrl1->y * p->textScale / 64.0, + (SplashCoord)ctrl2->x * p->textScale / 64.0, + (SplashCoord)ctrl2->y * p->textScale / 64.0, + (SplashCoord)pt->x * p->textScale / 64.0, + (SplashCoord)pt->y * p->textScale / 64.0); + p->needClose = gTrue; + return 0; +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/splash/SplashFTFont.h b/splash/SplashFTFont.h new file mode 100644 index 0000000..98cb29d --- /dev/null +++ b/splash/SplashFTFont.h @@ -0,0 +1,80 @@ +//======================================================================== +// +// SplashFTFont.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007-2009, 2011 Albert Astals Cid +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHFTFONT_H +#define SPLASHFTFONT_H + +#include "poppler-config.h" + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include FT_FREETYPE_H +#include "SplashFont.h" + +class SplashFTFontFile; + +//------------------------------------------------------------------------ +// SplashFTFont +//------------------------------------------------------------------------ + +class SplashFTFont: public SplashFont { +public: + + SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA); + + virtual ~SplashFTFont(); + + // Munge xFrac and yFrac before calling SplashFont::getGlyph. + virtual GBool getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes); + + // Rasterize a glyph. The and values are the same + // as described for getGlyph. + virtual GBool makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes); + + // Return the path for a glyph. + virtual SplashPath *getGlyphPath(int c); + + // Return the advance of a glyph. (in 0..1 range) + virtual double getGlyphAdvance(int c); + +private: + + FT_Size sizeObj; + FT_Matrix matrix; + FT_Matrix textMatrix; + SplashCoord textScale; + int size; + GBool enableFreeTypeHinting; + GBool enableSlightHinting; +}; + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#endif diff --git a/splash/SplashFTFontEngine.cc b/splash/SplashFTFontEngine.cc new file mode 100644 index 0000000..7a4568d --- /dev/null +++ b/splash/SplashFTFontEngine.cc @@ -0,0 +1,220 @@ +//======================================================================== +// +// SplashFTFontEngine.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2009, 2011 Albert Astals Cid +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "goo/gfile.h" +#include "fofi/FoFiTrueType.h" +#include "fofi/FoFiType1C.h" +#include "SplashFTFontFile.h" +#include "SplashFTFontEngine.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ + +#if 0 +static void fileWrite(void *stream, const char *data, int len) { + fwrite(data, 1, len, (FILE *)stream); +} +#endif + +//------------------------------------------------------------------------ +// SplashFTFontEngine +//------------------------------------------------------------------------ + +SplashFTFontEngine::SplashFTFontEngine(GBool aaA, GBool enableFreeTypeHintingA, + GBool enableSlightHintingA, FT_Library libA) { + FT_Int major, minor, patch; + + aa = aaA; + enableFreeTypeHinting = enableFreeTypeHintingA; + enableSlightHinting = enableSlightHintingA; + lib = libA; + + // as of FT 2.1.8, CID fonts are indexed by CID instead of GID + FT_Library_Version(lib, &major, &minor, &patch); + useCIDs = major > 2 || + (major == 2 && (minor > 1 || (minor == 1 && patch > 7))); +} + +SplashFTFontEngine *SplashFTFontEngine::init(GBool aaA, GBool enableFreeTypeHintingA, + GBool enableSlightHintingA) { + FT_Library libA; + + if (FT_Init_FreeType(&libA)) { + return NULL; + } + return new SplashFTFontEngine(aaA, enableFreeTypeHintingA, enableSlightHintingA, libA); +} + +SplashFTFontEngine::~SplashFTFontEngine() { + FT_Done_FreeType(lib); +} + +SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + return SplashFTFontFile::loadType1Font(this, idA, src, enc); +} + +SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + return SplashFTFontFile::loadType1Font(this, idA, src, enc); +} + +SplashFontFile *SplashFTFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + return SplashFTFontFile::loadType1Font(this, idA, src, enc); +} + +SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA, + SplashFontSrc *src) { + FoFiType1C *ff; + int *cidToGIDMap; + int nCIDs; + SplashFontFile *ret; + + // check for a CFF font + if (useCIDs) { + cidToGIDMap = NULL; + nCIDs = 0; + } else { + if (src->isFile) { + ff = FoFiType1C::load(src->fileName->getCString()); + } else { + ff = FoFiType1C::make(src->buf, src->bufLen); + } + if (ff) { + cidToGIDMap = ff->getCIDToGIDMap(&nCIDs); + delete ff; + } else { + cidToGIDMap = NULL; + nCIDs = 0; + } + } + ret = SplashFTFontFile::loadCIDFont(this, idA, src, cidToGIDMap, nCIDs); + if (!ret) { + gfree(cidToGIDMap); + } + return ret; +} + +SplashFontFile *SplashFTFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGID, + int codeToGIDLen) { + FoFiTrueType *ff; + int *cidToGIDMap; + int nCIDs; + SplashFontFile *ret; + + cidToGIDMap = NULL; + nCIDs = 0; + if (!codeToGID) { + if (!useCIDs) { + if (src->isFile) { + ff = FoFiTrueType::load(src->fileName->getCString()); + } else { + ff = FoFiTrueType::make(src->buf, src->bufLen); + } + if (ff) { + if (ff->isOpenTypeCFF()) { + cidToGIDMap = ff->getCIDToGIDMap(&nCIDs); + } + delete ff; + } + } + } + ret = SplashFTFontFile::loadCIDFont(this, idA, src, + codeToGID ? codeToGID : cidToGIDMap, + codeToGID ? codeToGIDLen : nCIDs); + if (!ret) { + gfree(cidToGIDMap); + } + return ret; +} + +SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGID, + int codeToGIDLen, + int faceIndex) { +#if 0 + FoFiTrueType *ff; + GooString *tmpFileName; + FILE *tmpFile; + SplashFontFile *ret; + + if (!(ff = FoFiTrueType::load(fileName))) { + return NULL; + } + tmpFileName = NULL; + if (!openTempFile(&tmpFileName, &tmpFile, "wb")) { + delete ff; + return NULL; + } + ff->writeTTF(&fileWrite, tmpFile); + delete ff; + fclose(tmpFile); + ret = SplashFTFontFile::loadTrueTypeFont(this, idA, + tmpFileName->getCString(), + gTrue, codeToGID, codeToGIDLen, + faceIndex); + if (ret) { + if (deleteFile) { + unlink(fileName); + } + } else { + unlink(tmpFileName->getCString()); + } + delete tmpFileName; + return ret; +#else + SplashFontFile *ret; + ret = SplashFTFontFile::loadTrueTypeFont(this, idA, src, + codeToGID, codeToGIDLen, + faceIndex); + return ret; +#endif +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/splash/SplashFTFontEngine.h b/splash/SplashFTFontEngine.h new file mode 100644 index 0000000..aa1ad5f --- /dev/null +++ b/splash/SplashFTFontEngine.h @@ -0,0 +1,78 @@ +//======================================================================== +// +// SplashFTFontEngine.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2009 Albert Astals Cid +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHFTFONTENGINE_H +#define SPLASHFTFONTENGINE_H + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include FT_FREETYPE_H +#include "goo/gtypes.h" + +class SplashFontFile; +class SplashFontFileID; +class SplashFontSrc; + +//------------------------------------------------------------------------ +// SplashFTFontEngine +//------------------------------------------------------------------------ + +class SplashFTFontEngine { +public: + + static SplashFTFontEngine *init(GBool aaA, GBool enableFreeTypeHintingA, GBool enableSlightHinting); + + ~SplashFTFontEngine(); + + // Load fonts. + SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadCIDFont(SplashFontFileID *idA, SplashFontSrc *src); + SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, SplashFontSrc *src, + int *codeToGID, int codeToGIDLen); + SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, SplashFontSrc *src, + int *codeToGID, int codeToGIDLen, int faceIndex = 0); + +private: + + SplashFTFontEngine(GBool aaA, GBool enableFreeTypeHintingA, GBool enableSlightHintingA, FT_Library libA); + + GBool aa; + GBool enableFreeTypeHinting; + GBool enableSlightHinting; + FT_Library lib; + GBool useCIDs; + + friend class SplashFTFontFile; + friend class SplashFTFont; +}; + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#endif diff --git a/splash/SplashFTFontFile.cc b/splash/SplashFTFontFile.cc new file mode 100644 index 0000000..34f6ce5 --- /dev/null +++ b/splash/SplashFTFontFile.cc @@ -0,0 +1,140 @@ +//======================================================================== +// +// SplashFTFontFile.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "SplashFTFontEngine.h" +#include "SplashFTFont.h" +#include "SplashFTFontFile.h" + +//------------------------------------------------------------------------ +// SplashFTFontFile +//------------------------------------------------------------------------ + +SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + const char **encA) { + FT_Face faceA; + int *codeToGIDA; + const char *name; + int i; + + if (src->isFile) { + if (FT_New_Face(engineA->lib, src->fileName->getCString(), 0, &faceA)) + return NULL; + } else { + if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, 0, &faceA)) + return NULL; + } + codeToGIDA = (int *)gmallocn(256, sizeof(int)); + for (i = 0; i < 256; ++i) { + codeToGIDA[i] = 0; + if ((name = encA[i])) { + codeToGIDA[i] = (int)FT_Get_Name_Index(faceA, (char *)name); + } + } + + return new SplashFTFontFile(engineA, idA, src, + faceA, codeToGIDA, 256, gFalse, gTrue); +} + +SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGIDA, + int codeToGIDLenA) { + FT_Face faceA; + + if (src->isFile) { + if (FT_New_Face(engineA->lib, src->fileName->getCString(), 0, &faceA)) + return NULL; + } else { + if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, 0, &faceA)) + return NULL; + } + + return new SplashFTFontFile(engineA, idA, src, + faceA, codeToGIDA, codeToGIDLenA, gFalse, gFalse); +} + +SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGIDA, + int codeToGIDLenA, + int faceIndexA) { + FT_Face faceA; + + if (src->isFile) { + if (FT_New_Face(engineA->lib, src->fileName->getCString(), faceIndexA, &faceA)) + return NULL; + } else { + if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, faceIndexA, &faceA)) + return NULL; + } + + return new SplashFTFontFile(engineA, idA, src, + faceA, codeToGIDA, codeToGIDLenA, gTrue, gFalse); +} + +SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + FT_Face faceA, + int *codeToGIDA, int codeToGIDLenA, + GBool trueTypeA, GBool type1A): + SplashFontFile(idA, src) +{ + engine = engineA; + face = faceA; + codeToGID = codeToGIDA; + codeToGIDLen = codeToGIDLenA; + trueType = trueTypeA; + type1 = type1A; +} + +SplashFTFontFile::~SplashFTFontFile() { + if (face) { + FT_Done_Face(face); + } + if (codeToGID) { + gfree(codeToGID); + } +} + +SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat, + SplashCoord *textMat) { + SplashFont *font; + + font = new SplashFTFont(this, mat, textMat); + font->initCache(); + return font; +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/splash/SplashFTFontFile.h b/splash/SplashFTFontFile.h new file mode 100644 index 0000000..d642af0 --- /dev/null +++ b/splash/SplashFTFontFile.h @@ -0,0 +1,86 @@ +//======================================================================== +// +// SplashFTFontFile.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHFTFONTFILE_H +#define SPLASHFTFONTFILE_H + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include FT_FREETYPE_H +#include "SplashFontFile.h" + +class SplashFontFileID; +class SplashFTFontEngine; + +//------------------------------------------------------------------------ +// SplashFTFontFile +//------------------------------------------------------------------------ + +class SplashFTFontFile: public SplashFontFile { +public: + + static SplashFontFile *loadType1Font(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, const char **encA); + static SplashFontFile *loadCIDFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToCIDA, int codeToGIDLenA); + static SplashFontFile *loadTrueTypeFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGIDA, + int codeToGIDLenA, + int faceIndexA=0); + + virtual ~SplashFTFontFile(); + + // Create a new SplashFTFont, i.e., a scaled instance of this font + // file. + virtual SplashFont *makeFont(SplashCoord *mat, + SplashCoord *textMat); + +private: + + SplashFTFontFile(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + FT_Face faceA, + int *codeToGIDA, int codeToGIDLenA, + GBool trueTypeA, GBool type1A); + + SplashFTFontEngine *engine; + FT_Face face; + int *codeToGID; + int codeToGIDLen; + GBool trueType; + GBool type1; + + friend class SplashFTFont; +}; + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#endif diff --git a/splash/SplashFont.cc b/splash/SplashFont.cc new file mode 100644 index 0000000..2bfcdc8 --- /dev/null +++ b/splash/SplashFont.cc @@ -0,0 +1,219 @@ +//======================================================================== +// +// SplashFont.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007-2008, 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "goo/gmem.h" +#include "SplashMath.h" +#include "SplashGlyphBitmap.h" +#include "SplashFontFile.h" +#include "SplashFont.h" + +//------------------------------------------------------------------------ + +struct SplashFontCacheTag { + int c; + short xFrac, yFrac; // x and y fractions + int mru; // valid bit (0x80000000) and MRU index + int x, y, w, h; // offset and size of glyph +}; + +//------------------------------------------------------------------------ +// SplashFont +//------------------------------------------------------------------------ + +SplashFont::SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA, GBool aaA) { + fontFile = fontFileA; + fontFile->incRefCnt(); + mat[0] = matA[0]; + mat[1] = matA[1]; + mat[2] = matA[2]; + mat[3] = matA[3]; + textMat[0] = textMatA[0]; + textMat[1] = textMatA[1]; + textMat[2] = textMatA[2]; + textMat[3] = textMatA[3]; + aa = aaA; + + cache = NULL; + cacheTags = NULL; + + xMin = yMin = xMax = yMax = 0; +} + +void SplashFont::initCache() { + int i; + + // this should be (max - min + 1), but we add some padding to + // deal with rounding errors + glyphW = xMax - xMin + 3; + glyphH = yMax - yMin + 3; + if (aa) { + glyphSize = glyphW * glyphH; + } else { + glyphSize = ((glyphW + 7) >> 3) * glyphH; + } + + // set up the glyph pixmap cache + cacheAssoc = 8; + if (glyphSize <= 64) { + cacheSets = 32; + } else if (glyphSize <= 128) { + cacheSets = 16; + } else if (glyphSize <= 256) { + cacheSets = 8; + } else if (glyphSize <= 512) { + cacheSets = 4; + } else if (glyphSize <= 1024) { + cacheSets = 2; + } else { + cacheSets = 1; + } + cache = (Guchar *)gmallocn_checkoverflow(cacheSets* cacheAssoc, glyphSize); + if (cache != NULL) { + cacheTags = (SplashFontCacheTag *)gmallocn(cacheSets * cacheAssoc, + sizeof(SplashFontCacheTag)); + for (i = 0; i < cacheSets * cacheAssoc; ++i) { + cacheTags[i].mru = i & (cacheAssoc - 1); + } + } else { + cacheAssoc = 0; + } +} + +SplashFont::~SplashFont() { + fontFile->decRefCnt(); + if (cache) { + gfree(cache); + } + if (cacheTags) { + gfree(cacheTags); + } +} + +GBool SplashFont::getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) { + SplashGlyphBitmap bitmap2; + int size; + Guchar *p; + int i, j, k; + + // no fractional coordinates for large glyphs or non-anti-aliased + // glyphs + if (!aa || glyphH > 50) { + xFrac = yFrac = 0; + } + + // check the cache + i = (c & (cacheSets - 1)) * cacheAssoc; + for (j = 0; j < cacheAssoc; ++j) { + if ((cacheTags[i+j].mru & 0x80000000) && + cacheTags[i+j].c == c && + (int)cacheTags[i+j].xFrac == xFrac && + (int)cacheTags[i+j].yFrac == yFrac) { + bitmap->x = cacheTags[i+j].x; + bitmap->y = cacheTags[i+j].y; + bitmap->w = cacheTags[i+j].w; + bitmap->h = cacheTags[i+j].h; + for (k = 0; k < cacheAssoc; ++k) { + if (k != j && + (cacheTags[i+k].mru & 0x7fffffff) < + (cacheTags[i+j].mru & 0x7fffffff)) { + ++cacheTags[i+k].mru; + } + } + cacheTags[i+j].mru = 0x80000000; + bitmap->aa = aa; + bitmap->data = cache + (i+j) * glyphSize; + bitmap->freeData = gFalse; + + *clipRes = clip->testRect(x0 - bitmap->x, + y0 - bitmap->y, + x0 - bitmap->x + bitmap->w - 1, + y0 - bitmap->y + bitmap->h - 1); + + return gTrue; + } + } + + // generate the glyph bitmap + if (!makeGlyph(c, xFrac, yFrac, &bitmap2, x0, y0, clip, clipRes)) { + return gFalse; + } + + if (*clipRes == splashClipAllOutside) + { + bitmap->freeData = gFalse; + if (bitmap2.freeData) gfree(bitmap2.data); + return gTrue; + } + + // if the glyph doesn't fit in the bounding box, return a temporary + // uncached bitmap + if (bitmap2.w > glyphW || bitmap2.h > glyphH) { + *bitmap = bitmap2; + return gTrue; + } + + // insert glyph pixmap in cache + if (aa) { + size = bitmap2.w * bitmap2.h; + } else { + size = ((bitmap2.w + 7) >> 3) * bitmap2.h; + } + p = NULL; // make gcc happy + if (cacheAssoc == 0) + { + // we had problems on the malloc of the cache, so ignore it + *bitmap = bitmap2; + } + else + { + for (j = 0; j < cacheAssoc; ++j) { + if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc - 1) { + cacheTags[i+j].mru = 0x80000000; + cacheTags[i+j].c = c; + cacheTags[i+j].xFrac = (short)xFrac; + cacheTags[i+j].yFrac = (short)yFrac; + cacheTags[i+j].x = bitmap2.x; + cacheTags[i+j].y = bitmap2.y; + cacheTags[i+j].w = bitmap2.w; + cacheTags[i+j].h = bitmap2.h; + p = cache + (i+j) * glyphSize; + memcpy(p, bitmap2.data, size); + } else { + ++cacheTags[i+j].mru; + } + } + *bitmap = bitmap2; + bitmap->data = p; + bitmap->freeData = gFalse; + if (bitmap2.freeData) { + gfree(bitmap2.data); + } + } + return gTrue; +} diff --git a/splash/SplashFont.h b/splash/SplashFont.h new file mode 100644 index 0000000..78b00d2 --- /dev/null +++ b/splash/SplashFont.h @@ -0,0 +1,121 @@ +//======================================================================== +// +// SplashFont.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007-2008 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHFONT_H +#define SPLASHFONT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "SplashTypes.h" +#include "SplashClip.h" + +struct SplashGlyphBitmap; +struct SplashFontCacheTag; +class SplashFontFile; +class SplashPath; + +//------------------------------------------------------------------------ + +// Fractional positioning uses this many bits to the right of the +// decimal points. +#define splashFontFractionBits 2 +#define splashFontFraction (1 << splashFontFractionBits) +#define splashFontFractionMul \ + ((SplashCoord)1 / (SplashCoord)splashFontFraction) + +//------------------------------------------------------------------------ +// SplashFont +//------------------------------------------------------------------------ + +class SplashFont { +public: + + SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA, GBool aaA); + + // This must be called after the constructor, so that the subclass + // constructor has a chance to compute the bbox. + void initCache(); + + virtual ~SplashFont(); + + SplashFontFile *getFontFile() { return fontFile; } + + // Return true if matches the specified font file and matrix. + GBool matches(SplashFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA) { + return fontFileA == fontFile && + matA[0] == mat[0] && matA[1] == mat[1] && + matA[2] == mat[2] && matA[3] == mat[3] && + textMatA[0] == textMat[0] && textMatA[1] == textMat[1] && + textMatA[2] == textMat[2] && textMatA[3] == textMat[3]; + } + + // Get a glyph - this does a cache lookup first, and if not found, + // creates a new bitmap and adds it to the cache. The and + // values are splashFontFractionBits bits each, representing + // the numerators of fractions in [0, 1), where the denominator is + // splashFontFraction = 1 << splashFontFractionBits. Subclasses + // should override this to zero out xFrac and/or yFrac if they don't + // support fractional coordinates. + virtual GBool getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes); + + // Rasterize a glyph. The and values are the same + // as described for getGlyph. + virtual GBool makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) = 0; + + // Return the path for a glyph. + virtual SplashPath *getGlyphPath(int c) = 0; + + // Return the advance of a glyph. (in 0..1 range) + // < 0 means not known + virtual double getGlyphAdvance(int c) { return -1; } + + // Return the font transform matrix. + SplashCoord *getMatrix() { return mat; } + + // Return the glyph bounding box. + void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + +protected: + + SplashFontFile *fontFile; + SplashCoord mat[4]; // font transform matrix + // (text space -> device space) + SplashCoord textMat[4]; // text transform matrix + // (text space -> user space) + GBool aa; // anti-aliasing + int xMin, yMin, xMax, yMax; // glyph bounding box + Guchar *cache; // glyph bitmap cache + SplashFontCacheTag * // cache tags + cacheTags; + int glyphW, glyphH; // size of glyph bitmaps + int glyphSize; // size of glyph bitmaps, in bytes + int cacheSets; // number of sets in cache + int cacheAssoc; // cache associativity (glyphs per set) +}; + +#endif diff --git a/splash/SplashFontEngine.cc b/splash/SplashFontEngine.cc new file mode 100644 index 0000000..2e74f5a --- /dev/null +++ b/splash/SplashFontEngine.cc @@ -0,0 +1,331 @@ +//======================================================================== +// +// SplashFontEngine.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2009 Albert Astals Cid +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#if HAVE_T1LIB_H +#include +#endif + +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "SplashMath.h" +#include "SplashT1FontEngine.h" +#include "SplashFTFontEngine.h" +#include "SplashFontFile.h" +#include "SplashFontFileID.h" +#include "SplashFont.h" +#include "SplashFontEngine.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ +// SplashFontEngine +//------------------------------------------------------------------------ + +SplashFontEngine::SplashFontEngine( +#if HAVE_T1LIB_H + GBool enableT1lib, +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + GBool enableFreeType, + GBool enableFreeTypeHinting, + GBool enableSlightHinting, +#endif + GBool aa) { + int i; + + for (i = 0; i < splashFontCacheSize; ++i) { + fontCache[i] = NULL; + } + +#if HAVE_T1LIB_H + if (enableT1lib) { + t1Engine = SplashT1FontEngine::init(aa); + } else { + t1Engine = NULL; + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (enableFreeType) { + ftEngine = SplashFTFontEngine::init(aa, enableFreeTypeHinting, enableSlightHinting); + } else { + ftEngine = NULL; + } +#endif +} + +SplashFontEngine::~SplashFontEngine() { + int i; + + for (i = 0; i < splashFontCacheSize; ++i) { + if (fontCache[i]) { + delete fontCache[i]; + } + } + +#if HAVE_T1LIB_H + if (t1Engine) { + delete t1Engine; + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (ftEngine) { + delete ftEngine; + } +#endif +} + +SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) { + SplashFontFile *fontFile; + int i; + + for (i = 0; i < splashFontCacheSize; ++i) { + if (fontCache[i]) { + fontFile = fontCache[i]->getFontFile(); + if (fontFile && fontFile->getID()->matches(id)) { + return fontFile; + } + } + } + return NULL; +} + +SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_T1LIB_H + if (!fontFile && t1Engine) { + fontFile = t1Engine->loadType1Font(idA, src, enc); + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadType1Font(idA, src, enc); + } +#endif + +#ifndef _WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (src->isFile) + src->unref(); +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_T1LIB_H + if (!fontFile && t1Engine) { + fontFile = t1Engine->loadType1CFont(idA, src, enc); + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadType1CFont(idA, src, enc); + } +#endif + +#ifndef _WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (src->isFile) + src->unref(); +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadOpenTypeT1CFont(idA, src, enc); + } +#endif + + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (src->isFile) + src->unref(); + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA, + SplashFontSrc *src) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadCIDFont(idA, src); + } +#endif + +#ifndef _WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (src->isFile) + src->unref(); +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGID, + int codeToGIDLen) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadOpenTypeCFFFont(idA, src, codeToGID, codeToGIDLen); + } +#endif + + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (src->isFile) + src->unref(); + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA, + SplashFontSrc *src, + int *codeToGID, + int codeToGIDLen, + int faceIndex) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadTrueTypeFont(idA, src, + codeToGID, codeToGIDLen, faceIndex); + } +#endif + + if (!fontFile) { + gfree(codeToGID); + } + +#ifndef _WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (src->isFile) + src->unref(); +#endif + + return fontFile; +} + +SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile, + SplashCoord *textMat, + SplashCoord *ctm) { + SplashCoord mat[4]; + SplashFont *font; + int i, j; + + mat[0] = textMat[0] * ctm[0] + textMat[1] * ctm[2]; + mat[1] = -(textMat[0] * ctm[1] + textMat[1] * ctm[3]); + mat[2] = textMat[2] * ctm[0] + textMat[3] * ctm[2]; + mat[3] = -(textMat[2] * ctm[1] + textMat[3] * ctm[3]); + if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.01)) { + // avoid a singular (or close-to-singular) matrix + mat[0] = 0.01; mat[1] = 0; + mat[2] = 0; mat[3] = 0.01; + } + + font = fontCache[0]; + if (font && font->matches(fontFile, mat, textMat)) { + return font; + } + for (i = 1; i < splashFontCacheSize; ++i) { + font = fontCache[i]; + if (font && font->matches(fontFile, mat, textMat)) { + for (j = i; j > 0; --j) { + fontCache[j] = fontCache[j-1]; + } + fontCache[0] = font; + return font; + } + } + font = fontFile->makeFont(mat, textMat); + if (fontCache[splashFontCacheSize - 1]) { + delete fontCache[splashFontCacheSize - 1]; + } + for (j = splashFontCacheSize - 1; j > 0; --j) { + fontCache[j] = fontCache[j-1]; + } + fontCache[0] = font; + return font; +} diff --git a/splash/SplashFontEngine.h b/splash/SplashFontEngine.h new file mode 100644 index 0000000..54926b4 --- /dev/null +++ b/splash/SplashFontEngine.h @@ -0,0 +1,105 @@ +//======================================================================== +// +// SplashFontEngine.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2009 Petr Gajdos +// Copyright (C) 2009, 2011 Albert Astals Cid +// Copyright (C) 2011 Andreas Hartmetz +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHFONTENGINE_H +#define SPLASHFONTENGINE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "SplashTypes.h" + +class SplashT1FontEngine; +class SplashFTFontEngine; +class SplashDTFontEngine; +class SplashDT4FontEngine; +class SplashFontFile; +class SplashFontFileID; +class SplashFont; +class SplashFontSrc; + +//------------------------------------------------------------------------ + +#define splashFontCacheSize 16 + +//------------------------------------------------------------------------ +// SplashFontEngine +//------------------------------------------------------------------------ + +class SplashFontEngine { +public: + + // Create a font engine. + SplashFontEngine( +#if HAVE_T1LIB_H + GBool enableT1lib, +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + GBool enableFreeType, + GBool enableFreeTypeHinting, + GBool enableSlightHinting, +#endif + GBool aa); + + ~SplashFontEngine(); + + // Get a font file from the cache. Returns NULL if there is no + // matching entry in the cache. + SplashFontFile *getFontFile(SplashFontFileID *id); + + // Load fonts - these create new SplashFontFile objects. + SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadCIDFont(SplashFontFileID *idA, SplashFontSrc *src); + SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, SplashFontSrc *src, + int *codeToGID, int codeToGIDLen); + SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, SplashFontSrc *src, + int *codeToGID, int codeToGIDLen, int faceIndex = 0); + + // Get a font - this does a cache lookup first, and if not found, + // creates a new SplashFont object and adds it to the cache. The + // matrix, mat = textMat * ctm: + // [ mat[0] mat[1] ] + // [ mat[2] mat[3] ] + // specifies the font transform in PostScript style: + // [x' y'] = [x y] * mat + // Note that the Splash y axis points downward. + SplashFont *getFont(SplashFontFile *fontFile, + SplashCoord *textMat, SplashCoord *ctm); + +private: + + SplashFont *fontCache[splashFontCacheSize]; + +#if HAVE_T1LIB_H + SplashT1FontEngine *t1Engine; +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + SplashFTFontEngine *ftEngine; +#endif +}; + +#endif diff --git a/splash/SplashFontFile.cc b/splash/SplashFontFile.cc new file mode 100644 index 0000000..68e8608 --- /dev/null +++ b/splash/SplashFontFile.cc @@ -0,0 +1,124 @@ +//======================================================================== +// +// SplashFontFile.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2008 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "SplashFontFile.h" +#include "SplashFontFileID.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ +// SplashFontFile +//------------------------------------------------------------------------ + +SplashFontFile::SplashFontFile(SplashFontFileID *idA, SplashFontSrc *srcA) { + id = idA; + src = srcA; + src->ref(); + refCnt = 0; + doAdjustMatrix = gFalse; +} + +SplashFontFile::~SplashFontFile() { + src->unref(); + delete id; +} + +void SplashFontFile::incRefCnt() { + ++refCnt; +} + +void SplashFontFile::decRefCnt() { + if (!--refCnt) { + delete this; + } +} + +// + +SplashFontSrc::SplashFontSrc() { + isFile = gFalse; + deleteSrc = gFalse; + fileName = NULL; + buf = NULL; + refcnt = 1; +} + +SplashFontSrc::~SplashFontSrc() { + if (deleteSrc) { + if (isFile) { + if (fileName) + unlink(fileName->getCString()); + } else { + if (buf) + gfree(buf); + } + } + + if (isFile && fileName) + delete fileName; +} + +void SplashFontSrc::ref() { + refcnt++; +} + +void SplashFontSrc::unref() { + if (! --refcnt) + delete this; +} + +void SplashFontSrc::setFile(GooString *file, GBool del) +{ + isFile = gTrue; + fileName = file->copy(); + deleteSrc = del; +} + +void SplashFontSrc::setFile(const char *file, GBool del) +{ + isFile = gTrue; + fileName = new GooString(file); + deleteSrc = del; +} + +void SplashFontSrc::setBuf(char *bufA, int bufLenA, GBool del) +{ + isFile = gFalse; + buf = bufA; + bufLen = bufLenA; + deleteSrc = del; +} diff --git a/splash/SplashFontFile.h b/splash/SplashFontFile.h new file mode 100644 index 0000000..ec87504 --- /dev/null +++ b/splash/SplashFontFile.h @@ -0,0 +1,95 @@ +//======================================================================== +// +// SplashFontFile.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2008, 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHFONTFILE_H +#define SPLASHFONTFILE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "SplashTypes.h" + +class GooString; +class SplashFontEngine; +class SplashFont; +class SplashFontFileID; + +//------------------------------------------------------------------------ +// SplashFontFile +//------------------------------------------------------------------------ + +class SplashFontSrc { +public: + SplashFontSrc(); + + void setFile(GooString *file, GBool del); + void setFile(const char *file, GBool del); + void setBuf(char *bufA, int buflenA, GBool del); + + void ref(); + void unref(); + + GBool isFile; + GooString *fileName; + char *buf; + int bufLen; + +private: + ~SplashFontSrc(); + int refcnt; + GBool deleteSrc; +}; + +class SplashFontFile { +public: + + virtual ~SplashFontFile(); + + // Create a new SplashFont, i.e., a scaled instance of this font + // file. + virtual SplashFont *makeFont(SplashCoord *mat, SplashCoord *textMat) = 0; + + // Get the font file ID. + SplashFontFileID *getID() { return id; } + + // Increment the reference count. + void incRefCnt(); + + // Decrement the reference count. If the new value is zero, delete + // the SplashFontFile object. + void decRefCnt(); + + GBool doAdjustMatrix; + +protected: + + SplashFontFile(SplashFontFileID *idA, SplashFontSrc *srcA); + + SplashFontFileID *id; + SplashFontSrc *src; + int refCnt; + + friend class SplashFontEngine; +}; + +#endif diff --git a/splash/SplashFontFileID.cc b/splash/SplashFontFileID.cc new file mode 100644 index 0000000..a66dabf --- /dev/null +++ b/splash/SplashFontFileID.cc @@ -0,0 +1,23 @@ +//======================================================================== +// +// SplashFontFileID.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "SplashFontFileID.h" + +//------------------------------------------------------------------------ +// SplashFontFileID +//------------------------------------------------------------------------ + +SplashFontFileID::SplashFontFileID() { +} + +SplashFontFileID::~SplashFontFileID() { +} diff --git a/splash/SplashFontFileID.h b/splash/SplashFontFileID.h new file mode 100644 index 0000000..cfd89eb --- /dev/null +++ b/splash/SplashFontFileID.h @@ -0,0 +1,28 @@ +//======================================================================== +// +// SplashFontFileID.h +// +//======================================================================== + +#ifndef SPLASHFONTFILEID_H +#define SPLASHFONTFILEID_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +//------------------------------------------------------------------------ +// SplashFontFileID +//------------------------------------------------------------------------ + +class SplashFontFileID { +public: + + SplashFontFileID(); + virtual ~SplashFontFileID(); + virtual GBool matches(SplashFontFileID *id) = 0; +}; + +#endif diff --git a/splash/SplashGlyphBitmap.h b/splash/SplashGlyphBitmap.h new file mode 100644 index 0000000..c062c10 --- /dev/null +++ b/splash/SplashGlyphBitmap.h @@ -0,0 +1,24 @@ +//======================================================================== +// +// SplashGlyphBitmap.h +// +//======================================================================== + +#ifndef SPLASHGLYPHBITMAP_H +#define SPLASHGLYPHBITMAP_H + +#include "goo/gtypes.h" + +//------------------------------------------------------------------------ +// SplashGlyphBitmap +//------------------------------------------------------------------------ + +struct SplashGlyphBitmap { + int x, y, w, h; // offset and size of glyph + GBool aa; // anti-aliased: true means 8-bit alpha + // bitmap; false means 1-bit + Guchar *data; // bitmap data + GBool freeData; // true if data memory should be freed +}; + +#endif diff --git a/splash/SplashMath.h b/splash/SplashMath.h new file mode 100644 index 0000000..ca73c2b --- /dev/null +++ b/splash/SplashMath.h @@ -0,0 +1,245 @@ +//======================================================================== +// +// SplashMath.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009-2011 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHMATH_H +#define SPLASHMATH_H + +#include "poppler-config.h" + +#if USE_FIXEDPOINT +#include "goo/FixedPoint.h" +#else +#include +#endif +#include "SplashTypes.h" + +static inline SplashCoord splashAbs(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::abs(x); +#elif USE_FLOAT + return fabsf(x); +#else + return fabs(x); +#endif +} + +static inline int splashFloor(SplashCoord x) { + #if USE_FIXEDPOINT + return FixedPoint::floor(x); + #elif USE_FLOAT + return (int)floorf(x); + #elif __GNUC__ && __i386__ + // floor() and (int)() are implemented separately, which results + // in changing the FPCW multiple times - so we optimize it with + // some inline assembly + Gushort oldCW, newCW, t; + int result; + + __asm__ volatile("fldl %4\n" + "fnstcw %0\n" + "movw %0, %3\n" + "andw $0xf3ff, %3\n" + "orw $0x0400, %3\n" + "movw %3, %1\n" // round down + "fldcw %1\n" + "fistpl %2\n" + "fldcw %0\n" + : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t) + : "m" (x)); + return result; + #elif defined(WIN32) && defined(_M_IX86) + // floor() and (int)() are implemented separately, which results + // in changing the FPCW multiple times - so we optimize it with + // some inline assembly + Gushort oldCW, newCW; + int result; + + __asm fld QWORD PTR x + __asm fnstcw WORD PTR oldCW + __asm mov ax, WORD PTR oldCW + __asm and ax, 0xf3ff + __asm or ax, 0x0400 + __asm mov WORD PTR newCW, ax // round down + __asm fldcw WORD PTR newCW + __asm fistp DWORD PTR result + __asm fldcw WORD PTR oldCW + return result; + #else + if (x > 0) return (int)x; + else return (int)floor(x); + #endif +} + +static inline int splashCeil(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::ceil(x); +#elif USE_FLOAT + return (int)ceilf(x); +#elif __GNUC__ && __i386__ + // ceil() and (int)() are implemented separately, which results + // in changing the FPCW multiple times - so we optimize it with + // some inline assembly + Gushort oldCW, newCW, t; + int result; + + __asm__ volatile("fldl %4\n" + "fnstcw %0\n" + "movw %0, %3\n" + "andw $0xf3ff, %3\n" + "orw $0x0800, %3\n" + "movw %3, %1\n" // round up + "fldcw %1\n" + "fistpl %2\n" + "fldcw %0\n" + : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t) + : "m" (x)); + return result; +#elif defined(WIN32) && defined(_M_IX86) + // ceil() and (int)() are implemented separately, which results + // in changing the FPCW multiple times - so we optimize it with + // some inline assembly + Gushort oldCW, newCW; + int result; + + __asm fld QWORD PTR x + __asm fnstcw WORD PTR oldCW + __asm mov ax, WORD PTR oldCW + __asm and ax, 0xf3ff + __asm or ax, 0x0800 + __asm mov WORD PTR newCW, ax // round up + __asm fldcw WORD PTR newCW + __asm fistp DWORD PTR result + __asm fldcw WORD PTR oldCW + return result; +#else + return (int)ceil(x); +#endif +} + +static inline int splashRound(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::round(x); +#elif __GNUC__ && __i386__ + // this could use round-to-nearest mode and avoid the "+0.5", + // but that produces slightly different results (because i+0.5 + // sometimes rounds up and sometimes down using the even rule) + Gushort oldCW, newCW, t; + int result; + + x += 0.5; + __asm__ volatile("fldl %4\n" + "fnstcw %0\n" + "movw %0, %3\n" + "andw $0xf3ff, %3\n" + "orw $0x0400, %3\n" + "movw %3, %1\n" // round down + "fldcw %1\n" + "fistpl %2\n" + "fldcw %0\n" + : "=m" (oldCW), "=m" (newCW), "=m" (result), "=r" (t) + : "m" (x)); + return result; +#elif defined(WIN32) && defined(_M_IX86) + // this could use round-to-nearest mode and avoid the "+0.5", + // but that produces slightly different results (because i+0.5 + // sometimes rounds up and sometimes down using the even rule) + Gushort oldCW, newCW; + int result; + + x += 0.5; + __asm fld QWORD PTR x + __asm fnstcw WORD PTR oldCW + __asm mov ax, WORD PTR oldCW + __asm and ax, 0xf3ff + __asm or ax, 0x0400 + __asm mov WORD PTR newCW, ax // round down + __asm fldcw WORD PTR newCW + __asm fistp DWORD PTR result + __asm fldcw WORD PTR oldCW + return result; +#else + return (int)splashFloor(x + 0.5); +#endif +} + +static inline SplashCoord splashAvg(SplashCoord x, SplashCoord y) { +#if USE_FIXEDPOINT + return FixedPoint::avg(x, y); +#else + return 0.5 * (x + y); +#endif +} + +static inline SplashCoord splashSqrt(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::sqrt(x); +#elif USE_FLOAT + return sqrtf(x); +#else + return sqrt(x); +#endif +} + +static inline SplashCoord splashPow(SplashCoord x, SplashCoord y) { +#if USE_FIXEDPOINT + return FixedPoint::pow(x, y); +#elif USE_FLOAT + return powf(x, y); +#else + return pow(x, y); +#endif +} + +static inline SplashCoord splashDist(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + SplashCoord dx, dy; + dx = x1 - x0; + dy = y1 - y0; +#if USE_FIXEDPOINT + // this handles the situation where dx*dx or dy*dy is too large to + // fit in the 16.16 fixed point format + SplashCoord dxa, dya, d; + dxa = splashAbs(dx); + dya = splashAbs(dy); + if (dxa == 0 && dya == 0) { + return 0; + } else if (dxa > dya) { + d = dya / dxa; + return dxa * FixedPoint::sqrt(d*d + 1); + } else { + d = dxa / dya; + return dya * FixedPoint::sqrt(d*d + 1); + } +#else + return splashSqrt(dx * dx + dy * dy); +#endif +} + +static inline GBool splashCheckDet(SplashCoord m11, SplashCoord m12, + SplashCoord m21, SplashCoord m22, + SplashCoord epsilon) { +#if USE_FIXEDPOINT + return FixedPoint::checkDet(m11, m12, m21, m22, epsilon); +#else + return fabs(m11 * m22 - m12 * m21) >= epsilon; +#endif +} + +#endif diff --git a/splash/SplashPath.cc b/splash/SplashPath.cc new file mode 100644 index 0000000..bc4ccd5 --- /dev/null +++ b/splash/SplashPath.cc @@ -0,0 +1,185 @@ +//======================================================================== +// +// SplashPath.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "goo/gmem.h" +#include "SplashErrorCodes.h" +#include "SplashPath.h" + +//------------------------------------------------------------------------ +// SplashPath +//------------------------------------------------------------------------ + +// A path can be in three possible states: +// +// 1. no current point -- zero or more finished subpaths +// [curSubpath == length] +// +// 2. one point in subpath +// [curSubpath == length - 1] +// +// 3. open subpath with two or more points +// [curSubpath < length - 1] + +SplashPath::SplashPath() { + pts = NULL; + flags = NULL; + length = size = 0; + curSubpath = 0; + hints = NULL; + hintsLength = hintsSize = 0; +} + +SplashPath::SplashPath(SplashPath *path) { + length = path->length; + size = path->size; + pts = (SplashPathPoint *)gmallocn(size, sizeof(SplashPathPoint)); + flags = (Guchar *)gmallocn(size, sizeof(Guchar)); + memcpy(pts, path->pts, length * sizeof(SplashPathPoint)); + memcpy(flags, path->flags, length * sizeof(Guchar)); + curSubpath = path->curSubpath; + if (path->hints) { + hintsLength = hintsSize = path->hintsLength; + hints = (SplashPathHint *)gmallocn(hintsSize, sizeof(SplashPathHint)); + memcpy(hints, path->hints, hintsLength * sizeof(SplashPathHint)); + } else { + hints = NULL; + } +} + +SplashPath::~SplashPath() { + gfree(pts); + gfree(flags); + gfree(hints); +} + +// Add space for more points. +void SplashPath::grow(int nPts) { + if (length + nPts > size) { + if (size == 0) { + size = 32; + } + while (size < length + nPts) { + size *= 2; + } + pts = (SplashPathPoint *)greallocn(pts, size, sizeof(SplashPathPoint)); + flags = (Guchar *)greallocn(flags, size, sizeof(Guchar)); + } +} + +void SplashPath::append(SplashPath *path) { + int i; + + curSubpath = length + path->curSubpath; + grow(path->length); + for (i = 0; i < path->length; ++i) { + pts[length] = path->pts[i]; + flags[length] = path->flags[i]; + ++length; + } +} + +SplashError SplashPath::moveTo(SplashCoord x, SplashCoord y) { + if (onePointSubpath()) { + return splashErrBogusPath; + } + grow(1); + pts[length].x = x; + pts[length].y = y; + flags[length] = splashPathFirst | splashPathLast; + curSubpath = length++; + return splashOk; +} + +SplashError SplashPath::lineTo(SplashCoord x, SplashCoord y) { + if (noCurrentPoint()) { + return splashErrNoCurPt; + } + flags[length-1] &= ~splashPathLast; + grow(1); + pts[length].x = x; + pts[length].y = y; + flags[length] = splashPathLast; + ++length; + return splashOk; +} + +SplashError SplashPath::curveTo(SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3) { + if (noCurrentPoint()) { + return splashErrNoCurPt; + } + flags[length-1] &= ~splashPathLast; + grow(3); + pts[length].x = x1; + pts[length].y = y1; + flags[length] = splashPathCurve; + ++length; + pts[length].x = x2; + pts[length].y = y2; + flags[length] = splashPathCurve; + ++length; + pts[length].x = x3; + pts[length].y = y3; + flags[length] = splashPathLast; + ++length; + return splashOk; +} + +SplashError SplashPath::close(GBool force) { + if (noCurrentPoint()) { + return splashErrNoCurPt; + } + if (force || + curSubpath == length - 1 || + pts[length - 1].x != pts[curSubpath].x || + pts[length - 1].y != pts[curSubpath].y) { + lineTo(pts[curSubpath].x, pts[curSubpath].y); + } + flags[curSubpath] |= splashPathClosed; + flags[length - 1] |= splashPathClosed; + curSubpath = length; + return splashOk; +} + +void SplashPath::addStrokeAdjustHint(int ctrl0, int ctrl1, + int firstPt, int lastPt) { + if (hintsLength == hintsSize) { + hintsSize = hintsLength ? 2 * hintsLength : 8; + hints = (SplashPathHint *)greallocn(hints, hintsSize, + sizeof(SplashPathHint)); + } + hints[hintsLength].ctrl0 = ctrl0; + hints[hintsLength].ctrl1 = ctrl1; + hints[hintsLength].firstPt = firstPt; + hints[hintsLength].lastPt = lastPt; + ++hintsLength; +} + +void SplashPath::offset(SplashCoord dx, SplashCoord dy) { + int i; + + for (i = 0; i < length; ++i) { + pts[i].x += dx; + pts[i].y += dy; + } +} + +GBool SplashPath::getCurPt(SplashCoord *x, SplashCoord *y) { + if (noCurrentPoint()) { + return gFalse; + } + *x = pts[length - 1].x; + *y = pts[length - 1].y; + return gTrue; +} diff --git a/splash/SplashPath.h b/splash/SplashPath.h new file mode 100644 index 0000000..81273c6 --- /dev/null +++ b/splash/SplashPath.h @@ -0,0 +1,123 @@ +//======================================================================== +// +// SplashPath.h +// +//======================================================================== + +#ifndef SPLASHPATH_H +#define SPLASHPATH_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +//------------------------------------------------------------------------ +// SplashPathPoint +//------------------------------------------------------------------------ + +struct SplashPathPoint { + SplashCoord x, y; +}; + +//------------------------------------------------------------------------ +// SplashPath.flags +//------------------------------------------------------------------------ + +// first point on each subpath sets this flag +#define splashPathFirst 0x01 + +// last point on each subpath sets this flag +#define splashPathLast 0x02 + +// if the subpath is closed, its first and last points must be +// identical, and must set this flag +#define splashPathClosed 0x04 + +// curve control points set this flag +#define splashPathCurve 0x08 + +//------------------------------------------------------------------------ +// SplashPathHint +//------------------------------------------------------------------------ + +struct SplashPathHint { + int ctrl0, ctrl1; + int firstPt, lastPt; +}; + +//------------------------------------------------------------------------ +// SplashPath +//------------------------------------------------------------------------ + +class SplashPath { +public: + + // Create an empty path. + SplashPath(); + + // Copy a path. + SplashPath *copy() { return new SplashPath(this); } + + ~SplashPath(); + + // Append to . + void append(SplashPath *path); + + // Start a new subpath. + SplashError moveTo(SplashCoord x, SplashCoord y); + + // Add a line segment to the last subpath. + SplashError lineTo(SplashCoord x, SplashCoord y); + + // Add a third-order (cubic) Bezier curve segment to the last + // subpath. + SplashError curveTo(SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3); + + // Close the last subpath, adding a line segment if necessary. If + // is true, this adds a line segment even if the current + // point is equal to the first point in the subpath. + SplashError close(GBool force = gFalse); + + // Add a stroke adjustment hint. The controlling segments are + // and (where segments are identified by their first + // point), and the points to be adjusted are .. . + void addStrokeAdjustHint(int ctrl0, int ctrl1, int firstPt, int lastPt); + + // Add (, ) to every point on this path. + void offset(SplashCoord dx, SplashCoord dy); + + // Get the points on the path. + int getLength() { return length; } + void getPoint(int i, double *x, double *y, Guchar *f) + { *x = pts[i].x; *y = pts[i].y; *f = flags[i]; } + + // Get the current point. + GBool getCurPt(SplashCoord *x, SplashCoord *y); + +protected: + + SplashPath(SplashPath *path); + void grow(int nPts); + GBool noCurrentPoint() { return curSubpath == length; } + GBool onePointSubpath() { return curSubpath == length - 1; } + GBool openSubpath() { return curSubpath < length - 1; } + + SplashPathPoint *pts; // array of points + Guchar *flags; // array of flags + int length, size; // length/size of the pts and flags arrays + int curSubpath; // index of first point in last subpath + + SplashPathHint *hints; // list of hints + int hintsLength, hintsSize; + + friend class SplashXPath; + friend class Splash; + // this is a temporary hack, until we read FreeType paths directly + friend class ArthurOutputDev; +}; + +#endif diff --git a/splash/SplashPattern.cc b/splash/SplashPattern.cc new file mode 100644 index 0000000..28ca499 --- /dev/null +++ b/splash/SplashPattern.cc @@ -0,0 +1,55 @@ +//======================================================================== +// +// SplashPattern.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010, 2011 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "SplashMath.h" +#include "SplashScreen.h" +#include "SplashPattern.h" + +//------------------------------------------------------------------------ +// SplashPattern +//------------------------------------------------------------------------ + +SplashPattern::SplashPattern() { +} + +SplashPattern::~SplashPattern() { +} + +//------------------------------------------------------------------------ +// SplashSolidColor +//------------------------------------------------------------------------ + +SplashSolidColor::SplashSolidColor(SplashColorPtr colorA) { + splashColorCopy(color, colorA); +} + +SplashSolidColor::~SplashSolidColor() { +} + +GBool SplashSolidColor::getColor(int x, int y, SplashColorPtr c) { + splashColorCopy(c, color); + return gTrue; +} diff --git a/splash/SplashPattern.h b/splash/SplashPattern.h new file mode 100644 index 0000000..42c1660 --- /dev/null +++ b/splash/SplashPattern.h @@ -0,0 +1,100 @@ +//======================================================================== +// +// SplashPattern.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010, 2011 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHPATTERN_H +#define SPLASHPATTERN_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashScreen; + +//------------------------------------------------------------------------ +// SplashPattern +//------------------------------------------------------------------------ + +class SplashPattern { +public: + + SplashPattern(); + + virtual SplashPattern *copy() = 0; + + virtual ~SplashPattern(); + + // Return the color value for a specific pixel. + virtual GBool getColor(int x, int y, SplashColorPtr c) = 0; + + // Test if x,y-position is inside pattern. + virtual GBool testPosition(int x, int y) = 0; + + // Returns true if this pattern object will return the same color + // value for all pixels. + virtual GBool isStatic() = 0; + +private: +}; + +//------------------------------------------------------------------------ +// SplashSolidColor +//------------------------------------------------------------------------ + +class SplashSolidColor: public SplashPattern { +public: + + SplashSolidColor(SplashColorPtr colorA); + + virtual SplashPattern *copy() { return new SplashSolidColor(color); } + + virtual ~SplashSolidColor(); + + virtual GBool getColor(int x, int y, SplashColorPtr c); + + virtual GBool testPosition(int x, int y) { return gFalse; } + + virtual GBool isStatic() { return gTrue; } + +private: + + SplashColor color; +}; + +//------------------------------------------------------------------------ +// SplashGouraudColor (needed for gouraudTriangleShadedFill) +//------------------------------------------------------------------------ + +class SplashGouraudColor: public SplashPattern { +public: + + virtual GBool isParameterized() = 0; + + virtual int getNTriangles() = 0; + + virtual void getTriangle(int i, double *x0, double *y0, double *color0, + double *x1, double *y1, double *color1, + double *x2, double *y2, double *color2) = 0; + + virtual void getParameterizedColor(double t, SplashColorMode mode, SplashColorPtr c) = 0; +}; + +#endif diff --git a/splash/SplashScreen.cc b/splash/SplashScreen.cc new file mode 100644 index 0000000..d741246 --- /dev/null +++ b/splash/SplashScreen.cc @@ -0,0 +1,389 @@ +//======================================================================== +// +// SplashScreen.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "goo/gmem.h" +#include "SplashMath.h" +#include "SplashScreen.h" + +static SplashScreenParams defaultParams = { + splashScreenDispersed, // type + 2, // size + 2, // dotRadius + 1.0, // gamma + 0.0, // blackThreshold + 1.0 // whiteThreshold +}; + +//------------------------------------------------------------------------ + +struct SplashScreenPoint { + int x, y; + int dist; +}; + + +struct cmpDistancesFunctor { + bool operator()(const SplashScreenPoint &p0, const SplashScreenPoint &p1) { + return p0.dist < p1.dist; + } +}; + +//------------------------------------------------------------------------ +// SplashScreen +//------------------------------------------------------------------------ + +// If is true, this generates a 45 degree screen using a +// circular dot spot function. DPI = resolution / ((size / 2) * +// sqrt(2)). If is false, this generates an optimal +// threshold matrix using recursive tesselation. Gamma correction +// (gamma = 1 / 1.33) is also computed here. +SplashScreen::SplashScreen(SplashScreenParams *params) { + + if (!params) { + params = &defaultParams; + } + + screenParams = params; + mat = NULL; + size = 0; + maxVal = 0; + minVal = 0; +} + +void SplashScreen::createMatrix() +{ + Guchar u; + int black, white, i; + + SplashScreenParams *params = screenParams; + + // size must be a power of 2, and at least 2 + for (size = 2, log2Size = 1; size < params->size; size <<= 1, ++log2Size) ; + + switch (params->type) { + + case splashScreenDispersed: + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + buildDispersedMatrix(size/2, size/2, 1, size/2, 1); + break; + + case splashScreenClustered: + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + buildClusteredMatrix(); + break; + + case splashScreenStochasticClustered: + // size must be at least 2*r + while (size < (params->dotRadius << 1)) { + size <<= 1; + ++log2Size; + } + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + buildSCDMatrix(params->dotRadius); + break; + } + + sizeM1 = size - 1; + + // do gamma correction and compute minVal/maxVal + minVal = 255; + maxVal = 0; + black = splashRound((SplashCoord)255.0 * params->blackThreshold); + if (black < 1) { + black = 1; + } + int whiteAux = splashRound((SplashCoord)255.0 * params->whiteThreshold); + if (whiteAux > 255) { + white = 255; + } else { + white = whiteAux; + } + for (i = 0; i < size * size; ++i) { + u = splashRound((SplashCoord)255.0 * + splashPow((SplashCoord)mat[i] / 255.0, params->gamma)); + if (u < black) { + u = (Guchar)black; + } else if (u >= white) { + u = (Guchar)white; + } + mat[i] = u; + if (u < minVal) { + minVal = u; + } else if (u > maxVal) { + maxVal = u; + } + } +} + +void SplashScreen::buildDispersedMatrix(int i, int j, int val, + int delta, int offset) { + if (delta == 0) { + // map values in [1, size^2] --> [1, 255] + mat[(i << log2Size) + j] = 1 + (254 * (val - 1)) / (size * size - 1); + } else { + buildDispersedMatrix(i, j, + val, delta / 2, 4*offset); + buildDispersedMatrix((i + delta) % size, (j + delta) % size, + val + offset, delta / 2, 4*offset); + buildDispersedMatrix((i + delta) % size, j, + val + 2*offset, delta / 2, 4*offset); + buildDispersedMatrix((i + 2*delta) % size, (j + delta) % size, + val + 3*offset, delta / 2, 4*offset); + } +} + +void SplashScreen::buildClusteredMatrix() { + SplashCoord *dist; + SplashCoord u, v, d; + Guchar val; + int size2, x, y, x1, y1, i; + + size2 = size >> 1; + + // initialize the threshold matrix + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + mat[(y << log2Size) + x] = 0; + } + } + + // build the distance matrix + dist = (SplashCoord *)gmallocn(size * size2, sizeof(SplashCoord)); + for (y = 0; y < size2; ++y) { + for (x = 0; x < size2; ++x) { + if (x + y < size2 - 1) { + u = (SplashCoord)x + 0.5 - 0; + v = (SplashCoord)y + 0.5 - 0; + } else { + u = (SplashCoord)x + 0.5 - (SplashCoord)size2; + v = (SplashCoord)y + 0.5 - (SplashCoord)size2; + } + dist[y * size2 + x] = u*u + v*v; + } + } + for (y = 0; y < size2; ++y) { + for (x = 0; x < size2; ++x) { + if (x < y) { + u = (SplashCoord)x + 0.5 - 0; + v = (SplashCoord)y + 0.5 - (SplashCoord)size2; + } else { + u = (SplashCoord)x + 0.5 - (SplashCoord)size2; + v = (SplashCoord)y + 0.5 - 0; + } + dist[(size2 + y) * size2 + x] = u*u + v*v; + } + } + + // build the threshold matrix + x1 = y1 = 0; // make gcc happy + for (i = 0; i < size * size2; ++i) { + d = -1; + for (y = 0; y < size; ++y) { + for (x = 0; x < size2; ++x) { + if (mat[(y << log2Size) + x] == 0 && + dist[y * size2 + x] > d) { + x1 = x; + y1 = y; + d = dist[y1 * size2 + x1]; + } + } + } + // map values in [0, 2*size*size2-1] --> [1, 255] + val = 1 + (254 * (2*i)) / (2*size*size2 - 1); + mat[(y1 << log2Size) + x1] = val; + val = 1 + (254 * (2*i+1)) / (2*size*size2 - 1); + if (y1 < size2) { + mat[((y1 + size2) << log2Size) + x1 + size2] = val; + } else { + mat[((y1 - size2) << log2Size) + x1 + size2] = val; + } + } + + gfree(dist); +} + +// Compute the distance between two points on a toroid. +int SplashScreen::distance(int x0, int y0, int x1, int y1) { + int dx0, dx1, dx, dy0, dy1, dy; + + dx0 = abs(x0 - x1); + dx1 = size - dx0; + dx = dx0 < dx1 ? dx0 : dx1; + dy0 = abs(y0 - y1); + dy1 = size - dy0; + dy = dy0 < dy1 ? dy0 : dy1; + return dx * dx + dy * dy; +} + +// Algorithm taken from: +// Victor Ostromoukhov and Roger D. Hersch, "Stochastic Clustered-Dot +// Dithering" in Color Imaging: Device-Independent Color, Color +// Hardcopy, and Graphic Arts IV, SPIE Vol. 3648, pp. 496-505, 1999. +void SplashScreen::buildSCDMatrix(int r) { + SplashScreenPoint *dots, *pts; + int dotsLen, dotsSize; + char *tmpl; + char *grid; + int *region, *dist; + int x, y, xx, yy, x0, x1, y0, y1, i, j, d, iMin, dMin, n; + + //~ this should probably happen somewhere else + srand(123); + + // generate the random space-filling curve + pts = (SplashScreenPoint *)gmallocn(size * size, sizeof(SplashScreenPoint)); + i = 0; + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + pts[i].x = x; + pts[i].y = y; + ++i; + } + } + for (i = 0; i < size * size; ++i) { + j = i + (int)((double)(size * size - i) * + (double)rand() / ((double)RAND_MAX + 1.0)); + x = pts[i].x; + y = pts[i].y; + pts[i].x = pts[j].x; + pts[i].y = pts[j].y; + pts[j].x = x; + pts[j].y = y; + } + + // construct the circle template + tmpl = (char *)gmallocn((r+1)*(r+1), sizeof(char)); + for (y = 0; y <= r; ++y) { + for (x = 0; x <= r; ++x) { + tmpl[y*(r+1) + x] = (x * y <= r * r) ? 1 : 0; + } + } + + // mark all grid cells as free + grid = (char *)gmallocn(size * size, sizeof(char)); + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + grid[(y << log2Size) + x] = 0; + } + } + + // walk the space-filling curve, adding dots + dotsLen = 0; + dotsSize = 32; + dots = (SplashScreenPoint *)gmallocn(dotsSize, sizeof(SplashScreenPoint)); + for (i = 0; i < size * size; ++i) { + x = pts[i].x; + y = pts[i].y; + if (!grid[(y << log2Size) + x]) { + if (dotsLen == dotsSize) { + dotsSize *= 2; + dots = (SplashScreenPoint *)greallocn(dots, dotsSize, + sizeof(SplashScreenPoint)); + } + dots[dotsLen++] = pts[i]; + for (yy = 0; yy <= r; ++yy) { + y0 = (y + yy) % size; + y1 = (y - yy + size) % size; + for (xx = 0; xx <= r; ++xx) { + if (tmpl[yy*(r+1) + xx]) { + x0 = (x + xx) % size; + x1 = (x - xx + size) % size; + grid[(y0 << log2Size) + x0] = 1; + grid[(y0 << log2Size) + x1] = 1; + grid[(y1 << log2Size) + x0] = 1; + grid[(y1 << log2Size) + x1] = 1; + } + } + } + } + } + + gfree(tmpl); + gfree(grid); + + // assign each cell to a dot, compute distance to center of dot + region = (int *)gmallocn(size * size, sizeof(int)); + dist = (int *)gmallocn(size * size, sizeof(int)); + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + iMin = 0; + dMin = distance(dots[0].x, dots[0].y, x, y); + for (i = 1; i < dotsLen; ++i) { + d = distance(dots[i].x, dots[i].y, x, y); + if (d < dMin) { + iMin = i; + dMin = d; + } + } + region[(y << log2Size) + x] = iMin; + dist[(y << log2Size) + x] = dMin; + } + } + + // compute threshold values + for (i = 0; i < dotsLen; ++i) { + n = 0; + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + if (region[(y << log2Size) + x] == i) { + pts[n].x = x; + pts[n].y = y; + pts[n].dist = distance(dots[i].x, dots[i].y, x, y); + ++n; + } + } + } + std::sort(pts, pts + n, cmpDistancesFunctor()); + for (j = 0; j < n; ++j) { + // map values in [0 .. n-1] --> [255 .. 1] + mat[(pts[j].y << log2Size) + pts[j].x] = 255 - (254 * j) / (n - 1); + } + } + + gfree(pts); + gfree(region); + gfree(dist); + + gfree(dots); +} + +SplashScreen::SplashScreen(SplashScreen *screen) { + screenParams = screen->screenParams; + size = screen->size; + sizeM1 = screen->sizeM1; + log2Size = screen->log2Size; + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + memcpy(mat, screen->mat, size * size * sizeof(Guchar)); + minVal = screen->minVal; + maxVal = screen->maxVal; +} + +SplashScreen::~SplashScreen() { + gfree(mat); +} diff --git a/splash/SplashScreen.h b/splash/SplashScreen.h new file mode 100644 index 0000000..a7fc455 --- /dev/null +++ b/splash/SplashScreen.h @@ -0,0 +1,80 @@ +//======================================================================== +// +// SplashScreen.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHSCREEN_H +#define SPLASHSCREEN_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +#include + +//------------------------------------------------------------------------ +// SplashScreen +//------------------------------------------------------------------------ + +class SplashScreen { +public: + + SplashScreen(SplashScreenParams *params); + SplashScreen(SplashScreen *screen); + ~SplashScreen(); + + SplashScreen *copy() { return new SplashScreen(this); } + + // Return the computed pixel value (0=black, 1=white) for the gray + // level at (, ). + int test(int x, int y, Guchar value) { + int xx, yy; + if (mat == NULL) createMatrix(); + xx = x & sizeM1; + yy = y & sizeM1; + return value < mat[(yy << log2Size) + xx] ? 0 : 1; + } + + // Returns true if value is above the white threshold or below the + // black threshold, i.e., if the corresponding halftone will be + // solid white or black. + GBool isStatic(Guchar value) { if (mat == NULL) createMatrix(); return value < minVal || value >= maxVal; } + +private: + void createMatrix(); + + void buildDispersedMatrix(int i, int j, int val, + int delta, int offset); + void buildClusteredMatrix(); + int distance(int x0, int y0, int x1, int y1); + void buildSCDMatrix(int r); + + SplashScreenParams *screenParams; // params to create the other members + Guchar *mat; // threshold matrix + int size; // size of the threshold matrix + int sizeM1; // size - 1 + int log2Size; // log2(size) + Guchar minVal; // any pixel value below minVal generates + // solid black + Guchar maxVal; // any pixel value above maxVal generates + // solid white +}; + +#endif diff --git a/splash/SplashState.cc b/splash/SplashState.cc new file mode 100644 index 0000000..e258f66 --- /dev/null +++ b/splash/SplashState.cc @@ -0,0 +1,243 @@ +//======================================================================== +// +// SplashState.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2009, 2011, 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "goo/gmem.h" +#include "SplashPattern.h" +#include "SplashScreen.h" +#include "SplashClip.h" +#include "SplashBitmap.h" +#include "SplashState.h" + +//------------------------------------------------------------------------ +// SplashState +//------------------------------------------------------------------------ + +// number of components in each color mode +int splashColorModeNComps[] = { + 1, 1, 3, 3, 4 +#if SPLASH_CMYK + ,4 +#endif +}; + +SplashState::SplashState(int width, int height, GBool vectorAntialias, + SplashScreenParams *screenParams) { + SplashColor color; + int i; + + matrix[0] = 1; matrix[1] = 0; + matrix[2] = 0; matrix[3] = 1; + matrix[4] = 0; matrix[5] = 0; + memset(&color, 0, sizeof(SplashColor)); + strokePattern = new SplashSolidColor(color); + fillPattern = new SplashSolidColor(color); + screen = new SplashScreen(screenParams); + blendFunc = NULL; + strokeAlpha = 1; + fillAlpha = 1; + lineWidth = 0; + lineCap = splashLineCapButt; + lineJoin = splashLineJoinMiter; + miterLimit = 10; + flatness = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashPhase = 0; + strokeAdjust = gFalse; + clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias); + softMask = NULL; + deleteSoftMask = gFalse; + inNonIsolatedGroup = gFalse; + fillOverprint = gFalse; + strokeOverprint = gFalse; + overprintMode = 0; + for (i = 0; i < 256; ++i) { + rgbTransferR[i] = (Guchar)i; + rgbTransferG[i] = (Guchar)i; + rgbTransferB[i] = (Guchar)i; + grayTransfer[i] = (Guchar)i; + cmykTransferC[i] = (Guchar)i; + cmykTransferM[i] = (Guchar)i; + cmykTransferY[i] = (Guchar)i; + cmykTransferK[i] = (Guchar)i; + } + overprintMask = 0xffffffff; + overprintAdditive = gFalse; + next = NULL; +} + +SplashState::SplashState(int width, int height, GBool vectorAntialias, + SplashScreen *screenA) { + SplashColor color; + int i; + + matrix[0] = 1; matrix[1] = 0; + matrix[2] = 0; matrix[3] = 1; + matrix[4] = 0; matrix[5] = 0; + memset(&color, 0, sizeof(SplashColor)); + strokePattern = new SplashSolidColor(color); + fillPattern = new SplashSolidColor(color); + screen = screenA->copy(); + blendFunc = NULL; + strokeAlpha = 1; + fillAlpha = 1; + lineWidth = 0; + lineCap = splashLineCapButt; + lineJoin = splashLineJoinMiter; + miterLimit = 10; + flatness = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashPhase = 0; + strokeAdjust = gFalse; + clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias); + softMask = NULL; + deleteSoftMask = gFalse; + inNonIsolatedGroup = gFalse; + fillOverprint = gFalse; + strokeOverprint = gFalse; + overprintMode = 0; + for (i = 0; i < 256; ++i) { + rgbTransferR[i] = (Guchar)i; + rgbTransferG[i] = (Guchar)i; + rgbTransferB[i] = (Guchar)i; + grayTransfer[i] = (Guchar)i; + cmykTransferC[i] = (Guchar)i; + cmykTransferM[i] = (Guchar)i; + cmykTransferY[i] = (Guchar)i; + cmykTransferK[i] = (Guchar)i; + } + overprintMask = 0xffffffff; + overprintAdditive = gFalse; + next = NULL; +} + +SplashState::SplashState(SplashState *state) { + memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord)); + strokePattern = state->strokePattern->copy(); + fillPattern = state->fillPattern->copy(); + screen = state->screen->copy(); + blendFunc = state->blendFunc; + strokeAlpha = state->strokeAlpha; + fillAlpha = state->fillAlpha; + lineWidth = state->lineWidth; + lineCap = state->lineCap; + lineJoin = state->lineJoin; + miterLimit = state->miterLimit; + flatness = state->flatness; + if (state->lineDash) { + lineDashLength = state->lineDashLength; + lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord)); + memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord)); + } else { + lineDash = NULL; + lineDashLength = 0; + } + lineDashPhase = state->lineDashPhase; + strokeAdjust = state->strokeAdjust; + clip = state->clip->copy(); + softMask = state->softMask; + deleteSoftMask = gFalse; + inNonIsolatedGroup = state->inNonIsolatedGroup; + fillOverprint = state->fillOverprint; + strokeOverprint = state->strokeOverprint; + overprintMode = state->overprintMode; + memcpy(rgbTransferR, state->rgbTransferR, 256); + memcpy(rgbTransferG, state->rgbTransferG, 256); + memcpy(rgbTransferB, state->rgbTransferB, 256); + memcpy(grayTransfer, state->grayTransfer, 256); + memcpy(cmykTransferC, state->cmykTransferC, 256); + memcpy(cmykTransferM, state->cmykTransferM, 256); + memcpy(cmykTransferY, state->cmykTransferY, 256); + memcpy(cmykTransferK, state->cmykTransferK, 256); + overprintMask = state->overprintMask; + overprintAdditive = state->overprintAdditive; + next = NULL; +} + +SplashState::~SplashState() { + delete strokePattern; + delete fillPattern; + delete screen; + gfree(lineDash); + delete clip; + if (deleteSoftMask && softMask) { + delete softMask; + } +} + +void SplashState::setStrokePattern(SplashPattern *strokePatternA) { + delete strokePattern; + strokePattern = strokePatternA; +} + +void SplashState::setFillPattern(SplashPattern *fillPatternA) { + delete fillPattern; + fillPattern = fillPatternA; +} + +void SplashState::setScreen(SplashScreen *screenA) { + delete screen; + screen = screenA; +} + +void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA, + SplashCoord lineDashPhaseA) { + gfree(lineDash); + lineDashLength = lineDashLengthA; + if (lineDashLength > 0) { + lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord)); + memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord)); + } else { + lineDash = NULL; + } + lineDashPhase = lineDashPhaseA; +} + +void SplashState::setSoftMask(SplashBitmap *softMaskA) { + if (deleteSoftMask) { + delete softMask; + } + softMask = softMaskA; + deleteSoftMask = gTrue; +} + +void SplashState::setTransfer(Guchar *red, Guchar *green, Guchar *blue, + Guchar *gray) { + int i; + + memcpy(rgbTransferR, red, 256); + memcpy(rgbTransferG, green, 256); + memcpy(rgbTransferB, blue, 256); + memcpy(grayTransfer, gray, 256); + for (i = 0; i < 256; ++i) { + cmykTransferC[i] = 255 - rgbTransferR[255 - i]; + cmykTransferM[i] = 255 - rgbTransferG[255 - i]; + cmykTransferY[i] = 255 - rgbTransferB[255 - i]; + cmykTransferK[i] = 255 - grayTransfer[255 - i]; + } +} diff --git a/splash/SplashState.h b/splash/SplashState.h new file mode 100644 index 0000000..01e7772 --- /dev/null +++ b/splash/SplashState.h @@ -0,0 +1,136 @@ +//======================================================================== +// +// SplashState.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2011, 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHSTATE_H +#define SPLASHSTATE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashPattern; +class SplashScreen; +class SplashClip; +class SplashBitmap; + +//------------------------------------------------------------------------ +// line cap values +//------------------------------------------------------------------------ + +#define splashLineCapButt 0 +#define splashLineCapRound 1 +#define splashLineCapProjecting 2 + +//------------------------------------------------------------------------ +// line join values +//------------------------------------------------------------------------ + +#define splashLineJoinMiter 0 +#define splashLineJoinRound 1 +#define splashLineJoinBevel 2 + +//------------------------------------------------------------------------ +// SplashState +//------------------------------------------------------------------------ + +class SplashState { +public: + + // Create a new state object, initialized with default settings. + SplashState(int width, int height, GBool vectorAntialias, + SplashScreenParams *screenParams); + SplashState(int width, int height, GBool vectorAntialias, + SplashScreen *screenA); + + // Copy a state object. + SplashState *copy() { return new SplashState(this); } + + ~SplashState(); + + // Set the stroke pattern. This does not copy . + void setStrokePattern(SplashPattern *strokePatternA); + + // Set the fill pattern. This does not copy . + void setFillPattern(SplashPattern *fillPatternA); + + // Set the screen. This does not copy . + void setScreen(SplashScreen *screenA); + + // Set the line dash pattern. This copies the array. + void setLineDash(SplashCoord *lineDashA, int lineDashLengthA, + SplashCoord lineDashPhaseA); + + // Set the soft mask bitmap. + void setSoftMask(SplashBitmap *softMaskA); + + // Set the overprint parametes. + void setFillOverprint(GBool fillOverprintA) { fillOverprint = fillOverprintA; } + void setStrokeOverprint(GBool strokeOverprintA) { strokeOverprint = strokeOverprintA; } + void setOverprintMode(int overprintModeA) { overprintMode = overprintModeA; } + + // Set the transfer function. + void setTransfer(Guchar *red, Guchar *green, Guchar *blue, Guchar *gray); + +private: + + SplashState(SplashState *state); + + SplashCoord matrix[6]; + SplashPattern *strokePattern; + SplashPattern *fillPattern; + SplashScreen *screen; + SplashBlendFunc blendFunc; + SplashCoord strokeAlpha; + SplashCoord fillAlpha; + SplashCoord lineWidth; + int lineCap; + int lineJoin; + SplashCoord miterLimit; + SplashCoord flatness; + SplashCoord *lineDash; + int lineDashLength; + SplashCoord lineDashPhase; + GBool strokeAdjust; + SplashClip *clip; + SplashBitmap *softMask; + GBool deleteSoftMask; + GBool inNonIsolatedGroup; + GBool fillOverprint; + GBool strokeOverprint; + int overprintMode; + Guchar rgbTransferR[256], + rgbTransferG[256], + rgbTransferB[256]; + Guchar grayTransfer[256]; + Guchar cmykTransferC[256], + cmykTransferM[256], + cmykTransferY[256], + cmykTransferK[256]; + Guint overprintMask; + GBool overprintAdditive; + + SplashState *next; // used by Splash class + + friend class Splash; +}; + +#endif diff --git a/splash/SplashT1Font.cc b/splash/SplashT1Font.cc new file mode 100644 index 0000000..0fdfaaf --- /dev/null +++ b/splash/SplashT1Font.cc @@ -0,0 +1,309 @@ +//======================================================================== +// +// SplashT1Font.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/gmem.h" +#include "SplashMath.h" +#include "SplashGlyphBitmap.h" +#include "SplashPath.h" +#include "SplashT1FontEngine.h" +#include "SplashT1FontFile.h" +#include "SplashT1Font.h" + +//------------------------------------------------------------------------ + +static Guchar bitReverse[256] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff +}; + +//------------------------------------------------------------------------ +// SplashT1Font +//------------------------------------------------------------------------ + +SplashT1Font::SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA): + SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa) +{ + T1_TMATRIX matrix; + BBox bbox; + SplashCoord bbx0, bby0, bbx1, bby1; + int x, y; + + t1libID = T1_CopyFont(fontFileA->t1libID); + outlineID = -1; + + // compute font size + size = (float)splashDist(0, 0, mat[2], mat[3]); + + // transform the four corners of the font bounding box -- the min + // and max values form the bounding box of the transformed font + bbox = T1_GetFontBBox(t1libID); + bbx0 = 0.001 * bbox.llx; + bby0 = 0.001 * bbox.lly; + bbx1 = 0.001 * bbox.urx; + bby1 = 0.001 * bbox.ury; + // some fonts are completely broken, so we fake it (with values + // large enough that most glyphs should fit) + if (bbx0 == 0 && bby0 == 0 && bbx1 == 0 && bby1 == 0) { + bbx0 = bby0 = -0.5; + bbx1 = bby1 = 1.5; + } + x = (int)(mat[0] * bbx0 + mat[2] * bby0); + xMin = xMax = x; + y = (int)(mat[1] * bbx0 + mat[3] * bby0); + yMin = yMax = y; + x = (int)(mat[0] * bbx0 + mat[2] * bby1); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * bbx0 + mat[3] * bby1); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)(mat[0] * bbx1 + mat[2] * bby0); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * bbx1 + mat[3] * bby0); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)(mat[0] * bbx1 + mat[2] * bby1); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * bbx1 + mat[3] * bby1); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + // This is a kludge: some buggy PDF generators embed fonts with + // zero bounding boxes. + if (xMax == xMin) { + xMin = 0; + xMax = (int)size; + } + if (yMax == yMin) { + yMin = 0; + yMax = (int)(1.2 * size); + } + // Another kludge: an unusually large xMin or yMin coordinate is + // probably wrong. + if (xMin > 0) { + xMin = 0; + } + if (yMin > 0) { + yMin = 0; + } + // Another kludge: t1lib doesn't correctly handle fonts with + // real (non-integer) bounding box coordinates. + if (xMax - xMin > 5000) { + xMin = 0; + xMax = (int)size; + } + if (yMax - yMin > 5000) { + yMin = 0; + yMax = (int)(1.2 * size); + } + + // transform the font + matrix.cxx = (double)mat[0] / size; + matrix.cxy = (double)mat[1] / size; + matrix.cyx = (double)mat[2] / size; + matrix.cyy = (double)mat[3] / size; + T1_TransformFont(t1libID, &matrix); +} + +SplashT1Font::~SplashT1Font() { + T1_DeleteFont(t1libID); + if (outlineID >= 0) { + T1_DeleteFont(outlineID); + } +} + +GBool SplashT1Font::getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) { + return SplashFont::getGlyph(c, 0, 0, bitmap, x0, y0, clip, clipRes); +} + +GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) { + GLYPH *glyph; + int n, i; + + if (aa) { + glyph = T1_AASetChar(t1libID, c, size, NULL); + } else { + glyph = T1_SetChar(t1libID, c, size, NULL); + } + if (!glyph) { + return gFalse; + } + + bitmap->x = -glyph->metrics.leftSideBearing; + bitmap->y = glyph->metrics.ascent; + bitmap->w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; + bitmap->h = glyph->metrics.ascent - glyph->metrics.descent; + bitmap->aa = aa; + if (aa) { + bitmap->data = (Guchar *)glyph->bits; + bitmap->freeData = gFalse; + } else { + n = bitmap->h * ((bitmap->w + 7) >> 3); + bitmap->data = (Guchar *)gmalloc(n); + for (i = 0; i < n; ++i) { + bitmap->data[i] = bitReverse[glyph->bits[i] & 0xff]; + } + bitmap->freeData = gTrue; + } + + *clipRes = clip->testRect(x0 - bitmap->x, + y0 - bitmap->y, + x0 - bitmap->x + bitmap->w - 1, + y0 - bitmap->y + bitmap->h - 1); + + return gTrue; +} + +SplashPath *SplashT1Font::getGlyphPath(int c) { + T1_TMATRIX matrix; + SplashPath *path; + T1_OUTLINE *outline; + T1_PATHSEGMENT *seg; + T1_BEZIERSEGMENT *bez; + int x, y, x1, y1; + GBool needClose; + + if (outlineID < 0) { + outlineID = T1_CopyFont(((SplashT1FontFile *)fontFile)->t1libID); + outlineSize = (float)splashDist(0, 0, textMat[2], textMat[3]); + matrix.cxx = (double)textMat[0] / outlineSize; + matrix.cxy = (double)textMat[1] / outlineSize; + matrix.cyx = (double)textMat[2] / outlineSize; + matrix.cyy = (double)textMat[3] / outlineSize; + // t1lib doesn't seem to handle small sizes correctly here, so set + // the size to 1000, and scale the resulting coordinates later + outlineMul = (float)(outlineSize / 65536000.0); + outlineSize = 1000; + T1_TransformFont(outlineID, &matrix); + } + + path = new SplashPath(); + if ((outline = T1_GetCharOutline(outlineID, c, outlineSize, NULL))) { + // NB: t1lib uses integer coordinates here; we keep a running + // (x,y) total as integers, so that the final point in the path is + // exactly the same as the first point, thus avoiding weird + // mitered join glitches + x = y = 0; + needClose = gFalse; + for (seg = outline; seg; seg = seg->link) { + switch (seg->type) { + case T1_PATHTYPE_MOVE: + if (needClose) { + path->close(); + needClose = gFalse; + } + x += seg->dest.x; + y += seg->dest.y; + path->moveTo(outlineMul * x, -outlineMul * y); + break; + case T1_PATHTYPE_LINE: + x += seg->dest.x; + y += seg->dest.y; + path->lineTo(outlineMul * x, -outlineMul * y); + needClose = gTrue; + break; + case T1_PATHTYPE_BEZIER: + bez = (T1_BEZIERSEGMENT *)seg; + x1 = x + bez->dest.x; + y1 = y + bez->dest.y; + path->curveTo(outlineMul * (x + bez->B.x), + -outlineMul * (y + bez->B.y), + outlineMul * (x + bez->C.x), + -outlineMul * (y + bez->C.y), + outlineMul * x1, + -outlineMul * y1); + x = x1; + y = y1; + needClose = gTrue; + break; + } + } + if (needClose) { + path->close(); + } + T1_FreeOutline(outline); + } + + return path; +} + +#endif // HAVE_T1LIB_H diff --git a/splash/SplashT1Font.h b/splash/SplashT1Font.h new file mode 100644 index 0000000..1dbe66c --- /dev/null +++ b/splash/SplashT1Font.h @@ -0,0 +1,69 @@ +//======================================================================== +// +// SplashT1Font.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHT1FONT_H +#define SPLASHT1FONT_H + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashFont.h" + +class SplashT1FontFile; + +//------------------------------------------------------------------------ +// SplashT1Font +//------------------------------------------------------------------------ + +class SplashT1Font: public SplashFont { +public: + + SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA); + + virtual ~SplashT1Font(); + + // Munge xFrac and yFrac before calling SplashFont::getGlyph. + virtual GBool getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes); + + // Rasterize a glyph. The and values are the same + // as described for getGlyph. + virtual GBool makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes); + + // Return the path for a glyph. + virtual SplashPath *getGlyphPath(int c); + +private: + + int t1libID; // t1lib font ID + int outlineID; // t1lib font ID for glyph outlines + float size; + float outlineSize; // size for glyph outlines + float outlineMul; +}; + +#endif // HAVE_T1LIB_H + +#endif diff --git a/splash/SplashT1FontEngine.cc b/splash/SplashT1FontEngine.cc new file mode 100644 index 0000000..fb4b38d --- /dev/null +++ b/splash/SplashT1FontEngine.cc @@ -0,0 +1,138 @@ +//======================================================================== +// +// SplashT1FontEngine.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2009 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#include "goo/GooString.h" +#include "goo/gfile.h" +#include "fofi/FoFiType1C.h" +#include "SplashT1FontFile.h" +#include "SplashT1FontEngine.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ + +int SplashT1FontEngine::t1libInitCount = 0; + +//------------------------------------------------------------------------ + +static void fileWrite(void *stream, const char *data, int len) { + fwrite(data, 1, len, (FILE *)stream); +} + +//------------------------------------------------------------------------ +// SplashT1FontEngine +//------------------------------------------------------------------------ + +SplashT1FontEngine::SplashT1FontEngine(GBool aaA) { + aa = aaA; +} + +SplashT1FontEngine *SplashT1FontEngine::init(GBool aaA) { + // grayVals[i] = round(i * 255 / 16) + static unsigned long grayVals[17] = { + 0, 16, 32, 48, 64, 80, 96, 112, 128, 143, 159, 175, 191, 207, 223, 239, 255 + }; + + //~ for multithreading: need a mutex here + if (t1libInitCount == 0) { + T1_SetBitmapPad(8); + if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE | + T1_NO_AFM)) { + return NULL; + } + if (aaA) { + T1_AASetBitsPerPixel(8); + T1_AASetLevel(T1_AA_HIGH); + T1_AAHSetGrayValues(grayVals); + } else { + T1_AANSetGrayValues(0, 1); + } + } + ++t1libInitCount; + + return new SplashT1FontEngine(aaA); +} + +SplashT1FontEngine::~SplashT1FontEngine() { + //~ for multithreading: need a mutex here + if (--t1libInitCount == 0) { + T1_CloseLib(); + } +} + +SplashFontFile *SplashT1FontEngine::loadType1Font(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + return SplashT1FontFile::loadType1Font(this, idA, src, enc); +} + +SplashFontFile *SplashT1FontEngine::loadType1CFont(SplashFontFileID *idA, + SplashFontSrc *src, + const char **enc) { + FoFiType1C *ff; + GooString *tmpFileName; + FILE *tmpFile; + SplashFontFile *ret; + + SplashFontSrc *newsrc; + + if (src->isFile) + ff = FoFiType1C::load(src->fileName->getCString()); + else + ff = FoFiType1C::make(src->buf, src->bufLen); + if (! ff) + return NULL; + + tmpFileName = NULL; + if (!openTempFile(&tmpFileName, &tmpFile, "wb")) { + delete ff; + return NULL; + } + ff->convertToType1(NULL, NULL, gTrue, &fileWrite, tmpFile); + delete ff; + fclose(tmpFile); + newsrc = new SplashFontSrc; + newsrc->setFile(tmpFileName, gTrue); + delete tmpFileName; + ret = SplashT1FontFile::loadType1Font(this, idA, newsrc, enc); + newsrc->unref(); + return ret; +} + +#endif // HAVE_T1LIB_H diff --git a/splash/SplashT1FontEngine.h b/splash/SplashT1FontEngine.h new file mode 100644 index 0000000..268a014 --- /dev/null +++ b/splash/SplashT1FontEngine.h @@ -0,0 +1,50 @@ +//======================================================================== +// +// SplashT1FontEngine.h +// +//======================================================================== + +#ifndef SPLASHT1FONTENGINE_H +#define SPLASHT1FONTENGINE_H + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" + +class SplashFontFile; +class SplashFontFileID; +class SplashFontSrc; + +//------------------------------------------------------------------------ +// SplashT1FontEngine +//------------------------------------------------------------------------ + +class SplashT1FontEngine { +public: + + static SplashT1FontEngine *init(GBool aaA); + + ~SplashT1FontEngine(); + + // Load fonts. + SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, const char **enc); + +private: + + SplashT1FontEngine(GBool aaA); + + static int t1libInitCount; + GBool aa; + + friend class SplashT1FontFile; + friend class SplashT1Font; +}; + +#endif // HAVE_T1LIB_H + +#endif diff --git a/splash/SplashT1FontFile.cc b/splash/SplashT1FontFile.cc new file mode 100644 index 0000000..1832a91 --- /dev/null +++ b/splash/SplashT1FontFile.cc @@ -0,0 +1,134 @@ +//======================================================================== +// +// SplashT1FontFile.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// Copyright (C) 2009 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "goo/GooString.h" +#include "goo/gfile.h" +#include "goo/gmem.h" +#include "SplashT1FontEngine.h" +#include "SplashT1Font.h" +#include "SplashT1FontFile.h" + +//------------------------------------------------------------------------ +// SplashT1FontFile +//------------------------------------------------------------------------ + +SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + const char **encA) { + int t1libIDA; + const char **encTmp; + char *encStrTmp; + int encStrSize; + char *encPtr; + int i; + + GooString *fileNameA; + SplashFontSrc *newsrc = NULL; + SplashFontFile *ff; + + if (! src->isFile) { + GooString *tmpFileName; + FILE *tmpFile; + if (!openTempFile(&tmpFileName, &tmpFile, "wb")) + return NULL; + fwrite(src->buf, 1, src->bufLen, tmpFile); + fclose(tmpFile); + newsrc = new SplashFontSrc; + newsrc->setFile(tmpFileName, gTrue); + src = newsrc; + delete tmpFileName; + } + fileNameA = src->fileName; + // load the font file + if ((t1libIDA = T1_AddFont(fileNameA->getCString())) < 0) { + delete newsrc; + return NULL; + } + T1_LoadFont(t1libIDA); + + // reencode it + encStrSize = 0; + for (i = 0; i < 256; ++i) { + if (encA[i]) { + encStrSize += strlen(encA[i]) + 1; + } + } + encTmp = (const char **)gmallocn(257, sizeof(char *)); + encStrTmp = (char *)gmallocn(encStrSize, sizeof(char)); + encPtr = encStrTmp; + for (i = 0; i < 256; ++i) { + if (encA[i]) { + strcpy(encPtr, encA[i]); + encTmp[i] = encPtr; + encPtr += strlen(encPtr) + 1; + } else { + encTmp[i] = ".notdef"; + } + } + encTmp[256] = "custom"; + T1_ReencodeFont(t1libIDA, (char **)encTmp); + + ff = new SplashT1FontFile(engineA, idA, src, + t1libIDA, encTmp, encStrTmp); + if (newsrc) + newsrc->unref(); + return ff; +} + +SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *srcA, + int t1libIDA, const char **encA, char *encStrA): + SplashFontFile(idA, srcA) +{ + engine = engineA; + t1libID = t1libIDA; + enc = encA; + encStr = encStrA; +} + +SplashT1FontFile::~SplashT1FontFile() { + gfree(encStr); + gfree(enc); + T1_DeleteFont(t1libID); +} + +SplashFont *SplashT1FontFile::makeFont(SplashCoord *mat, + SplashCoord *textMat) { + SplashFont *font; + + font = new SplashT1Font(this, mat, textMat); + font->initCache(); + return font; +} + +#endif // HAVE_T1LIB_H diff --git a/splash/SplashT1FontFile.h b/splash/SplashT1FontFile.h new file mode 100644 index 0000000..c094b6d --- /dev/null +++ b/splash/SplashT1FontFile.h @@ -0,0 +1,70 @@ +//======================================================================== +// +// SplashT1FontFile.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Takashi Iwai +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHT1FONTFILE_H +#define SPLASHT1FONTFILE_H + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashFontFile.h" + +class SplashT1FontEngine; + +//------------------------------------------------------------------------ +// SplashT1FontFile +//------------------------------------------------------------------------ + +class SplashT1FontFile: public SplashFontFile { +public: + + static SplashFontFile *loadType1Font(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + const char **encA); + + virtual ~SplashT1FontFile(); + + // Create a new SplashT1Font, i.e., a scaled instance of this font + // file. + virtual SplashFont *makeFont(SplashCoord *mat, + SplashCoord *textMat); + +private: + + SplashT1FontFile(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + SplashFontSrc *src, + int t1libIDA, const char **encA, char *encStrA); + + SplashT1FontEngine *engine; + int t1libID; // t1lib font ID + const char **enc; + char *encStr; + + friend class SplashT1Font; +}; + +#endif // HAVE_T1LIB_H + +#endif diff --git a/splash/SplashTypes.h b/splash/SplashTypes.h new file mode 100644 index 0000000..65525b1 --- /dev/null +++ b/splash/SplashTypes.h @@ -0,0 +1,169 @@ +//======================================================================== +// +// SplashTypes.h +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2010 Albert Astals Cid +// Copyright (C) 2008 Tomas Are Haavet +// Copyright (C) 2009, 2011 Thomas Freitag +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2010 William Bader +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef SPLASHTYPES_H +#define SPLASHTYPES_H + +#include "goo/gtypes.h" + +//------------------------------------------------------------------------ +// coordinates +//------------------------------------------------------------------------ + +#if USE_FIXEDPOINT +#include "goo/FixedPoint.h" +typedef FixedPoint SplashCoord; +#elif USE_FLOAT +typedef float SplashCoord; +#else +typedef double SplashCoord; +#endif + +//------------------------------------------------------------------------ +// antialiasing +//------------------------------------------------------------------------ + +#define splashAASize 4 + +//------------------------------------------------------------------------ +// colors +//------------------------------------------------------------------------ + +enum SplashColorMode { + splashModeMono1, // 1 bit per component, 8 pixels per byte, + // MSbit is on the left + splashModeMono8, // 1 byte per component, 1 byte per pixel + splashModeRGB8, // 1 byte per component, 3 bytes per pixel: + // RGBRGB... + splashModeBGR8, // 1 byte per component, 3 bytes per pixel: + // BGRBGR... + splashModeXBGR8 // 1 byte per component, 4 bytes per pixel: + // XBGRXBGR... +#if SPLASH_CMYK + , + splashModeCMYK8 // 1 byte per component, 4 bytes per pixel: + // CMYKCMYK... +#endif +}; + +// number of components in each color mode +// (defined in SplashState.cc) +extern int splashColorModeNComps[]; + +// max number of components in any SplashColor +#define splashMaxColorComps 4 + +typedef Guchar SplashColor[splashMaxColorComps]; +typedef Guchar *SplashColorPtr; + +// RGB8 +static inline Guchar splashRGB8R(SplashColorPtr rgb8) { return rgb8[0]; } +static inline Guchar splashRGB8G(SplashColorPtr rgb8) { return rgb8[1]; } +static inline Guchar splashRGB8B(SplashColorPtr rgb8) { return rgb8[2]; } + +// BGR8 +static inline Guchar splashBGR8R(SplashColorPtr bgr8) { return bgr8[2]; } +static inline Guchar splashBGR8G(SplashColorPtr bgr8) { return bgr8[1]; } +static inline Guchar splashBGR8B(SplashColorPtr bgr8) { return bgr8[0]; } + +#if SPLASH_CMYK +// CMYK8 +static inline Guchar splashCMYK8C(SplashColorPtr cmyk8) { return cmyk8[0]; } +static inline Guchar splashCMYK8M(SplashColorPtr cmyk8) { return cmyk8[1]; } +static inline Guchar splashCMYK8Y(SplashColorPtr cmyk8) { return cmyk8[2]; } +static inline Guchar splashCMYK8K(SplashColorPtr cmyk8) { return cmyk8[3]; } +#endif + +static inline void splashClearColor(SplashColorPtr dest) { + dest[0] = 0; + dest[1] = 0; + dest[2] = 0; +#if SPLASH_CMYK + dest[3] = 0; +#endif +} + +static inline void splashColorCopy(SplashColorPtr dest, SplashColorPtr src) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; +#if SPLASH_CMYK + dest[3] = src[3]; +#endif +} + +static inline void splashColorXor(SplashColorPtr dest, SplashColorPtr src) { + dest[0] ^= src[0]; + dest[1] ^= src[1]; + dest[2] ^= src[2]; +#if SPLASH_CMYK + dest[3] ^= src[3]; +#endif +} + +//------------------------------------------------------------------------ +// blend functions +//------------------------------------------------------------------------ + +typedef void (*SplashBlendFunc)(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm); + +//------------------------------------------------------------------------ +// screen parameters +//------------------------------------------------------------------------ + +enum SplashScreenType { + splashScreenDispersed, + splashScreenClustered, + splashScreenStochasticClustered +}; + +struct SplashScreenParams { + SplashScreenType type; + int size; + int dotRadius; + SplashCoord gamma; + SplashCoord blackThreshold; + SplashCoord whiteThreshold; +}; + +//------------------------------------------------------------------------ +// error results +//------------------------------------------------------------------------ + +typedef int SplashError; + + +//------------------------------------------------------------------------ +// image file formats +//------------------------------------------------------------------------ + +enum SplashImageFileFormat { + splashFormatJpeg, + splashFormatPng, + splashFormatTiff, + splashFormatJpegCMYK +}; + +#endif diff --git a/splash/SplashXPath.cc b/splash/SplashXPath.cc new file mode 100644 index 0000000..b82d355 --- /dev/null +++ b/splash/SplashXPath.cc @@ -0,0 +1,462 @@ +//======================================================================== +// +// SplashXPath.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Paweł Wiejacha +// Copyright (C) 2010, 2011 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "goo/gmem.h" +#include "SplashMath.h" +#include "SplashPath.h" +#include "SplashXPath.h" + +//------------------------------------------------------------------------ + +struct SplashXPathPoint { + SplashCoord x, y; +}; + +struct SplashXPathAdjust { + int firstPt, lastPt; // range of points + GBool vert; // vertical or horizontal hint + SplashCoord x0a, x0b, // hint boundaries + xma, xmb, + x1a, x1b; + SplashCoord x0, x1, xm; // adjusted coordinates +}; + +//------------------------------------------------------------------------ + +// Transform a point from user space to device space. +inline void SplashXPath::transform(SplashCoord *matrix, + SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo) { + // [ m[0] m[1] 0 ] + // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ] + // [ m[4] m[5] 1 ] + *xo = xi * matrix[0] + yi * matrix[2] + matrix[4]; + *yo = xi * matrix[1] + yi * matrix[3] + matrix[5]; +} + +//------------------------------------------------------------------------ +// SplashXPath +//------------------------------------------------------------------------ + +SplashXPath::SplashXPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool closeSubpaths) { + SplashPathHint *hint; + SplashXPathPoint *pts; + SplashXPathAdjust *adjusts, *adjust; + SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xsp, ysp; + SplashCoord adj0, adj1; + int curSubpath, i, j; + + // transform the points + pts = (SplashXPathPoint *)gmallocn(path->length, sizeof(SplashXPathPoint)); + for (i = 0; i < path->length; ++i) { + transform(matrix, path->pts[i].x, path->pts[i].y, &pts[i].x, &pts[i].y); + } + + // set up the stroke adjustment hints + if (path->hints) { + adjusts = (SplashXPathAdjust *)gmallocn(path->hintsLength, + sizeof(SplashXPathAdjust)); + for (i = 0; i < path->hintsLength; ++i) { + hint = &path->hints[i]; + if (hint->ctrl0 + 1 >= path->length || hint->ctrl1 + 1 >= path->length) { + gfree(adjusts); + adjusts = NULL; + break; + } + x0 = pts[hint->ctrl0 ].x; y0 = pts[hint->ctrl0 ].y; + x1 = pts[hint->ctrl0 + 1].x; y1 = pts[hint->ctrl0 + 1].y; + x2 = pts[hint->ctrl1 ].x; y2 = pts[hint->ctrl1 ].y; + x3 = pts[hint->ctrl1 + 1].x; y3 = pts[hint->ctrl1 + 1].y; + if (x0 == x1 && x2 == x3) { + adjusts[i].vert = gTrue; + adj0 = x0; + adj1 = x2; + } else if (y0 == y1 && y2 == y3) { + adjusts[i].vert = gFalse; + adj0 = y0; + adj1 = y2; + } else { + gfree(adjusts); + adjusts = NULL; + break; + } + if (adj0 > adj1) { + x0 = adj0; + adj0 = adj1; + adj1 = x0; + } + adjusts[i].x0a = adj0 - 0.01; + adjusts[i].x0b = adj0 + 0.01; + adjusts[i].xma = (SplashCoord)0.5 * (adj0 + adj1) - 0.01; + adjusts[i].xmb = (SplashCoord)0.5 * (adj0 + adj1) + 0.01; + adjusts[i].x1a = adj1 - 0.01; + adjusts[i].x1b = adj1 + 0.01; + // rounding both edge coordinates can result in lines of + // different widths (e.g., adj=10.1, adj1=11.3 --> x0=10, x1=11; + // adj0=10.4, adj1=11.6 --> x0=10, x1=12), but it has the + // benefit of making adjacent strokes/fills line up without any + // gaps between them + x0 = splashRound(adj0); + x1 = splashRound(adj1); + if (x1 == x0) { + x1 = x1 + 1; + } + adjusts[i].x0 = (SplashCoord)x0; + adjusts[i].x1 = (SplashCoord)x1 - 0.01; + adjusts[i].xm = (SplashCoord)0.5 * (adjusts[i].x0 + adjusts[i].x1); + adjusts[i].firstPt = hint->firstPt; + adjusts[i].lastPt = hint->lastPt; + } + + } else { + adjusts = NULL; + } + + // perform stroke adjustment + if (adjusts) { + for (i = 0, adjust = adjusts; i < path->hintsLength; ++i, ++adjust) { + for (j = adjust->firstPt; j <= adjust->lastPt; ++j) { + strokeAdjust(adjust, &pts[j].x, &pts[j].y); + } + } + gfree(adjusts); + } + + segs = NULL; + length = size = 0; + + x0 = y0 = xsp = ysp = 0; // make gcc happy + adj0 = adj1 = 0; // make gcc happy + curSubpath = 0; + i = 0; + while (i < path->length) { + + // first point in subpath - skip it + if (path->flags[i] & splashPathFirst) { + x0 = pts[i].x; + y0 = pts[i].y; + xsp = x0; + ysp = y0; + curSubpath = i; + ++i; + + } else { + + // curve segment + if (path->flags[i] & splashPathCurve) { + x1 = pts[i].x; + y1 = pts[i].y; + x2 = pts[i+1].x; + y2 = pts[i+1].y; + x3 = pts[i+2].x; + y3 = pts[i+2].y; + addCurve(x0, y0, x1, y1, x2, y2, x3, y3, + flatness, + (path->flags[i-1] & splashPathFirst), + (path->flags[i+2] & splashPathLast), + !closeSubpaths && + (path->flags[i-1] & splashPathFirst) && + !(path->flags[i-1] & splashPathClosed), + !closeSubpaths && + (path->flags[i+2] & splashPathLast) && + !(path->flags[i+2] & splashPathClosed)); + x0 = x3; + y0 = y3; + i += 3; + + // line segment + } else { + x1 = pts[i].x; + y1 = pts[i].y; + addSegment(x0, y0, x1, y1); + x0 = x1; + y0 = y1; + ++i; + } + + // close a subpath + if (closeSubpaths && + (path->flags[i-1] & splashPathLast) && + (pts[i-1].x != pts[curSubpath].x || + pts[i-1].y != pts[curSubpath].y)) { + addSegment(x0, y0, xsp, ysp); + } + } + } + + gfree(pts); +} + +// Apply the stroke adjust hints to point : (*, *). +void SplashXPath::strokeAdjust(SplashXPathAdjust *adjust, + SplashCoord *xp, SplashCoord *yp) { + SplashCoord x, y; + + if (adjust->vert) { + x = *xp; + if (x > adjust->x0a && x < adjust->x0b) { + *xp = adjust->x0; + } else if (x > adjust->xma && x < adjust->xmb) { + *xp = adjust->xm; + } else if (x > adjust->x1a && x < adjust->x1b) { + *xp = adjust->x1; + } + } else { + y = *yp; + if (y > adjust->x0a && y < adjust->x0b) { + *yp = adjust->x0; + } else if (y > adjust->xma && y < adjust->xmb) { + *yp = adjust->xm; + } else if (y > adjust->x1a && y < adjust->x1b) { + *yp = adjust->x1; + } + } +} + +SplashXPath::SplashXPath(SplashXPath *xPath) { + length = xPath->length; + size = xPath->size; + segs = (SplashXPathSeg *)gmallocn(size, sizeof(SplashXPathSeg)); + memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg)); +} + +SplashXPath::~SplashXPath() { + gfree(segs); +} + +// Add space for more segments +void SplashXPath::grow(int nSegs) { + if (length + nSegs > size) { + if (size == 0) { + size = 32; + } + while (size < length + nSegs) { + size *= 2; + } + segs = (SplashXPathSeg *)greallocn(segs, size, sizeof(SplashXPathSeg)); + } +} + +void SplashXPath::addCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord flatness, + GBool first, GBool last, GBool end0, GBool end1) { + SplashCoord *cx = new SplashCoord[(splashMaxCurveSplits + 1) * 3]; + SplashCoord *cy = new SplashCoord[(splashMaxCurveSplits + 1) * 3]; + int *cNext = new int[splashMaxCurveSplits + 1]; + SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh; + SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh; + SplashCoord dx, dy, mx, my, d1, d2, flatness2; + int p1, p2, p3; + +#if USE_FIXEDPOINT + flatness2 = flatness; +#else + flatness2 = flatness * flatness; +#endif + + // initial segment + p1 = 0; + p2 = splashMaxCurveSplits; + + *(cx + p1 * 3 + 0) = x0; + *(cx + p1 * 3 + 1) = x1; + *(cx + p1 * 3 + 2) = x2; + *(cx + p2 * 3 + 0) = x3; + + *(cy + p1 * 3 + 0) = y0; + *(cy + p1 * 3 + 1) = y1; + *(cy + p1 * 3 + 2) = y2; + *(cy + p2 * 3 + 0) = y3; + + *(cNext + p1) = p2; + + while (p1 < splashMaxCurveSplits) { + + // get the next segment + xl0 = *(cx + p1 * 3 + 0); + xx1 = *(cx + p1 * 3 + 1); + xx2 = *(cx + p1 * 3 + 2); + + yl0 = *(cy + p1 * 3 + 0); + yy1 = *(cy + p1 * 3 + 1); + yy2 = *(cy + p1 * 3 + 2); + + p2 = *(cNext + p1); + + xr3 = *(cx + p2 * 3 + 0); + yr3 = *(cy + p2 * 3 + 0); + + // compute the distances from the control points to the + // midpoint of the straight line (this is a bit of a hack, but + // it's much faster than computing the actual distances to the + // line) + mx = (xl0 + xr3) * 0.5; + my = (yl0 + yr3) * 0.5; +#if USE_FIXEDPOINT + d1 = splashDist(xx1, yy1, mx, my); + d2 = splashDist(xx2, yy2, mx, my); +#else + dx = xx1 - mx; + dy = yy1 - my; + d1 = dx*dx + dy*dy; + dx = xx2 - mx; + dy = yy2 - my; + d2 = dx*dx + dy*dy; +#endif + + // if the curve is flat enough, or no more subdivisions are + // allowed, add the straight line segment + if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) { + addSegment(xl0, yl0, xr3, yr3); + p1 = p2; + + // otherwise, subdivide the curve + } else { + xl1 = (xl0 + xx1) * 0.5; + yl1 = (yl0 + yy1) * 0.5; + xh = (xx1 + xx2) * 0.5; + yh = (yy1 + yy2) * 0.5; + xl2 = (xl1 + xh) * 0.5; + yl2 = (yl1 + yh) * 0.5; + xr2 = (xx2 + xr3) * 0.5; + yr2 = (yy2 + yr3) * 0.5; + xr1 = (xh + xr2) * 0.5; + yr1 = (yh + yr2) * 0.5; + xr0 = (xl2 + xr1) * 0.5; + yr0 = (yl2 + yr1) * 0.5; + // add the new subdivision points + p3 = (p1 + p2) / 2; + + *(cx + p1 * 3 + 1) = xl1; + *(cx + p1 * 3 + 2) = xl2; + + *(cy + p1 * 3 + 1) = yl1; + *(cy + p1 * 3 + 2) = yl2; + + *(cNext + p1) = p3; + + *(cx + p3 * 3 + 0) = xr0; + *(cx + p3 * 3 + 1) = xr1; + *(cx + p3 * 3 + 2) = xr2; + + *(cy + p3 * 3 + 0) = yr0; + *(cy + p3 * 3 + 1) = yr1; + *(cy + p3 * 3 + 2) = yr2; + + *(cNext + p3) = p2; + } + } + + delete [] cx; + delete [] cy; + delete [] cNext; +} + +void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + grow(1); + segs[length].x0 = x0; + segs[length].y0 = y0; + segs[length].x1 = x1; + segs[length].y1 = y1; + segs[length].flags = 0; + if (y1 == y0) { + segs[length].dxdy = segs[length].dydx = 0; + segs[length].flags |= splashXPathHoriz; + if (x1 == x0) { + segs[length].flags |= splashXPathVert; + } + } else if (x1 == x0) { + segs[length].dxdy = segs[length].dydx = 0; + segs[length].flags |= splashXPathVert; + } else { +#if USE_FIXEDPOINT + if (FixedPoint::divCheck(x1 - x0, y1 - y0, &segs[length].dxdy)) { + segs[length].dydx = (SplashCoord)1 / segs[length].dxdy; + } else { + segs[length].dxdy = segs[length].dydx = 0; + if (splashAbs(x1 - x0) > splashAbs(y1 - y0)) { + segs[length].flags |= splashXPathHoriz; + } else { + segs[length].flags |= splashXPathVert; + } + } +#else + segs[length].dxdy = (x1 - x0) / (y1 - y0); + segs[length].dydx = (SplashCoord)1 / segs[length].dxdy; +#endif + } + if (y0 > y1) { + segs[length].flags |= splashXPathFlip; + } + ++length; +} + +struct cmpXPathSegsFunctor { + bool operator()(const SplashXPathSeg &seg0, const SplashXPathSeg &seg1) { + SplashCoord x0, y0, x1, y1; + + if (seg0.flags & splashXPathFlip) { + x0 = seg0.x1; + y0 = seg0.y1; + } else { + x0 = seg0.x0; + y0 = seg0.y0; + } + if (seg1.flags & splashXPathFlip) { + x1 = seg1.x1; + y1 = seg1.y1; + } else { + x1 = seg1.x0; + y1 = seg1.y0; + } + return (y0 != y1) ? (y0 < y1) : (x0 < x1); + } +}; + +void SplashXPath::aaScale() { + SplashXPathSeg *seg; + int i; + + for (i = 0, seg = segs; i < length; ++i, ++seg) { + seg->x0 *= splashAASize; + seg->y0 *= splashAASize; + seg->x1 *= splashAASize; + seg->y1 *= splashAASize; + } +} + +void SplashXPath::sort() { + std::sort(segs, segs + length, cmpXPathSegsFunctor()); +} diff --git a/splash/SplashXPath.h b/splash/SplashXPath.h new file mode 100644 index 0000000..db06978 --- /dev/null +++ b/splash/SplashXPath.h @@ -0,0 +1,92 @@ +//======================================================================== +// +// SplashXPath.h +// +//======================================================================== + +#ifndef SPLASHXPATH_H +#define SPLASHXPATH_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashPath; +struct SplashXPathAdjust; + +//------------------------------------------------------------------------ + +#define splashMaxCurveSplits (1 << 10) + +//------------------------------------------------------------------------ +// SplashXPathSeg +//------------------------------------------------------------------------ + +struct SplashXPathSeg { + SplashCoord x0, y0; // first endpoint + SplashCoord x1, y1; // second endpoint + SplashCoord dxdy; // slope: delta-x / delta-y + SplashCoord dydx; // slope: delta-y / delta-x + Guint flags; +}; + +#define splashXPathHoriz 0x01 // segment is vertical (y0 == y1) + // (dxdy is undef) +#define splashXPathVert 0x02 // segment is horizontal (x0 == x1) + // (dydx is undef) +#define splashXPathFlip 0x04 // y0 > y1 + +//------------------------------------------------------------------------ +// SplashXPath +//------------------------------------------------------------------------ + +class SplashXPath { +public: + + // Expands (converts to segments) and flattens (converts curves to + // lines) . Transforms all points from user space to device + // space, via . If is true, closes all open + // subpaths. + SplashXPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool closeSubpaths); + + // Copy an expanded path. + SplashXPath *copy() { return new SplashXPath(this); } + + ~SplashXPath(); + + // Multiply all coordinates by splashAASize, in preparation for + // anti-aliased rendering. + void aaScale(); + + // Sort by upper coordinate (lower y), in y-major order. + void sort(); + +protected: + + SplashXPath(SplashXPath *xPath); + void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo); + void strokeAdjust(SplashXPathAdjust *adjust, + SplashCoord *xp, SplashCoord *yp); + void grow(int nSegs); + void addCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord flatness, + GBool first, GBool last, GBool end0, GBool end1); + void addSegment(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + + SplashXPathSeg *segs; + int length, size; // length and size of segs array + + friend class SplashXPathScanner; + friend class SplashClip; + friend class Splash; +}; + +#endif diff --git a/splash/SplashXPathScanner.cc b/splash/SplashXPathScanner.cc new file mode 100644 index 0000000..738cef7 --- /dev/null +++ b/splash/SplashXPathScanner.cc @@ -0,0 +1,534 @@ +//======================================================================== +// +// SplashXPathScanner.cc +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008, 2010 Albert Astals Cid +// Copyright (C) 2010 Paweł Wiejacha +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "goo/gmem.h" +#include "SplashMath.h" +#include "SplashXPath.h" +#include "SplashBitmap.h" +#include "SplashXPathScanner.h" + +//------------------------------------------------------------------------ + +struct SplashIntersect { + int y; + int x0, x1; // intersection of segment with [y, y+1) + int count; // EO/NZWN counter increment +}; + +struct cmpIntersectFunctor { + bool operator()(const SplashIntersect &i0, const SplashIntersect &i1) { + return (i0.y != i1.y) ? (i0.y < i1.y) : (i0.x0 < i1.x0); + } +}; + +//------------------------------------------------------------------------ +// SplashXPathScanner +//------------------------------------------------------------------------ + +SplashXPathScanner::SplashXPathScanner(SplashXPath *xPathA, GBool eoA, + int clipYMin, int clipYMax) { + SplashXPathSeg *seg; + SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP; + int i; + + xPath = xPathA; + eo = eoA; + partialClip = gFalse; + + // compute the bbox + if (xPath->length == 0) { + xMin = yMin = 1; + xMax = yMax = 0; + } else { + seg = &xPath->segs[0]; + if (seg->x0 <= seg->x1) { + xMinFP = seg->x0; + xMaxFP = seg->x1; + } else { + xMinFP = seg->x1; + xMaxFP = seg->x0; + } + if (seg->flags & splashXPathFlip) { + yMinFP = seg->y1; + yMaxFP = seg->y0; + } else { + yMinFP = seg->y0; + yMaxFP = seg->y1; + } + for (i = 1; i < xPath->length; ++i) { + seg = &xPath->segs[i]; + if (seg->x0 < xMinFP) { + xMinFP = seg->x0; + } else if (seg->x0 > xMaxFP) { + xMaxFP = seg->x0; + } + if (seg->x1 < xMinFP) { + xMinFP = seg->x1; + } else if (seg->x1 > xMaxFP) { + xMaxFP = seg->x1; + } + if (seg->flags & splashXPathFlip) { + if (seg->y0 > yMaxFP) { + yMaxFP = seg->y0; + } + } else { + if (seg->y1 > yMaxFP) { + yMaxFP = seg->y1; + } + } + } + xMin = splashFloor(xMinFP); + xMax = splashFloor(xMaxFP); + yMin = splashFloor(yMinFP); + yMax = splashFloor(yMaxFP); + if (clipYMin > yMin) { + yMin = clipYMin; + partialClip = gTrue; + } + if (clipYMax < yMax) { + yMax = clipYMax; + partialClip = gTrue; + } + } + + allInter = NULL; + inter = NULL; + computeIntersections(); + interY = yMin - 1; +} + +SplashXPathScanner::~SplashXPathScanner() { + gfree(inter); + gfree(allInter); +} + +void SplashXPathScanner::getBBoxAA(int *xMinA, int *yMinA, + int *xMaxA, int *yMaxA) { + *xMinA = xMin / splashAASize; + *yMinA = yMin / splashAASize; + *xMaxA = xMax / splashAASize; + *yMaxA = yMax / splashAASize; +} + +void SplashXPathScanner::getSpanBounds(int y, int *spanXMin, int *spanXMax) { + int interBegin, interEnd, xx, i; + + if (y < yMin || y > yMax) { + interBegin = interEnd = 0; + } else { + interBegin = inter[y - yMin]; + interEnd = inter[y - yMin + 1]; + } + if (interBegin < interEnd) { + *spanXMin = allInter[interBegin].x0; + xx = allInter[interBegin].x1; + for (i = interBegin + 1; i < interEnd; ++i) { + if (allInter[i].x1 > xx) { + xx = allInter[i].x1; + } + } + *spanXMax = xx; + } else { + *spanXMin = xMax + 1; + *spanXMax = xMax; + } +} + +GBool SplashXPathScanner::test(int x, int y) { + int interBegin, interEnd, count, i; + + if (y < yMin || y > yMax) { + return gFalse; + } + interBegin = inter[y - yMin]; + interEnd = inter[y - yMin + 1]; + count = 0; + for (i = interBegin; i < interEnd && allInter[i].x0 <= x; ++i) { + if (x <= allInter[i].x1) { + return gTrue; + } + count += allInter[i].count; + } + return eo ? (count & 1) : (count != 0); +} + +GBool SplashXPathScanner::testSpan(int x0, int x1, int y) { + int interBegin, interEnd, count, xx1, i; + + if (y < yMin || y > yMax) { + return gFalse; + } + interBegin = inter[y - yMin]; + interEnd = inter[y - yMin + 1]; + count = 0; + for (i = interBegin; i < interEnd && allInter[i].x1 < x0; ++i) { + count += allInter[i].count; + } + + // invariant: the subspan [x0,xx1] is inside the path + xx1 = x0 - 1; + while (xx1 < x1) { + if (i >= interEnd) { + return gFalse; + } + if (allInter[i].x0 > xx1 + 1 && + !(eo ? (count & 1) : (count != 0))) { + return gFalse; + } + if (allInter[i].x1 > xx1) { + xx1 = allInter[i].x1; + } + count += allInter[i].count; + ++i; + } + + return gTrue; +} + +GBool SplashXPathScanner::getNextSpan(int y, int *x0, int *x1) { + int interEnd, xx0, xx1; + + if (y < yMin || y > yMax) { + return gFalse; + } + if (interY != y) { + interY = y; + interIdx = inter[y - yMin]; + interCount = 0; + } + interEnd = inter[y - yMin + 1]; + if (interIdx >= interEnd) { + return gFalse; + } + xx0 = allInter[interIdx].x0; + xx1 = allInter[interIdx].x1; + interCount += allInter[interIdx].count; + ++interIdx; + while (interIdx < interEnd && + (allInter[interIdx].x0 <= xx1 || + (eo ? (interCount & 1) : (interCount != 0)))) { + if (allInter[interIdx].x1 > xx1) { + xx1 = allInter[interIdx].x1; + } + interCount += allInter[interIdx].count; + ++interIdx; + } + *x0 = xx0; + *x1 = xx1; + return gTrue; +} + +void SplashXPathScanner::computeIntersections() { + SplashXPathSeg *seg; + SplashCoord segXMin, segXMax, segYMin, segYMax, xx0, xx1; + int x, y, y0, y1, i; + + if (yMin > yMax) { + return; + } + + // build the list of all intersections + allInterLen = 0; + allInterSize = 16; + allInter = (SplashIntersect *)gmallocn(allInterSize, + sizeof(SplashIntersect)); + for (i = 0; i < xPath->length; ++i) { + seg = &xPath->segs[i]; + if (seg->flags & splashXPathFlip) { + segYMin = seg->y1; + segYMax = seg->y0; + } else { + segYMin = seg->y0; + segYMax = seg->y1; + } + if (seg->flags & splashXPathHoriz) { + y = splashFloor(seg->y0); + if (y >= yMin && y <= yMax) { + addIntersection(segYMin, segYMax, seg->flags, + y, splashFloor(seg->x0), splashFloor(seg->x1)); + } + } else if (seg->flags & splashXPathVert) { + y0 = splashFloor(segYMin); + if (y0 < yMin) { + y0 = yMin; + } + y1 = splashFloor(segYMax); + if (y1 > yMax) { + y1 = yMax; + } + x = splashFloor(seg->x0); + for (y = y0; y <= y1; ++y) { + addIntersection(segYMin, segYMax, seg->flags, y, x, x); + } + } else { + if (seg->x0 < seg->x1) { + segXMin = seg->x0; + segXMax = seg->x1; + } else { + segXMin = seg->x1; + segXMax = seg->x0; + } + y0 = splashFloor(segYMin); + if (y0 < yMin) { + y0 = yMin; + } + y1 = splashFloor(segYMax); + if (y1 > yMax) { + y1 = yMax; + } + // this loop could just add seg->dxdy to xx1 on each iteration, + // but that introduces numerical accuracy problems + xx1 = seg->x0 + ((SplashCoord)y0 - seg->y0) * seg->dxdy; + for (y = y0; y <= y1; ++y) { + xx0 = xx1; + xx1 = seg->x0 + ((SplashCoord)(y + 1) - seg->y0) * seg->dxdy; + // the segment may not actually extend to the top and/or bottom edges + if (xx0 < segXMin) { + xx0 = segXMin; + } else if (xx0 > segXMax) { + xx0 = segXMax; + } + if (xx1 < segXMin) { + xx1 = segXMin; + } else if (xx1 > segXMax) { + xx1 = segXMax; + } + addIntersection(segYMin, segYMax, seg->flags, y, + splashFloor(xx0), splashFloor(xx1)); + } + } + } + std::sort(allInter, allInter + allInterLen, cmpIntersectFunctor()); + + // build the list of y pointers + inter = (int *)gmallocn(yMax - yMin + 2, sizeof(int)); + i = 0; + for (y = yMin; y <= yMax; ++y) { + inter[y - yMin] = i; + while (i < allInterLen && allInter[i].y <= y) { + ++i; + } + } + inter[yMax - yMin + 1] = i; +} + +void SplashXPathScanner::addIntersection(double segYMin, double segYMax, + Guint segFlags, + int y, int x0, int x1) { + if (allInterLen == allInterSize) { + allInterSize *= 2; + allInter = (SplashIntersect *)greallocn(allInter, allInterSize, + sizeof(SplashIntersect)); + } + allInter[allInterLen].y = y; + if (x0 < x1) { + allInter[allInterLen].x0 = x0; + allInter[allInterLen].x1 = x1; + } else { + allInter[allInterLen].x0 = x1; + allInter[allInterLen].x1 = x0; + } + if (segYMin <= y && + (SplashCoord)y < segYMax && + !(segFlags & splashXPathHoriz)) { + allInter[allInterLen].count = eo ? 1 + : (segFlags & splashXPathFlip) ? 1 : -1; + } else { + allInter[allInterLen].count = 0; + } + ++allInterLen; +} + +void SplashXPathScanner::renderAALine(SplashBitmap *aaBuf, + int *x0, int *x1, int y) { + int xx0, xx1, xx, xxMin, xxMax, yy, interEnd; + Guchar mask; + SplashColorPtr p; + + memset(aaBuf->getDataPtr(), 0, aaBuf->getRowSize() * aaBuf->getHeight()); + xxMin = aaBuf->getWidth(); + xxMax = -1; + if (yMin <= yMax) { + if (splashAASize * y < yMin) { + interIdx = inter[0]; + } else if (splashAASize * y > yMax) { + interIdx = inter[yMax - yMin + 1]; + } else { + interIdx = inter[splashAASize * y - yMin]; + } + for (yy = 0; yy < splashAASize; ++yy) { + if (splashAASize * y + yy < yMin) { + interEnd = inter[0]; + } else if (splashAASize * y + yy > yMax) { + interEnd = inter[yMax - yMin + 1]; + } else { + interEnd = inter[splashAASize * y + yy - yMin + 1]; + } + interCount = 0; + while (interIdx < interEnd) { + xx0 = allInter[interIdx].x0; + xx1 = allInter[interIdx].x1; + interCount += allInter[interIdx].count; + ++interIdx; + while (interIdx < interEnd && + (allInter[interIdx].x0 <= xx1 || + (eo ? (interCount & 1) : (interCount != 0)))) { + if (allInter[interIdx].x1 > xx1) { + xx1 = allInter[interIdx].x1; + } + interCount += allInter[interIdx].count; + ++interIdx; + } + if (xx0 < 0) { + xx0 = 0; + } + ++xx1; + if (xx1 > aaBuf->getWidth()) { + xx1 = aaBuf->getWidth(); + } + // set [xx0, xx1) to 1 + if (xx0 < xx1) { + xx = xx0; + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); + if (xx & 7) { + mask = 0xff >> (xx & 7); + if ((xx & ~7) == (xx1 & ~7)) { + mask &= (Guchar)(0xff00 >> (xx1 & 7)); + } + *p++ |= mask; + xx = (xx & ~7) + 8; + } + for (; xx + 7 < xx1; xx += 8) { + *p++ |= 0xff; + } + if (xx < xx1) { + *p |= (Guchar)(0xff00 >> (xx1 & 7)); + } + } + if (xx0 < xxMin) { + xxMin = xx0; + } + if (xx1 > xxMax) { + xxMax = xx1; + } + } + } + } + if (xxMin > xxMax) { + xxMin = xxMax; + } + *x0 = xxMin / splashAASize; + *x1 = (xxMax - 1) / splashAASize; +} + +void SplashXPathScanner::clipAALine(SplashBitmap *aaBuf, + int *x0, int *x1, int y) { + int xx0, xx1, xx, yy, interEnd; + Guchar mask; + SplashColorPtr p; + + for (yy = 0; yy < splashAASize; ++yy) { + xx = *x0 * splashAASize; + if (yMin <= yMax) { + if (splashAASize * y + yy < yMin) { + interIdx = interEnd = inter[0]; + } else if (splashAASize * y + yy > yMax) { + interIdx = interEnd = inter[yMax - yMin + 1]; + } else { + interIdx = inter[splashAASize * y + yy - yMin]; + if (splashAASize * y + yy > yMax) { + interEnd = inter[yMax - yMin + 1]; + } else { + interEnd = inter[splashAASize * y + yy - yMin + 1]; + } + } + interCount = 0; + while (interIdx < interEnd && xx < (*x1 + 1) * splashAASize) { + xx0 = allInter[interIdx].x0; + xx1 = allInter[interIdx].x1; + interCount += allInter[interIdx].count; + ++interIdx; + while (interIdx < interEnd && + (allInter[interIdx].x0 <= xx1 || + (eo ? (interCount & 1) : (interCount != 0)))) { + if (allInter[interIdx].x1 > xx1) { + xx1 = allInter[interIdx].x1; + } + interCount += allInter[interIdx].count; + ++interIdx; + } + if (xx0 > aaBuf->getWidth()) { + xx0 = aaBuf->getWidth(); + } + // set [xx, xx0) to 0 + if (xx < xx0) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); + if (xx & 7) { + mask = (Guchar)(0xff00 >> (xx & 7)); + if ((xx & ~7) == (xx0 & ~7)) { + mask |= 0xff >> (xx0 & 7); + } + *p++ &= mask; + xx = (xx & ~7) + 8; + } + for (; xx + 7 < xx0; xx += 8) { + *p++ = 0x00; + } + if (xx < xx0) { + *p &= 0xff >> (xx0 & 7); + } + } + if (xx1 >= xx) { + xx = xx1 + 1; + } + } + } + xx0 = (*x1 + 1) * splashAASize; + if (xx0 > aaBuf->getWidth()) xx0 = aaBuf->getWidth(); + // set [xx, xx0) to 0 + if (xx < xx0) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); + if (xx & 7) { + mask = (Guchar)(0xff00 >> (xx & 7)); + if ((xx & ~7) == (xx0 & ~7)) { + mask &= 0xff >> (xx0 & 7); + } + *p++ &= mask; + xx = (xx & ~7) + 8; + } + for (; xx + 7 < xx0; xx += 8) { + *p++ = 0x00; + } + if (xx < xx0) { + *p &= 0xff >> (xx0 & 7); + } + } + } +} diff --git a/splash/SplashXPathScanner.h b/splash/SplashXPathScanner.h new file mode 100644 index 0000000..719fae4 --- /dev/null +++ b/splash/SplashXPathScanner.h @@ -0,0 +1,93 @@ +//======================================================================== +// +// SplashXPathScanner.h +// +//======================================================================== + +#ifndef SPLASHXPATHSCANNER_H +#define SPLASHXPATHSCANNER_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashXPath; +class SplashBitmap; +struct SplashIntersect; + +//------------------------------------------------------------------------ +// SplashXPathScanner +//------------------------------------------------------------------------ + +class SplashXPathScanner { +public: + + // Create a new SplashXPathScanner object. must be sorted. + SplashXPathScanner(SplashXPath *xPathA, GBool eoA, + int clipYMin, int clipYMax); + + ~SplashXPathScanner(); + + // Return the path's bounding box. + void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + + // Return the path's bounding box. + void getBBoxAA(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA); + + // Returns true if at least part of the path was outside the + // clipYMin/clipYMax bounds passed to the constructor. + GBool hasPartialClip() { return partialClip; } + + // Return the min/max x values for the span at . + void getSpanBounds(int y, int *spanXMin, int *spanXMax); + + // Returns true if (,) is inside the path. + GBool test(int x, int y); + + // Returns true if the entire span ([,], ) is inside the + // path. + GBool testSpan(int x0, int x1, int y); + + // Returns the next span inside the path at . If is + // different than the previous call to getNextSpan, this returns the + // first span at ; otherwise it returns the next span (relative + // to the previous call to getNextSpan). Returns false if there are + // no more spans at . + GBool getNextSpan(int y, int *x0, int *x1); + + // Renders one anti-aliased line into . Returns the min and + // max x coordinates with non-zero pixels in and . + void renderAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); + + // Clips an anti-aliased line by setting pixels to zero. On entry, + // all non-zero pixels are between and . This function + // will update and . + void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); + +private: + + void computeIntersections(); + void addIntersection(double segYMin, double segYMax, + Guint segFlags, + int y, int x0, int x1); + + SplashXPath *xPath; + GBool eo; + int xMin, yMin, xMax, yMax; + GBool partialClip; + + SplashIntersect *allInter; // array of intersections + int allInterLen; // number of intersections in + int allInterSize; // size of the array + int *inter; // indexes into for each y value + int interY; // current y value - used by getNextSpan + int interIdx; // current index into - used by + // getNextSpan + int interCount; // current EO/NZWN counter - used by + // getNextSpan +}; + +#endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..cff715c --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,51 @@ + +if (ENABLE_SPLASH) + + if (HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP) + set (perf_test_SRCS + perf-test.cc + perf-test-preview-dummy.cc + ) + add_executable(perf-test ${perf_test_SRCS}) + target_link_libraries(perf-test poppler) + if (LIB_RT_HAS_NANOSLEEP) + target_link_libraries(perf-test rt) + endif (LIB_RT_HAS_NANOSLEEP) + endif (HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP) + +endif (ENABLE_SPLASH) + +if (GTK_FOUND) + + add_definitions(${GTK2_CFLAGS}) + + include_directories( + ${CMAKE_SOURCE_DIR}/glib + ${CMAKE_BINARY_DIR}/glib + ) + + set (gtk_splash_test_SRCS + gtk-test.cc + ) + poppler_add_test(gtk-test BUILD_GTK_TESTS ${gtk_splash_test_SRCS}) + target_link_libraries(gtk-test poppler-glib ${GTK2_LIBRARIES}) + + if (HAVE_CAIRO) + + set (pdf_inspector_SRCS + pdf-inspector.cc + ) + poppler_add_test(pdf-inspector BUILD_GTK_TESTS ${pdf_inspector_SRCS}) + target_link_libraries(pdf-inspector poppler-glib ${GTK2_LIBRARIES}) + + endif (HAVE_CAIRO) + +endif (GTK_FOUND) + +set (pdf_fullrewrite_SRCS + pdf-fullrewrite.cc +) +add_executable(pdf-fullrewrite ${pdf_fullrewrite_SRCS}) +target_link_libraries(pdf-fullrewrite poppler) + + diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..0252911 --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,88 @@ +if BUILD_GTK_TEST + +if BUILD_SPLASH_OUTPUT + +splash_includes = \ + -I$(top_srcdir)/splash + +endif + +if BUILD_CAIRO_OUTPUT + +pdf_inspector = \ + pdf_inspector + +cairo_includes = \ + $(CAIRO_CFLAGS) \ + $(FREETYPE_CFLAGS) + +endif + +gtk_test = \ + gtk-test + +endif + +if BUILD_SPLASH_OUTPUT + +perf_test = \ + perf-test + +endif + +pdf_fullrewrite = \ + pdf-fullrewrite + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + -I$(top_srcdir)/glib \ + -I$(top_builddir)/glib \ + $(cairo_includes) \ + $(GTK_TEST_CFLAGS) \ + $(FONTCONFIG_CFLAGS) + +noinst_PROGRAMS = $(pdf_inspector) $(perf_test) $(pdf_fullrewrite) $(gtk_test) + +AM_LDFLAGS = @auto_import_flags@ + +gtk_test_SOURCES = \ + gtk-test.cc + +gtk_test_LDADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(CAIRO_LIBS) \ + $(GTK_TEST_LIBS) \ + $(FONTCONFIG_LIBS) + + +pdf_inspector_SOURCES = \ + pdf-inspector.cc + +pdf_inspector_LDADD = \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(top_builddir)/poppler/libpoppler.la \ + $(CAIRO_LIBS) \ + $(FREETYPE_LIBS) \ + $(GTK_TEST_LIBS) \ + $(X_EXTRA_LIBS) + +perf_test_SOURCES = \ + perf-test.cc \ + perf-test-preview-dummy.cc + +perf_test_LDADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(FREETYPE_LIBS) \ + $(X_EXTRA_LIBS) + +pdf_fullrewrite_SOURCES = \ + pdf-fullrewrite.cc + +pdf_fullrewrite_LDADD = \ + $(top_builddir)/poppler/libpoppler.la + +EXTRA_DIST = \ + pdf-operators.c \ + pdf-inspector.ui diff --git a/test/Makefile.in b/test/Makefile.in new file mode 100644 index 0000000..d1f7fc8 --- /dev/null +++ b/test/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ + $(am__EXEEXT_4) +subdir = test +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@am__EXEEXT_1 = pdf_inspector$(EXEEXT) +@BUILD_SPLASH_OUTPUT_TRUE@am__EXEEXT_2 = perf-test$(EXEEXT) +am__EXEEXT_3 = pdf-fullrewrite$(EXEEXT) +@BUILD_GTK_TEST_TRUE@am__EXEEXT_4 = gtk-test$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am_gtk_test_OBJECTS = gtk-test.$(OBJEXT) +gtk_test_OBJECTS = $(am_gtk_test_OBJECTS) +am__DEPENDENCIES_1 = +gtk_test_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/glib/libpoppler-glib.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am_pdf_fullrewrite_OBJECTS = pdf-fullrewrite.$(OBJEXT) +pdf_fullrewrite_OBJECTS = $(am_pdf_fullrewrite_OBJECTS) +pdf_fullrewrite_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la +am_pdf_inspector_OBJECTS = pdf-inspector.$(OBJEXT) +pdf_inspector_OBJECTS = $(am_pdf_inspector_OBJECTS) +pdf_inspector_DEPENDENCIES = \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(top_builddir)/poppler/libpoppler.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_perf_test_OBJECTS = perf-test.$(OBJEXT) \ + perf-test-preview-dummy.$(OBJEXT) +perf_test_OBJECTS = $(am_perf_test_OBJECTS) +perf_test_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(gtk_test_SOURCES) $(pdf_fullrewrite_SOURCES) \ + $(pdf_inspector_SOURCES) $(perf_test_SOURCES) +DIST_SOURCES = $(gtk_test_SOURCES) $(pdf_fullrewrite_SOURCES) \ + $(pdf_inspector_SOURCES) $(perf_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +@BUILD_GTK_TEST_TRUE@@BUILD_SPLASH_OUTPUT_TRUE@splash_includes = \ +@BUILD_GTK_TEST_TRUE@@BUILD_SPLASH_OUTPUT_TRUE@ -I$(top_srcdir)/splash + +@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@pdf_inspector = \ +@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@ pdf_inspector + +@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@cairo_includes = \ +@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@ $(CAIRO_CFLAGS) \ +@BUILD_CAIRO_OUTPUT_TRUE@@BUILD_GTK_TEST_TRUE@ $(FREETYPE_CFLAGS) + +@BUILD_GTK_TEST_TRUE@gtk_test = \ +@BUILD_GTK_TEST_TRUE@ gtk-test + +@BUILD_SPLASH_OUTPUT_TRUE@perf_test = \ +@BUILD_SPLASH_OUTPUT_TRUE@ perf-test + +pdf_fullrewrite = \ + pdf-fullrewrite + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/poppler \ + -I$(top_srcdir)/glib \ + -I$(top_builddir)/glib \ + $(cairo_includes) \ + $(GTK_TEST_CFLAGS) \ + $(FONTCONFIG_CFLAGS) + +AM_LDFLAGS = @auto_import_flags@ +gtk_test_SOURCES = \ + gtk-test.cc + +gtk_test_LDADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(top_builddir)/glib/libpoppler-glib.la \ + $(CAIRO_LIBS) \ + $(GTK_TEST_LIBS) \ + $(FONTCONFIG_LIBS) + +pdf_inspector_SOURCES = \ + pdf-inspector.cc + +pdf_inspector_LDADD = \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(top_builddir)/poppler/libpoppler.la \ + $(CAIRO_LIBS) \ + $(FREETYPE_LIBS) \ + $(GTK_TEST_LIBS) \ + $(X_EXTRA_LIBS) + +perf_test_SOURCES = \ + perf-test.cc \ + perf-test-preview-dummy.cc + +perf_test_LDADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(FREETYPE_LIBS) \ + $(X_EXTRA_LIBS) + +pdf_fullrewrite_SOURCES = \ + pdf-fullrewrite.cc + +pdf_fullrewrite_LDADD = \ + $(top_builddir)/poppler/libpoppler.la + +EXTRA_DIST = \ + pdf-operators.c \ + pdf-inspector.ui + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +gtk-test$(EXEEXT): $(gtk_test_OBJECTS) $(gtk_test_DEPENDENCIES) $(EXTRA_gtk_test_DEPENDENCIES) + @rm -f gtk-test$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(gtk_test_OBJECTS) $(gtk_test_LDADD) $(LIBS) +pdf-fullrewrite$(EXEEXT): $(pdf_fullrewrite_OBJECTS) $(pdf_fullrewrite_DEPENDENCIES) $(EXTRA_pdf_fullrewrite_DEPENDENCIES) + @rm -f pdf-fullrewrite$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdf_fullrewrite_OBJECTS) $(pdf_fullrewrite_LDADD) $(LIBS) +pdf_inspector$(EXEEXT): $(pdf_inspector_OBJECTS) $(pdf_inspector_DEPENDENCIES) $(EXTRA_pdf_inspector_DEPENDENCIES) + @rm -f pdf_inspector$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdf_inspector_OBJECTS) $(pdf_inspector_LDADD) $(LIBS) +perf-test$(EXEEXT): $(perf_test_OBJECTS) $(perf_test_DEPENDENCIES) $(EXTRA_perf_test_DEPENDENCIES) + @rm -f perf-test$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(perf_test_OBJECTS) $(perf_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf-fullrewrite.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf-inspector.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf-test-preview-dummy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf-test.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/gtk-test.cc b/test/gtk-test.cc new file mode 100644 index 0000000..dd339fb --- /dev/null +++ b/test/gtk-test.cc @@ -0,0 +1,397 @@ +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "Object.h" +#include "SplashOutputDev.h" +#include "GfxState.h" + +#include + +#include "PDFDoc.h" +#include "GlobalParams.h" +#include "ErrorCodes.h" +#include +#include +#include +#include + +static int page = 0; +static gboolean cairo_output = FALSE; +static gboolean splash_output = FALSE; +static const char **file_arguments = NULL; +static const GOptionEntry options[] = { + { "cairo", 'c', 0, G_OPTION_ARG_NONE, &cairo_output, "Cairo Output Device", NULL}, + { "splash", 's', 0, G_OPTION_ARG_NONE, &splash_output, "Splash Output Device", NULL}, + { "page", 'p', 0, G_OPTION_ARG_INT, &page, "Page number", "PAGE" }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, "PDF-FILES…" }, + { NULL } +}; + +static GList *view_list = NULL; + +//------------------------------------------------------------------------ + +#define xOutMaxRGBCube 6 // max size of RGB color cube + +//------------------------------------------------------------------------ +// GDKSplashOutputDev +//------------------------------------------------------------------------ + +class GDKSplashOutputDev: public SplashOutputDev { +public: + + GDKSplashOutputDev(GdkScreen *screen, + void (*redrawCbkA)(void *data), + void *redrawCbkDataA, SplashColor sc); + + virtual ~GDKSplashOutputDev(); + + //----- initialization and control + + // End a page. + virtual void endPage(); + + // Dump page contents to display. + virtual void dump(); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- special access + + // Clear out the document (used when displaying an empty window). + void clear(); + + // Copy the rectangle (srcX, srcY, width, height) to (destX, destY) + // in destDC. + void redraw(int srcX, int srcY, + cairo_t *cr, + int destX, int destY, + int width, int height); + +private: + + int incrementalUpdate; + void (*redrawCbk)(void *data); + void *redrawCbkData; +}; + +typedef struct +{ + PopplerDocument *doc; + GtkWidget *drawing_area; + GtkWidget *spin_button; + cairo_surface_t *surface; + GDKSplashOutputDev *out; +} View; + +//------------------------------------------------------------------------ +// Constants and macros +//------------------------------------------------------------------------ + +#define xoutRound(x) ((int)(x + 0.5)) + +//------------------------------------------------------------------------ +// GDKSplashOutputDev +//------------------------------------------------------------------------ + +GDKSplashOutputDev::GDKSplashOutputDev(GdkScreen *screen, + void (*redrawCbkA)(void *data), + void *redrawCbkDataA, SplashColor sc): + SplashOutputDev(splashModeRGB8, 4, gFalse, sc), + incrementalUpdate (1) +{ + redrawCbk = redrawCbkA; + redrawCbkData = redrawCbkDataA; +} + +GDKSplashOutputDev::~GDKSplashOutputDev() { +} + +void GDKSplashOutputDev::clear() { + startDoc(NULL); + startPage(0, NULL); +} + +void GDKSplashOutputDev::endPage() { + SplashOutputDev::endPage(); + if (!incrementalUpdate) { + (*redrawCbk)(redrawCbkData); + } +} + +void GDKSplashOutputDev::dump() { + if (incrementalUpdate && redrawCbk) { + (*redrawCbk)(redrawCbkData); + } +} + +void GDKSplashOutputDev::updateFont(GfxState *state) { + SplashOutputDev::updateFont(state); +} + +void GDKSplashOutputDev::redraw(int srcX, int srcY, + cairo_t *cr, + int destX, int destY, + int width, int height) { + GdkPixbuf *pixbuf; + int gdk_rowstride; + + gdk_rowstride = getBitmap()->getRowSize(); + pixbuf = gdk_pixbuf_new_from_data (getBitmap()->getDataPtr() + srcY * gdk_rowstride + srcX * 3, + GDK_COLORSPACE_RGB, FALSE, 8, + width, height, gdk_rowstride, + NULL, NULL); + + gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); + cairo_paint (cr); + + g_object_unref (pixbuf); +} + +static gboolean +drawing_area_expose (GtkWidget *drawing_area, + GdkEventExpose *event, + View *view) +{ + cairo_t *cr; + GdkRectangle document; + GdkRectangle draw; + + gdk_window_clear (drawing_area->window); + + document.x = 0; + document.y = 0; + if (cairo_output) { + document.width = cairo_image_surface_get_width (view->surface); + document.height = cairo_image_surface_get_height (view->surface); + } else { + document.width = view->out->getBitmapWidth(); + document.height = view->out->getBitmapHeight(); + } + + cr = gdk_cairo_create (drawing_area->window); + if (!gdk_rectangle_intersect (&document, &event->area, &draw)) + return FALSE; + + if (cairo_output) { + cairo_set_source_surface (cr, view->surface, 0, 0); + cairo_paint (cr); + } else { + view->out->redraw (draw.x, draw.y, + cr, + draw.x, draw.y, + draw.width, draw.height); + } + + cairo_destroy (cr); + + return TRUE; +} + +static void +view_set_page (View *view, int page) +{ + int w, h; + + if (cairo_output) { + cairo_t *cr; + double width, height; + PopplerPage *poppler_page; + + poppler_page = poppler_document_get_page (view->doc, page); + poppler_page_get_size (poppler_page, &width, &height); + w = (int) ceil(width); + h = (int) ceil(height); + + if (view->surface) + cairo_surface_destroy (view->surface); + view->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h); + + cr = cairo_create (view->surface); + poppler_page_render (poppler_page, cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_destroy (cr); + g_object_unref (poppler_page); + } else { + view->doc->doc->displayPage (view->out, page + 1, 72, 72, 0, gFalse, gTrue, gTrue); + w = view->out->getBitmapWidth(); + h = view->out->getBitmapHeight(); + } + + gtk_widget_set_size_request (view->drawing_area, w, h); + gtk_widget_queue_draw (view->drawing_area); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (view->spin_button), page); +} + +static void +redraw_callback (void *data) +{ + View *view = (View*) data; + + gtk_widget_queue_draw (view->drawing_area); +} + +static void +view_free (View *view) +{ + if (G_UNLIKELY (!view)) + return; + + g_object_unref (view->doc); + delete view->out; + cairo_surface_destroy (view->surface); + g_slice_free (View, view); +} + +static void +destroy_window_callback (GtkWindow *window, View *view) +{ + view_list = g_list_remove (view_list, view); + view_free (view); + + if (!view_list) + gtk_main_quit (); +} + +static void +page_changed_callback (GtkSpinButton *button, View *view) +{ + int page; + + page = gtk_spin_button_get_value_as_int (button); + view_set_page (view, page); +} + +static View * +view_new (PopplerDocument *doc) +{ + View *view; + GtkWidget *window; + GtkWidget *sw; + GtkWidget *vbox, *hbox; + guint n_pages; + + view = g_slice_new0 (View); + + view->doc = doc; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "destroy", + G_CALLBACK (destroy_window_callback), + view); + + vbox = gtk_vbox_new (FALSE, 5); + + view->drawing_area = gtk_drawing_area_new (); + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), + view->drawing_area); + gtk_widget_show (view->drawing_area); + + gtk_box_pack_end (GTK_BOX (vbox), sw, TRUE, TRUE, 0); + gtk_widget_show (sw); + + hbox = gtk_hbox_new (FALSE, 5); + + n_pages = poppler_document_get_n_pages (doc); + view->spin_button = gtk_spin_button_new_with_range (0, n_pages - 1, 1); + g_signal_connect (view->spin_button, "value-changed", + G_CALLBACK (page_changed_callback), view); + + gtk_box_pack_end (GTK_BOX (hbox), view->spin_button, FALSE, TRUE, 0); + gtk_widget_show (view->spin_button); + + gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); + + gtk_container_add (GTK_CONTAINER (window), vbox); + gtk_widget_show (vbox); + + gtk_widget_show (window); + + + if (!cairo_output) { + SplashColor sc = { 255, 255, 255}; + + view->out = new GDKSplashOutputDev (gtk_widget_get_screen (window), + redraw_callback, (void*) view, sc); + view->out->startDoc(view->doc->doc); + } + + g_signal_connect (view->drawing_area, + "expose_event", + G_CALLBACK (drawing_area_expose), + view); + + return view; +} + +int +main (int argc, char *argv []) +{ + GOptionContext *ctx; + + if (argc == 1) { + char *basename = g_path_get_basename (argv[0]); + + g_printerr ("usage: %s PDF-FILES…\n", basename); + g_free (basename); + + return -1; + } + + ctx = g_option_context_new (NULL); + g_option_context_add_main_entries (ctx, options, "main"); + g_option_context_parse (ctx, &argc, &argv, NULL); + g_option_context_free (ctx); + + gtk_init (&argc, &argv); + + globalParams = new GlobalParams(); + + for (int i = 0; file_arguments[i]; i++) { + View *view; + GFile *file; + gchar *uri; + PopplerDocument *doc; + GError *error = NULL; + + file = g_file_new_for_commandline_arg (file_arguments[i]); + uri = g_file_get_uri (file); + g_object_unref (file); + + doc = poppler_document_new_from_file (uri, NULL, &error); + if (!doc) { + g_printerr ("Error opening document %s: %s\n", uri, error->message); + g_error_free (error); + g_free (uri); + + continue; + } + + view = view_new (doc); + view_list = g_list_prepend (view_list, view); + view_set_page (view, CLAMP (page, 0, poppler_document_get_n_pages (doc) - 1)); + g_free (uri); + } + + gtk_main (); + + delete globalParams; + + return 0; +} diff --git a/test/pdf-fullrewrite.cc b/test/pdf-fullrewrite.cc new file mode 100644 index 0000000..9658e55 --- /dev/null +++ b/test/pdf-fullrewrite.cc @@ -0,0 +1,46 @@ +//======================================================================== +// +// pdf-fullrewrite.cc +// +// Copyright 2007 Julien Rebetez +// +//======================================================================== +#include "config.h" +#include +#include "GlobalParams.h" +#include "Error.h" +#include "PDFDoc.h" +#include "goo/GooString.h" + +int main (int argc, char *argv[]) +{ + PDFDoc *doc; + GooString *inputName, *outputName; + + // parse args + if (argc < 3) { + fprintf(stderr, "usage: %s INPUT-FILE OUTPUT-FILE\n", argv[0]); + return 1; + } + + inputName = new GooString(argv[1]); + outputName = new GooString(argv[2]); + + globalParams = new GlobalParams(); + + doc = new PDFDoc(inputName); + + if (!doc->isOk()) { + delete doc; + fprintf(stderr, "Error loading document !\n"); + return 1; + } + + + int res = doc->saveAs(outputName, writeForceRewrite); + + delete doc; + delete globalParams; + delete outputName; + return res; +} diff --git a/test/pdf-inspector.cc b/test/pdf-inspector.cc new file mode 100644 index 0000000..5598db6 --- /dev/null +++ b/test/pdf-inspector.cc @@ -0,0 +1,374 @@ +//======================================================================== +// +// GDKSplashOutputDev.cc +// +// Copyright 2003 Glyph & Cog, LLC +// Copyright 2004 Red Hat, Inc. (GDK port) +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "Object.h" +#include "ProfileData.h" +#include "GfxState.h" + +#include +#include "CairoOutputDev.h" + +#include "PDFDoc.h" +#include "GlobalParams.h" +#include "ErrorCodes.h" +#include + + +// Mapping +#include "pdf-operators.c" + +enum { + OP_STRING, + OP_COUNT, + OP_TOTAL, + OP_MIN, + OP_MAX, + N_COLUMNS +}; + +class PdfInspector { +public: + + PdfInspector(void); + + void set_file_name (const char *file_name); + void load (const char *file_name); + void run (void); + void error_dialog (const char *error_message); + void analyze_page (int page); + +private: + static void on_file_activated (GtkWidget *widget, PdfInspector *inspector); + static void on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector); + static void on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector); + + GtkBuilder* builder; + GtkTreeModel *model; + PDFDoc *doc; + CairoOutputDev *output; +}; + + + +PdfInspector::PdfInspector(void) +{ + GtkWidget *widget; + GError* error = NULL; + + builder = gtk_builder_new (); + + if (!gtk_builder_add_from_file (builder, "./pdf-inspector.ui", &error)) + { + g_warning ("Couldn't load builder file: %s", error->message); + g_error_free (error); + } + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button")); + g_signal_connect (widget, "selection-changed", G_CALLBACK (on_file_activated), this); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button")); + g_signal_connect (widget, "clicked", G_CALLBACK (on_analyze_clicked), this); + + // setup the TreeView + widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_tree_view")); + g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)), + "changed", G_CALLBACK (on_selection_changed), this); + model = (GtkTreeModel *)gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT, + G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE); + gtk_tree_view_set_model (GTK_TREE_VIEW (widget), model); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget), + 0, "Operation", + gtk_cell_renderer_text_new (), + "text", OP_STRING, + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget), + 1, "Count", + gtk_cell_renderer_text_new (), + "text", OP_COUNT, + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget), + 2, "Elapsed", + gtk_cell_renderer_text_new (), + "text", OP_TOTAL, + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget), + 3, "Min", + gtk_cell_renderer_text_new (), + "text", OP_MIN, + NULL); + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget), + 4, "Max", + gtk_cell_renderer_text_new (), + "text", OP_MAX, + NULL); + + for (int i = 0; i < N_COLUMNS; i++) + { + GtkTreeViewColumn *column; + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), i); + gtk_tree_view_column_set_sort_column_id (column, i); + } + doc = NULL; + output = new CairoOutputDev(); + output->setPrinting (gFalse); + + // set up initial widgets + load (NULL); +} + +void +PdfInspector::set_file_name(const char *file_name) +{ + GtkWidget *widget; + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button")); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), file_name); +} + +void +PdfInspector::on_file_activated (GtkWidget *widget, PdfInspector *inspector) +{ + gchar *file_name; + + file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); + if (file_name) + inspector->load (file_name); + + g_free (file_name); +} + +void +PdfInspector::on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector) +{ + GtkWidget *label; + size_t i; + GtkTreeModel *model; + GtkTreeIter iter; + gchar *op = NULL; + + label = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "description_label")); + gtk_label_set_markup (GTK_LABEL (label), "No Description"); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + { + gtk_tree_model_get (model, &iter, + OP_STRING, &op, + -1); + + } + + if (op == NULL) + return; + + for (i = 0; i < G_N_ELEMENTS (op_mapping); i++) + { + + if (!strcmp (op, op_mapping[i].op)) + { + gchar *text; + text = g_strdup_printf ("%s", op_mapping[i].description); + gtk_label_set_markup (GTK_LABEL (label), text); + g_free (text); + break; + } + } + + g_free (op); +} + +void +PdfInspector::on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector) +{ + GtkWidget *spin; + int page; + + spin = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "pdf_spin")); + + page = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin)); + + inspector->analyze_page (page); + +} + +void +PdfInspector::analyze_page (int page) +{ + GooHashIter *iter; + GooHash *hash; + GooString *key; + void *p; + GtkWidget *label; + char *text; + cairo_t *cr; + cairo_surface_t *surface; + + label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label")); + + output->startProfile (); + gtk_list_store_clear (GTK_LIST_STORE (model)); + + GooTimer timer; + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + doc->getPageCropWidth(page + 1), + doc->getPageCropHeight(page + 1)); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + output->setCairo (cr); + cairo_destroy (cr); + doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gFalse); + output->setCairo (NULL); + + // Total time; + text = g_strdup_printf ("%g", timer.getElapsed ()); + gtk_label_set_text (GTK_LABEL (label), text); + g_free (text); + + // Individual times; + hash = output->endProfile (); + hash->startIter(&iter); + while (hash->getNext(&iter, &key, &p)) + { + GtkTreeIter tree_iter; + ProfileData *data_p = (ProfileData *) p; + + gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter); + gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter, + OP_STRING, key->getCString(), + OP_COUNT, data_p->getCount (), + OP_TOTAL, data_p->getTotal (), + OP_MIN, data_p->getMin (), + OP_MAX, data_p->getMax (), + -1); + } + hash->killIter(&iter); + deleteGooHash (hash, ProfileData); +} + +void +PdfInspector::load(const char *file_name) +{ + GtkWidget *spin; + GtkWidget *button; + GtkWidget *label; + + // kill the old PDF file + if (doc != NULL) + { + delete doc; + doc = NULL; + } + + // load the new file + if (file_name) + { + GooString *filename_g; + + filename_g = new GooString (file_name); + doc = new PDFDoc(filename_g, 0, 0); + delete filename_g; + } + + if (doc && !doc->isOk()) + { + this->error_dialog ("Failed to load file."); + delete doc; + doc = NULL; + } + + spin = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_spin")); + button = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button")); + label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label")); + gtk_label_set_text (GTK_LABEL (label), ""); + + if (doc) + { + gtk_widget_set_sensitive (spin, TRUE); + gtk_widget_set_sensitive (button, TRUE); + gtk_widget_set_sensitive (label, TRUE); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 0, doc->getNumPages()-1); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0); + + output->startDoc (doc); + } + else + { + gtk_widget_set_sensitive (spin, FALSE); + gtk_widget_set_sensitive (button, FALSE); + gtk_widget_set_sensitive (label, FALSE); + } +} + +void +PdfInspector::error_dialog (const char *error_message) +{ + g_warning ("%s", error_message); +} + +void +PdfInspector::run() +{ + GtkWidget *dialog; + + dialog = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_dialog")); + + gtk_dialog_run (GTK_DIALOG (dialog)); +} + + + +int +main (int argc, char *argv []) +{ + const char *file_name = NULL; + PdfInspector *inspector; + + gtk_init (&argc, &argv); + + globalParams = new GlobalParams(); + globalParams->setProfileCommands (true); + globalParams->setPrintCommands (true); + + if (argc == 2) + file_name = argv[1]; + else if (argc > 2) + { + fprintf (stderr, "usage: %s [PDF-FILE]\n", argv[0]); + return -1; + } + + inspector = new PdfInspector (); + + if (file_name) + inspector->set_file_name (file_name); + + inspector->run (); + + delete inspector; + delete globalParams; + + return 0; +} + + diff --git a/test/pdf-inspector.ui b/test/pdf-inspector.ui new file mode 100644 index 0000000..8e20b2f --- /dev/null +++ b/test/pdf-inspector.ui @@ -0,0 +1,416 @@ + + + + + 100 + 0 + 10 + 1 + 10 + 1 + + + 6 + True + PDF Inspector + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 600 + 400 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + + + True + False + 12 + + + True + GTK_BUTTONBOX_END + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + 0 + False + True + GTK_PACK_END + + + + + 6 + True + False + 12 + + + True + 2 + 2 + False + 6 + 12 + + + True + _File: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + True + Page Number + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + True + Select A File + GTK_FILE_CHOOSER_ACTION_OPEN + True + False + -1 + + + 1 + 2 + 0 + 1 + fill + + + + + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + adjustment1 + + + 1 + 2 + 1 + 2 + + + + + + 0 + False + True + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + True + False + 6 + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + True + 2 + 3 + False + 6 + 12 + + + True + Total time elapsed: + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 3 + 1 + 2 + fill + + + + + + True + Description: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + fill + + + + + True + <i>No Description</i> + False + True + GTK_JUSTIFY_LEFT + True + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 0 + 1 + fill + + + + + True + 0.5 + 0 + 0.0 + 0.0 + 0 + 0 + 0 + 0 + + + True + True + _Analyze + True + GTK_RELIEF_NORMAL + True + + + + + 2 + 3 + 0 + 1 + fill + fill + + + + + 0 + False + True + + + + + + + + + True + <b>PDF Instructions</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + closebutton1 + + + diff --git a/test/pdf-operators.c b/test/pdf-operators.c new file mode 100644 index 0000000..a174df1 --- /dev/null +++ b/test/pdf-operators.c @@ -0,0 +1,81 @@ +typedef struct +{ + const char *op; + const char *description; +} OperatorMapping; + +OperatorMapping op_mapping[] = { + { "b", "Close, fill, and stroke path using nonzero winding number rule" }, + { "B", "Fill and stroke path using nonzero winding number rule" }, + { "b*", "Close, fill, and stroke path using even-odd rule" }, + { "B*", "Fill and stroke path using even-odd rule" }, + { "BDC", "(PDF 1.2) Begin marked-content sequence with property list" }, + { "BI", "Begin inline image object" }, + { "BMC", "(PDF 1.2) Begin marked-content sequence" }, + { "BT", "Begin text object" }, + { "BX", "(PDF 1.1) Begin compatibility section" }, + { "c", "Append curved segment to path (three control points)" }, + { "cm", "Concatenate matrix to current transformation matrix" }, + { "CS", "(PDF 1.1) Set color space for stroking operations" }, + { "cs", "(PDF 1.1) Set color space for nonstroking operations" }, + { "d", "Set line dash pattern" }, + { "d0", "Set glyph width in Type 3 font" }, + { "d1", "Set glyph width and bounding box in Type 3 font" }, + { "Do", "Invoke named XObject" }, + { "DP", "(PDF 1.2) Define marked-content point with property list" }, + { "EI", "End inline image object" }, + { "EMC", "(PDF 1.2) End marked-content sequence" }, + { "ET", "End text object" }, + { "EX", "(PDF 1.1) End compatibility section" }, + { "f", "Fill path using nonzero winding number rule" }, + { "F", "Fill path using nonzero winding number rule (obsolete)" }, + { "f*", "Fill path using even-odd rule" }, + { "G", "Set gray level for stroking operations" }, + { "g", "Set gray level for nonstroking operations" }, + { "gs", "(PDF 1.2) Set parameters from graphics state parameter dictionary" }, + { "h", "Close subpath" }, + { "i", "Set flatness tolerance" }, + { "ID", "Begin inline image data" }, + { "j", "Set line join style" }, + { "J", "Set line cap style" }, + { "K", "Set CMYK color for stroking operations" }, + { "k", "Set CMYK color for nonstroking operations" }, + { "l", "Append straight line segment to path" }, + { "m", "Begin new subpath" }, + { "M", "Set miter limit" }, + { "MP", "(PDF 1.2) Define marked-content point" }, + { "n", "End path without filling or stroking" }, + { "q", "Save graphics state" }, + { "Q", "Restore graphics state" }, + { "re", "Append rectangle to path" }, + { "RG", "Set RGB color for stroking operations" }, + { "rg", "Set RGB color for nonstroking operations" }, + { "ri", "Set color rendering intent" }, + { "s", "Close and stroke path" }, + { "S", "Stroke path" }, + { "SC", "(PDF 1.1) Set color for stroking operations" }, + { "sc", "(PDF 1.1) Set color for nonstroking operations" }, + { "SCN", "(PDF 1.2) Set color for stroking operations (ICCBased and special color spaces)" }, + { "scn", "(PDF 1.2) Set color for nonstroking operations (ICCBased and special color spaces)" }, + { "sh", "(PDF 1.3) Paint area defined by shading pattern" }, + { "T*", "Move to start of next text line" }, + { "Tc", "Set character spacing" }, + { "Td", "Move text position" }, + { "TD", "Move text position and set leading" }, + { "Tf", "Set text font and size" }, + { "Tj", "Show text" }, + { "TJ", "Show text, allowing individual glyph positioning" }, + { "TL", "Set text leading" }, + { "Tm", "Set text matrix and text line matrix" }, + { "Tr", "Set text rendering mode" }, + { "Ts", "Set text rise" }, + { "Tw", "Set word spacing" }, + { "Tz", "Set horizontal text scaling" }, + { "v", "Append curved segment to path (initial point replicated)" }, + { "w", "Set line width" }, + { "W", "Set clipping path using nonzero winding number rule" }, + { "W*", "Set clipping path using even-odd rule" }, + { "y", "Append curved segment to path (final point replicated)" }, + { "'", "Move to next line and show text" }, + { "\"", "Set word and character spacing, move to next line, and show text" }, +}; diff --git a/test/perf-test-preview-dummy.cc b/test/perf-test-preview-dummy.cc new file mode 100644 index 0000000..09f7d0f --- /dev/null +++ b/test/perf-test-preview-dummy.cc @@ -0,0 +1,22 @@ +/* Copyright Krzysztof Kowalczyk 2006-2007 + License: GPLv2 */ + +/* This is a no-op preview support for perf-test. +Using this perf-test still works for performance testing, you just don't +get any visual feedback during testing. +*/ + +#include "splash/SplashBitmap.h" + +void PreviewBitmapSplash(SplashBitmap *bmpSplash) +{ +} + +void PreviewBitmapDestroy(void) +{ +} + +void PreviewBitmapInit(void) +{ +} + diff --git a/test/perf-test.cc b/test/perf-test.cc new file mode 100644 index 0000000..6bdda97 --- /dev/null +++ b/test/perf-test.cc @@ -0,0 +1,1279 @@ +/* Copyright Krzysztof Kowalczyk 2006-2007 + Copyright Hib Eris 2008 + License: GPLv2 */ +/* + A tool to stress-test poppler rendering and measure rendering times for + very simplistic performance measuring. + + TODO: + * make it work with cairo output as well + * print more info about document like e.g. enumarate images, + streams, compression, encryption, password-protection. Each should have + a command-line arguments to turn it on/off + * never over-write file given as -out argument (optionally, provide -force + option to force writing the -out file). It's way too easy too lose results + of a previous run. +*/ + +#ifdef _MSC_VER +// this sucks but I don't know any other way +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif + +#ifdef _WIN32 +#include +#else +#include +#endif + +// Define COPY_FILE if you want the file to be copied to a local disk first +// before it's tested. This is desired if a file is on a slow drive. +// Currently copying only works on Windows. +// Not enabled by default. +//#define COPY_FILE 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_DIRENT_H +#include +#endif + +#include "Error.h" +#include "ErrorCodes.h" +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "goo/GooTimer.h" +#include "GlobalParams.h" +#include "splash/SplashBitmap.h" +#include "Object.h" /* must be included before SplashOutputDev.h because of sloppiness in SplashOutputDev.h */ +#include "SplashOutputDev.h" +#include "TextOutputDev.h" +#include "PDFDoc.h" +#include "Link.h" + +#ifdef _MSC_VER +#define strdup _strdup +#define strcasecmp _stricmp +#endif + +#define dimof(X) (sizeof(X)/sizeof((X)[0])) + +#define INVALID_PAGE_NO -1 + +/* Those must be implemented in order to provide preview during execution. + They can be no-ops. An implementation for windows is in + perf-test-preview-win.cc +*/ +extern void PreviewBitmapInit(void); +extern void PreviewBitmapDestroy(void); +extern void PreviewBitmapSplash(SplashBitmap *bmpSplash); + +class PdfEnginePoppler { +public: + PdfEnginePoppler(); + ~PdfEnginePoppler(); + + const char *fileName(void) const { return _fileName; }; + + void setFileName(const char *fileName) { + assert(!_fileName); + _fileName = (char*)strdup(fileName); + } + + int pageCount(void) const { return _pageCount; } + + bool load(const char *fileName); + SplashBitmap *renderBitmap(int pageNo, double zoomReal, int rotation); + + SplashOutputDev * outputDevice(); +private: + char * _fileName; + int _pageCount; + + PDFDoc * _pdfDoc; + SplashOutputDev * _outputDev; +}; + +typedef struct StrList { + struct StrList *next; + char * str; +} StrList; + +/* List of all command-line arguments that are not switches. + We assume those are: + - names of PDF files + - names of a file with a list of PDF files + - names of directories with PDF files +*/ +static StrList *gArgsListRoot = NULL; + +/* Names of all command-line switches we recognize */ +#define TIMINGS_ARG "-timings" +#define RESOLUTION_ARG "-resolution" +#define RECURSIVE_ARG "-recursive" +#define OUT_ARG "-out" +#define PREVIEW_ARG "-preview" +#define SLOW_PREVIEW_ARG "-slowpreview" +#define LOAD_ONLY_ARG "-loadonly" +#define PAGE_ARG "-page" +#define TEXT_ARG "-text" + +/* Should we record timings? True if -timings command-line argument was given. */ +static bool gfTimings = false; + +/* If true, we use render each page at resolution 'gResolutionX'/'gResolutionY'. + If false, we render each page at its native resolution. + True if -resolution NxM command-line argument was given. */ +static bool gfForceResolution = false; +static int gResolutionX = 0; +static int gResolutionY = 0; +/* If NULL, we output the log info to stdout. If not NULL, should be a name + of the file to which we output log info. + Controled by -out command-line argument. */ +static char * gOutFileName = NULL; +/* FILE * correspondig to gOutFileName or stdout if gOutFileName is NULL or + was invalid name */ +static FILE * gOutFile = NULL; +/* FILE * correspondig to gOutFileName or stderr if gOutFileName is NULL or + was invalid name */ +static FILE * gErrFile = NULL; + +/* If True and a directory is given as a command-line argument, we'll process + pdf files in sub-directories as well. + Controlled by -recursive command-line argument */ +static bool gfRecursive = false; + +/* If true, preview rendered image. To make sure that they're being rendered correctly. */ +static bool gfPreview = false; + +/* 1 second (1000 milliseconds) */ +#define SLOW_PREVIEW_TIME 1000 + +/* If true, preview rendered image in a slow mode i.e. delay displaying for + SLOW_PREVIEW_TIME. This is so that a human has enough time to see if the + PDF renders ok. In release mode on fast processor pages take only ~100-200 ms + to render and they go away too quickly to be inspected by a human. */ +static bool gfSlowPreview = false; + +/* If true, we only dump the text, not render */ +static bool gfTextOnly = false; + +#define PAGE_NO_NOT_GIVEN -1 + +/* If equals PAGE_NO_NOT_GIVEN, we're in default mode where we render all pages. + If different, will only render this page */ +static int gPageNo = PAGE_NO_NOT_GIVEN; +/* If true, will only load the file, not render any pages. Mostly for + profiling load time */ +static bool gfLoadOnly = false; + +#define PDF_FILE_DPI 72 + +#define MAX_FILENAME_SIZE 1024 + +/* DOS is 0xd 0xa */ +#define DOS_NEWLINE "\x0d\x0a" +/* Mac is single 0xd */ +#define MAC_NEWLINE "\x0d" +/* Unix is single 0xa (10) */ +#define UNIX_NEWLINE "\x0a" +#define UNIX_NEWLINE_C 0xa + +#ifdef _WIN32 + #define DIR_SEP_CHAR '\\' + #define DIR_SEP_STR "\\" +#else + #define DIR_SEP_CHAR '/' + #define DIR_SEP_STR "/" +#endif + +void memzero(void *data, size_t len) +{ + memset(data, 0, len); +} + +void *zmalloc(size_t len) +{ + void *data = malloc(len); + if (data) + memzero(data, len); + return data; +} + +/* Concatenate 4 strings. Any string can be NULL. + Caller needs to free() memory. */ +char *str_cat4(const char *str1, const char *str2, const char *str3, const char *str4) +{ + char *str; + char *tmp; + size_t str1_len = 0; + size_t str2_len = 0; + size_t str3_len = 0; + size_t str4_len = 0; + + if (str1) + str1_len = strlen(str1); + if (str2) + str2_len = strlen(str2); + if (str3) + str3_len = strlen(str3); + if (str4) + str4_len = strlen(str4); + + str = (char*)zmalloc(str1_len + str2_len + str3_len + str4_len + 1); + if (!str) + return NULL; + + tmp = str; + if (str1) { + memcpy(tmp, str1, str1_len); + tmp += str1_len; + } + if (str2) { + memcpy(tmp, str2, str2_len); + tmp += str2_len; + } + if (str3) { + memcpy(tmp, str3, str3_len); + tmp += str3_len; + } + if (str4) { + memcpy(tmp, str4, str1_len); + } + return str; +} + +char *str_dup(const char *str) +{ + return str_cat4(str, NULL, NULL, NULL); +} + +bool str_eq(const char *str1, const char *str2) +{ + if (!str1 && !str2) + return true; + if (!str1 || !str2) + return false; + if (0 == strcmp(str1, str2)) + return true; + return false; +} + +bool str_ieq(const char *str1, const char *str2) +{ + if (!str1 && !str2) + return true; + if (!str1 || !str2) + return false; + if (0 == strcasecmp(str1, str2)) + return true; + return false; +} + +bool str_endswith(const char *txt, const char *end) +{ + size_t end_len; + size_t txt_len; + + if (!txt || !end) + return false; + + txt_len = strlen(txt); + end_len = strlen(end); + if (end_len > txt_len) + return false; + if (str_eq(txt+txt_len-end_len, end)) + return true; + return false; +} + +/* TODO: probably should move to some other file and change name to + sleep_milliseconds */ +void sleep_milliseconds(int milliseconds) +{ +#ifdef _WIN32 + Sleep((DWORD)milliseconds); +#else + struct timespec tv; + int secs, nanosecs; + secs = milliseconds / 1000; + nanosecs = (milliseconds - (secs * 1000)) * 1000; + tv.tv_sec = (time_t) secs; + tv.tv_nsec = (long) nanosecs; + while (1) + { + int rval = nanosleep(&tv, &tv); + if (rval == 0) + /* Completed the entire sleep time; all done. */ + return; + else if (errno == EINTR) + /* Interrupted by a signal. Try again. */ + continue; + else + /* Some other error; bail out. */ + return; + } + return; +#endif +} + +#ifndef _MSC_VER +void strcpy_s(char* dst, size_t dst_size, const char* src) +{ + size_t src_size = strlen(src) + 1; + if (src_size <= dst_size) + memcpy(dst, src, src_size); + else { + if (dst_size > 0) { + memcpy(dst, src, dst_size); + dst[dst_size-1] = 0; + } + } +} + +void strcat_s(char *dst, size_t dst_size, const char* src) +{ + size_t dst_len = strlen(dst); + if (dst_len >= dst_size) { + if (dst_size > 0) + dst[dst_size-1] = 0; + return; + } + strcpy_s(dst+dst_len, dst_size - dst_len, src); +} +#endif + +static SplashColorMode gSplashColorMode = splashModeBGR8; + +static SplashColor splashColRed; +static SplashColor splashColGreen; +static SplashColor splashColBlue; +static SplashColor splashColWhite; +static SplashColor splashColBlack; + +#define SPLASH_COL_RED_PTR (SplashColorPtr)&(splashColRed[0]) +#define SPLASH_COL_GREEN_PTR (SplashColorPtr)&(splashColGreen[0]) +#define SPLASH_COL_BLUE_PTR (SplashColorPtr)&(splashColBlue[0]) +#define SPLASH_COL_WHITE_PTR (SplashColorPtr)&(splashColWhite[0]) +#define SPLASH_COL_BLACK_PTR (SplashColorPtr)&(splashColBlack[0]) + +static SplashColorPtr gBgColor = SPLASH_COL_WHITE_PTR; + +static void splashColorSet(SplashColorPtr col, Guchar red, Guchar green, Guchar blue, Guchar alpha) +{ + switch (gSplashColorMode) + { + case splashModeBGR8: + col[0] = blue; + col[1] = green; + col[2] = red; + break; + case splashModeRGB8: + col[0] = red; + col[1] = green; + col[2] = blue; + break; + default: + assert(0); + break; + } +} + +void SplashColorsInit(void) +{ + splashColorSet(SPLASH_COL_RED_PTR, 0xff, 0, 0, 0); + splashColorSet(SPLASH_COL_GREEN_PTR, 0, 0xff, 0, 0); + splashColorSet(SPLASH_COL_BLUE_PTR, 0, 0, 0xff, 0); + splashColorSet(SPLASH_COL_BLACK_PTR, 0, 0, 0, 0); + splashColorSet(SPLASH_COL_WHITE_PTR, 0xff, 0xff, 0xff, 0); +} + +PdfEnginePoppler::PdfEnginePoppler() : + _fileName(0) + , _pageCount(INVALID_PAGE_NO) + , _pdfDoc(NULL) + , _outputDev(NULL) +{ +} + +PdfEnginePoppler::~PdfEnginePoppler() +{ + free(_fileName); + delete _outputDev; + delete _pdfDoc; +} + +bool PdfEnginePoppler::load(const char *fileName) +{ + setFileName(fileName); + /* note: don't delete fileNameStr since PDFDoc takes ownership and deletes them itself */ + GooString *fileNameStr = new GooString(fileName); + if (!fileNameStr) return false; + + _pdfDoc = new PDFDoc(fileNameStr, NULL, NULL, (void*)NULL); + if (!_pdfDoc->isOk()) { + return false; + } + _pageCount = _pdfDoc->getNumPages(); + return true; +} + +SplashOutputDev * PdfEnginePoppler::outputDevice() { + if (!_outputDev) { + GBool bitmapTopDown = gTrue; + _outputDev = new SplashOutputDev(gSplashColorMode, 4, gFalse, gBgColor, bitmapTopDown); + if (_outputDev) + _outputDev->startDoc(_pdfDoc); + } + return _outputDev; +} + +SplashBitmap *PdfEnginePoppler::renderBitmap(int pageNo, double zoomReal, int rotation) +{ + assert(outputDevice()); + if (!outputDevice()) return NULL; + + double hDPI = (double)PDF_FILE_DPI * zoomReal * 0.01; + double vDPI = (double)PDF_FILE_DPI * zoomReal * 0.01; + GBool useMediaBox = gFalse; + GBool crop = gTrue; + GBool doLinks = gTrue; + _pdfDoc->displayPage(_outputDev, pageNo, hDPI, vDPI, rotation, useMediaBox, + crop, doLinks, NULL, NULL); + + SplashBitmap* bmp = _outputDev->takeBitmap(); + return bmp; +} + +struct FindFileState { + char path[MAX_FILENAME_SIZE]; + char dirpath[MAX_FILENAME_SIZE]; /* current dir path */ + char pattern[MAX_FILENAME_SIZE]; /* search pattern */ + const char *bufptr; +#ifdef _WIN32 + WIN32_FIND_DATA fileinfo; + HANDLE dir; +#else + DIR *dir; +#endif +}; + +#ifdef _WIN32 +#include +#include +#include + +__inline char *getcwd(char *buffer, int maxlen) +{ + return _getcwd(buffer, maxlen); +} + +int fnmatch(const char *pattern, const char *string, int flags) +{ + int prefix_len; + const char *star_pos = strchr(pattern, '*'); + if (!star_pos) + return strcmp(pattern, string) != 0; + + prefix_len = (int)(star_pos-pattern); + if (0 == prefix_len) + return 0; + + if (0 == _strnicmp(pattern, string, prefix_len)) + return 0; + + return 1; +} + +#else +#include +#endif + +#ifdef _WIN32 +/* on windows to query dirs we need foo\* to get files in this directory. + foo\ always fails and foo will return just info about foo directory, + not files in this directory */ +static void win_correct_path_for_FindFirstFile(char *path, int path_max_len) +{ + int path_len = strlen(path); + if (path_len >= path_max_len-4) + return; + if (DIR_SEP_CHAR != path[path_len]) + path[path_len++] = DIR_SEP_CHAR; + path[path_len++] = '*'; + path[path_len] = 0; +} +#endif + +FindFileState *find_file_open(const char *path, const char *pattern) +{ + FindFileState *s; + + s = (FindFileState*)malloc(sizeof(FindFileState)); + if (!s) + return NULL; + strcpy_s(s->path, sizeof(s->path), path); + strcpy_s(s->dirpath, sizeof(s->path), path); +#ifdef _WIN32 + win_correct_path_for_FindFirstFile(s->path, sizeof(s->path)); +#endif + strcpy_s(s->pattern, sizeof(s->pattern), pattern); + s->bufptr = s->path; +#ifdef _WIN32 + s->dir = INVALID_HANDLE_VALUE; +#else + s->dir = NULL; +#endif + return s; +} + +#if 0 /* re-enable if we #define USE_OWN_GET_AUTH_DATA */ +void *StandardSecurityHandler::getAuthData() +{ + return NULL; +} +#endif + +char *makepath(char *buf, int buf_size, const char *path, + const char *filename) +{ + strcpy_s(buf, buf_size, path); + int len = strlen(path); + if (len > 0 && path[len - 1] != DIR_SEP_CHAR && len + 1 < buf_size) { + buf[len++] = DIR_SEP_CHAR; + buf[len] = '\0'; + } + strcat_s(buf, buf_size, filename); + return buf; +} + +#ifdef _WIN32 +static int skip_matching_file(const char *filename) +{ + if (0 == strcmp(".", filename)) + return 1; + if (0 == strcmp("..", filename)) + return 1; + return 0; +} +#endif + +int find_file_next(FindFileState *s, char *filename, int filename_size_max) +{ +#ifdef _WIN32 + int fFound; + if (INVALID_HANDLE_VALUE == s->dir) { + s->dir = FindFirstFile(s->path, &(s->fileinfo)); + if (INVALID_HANDLE_VALUE == s->dir) + return -1; + goto CheckFile; + } + + while (1) { + fFound = FindNextFile(s->dir, &(s->fileinfo)); + if (!fFound) + return -1; +CheckFile: + if (skip_matching_file(s->fileinfo.cFileName)) + continue; + if (0 == fnmatch(s->pattern, s->fileinfo.cFileName, 0) ) { + makepath(filename, filename_size_max, s->dirpath, s->fileinfo.cFileName); + return 0; + } + } +#else + struct dirent *dirent; + const char *p; + char *q; + + if (s->dir == NULL) + goto redo; + + for (;;) { + dirent = readdir(s->dir); + if (dirent == NULL) { + redo: + if (s->dir) { + closedir(s->dir); + s->dir = NULL; + } + p = s->bufptr; + if (*p == '\0') + return -1; + /* CG: get_str(&p, s->dirpath, sizeof(s->dirpath), ":") */ + q = s->dirpath; + while (*p != ':' && *p != '\0') { + if ((q - s->dirpath) < (int)sizeof(s->dirpath) - 1) + *q++ = *p; + p++; + } + *q = '\0'; + if (*p == ':') + p++; + s->bufptr = p; + s->dir = opendir(s->dirpath); + if (!s->dir) + goto redo; + } else { + if (fnmatch(s->pattern, dirent->d_name, 0) == 0) { + makepath(filename, filename_size_max, + s->dirpath, dirent->d_name); + return 0; + } + } + } +#endif +} + +void find_file_close(FindFileState *s) +{ +#ifdef _WIN32 + if (INVALID_HANDLE_VALUE != s->dir) + FindClose(s->dir); +#else + if (s->dir) + closedir(s->dir); +#endif + free(s); +} + +int StrList_Len(StrList **root) +{ + int len = 0; + StrList * cur; + assert(root); + if (!root) + return 0; + cur = *root; + while (cur) { + ++len; + cur = cur->next; + } + return len; +} + +int StrList_InsertAndOwn(StrList **root, char *txt) +{ + StrList * el; + assert(root && txt); + if (!root || !txt) + return false; + + el = (StrList*)malloc(sizeof(StrList)); + if (!el) + return false; + el->str = txt; + el->next = *root; + *root = el; + return true; +} + +int StrList_Insert(StrList **root, char *txt) +{ + char *txtDup; + + assert(root && txt); + if (!root || !txt) + return false; + txtDup = str_dup(txt); + if (!txtDup) + return false; + + if (!StrList_InsertAndOwn(root, txtDup)) { + free((void*)txtDup); + return false; + } + return true; +} + +StrList* StrList_RemoveHead(StrList **root) +{ + StrList *tmp; + assert(root); + if (!root) + return NULL; + + if (!*root) + return NULL; + tmp = *root; + *root = tmp->next; + tmp->next = NULL; + return tmp; +} + +void StrList_FreeElement(StrList *el) +{ + if (!el) + return; + free((void*)el->str); + free((void*)el); +} + +void StrList_Destroy(StrList **root) +{ + StrList * cur; + StrList * next; + + if (!root) + return; + cur = *root; + while (cur) { + next = cur->next; + StrList_FreeElement(cur); + cur = next; + } + *root = NULL; +} + +#ifndef _WIN32 +void OutputDebugString(const char *txt) +{ + /* do nothing */ +} +#define _snprintf snprintf +#define _vsnprintf vsnprintf +#endif + +void my_error(void *, ErrorCategory, int pos, char *msg) { +#if 0 + char buf[4096], *p = buf; + + // NB: this can be called before the globalParams object is created + if (globalParams && globalParams->getErrQuiet()) { + return; + } + + if (pos >= 0) { + p += _snprintf(p, sizeof(buf)-1, "Error (%d): ", pos); + *p = '\0'; + OutputDebugString(p); + } else { + OutputDebugString("Error: "); + } + + p = buf; + p += _vsnprintf(p, sizeof(buf) - 1, msg, args); + while ( p > buf && isspace(p[-1]) ) + *--p = '\0'; + *p++ = '\r'; + *p++ = '\n'; + *p = '\0'; + OutputDebugString(buf); + + if (pos >= 0) { + p += _snprintf(p, sizeof(buf)-1, "Error (%d): ", pos); + *p = '\0'; + OutputDebugString(buf); + if (gErrFile) + fprintf(gErrFile, buf); + } else { + OutputDebugString("Error: "); + if (gErrFile) + fprintf(gErrFile, "Error: "); + } +#endif +#if 0 + p = buf; + va_start(args, msg); + p += _vsnprintf(p, sizeof(buf) - 3, msg, args); + while ( p > buf && isspace(p[-1]) ) + *--p = '\0'; + *p++ = '\r'; + *p++ = '\n'; + *p = '\0'; + OutputDebugString(buf); + if (gErrFile) + fprintf(gErrFile, buf); + va_end(args); +#endif +} + +void LogInfo(const char *fmt, ...) +{ + va_list args; + char buf[4096], *p = buf; + + p = buf; + va_start(args, fmt); + p += _vsnprintf(p, sizeof(buf) - 1, fmt, args); + *p = '\0'; + fprintf(gOutFile, "%s", buf); + va_end(args); + fflush(gOutFile); +} + +static void PrintUsageAndExit(int argc, char **argv) +{ + printf("Usage: pdftest [-preview|-slowpreview] [-loadonly] [-timings] [-text] [-resolution NxM] [-recursive] [-page N] [-out out.txt] pdf-files-to-process\n"); + for (int i=0; i < argc; i++) { + printf("i=%d, '%s'\n", i, argv[i]); + } + exit(0); +} + +static bool ShowPreview(void) +{ + if (gfPreview || gfSlowPreview) + return true; + return false; +} + +static void RenderPdfAsText(const char *fileName) +{ + GooString * fileNameStr = NULL; + PDFDoc * pdfDoc = NULL; + GooString * txt = NULL; + int pageCount; + double timeInMs; + + assert(fileName); + if (!fileName) + return; + + LogInfo("started: %s\n", fileName); + + TextOutputDev * textOut = new TextOutputDev(NULL, gTrue, 0, gFalse, gFalse); + if (!textOut->isOk()) { + delete textOut; + return; + } + + GooTimer msTimer; + /* note: don't delete fileNameStr since PDFDoc takes ownership and deletes them itself */ + fileNameStr = new GooString(fileName); + if (!fileNameStr) + goto Exit; + + pdfDoc = new PDFDoc(fileNameStr, NULL, NULL, NULL); + if (!pdfDoc->isOk()) { + error(errIO, -1, "RenderPdfFile(): failed to open PDF file {0:s}\n", fileName); + goto Exit; + } + + msTimer.stop(); + timeInMs = msTimer.getElapsed(); + LogInfo("load: %.2f ms\n", timeInMs); + + pageCount = pdfDoc->getNumPages(); + LogInfo("page count: %d\n", pageCount); + + for (int curPage = 1; curPage <= pageCount; curPage++) { + if ((gPageNo != PAGE_NO_NOT_GIVEN) && (gPageNo != curPage)) + continue; + + msTimer.start(); + int rotate = 0; + GBool useMediaBox = gFalse; + GBool crop = gTrue; + GBool doLinks = gFalse; + pdfDoc->displayPage(textOut, curPage, 72, 72, rotate, useMediaBox, crop, doLinks); + txt = textOut->getText(0.0, 0.0, 10000.0, 10000.0); + msTimer.stop(); + timeInMs = msTimer.getElapsed(); + if (gfTimings) + LogInfo("page %d: %.2f ms\n", curPage, timeInMs); + printf("%s\n", txt->getCString()); + delete txt; + txt = NULL; + } + +Exit: + LogInfo("finished: %s\n", fileName); + delete textOut; + delete pdfDoc; +} + +#ifdef _MSC_VER +#define POPPLER_TMP_NAME "c:\\poppler_tmp.pdf" +#else +#define POPPLER_TMP_NAME "/tmp/poppler_tmp.pdf" +#endif + +static void RenderPdf(const char *fileName) +{ + const char * fileNameSplash = NULL; + PdfEnginePoppler * engineSplash = NULL; + int pageCount; + double timeInMs; + +#ifdef COPY_FILE + // TODO: fails if file already exists and has read-only attribute + CopyFile(fileName, POPPLER_TMP_NAME, false); + fileNameSplash = POPPLER_TMP_NAME; +#else + fileNameSplash = fileName; +#endif + LogInfo("started: %s\n", fileName); + + engineSplash = new PdfEnginePoppler(); + + GooTimer msTimer; + if (!engineSplash->load(fileNameSplash)) { + LogInfo("failed to load splash\n"); + goto Error; + } + msTimer.stop(); + timeInMs = msTimer.getElapsed(); + LogInfo("load splash: %.2f ms\n", timeInMs); + pageCount = engineSplash->pageCount(); + + LogInfo("page count: %d\n", pageCount); + if (gfLoadOnly) + goto Error; + + for (int curPage = 1; curPage <= pageCount; curPage++) { + if ((gPageNo != PAGE_NO_NOT_GIVEN) && (gPageNo != curPage)) + continue; + + SplashBitmap *bmpSplash = NULL; + + GooTimer msTimer; + bmpSplash = engineSplash->renderBitmap(curPage, 100.0, 0); + msTimer.stop(); + double timeInMs = msTimer.getElapsed(); + if (gfTimings) { + if (!bmpSplash) + LogInfo("page splash %d: failed to render\n", curPage); + else + LogInfo("page splash %d (%dx%d): %.2f ms\n", curPage, bmpSplash->getWidth(), bmpSplash->getHeight(), timeInMs); + } + + if (ShowPreview()) { + PreviewBitmapSplash(bmpSplash); + if (gfSlowPreview) + sleep_milliseconds(SLOW_PREVIEW_TIME); + } + delete bmpSplash; + } +Error: + delete engineSplash; + LogInfo("finished: %s\n", fileName); +} + +static void RenderFile(const char *fileName) +{ + if (gfTextOnly) { + RenderPdfAsText(fileName); + return; + } + + RenderPdf(fileName); +} + +static bool ParseInteger(const char *start, const char *end, int *intOut) +{ + char numBuf[16]; + int digitsCount; + const char * tmp; + + assert(start && end && intOut); + assert(end >= start); + if (!start || !end || !intOut || (start > end)) + return false; + + digitsCount = 0; + tmp = start; + while (tmp <= end) { + if (isspace(*tmp)) { + /* do nothing, we allow whitespace */ + } else if (!isdigit(*tmp)) + return false; + numBuf[digitsCount] = *tmp; + ++digitsCount; + if (digitsCount == dimof(numBuf)-3) /* -3 to be safe */ + return false; + ++tmp; + } + if (0 == digitsCount) + return false; + numBuf[digitsCount] = 0; + *intOut = atoi(numBuf); + return true; +} + +/* Given 'resolutionString' in format NxM (e.g. "100x200"), parse the string and put N + into 'resolutionXOut' and M into 'resolutionYOut'. + Return false if there was an error (e.g. string is not in the right format */ +static bool ParseResolutionString(const char *resolutionString, int *resolutionXOut, int *resolutionYOut) +{ + const char * posOfX; + + assert(resolutionString); + assert(resolutionXOut); + assert(resolutionYOut); + if (!resolutionString || !resolutionXOut || !resolutionYOut) + return false; + *resolutionXOut = 0; + *resolutionYOut = 0; + posOfX = strchr(resolutionString, 'X'); + if (!posOfX) + posOfX = strchr(resolutionString, 'x'); + if (!posOfX) + return false; + if (posOfX == resolutionString) + return false; + if (!ParseInteger(resolutionString, posOfX-1, resolutionXOut)) + return false; + if (!ParseInteger(posOfX+1, resolutionString+strlen(resolutionString)-1, resolutionYOut)) + return false; + return true; +} + +static void ParseCommandLine(int argc, char **argv) +{ + char * arg; + + if (argc < 2) + PrintUsageAndExit(argc, argv); + + for (int i=1; i < argc; i++) { + arg = argv[i]; + assert(arg); + if ('-' == arg[0]) { + if (str_ieq(arg, TIMINGS_ARG)) { + gfTimings = true; + } else if (str_ieq(arg, RESOLUTION_ARG)) { + ++i; + if (i == argc) + PrintUsageAndExit(argc, argv); /* expect a file name after that */ + if (!ParseResolutionString(argv[i], &gResolutionX, &gResolutionY)) + PrintUsageAndExit(argc, argv); + gfForceResolution = true; + } else if (str_ieq(arg, RECURSIVE_ARG)) { + gfRecursive = true; + } else if (str_ieq(arg, OUT_ARG)) { + /* expect a file name after that */ + ++i; + if (i == argc) + PrintUsageAndExit(argc, argv); + gOutFileName = str_dup(argv[i]); + } else if (str_ieq(arg, PREVIEW_ARG)) { + gfPreview = true; + } else if (str_ieq(arg, TEXT_ARG)) { + gfTextOnly = true; + } else if (str_ieq(arg, SLOW_PREVIEW_ARG)) { + gfSlowPreview = true; + } else if (str_ieq(arg, LOAD_ONLY_ARG)) { + gfLoadOnly = true; + } else if (str_ieq(arg, PAGE_ARG)) { + /* expect an integer after that */ + ++i; + if (i == argc) + PrintUsageAndExit(argc, argv); + gPageNo = atoi(argv[i]); + if (gPageNo < 1) + PrintUsageAndExit(argc, argv); + } else { + /* unknown option */ + PrintUsageAndExit(argc, argv); + } + } else { + /* we assume that this is not an option hence it must be + a name of PDF/directory/file with PDF names */ + StrList_Insert(&gArgsListRoot, arg); + } + } +} + +#if 0 +void RenderFileList(char *pdfFileList) +{ + char *data = NULL; + char *dataNormalized = NULL; + char *pdfFileName; + uint64_t fileSize; + + assert(pdfFileList); + if (!pdfFileList) + return; + data = file_read_all(pdfFileList, &fileSize); + if (!data) { + error(-1, "couldn't load file '%s'", pdfFileList); + return; + } + dataNormalized = str_normalize_newline(data, UNIX_NEWLINE); + if (!dataNormalized) { + error(-1, "couldn't normalize data of file '%s'", pdfFileList); + goto Exit; + } + for (;;) { + pdfFileName = str_split_iter(&dataNormalized, UNIX_NEWLINE_C); + if (!pdfFileName) + break; + str_strip_ws_both(pdfFileName); + if (str_empty(pdfFileName)) { + free((void*)pdfFileName); + continue; + } + RenderFile(pdfFileName); + free((void*)pdfFileName); + } +Exit: + free((void*)dataNormalized); + free((void*)data); +} +#endif + +#ifdef _WIN32 +#include +#include + +bool IsDirectoryName(char *path) +{ + struct _stat buf; + int result; + + result = _stat(path, &buf ); + if (0 != result) + return false; + + if (buf.st_mode & _S_IFDIR) + return true; + + return false; +} + +bool IsFileName(char *path) +{ + struct _stat buf; + int result; + + result = _stat(path, &buf ); + if (0 != result) + return false; + + if (buf.st_mode & _S_IFREG) + return true; + + return false; +} +#else +bool IsDirectoryName(char *path) +{ + /* TODO: implement me */ + return false; +} + +bool IsFileName(char *path) +{ + /* TODO: implement me */ + return true; +} +#endif + +bool IsPdfFileName(char *path) +{ + if (str_endswith(path, ".pdf")) + return true; + return false; +} + +static void RenderDirectory(char *path) +{ + FindFileState * ffs; + char filename[MAX_FILENAME_SIZE]; + StrList * dirList = NULL; + StrList * el; + + StrList_Insert(&dirList, path); + + while (0 != StrList_Len(&dirList)) { + el = StrList_RemoveHead(&dirList); + ffs = find_file_open(el->str, "*"); + while (!find_file_next(ffs, filename, sizeof(filename))) { + if (IsDirectoryName(filename)) { + if (gfRecursive) { + StrList_Insert(&dirList, filename); + } + } else if (IsFileName(filename)) { + if (IsPdfFileName(filename)) { + RenderFile(filename); + } + } + } + find_file_close(ffs); + StrList_FreeElement(el); + } + StrList_Destroy(&dirList); +} + +/* Render 'cmdLineArg', which can be: + - directory name + - name of PDF file + - name of text file with names of PDF files +*/ +static void RenderCmdLineArg(char *cmdLineArg) +{ + assert(cmdLineArg); + if (!cmdLineArg) + return; + if (IsDirectoryName(cmdLineArg)) { + RenderDirectory(cmdLineArg); + } else if (IsFileName(cmdLineArg)) { + if (IsPdfFileName(cmdLineArg)) + RenderFile(cmdLineArg); +#if 0 + else + RenderFileList(cmdLineArg); +#endif + } else { + error(errCommandLine, -1, "unexpected argument '{0:s}'", cmdLineArg); + } +} + +int main(int argc, char **argv) +{ + setErrorCallback(my_error, NULL); + ParseCommandLine(argc, argv); + if (0 == StrList_Len(&gArgsListRoot)) + PrintUsageAndExit(argc, argv); + assert(gArgsListRoot); + + SplashColorsInit(); + globalParams = new GlobalParams(); + if (!globalParams) + return 1; + globalParams->setErrQuiet(gFalse); + globalParams->setBaseDir(""); + + FILE * outFile = NULL; + if (gOutFileName) { + outFile = fopen(gOutFileName, "wb"); + if (!outFile) { + printf("failed to open -out file %s\n", gOutFileName); + return 1; + } + gOutFile = outFile; + } + else + gOutFile = stdout; + + if (gOutFileName) + gErrFile = outFile; + else + gErrFile = stderr; + + PreviewBitmapInit(); + + StrList * curr = gArgsListRoot; + while (curr) { + RenderCmdLineArg(curr->str); + curr = curr->next; + } + if (outFile) + fclose(outFile); + PreviewBitmapDestroy(); + StrList_Destroy(&gArgsListRoot); + delete globalParams; + free(gOutFileName); + return 0; +} + diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt new file mode 100644 index 0000000..4a29841 --- /dev/null +++ b/utils/CMakeLists.txt @@ -0,0 +1,133 @@ + +set(common_srcs + parseargs.cc +) +set(common_libs + poppler +) +if (FONTCONFIG_FOUND) + set(common_libs ${common_libs} ${FONTCONFIG_LIBRARIES}) +endif (FONTCONFIG_FOUND) + +if (ENABLE_SPLASH) + # pdftoppm + set(pdftoppm_SOURCES ${common_srcs} + pdftoppm.cc + ) + add_executable(pdftoppm ${pdftoppm_SOURCES}) + target_link_libraries(pdftoppm ${common_libs}) + install(TARGETS pdftoppm DESTINATION bin) + install(FILES pdftoppm.1 DESTINATION share/man/man1) +endif (ENABLE_SPLASH) + +if (HAVE_CAIRO) + # pdftocairo + set(pdftocairo_SOURCES ${common_srcs} + pdftocairo.cc + ${CMAKE_SOURCE_DIR}/poppler/CairoFontEngine.cc + ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc + ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.cc + ) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${CAIRO_INCLUDE_DIRS} + ) + add_definitions(${CAIRO_CFLAGS}) + add_executable(pdftocairo ${pdftocairo_SOURCES}) + target_link_libraries(pdftocairo ${CAIRO_LIBRARIES} ${FREETYPE_LIBRARIES} ${common_libs}) + if(LCMS_FOUND) + target_link_libraries(pdftocairo ${LCMS_LIBRARIES}) + endif(LCMS_FOUND) + if(LCMS2_FOUND) + target_link_libraries(pdftocairo ${LCMS2_LIBRARIES}) + endif(LCMS2_FOUND) + install(TARGETS pdftocairo DESTINATION bin) + install(FILES pdftocairo.1 DESTINATION share/man/man1) +endif (HAVE_CAIRO) + +# pdfdetach +set(pdfdetach_SOURCES ${common_srcs} + pdfdetach.cc +) +add_executable(pdfdetach ${pdfdetach_SOURCES}) +target_link_libraries(pdfdetach ${common_libs}) +install(TARGETS pdfdetach DESTINATION bin) +install(FILES pdfdetach.1 DESTINATION share/man/man1) + +# pdffonts +set(pdffonts_SOURCES ${common_srcs} + pdffonts.cc +) +add_executable(pdffonts ${pdffonts_SOURCES}) +target_link_libraries(pdffonts ${common_libs}) +install(TARGETS pdffonts DESTINATION bin) +install(FILES pdffonts.1 DESTINATION share/man/man1) + +# pdfimages +set(pdfimages_SOURCES ${common_srcs} + pdfimages.cc + ImageOutputDev.cc + ImageOutputDev.h +) +add_executable(pdfimages ${pdfimages_SOURCES}) +target_link_libraries(pdfimages ${common_libs}) +install(TARGETS pdfimages DESTINATION bin) +install(FILES pdfimages.1 DESTINATION share/man/man1) + +# pdfinfo +set(pdfinfo_SOURCES ${common_srcs} + pdfinfo.cc printencodings.cc +) +add_executable(pdfinfo ${pdfinfo_SOURCES}) +target_link_libraries(pdfinfo ${common_libs}) +install(TARGETS pdfinfo DESTINATION bin) +install(FILES pdfinfo.1 DESTINATION share/man/man1) + +# pdftops +set(pdftops_SOURCES ${common_srcs} + pdftops.cc +) +add_executable(pdftops ${pdftops_SOURCES}) +target_link_libraries(pdftops ${common_libs}) +install(TARGETS pdftops DESTINATION bin) +install(FILES pdftops.1 DESTINATION share/man/man1) + +# pdftotext +set(pdftotext_SOURCES ${common_srcs} + pdftotext.cc printencodings.cc +) +add_executable(pdftotext ${pdftotext_SOURCES}) +target_link_libraries(pdftotext ${common_libs}) +install(TARGETS pdftotext DESTINATION bin) +install(FILES pdftotext.1 DESTINATION share/man/man1) + +# pdftohtml +set(pdftohtml_SOURCES ${common_srcs} + pdftohtml.cc + HtmlFonts.cc + HtmlLinks.cc + HtmlOutputDev.cc +) +add_executable(pdftohtml ${pdftohtml_SOURCES}) +target_link_libraries(pdftohtml ${common_libs}) +install(TARGETS pdftohtml DESTINATION bin) +install(FILES pdftohtml.1 DESTINATION share/man/man1) + +# pdfseparate +set(pdfseparate_SOURCES ${common_srcs} + pdfseparate.cc +) +add_executable(pdfseparate ${pdfseparate_SOURCES}) +target_link_libraries(pdfseparate ${common_libs}) +install(TARGETS pdfseparate DESTINATION bin) +install(FILES pdfseparate.1 DESTINATION share/man/man1) + +# pdfunite +set(pdfunite_SOURCES ${common_srcs} + pdfunite.cc +) +add_executable(pdfunite ${pdfunite_SOURCES}) +target_link_libraries(pdfunite ${common_libs}) +install(TARGETS pdfunite DESTINATION bin) +install(FILES pdfunite.1 DESTINATION share/man/man1) diff --git a/utils/HtmlFonts.cc b/utils/HtmlFonts.cc new file mode 100644 index 0000000..be02c5f --- /dev/null +++ b/utils/HtmlFonts.cc @@ -0,0 +1,386 @@ +//======================================================================== +// +// This file comes from pdftohtml project +// http://pdftohtml.sourceforge.net +// +// Copyright from: +// Gueorgui Ovtcharov +// Rainer Dorsch +// Mikhail Kruk +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007, 2010 Albert Astals Cid +// Copyright (C) 2008 Boris Toloknov +// Copyright (C) 2008 Tomas Are Haavet +// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in) +// Copyright (C) 2011 Joshua Richardson +// Copyright (C) 2011 Stephen Reichling +// Copyright (C) 2012 Igor Slepchin +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "HtmlFonts.h" +#include "HtmlUtils.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" +#include "GfxFont.h" +#include + + struct Fonts{ + const char *Fontname; + const char *name; + }; + +const int font_num=13; + +static Fonts fonts[font_num+1]={ + {"Courier", "Courier" }, + {"Courier-Bold", "Courier"}, + {"Courier-BoldOblique", "Courier"}, + {"Courier-Oblique", "Courier"}, + {"Helvetica", "Helvetica"}, + {"Helvetica-Bold", "Helvetica"}, + {"Helvetica-BoldOblique", "Helvetica"}, + {"Helvetica-Oblique", "Helvetica"}, + {"Symbol", "Symbol" }, + {"Times-Bold", "Times" }, + {"Times-BoldItalic", "Times" }, + {"Times-Italic", "Times" }, + {"Times-Roman", "Times" }, + {" " , "Times" }, +}; + +#define xoutRound(x) ((int)(x + 0.5)) +extern GBool xml; + +GooString* HtmlFont::DefaultFont=new GooString("Times"); // Arial,Helvetica,sans-serif + +HtmlFontColor::HtmlFontColor(GfxRGB rgb){ + r=static_cast(rgb.r/65535.0*255.0); + g=static_cast(rgb.g/65535.0*255.0); + b=static_cast(rgb.b/65535.0*255.0); + if (!(Ok(r)&&Ok(b)&&Ok(g))) { + if (!globalParams->getErrQuiet()) fprintf(stderr, "Error : Bad color (%d,%d,%d) reset to (0,0,0)\n", r, g, b); + r=0;g=0;b=0; + } +} + +GooString *HtmlFontColor::convtoX(unsigned int xcol) const{ + GooString *xret=new GooString(); + char tmp; + unsigned int k; + k = (xcol/16); + if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10); + xret->append(tmp); + k = (xcol%16); + if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10); + xret->append(tmp); + return xret; +} + +GooString *HtmlFontColor::toString() const{ + GooString *tmp=new GooString("#"); + GooString *tmpr=convtoX(r); + GooString *tmpg=convtoX(g); + GooString *tmpb=convtoX(b); + tmp->append(tmpr); + tmp->append(tmpg); + tmp->append(tmpb); + delete tmpr; + delete tmpg; + delete tmpb; + return tmp; +} + +HtmlFont::HtmlFont(GfxFont *font, int _size, GfxRGB rgb){ + //if (col) color=HtmlFontColor(col); + //else color=HtmlFontColor(); + color=HtmlFontColor(rgb); + GooString* ftname=font->getName(); + if (!ftname) ftname = getDefaultFont(); + + GooString *fontname = NULL; + + if( ftname ){ + fontname = new GooString(ftname); + FontName=new GooString(ftname); + } + else { + fontname = NULL; + FontName = NULL; + } + + lineSize = -1; + + size=(_size-1); + italic = gFalse; + bold = gFalse; + rotOrSkewed = gFalse; + + if (font->isBold() || font->getWeight() >= GfxFont::W700) bold=gTrue; + if (font->isItalic()) italic=gTrue; + + if (fontname){ + if (!bold && strstr(fontname->lowerCase()->getCString(),"bold")) { + bold=gTrue; + } + + if (!italic && + (strstr(fontname->lowerCase()->getCString(),"italic")|| + strstr(fontname->lowerCase()->getCString(),"oblique"))) { + italic=gTrue; + } + + int i=0; + while (strcmp(ftname->getCString(),fonts[i].Fontname)&&(igetTextEncoding())) { + return tmp; + } + + for (int i = 0; i < uLen; ++i) { + switch (u[i]) + { + case '"': tmp->append("""); break; + case '&': tmp->append("&"); break; + case '<': tmp->append("<"); break; + case '>': tmp->append(">"); break; + case ' ': tmp->append( !xml && ( i+1 >= uLen || !tmp->getLength() || tmp->getChar( tmp->getLength()-1 ) == ' ' ) ? " " : " " ); + break; + default: + { + // convert unicode to string + if ((n = uMap->mapUnicode(u[i], buf, sizeof(buf))) > 0) { + tmp->append(buf, n); + } + } + } + } + + uMap->decRefCnt(); + return tmp; +} + +GooString* HtmlFont::simple(HtmlFont* font, Unicode* content, int uLen){ + GooString *cont=HtmlFilter (content, uLen); + + /*if (font.isBold()) { + cont->insert(0,"",3); + cont->append("",4); + } + if (font.isItalic()) { + cont->insert(0,"",3); + cont->append("",4); + } */ + + return cont; +} + +HtmlFontAccu::HtmlFontAccu(){ + accu=new std::vector(); +} + +HtmlFontAccu::~HtmlFontAccu(){ + if (accu) delete accu; +} + +int HtmlFontAccu::AddFont(const HtmlFont& font){ + std::vector::iterator i; + for (i=accu->begin();i!=accu->end();i++) + { + if (font.isEqual(*i)) + { + return (int)(i-(accu->begin())); + } + } + + accu->push_back(font); + return (accu->size()-1); +} + +// get CSS font definition for font #i +GooString* HtmlFontAccu::CSStyle(int i, int j){ + GooString *tmp=new GooString(); + GooString *iStr=GooString::fromInt(i); + GooString *jStr=GooString::fromInt(j); + + std::vector::iterator g=accu->begin(); + g+=i; + HtmlFont font=*g; + GooString *Size=GooString::fromInt(font.getSize()); + GooString *colorStr=font.getColor().toString(); + GooString *fontName=font.getFontName(); + GooString *lSize; + + if(!xml){ + tmp->append(".ft"); + tmp->append(jStr); + tmp->append(iStr); + tmp->append("{font-size:"); + tmp->append(Size); + if( font.getLineSize() != -1 && font.getLineSize() != 0 ) + { + lSize = GooString::fromInt(font.getLineSize()); + tmp->append("px;line-height:"); + tmp->append(lSize); + delete lSize; + } + tmp->append("px;font-family:"); + tmp->append(fontName); //font.getFontName()); + tmp->append(";color:"); + tmp->append(colorStr); + // if there is rotation or skew, include the matrix + if (font.isRotOrSkewed()) { + const double * const text_mat = font.getRotMat(); + GooString matrix_str(" matrix("); + matrix_str.appendf("{0:10.10g}, {1:10.10g}, {2:10.10g}, {3:10.10g}, 0, 0)", + text_mat[0], text_mat[1], text_mat[2], text_mat[3]); + tmp->append(";-moz-transform:"); + tmp->append(&matrix_str); + tmp->append(";-webkit-transform:"); + tmp->append(&matrix_str); + tmp->append(";-o-transform:"); + tmp->append(&matrix_str); + tmp->append(";-ms-transform:"); + tmp->append(&matrix_str); + // Todo: 75% is a wild guess that seems to work pretty well; + // We probably need to calculate the real percentage + // Based on the characteristic baseline and bounding box of current font + // PDF origin is at baseline + tmp->append(";-moz-transform-origin: left 75%"); + tmp->append(";-webkit-transform-origin: left 75%"); + tmp->append(";-o-transform-origin: left 75%"); + tmp->append(";-ms-transform-origin: left 75%"); + } + tmp->append(";}"); + } + if (xml) { + tmp->append("append(iStr); + tmp->append("\" size=\""); + tmp->append(Size); + tmp->append("\" family=\""); + tmp->append(fontName); //font.getFontName()); + tmp->append("\" color=\""); + tmp->append(colorStr); + tmp->append("\"/>"); + } + + delete fontName; + delete colorStr; + delete jStr; + delete iStr; + delete Size; + return tmp; +} + + diff --git a/utils/HtmlFonts.h b/utils/HtmlFonts.h new file mode 100644 index 0000000..22368b2 --- /dev/null +++ b/utils/HtmlFonts.h @@ -0,0 +1,117 @@ +//======================================================================== +// +// This file comes from pdftohtml project +// http://pdftohtml.sourceforge.net +// +// Copyright from: +// Gueorgui Ovtcharov +// Rainer Dorsch +// Mikhail Kruk +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in) +// Copyright (C) 2010 Albert Astals Cid +// Copyright (C) 2011 Steven Murdoch +// Copyright (C) 2011 Joshua Richardson +// Copyright (C) 2012 Igor Slepchin +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef _HTML_FONTS_H +#define _HTML_FONTS_H +#include "goo/GooString.h" +#include "GfxState.h" +#include "CharTypes.h" +#include + +class HtmlFontColor{ + private: + unsigned int r; + unsigned int g; + unsigned int b; + GBool Ok(unsigned int xcol){ return ((xcol<=255)&&(xcol>=0));} + GooString *convtoX(unsigned int xcol) const; + public: + HtmlFontColor():r(0),g(0),b(0){} + HtmlFontColor(GfxRGB rgb); + HtmlFontColor(const HtmlFontColor& x){r=x.r;g=x.g;b=x.b;} + HtmlFontColor& operator=(const HtmlFontColor &x){ + r=x.r;g=x.g;b=x.b; + return *this; + } + ~HtmlFontColor(){}; + GooString* toString() const; + GBool isEqual(const HtmlFontColor& col) const{ + return ((r==col.r)&&(g==col.g)&&(b==col.b)); + } +} ; + + +class HtmlFont{ + private: + unsigned int size; + int lineSize; + GBool italic; + GBool bold; + GBool rotOrSkewed; + int pos; // position of the font name in the fonts array + static GooString *DefaultFont; + GooString *FontName; + HtmlFontColor color; + double rotSkewMat[4]; // only four values needed for rotation and skew +public: + + HtmlFont(){FontName=NULL; rotOrSkewed = gFalse;} + HtmlFont(GfxFont *font,int _size, GfxRGB rgb); + HtmlFont(const HtmlFont& x); + HtmlFont& operator=(const HtmlFont& x); + HtmlFontColor getColor() const {return color;} + ~HtmlFont(); + static void clear(); + GooString* getFullName(); + GBool isItalic() const {return italic;} + GBool isBold() const {return bold;} + GBool isRotOrSkewed() const { return rotOrSkewed; } + unsigned int getSize() const {return size;} + int getLineSize() const {return lineSize;} + void setLineSize(int _lineSize) { lineSize = _lineSize; } + void setRotMat(const double * const mat) + { rotOrSkewed = gTrue; memcpy(rotSkewMat, mat, sizeof(rotSkewMat)); } + const double *getRotMat() const { return rotSkewMat; } + GooString* getFontName(); + static GooString* getDefaultFont(); + static void setDefaultFont(GooString* defaultFont); + static GooString* HtmlFilter(Unicode* u, int uLen); //char* s); + GBool isEqual(const HtmlFont& x) const; + GBool isEqualIgnoreBold(const HtmlFont& x) const; + static GooString* simple(HtmlFont *font, Unicode *content, int uLen); + void print() const {printf("font: %s %d %s%spos: %d\n", FontName->getCString(), size, bold ? "bold " : "", italic ? "italic " : "", pos);}; +}; + +class HtmlFontAccu{ +private: + std::vector *accu; + +public: + HtmlFontAccu(); + ~HtmlFontAccu(); + int AddFont(const HtmlFont& font); + HtmlFont *Get(int i){ + return &(*accu)[i]; + } + GooString* CSStyle(int i, int j = 0); + int size() const {return accu->size();} + +}; +#endif diff --git a/utils/HtmlLinks.cc b/utils/HtmlLinks.cc new file mode 100644 index 0000000..1d609f6 --- /dev/null +++ b/utils/HtmlLinks.cc @@ -0,0 +1,143 @@ +//======================================================================== +// +// This file comes from pdftohtml project +// http://pdftohtml.sourceforge.net +// +// Copyright from: +// Gueorgui Ovtcharov +// Rainer Dorsch +// Mikhail Kruk +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2008 Boris Toloknov +// Copyright (C) 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "HtmlLinks.h" + +extern GBool xml; + +HtmlLink::HtmlLink(const HtmlLink& x){ + Xmin=x.Xmin; + Ymin=x.Ymin; + Xmax=x.Xmax; + Ymax=x.Ymax; + dest=new GooString(x.dest); +} + +HtmlLink::HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString * _dest) +{ + if (xmin < xmax) { + Xmin=xmin; + Xmax=xmax; + } else { + Xmin=xmax; + Xmax=xmin; + } + if (ymin < ymax) { + Ymin=ymin; + Ymax=ymax; + } else { + Ymin=ymax; + Ymax=ymin; + } + dest=new GooString(_dest); +} + +HtmlLink::~HtmlLink(){ + delete dest; +} + +GBool HtmlLink::isEqualDest(const HtmlLink& x) const{ + return (!strcmp(dest->getCString(), x.dest->getCString())); +} + +GBool HtmlLink::inLink(double xmin,double ymin,double xmax,double ymax) const { + double y=(ymin+ymax)/2; + if (y>Ymax) return gFalse; + return (y>Ymin)&&(xminXmin); + } + +static GooString* EscapeSpecialChars( GooString* s ) +{ + GooString* tmp = NULL; + for( int i = 0, j = 0; i < s->getLength(); i++, j++ ){ + const char *replace = NULL; + switch ( s->getChar(i) ){ + case '"': replace = """; break; + case '&': replace = "&"; break; + case '<': replace = "<"; break; + case '>': replace = ">"; break; + default: continue; + } + if( replace ){ + if( !tmp ) tmp = new GooString( s ); + if( tmp ){ + tmp->del( j, 1 ); + int l = strlen( replace ); + tmp->insert( j, replace, l ); + j += l - 1; + } + } + } + return tmp ? tmp : s; +} + +GooString* HtmlLink::getLinkStart() { + GooString *res = new GooString("append( d ); + if( d != dest ) delete d; + res->append("\">"); + return res; +} + +/*GooString* HtmlLink::Link(GooString* content){ + //GooString* _dest=new GooString(dest); + GooString *tmp=new GooString("append(dest); + tmp->append("\">"); + tmp->append(content); + tmp->append(""); + //delete _dest; + return tmp; + }*/ + + + +HtmlLinks::HtmlLinks(){ + accu=new std::vector(); +} + +HtmlLinks::~HtmlLinks(){ + delete accu; + accu=NULL; +} + +GBool HtmlLinks::inLink(double xmin,double ymin,double xmax,double ymax,int& p)const { + + for(std::vector::iterator i=accu->begin();i!=accu->end();i++){ + if (i->inLink(xmin,ymin,xmax,ymax)) { + p=(i - accu->begin()); + return 1; + } + } + return 0; +} + +HtmlLink* HtmlLinks::getLink(int i) const{ + return &(*accu)[i]; +} + diff --git a/utils/HtmlLinks.h b/utils/HtmlLinks.h new file mode 100644 index 0000000..4a48dfa --- /dev/null +++ b/utils/HtmlLinks.h @@ -0,0 +1,73 @@ +//======================================================================== +// +// This file comes from pdftohtml project +// http://pdftohtml.sourceforge.net +// +// Copyright from: +// Gueorgui Ovtcharov +// Rainer Dorsch +// Mikhail Kruk +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2010 Albert Astals Cid +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef _HTML_LINKS +#define _HTML_LINKS + +#include +#include +#include +#include "goo/GooString.h" + +class HtmlLink{ + +private: + double Xmin; + double Ymin; + double Xmax; + double Ymax; + GooString* dest; + +public: + HtmlLink(const HtmlLink& x); + HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString *_dest); + ~HtmlLink(); + GBool isEqualDest(const HtmlLink& x) const; + GooString *getDest(){return new GooString(dest);} + double getX1() const {return Xmin;} + double getX2() const {return Xmax;} + double getY1() const {return Ymin;} + double getY2() const {return Ymax;} + GBool inLink(double xmin,double ymin,double xmax,double ymax) const ; + //GooString *Link(GooString *content); + GooString* getLinkStart(); + +}; + +class HtmlLinks{ +private: + std::vector *accu; +public: + HtmlLinks(); + ~HtmlLinks(); + void AddLink(const HtmlLink& x) {accu->push_back(x);} + GBool inLink(double xmin,double ymin,double xmax,double ymax,int& p) const; + HtmlLink* getLink(int i) const; + +}; + +#endif + diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc new file mode 100644 index 0000000..1d1b628 --- /dev/null +++ b/utils/HtmlOutputDev.cc @@ -0,0 +1,1886 @@ +//======================================================================== +// +// HtmlOutputDev.cc +// +// Copyright 1997-2002 Glyph & Cog, LLC +// +// Changed 1999-2000 by G.Ovtcharov +// +// Changed 2002 by Mikhail Kruk +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005-2012 Albert Astals Cid +// Copyright (C) 2008 Kjartan Maraas +// Copyright (C) 2008 Boris Toloknov +// Copyright (C) 2008 Haruyuki Kawabe +// Copyright (C) 2008 Tomas Are Haavet +// Copyright (C) 2009 Warren Toomey +// Copyright (C) 2009, 2011 Carlos Garcia Campos +// Copyright (C) 2009 Reece Dunn +// Copyright (C) 2010 Adrian Johnson +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in) +// Copyright (C) 2011 Joshua Richardson +// Copyright (C) 2011 Stephen Reichling +// Copyright (C) 2011, 2012 Igor Slepchin +// Copyright (C) 2012 Ihar Filipau +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include "goo/GooString.h" +#include "goo/GooList.h" +#include "UnicodeMap.h" +#include "goo/gmem.h" +#include "Error.h" +#include "GfxState.h" +#include "Page.h" +#include "Annot.h" +#include "PNGWriter.h" +#include "GlobalParams.h" +#include "HtmlOutputDev.h" +#include "HtmlFonts.h" +#include "HtmlUtils.h" +#include "Outline.h" +#include "PDFDoc.h" + +#define DEBUG __FILE__ << ": " << __LINE__ << ": DEBUG: " + +class HtmlImage +{ +public: + HtmlImage(GooString *_fName, GfxState *state) + : fName(_fName) { + state->transform(0, 0, &xMin, &yMax); + state->transform(1, 1, &xMax, &yMin); + } + ~HtmlImage() { delete fName; } + + double xMin, xMax; // image x coordinates + double yMin, yMax; // image y coordinates + GooString *fName; // image file name +}; + +// returns true if x is closer to y than x is to z +static inline bool IS_CLOSER(float x, float y, float z) { return fabs((x)-(y)) < fabs((x)-(z)); } + +extern GBool complexMode; +extern GBool singleHtml; +extern GBool ignore; +extern GBool printCommands; +extern GBool printHtml; +extern GBool noframes; +extern GBool stout; +extern GBool xml; +extern GBool showHidden; +extern GBool noMerge; + +extern double wordBreakThreshold; + +static GBool debug = gFalse; +static GooString *gstr_buff0 = NULL; // a workspace in which I format strings + +static GooString* basename(GooString* str){ + + char *p=str->getCString(); + int len=str->getLength(); + for (int i=len-1;i>=0;i--) + if (*(p+i)==SLASH) + return new GooString((p+i+1),len-i-1); + return new GooString(str); +} + +#if 0 +static GooString* Dirname(GooString* str){ + + char *p=str->getCString(); + int len=str->getLength(); + for (int i=len-1;i>=0;i--) + if (*(p+i)==SLASH) + return new GooString(p,i+1); + return new GooString(); +} +#endif + +static const char *print_matrix(const double *mat) { + delete gstr_buff0; + + gstr_buff0 = GooString::format("[{0:g} {1:g} {2:g} {3:g} {4:g} {5:g}]", + *mat, mat[1], mat[2], mat[3], mat[4], mat[5]); + return gstr_buff0->getCString(); +} + +static const char *print_uni_str(const Unicode *u, const unsigned uLen) { + GooString *gstr_buff1 = NULL; + + delete gstr_buff0; + + if (!uLen) return ""; + gstr_buff0 = GooString::format("{0:c}", (*u < 0x7F ? *u & 0xFF : '?')); + for (unsigned i = 1; i < uLen; i++) { + if (u[i] < 0x7F) { + gstr_buff1 = gstr_buff0->append(u[i] < 0x7F ? static_cast(u[i]) & 0xFF : '?'); + delete gstr_buff0; + gstr_buff0 = gstr_buff1; + } + } + + return gstr_buff0->getCString(); +} + +//------------------------------------------------------------------------ +// HtmlString +//------------------------------------------------------------------------ + +HtmlString::HtmlString(GfxState *state, double fontSize, HtmlFontAccu* _fonts) : fonts(_fonts) { + GfxFont *font; + double x, y; + + state->transform(state->getCurX(), state->getCurY(), &x, &y); + if ((font = state->getFont())) { + double ascent = font->getAscent(); + double descent = font->getDescent(); + if( ascent > 1.05 ){ + //printf( "ascent=%.15g is too high, descent=%.15g\n", ascent, descent ); + ascent = 1.05; + } + if( descent < -0.4 ){ + //printf( "descent %.15g is too low, ascent=%.15g\n", descent, ascent ); + descent = -0.4; + } + yMin = y - ascent * fontSize; + yMax = y - descent * fontSize; + GfxRGB rgb; + state->getFillRGB(&rgb); + HtmlFont hfont=HtmlFont(font, static_cast(fontSize-1), rgb); + if (isMatRotOrSkew(state->getTextMat())) { + double normalizedMatrix[4]; + memcpy(normalizedMatrix, state->getTextMat(), sizeof(normalizedMatrix)); + // browser rotates the opposite way + // so flip the sign of the angle -> sin() components change sign + if (debug) + std::cerr << DEBUG << "before transform: " << print_matrix(normalizedMatrix) << std::endl; + normalizedMatrix[1] *= -1; + normalizedMatrix[2] *= -1; + if (debug) + std::cerr << DEBUG << "after reflecting angle: " << print_matrix(normalizedMatrix) << std::endl; + normalizeRotMat(normalizedMatrix); + if (debug) + std::cerr << DEBUG << "after norm: " << print_matrix(normalizedMatrix) << std::endl; + hfont.setRotMat(normalizedMatrix); + } + fontpos = fonts->AddFont(hfont); + } else { + // this means that the PDF file draws text without a current font, + // which should never happen + yMin = y - 0.95 * fontSize; + yMax = y + 0.35 * fontSize; + fontpos=0; + } + if (yMin == yMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + yMin = y; + yMax = y + 1; + } + col = 0; + text = NULL; + xRight = NULL; + link = NULL; + len = size = 0; + yxNext = NULL; + xyNext = NULL; + htext=new GooString(); + dir = textDirUnknown; +} + + +HtmlString::~HtmlString() { + gfree(text); + delete htext; + gfree(xRight); +} + +void HtmlString::addChar(GfxState *state, double x, double y, + double dx, double dy, Unicode u) { + if (dir == textDirUnknown) { + //dir = UnicodeMap::getDirection(u); + dir = textDirLeftRight; + } + + if (len == size) { + size += 16; + text = (Unicode *)grealloc(text, size * sizeof(Unicode)); + xRight = (double *)grealloc(xRight, size * sizeof(double)); + } + text[len] = u; + if (len == 0) { + xMin = x; + } + xMax = xRight[len] = x + dx; +//printf("added char: %f %f xright = %f\n", x, dx, x+dx); + ++len; +} + +void HtmlString::endString() +{ + if( dir == textDirRightLeft && len > 1 ) + { + //printf("will reverse!\n"); + for (int i = 0; i < len / 2; i++) + { + Unicode ch = text[i]; + text[i] = text[len - i - 1]; + text[len - i - 1] = ch; + } + } +} + +//------------------------------------------------------------------------ +// HtmlPage +//------------------------------------------------------------------------ + +HtmlPage::HtmlPage(GBool rawOrder, char *imgExtVal) { + this->rawOrder = rawOrder; + curStr = NULL; + yxStrings = NULL; + xyStrings = NULL; + yxCur1 = yxCur2 = NULL; + fonts=new HtmlFontAccu(); + links=new HtmlLinks(); + imgList=new GooList(); + pageWidth=0; + pageHeight=0; + fontsPageMarker = 0; + DocName=NULL; + firstPage = -1; + imgExt = new GooString(imgExtVal); +} + +HtmlPage::~HtmlPage() { + clear(); + delete DocName; + delete fonts; + delete links; + delete imgExt; + deleteGooList(imgList, HtmlImage); +} + +void HtmlPage::updateFont(GfxState *state) { + GfxFont *font; + double *fm; + char *name; + int code; + double w; + + // adjust the font size + fontSize = state->getTransformedFontSize(); + if ((font = state->getFont()) && font->getType() == fontType3) { + // This is a hack which makes it possible to deal with some Type 3 + // fonts. The problem is that it's impossible to know what the + // base coordinate system used in the font is without actually + // rendering the font. This code tries to guess by looking at the + // width of the character 'm' (which breaks if the font is a + // subset that doesn't contain 'm'). + for (code = 0; code < 256; ++code) { + if ((name = ((Gfx8BitFont *)font)->getCharName(code)) && + name[0] == 'm' && name[1] == '\0') { + break; + } + } + if (code < 256) { + w = ((Gfx8BitFont *)font)->getWidth(code); + if (w != 0) { + // 600 is a generic average 'm' width -- yes, this is a hack + fontSize *= w / 0.6; + } + } + fm = font->getFontMatrix(); + if (fm[0] != 0) { + fontSize *= fabs(fm[3] / fm[0]); + } + } +} + +void HtmlPage::beginString(GfxState *state, GooString *s) { + curStr = new HtmlString(state, fontSize, fonts); +} + + +void HtmlPage::conv(){ + HtmlString *tmp; + + int linkIndex = 0; + HtmlFont* h; + for(tmp=yxStrings;tmp;tmp=tmp->yxNext){ + int pos=tmp->fontpos; + // printf("%d\n",pos); + h=fonts->Get(pos); + + if (tmp->htext) delete tmp->htext; + tmp->htext=HtmlFont::simple(h,tmp->text,tmp->len); + + if (links->inLink(tmp->xMin,tmp->yMin,tmp->xMax,tmp->yMax, linkIndex)){ + tmp->link = links->getLink(linkIndex); + /*GooString *t=tmp->htext; + tmp->htext=links->getLink(k)->Link(tmp->htext); + delete t;*/ + } + } + +} + + +void HtmlPage::addChar(GfxState *state, double x, double y, + double dx, double dy, + double ox, double oy, Unicode *u, int uLen) { + double x1, y1, w1, h1, dx2, dy2; + int n, i; + state->transform(x, y, &x1, &y1); + n = curStr->len; + + // check that new character is in the same direction as current string + // and is not too far away from it before adding + //if ((UnicodeMap::getDirection(u[0]) != curStr->dir) || + // XXX + if (debug) { + double *text_mat = state->getTextMat(); + // rotation is (cos q, sin q, -sin q, cos q, 0, 0) + // sin q is zero iff there is no rotation, or 180 deg. rotation; + // for 180 rotation, cos q will be negative + if (text_mat[0] < 0 || !is_within(text_mat[1], .1, 0)) { + std::cerr << DEBUG << "rotation matrix for \"" << print_uni_str(u, uLen) << '"' << std::endl; + std::cerr << "text " << print_matrix(state->getTextMat()); + } + } + if (n > 0 && // don't start a new string, unless there is already a string + // TODO: the following line assumes that text is flowing left to + // right, which will not necessarily be the case, e.g. if rotated; + // It assesses whether or not two characters are close enough to + // be part of the same string + fabs(x1 - curStr->xRight[n-1]) > wordBreakThreshold * (curStr->yMax - curStr->yMin) && + // rotation is (cos q, sin q, -sin q, cos q, 0, 0) + // sin q is zero iff there is no rotation, or 180 deg. rotation; + // for 180 rotation, cos q will be negative + !rot_matrices_equal(curStr->getFont().getRotMat(), state->getTextMat())) + { + endString(); + beginString(state, NULL); + } + state->textTransformDelta(state->getCharSpace() * state->getHorizScaling(), + 0, &dx2, &dy2); + dx -= dx2; + dy -= dy2; + state->transformDelta(dx, dy, &w1, &h1); + if (uLen != 0) { + w1 /= uLen; + h1 /= uLen; + } + for (i = 0; i < uLen; ++i) { + Unicode u1 = u[i]; + if (u1 >= 0xd800 && u1 <= 0xdbff && i < uLen) { + // surrogate pair + const Unicode u2 = u[i + 1]; + if (u2 >= 0xdc00 && u2 <= 0xdfff) { + u1 = 0x10000 + ((u1 - 0xd800) << 10) + (u2 - 0xdc00); + + curStr->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u1); + } + ++i; + } else { + curStr->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u1); + } + } +} + +void HtmlPage::endString() { + HtmlString *p1, *p2; + double h, y1, y2; + + // throw away zero-length strings -- they don't have valid xMin/xMax + // values, and they're useless anyway + if (curStr->len == 0) { + delete curStr; + curStr = NULL; + return; + } + + curStr->endString(); + +#if 0 //~tmp + if (curStr->yMax - curStr->yMin > 20) { + delete curStr; + curStr = NULL; + return; + } +#endif + + // insert string in y-major list + h = curStr->yMax - curStr->yMin; + y1 = curStr->yMin + 0.5 * h; + y2 = curStr->yMin + 0.8 * h; + if (rawOrder) { + p1 = yxCur1; + p2 = NULL; + } else if ((!yxCur1 || + (y1 >= yxCur1->yMin && + (y2 >= yxCur1->yMax || curStr->xMax >= yxCur1->xMin))) && + (!yxCur2 || + (y1 < yxCur2->yMin || + (y2 < yxCur2->yMax && curStr->xMax < yxCur2->xMin)))) { + p1 = yxCur1; + p2 = yxCur2; + } else { + for (p1 = NULL, p2 = yxStrings; p2; p1 = p2, p2 = p2->yxNext) { + if (y1 < p2->yMin || (y2 < p2->yMax && curStr->xMax < p2->xMin)) + break; + } + yxCur2 = p2; + } + yxCur1 = curStr; + if (p1) + p1->yxNext = curStr; + else + yxStrings = curStr; + curStr->yxNext = p2; + curStr = NULL; +} + +static const char *strrstr( const char *s, const char *ss ) +{ + const char *p = strstr( s, ss ); + for( const char *pp = p; pp != NULL; pp = strstr( p+1, ss ) ){ + p = pp; + } + return p; +} + +static void CloseTags( GooString *htext, GBool &finish_a, GBool &finish_italic, GBool &finish_bold ) +{ + const char *last_italic = finish_italic && ( finish_bold || finish_a ) ? strrstr( htext->getCString(), "" ) : NULL; + const char *last_bold = finish_bold && ( finish_italic || finish_a ) ? strrstr( htext->getCString(), "" ) : NULL; + const char *last_a = finish_a && ( finish_italic || finish_bold ) ? strrstr( htext->getCString(), " ( last_italic > last_bold ? last_italic : last_bold ) ){ + htext->append("", 4); + finish_a = false; + } + if( finish_italic && finish_bold && last_italic > last_bold ){ + htext->append("", 4); + finish_italic = false; + } + if( finish_bold ) + htext->append("", 4); + if( finish_italic ) + htext->append("", 4); + if( finish_a ) + htext->append(""); +} + +// Strings are lines of text; +// This function aims to combine strings into lines and paragraphs if !noMerge +// It may also strip out duplicate strings (if they are on top of each other); sometimes they are to create a font effect +void HtmlPage::coalesce() { + HtmlString *str1, *str2; + HtmlFont *hfont1, *hfont2; + double space, horSpace, vertSpace, vertOverlap; + GBool addSpace, addLineBreak; + int n, i; + double curX, curY; + +#if 0 //~ for debugging + for (str1 = yxStrings; str1; str1 = str1->yxNext) { + printf("x=%f..%f y=%f..%f size=%2d '", + str1->xMin, str1->xMax, str1->yMin, str1->yMax, + (int)(str1->yMax - str1->yMin)); + for (i = 0; i < str1->len; ++i) { + fputc(str1->text[i] & 0xff, stdout); + } + printf("'\n"); + } + printf("\n------------------------------------------------------------\n\n"); +#endif + str1 = yxStrings; + + if( !str1 ) return; + + //----- discard duplicated text (fake boldface, drop shadows) + if( !complexMode ) + { /* if not in complex mode get rid of duplicate strings */ + HtmlString *str3; + GBool found; + while (str1) + { + double size = str1->yMax - str1->yMin; + double xLimit = str1->xMin + size * 0.2; + found = gFalse; + for (str2 = str1, str3 = str1->yxNext; + str3 && str3->xMin < xLimit; + str2 = str3, str3 = str2->yxNext) + { + if (str3->len == str1->len && + !memcmp(str3->text, str1->text, str1->len * sizeof(Unicode)) && + fabs(str3->yMin - str1->yMin) < size * 0.2 && + fabs(str3->yMax - str1->yMax) < size * 0.2 && + fabs(str3->xMax - str1->xMax) < size * 0.2) + { + found = gTrue; + //printf("found duplicate!\n"); + break; + } + } + if (found) + { + str2->xyNext = str3->xyNext; + str2->yxNext = str3->yxNext; + delete str3; + } + else + { + str1 = str1->yxNext; + } + } + } /*- !complexMode */ + + str1 = yxStrings; + + hfont1 = getFont(str1); + if( hfont1->isBold() ) + str1->htext->insert(0,"",3); + if( hfont1->isItalic() ) + str1->htext->insert(0,"",3); + if( str1->getLink() != NULL ) { + GooString *ls = str1->getLink()->getLinkStart(); + str1->htext->insert(0, ls); + delete ls; + } + curX = str1->xMin; curY = str1->yMin; + + while (str1 && (str2 = str1->yxNext)) { + hfont2 = getFont(str2); + space = str1->yMax - str1->yMin; // the height of the font's bounding box + horSpace = str2->xMin - str1->xMax; + // if strings line up on left-hand side AND they are on subsequent lines, we need a line break + addLineBreak = !noMerge && (fabs(str1->xMin - str2->xMin) < 0.4) && IS_CLOSER(str2->yMax, str1->yMax + space, str1->yMax); + vertSpace = str2->yMin - str1->yMax; + +//printf("coalesce %d %d %f? ", str1->dir, str2->dir, d); + + if (str2->yMin >= str1->yMin && str2->yMin <= str1->yMax) + { + vertOverlap = str1->yMax - str2->yMin; + } else + if (str2->yMax >= str1->yMin && str2->yMax <= str1->yMax) + { + vertOverlap = str2->yMax - str1->yMin; + } else + { + vertOverlap = 0; + } + + // Combine strings if: + // They appear to be the same font (complex mode only) && going in the same direction AND at least one of the following: + // 1. They appear to be part of the same line of text + // 2. They appear to be subsequent lines of a paragraph + // We assume (1) or (2) above, respectively, based on: + // (1) strings overlap vertically AND + // horizontal space between end of str1 and start of str2 is consistent with a single space or less; + // when rawOrder, the strings have to overlap vertically by at least 50% + // (2) Strings flow down the page, but the space between them is not too great, and they are lined up on the left + if ( + ( + ( + ( + (rawOrder && vertOverlap > 0.5 * space) + || + (!rawOrder && str2->yMin < str1->yMax) + ) && + (horSpace > -0.5 * space && horSpace < space) + ) || + (vertSpace >= 0 && vertSpace < 0.5 * space && addLineBreak) + ) && + (!complexMode || (hfont1->isEqualIgnoreBold(*hfont2))) && // in complex mode fonts must be the same, in other modes fonts do not metter + str1->dir == str2->dir // text direction the same + ) + { +// printf("yes\n"); + n = str1->len + str2->len; + if ((addSpace = horSpace > wordBreakThreshold * space)) { + ++n; + } + if (addLineBreak) { + ++n; + } + + str1->size = (n + 15) & ~15; + str1->text = (Unicode *)grealloc(str1->text, + str1->size * sizeof(Unicode)); + str1->xRight = (double *)grealloc(str1->xRight, + str1->size * sizeof(double)); + if (addSpace) { + str1->text[str1->len] = 0x20; + str1->htext->append(xml?" ":" "); + str1->xRight[str1->len] = str2->xMin; + ++str1->len; + } + if (addLineBreak) { + str1->text[str1->len] = '\n'; + str1->htext->append("
"); + str1->xRight[str1->len] = str2->xMin; + ++str1->len; + str1->yMin = str2->yMin; + str1->yMax = str2->yMax; + str1->xMax = str2->xMax; + int fontLineSize = hfont1->getLineSize(); + int curLineSize = (int)(vertSpace + space); + if( curLineSize != fontLineSize ) + { + HtmlFont *newfnt = new HtmlFont(*hfont1); + newfnt->setLineSize(curLineSize); + str1->fontpos = fonts->AddFont(*newfnt); + delete newfnt; + hfont1 = getFont(str1); + // we have to reget hfont2 because it's location could have + // changed on resize + hfont2 = getFont(str2); + } + } + for (i = 0; i < str2->len; ++i) { + str1->text[str1->len] = str2->text[i]; + str1->xRight[str1->len] = str2->xRight[i]; + ++str1->len; + } + + /* fix , if str1 and str2 differ and handle switch of links */ + HtmlLink *hlink1 = str1->getLink(); + HtmlLink *hlink2 = str2->getLink(); + bool switch_links = !hlink1 || !hlink2 || !hlink1->isEqualDest(*hlink2); + GBool finish_a = switch_links && hlink1 != NULL; + GBool finish_italic = hfont1->isItalic() && ( !hfont2->isItalic() || finish_a ); + GBool finish_bold = hfont1->isBold() && ( !hfont2->isBold() || finish_a || finish_italic ); + CloseTags( str1->htext, finish_a, finish_italic, finish_bold ); + if( switch_links && hlink2 != NULL ) { + GooString *ls = hlink2->getLinkStart(); + str1->htext->append(ls); + delete ls; + } + if( ( !hfont1->isItalic() || finish_italic ) && hfont2->isItalic() ) + str1->htext->append("", 3); + if( ( !hfont1->isBold() || finish_bold ) && hfont2->isBold() ) + str1->htext->append("", 3); + + + str1->htext->append(str2->htext); + // str1 now contains href for link of str2 (if it is defined) + str1->link = str2->link; + hfont1 = hfont2; + if (str2->xMax > str1->xMax) { + str1->xMax = str2->xMax; + } + if (str2->yMax > str1->yMax) { + str1->yMax = str2->yMax; + } + str1->yxNext = str2->yxNext; + delete str2; + } else { // keep strings separate +// printf("no\n"); + GBool finish_a = str1->getLink() != NULL; + GBool finish_bold = hfont1->isBold(); + GBool finish_italic = hfont1->isItalic(); + CloseTags( str1->htext, finish_a, finish_italic, finish_bold ); + + str1->xMin = curX; str1->yMin = curY; + str1 = str2; + curX = str1->xMin; curY = str1->yMin; + hfont1 = hfont2; + if( hfont1->isBold() ) + str1->htext->insert(0,"",3); + if( hfont1->isItalic() ) + str1->htext->insert(0,"",3); + if( str1->getLink() != NULL ) { + GooString *ls = str1->getLink()->getLinkStart(); + str1->htext->insert(0, ls); + delete ls; + } + } + } + str1->xMin = curX; str1->yMin = curY; + + GBool finish_bold = hfont1->isBold(); + GBool finish_italic = hfont1->isItalic(); + GBool finish_a = str1->getLink() != NULL; + CloseTags( str1->htext, finish_a, finish_italic, finish_bold ); + +#if 0 //~ for debugging + for (str1 = yxStrings; str1; str1 = str1->yxNext) { + printf("x=%3d..%3d y=%3d..%3d size=%2d ", + (int)str1->xMin, (int)str1->xMax, (int)str1->yMin, (int)str1->yMax, + (int)(str1->yMax - str1->yMin)); + printf("'%s'\n", str1->htext->getCString()); + } + printf("\n------------------------------------------------------------\n\n"); +#endif + +} + +void HtmlPage::dumpAsXML(FILE* f,int page){ + fprintf(f, "\n", pageHeight,pageWidth); + + for(int i=fontsPageMarker;i < fonts->size();i++) { + GooString *fontCSStyle = fonts->CSStyle(i); + fprintf(f,"\t%s\n",fontCSStyle->getCString()); + delete fontCSStyle; + } + + int listlen=imgList->getLength(); + for (int i = 0; i < listlen; i++) { + HtmlImage *img = (HtmlImage*)imgList->del(0); + fprintf(f,"yMin),xoutRound(img->xMin)); + fprintf(f,"width=\"%d\" height=\"%d\" ",xoutRound(img->xMax-img->xMin),xoutRound(img->yMax-img->yMin)); + fprintf(f,"src=\"%s\"/>\n",img->fName->getCString()); + delete img; + } + + for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){ + if (tmp->htext){ + fprintf(f,"yMin),xoutRound(tmp->xMin)); + fprintf(f,"width=\"%d\" height=\"%d\" ",xoutRound(tmp->xMax-tmp->xMin),xoutRound(tmp->yMax-tmp->yMin)); + fprintf(f,"font=\"%d\">", tmp->fontpos); + fputs(tmp->htext->getCString(),f); + fputs("\n",f); + } + } + fputs("\n",f); +} + +static void printCSS(FILE *f) +{ + // Image flip/flop CSS + // Source: + // http://stackoverflow.com/questions/1309055/cross-browser-way-to-flip-html-image-via-javascript-css + // tested in Chrome, Fx (Linux) and IE9 (W7) + static const char css[] = + "" "\n"; + + fwrite( css, sizeof(css)-1, 1, f ); +} + +int HtmlPage::dumpComplexHeaders(FILE * const file, FILE *& pageFile, int page) { + GooString* tmp; + + if( !noframes ) + { + GooString* pgNum=GooString::fromInt(page); + tmp = new GooString(DocName); + if (!singleHtml){ + tmp->append('-')->append(pgNum)->append(".html"); + pageFile = fopen(tmp->getCString(), "w"); + } else { + tmp->append("-html")->append(".html"); + pageFile = fopen(tmp->getCString(), "a"); + } + delete pgNum; + if (!pageFile) { + error(errIO, -1, "Couldn't open html file '{0:t}'", tmp); + delete tmp; + return 1; + } + + if (!singleHtml) + fprintf(pageFile,"%s\n\n\nPage %d\n\n", DOCTYPE, page); + else + fprintf(pageFile,"%s\n\n\n%s\n\n", DOCTYPE, tmp->getCString()); + + delete tmp; + + GooString *htmlEncoding = HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName()); + if (!singleHtml) + fprintf(pageFile, "\n", htmlEncoding->getCString()); + else + fprintf(pageFile, "\n
\n", htmlEncoding->getCString()); + delete htmlEncoding; + } + else + { + pageFile = file; + fprintf(pageFile,"\n", page); + fprintf(pageFile,"\n", page); + } + + return 0; +} + +void HtmlPage::dumpComplex(FILE *file, int page){ + FILE* pageFile; + GooString* tmp; + + if( firstPage == -1 ) firstPage = page; + + if (dumpComplexHeaders(file, pageFile, page)) { error(errIO, -1, "Couldn't write headers."); return; } + + tmp=basename(DocName); + + fputs("\n",pageFile); + + if( !noframes ) + { + fputs("\n\n",pageFile); + } + + fprintf(pageFile,"
\n", + page, pageWidth, pageHeight); + + if( !ignore ) + { + fprintf(pageFile, + "\"background\n", + pageWidth, pageHeight, tmp->getCString(), + (page-firstPage+1), imgExt->getCString()); + } + + delete tmp; + + for(HtmlString *tmp1=yxStrings;tmp1;tmp1=tmp1->yxNext){ + if (tmp1->htext){ + fprintf(pageFile, + "

yMin), + xoutRound(tmp1->xMin)); + if (!singleHtml) { + fputc('0', pageFile); + } else { + fprintf(pageFile, "%d", page); + } + fprintf(pageFile,"%d\">", tmp1->fontpos); + fputs(tmp1->htext->getCString(), pageFile); + fputs("

\n", pageFile); + } + } + + fputs("
\n", pageFile); + + if( !noframes ) + { + fputs("\n\n",pageFile); + fclose(pageFile); + } +} + + +void HtmlPage::dump(FILE *f, int pageNum) +{ + if (complexMode || singleHtml) + { + if (xml) dumpAsXML(f, pageNum); + if (!xml) dumpComplex(f, pageNum); + } + else + { + fprintf(f,"",pageNum); + // Loop over the list of image names on this page + int listlen=imgList->getLength(); + for (int i = 0; i < listlen; i++) { + HtmlImage *img = (HtmlImage*)imgList->del(0); + + // see printCSS() for class names + const char *styles[4] = { "", " class=\"xflip\"", " class=\"yflip\"", " class=\"xyflip\"" }; + int style_index=0; + if (img->xMin > img->xMax) style_index += 1; // xFlip + if (img->yMin > img->yMax) style_index += 2; // yFlip + + fprintf(f,"
\n",styles[style_index],img->fName->getCString()); + delete img; + } + + GooString* str; + for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){ + if (tmp->htext){ + str=new GooString(tmp->htext); + fputs(str->getCString(),f); + delete str; + fputs("
\n",f); + } + } + fputs("
\n",f); + } +} + + + +void HtmlPage::clear() { + HtmlString *p1, *p2; + + if (curStr) { + delete curStr; + curStr = NULL; + } + for (p1 = yxStrings; p1; p1 = p2) { + p2 = p1->yxNext; + delete p1; + } + yxStrings = NULL; + xyStrings = NULL; + yxCur1 = yxCur2 = NULL; + + if( !noframes ) + { + delete fonts; + fonts=new HtmlFontAccu(); + fontsPageMarker = 0; + } + else + { + fontsPageMarker = fonts->size(); + } + + delete links; + links=new HtmlLinks(); + + +} + +void HtmlPage::setDocName(char *fname){ + DocName=new GooString(fname); +} + +void HtmlPage::addImage(GooString *fname, GfxState *state) { + HtmlImage *img = new HtmlImage(fname, state); + imgList->append(img); +} + +//------------------------------------------------------------------------ +// HtmlMetaVar +//------------------------------------------------------------------------ + +HtmlMetaVar::HtmlMetaVar(const char *_name, const char *_content) +{ + name = new GooString(_name); + content = new GooString(_content); +} + +HtmlMetaVar::~HtmlMetaVar() +{ + delete name; + delete content; +} + +GooString* HtmlMetaVar::toString() +{ + GooString *result = new GooString("append(name); + result->append("\" content=\""); + result->append(content); + result->append("\"/>"); + return result; +} + +//------------------------------------------------------------------------ +// HtmlOutputDev +//------------------------------------------------------------------------ + +static const char* HtmlEncodings[][2] = { + {"Latin1", "ISO-8859-1"}, + {NULL, NULL} +}; + +GooString* HtmlOutputDev::mapEncodingToHtml(GooString* encoding) +{ + GooString* enc = encoding; + for(int i = 0; HtmlEncodings[i][0] != NULL; i++) + { + if( enc->cmp(HtmlEncodings[i][0]) == 0 ) + { + delete enc; + return new GooString(HtmlEncodings[i][1]); + } + } + return enc; +} + +void HtmlOutputDev::doFrame(int firstPage){ + GooString* fName=new GooString(Docname); + GooString* htmlEncoding; + fName->append(".html"); + + if (!(fContentsFrame = fopen(fName->getCString(), "w"))){ + error(errIO, -1, "Couldn't open html file '{0:t}'", fName); + delete fName; + return; + } + + delete fName; + + fName=basename(Docname); + fputs(DOCTYPE, fContentsFrame); + fputs("\n",fContentsFrame); + fputs("\n",fContentsFrame); + fprintf(fContentsFrame,"\n%s",docTitle->getCString()); + htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName()); + fprintf(fContentsFrame, "\n\n", htmlEncoding->getCString()); + dumpMetaVars(fContentsFrame); + fprintf(fContentsFrame, "\n"); + fputs("\n",fContentsFrame); + fprintf(fContentsFrame,"\n",fName->getCString()); + fputs("getCString(), firstPage); + else + fprintf(fContentsFrame,"\"%ss.html\"",fName->getCString()); + + fputs(">\n\n\n",fContentsFrame); + + delete fName; + delete htmlEncoding; + fclose(fContentsFrame); +} + +HtmlOutputDev::HtmlOutputDev(Catalog *catalogA, char *fileName, char *title, + char *author, char *keywords, char *subject, char *date, + char *extension, + GBool rawOrder, int firstPage, GBool outline) +{ + catalog = catalogA; + fContentsFrame = NULL; + docTitle = new GooString(title); + pages = NULL; + dumpJPEG=gTrue; + //write = gTrue; + this->rawOrder = rawOrder; + this->doOutline = outline; + ok = gFalse; + //this->firstPage = firstPage; + //pageNum=firstPage; + // open file + needClose = gFalse; + pages = new HtmlPage(rawOrder, extension); + + glMetaVars = new GooList(); + glMetaVars->append(new HtmlMetaVar("generator", "pdftohtml 0.36")); + if( author ) glMetaVars->append(new HtmlMetaVar("author", author)); + if( keywords ) glMetaVars->append(new HtmlMetaVar("keywords", keywords)); + if( date ) glMetaVars->append(new HtmlMetaVar("date", date)); + if( subject ) glMetaVars->append(new HtmlMetaVar("subject", subject)); + + maxPageWidth = 0; + maxPageHeight = 0; + + pages->setDocName(fileName); + Docname=new GooString (fileName); + + // for non-xml output (complex or simple) with frames generate the left frame + if(!xml && !noframes) + { + if (!singleHtml) + { + GooString* left=new GooString(fileName); + left->append("_ind.html"); + + doFrame(firstPage); + + if (!(fContentsFrame = fopen(left->getCString(), "w"))) + { + error(errIO, -1, "Couldn't open html file '{0:t}'", left); + delete left; + return; + } + delete left; + fputs(DOCTYPE, fContentsFrame); + fputs("\n\n\n\n\n", fContentsFrame); + + if (doOutline) + { + GooString *str = basename(Docname); + fprintf(fContentsFrame, "Outline
", str->getCString(), complexMode ? "-outline.html" : "s.html#outline"); + delete str; + } + } + if (!complexMode) + { /* not in complex mode */ + + GooString* right=new GooString(fileName); + right->append("s.html"); + + if (!(page=fopen(right->getCString(),"w"))){ + error(errIO, -1, "Couldn't open html file '{0:t}'", right); + delete right; + return; + } + delete right; + fputs(DOCTYPE, page); + fputs("\n\n\n",page); + printCSS(page); + fputs("\n\n",page); + } + } + + if (noframes) { + if (stout) page=stdout; + else { + GooString* right=new GooString(fileName); + if (!xml) right->append(".html"); + if (xml) right->append(".xml"); + if (!(page=fopen(right->getCString(),"w"))){ + error(errIO, -1, "Couldn't open html file '{0:t}'", right); + delete right; + return; + } + delete right; + } + + GooString *htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName()); + if (xml) + { + fprintf(page, "\n", htmlEncoding->getCString()); + fputs("\n\n", page); + fprintf(page,"\n", PACKAGE_NAME, PACKAGE_VERSION); + } + else + { + fprintf(page,"%s\n\n\n%s\n", DOCTYPE, docTitle->getCString()); + + fprintf(page, "\n", htmlEncoding->getCString()); + + dumpMetaVars(page); + printCSS(page); + fprintf(page,"\n"); + fprintf(page,"\n"); + } + delete htmlEncoding; + } + ok = gTrue; +} + +HtmlOutputDev::~HtmlOutputDev() { + HtmlFont::clear(); + + delete Docname; + delete docTitle; + + deleteGooList(glMetaVars, HtmlMetaVar); + + if (fContentsFrame){ + fputs("\n\n",fContentsFrame); + fclose(fContentsFrame); + } + if (page != NULL) { + if (xml) { + fputs("\n",page); + fclose(page); + } else + if ( !complexMode || xml || noframes ) + { + fputs("\n\n",page); + fclose(page); + } + } + if (pages) + delete pages; +} + +void HtmlOutputDev::startPage(int pageNum, GfxState *state) { +#if 0 + if (mode&&!xml){ + if (write){ + write=gFalse; + GooString* fname=Dirname(Docname); + fname->append("image.log"); + if((tin=fopen(getFileNameFromPath(fname->getCString(),fname->getLength()),"w"))==NULL){ + printf("Error : can not open %s",fname); + exit(1); + } + delete fname; + // if(state->getRotation()!=0) + // fprintf(tin,"ROTATE=%d rotate %d neg %d neg translate\n",state->getRotation(),state->getX1(),-state->getY1()); + // else + fprintf(tin,"ROTATE=%d neg %d neg translate\n",state->getX1(),state->getY1()); + } + } +#endif + + this->pageNum = pageNum; + GooString *str=basename(Docname); + pages->clear(); + if(!noframes) + { + if (fContentsFrame) + { + if (complexMode) + fprintf(fContentsFrame,"getCString(),pageNum); + else + fprintf(fContentsFrame,"getCString(),pageNum); + fprintf(fContentsFrame," target=\"contents\" >Page %d
\n",pageNum); + } + } + + pages->pageWidth=static_cast(state->getPageWidth()); + pages->pageHeight=static_cast(state->getPageHeight()); + + delete str; +} + + +void HtmlOutputDev::endPage() { + Links *linksList = docPage->getLinks(); + for (int i = 0; i < linksList->getNumLinks(); ++i) + { + doProcessLink(linksList->getLink(i)); + } + delete linksList; + + pages->conv(); + pages->coalesce(); + pages->dump(page, pageNum); + + // I don't yet know what to do in the case when there are pages of different + // sizes and we want complex output: running ghostscript many times + // seems very inefficient. So for now I'll just use last page's size + maxPageWidth = pages->pageWidth; + maxPageHeight = pages->pageHeight; + + //if(!noframes&&!xml) fputs("
\n", fContentsFrame); + if(!stout && !globalParams->getErrQuiet()) printf("Page-%d\n",(pageNum)); +} + +void HtmlOutputDev::updateFont(GfxState *state) { + pages->updateFont(state); +} + +void HtmlOutputDev::beginString(GfxState *state, GooString *s) { + pages->beginString(state, s); +} + +void HtmlOutputDev::endString(GfxState *state) { + pages->endString(); +} + +void HtmlOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int /*nBytes*/, Unicode *u, int uLen) +{ + if ( !showHidden && (state->getRender() & 3) == 3) { + return; + } + pages->addChar(state, x, y, dx, dy, originX, originY, u, uLen); +} + +void HtmlOutputDev::drawJpegImage(GfxState *state, Stream *str) +{ + FILE *f1; + int c; + + // open the image file + GooString *fName=createImageFileName("jpg"); + if (!(f1 = fopen(fName->getCString(), "wb"))) { + error(errIO, -1, "Couldn't open image file '%s'", fName->getCString()); + delete fName; + return; + } + + // initialize stream + str = str->getNextStream(); + str->reset(); + + // copy the stream + while ((c = str->getChar()) != EOF) + fputc(c, f1); + + fclose(f1); + + if (fName) { + pages->addImage(fName, state); + } +} + +void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int height, + GfxImageColorMap *colorMap, GBool isMask) +{ +#ifdef ENABLE_LIBPNG + FILE *f1; + + if (!colorMap && !isMask) { + error(errInternal, -1, "Can't have color image without a color map"); + return; + } + + // open the image file + GooString *fName=createImageFileName("png"); + if (!(f1 = fopen(fName->getCString(), "wb"))) { + error(errIO, -1, "Couldn't open image file '%s'", fName->getCString()); + delete fName; + return; + } + + PNGWriter *writer = new PNGWriter( isMask ? PNGWriter::MONOCHROME : PNGWriter::RGB ); + // TODO can we calculate the resolution of the image? + if (!writer->init(f1, width, height, 72, 72)) { + error(errInternal, -1, "Can't init PNG for image '%s'", fName->getCString()); + delete writer; + fclose(f1); + return; + } + + if (!isMask) { + Guchar *p; + GfxRGB rgb; + png_byte *row = (png_byte *) gmalloc(3 * width); // 3 bytes/pixel: RGB + png_bytep *row_pointer= &row; + + // Initialize the image stream + ImageStream *imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), colorMap->getBits()); + imgStr->reset(); + + // For each line... + for (int y = 0; y < height; y++) { + + // Convert into a PNG row + p = imgStr->getLine(); + for (int x = 0; x < width; x++) { + colorMap->getRGB(p, &rgb); + // Write the RGB pixels into the row + row[3*x]= colToByte(rgb.r); + row[3*x+1]= colToByte(rgb.g); + row[3*x+2]= colToByte(rgb.b); + p += colorMap->getNumPixelComps(); + } + + if (!writer->writeRow(row_pointer)) { + error(errIO, -1, "Failed to write into PNG '%s'", fName->getCString()); + delete writer; + delete imgStr; + fclose(f1); + return; + } + } + gfree(row); + imgStr->close(); + delete imgStr; + } + else { // isMask == true + ImageStream *imgStr = new ImageStream(str, width, 1, 1); + imgStr->reset(); + + Guchar *png_row = (Guchar *)gmalloc( width ); + + for (int ri = 0; ri < height; ++ri) + { + // read the row of the mask + Guchar *bit_row = imgStr->getLine(); + + // invert for PNG + for(int i = 0; i < width; i++) + png_row[i] = bit_row[i] ? 0xff : 0x00; + + if (!writer->writeRow( &png_row )) + { + error(errIO, -1, "Failed to write into PNG '%s'", fName->getCString()); + delete writer; + fclose(f1); + delete imgStr; + gfree(png_row); + return; + } + } + imgStr->close(); + delete imgStr; + gfree(png_row); + } + + str->close(); + + writer->close(); + delete writer; + fclose(f1); + + pages->addImage(fName, state); +#else + return; +#endif +} + +GooString *HtmlOutputDev::createImageFileName(const char *ext) +{ + GooString *fName=new GooString(Docname); + fName->append("-"); + GooString *pgNum= GooString::fromInt(pageNum); + GooString *imgnum= GooString::fromInt(pages->getNumImages()+1); + + fName->append(pgNum)->append("_")->append(imgnum)->append(".")->append(ext); + delete pgNum; + delete imgnum; + + return fName; +} + +void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + + if (ignore||(complexMode && !xml)) { + OutputDev::drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg); + return; + } + + // dump JPEG file + if (dumpJPEG && str->getKind() == strDCT) { + drawJpegImage(state, str); + } + else { +#ifdef ENABLE_LIBPNG + drawPngImage(state, str, width, height, NULL, gTrue); +#else + OutputDev::drawImageMask(state, ref, str, width, height, invert, interpolate, inlineImg); +#endif + } +} + +void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) { + + if (ignore||(complexMode && !xml)) { + OutputDev::drawImage(state, ref, str, width, height, colorMap, interpolate, + maskColors, inlineImg); + return; + } + + /*if( !globalParams->getErrQuiet() ) + printf("image stream of kind %d\n", str->getKind());*/ + // dump JPEG file + if (dumpJPEG && str->getKind() == strDCT) { + drawJpegImage(state, str); + } + else { +#ifdef ENABLE_LIBPNG + drawPngImage(state, str, width, height, colorMap ); +#else + OutputDev::drawImage(state, ref, str, width, height, colorMap, interpolate, + maskColors, inlineImg); +#endif + } +} + + + +void HtmlOutputDev::doProcessLink(AnnotLink* link){ + double _x1,_y1,_x2,_y2; + int x1,y1,x2,y2; + + link->getRect(&_x1,&_y1,&_x2,&_y2); + cvtUserToDev(_x1,_y1,&x1,&y1); + + cvtUserToDev(_x2,_y2,&x2,&y2); + + + GooString* _dest=getLinkDest(link); + HtmlLink t((double) x1,(double) y2,(double) x2,(double) y1,_dest); + pages->AddLink(t); + delete _dest; +} + +GooString* HtmlOutputDev::getLinkDest(AnnotLink *link){ + char *p; + if (!link->getAction()) + return new GooString(); + switch(link->getAction()->getKind()) + { + case actionGoTo: + { + GooString* file=basename(Docname); + int page=1; + LinkGoTo *ha=(LinkGoTo *)link->getAction(); + LinkDest *dest=NULL; + if (ha->getDest()!=NULL) + dest=ha->getDest()->copy(); + else if (ha->getNamedDest()!=NULL) + dest=catalog->findDest(ha->getNamedDest()); + + if (dest){ + if (dest->isPageRef()){ + Ref pageref=dest->getPageRef(); + page=catalog->findPage(pageref.num,pageref.gen); + } + else { + page=dest->getPageNum(); + } + + delete dest; + + GooString *str=GooString::fromInt(page); + /* complex simple + frames file-4.html files.html#4 + noframes file.html#4 file.html#4 + */ + if (noframes) + { + file->append(".html#"); + file->append(str); + } + else + { + if( complexMode ) + { + file->append("-"); + file->append(str); + file->append(".html"); + } + else + { + file->append("s.html#"); + file->append(str); + } + } + + if (printCommands) printf(" link to page %d ",page); + delete str; + return file; + } + else + { + return new GooString(); + } + } + case actionGoToR: + { + LinkGoToR *ha=(LinkGoToR *) link->getAction(); + LinkDest *dest=NULL; + int page=1; + GooString *file=new GooString(); + if (ha->getFileName()){ + delete file; + file=new GooString(ha->getFileName()->getCString()); + } + if (ha->getDest()!=NULL) dest=ha->getDest()->copy(); + if (dest&&file){ + if (!(dest->isPageRef())) page=dest->getPageNum(); + delete dest; + + if (printCommands) printf(" link to page %d ",page); + if (printHtml){ + p=file->getCString()+file->getLength()-4; + if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")){ + file->del(file->getLength()-4,4); + file->append(".html"); + } + file->append('#'); + file->append(GooString::fromInt(page)); + } + } + if (printCommands && file) printf("filename %s\n",file->getCString()); + return file; + } + case actionURI: + { + LinkURI *ha=(LinkURI *) link->getAction(); + GooString* file=new GooString(ha->getURI()->getCString()); + // printf("uri : %s\n",file->getCString()); + return file; + } + case actionLaunch: + { + LinkLaunch *ha=(LinkLaunch *) link->getAction(); + GooString* file=new GooString(ha->getFileName()->getCString()); + if (printHtml) { + p=file->getCString()+file->getLength()-4; + if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")){ + file->del(file->getLength()-4,4); + file->append(".html"); + } + if (printCommands) printf("filename %s",file->getCString()); + + return file; + + } + } + default: + return new GooString(); + } +} + +void HtmlOutputDev::dumpMetaVars(FILE *file) +{ + GooString *var; + + for(int i = 0; i < glMetaVars->getLength(); i++) + { + HtmlMetaVar *t = (HtmlMetaVar*)glMetaVars->get(i); + var = t->toString(); + fprintf(file, "%s\n", var->getCString()); + delete var; + } +} + +GBool HtmlOutputDev::dumpDocOutline(PDFDoc* doc) +{ +#ifdef DISABLE_OUTLINE + return gFalse; +#else + FILE * output = NULL; + GBool bClose = gFalse; + Catalog *catalog = doc->getCatalog(); + + if (!ok) + return gFalse; + + Outline *outline = doc->getOutline(); + if (!outline) + return gFalse; + + GooList *outlines = outline->getItems(); + if (!outlines) + return gFalse; + + if (!complexMode || xml) + { + output = page; + } + else if (complexMode && !xml) + { + if (noframes) + { + output = page; + fputs("
\n", output); + } + else + { + GooString *str = Docname->copy(); + str->append("-outline.html"); + output = fopen(str->getCString(), "w"); + if (output == NULL) + return gFalse; + delete str; + bClose = gTrue; + + GooString *htmlEncoding = + HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName()); + + fprintf(output, "\n" \ + "\n" \ + "Document Outline\n" \ + "\n" \ + "\n\n", htmlEncoding->getCString()); + delete htmlEncoding; + } + } + + if (!xml) + { + GBool done = newHtmlOutlineLevel(output, outlines, catalog); + if (done && !complexMode) + fputs("
\n", output); + + if (bClose) + { + fputs("\n\n", output); + fclose(output); + } + } + else + newXmlOutlineLevel(output, outlines, catalog); + + return gTrue; +#endif +} + +GBool HtmlOutputDev::newHtmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog, int level) +{ +#ifdef DISABLE_OUTLINE + return gFalse; +#else + GBool atLeastOne = gFalse; + + if (level == 1) + { + fputs("", output); + fputs("

Document Outline

\n", output); + } + fputs("
    \n",output); + + for (int i = 0; i < outlines->getLength(); i++) + { + OutlineItem *item = (OutlineItem*)outlines->get(i); + GooString *titleStr = HtmlFont::HtmlFilter(item->getTitle(), + item->getTitleLength()); + + GooString *linkName = NULL;; + int page = getOutlinePageNum(item); + if (page > 0) + { + /* complex simple + frames file-4.html files.html#4 + noframes file.html#4 file.html#4 + */ + linkName=basename(Docname); + GooString *str=GooString::fromInt(page); + if (noframes) { + linkName->append(".html#"); + linkName->append(str); + } else { + if( complexMode ) { + linkName->append("-"); + linkName->append(str); + linkName->append(".html"); + } else { + linkName->append("s.html#"); + linkName->append(str); + } + } + delete str; + } + + fputs("
  • ",output); + if (linkName) + fprintf(output,"", linkName->getCString()); + fputs(titleStr->getCString(),output); + if (linkName) { + fputs("",output); + delete linkName; + } + delete titleStr; + atLeastOne = gTrue; + + item->open(); + if (item->hasKids()) + { + fputs("\n",output); + newHtmlOutlineLevel(output, item->getKids(), catalog, level+1); + } + item->close(); + fputs("
  • \n",output); + } + fputs("
\n",output); + + return atLeastOne; +#endif +} + +void HtmlOutputDev::newXmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog) +{ +#ifndef DISABLE_OUTLINE + fputs("\n", output); + + for (int i = 0; i < outlines->getLength(); i++) + { + OutlineItem *item = (OutlineItem*)outlines->get(i); + GooString *titleStr = HtmlFont::HtmlFilter(item->getTitle(), + item->getTitleLength()); + int page = getOutlinePageNum(item); + if (page > 0) + { + fprintf(output, "%s\n", + page, titleStr->getCString()); + } + else + { + fprintf(output, "%s\n", titleStr->getCString()); + } + delete titleStr; + + item->open(); + if (item->hasKids()) + { + newXmlOutlineLevel(output, item->getKids(), catalog); + } + item->close(); + } + + fputs("\n", output); +#endif +} + +#ifndef DISABLE_OUTLINE +int HtmlOutputDev::getOutlinePageNum(OutlineItem *item) +{ + LinkAction *action = item->getAction(); + LinkGoTo *link = NULL; + LinkDest *linkdest = NULL; + int pagenum = -1; + + if (!action || action->getKind() != actionGoTo) + return pagenum; + + link = dynamic_cast(action); + + if (!link || !link->isOk()) + return pagenum; + + if (link->getDest()) + linkdest = link->getDest()->copy(); + else if (link->getNamedDest()) + linkdest = catalog->findDest(link->getNamedDest()); + + if (!linkdest) + return pagenum; + + if (linkdest->isPageRef()) { + Ref pageref = linkdest->getPageRef(); + pagenum = catalog->findPage(pageref.num, pageref.gen); + } else { + pagenum = linkdest->getPageNum(); + } + + delete linkdest; + return pagenum; +} +#endif diff --git a/utils/HtmlOutputDev.h b/utils/HtmlOutputDev.h new file mode 100644 index 0000000..12b16bf --- /dev/null +++ b/utils/HtmlOutputDev.h @@ -0,0 +1,354 @@ +//======================================================================== +// +// HtmlOutputDev.h +// +// Copyright 1997 Derek B. Noonburg +// +// Changed 1999 by G.Ovtcharov +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006, 2007, 2009, 2012 Albert Astals Cid +// Copyright (C) 2008, 2009 Warren Toomey +// Copyright (C) 2009, 2011 Carlos Garcia Campos +// Copyright (C) 2009 Kovid Goyal +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2011 Joshua Richardson +// Copyright (C) 2011 Stephen Reichling +// Copyright (C) 2012 Igor Slepchin +// Copyright (C) 2012 Fabio D'Urso +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef HTMLOUTPUTDEV_H +#define HTMLOUTPUTDEV_H + +#ifdef __GNUC__ +#pragma interface +#endif + +#include +#include "goo/gtypes.h" +#include "goo/GooList.h" +#include "GfxFont.h" +#include "OutputDev.h" +#include "HtmlLinks.h" +#include "HtmlFonts.h" +#include "Link.h" +#include "Catalog.h" +#include "UnicodeMap.h" + + +#ifdef _WIN32 +# define SLASH '\\' +#else +# define SLASH '/' +#endif + +#define xoutRound(x) ((int)(x + 0.5)) + +#define DOCTYPE "" + +class GfxState; +class GooString; +class PDFDoc; +class OutlineItem; +//------------------------------------------------------------------------ +// HtmlString +//------------------------------------------------------------------------ + +enum UnicodeTextDirection { + textDirUnknown, + textDirLeftRight, + textDirRightLeft, + textDirTopBottom +}; + + +class HtmlString { +public: + + // Constructor. + HtmlString(GfxState *state, double fontSize, HtmlFontAccu* fonts); + + // Destructor. + ~HtmlString(); + + // Add a character to the string. + void addChar(GfxState *state, double x, double y, + double dx, double dy, + Unicode u); + HtmlLink* getLink() { return link; } + const HtmlFont &getFont() const { return *fonts->Get(fontpos); } + void endString(); // postprocessing + +private: +// aender die text variable + HtmlLink *link; + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + int col; // starting column + Unicode *text; // the text + double *xRight; // right-hand x coord of each char + HtmlString *yxNext; // next string in y-major order + HtmlString *xyNext; // next string in x-major order + int fontpos; + GooString* htext; + int len; // length of text and xRight + int size; // size of text and xRight arrays + UnicodeTextDirection dir; // direction (left to right/right to left) + HtmlFontAccu *fonts; + + friend class HtmlPage; + +}; + + +//------------------------------------------------------------------------ +// HtmlPage +//------------------------------------------------------------------------ + + + +class HtmlPage { +public: + + // Constructor. + HtmlPage(GBool rawOrder, char *imgExtVal); + + // Destructor. + ~HtmlPage(); + + // Begin a new string. + void beginString(GfxState *state, GooString *s); + + // Add a character to the current string. + void addChar(GfxState *state, double x, double y, + double dx, double dy, + double ox, double oy, + Unicode *u, int uLen); //Guchar c); + + void updateFont(GfxState *state); + + // End the current string, sorting it into the list of strings. + void endString(); + + // Coalesce strings that look like parts of the same line. + void coalesce(); + + // Find a string. If is true, starts looking at top of page; + // otherwise starts looking at ,. If is true, + // stops looking at bottom of page; otherwise stops looking at + // ,. If found, sets the text bounding rectange and + // returns true; otherwise returns false. + + + // new functions + void AddLink(const HtmlLink& x){ + links->AddLink(x); + } + + // add an image to the current page + void addImage(GooString *fname, GfxState *state); + + // number of images on the current page + int getNumImages() { return imgList->getLength(); } + + void dump(FILE *f, int pageNum); + + // Clear the page. + void clear(); + + void conv(); +private: + HtmlFont* getFont(HtmlString *hStr) { return fonts->Get(hStr->fontpos); } + + double fontSize; // current font size + GBool rawOrder; // keep strings in content stream order + + HtmlString *curStr; // currently active string + + HtmlString *yxStrings; // strings in y-major order + HtmlString *xyStrings; // strings in x-major order + HtmlString *yxCur1, *yxCur2; // cursors for yxStrings list + + void setDocName(char* fname); + void dumpAsXML(FILE* f,int page); + void dumpComplex(FILE* f, int page); + int dumpComplexHeaders(FILE * const file, FILE *& pageFile, int page); + + // marks the position of the fonts that belong to current page (for noframes) + int fontsPageMarker; + HtmlFontAccu *fonts; + HtmlLinks *links; + GooList *imgList; + + GooString *DocName; + GooString *imgExt; + int pageWidth; + int pageHeight; + int firstPage; // used to begin the numeration of pages + + friend class HtmlOutputDev; +}; + +//------------------------------------------------------------------------ +// HtmlMetaVar +//------------------------------------------------------------------------ +class HtmlMetaVar { +public: + HtmlMetaVar(const char *_name, const char *_content); + ~HtmlMetaVar(); + + GooString* toString(); + +private: + + GooString *name; + GooString *content; +}; + +//------------------------------------------------------------------------ +// HtmlOutputDev +//------------------------------------------------------------------------ + +class HtmlOutputDev: public OutputDev { +public: + + // Open a text output file. If is NULL, no file is written + // (this is useful, e.g., for searching text). If is true, + // text is converted to 7-bit ASCII; otherwise, text is converted to + // 8-bit ISO Latin-1. should also be set for Japanese + // (EUC-JP) text. If is true, the text is kept in content + // stream order. + HtmlOutputDev(Catalog *catalogA, char *fileName, char *title, + char *author, + char *keywords, + char *subject, + char *date, + char *extension, + GBool rawOrder, + int firstPage = 1, + GBool outline = 0); + + // Destructor. + virtual ~HtmlOutputDev(); + + // Check if file was successfully created. + virtual GBool isOk() { return ok; } + + //---- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + // Does this device need non-text content? + virtual GBool needNonText() { return gTrue; } + + //----- initialization and control + + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, + GBool (* abortCheckCbk)(void *data) = NULL, + void * abortCheckCbkData = NULL, + GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL, + void *annotDisplayDecideCbkData = NULL) + { + docPage = page; + return gTrue; + } + + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- text drawing + virtual void beginString(GfxState *state, GooString *s); + virtual void endString(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + + virtual void drawImageMask(GfxState *state, Object *ref, + Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + + //new feature + virtual int DevType() {return 1234;} + + int getPageWidth() { return maxPageWidth; } + int getPageHeight() { return maxPageHeight; } + + GBool dumpDocOutline(PDFDoc* doc); + +private: + // convert encoding into a HTML standard, or encoding->getCString if not + // recognized. Will delete encoding for you and return a new one + // that you have to delete + static GooString* mapEncodingToHtml(GooString* encoding); + void doProcessLink(AnnotLink *link); + GooString* getLinkDest(AnnotLink *link); + void dumpMetaVars(FILE *); + void doFrame(int firstPage); + GBool newHtmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog, int level = 1); + void newXmlOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog); +#ifndef DISABLE_OUTLINE + int getOutlinePageNum(OutlineItem *item); +#endif + void drawJpegImage(GfxState *state, Stream *str); + void drawPngImage(GfxState *state, Stream *str, int width, int height, + GfxImageColorMap *colorMap, GBool isMask = gFalse); + GooString *createImageFileName(const char *ext); + + FILE *fContentsFrame; + FILE *page; // html file + //FILE *tin; // image log file + //GBool write; + GBool needClose; // need to close the file? + HtmlPage *pages; // text for the current page + GBool rawOrder; // keep text in content stream order + GBool doOutline; // output document outline + GBool ok; // set up ok? + GBool dumpJPEG; + int pageNum; + int maxPageWidth; + int maxPageHeight; + GooString *Docname; + GooString *docTitle; + GooList *glMetaVars; + Catalog *catalog; + Page *docPage; + friend class HtmlPage; +}; + +#endif diff --git a/utils/HtmlUtils.h b/utils/HtmlUtils.h new file mode 100644 index 0000000..bdb89b9 --- /dev/null +++ b/utils/HtmlUtils.h @@ -0,0 +1,51 @@ +// +// HtmlUtils.h +// +// Created on: Jun 8, 2011 +// Author: Joshua Richardson +// Copyright 2011 +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2011 Joshua Richardson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef HTMLUTILS_H_ +#define HTMLUTILS_H_ + +#include // fabs +#include "goo/gtypes.h" // GBool + +// Returns true iff the difference between a and b is less than the threshold +// We always use fuzzy math when comparing decimal numbers due to imprecision +inline GBool is_within(double a, double thresh, double b) { + return fabs(a-b) < thresh; +} + +inline GBool rot_matrices_equal(const double * const mat0, const double * const mat1) { + return is_within(mat0[0], .1, mat1[0]) && is_within(mat0[1], .1, mat1[1]) && + is_within(mat0[2], .1, mat1[2]) && is_within(mat0[3], .1, mat1[3]); +} + +// rotation is (cos q, sin q, -sin q, cos q, 0, 0) +// sin q is zero iff there is no rotation, or 180 deg. rotation; +// for 180 rotation, cos q will be negative +inline GBool isMatRotOrSkew(const double * const mat) { + return mat[0] < 0 || !is_within(mat[1], .1, 0); +} + +// Alters the matrix so that it does not scale a vector's x component; +// If the matrix does not skew, then that will also normalize the y +// component, keeping any rotation, but removing scaling. +inline void normalizeRotMat(double *mat) { + double scale = fabs(mat[0] + mat[1]); + if (!scale) return; + for (int i = 0; i < 4; i++) mat[i] /= scale; +} + +#endif /* HTMLUTILS_H_ */ diff --git a/utils/ImageOutputDev.cc b/utils/ImageOutputDev.cc new file mode 100644 index 0000000..0c06513 --- /dev/null +++ b/utils/ImageOutputDev.cc @@ -0,0 +1,425 @@ +//======================================================================== +// +// ImageOutputDev.cc +// +// Copyright 1998-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2005, 2007, 2011 Albert Astals Cid +// Copyright (C) 2006 Rainer Keller +// Copyright (C) 2008 Timothy Lee +// Copyright (C) 2008 Vasile Gaburici +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2009 William Bader +// Copyright (C) 2010 Jakob Voss +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "goo/gmem.h" +#include "Error.h" +#include "GfxState.h" +#include "Object.h" +#include "Stream.h" +#include "ImageOutputDev.h" + +ImageOutputDev::ImageOutputDev(char *fileRootA, GBool pageNamesA, GBool dumpJPEGA, GBool listImagesA) { + listImages = listImagesA; + if (!listImages) { + fileRoot = copyString(fileRootA); + fileName = (char *)gmalloc(strlen(fileRoot) + 45); + } + dumpJPEG = dumpJPEGA; + pageNames = pageNamesA; + imgNum = 0; + pageNum = 0; + ok = gTrue; + if (listImages) { + printf("page num type width height color comp bpc enc interp object ID\n"); + printf("---------------------------------------------------------------------\n"); + } +} + + +ImageOutputDev::~ImageOutputDev() { + if (!listImages) { + gfree(fileName); + gfree(fileRoot); + } +} + +void ImageOutputDev::setFilename(const char *fileExt) { + if (pageNames) { + sprintf(fileName, "%s-%03d-%03d.%s", fileRoot, pageNum, imgNum, fileExt); + } else { + sprintf(fileName, "%s-%03d.%s", fileRoot, imgNum, fileExt); + } +} + +void ImageOutputDev::listImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, GBool inlineImg, + ImageType imageType) { + const char *type; + const char *colorspace; + const char *enc; + int components, bpc; + + printf("%4d %5d ", pageNum, imgNum); + type = ""; + switch (imageType) { + case imgImage: + type = "image"; + break; + case imgStencil: + type = "stencil"; + break; + case imgMask: + type = "mask"; + break; + case imgSmask: + type = "smask"; + break; + } + printf("%-7s %5d %5d ", type, width, height); + + colorspace = "-"; + /* masks and stencils default to ncomps = 1 and bpc = 1 */ + components = 1; + bpc = 1; + if (colorMap && colorMap->isOk()) { + switch (colorMap->getColorSpace()->getMode()) { + case csDeviceGray: + case csCalGray: + colorspace = "gray"; + break; + case csDeviceRGB: + case csCalRGB: + colorspace = "rgb"; + break; + case csDeviceCMYK: + colorspace = "cmyk"; + break; + case csLab: + colorspace = "lab"; + break; + case csICCBased: + colorspace = "icc"; + break; + case csIndexed: + colorspace = "index"; + break; + case csSeparation: + colorspace = "sep"; + break; + case csDeviceN: + colorspace = "devn"; + break; + case csPattern: + default: + colorspace = "-"; + break; + } + components = colorMap->getNumPixelComps(); + bpc = colorMap->getBits(); + } + printf("%-5s %2d %2d ", colorspace, components, bpc); + + switch (str->getKind()) { + case strCCITTFax: + enc = "ccitt"; + break; + case strDCT: + enc = "jpeg"; + break; + case strJPX: + enc = "jpx"; + break; + case strJBIG2: + enc = "jbig2"; + break; + case strFile: + case strFlate: + case strCachedFile: + case strASCIIHex: + case strASCII85: + case strLZW: + case strRunLength: + case strWeird: + default: + enc = "image"; + break; + } + printf("%-5s ", enc); + + printf("%-3s ", interpolate ? "yes" : "no"); + + if (inlineImg) { + printf("[inline]\n"); + } else if (ref->isRef()) { + const Ref imageRef = ref->getRef(); + if (imageRef.gen >= 100000) { + printf("[none]\n"); + } else { + printf(" %6d %2d\n", imageRef.num, imageRef.gen); + } + } else { + printf("[none]\n"); + } + + ++imgNum; +} + +void ImageOutputDev::writeMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + FILE *f; + int c; + int size, i; + + // dump JPEG file + if (dumpJPEG && str->getKind() == strDCT && !inlineImg) { + + // open the image file + setFilename("jpg"); + ++imgNum; + if (!(f = fopen(fileName, "wb"))) { + error(errIO, -1, "Couldn't open image file '{0:s}'", fileName); + return; + } + + // initialize stream + str = str->getNextStream(); + str->reset(); + + // copy the stream + while ((c = str->getChar()) != EOF) + fputc(c, f); + + str->close(); + fclose(f); + + // dump PBM file + } else { + + // open the image file and write the PBM header + setFilename("pbm"); + ++imgNum; + if (!(f = fopen(fileName, "wb"))) { + error(errIO, -1, "Couldn't open image file '{0:s}'", fileName); + return; + } + fprintf(f, "P4\n"); + fprintf(f, "%d %d\n", width, height); + + // initialize stream + str->reset(); + + // copy the stream + size = height * ((width + 7) / 8); + for (i = 0; i < size; ++i) { + fputc(str->getChar(), f); + } + + str->close(); + fclose(f); + } +} + +void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) { + FILE *f; + ImageStream *imgStr; + Guchar *p; + Guchar zero = 0; + GfxGray gray; + GfxRGB rgb; + int x, y; + int c; + int size, i; + int pbm_mask = 0xff; + + // dump JPEG file + if (dumpJPEG && str->getKind() == strDCT && + (colorMap->getNumPixelComps() == 1 || + colorMap->getNumPixelComps() == 3) && + !inlineImg) { + + // open the image file + setFilename("jpg"); + ++imgNum; + if (!(f = fopen(fileName, "wb"))) { + error(errIO, -1, "Couldn't open image file '{0:s}'", fileName); + return; + } + + // initialize stream + str = str->getNextStream(); + str->reset(); + + // copy the stream + while ((c = str->getChar()) != EOF) + fputc(c, f); + + str->close(); + fclose(f); + + // dump PBM file + } else if (colorMap->getNumPixelComps() == 1 && + colorMap->getBits() == 1) { + + // open the image file and write the PBM header + setFilename("pbm"); + ++imgNum; + if (!(f = fopen(fileName, "wb"))) { + error(errIO, -1, "Couldn't open image file '{0:s}'", fileName); + return; + } + fprintf(f, "P4\n"); + fprintf(f, "%d %d\n", width, height); + + // initialize stream + str->reset(); + + // if 0 comes out as 0 in the color map, the we _flip_ stream bits + // otherwise we pass through stream bits unmolested + colorMap->getGray(&zero, &gray); + if(colToByte(gray)) + pbm_mask = 0; + + // copy the stream + size = height * ((width + 7) / 8); + for (i = 0; i < size; ++i) { + fputc(str->getChar() ^ pbm_mask, f); + } + + str->close(); + fclose(f); + + // dump PPM file + } else { + + // open the image file and write the PPM header + setFilename("ppm"); + ++imgNum; + if (!(f = fopen(fileName, "wb"))) { + error(errIO, -1, "Couldn't open image file '{0:s}'", fileName); + return; + } + fprintf(f, "P6\n"); + fprintf(f, "%d %d\n", width, height); + fprintf(f, "255\n"); + + // initialize stream + imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), + colorMap->getBits()); + imgStr->reset(); + + // for each line... + for (y = 0; y < height; ++y) { + + // write the line + if ((p = imgStr->getLine())) { + for (x = 0; x < width; ++x) { + colorMap->getRGB(p, &rgb); + fputc(colToByte(rgb.r), f); + fputc(colToByte(rgb.g), f); + fputc(colToByte(rgb.b), f); + p += colorMap->getNumPixelComps(); + } + } else { + for (x = 0; x < width; ++x) { + fputc(0, f); + fputc(0, f); + fputc(0, f); + } + } + } + imgStr->close(); + delete imgStr; + + fclose(f); + } +} + +GBool ImageOutputDev::tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) { + return gTrue; + // do nothing -- this avoids the potentially slow loop in Gfx.cc +} + +void ImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg) { + if (listImages) + listImage(state, ref, str, width, height, NULL, interpolate, inlineImg, imgMask); + else + writeMask(state, ref, str, width, height, invert, interpolate, inlineImg); +} + +void ImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg) { + if (listImages) + listImage(state, ref, str, width, height, colorMap, interpolate, inlineImg, imgImage); + else + writeImage(state, ref, str, width, height, colorMap, interpolate, maskColors, inlineImg); +} + +void ImageOutputDev::drawMaskedImage( + GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GBool maskInterpolate) { + if (listImages) { + listImage(state, ref, str, width, height, colorMap, interpolate, gFalse, imgImage); + listImage(state, ref, str, maskWidth, maskHeight, NULL, maskInterpolate, gFalse, imgMask); + } else { + drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse); + drawImageMask(state, ref, maskStr, maskWidth, maskHeight, maskInvert, + maskInterpolate, gFalse); + } +} + +void ImageOutputDev::drawSoftMaskedImage( + GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, GBool maskInterpolate) { + if (listImages) { + listImage(state, ref, str, width, height, colorMap, interpolate, gFalse, imgImage); + listImage(state, ref, maskStr, maskWidth, height, maskColorMap, maskInterpolate, gFalse, imgSmask); + } else { + drawImage(state, ref, str, width, height, colorMap, interpolate, NULL, gFalse); + drawImage(state, ref, maskStr, maskWidth, maskHeight, + maskColorMap, maskInterpolate, NULL, gFalse); + } +} diff --git a/utils/ImageOutputDev.h b/utils/ImageOutputDev.h new file mode 100644 index 0000000..6201a24 --- /dev/null +++ b/utils/ImageOutputDev.h @@ -0,0 +1,148 @@ +//======================================================================== +// +// ImageOutputDev.h +// +// Copyright 1998-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Rainer Keller +// Copyright (C) 2008 Timothy Lee +// Copyright (C) 2009 Carlos Garcia Campos +// Copyright (C) 2010 Jakob Voss +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#ifndef IMAGEOUTPUTDEV_H +#define IMAGEOUTPUTDEV_H + +#include "poppler/poppler-config.h" + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "goo/gtypes.h" +#include "OutputDev.h" + +class GfxState; + +//------------------------------------------------------------------------ +// ImageOutputDev +//------------------------------------------------------------------------ + +class ImageOutputDev: public OutputDev { +public: + enum ImageType { + imgImage, + imgStencil, + imgMask, + imgSmask + }; + + // Create an OutputDev which will write images to files named + // -NNN. or -PPP-NNN., if + // is set. Normally, all images are written as PBM + // (.pbm) or PPM (.ppm) files. If is set, JPEG images + // are written as JPEG (.jpg) files. + ImageOutputDev(char *fileRootA, GBool pageNamesA, GBool dumpJPEGA, GBool listImagesA); + + // Destructor. + virtual ~ImageOutputDev(); + + // Check if file was successfully created. + virtual GBool isOk() { return ok; } + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + // Does this device need non-text content? + virtual GBool needNonText() { return gTrue; } + + // Start a page + virtual void startPage(int pageNumA, GfxState *state) + { pageNum = pageNumA; } + + //---- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gFalse; } + + //----- path painting + virtual GBool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat, Object *str, + double *pmat, int paintType, int tilingType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert, GBool maskInterpolate); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap, + GBool maskInterpolate); + +private: + // Sets the output filename with a given file extension + void setFilename(const char *fileExt); + void listImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + GBool interpolate, GBool inlineImg, + ImageType imageType); + void writeMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool interpolate, GBool inlineImg); + void writeImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + GBool interpolate, int *maskColors, GBool inlineImg); + + + char *fileRoot; // root of output file names + char *fileName; // buffer for output file names + GBool listImages; // list images instead of dumping + GBool dumpJPEG; // set to dump native JPEG files + GBool pageNames; // set to include page number in file names + int pageNum; // current page number + int imgNum; // current image number + GBool ok; // set up ok? +}; + +#endif diff --git a/utils/Makefile.am b/utils/Makefile.am new file mode 100644 index 0000000..ad845c1 --- /dev/null +++ b/utils/Makefile.am @@ -0,0 +1,137 @@ +if BUILD_SPLASH_OUTPUT + +pdftoppm_SOURCES = \ + pdftoppm.cc \ + $(common) + +pdftoppm_binary = pdftoppm + +pdftoppm_manpage = pdftoppm.1 + +endif + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + -I$(top_srcdir)/utils \ + -I$(top_srcdir)/poppler \ + $(UTILS_CFLAGS) \ + $(FONTCONFIG_CFLAGS) \ + $(PDFTOCAIRO_CFLAGS) + +LDADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(UTILS_LIBS) \ + $(FONTCONFIG_LIBS) + +if BUILD_CAIRO_OUTPUT + +pdftocairo_SOURCES = \ + pdftocairo.cc \ + $(common) + +if USE_CMS +PDFTOCAIRO_CFLAGS += $(LCMS_CFLAGS) +PDFTOCAIRO_LIBS += $(LCMS_LIBS) +endif + +pdftocairo_LDADD = \ + $(top_builddir)/poppler/libpoppler-cairo.la \ + $(LDADD) $(PDFTOCAIRO_LIBS) + + +pdftocairo_binary = pdftocairo + +pdftocairo_manpage = pdftocairo.1 + +endif + +AM_LDFLAGS = @auto_import_flags@ + +bin_PROGRAMS = \ + pdfdetach \ + pdffonts \ + pdfimages \ + pdfinfo \ + pdftops \ + pdftotext \ + pdftohtml \ + pdfseparate \ + pdfunite \ + $(pdftoppm_binary) \ + $(pdftocairo_binary) + +dist_man1_MANS = \ + pdfdetach.1 \ + pdffonts.1 \ + pdfimages.1 \ + pdfinfo.1 \ + pdftops.1 \ + pdftotext.1 \ + pdftohtml.1 \ + pdfseparate.1 \ + pdfunite.1 \ + $(pdftoppm_manpage) \ + $(pdftocairo_manpage) + +common = parseargs.cc parseargs.h + +pdfdetach_SOURCES = \ + pdfdetach.cc \ + $(common) + +pdffonts_SOURCES = \ + pdffonts.cc \ + $(common) + +pdfimages_SOURCES = \ + pdfimages.cc \ + ImageOutputDev.cc \ + ImageOutputDev.h \ + $(common) + +pdfinfo_SOURCES = \ + pdfinfo.cc \ + printencodings.cc \ + printencodings.h \ + $(common) + +pdftops_SOURCES = \ + pdftops.cc \ + $(common) + +pdftotext_SOURCES = \ + pdftotext.cc \ + printencodings.cc \ + printencodings.h \ + $(common) + +pdftohtml_SOURCES = \ + pdftohtml.cc \ + HtmlFonts.cc \ + HtmlFonts.h \ + HtmlLinks.cc \ + HtmlLinks.h \ + HtmlOutputDev.cc \ + HtmlOutputDev.h \ + HtmlUtils.h \ + $(common) + +# HtmlOutputDev uses goo/PNGWriter.h that may depend on libpng header +pdftohtml_CXXFLAGS = $(AM_CXXFLAGS) +if BUILD_LIBPNG +pdftohtml_CXXFLAGS += $(LIBPNG_CFLAGS) +endif + +pdfseparate_SOURCES = \ + pdfseparate.cc \ + $(common) + +pdfunite_SOURCES = \ + pdfunite.cc \ + $(common) + +# Yay, automake! It should be able to figure out that it has to dist +# pdftoppm.1, but nooo. So we just add it here. + +EXTRA_DIST = pdf2xml.dtd pdftoppm.1 diff --git a/utils/Makefile.in b/utils/Makefile.in new file mode 100644 index 0000000..cfda1da --- /dev/null +++ b/utils/Makefile.in @@ -0,0 +1,1052 @@ +# Makefile.in generated by automake 1.11.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@am__append_1 = $(LCMS_CFLAGS) +@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@am__append_2 = $(LCMS_LIBS) +bin_PROGRAMS = pdfdetach$(EXEEXT) pdffonts$(EXEEXT) pdfimages$(EXEEXT) \ + pdfinfo$(EXEEXT) pdftops$(EXEEXT) pdftotext$(EXEEXT) \ + pdftohtml$(EXEEXT) pdfseparate$(EXEEXT) pdfunite$(EXEEXT) \ + $(am__EXEEXT_1) $(am__EXEEXT_2) +@BUILD_LIBPNG_TRUE@am__append_3 = $(LIBPNG_CFLAGS) +subdir = utils +DIST_COMMON = $(dist_man1_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/define-dir.m4 $(top_srcdir)/m4/gtk-doc.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/libjpeg.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h \ + $(top_builddir)/poppler/poppler-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@BUILD_SPLASH_OUTPUT_TRUE@am__EXEEXT_1 = pdftoppm$(EXEEXT) +@BUILD_CAIRO_OUTPUT_TRUE@am__EXEEXT_2 = pdftocairo$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am__objects_1 = parseargs.$(OBJEXT) +am_pdfdetach_OBJECTS = pdfdetach.$(OBJEXT) $(am__objects_1) +pdfdetach_OBJECTS = $(am_pdfdetach_OBJECTS) +pdfdetach_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +pdfdetach_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am_pdffonts_OBJECTS = pdffonts.$(OBJEXT) $(am__objects_1) +pdffonts_OBJECTS = $(am_pdffonts_OBJECTS) +pdffonts_LDADD = $(LDADD) +pdffonts_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am_pdfimages_OBJECTS = pdfimages.$(OBJEXT) ImageOutputDev.$(OBJEXT) \ + $(am__objects_1) +pdfimages_OBJECTS = $(am_pdfimages_OBJECTS) +pdfimages_LDADD = $(LDADD) +pdfimages_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am_pdfinfo_OBJECTS = pdfinfo.$(OBJEXT) printencodings.$(OBJEXT) \ + $(am__objects_1) +pdfinfo_OBJECTS = $(am_pdfinfo_OBJECTS) +pdfinfo_LDADD = $(LDADD) +pdfinfo_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am_pdfseparate_OBJECTS = pdfseparate.$(OBJEXT) $(am__objects_1) +pdfseparate_OBJECTS = $(am_pdfseparate_OBJECTS) +pdfseparate_LDADD = $(LDADD) +pdfseparate_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am__pdftocairo_SOURCES_DIST = pdftocairo.cc parseargs.cc parseargs.h +@BUILD_CAIRO_OUTPUT_TRUE@am_pdftocairo_OBJECTS = pdftocairo.$(OBJEXT) \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(am__objects_1) +pdftocairo_OBJECTS = $(am_pdftocairo_OBJECTS) +am__DEPENDENCIES_2 = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@am__DEPENDENCIES_3 = \ +@BUILD_CAIRO_OUTPUT_TRUE@@USE_CMS_TRUE@ $(am__DEPENDENCIES_1) +am__DEPENDENCIES_4 = $(am__DEPENDENCIES_3) +@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_DEPENDENCIES = $(top_builddir)/poppler/libpoppler-cairo.la \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(am__DEPENDENCIES_2) \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(am__DEPENDENCIES_4) +am__objects_2 = pdftohtml-parseargs.$(OBJEXT) +am_pdftohtml_OBJECTS = pdftohtml-pdftohtml.$(OBJEXT) \ + pdftohtml-HtmlFonts.$(OBJEXT) pdftohtml-HtmlLinks.$(OBJEXT) \ + pdftohtml-HtmlOutputDev.$(OBJEXT) $(am__objects_2) +pdftohtml_OBJECTS = $(am_pdftohtml_OBJECTS) +pdftohtml_LDADD = $(LDADD) +pdftohtml_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +pdftohtml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(pdftohtml_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__pdftoppm_SOURCES_DIST = pdftoppm.cc parseargs.cc parseargs.h +@BUILD_SPLASH_OUTPUT_TRUE@am_pdftoppm_OBJECTS = pdftoppm.$(OBJEXT) \ +@BUILD_SPLASH_OUTPUT_TRUE@ $(am__objects_1) +pdftoppm_OBJECTS = $(am_pdftoppm_OBJECTS) +pdftoppm_LDADD = $(LDADD) +pdftoppm_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am_pdftops_OBJECTS = pdftops.$(OBJEXT) $(am__objects_1) +pdftops_OBJECTS = $(am_pdftops_OBJECTS) +pdftops_LDADD = $(LDADD) +pdftops_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am_pdftotext_OBJECTS = pdftotext.$(OBJEXT) printencodings.$(OBJEXT) \ + $(am__objects_1) +pdftotext_OBJECTS = $(am_pdftotext_OBJECTS) +pdftotext_LDADD = $(LDADD) +pdftotext_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +am_pdfunite_OBJECTS = pdfunite.$(OBJEXT) $(am__objects_1) +pdfunite_OBJECTS = $(am_pdfunite_OBJECTS) +pdfunite_LDADD = $(LDADD) +pdfunite_DEPENDENCIES = $(top_builddir)/poppler/libpoppler.la \ + $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/poppler +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(pdfdetach_SOURCES) $(pdffonts_SOURCES) \ + $(pdfimages_SOURCES) $(pdfinfo_SOURCES) $(pdfseparate_SOURCES) \ + $(pdftocairo_SOURCES) $(pdftohtml_SOURCES) $(pdftoppm_SOURCES) \ + $(pdftops_SOURCES) $(pdftotext_SOURCES) $(pdfunite_SOURCES) +DIST_SOURCES = $(pdfdetach_SOURCES) $(pdffonts_SOURCES) \ + $(pdfimages_SOURCES) $(pdfinfo_SOURCES) $(pdfseparate_SOURCES) \ + $(am__pdftocairo_SOURCES_DIST) $(pdftohtml_SOURCES) \ + $(am__pdftoppm_SOURCES_DIST) $(pdftops_SOURCES) \ + $(pdftotext_SOURCES) $(pdfunite_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man1_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_FEATURE = @CAIRO_FEATURE@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_REQ = @CAIRO_REQ@ +CAIRO_VERSION = @CAIRO_VERSION@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_REQ = @GLIB_REQ@ +GLIB_REQUIRED = @GLIB_REQUIRED@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTK_TEST_CFLAGS = @GTK_TEST_CFLAGS@ +GTK_TEST_LIBS = @GTK_TEST_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ +LCMS_CFLAGS = @LCMS_CFLAGS@ +LCMS_LIBS = @LCMS_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_CFLAGS = @LIBCURL_CFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBICONV = @LIBICONV@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBOPENJPEG_CFLAGS = @LIBOPENJPEG_CFLAGS@ +LIBOPENJPEG_LIBS = @LIBOPENJPEG_LIBS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTIFF_CFLAGS = @LIBTIFF_CFLAGS@ +LIBTIFF_CFLAGSS = @LIBTIFF_CFLAGSS@ +LIBTIFF_LIBS = @LIBTIFF_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MOCQT4 = @MOCQT4@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PC_REQUIRES = @PC_REQUIRES@ +PC_REQUIRES_PRIVATE = @PC_REQUIRES_PRIVATE@ +PDFTOCAIRO_CFLAGS = @PDFTOCAIRO_CFLAGS@ $(am__append_1) +PDFTOCAIRO_LIBS = @PDFTOCAIRO_LIBS@ $(am__append_2) +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POPPLER_DATADIR = @POPPLER_DATADIR@ +POPPLER_GLIB_CFLAGS = @POPPLER_GLIB_CFLAGS@ +POPPLER_GLIB_DISABLE_DEPRECATED = @POPPLER_GLIB_DISABLE_DEPRECATED@ +POPPLER_GLIB_DISABLE_SINGLE_INCLUDES = @POPPLER_GLIB_DISABLE_SINGLE_INCLUDES@ +POPPLER_GLIB_LIBS = @POPPLER_GLIB_LIBS@ +POPPLER_MAJOR_VERSION = @POPPLER_MAJOR_VERSION@ +POPPLER_MICRO_VERSION = @POPPLER_MICRO_VERSION@ +POPPLER_MINOR_VERSION = @POPPLER_MINOR_VERSION@ +POPPLER_QT4_CFLAGS = @POPPLER_QT4_CFLAGS@ +POPPLER_QT4_CXXFLAGS = @POPPLER_QT4_CXXFLAGS@ +POPPLER_QT4_LIBS = @POPPLER_QT4_LIBS@ +POPPLER_QT4_TEST_CFLAGS = @POPPLER_QT4_TEST_CFLAGS@ +POPPLER_QT4_TEST_LIBS = @POPPLER_QT4_TEST_LIBS@ +POPPLER_VERSION = @POPPLER_VERSION@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TESTDATADIR = @TESTDATADIR@ +VERSION = @VERSION@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +auto_import_flags = @auto_import_flags@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +create_shared_lib = @create_shared_lib@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +win32_libs = @win32_libs@ +@BUILD_SPLASH_OUTPUT_TRUE@pdftoppm_SOURCES = \ +@BUILD_SPLASH_OUTPUT_TRUE@ pdftoppm.cc \ +@BUILD_SPLASH_OUTPUT_TRUE@ $(common) + +@BUILD_SPLASH_OUTPUT_TRUE@pdftoppm_binary = pdftoppm +@BUILD_SPLASH_OUTPUT_TRUE@pdftoppm_manpage = pdftoppm.1 +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + -I$(top_srcdir)/utils \ + -I$(top_srcdir)/poppler \ + $(UTILS_CFLAGS) \ + $(FONTCONFIG_CFLAGS) \ + $(PDFTOCAIRO_CFLAGS) + +LDADD = \ + $(top_builddir)/poppler/libpoppler.la \ + $(UTILS_LIBS) \ + $(FONTCONFIG_LIBS) + +@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_SOURCES = \ +@BUILD_CAIRO_OUTPUT_TRUE@ pdftocairo.cc \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(common) + +@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_LDADD = \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(top_builddir)/poppler/libpoppler-cairo.la \ +@BUILD_CAIRO_OUTPUT_TRUE@ $(LDADD) $(PDFTOCAIRO_LIBS) + +@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_binary = pdftocairo +@BUILD_CAIRO_OUTPUT_TRUE@pdftocairo_manpage = pdftocairo.1 +AM_LDFLAGS = @auto_import_flags@ +dist_man1_MANS = \ + pdfdetach.1 \ + pdffonts.1 \ + pdfimages.1 \ + pdfinfo.1 \ + pdftops.1 \ + pdftotext.1 \ + pdftohtml.1 \ + pdfseparate.1 \ + pdfunite.1 \ + $(pdftoppm_manpage) \ + $(pdftocairo_manpage) + +common = parseargs.cc parseargs.h +pdfdetach_SOURCES = \ + pdfdetach.cc \ + $(common) + +pdffonts_SOURCES = \ + pdffonts.cc \ + $(common) + +pdfimages_SOURCES = \ + pdfimages.cc \ + ImageOutputDev.cc \ + ImageOutputDev.h \ + $(common) + +pdfinfo_SOURCES = \ + pdfinfo.cc \ + printencodings.cc \ + printencodings.h \ + $(common) + +pdftops_SOURCES = \ + pdftops.cc \ + $(common) + +pdftotext_SOURCES = \ + pdftotext.cc \ + printencodings.cc \ + printencodings.h \ + $(common) + +pdftohtml_SOURCES = \ + pdftohtml.cc \ + HtmlFonts.cc \ + HtmlFonts.h \ + HtmlLinks.cc \ + HtmlLinks.h \ + HtmlOutputDev.cc \ + HtmlOutputDev.h \ + HtmlUtils.h \ + $(common) + + +# HtmlOutputDev uses goo/PNGWriter.h that may depend on libpng header +pdftohtml_CXXFLAGS = $(AM_CXXFLAGS) $(am__append_3) +pdfseparate_SOURCES = \ + pdfseparate.cc \ + $(common) + +pdfunite_SOURCES = \ + pdfunite.cc \ + $(common) + + +# Yay, automake! It should be able to figure out that it has to dist +# pdftoppm.1, but nooo. So we just add it here. +EXTRA_DIST = pdf2xml.dtd pdftoppm.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +pdfdetach$(EXEEXT): $(pdfdetach_OBJECTS) $(pdfdetach_DEPENDENCIES) $(EXTRA_pdfdetach_DEPENDENCIES) + @rm -f pdfdetach$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdfdetach_OBJECTS) $(pdfdetach_LDADD) $(LIBS) +pdffonts$(EXEEXT): $(pdffonts_OBJECTS) $(pdffonts_DEPENDENCIES) $(EXTRA_pdffonts_DEPENDENCIES) + @rm -f pdffonts$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdffonts_OBJECTS) $(pdffonts_LDADD) $(LIBS) +pdfimages$(EXEEXT): $(pdfimages_OBJECTS) $(pdfimages_DEPENDENCIES) $(EXTRA_pdfimages_DEPENDENCIES) + @rm -f pdfimages$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdfimages_OBJECTS) $(pdfimages_LDADD) $(LIBS) +pdfinfo$(EXEEXT): $(pdfinfo_OBJECTS) $(pdfinfo_DEPENDENCIES) $(EXTRA_pdfinfo_DEPENDENCIES) + @rm -f pdfinfo$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdfinfo_OBJECTS) $(pdfinfo_LDADD) $(LIBS) +pdfseparate$(EXEEXT): $(pdfseparate_OBJECTS) $(pdfseparate_DEPENDENCIES) $(EXTRA_pdfseparate_DEPENDENCIES) + @rm -f pdfseparate$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdfseparate_OBJECTS) $(pdfseparate_LDADD) $(LIBS) +pdftocairo$(EXEEXT): $(pdftocairo_OBJECTS) $(pdftocairo_DEPENDENCIES) $(EXTRA_pdftocairo_DEPENDENCIES) + @rm -f pdftocairo$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdftocairo_OBJECTS) $(pdftocairo_LDADD) $(LIBS) +pdftohtml$(EXEEXT): $(pdftohtml_OBJECTS) $(pdftohtml_DEPENDENCIES) $(EXTRA_pdftohtml_DEPENDENCIES) + @rm -f pdftohtml$(EXEEXT) + $(AM_V_CXXLD)$(pdftohtml_LINK) $(pdftohtml_OBJECTS) $(pdftohtml_LDADD) $(LIBS) +pdftoppm$(EXEEXT): $(pdftoppm_OBJECTS) $(pdftoppm_DEPENDENCIES) $(EXTRA_pdftoppm_DEPENDENCIES) + @rm -f pdftoppm$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdftoppm_OBJECTS) $(pdftoppm_LDADD) $(LIBS) +pdftops$(EXEEXT): $(pdftops_OBJECTS) $(pdftops_DEPENDENCIES) $(EXTRA_pdftops_DEPENDENCIES) + @rm -f pdftops$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdftops_OBJECTS) $(pdftops_LDADD) $(LIBS) +pdftotext$(EXEEXT): $(pdftotext_OBJECTS) $(pdftotext_DEPENDENCIES) $(EXTRA_pdftotext_DEPENDENCIES) + @rm -f pdftotext$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdftotext_OBJECTS) $(pdftotext_LDADD) $(LIBS) +pdfunite$(EXEEXT): $(pdfunite_OBJECTS) $(pdfunite_DEPENDENCIES) $(EXTRA_pdfunite_DEPENDENCIES) + @rm -f pdfunite$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(pdfunite_OBJECTS) $(pdfunite_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImageOutputDev.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseargs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfdetach.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdffonts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfimages.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfseparate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftocairo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-HtmlFonts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-HtmlLinks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-HtmlOutputDev.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-parseargs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftohtml-pdftohtml.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftoppm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftops.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdftotext.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdfunite.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printencodings.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +pdftohtml-pdftohtml.o: pdftohtml.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-pdftohtml.o -MD -MP -MF $(DEPDIR)/pdftohtml-pdftohtml.Tpo -c -o pdftohtml-pdftohtml.o `test -f 'pdftohtml.cc' || echo '$(srcdir)/'`pdftohtml.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-pdftohtml.Tpo $(DEPDIR)/pdftohtml-pdftohtml.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pdftohtml.cc' object='pdftohtml-pdftohtml.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-pdftohtml.o `test -f 'pdftohtml.cc' || echo '$(srcdir)/'`pdftohtml.cc + +pdftohtml-pdftohtml.obj: pdftohtml.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-pdftohtml.obj -MD -MP -MF $(DEPDIR)/pdftohtml-pdftohtml.Tpo -c -o pdftohtml-pdftohtml.obj `if test -f 'pdftohtml.cc'; then $(CYGPATH_W) 'pdftohtml.cc'; else $(CYGPATH_W) '$(srcdir)/pdftohtml.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-pdftohtml.Tpo $(DEPDIR)/pdftohtml-pdftohtml.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pdftohtml.cc' object='pdftohtml-pdftohtml.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-pdftohtml.obj `if test -f 'pdftohtml.cc'; then $(CYGPATH_W) 'pdftohtml.cc'; else $(CYGPATH_W) '$(srcdir)/pdftohtml.cc'; fi` + +pdftohtml-HtmlFonts.o: HtmlFonts.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlFonts.o -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlFonts.Tpo -c -o pdftohtml-HtmlFonts.o `test -f 'HtmlFonts.cc' || echo '$(srcdir)/'`HtmlFonts.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlFonts.Tpo $(DEPDIR)/pdftohtml-HtmlFonts.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HtmlFonts.cc' object='pdftohtml-HtmlFonts.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlFonts.o `test -f 'HtmlFonts.cc' || echo '$(srcdir)/'`HtmlFonts.cc + +pdftohtml-HtmlFonts.obj: HtmlFonts.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlFonts.obj -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlFonts.Tpo -c -o pdftohtml-HtmlFonts.obj `if test -f 'HtmlFonts.cc'; then $(CYGPATH_W) 'HtmlFonts.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlFonts.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlFonts.Tpo $(DEPDIR)/pdftohtml-HtmlFonts.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HtmlFonts.cc' object='pdftohtml-HtmlFonts.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlFonts.obj `if test -f 'HtmlFonts.cc'; then $(CYGPATH_W) 'HtmlFonts.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlFonts.cc'; fi` + +pdftohtml-HtmlLinks.o: HtmlLinks.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlLinks.o -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlLinks.Tpo -c -o pdftohtml-HtmlLinks.o `test -f 'HtmlLinks.cc' || echo '$(srcdir)/'`HtmlLinks.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlLinks.Tpo $(DEPDIR)/pdftohtml-HtmlLinks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HtmlLinks.cc' object='pdftohtml-HtmlLinks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlLinks.o `test -f 'HtmlLinks.cc' || echo '$(srcdir)/'`HtmlLinks.cc + +pdftohtml-HtmlLinks.obj: HtmlLinks.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlLinks.obj -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlLinks.Tpo -c -o pdftohtml-HtmlLinks.obj `if test -f 'HtmlLinks.cc'; then $(CYGPATH_W) 'HtmlLinks.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlLinks.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlLinks.Tpo $(DEPDIR)/pdftohtml-HtmlLinks.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HtmlLinks.cc' object='pdftohtml-HtmlLinks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlLinks.obj `if test -f 'HtmlLinks.cc'; then $(CYGPATH_W) 'HtmlLinks.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlLinks.cc'; fi` + +pdftohtml-HtmlOutputDev.o: HtmlOutputDev.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlOutputDev.o -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo -c -o pdftohtml-HtmlOutputDev.o `test -f 'HtmlOutputDev.cc' || echo '$(srcdir)/'`HtmlOutputDev.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo $(DEPDIR)/pdftohtml-HtmlOutputDev.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HtmlOutputDev.cc' object='pdftohtml-HtmlOutputDev.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlOutputDev.o `test -f 'HtmlOutputDev.cc' || echo '$(srcdir)/'`HtmlOutputDev.cc + +pdftohtml-HtmlOutputDev.obj: HtmlOutputDev.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-HtmlOutputDev.obj -MD -MP -MF $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo -c -o pdftohtml-HtmlOutputDev.obj `if test -f 'HtmlOutputDev.cc'; then $(CYGPATH_W) 'HtmlOutputDev.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlOutputDev.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-HtmlOutputDev.Tpo $(DEPDIR)/pdftohtml-HtmlOutputDev.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HtmlOutputDev.cc' object='pdftohtml-HtmlOutputDev.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-HtmlOutputDev.obj `if test -f 'HtmlOutputDev.cc'; then $(CYGPATH_W) 'HtmlOutputDev.cc'; else $(CYGPATH_W) '$(srcdir)/HtmlOutputDev.cc'; fi` + +pdftohtml-parseargs.o: parseargs.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-parseargs.o -MD -MP -MF $(DEPDIR)/pdftohtml-parseargs.Tpo -c -o pdftohtml-parseargs.o `test -f 'parseargs.cc' || echo '$(srcdir)/'`parseargs.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-parseargs.Tpo $(DEPDIR)/pdftohtml-parseargs.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parseargs.cc' object='pdftohtml-parseargs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-parseargs.o `test -f 'parseargs.cc' || echo '$(srcdir)/'`parseargs.cc + +pdftohtml-parseargs.obj: parseargs.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -MT pdftohtml-parseargs.obj -MD -MP -MF $(DEPDIR)/pdftohtml-parseargs.Tpo -c -o pdftohtml-parseargs.obj `if test -f 'parseargs.cc'; then $(CYGPATH_W) 'parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/parseargs.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdftohtml-parseargs.Tpo $(DEPDIR)/pdftohtml-parseargs.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parseargs.cc' object='pdftohtml-parseargs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdftohtml_CXXFLAGS) $(CXXFLAGS) -c -o pdftohtml-parseargs.obj `if test -f 'parseargs.cc'; then $(CYGPATH_W) 'parseargs.cc'; else $(CYGPATH_W) '$(srcdir)/parseargs.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(dist_man1_MANS) + @$(NORMAL_INSTALL) + @list1='$(dist_man1_MANS)'; \ + list2=''; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/utils/parseargs.cc b/utils/parseargs.cc new file mode 100644 index 0000000..a457a88 --- /dev/null +++ b/utils/parseargs.cc @@ -0,0 +1,220 @@ +/* + * parseargs.h + * + * Command line argument parser. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +/*======================================================================== + + Modified under the Poppler project - http://poppler.freedesktop.org + + Poppler project changes to this file are under the GPLv2 or later license + + All changes made under the Poppler project to this file are licensed + under GPL version 2 or later + + Copyright (C) 2008, 2009 Albert Astals Cid + Copyright (C) 2011, 2012 Adrian Johnson + + To see a description of the changes please see the Changelog file that + came with your tarball or type make ChangeLog if you are building from git + +========================================================================*/ + +#include +#include +#include +#include +#include +#include "parseargs.h" + +#include "goo/gstrtod.h" +#include "goo/GooString.h" + +static const ArgDesc *findArg(const ArgDesc *args, char *arg); +static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]); + +GBool parseArgs(const ArgDesc *args, int *argc, char *argv[]) { + const ArgDesc *arg; + int i, j; + GBool ok; + + ok = gTrue; + i = 1; + while (i < *argc) { + if (!strcmp(argv[i], "--")) { + --*argc; + for (j = i; j < *argc; ++j) + argv[j] = argv[j+1]; + break; + } else if ((arg = findArg(args, argv[i]))) { + if (!grabArg(arg, i, argc, argv)) + ok = gFalse; + } else { + ++i; + } + } + return ok; +} + +void printUsage(const char *program, const char *otherArgs, const ArgDesc *args) { + const ArgDesc *arg; + const char *typ; + int w, w1; + + w = 0; + for (arg = args; arg->arg; ++arg) { + if ((w1 = strlen(arg->arg)) > w) + w = w1; + } + + fprintf(stderr, "Usage: %s [options]", program); + if (otherArgs) + fprintf(stderr, " %s", otherArgs); + fprintf(stderr, "\n"); + + for (arg = args; arg->arg; ++arg) { + fprintf(stderr, " %s", arg->arg); + w1 = 9 + w - strlen(arg->arg); + switch (arg->kind) { + case argInt: + case argIntDummy: + typ = " "; + break; + case argFP: + case argFPDummy: + typ = " "; + break; + case argString: + case argStringDummy: + case argGooString: + typ = " "; + break; + case argFlag: + case argFlagDummy: + default: + typ = ""; + break; + } + fprintf(stderr, "%-*s", w1, typ); + if (arg->usage) + fprintf(stderr, ": %s", arg->usage); + fprintf(stderr, "\n"); + } +} + +static const ArgDesc *findArg(const ArgDesc *args, char *arg) { + const ArgDesc *p; + + for (p = args; p->arg; ++p) { + if (p->kind < argFlagDummy && !strcmp(p->arg, arg)) + return p; + } + return NULL; +} + +static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]) { + int n; + int j; + GBool ok; + + ok = gTrue; + n = 0; + switch (arg->kind) { + case argFlag: + *(GBool *)arg->val = gTrue; + n = 1; + break; + case argInt: + if (i + 1 < *argc && isInt(argv[i+1])) { + *(int *)arg->val = atoi(argv[i+1]); + n = 2; + } else { + ok = gFalse; + n = 1; + } + break; + case argFP: + if (i + 1 < *argc && isFP(argv[i+1])) { + *(double *)arg->val = gatof(argv[i+1]); + n = 2; + } else { + ok = gFalse; + n = 1; + } + break; + case argString: + if (i + 1 < *argc) { + strncpy((char *)arg->val, argv[i+1], arg->size - 1); + ((char *)arg->val)[arg->size - 1] = '\0'; + n = 2; + } else { + ok = gFalse; + n = 1; + } + break; + case argGooString: + if (i + 1 < *argc) { + ((GooString*)arg->val)->Set(argv[i+1]); + n = 2; + } else { + ok = gFalse; + n = 1; + } + break; + default: + fprintf(stderr, "Internal error in arg table\n"); + n = 1; + break; + } + if (n > 0) { + *argc -= n; + for (j = i; j < *argc; ++j) + argv[j] = argv[j+n]; + } + return ok; +} + +GBool isInt(char *s) { + if (*s == '-' || *s == '+') + ++s; + while (isdigit(*s)) + ++s; + if (*s) + return gFalse; + return gTrue; +} + +GBool isFP(char *s) { + int n; + + if (*s == '-' || *s == '+') + ++s; + n = 0; + while (isdigit(*s)) { + ++s; + ++n; + } + if (*s == '.') + ++s; + while (isdigit(*s)) { + ++s; + ++n; + } + if (n > 0 && (*s == 'e' || *s == 'E')) { + ++s; + if (*s == '-' || *s == '+') + ++s; + n = 0; + if (!isdigit(*s)) + return gFalse; + do { + ++s; + } while (isdigit(*s)); + } + if (*s) + return gFalse; + return gTrue; +} diff --git a/utils/parseargs.h b/utils/parseargs.h new file mode 100644 index 0000000..f035fa1 --- /dev/null +++ b/utils/parseargs.h @@ -0,0 +1,88 @@ +/* + * parseargs.h + * + * Command line argument parser. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +/*======================================================================== + + Modified under the Poppler project - http://poppler.freedesktop.org + + All changes made under the Poppler project to this file are licensed + under GPL version 2 or later + + Copyright (C) 2008 Albert Astals Cid + Copyright (C) 2011 Adrian Johnson + + To see a description of the changes please see the Changelog file that + came with your tarball or type make ChangeLog if you are building from git + +========================================================================*/ + +#ifndef PARSEARGS_H +#define PARSEARGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "goo/gtypes.h" + +/* + * Argument kinds. + */ +typedef enum { + argFlag, /* flag (present / not-present) */ + /* [val: GBool *] */ + argInt, /* integer arg */ + /* [val: int *] */ + argFP, /* floating point arg */ + /* [val: double *] */ + argString, /* string arg */ + /* [val: char *] */ + argGooString, /* string arg */ + /* [val: GooString *] */ + /* dummy entries -- these show up in the usage listing only; */ + /* useful for X args, for example */ + argFlagDummy, + argIntDummy, + argFPDummy, + argStringDummy +} ArgKind; + +/* + * Argument descriptor. + */ +typedef struct { + const char *arg; /* the command line switch */ + ArgKind kind; /* kind of arg */ + void *val; /* place to store value */ + int size; /* for argString: size of string */ + const char *usage; /* usage string */ +} ArgDesc; + +/* + * Parse command line. Removes all args which are found in the arg + * descriptor list . Stops parsing if "--" is found (and removes + * it). Returns gFalse if there was an error. + */ +extern GBool parseArgs(const ArgDesc *args, int *argc, char *argv[]); + +/* + * Print usage message, based on arg descriptor list. + */ +extern void printUsage(const char *program, const char *otherArgs, const ArgDesc *args); + +/* + * Check if a string is a valid integer or floating point number. + */ +extern GBool isInt(char *s); +extern GBool isFP(char *s); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/utils/pdf2xml.dtd b/utils/pdf2xml.dtd new file mode 100644 index 0000000..bf7f14f --- /dev/null +++ b/utils/pdf2xml.dtd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + diff --git a/utils/pdfdetach.1 b/utils/pdfdetach.1 new file mode 100644 index 0000000..c80dde7 --- /dev/null +++ b/utils/pdfdetach.1 @@ -0,0 +1,103 @@ +.\" Copyright 2011 Glyph & Cog, LLC +.TH pdfdetach 1 "15 August 2011" +.SH NAME +pdfdetach \- Portable Document Format (PDF) document embedded file +extractor (version 3.03) +.SH SYNOPSIS +.B pdfdetach +[options] +.RI [ PDF-file ] +.SH DESCRIPTION +.B Pdfdetach +lists or extracts embedded files (attachments) from a Portable +Document Format (PDF) file. +.SH CONFIGURATION FILE +Pdfdetach reads a configuration file at startup. It first tries to +find the user's private config file, ~/.xpdfrc. If that doesn't +exist, it looks for a system-wide config file, typically +/usr/local/etc/xpdfrc (but this location can be changed when pdfinfo +is built). See the +.BR xpdfrc (5) +man page for details. +.SH OPTIONS +Some of the following options can be set with configuration file +commands. These are listed in square brackets with the description of +the corresponding command line option. +.TP +.B \-list +List all of the embedded files in the PDF file. File names are +converted to the text encoding specified by the "\-enc" switch. +.TP +.BI \-save " number" +Save the specified embedded file. By default, this uses the file name +associated with the embedded file (as printed by the "\-list" switch); +the file name can be changed with the "\-o" switch. +.TP +.BI \-saveall +Save all of the embedded files. This uses the file names associated +with the embedded files (as printed by the "\-list" switch). By +default, the files are saved in the current directory; this can be +changed with the "\-o" switch. +.TP +.BI \-o " path" +Set the file name used when saving an embedded file with the "\-save" +switch, or the directory used by "\-saveall". +.TP +.BI \-enc " encoding-name" +Sets the encoding to use for text output (embedded file names). The +.I encoding\-name +must be defined with the unicodeMap command (see +.BR xpdfrc (5)). +This defaults to "Latin1" (which is a built-in encoding). +.RB "[config file: " textEncoding ] +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.BI \-cfg " config-file" +Read +.I config-file +in place of ~/.xpdfrc or the system-wide config file. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdfinfo software and documentation are copyright 1996-2011 Glyph & +Cog, LLC. +.SH "SEE ALSO" +.BR pdfimages (1), +.BR pdffonts (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftops (1), +.BR pdftotext (1) \ No newline at end of file diff --git a/utils/pdfdetach.cc b/utils/pdfdetach.cc new file mode 100644 index 0000000..3fbdfb7 --- /dev/null +++ b/utils/pdfdetach.cc @@ -0,0 +1,318 @@ +//======================================================================== +// +// pdfdetach.cc +// +// Copyright 2010 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2011 Carlos Garcia Campos +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include "goo/gtypes.h" +#include "goo/gmem.h" +#include "goo/GooList.h" +#include "parseargs.h" +#include "Annot.h" +#include "GlobalParams.h" +#include "Page.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "FileSpec.h" +#include "CharTypes.h" +#include "Catalog.h" +#include "UnicodeMap.h" +#include "PDFDocEncoding.h" +#include "Error.h" + +static GBool doList = gFalse; +static int saveNum = 0; +static GBool saveAll = gFalse; +static char savePath[1024] = ""; +static char textEncName[128] = ""; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; +static char cfgFileName[256] = ""; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static ArgDesc argDesc[] = { + {"-list", argFlag, &doList, 0, + "list all embedded files"}, + {"-save", argInt, &saveNum, 0, + "save the specified embedded file"}, + {"-saveall", argFlag, &saveAll, 0, + "save all embedded files"}, + {"-o", argString, savePath, sizeof(savePath), + "file name for the saved embedded file"}, + {"-enc", argString, textEncName, sizeof(textEncName), + "output text encoding name"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-cfg", argString, cfgFileName, sizeof(cfgFileName), + "configuration file to use in place of .xpdfrc"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +int main(int argc, char *argv[]) { + GooString *fileName; + UnicodeMap *uMap; + GooString *ownerPW, *userPW; + PDFDoc *doc; + char uBuf[8]; + char path[1024]; + char *p; + GBool ok; + int exitCode; + GooList *embeddedFiles = NULL; + int nFiles, nPages, n, i, j; + FileSpec *fileSpec; + Page *page; + Annots *annots; + Annot *annot; + GooString *s1; + Unicode u; + GBool isUnicode; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if ((doList ? 1 : 0) + + ((saveNum != 0) ? 1 : 0) + + (saveAll ? 1 : 0) != 1) { + ok = gFalse; + } + if (!ok || argc != 2 || printVersion || printHelp) { + fprintf(stderr, "pdfdetach version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdfdetach", "", argDesc); + } + goto err0; + } + fileName = new GooString(argv[1]); + + // read config file + globalParams = new GlobalParams(cfgFileName); + if (textEncName[0]) { + globalParams->setTextEncoding(textEncName); + } + + // get mapping to output encoding + if (!(uMap = globalParams->getTextEncoding())) { + error(errConfig, -1, "Couldn't get text encoding"); + delete fileName; + goto err1; + } + + // open PDF file + if (ownerPassword[0] != '\001') { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0] != '\001') { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err2; + } + + embeddedFiles = new GooList(); + for (i = 0; i < doc->getCatalog()->numEmbeddedFiles(); ++i) + embeddedFiles->append(doc->getCatalog()->embeddedFile(i)); + + nPages = doc->getCatalog()->getNumPages(); + for (i = 0; i < nPages; ++i) { + page = doc->getCatalog()->getPage(i + 1); + annots = page->getAnnots(); + if (!annots) + break; + + for (j = 0; j < annots->getNumAnnots(); ++j) { + annot = annots->getAnnot(j); + if (annot->getType() != Annot::typeFileAttachment) + continue; + embeddedFiles->append(new FileSpec(static_cast(annot)->getFile())); + } + } + + nFiles = embeddedFiles->getLength(); + + // list embedded files + if (doList) { + printf("%d embedded files\n", nFiles); + for (i = 0; i < nFiles; ++i) { + fileSpec = static_cast(embeddedFiles->get(i)); + printf("%d: ", i+1); + s1 = fileSpec->getFileName(); + if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) { + isUnicode = gTrue; + j = 2; + } else { + isUnicode = gFalse; + j = 0; + } + while (j < fileSpec->getFileName()->getLength()) { + if (isUnicode) { + u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff); + j += 2; + } else { + u = pdfDocEncoding[s1->getChar(j) & 0xff]; + ++j; + } + n = uMap->mapUnicode(u, uBuf, sizeof(uBuf)); + fwrite(uBuf, 1, n, stdout); + } + fputc('\n', stdout); + } + + // save all embedded files + } else if (saveAll) { + for (i = 0; i < nFiles; ++i) { + fileSpec = static_cast(embeddedFiles->get(i)); + if (savePath[0]) { + n = strlen(savePath); + if (n > (int)sizeof(path) - 2) { + n = sizeof(path) - 2; + } + memcpy(path, savePath, n); + path[n] = '/'; + p = path + n + 1; + } else { + p = path; + } + s1 = fileSpec->getFileName(); + if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) { + isUnicode = gTrue; + j = 2; + } else { + isUnicode = gFalse; + j = 0; + } + while (j < fileSpec->getFileName()->getLength()) { + if (isUnicode) { + u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff); + j += 2; + } else { + u = pdfDocEncoding[s1->getChar(j) & 0xff]; + ++j; + } + n = uMap->mapUnicode(u, uBuf, sizeof(uBuf)); + if (p + n >= path + sizeof(path)) + break; + memcpy(p, uBuf, n); + p += n; + } + *p = '\0'; + + if (!fileSpec->getEmbeddedFile()->save(path)) { + error(errIO, -1, "Error saving embedded file as '{0:s}'", p); + exitCode = 2; + goto err2; + } + } + + // save an embedded file + } else { + if (saveNum < 1 || saveNum > nFiles) { + error(errCommandLine, -1, "Invalid file number"); + goto err2; + } + + fileSpec = static_cast(embeddedFiles->get(saveNum - 1)); + if (savePath[0]) { + p = savePath; + } else { + p = path; + s1 = fileSpec->getFileName(); + if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) { + isUnicode = gTrue; + j = 2; + } else { + isUnicode = gFalse; + j = 0; + } + while (j < fileSpec->getFileName()->getLength()) { + if (isUnicode) { + u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff); + j += 2; + } else { + u = pdfDocEncoding[s1->getChar(j) & 0xff]; + ++j; + } + n = uMap->mapUnicode(u, uBuf, sizeof(uBuf)); + if (p + n >= path + sizeof(path)) + break; + memcpy(p, uBuf, n); + p += n; + } + *p = '\0'; + p = path; + } + + if (!fileSpec->getEmbeddedFile()->save(p)) { + error(errIO, -1, "Error saving embedded file as '{0:s}'", p); + exitCode = 2; + goto err2; + } + } + + exitCode = 0; + + // clean up + err2: + if (embeddedFiles) + deleteGooList(embeddedFiles, FileSpec); + uMap->decRefCnt(); + delete doc; + err1: + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} diff --git a/utils/pdffonts.1 b/utils/pdffonts.1 new file mode 100644 index 0000000..4afc395 --- /dev/null +++ b/utils/pdffonts.1 @@ -0,0 +1,119 @@ +.\" Copyright 1999-2011 Glyph & Cog, LLC +.TH pdffonts 1 "15 August 2011" +.SH NAME +pdffonts \- Portable Document Format (PDF) font analyzer (version +3.03) +.SH SYNOPSIS +.B pdffonts +[options] +.RI [ PDF-file ] +.SH DESCRIPTION +.B Pdffonts +lists the fonts used in a Portable Document Format (PDF) file along +with various information for each font. +.PP +The following information is listed for each font: +.TP +.B name +the font name, exactly as given in the PDF file (potentially including +a subset prefix) +.TP +.B type +the font type -- see below for details +.TP +.B encoding +the font encoding +.TP +.B emb +"yes" if the font is embedded in the PDF file +.TP +.B sub +"yes" if the font is a subset +.TP +.B uni +"yes" if there is an explicit "ToUnicode" map in the PDF file (the +absence of a ToUnicode map doesn't necessarily mean that the text +can't be converted to Unicode) +.TP +.B object ID +the font dictionary object ID (number and generation) +.PP +PDF files can contain the following types of fonts: +.PP +.RS +Type 1 +.RE +.RS +Type 1C -- aka Compact Font Format (CFF) +.RE +.RS +Type 3 +.RE +.RS +TrueType +.RE +.RS +CID Type 0 -- 16-bit font with no specified type +.RE +.RS +CID Type 0C -- 16-bit PostScript CFF font +.RE +.RS +CID TrueType -- 16-bit TrueType font +.RE +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to analyze. +.TP +.BI \-l " number" +Specifies the last page to analyze. +.TP +.BI \-subst +List the substitute fonts that poppler will use for non embedded fonts. +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdffonts software and documentation are copyright 1996-2011 Glyph +& Cog, LLC. +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdfimages (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftops (1), +.BR pdftotext (1) diff --git a/utils/pdffonts.cc b/utils/pdffonts.cc new file mode 100644 index 0000000..820abbf --- /dev/null +++ b/utils/pdffonts.cc @@ -0,0 +1,224 @@ +//======================================================================== +// +// pdffonts.cc +// +// Copyright 2001-2007 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Dominic Lachowicz +// Copyright (C) 2007-2008, 2010 Albert Astals Cid +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include "parseargs.h" +#include "goo/GooString.h" +#include "goo/gmem.h" +#include "GlobalParams.h" +#include "Object.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "FontInfo.h" + +static const char *fontTypeNames[] = { + "unknown", + "Type 1", + "Type 1C", + "Type 1C (OT)", + "Type 3", + "TrueType", + "TrueType (OT)", + "CID Type 0", + "CID Type 0C", + "CID Type 0C (OT)", + "CID TrueType", + "CID TrueType (OT)" +}; + +static int firstPage = 1; +static int lastPage = 0; +static GBool showSubst = gFalse; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to examine"}, + {"-l", argInt, &lastPage, 0, + "last page to examine"}, + {"-subst", argFlag, &showSubst, 0, + "show font substitutions"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName; + GooString *ownerPW, *userPW; + GBool ok; + int exitCode; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (!ok || argc != 2 || printVersion || printHelp) { + fprintf(stderr, "pdffonts version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdffonts", "", argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + goto err0; + } + fileName = new GooString(argv[1]); + + // read config file + globalParams = new GlobalParams(); + + // open PDF file + if (ownerPassword[0] != '\001') { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0] != '\001') { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + delete fileName; + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err1; + } + + // get page range + if (firstPage < 1) { + firstPage = 1; + } + if (lastPage < 1 || lastPage > doc->getNumPages()) { + lastPage = doc->getNumPages(); + } + + // get the fonts + { + FontInfoScanner scanner(doc, firstPage - 1); + GooList *fonts = scanner.scan(lastPage - firstPage + 1); + + if (showSubst) { + // print the font substitutions + printf("name object ID substitute font substitute font file\n"); + printf("------------------------------------ --------- ------------------------------------ ------------------------------------\n"); + if (fonts) { + for (int i = 0; i < fonts->getLength(); ++i) { + FontInfo *font = (FontInfo *)fonts->get(i); + if (font->getFile()) { + printf("%-36s", + font->getName() ? font->getName()->getCString() : "[none]"); + const Ref fontRef = font->getRef(); + if (fontRef.gen >= 100000) { + printf(" [none]"); + } else { + printf(" %6d %2d", fontRef.num, fontRef.gen); + } + printf(" %-36s %s\n", + font->getSubstituteName() ? font->getSubstituteName()->getCString() : "[none]", + font->getFile()->getCString()); + } + delete font; + } + delete fonts; + } + } else { + // print the font info + printf("name type encoding emb sub uni object ID\n"); + printf("------------------------------------ ----------------- ---------------- --- --- --- ---------\n"); + if (fonts) { + for (int i = 0; i < fonts->getLength(); ++i) { + FontInfo *font = (FontInfo *)fonts->get(i); + printf("%-36s %-17s %-16s %-3s %-3s %-3s", + font->getName() ? font->getName()->getCString() : "[none]", + fontTypeNames[font->getType()], + font->getEncoding()->getCString(), + font->getEmbedded() ? "yes" : "no", + font->getSubset() ? "yes" : "no", + font->getToUnicode() ? "yes" : "no"); + const Ref fontRef = font->getRef(); + if (fontRef.gen >= 100000) { + printf(" [none]\n"); + } else { + printf(" %6d %2d\n", fontRef.num, fontRef.gen); + } + delete font; + } + delete fonts; + } + } + } + + exitCode = 0; + + err1: + delete doc; + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} + + diff --git a/utils/pdfimages.1 b/utils/pdfimages.1 new file mode 100644 index 0000000..955d8b3 --- /dev/null +++ b/utils/pdfimages.1 @@ -0,0 +1,189 @@ +.\" Copyright 1998-2011 Glyph & Cog, LLC +.TH pdfimages 1 "15 August 2011" +.SH NAME +pdfimages \- Portable Document Format (PDF) image extractor +(version 3.03) +.SH SYNOPSIS +.B pdfimages +[options] +.I PDF-file image-root +.SH DESCRIPTION +.B Pdfimages +saves images from a Portable Document Format (PDF) file as Portable +Pixmap (PPM), Portable Bitmap (PBM), or JPEG files. +.PP +Pdfimages reads the PDF file +.IR PDF-file , +scans one or more pages, and writes one PPM, PBM, or JPEG file for each image, +.IR image-root - nnn . xxx , +where +.I nnn +is the image number and +.I xxx +is the image type (.ppm, .pbm, .jpg). +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to scan. +.TP +.BI \-l " number" +Specifies the last page to scan. +.TP +.B \-j +Normally, all images are written as PBM (for monochrome images) or PPM +(for non-monochrome images) files. With this option, images in DCT +format are saved as JPEG files. All non-DCT images are saved in +PBM/PPM format as usual. +.TP +.B \-list +Instead of writing the images, list the images along with various information for each image. Do not specify an +.IR image-root +with this option. +.IP +The following information is listed for each font: +.RS +.TP +.B page +the page number containing the image +.TP +.B num +the image number +.TP +.B type +the image type: +.PP +.RS +image - an opaque image +.RE +.RS +mask - a monochrome mask image +.RE +.RS +smask - a soft-mask image +.RE +.RS +stencil - a monochrome mask image used for painting a color or pattern +.RE +.PP +Note: Tranparency in images is represented in PDF using a separate image for the image and the mask/smask. +The mask/smask used as part of a transparent image always immediately follows the image in the image list. +.TP +.B width +image width (in pixels) +.TP +.B height +image height (in pixels) +.PP +Note: the image width/height is the size of the embedded image, not the size the image will be rendered at. +.TP +.B color +image color space: +.PP +.RS +gray - Gray +.RE +.RS +rgb - RGB +.RE +.RS +cmyk - CMYK +.RE +.RS +lab - L*a*b +.RE +.RS +icc - ICC Based +.RE +.RS +index - Indexed Color +.RE +.RS +sep - Separation +.RE +.RS +devn - DeviceN +.RE +.TP +.B comp +number of color components +.TP +.B bpc +bits per component +.TP +.B enc +encoding: +.PP +.RS +image - raster image (may be Flate or LZW compressed but does not use an image encoding) +.RE +.RS +jpeg - Joint Photographic Experts Group +.RE +.RS +jp2 - JPEG2000 +.RE +.RS +jbig2 - Joint Bi-Level Image Experts Group +.RE +.RS +ccitt - CCITT Group 3 or Group 4 Fax +.RE +.TP +.B interp +"yes" if the interpolation is to be performed when scaling up the image +.TP +.B object ID +the font dictionary object ID (number and generation) +.RE +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-p +Include page numbers in output file names. +.TP +.B \-q +Don't print any messages or errors. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdfimages software and documentation are copyright 1998-2011 Glyph +& Cog, LLC. +.SH "SEE ALSO" +.BR pdfdetach (1) +.BR pdffonts (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftops (1), +.BR pdftotext (1) diff --git a/utils/pdfimages.cc b/utils/pdfimages.cc new file mode 100644 index 0000000..82c301c --- /dev/null +++ b/utils/pdfimages.cc @@ -0,0 +1,191 @@ +//======================================================================== +// +// pdfimages.cc +// +// Copyright 1998-2003 Glyph & Cog, LLC +// +// Modified for Debian by Hamish Moffatt, 22 May 2002. +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007-2008, 2010 Albert Astals Cid +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Jakob Voss +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#include "parseargs.h" +#include "goo/GooString.h" +#include "goo/gmem.h" +#include "GlobalParams.h" +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "ImageOutputDev.h" +#include "Error.h" + +static int firstPage = 1; +static int lastPage = 0; +static GBool listImages = gFalse; +static GBool dumpJPEG = gFalse; +static GBool pageNames = gFalse; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; +static GBool quiet = gFalse; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to convert"}, + {"-l", argInt, &lastPage, 0, + "last page to convert"}, + {"-j", argFlag, &dumpJPEG, 0, + "write JPEG images as JPEG files"}, + {"-list", argFlag, &listImages, 0, + "print list of images instead of saving"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-p", argFlag, &pageNames, 0, + "include page numbers in output file names"}, + {"-q", argFlag, &quiet, 0, + "don't print any messages or errors"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName; + char *imgRoot = NULL; + GooString *ownerPW, *userPW; + ImageOutputDev *imgOut; + GBool ok; + int exitCode; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (!ok || (listImages && argc != 2) || (!listImages && argc != 3) || printVersion || printHelp) { + fprintf(stderr, "pdfimages version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdfimages", " ", argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + goto err0; + } + fileName = new GooString(argv[1]); + if (!listImages) + imgRoot = argv[2]; + + // read config file + globalParams = new GlobalParams(); + if (quiet) { + globalParams->setErrQuiet(quiet); + } + + // open PDF file + if (ownerPassword[0] != '\001') { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0] != '\001') { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + delete fileName; + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err1; + } + + // check for copy permission +#ifdef ENFORCE_PERMISSIONS + if (!doc->okToCopy()) { + error(errNotAllowed, -1, "Copying of images from this document is not allowed."); + exitCode = 3; + goto err1; + } +#endif + + // get page range + if (firstPage < 1) + firstPage = 1; + if (lastPage < 1 || lastPage > doc->getNumPages()) + lastPage = doc->getNumPages(); + + // write image files + imgOut = new ImageOutputDev(imgRoot, pageNames, dumpJPEG, listImages); + if (imgOut->isOk()) { + doc->displayPages(imgOut, firstPage, lastPage, 72, 72, 0, + gTrue, gFalse, gFalse); + } + delete imgOut; + + exitCode = 0; + + // clean up + err1: + delete doc; + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} diff --git a/utils/pdfinfo.1 b/utils/pdfinfo.1 new file mode 100644 index 0000000..a3ad1c3 --- /dev/null +++ b/utils/pdfinfo.1 @@ -0,0 +1,146 @@ +.\" Copyright 1999-2011 Glyph & Cog, LLC +.TH pdfinfo 1 "15 August 2011" +.SH NAME +pdfinfo \- Portable Document Format (PDF) document information +extractor (version 3.03) +.SH SYNOPSIS +.B pdfinfo +[options] +.RI [ PDF-file ] +.SH DESCRIPTION +.B Pdfinfo +prints the contents of the \'Info' dictionary (plus some other useful +information) from a Portable Document Format (PDF) file. +.PP +The \'Info' dictionary contains the following values: +.PP +.RS +title +.RE +.RS +subject +.RE +.RS +keywords +.RE +.RS +author +.RE +.RS +creator +.RE +.RS +producer +.RE +.RS +creation date +.RE +.RS +modification date +.RE +.PP +In addition, the following information is printed: +.PP +.RS +tagged (yes/no) +.RE +.RS +form (AcroForm / XFA / none) +.RE +.RS +page count +.RE +.RS +encrypted flag (yes/no) +.RE +.RS +print and copy permissions (if encrypted) +.RE +.RS +page size +.RE +.RS +file size +.RE +.RS +linearized (yes/no) +.RE +.RS +PDF version +.RE +.RS +metadata (only if requested) +.RE +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to examine. If multiple pages are requested +using the "\-f" and "\-l" options, the size of each requested page (and, +optionally, the bounding boxes for each requested page) are printed. +Otherwise, only page one is examined. +.TP +.BI \-l " number" +Specifies the last page to examine. +.TP +.B \-box +Prints the page box bounding boxes: MediaBox, CropBox, BleedBox, +TrimBox, and ArtBox. +.TP +.B \-meta +Prints document-level metadata. (This is the "Metadata" stream from +the PDF file's Catalog object.) +.TP +.B \-rawdates +Prints the raw (undecoded) date strings, directly from the PDF file. +.TP +.BI \-enc " encoding-name" +Sets the encoding to use for text output. This defaults to "UTF-8". +.TP +.B \-listenc +Lits the available encodings +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdfinfo software and documentation are copyright 1996-2011 Glyph & +Cog, LLC. +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdffonts (1), +.BR pdfimages (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftops (1), +.BR pdftotext (1) diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc new file mode 100644 index 0000000..cdc5375 --- /dev/null +++ b/utils/pdfinfo.cc @@ -0,0 +1,464 @@ +//======================================================================== +// +// pdfinfo.cc +// +// Copyright 1998-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Dom Lachowicz +// Copyright (C) 2007-2010, 2012 Albert Astals Cid +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2011 Vittal Aithal +// Copyright (C) 2012 Adrian Johnson +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include "parseargs.h" +#include "printencodings.h" +#include "goo/GooString.h" +#include "goo/gmem.h" +#include "GlobalParams.h" +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "CharTypes.h" +#include "UnicodeMap.h" +#include "PDFDocEncoding.h" +#include "Error.h" +#include "DateInfo.h" + +static void printInfoString(Dict *infoDict, const char *key, const char *text, + UnicodeMap *uMap); +static void printInfoDate(Dict *infoDict, const char *key, const char *text); +static void printBox(const char *text, PDFRectangle *box); + +static int firstPage = 1; +static int lastPage = 0; +static GBool printBoxes = gFalse; +static GBool printMetadata = gFalse; +static GBool rawDates = gFalse; +static char textEncName[128] = ""; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; +static GBool printEnc = gFalse; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to convert"}, + {"-l", argInt, &lastPage, 0, + "last page to convert"}, + {"-box", argFlag, &printBoxes, 0, + "print the page bounding boxes"}, + {"-meta", argFlag, &printMetadata, 0, + "print the document metadata (XML)"}, + {"-rawdates", argFlag, &rawDates, 0, + "print the undecoded date strings directly from the PDF file"}, + {"-enc", argString, textEncName, sizeof(textEncName), + "output text encoding name"}, + {"-listenc",argFlag, &printEnc, 0, + "list available encodings"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName; + GooString *ownerPW, *userPW; + UnicodeMap *uMap; + Page *page; + Object info, xfa; + Object *acroForm; + char buf[256]; + double w, h, wISO, hISO; + FILE *f; + GooString *metadata; + GBool ok; + int exitCode; + int pg, i; + GBool multiPage; + int r; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (!ok || (argc != 2 && !printEnc) || printVersion || printHelp) { + fprintf(stderr, "pdfinfo version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdfinfo", "", argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + goto err0; + } + + // read config file + globalParams = new GlobalParams(); + + if (printEnc) { + printEncodings(); + delete globalParams; + exitCode = 0; + goto err0; + } + + fileName = new GooString(argv[1]); + + if (textEncName[0]) { + globalParams->setTextEncoding(textEncName); + } + + // get mapping to output encoding + if (!(uMap = globalParams->getTextEncoding())) { + error(errCommandLine, -1, "Couldn't get text encoding"); + delete fileName; + goto err1; + } + + // open PDF file + if (ownerPassword[0] != '\001') { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0] != '\001') { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err2; + } + + // get page range + if (firstPage < 1) { + firstPage = 1; + } + if (lastPage == 0) { + multiPage = gFalse; + lastPage = 1; + } else { + multiPage = gTrue; + } + if (lastPage < 1 || lastPage > doc->getNumPages()) { + lastPage = doc->getNumPages(); + } + + // print doc info + doc->getDocInfo(&info); + if (info.isDict()) { + printInfoString(info.getDict(), "Title", "Title: ", uMap); + printInfoString(info.getDict(), "Subject", "Subject: ", uMap); + printInfoString(info.getDict(), "Keywords", "Keywords: ", uMap); + printInfoString(info.getDict(), "Author", "Author: ", uMap); + printInfoString(info.getDict(), "Creator", "Creator: ", uMap); + printInfoString(info.getDict(), "Producer", "Producer: ", uMap); + if (rawDates) { + printInfoString(info.getDict(), "CreationDate", "CreationDate: ", + uMap); + printInfoString(info.getDict(), "ModDate", "ModDate: ", + uMap); + } else { + printInfoDate(info.getDict(), "CreationDate", "CreationDate: "); + printInfoDate(info.getDict(), "ModDate", "ModDate: "); + } + } + info.free(); + + // print tagging info + printf("Tagged: %s\n", + doc->getStructTreeRoot()->isDict() ? "yes" : "no"); + + // print form info + if ((acroForm = doc->getCatalog()->getAcroForm())->isDict()) { + acroForm->dictLookup("XFA", &xfa); + if (xfa.isStream() || xfa.isArray()) { + printf("Form: XFA\n"); + } else { + printf("Form: AcroForm\n"); + } + xfa.free(); + } else { + printf("Form: none\n"); + } + + // print page count + printf("Pages: %d\n", doc->getNumPages()); + + // print encryption info + printf("Encrypted: "); + if (doc->isEncrypted()) { + printf("yes (print:%s copy:%s change:%s addNotes:%s)\n", + doc->okToPrint(gTrue) ? "yes" : "no", + doc->okToCopy(gTrue) ? "yes" : "no", + doc->okToChange(gTrue) ? "yes" : "no", + doc->okToAddNotes(gTrue) ? "yes" : "no"); + } else { + printf("no\n"); + } + + // print page size + for (pg = firstPage; pg <= lastPage; ++pg) { + w = doc->getPageCropWidth(pg); + h = doc->getPageCropHeight(pg); + if (multiPage) { + printf("Page %4d size: %g x %g pts", pg, w, h); + } else { + printf("Page size: %g x %g pts", w, h); + } + if ((fabs(w - 612) < 0.1 && fabs(h - 792) < 0.1) || + (fabs(w - 792) < 0.1 && fabs(h - 612) < 0.1)) { + printf(" (letter)"); + } else { + hISO = sqrt(sqrt(2.0)) * 7200 / 2.54; + wISO = hISO / sqrt(2.0); + for (i = 0; i <= 6; ++i) { + if ((fabs(w - wISO) < 1 && fabs(h - hISO) < 1) || + (fabs(w - hISO) < 1 && fabs(h - wISO) < 1)) { + printf(" (A%d)", i); + break; + } + hISO = wISO; + wISO /= sqrt(2.0); + } + } + printf("\n"); + r = doc->getPageRotate(pg); + if (multiPage) { + printf("Page %4d rot: %d\n", pg, r); + } else { + printf("Page rot: %d\n", r); + } + } + + // print the boxes + if (printBoxes) { + if (multiPage) { + for (pg = firstPage; pg <= lastPage; ++pg) { + page = doc->getPage(pg); + if (!page) { + error(errSyntaxError, -1, "Failed to print boxes for page {0:d}", pg); + continue; + } + sprintf(buf, "Page %4d MediaBox: ", pg); + printBox(buf, page->getMediaBox()); + sprintf(buf, "Page %4d CropBox: ", pg); + printBox(buf, page->getCropBox()); + sprintf(buf, "Page %4d BleedBox: ", pg); + printBox(buf, page->getBleedBox()); + sprintf(buf, "Page %4d TrimBox: ", pg); + printBox(buf, page->getTrimBox()); + sprintf(buf, "Page %4d ArtBox: ", pg); + printBox(buf, page->getArtBox()); + } + } else { + page = doc->getPage(firstPage); + if (!page) { + error(errSyntaxError, -1, "Failed to print boxes for page {0:d}", firstPage); + } else { + printBox("MediaBox: ", page->getMediaBox()); + printBox("CropBox: ", page->getCropBox()); + printBox("BleedBox: ", page->getBleedBox()); + printBox("TrimBox: ", page->getTrimBox()); + printBox("ArtBox: ", page->getArtBox()); + } + } + } + + // print file size +#ifdef VMS + f = fopen(fileName->getCString(), "rb", "ctx=stm"); +#else + f = fopen(fileName->getCString(), "rb"); +#endif + if (f) { +#if HAVE_FSEEKO + fseeko(f, 0, SEEK_END); + printf("File size: %u bytes\n", (Guint)ftello(f)); +#elif HAVE_FSEEK64 + fseek64(f, 0, SEEK_END); + printf("File size: %u bytes\n", (Guint)ftell64(f)); +#else + fseek(f, 0, SEEK_END); + printf("File size: %d bytes\n", (int)ftell(f)); +#endif + fclose(f); + } + + // print linearization info + printf("Optimized: %s\n", doc->isLinearized() ? "yes" : "no"); + + // print PDF version + printf("PDF version: %d.%d\n", doc->getPDFMajorVersion(), doc->getPDFMinorVersion()); + + // print the metadata + if (printMetadata && (metadata = doc->readMetadata())) { + fputs("Metadata:\n", stdout); + fputs(metadata->getCString(), stdout); + fputc('\n', stdout); + delete metadata; + } + + exitCode = 0; + + // clean up + err2: + uMap->decRefCnt(); + delete doc; + delete fileName; + err1: + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} + +static void printInfoString(Dict *infoDict, const char *key, const char *text, + UnicodeMap *uMap) { + Object obj; + GooString *s1; + GBool isUnicode; + Unicode u, u2; + char buf[8]; + int i, n; + + if (infoDict->lookup(key, &obj)->isString()) { + fputs(text, stdout); + s1 = obj.getString(); + if ((s1->getChar(0) & 0xff) == 0xfe && + (s1->getChar(1) & 0xff) == 0xff) { + isUnicode = gTrue; + i = 2; + } else { + isUnicode = gFalse; + i = 0; + } + while (i < obj.getString()->getLength()) { + if (isUnicode) { + u = ((s1->getChar(i) & 0xff) << 8) | + (s1->getChar(i+1) & 0xff); + i += 2; + if (u >= 0xd800 && u <= 0xdbff && i < obj.getString()->getLength()) { + // surrogate pair + u2 = ((s1->getChar(i) & 0xff) << 8) | + (s1->getChar(i+1) & 0xff); + i += 2; + if (u2 >= 0xdc00 && u2 <= 0xdfff) { + u = 0x10000 + ((u - 0xd800) << 10) + (u2 - 0xdc00); + } + } + } else { + u = pdfDocEncoding[s1->getChar(i) & 0xff]; + ++i; + } + n = uMap->mapUnicode(u, buf, sizeof(buf)); + fwrite(buf, 1, n, stdout); + } + fputc('\n', stdout); + } + obj.free(); +} + +static void printInfoDate(Dict *infoDict, const char *key, const char *text) { + Object obj; + char *s; + int year, mon, day, hour, min, sec, tz_hour, tz_minute; + char tz; + struct tm tmStruct; + char buf[256]; + + if (infoDict->lookup(key, &obj)->isString()) { + fputs(text, stdout); + s = obj.getString()->getCString(); + // TODO do something with the timezone info + if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) { + tmStruct.tm_year = year - 1900; + tmStruct.tm_mon = mon - 1; + tmStruct.tm_mday = day; + tmStruct.tm_hour = hour; + tmStruct.tm_min = min; + tmStruct.tm_sec = sec; + tmStruct.tm_wday = -1; + tmStruct.tm_yday = -1; + tmStruct.tm_isdst = -1; + // compute the tm_wday and tm_yday fields + if (mktime(&tmStruct) != (time_t)-1 && + strftime(buf, sizeof(buf), "%c", &tmStruct)) { + fputs(buf, stdout); + } else { + fputs(s, stdout); + } + } else { + fputs(s, stdout); + } + fputc('\n', stdout); + } + obj.free(); +} + +static void printBox(const char *text, PDFRectangle *box) { + printf("%s%8.2f %8.2f %8.2f %8.2f\n", + text, box->x1, box->y1, box->x2, box->y2); +} diff --git a/utils/pdfseparate.1 b/utils/pdfseparate.1 new file mode 100644 index 0000000..077faec --- /dev/null +++ b/utils/pdfseparate.1 @@ -0,0 +1,49 @@ +.\" Copyright 2011 The Poppler Developers - http://poppler.freedesktop.org +.TH pdfseparate 1 "15 September 2011" +.SH NAME +pdfseparate \- Portable Document Format (PDF) page extractor +.SH SYNOPSIS +.B pdfseparate +[options] +.I PDF-file PDF-page-pattern +.SH DESCRIPTION +.B pdfseparate +extract single pages from a Portable Document Format (PDF). +.PP +pdfseparate reads the PDF file +.IR PDF-file , +extracts one or more pages, and writes one PDF file for each page to +.IR PDF-page-pattern , +PDF-page-pattern should contain +.BR %d . +%d is replaced by the page number. +.TP +The PDF-file should not be encrypted. +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to extract. If \-f is omitted, extraction starts with page 1. +.TP +.BI \-l " number" +Specifies the last page to extract. if \-p is omitted, extraction ends with the last page. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXAMPLE +pdfseparate sample.pdf sample-%d.pdf +.TP +extracts all pages from sample.pdf, if i.e. sample.pdf has 3 pages, it produces +.TP +sample-1.pdf, sample-2.pdf, sample-3.pdf +.SH AUTHOR +The pdfseparate software and documentation are copyright 1996-2004 Glyph +& Cog, LLC and copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org +.SH "SEE ALSO" +.BR pdfunite (1), diff --git a/utils/pdfseparate.cc b/utils/pdfseparate.cc new file mode 100644 index 0000000..25fac5a --- /dev/null +++ b/utils/pdfseparate.cc @@ -0,0 +1,122 @@ +//======================================================================== +// +// pdfseparate.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2011, 2012 Thomas Freitag +// Copyright (C) 2012 Albert Astals Cid +// +//======================================================================== +#include "config.h" +#include +#include +#include +#include +#include +#include "parseargs.h" +#include "goo/GooString.h" +#include "PDFDoc.h" +#include "ErrorCodes.h" +#include "GlobalParams.h" + +static int firstPage = 0; +static int lastPage = 0; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to extract"}, + {"-l", argInt, &lastPage, 0, + "last page to extract"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +bool extractPages (const char *srcFileName, const char *destFileName) { + char pathName[1024]; + GooString *gfileName = new GooString (srcFileName); + PDFDoc *doc = new PDFDoc (gfileName, NULL, NULL, NULL); + + if (!doc->isOk()) { + error(errSyntaxError, -1, "Could not extract page(s) from damaged file ('{0:s}')", srcFileName); + return false; + } + if (doc->isEncrypted()) { + error(errSyntaxError, -1, "Could not extract page(s) from encrypted file ('{0:s}')", srcFileName); + return false; + } + + if (firstPage == 0 && lastPage == 0) { + firstPage = 1; + lastPage = doc->getNumPages(); + } + if (lastPage == 0) + lastPage = doc->getNumPages(); + if (firstPage == 0) + firstPage = 1; + if (firstPage != lastPage && strstr(destFileName, "%d") == NULL) { + error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName); + return false; + } + for (int pageNo = firstPage; pageNo <= lastPage; pageNo++) { + sprintf (pathName, destFileName, pageNo); + GooString *gpageName = new GooString (pathName); + int errCode = doc->savePageAs(gpageName, pageNo); + if ( errCode != errNone) { + delete gpageName; + delete gfileName; + return false; + } + delete gpageName; + } + delete gfileName; + return true; +} + +int +main (int argc, char *argv[]) +{ + Object info; + GBool ok; + int exitCode; + + exitCode = 99; + + // parse args + ok = parseArgs (argDesc, &argc, argv); + if (!ok || argc != 3 || printVersion || printHelp) + { + fprintf (stderr, "pdfseparate version %s\n", PACKAGE_VERSION); + fprintf (stderr, "%s\n", popplerCopyright); + fprintf (stderr, "%s\n", xpdfCopyright); + if (!printVersion) + { + printUsage ("pdfseparate", " ", + argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + goto err0; + } + globalParams = new GlobalParams(); + ok = extractPages (argv[1], argv[2]); + if (ok) { + exitCode = 0; + } + delete globalParams; + +err0: + + return exitCode; +} diff --git a/utils/pdftocairo.1 b/utils/pdftocairo.1 new file mode 100644 index 0000000..19b62ef --- /dev/null +++ b/utils/pdftocairo.1 @@ -0,0 +1,261 @@ +.TH pdftoppm 1 +.SH NAME +pdftocairo \- Portable Document Format (PDF) to PNG/JPEG/PDF/PS/EPS/SVG using cairo +.SH SYNOPSIS +.B pdftocairo +[options] +.IR PDF-file +.RI [ output-file ] +.SH DESCRIPTION +.B pdftocairo +converts Portable Document Format (PDF) files, using the cairo output device of the poppler PDF library, to any of the following output formats: +.IP \(bu +Portable Network Graphics (PNG) +.IP \(bu +JPEG Interchange Format (JPEG) +.IP \(bu +Portable Document Format (PDF) +.IP \(bu +PostScript (PS) +.IP \(bu +Encapsulated PostScript (EPS) +.IP \(bu +Scalable Vector Graphics (SVG) +.PP +.B pdftocairo +reads the PDF file, +.IR PDF-file , +and writes to +.IR output-file . +The image formats (PNG and JPEG) generate one file per page with the page number and file type appended to +.IR output-file +(except when \-singlefile is used). +When the output format is a vector format (PDF, PS, EPS, and SVG) or when \-singlefile is used, +.IR output-file +is the full filename. + +If the +.IR PDF-file +is \*(lq\-\*(rq , the PDF is read from stdin. +If the +.IR output-file +is \*(lq\-\*(rq , the output file will be written to stdout. Using stdout is not valid with image formats unless \-singlefile is used. +If +.IR output-file +is not used, the output filename will be derived from the +.IR PDF-file +filename. +.PP +Not all options are valid with all output formats. One (and only one) of the output format options (\-png, \-jpeg, \-pdf, \-ps, \-eps, or \-svg) must be used. +.PP +The resolution options (\-r, \-rx, \-ry) set the resolution of the +image output formats. The image dimensions will depend on the PDF page +size and the resolution. For the vector outputs, regions of the page +that can not be represented natively in the output format (eg +translucency in PS) will be rasterized at the resolution specified by +the resolution options. +.PP +The \-scale-to options may be used to set a fixed image size. The +image resolution will vary with the page size. +.PP +The cropping options (\-x, \-y, \-W, and \-H) use units of pixels with +the image formats and PostScript points (1/72 inch) with the vector +formats. When cropping is used with vector output the cropped region is +centered unless \-nocenter is used in which case the cropped region is +at the top left (SVG) or bottom left (PDF, PS, EPS). +.PP +.SH OPTIONS +.TP +.BI \-png +Generates a PNG file(s) +.TP +.BI \-jpeg +Generates a JPEG file(s) +.TP +.BI \-pdf +Generates a PDF file +.TP +.BI \-ps +Generate a PS file +.TP +.BI \-eps +Generate an EPS file. An EPS file contains a single image, so if you +use this option with a multi-page PDF file, you must use \-f and \-l +to specify a single page. The page size options (\-origpagesizes, +\-paper, \-paperw, \-paperh) can not be used with this option. +.TP +.BI \-svg +Generate a SVG (Scalable Vector Graphics) file +.TP +.BI \-f " number" +Specifies the first page to convert. +.TP +.BI \-l " number" +Specifies the last page to convert. +.TP +.B \-o +Generates only the odd numbered pages. +.TP +.B \-e +Generates only the even numbered pages. +.TP +.BI \-singlefile +Writes only the first page and does not add digits. +.TP +.BI \-r " number" +Specifies the X and Y resolution, in pixels per inch of image files (or rasterized regions in vector output). The default is 150 PPI. +.TP +.BI \-rx " number" +Specifies the X resolution, in pixels per inch of image files (or rasterized regions in vector output). The default is 150 PPI. +.TP +.BI \-ry " number" +Specifies the Y resolution, in pixels per inch of image files (or rasterized regions in vector output). The default is 150 PPI. +.TP +.BI \-scale-to " number" +Scales the long side of each page (width for landscape pages, height +for portrait pages) to fit in scale-to pixels. The size of the short +side will be determined by the aspect ratio of the page (PNG/JPEG only). +.TP +.BI \-scale-to-x " number" +Scales each page horizontally to fit in scale-to-x pixels. If +scale-to-y is set to -1, the vertical size will determined by the +aspect ratio of the page (PNG/JPEG only). +.TP +.BI \-scale-to-y " number" +Scales each page vertically to fit in scale-to-y pixels. If scale-to-x +is set to -1, the horizontal size will determined by the aspect ratio +of the page (PNG/JPEG only). +.TP +.BI \-x " number" +Specifies the x-coordinate of the crop area top left corner in pixels (image output) or points (vector output) +.TP +.BI \-y " number" +Specifies the y-coordinate of the crop area top left corner in pixels (image output) or points (vector output) +.TP +.BI \-W " number" +Specifies the width of crop area in pixels (image output) or points (vector output) (default is 0) +.TP +.BI \-H " number" +Specifies the height of crop area in pixels (image output) or points (vector output) (default is 0) +.TP +.BI \-sz " number" +Specifies the size of crop square in pixels (image output) or points (vector output) (sets \-W and \-H) +.TP +.B \-cropbox +Uses the crop box rather than media box when generating the files +.TP +.B \-mono +Generate a monochrome file (PNG only). +.TP +.B \-gray +Generate a grayscale file (PNG and JPEG only). +.TP +.B \-transp +Use a transparent page color instead of white (PNG only). +.TP +.BI \-icc " icc-file" +Use the specified ICC file as the output profile (PNG only). The profile will be embedded in the PNG file. +.TP +.B \-level2 +Generate Level 2 PostScript (PS only). +.TP +.B \-level3 +Generate Level 3 PostScript (PS only). This enables all Level 2 features plus +shading patterns and masked images. This is the default setting. +.TP +.B \-origpagesizes +Generate a file with variable page sizes and orientations (PS and PDF +only). The size of each page will be the original page in the PDF +file. If the output is PS the file will contain %%DocumentMedia and +%%PageMedia DSC comments specifying the size of each page. Any +specification of the page size via \-paper, \-paperw, or \-paperh will +get overridden as long as each page of the PDF file has a defined +paper size. +.TP +.BI \-paper " size" +Set the paper size to one of "letter", "legal", "A4", or "A3" +(PS,PDF,SVG only). This can also be set to "match", which will set +the paper size to match the size specified in the PDF +file. \-origpagesizes overrides this setting if the PDF file has +defined page sizes. +.TP +.BI \-paperw " size" +Set the paper width, in points (PS,PDF,SVG only). \-origpagesizes overrides this setting +if the PDF file has defined page sizes. +.TP +.BI \-paperh " size" +Set the paper height, in points (PS,PDF,SVG only). \-origpagesizes overrides this setting +if the PDF file has defined page sizes. +.TP +.B \-nocrop +By default, output is cropped to the CropBox specified in the PDF +file. This option disables cropping. +.TP +.B \-expand +Expand PDF pages smaller than the paper to fill the paper (PS,PDF,SVG only). By +default, these pages are not scaled. +.TP +.B \-noshrink +Don't scale PDF pages which are larger than the paper (PS,PDF,SVG only). By default, +pages larger than the paper are shrunk to fit. +.TP +.B \-nocenter +By default, PDF pages smaller than the paper (after any scaling) are +centered on the paper. This option causes them to be aligned to the +lower-left corner of the paper instead (PS,PDF,SVG only). +.TP +.B \-duplex +Adds the %%IncludeFeature: *Duplex DuplexNoTumble DSC comment to the +PostScript file (PS only). This tells the print manager to enable duplexing. +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-q +Don't print any messages or errors. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The poppler tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +4 +Error related to ICC profile. +.TP +99 +Other error. +.SH AUTHOR +The pdftocairo software and documentation are copyright 1996-2004 Glyph +& Cog, LLC and copyright 2005-2011 The Poppler Developers. +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdffonts (1), +.BR pdfimages (1), +.BR pdfinfo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftops (1), +.BR pdftotext (1) diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc new file mode 100644 index 0000000..8d13e31 --- /dev/null +++ b/utils/pdftocairo.cc @@ -0,0 +1,1015 @@ +//======================================================================== +// +// pdftocairo.cc +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Ilmari Heikkinen +// Copyright (C) 2008 Richard Airlie +// Copyright (C) 2009 Michael K. Johnson +// Copyright (C) 2009 Shen Liang +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2009, 2010 Albert Astals Cid +// Copyright (C) 2010, 2011, 2012 Adrian Johnson +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Jonathan Liu +// Copyright (C) 2010 William Bader +// Copyright (C) 2011 Thomas Freitag +// Copyright (C) 2011 Carlos Garcia Campos +// Copyright (C) 2012 Koji Otani +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include "parseargs.h" +#include "goo/gmem.h" +#include "goo/gtypes.h" +#include "goo/gtypes_p.h" +#include "goo/GooString.h" +#include "goo/ImgWriter.h" +#include "goo/JpegWriter.h" +#include "goo/PNGWriter.h" +#include "GlobalParams.h" +#include "Object.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "CairoOutputDev.h" +#if USE_CMS +#ifdef USE_LCMS1 +#include +#else +#include +#endif +#endif +#include +#if CAIRO_HAS_PS_SURFACE +#include +#endif +#if CAIRO_HAS_PDF_SURFACE +#include +#endif +#if CAIRO_HAS_SVG_SURFACE +#include +#endif + + +static GBool png = gFalse; +static GBool jpeg = gFalse; +static GBool ps = gFalse; +static GBool eps = gFalse; +static GBool pdf = gFalse; +static GBool svg = gFalse; + +static int firstPage = 1; +static int lastPage = 0; +static GBool printOnlyOdd = gFalse; +static GBool printOnlyEven = gFalse; +static GBool singleFile = gFalse; +static double resolution = 0.0; +static double x_resolution = 150.0; +static double y_resolution = 150.0; +static int scaleTo = 0; +static int x_scaleTo = 0; +static int y_scaleTo = 0; +static int crop_x = 0; +static int crop_y = 0; +static int crop_w = 0; +static int crop_h = 0; +static int sz = 0; +static GBool useCropBox = gFalse; +static GBool mono = gFalse; +static GBool gray = gFalse; +static GBool transp = gFalse; +static GooString icc; + +static GBool level2 = gFalse; +static GBool level3 = gFalse; +static GBool doOrigPageSizes = gFalse; +static char paperSize[15] = ""; +static int paperWidth = -1; +static int paperHeight = -1; +static GBool noCrop = gFalse; +static GBool expand = gFalse; +static GBool noShrink = gFalse; +static GBool noCenter = gFalse; +static GBool duplex = gFalse; + +static char ownerPassword[33] = ""; +static char userPassword[33] = ""; +static GBool quiet = gFalse; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static const ArgDesc argDesc[] = { +#if ENABLE_LIBPNG + {"-png", argFlag, &png, 0, + "generate a PNG file"}, +#endif +#if ENABLE_LIBJPEG + {"-jpeg", argFlag, &jpeg, 0, + "generate a JPEG file"}, +#endif +#if CAIRO_HAS_PS_SURFACE + {"-ps", argFlag, &ps, 0, + "generate PostScript file"}, + {"-eps", argFlag, &eps, 0, + "generate Encapsulated PostScript (EPS)"}, +#endif +#if CAIRO_HAS_PDF_SURFACE + {"-pdf", argFlag, &pdf, 0, + "generate a PDF file"}, +#endif +#if CAIRO_HAS_SVG_SURFACE + {"-svg", argFlag, &svg, 0, + "generate a Scalable Vector Graphics (SVG) file"}, +#endif + + {"-f", argInt, &firstPage, 0, + "first page to print"}, + {"-l", argInt, &lastPage, 0, + "last page to print"}, + {"-o", argFlag, &printOnlyOdd, 0, + "print only odd pages"}, + {"-e", argFlag, &printOnlyEven, 0, + "print only even pages"}, + {"-singlefile", argFlag, &singleFile, 0, + "write only the first page and do not add digits"}, + + {"-r", argFP, &resolution, 0, + "resolution, in PPI (default is 150)"}, + {"-rx", argFP, &x_resolution, 0, + "X resolution, in PPI (default is 150)"}, + {"-ry", argFP, &y_resolution, 0, + "Y resolution, in PPI (default is 150)"}, + {"-scale-to", argInt, &scaleTo, 0, + "scales each page to fit within scale-to*scale-to pixel box"}, + {"-scale-to-x", argInt, &x_scaleTo, 0, + "scales each page horizontally to fit in scale-to-x pixels"}, + {"-scale-to-y", argInt, &y_scaleTo, 0, + "scales each page vertically to fit in scale-to-y pixels"}, + + {"-x", argInt, &crop_x, 0, + "x-coordinate of the crop area top left corner"}, + {"-y", argInt, &crop_y, 0, + "y-coordinate of the crop area top left corner"}, + {"-W", argInt, &crop_w, 0, + "width of crop area in pixels (default is 0)"}, + {"-H", argInt, &crop_h, 0, + "height of crop area in pixels (default is 0)"}, + {"-sz", argInt, &sz, 0, + "size of crop square in pixels (sets W and H)"}, + {"-cropbox",argFlag, &useCropBox, 0, + "use the crop box rather than media box"}, + + {"-mono", argFlag, &mono, 0, + "generate a monochrome image file (PNG, JPEG)"}, + {"-gray", argFlag, &gray, 0, + "generate a grayscale image file (PNG, JPEG)"}, + {"-transp", argFlag, &transp, 0, + "use a transparent background instead of white (PNG)"}, +#if USE_CMS + {"-icc", argGooString, &icc, 0, + "ICC color profile to use"}, +#endif + + {"-level2", argFlag, &level2, 0, + "generate Level 2 PostScript (PS, EPS)"}, + {"-level3", argFlag, &level3, 0, + "generate Level 3 PostScript (PS, EPS)"}, + {"-origpagesizes",argFlag, &doOrigPageSizes,0, + "conserve original page sizes (PS, PDF, SVG)"}, + {"-paper", argString, paperSize, sizeof(paperSize), + "paper size (letter, legal, A4, A3, match)"}, + {"-paperw", argInt, &paperWidth, 0, + "paper width, in points"}, + {"-paperh", argInt, &paperHeight, 0, + "paper height, in points"}, + {"-nocrop", argFlag, &noCrop, 0, + "don't crop pages to CropBox"}, + {"-expand", argFlag, &expand, 0, + "expand pages smaller than the paper size"}, + {"-noshrink", argFlag, &noShrink, 0, + "don't shrink pages larger than the paper size"}, + {"-nocenter", argFlag, &noCenter, 0, + "don't center pages smaller than the paper size"}, + {"-duplex", argFlag, &duplex, 0, + "enable duplex printing"}, + + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + + {"-q", argFlag, &quiet, 0, + "don't print any messages or errors"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + + +static cairo_surface_t *surface; +static GBool printing; +static FILE *output_file; + +#if USE_CMS +static unsigned char *icc_data; +static int icc_data_size; +static cmsHPROFILE profile; +#endif + + +void writePageImage(GooString *filename) +{ + ImgWriter *writer = 0; + FILE *file; + int height, width, stride; + unsigned char *data; + + if (png) { +#if ENABLE_LIBPNG + if (transp) + writer = new PNGWriter(PNGWriter::RGBA); + else if (gray) + writer = new PNGWriter(PNGWriter::GRAY); + else if (mono) + writer = new PNGWriter(PNGWriter::MONOCHROME); + else + writer = new PNGWriter(PNGWriter::RGB); + +#if USE_CMS +#ifdef USE_LCMS1 + if (icc_data) + static_cast(writer)->setICCProfile(cmsTakeProductName(profile), icc_data, icc_data_size); + else + static_cast(writer)->setSRGBProfile(); +#else + if (icc_data) { + cmsUInt8Number profileID[17]; + profileID[16] = '\0'; + + cmsGetHeaderProfileID(profile,profileID); + static_cast(writer)->setICCProfile(reinterpret_cast(profileID), icc_data, icc_data_size); + } else { + static_cast(writer)->setSRGBProfile(); + } +#endif +#endif +#endif + + } else if (jpeg) { +#if ENABLE_LIBJPEG + if (gray) + writer = new JpegWriter(JCS_GRAYSCALE); + else + writer = new JpegWriter(JCS_RGB); +#endif + } + if (!writer) + return; + + if (filename->cmp("fd://0") == 0) + file = stdout; + else + file = fopen(filename->getCString(), "wb"); + + if (!file) { + fprintf(stderr, "Error opening output file %s\n", filename->getCString()); + exit(2); + } + + height = cairo_image_surface_get_height(surface); + width = cairo_image_surface_get_width(surface); + stride = cairo_image_surface_get_stride(surface); + data = cairo_image_surface_get_data(surface); + + if (!writer->init(file, width, height, x_resolution, y_resolution)) { + fprintf(stderr, "Error writing %s\n", filename->getCString()); + exit(2); + } + unsigned char *row = (unsigned char *) gmallocn(width, 4); + + for (int y = 0; y < height; y++ ) { + uint32_t *pixel = (uint32_t *) (data + y*stride); + unsigned char *rowp = row; + for (int x = 0; x < width; x++, pixel++) { + if (transp) { + // unpremultiply into RGBA format + uint8_t a; + a = (*pixel & 0xff000000) >> 24; + if (a == 0) { + *rowp++ = 0; + *rowp++ = 0; + *rowp++ = 0; + } else { + *rowp++ = (((*pixel & 0xff0000) >> 16) * 255 + a / 2) / a; + *rowp++ = (((*pixel & 0x00ff00) >> 8) * 255 + a / 2) / a; + *rowp++ = (((*pixel & 0x0000ff) >> 0) * 255 + a / 2) / a; + } + *rowp++ = a; + } else if (gray || mono) { + // convert to gray + // The PDF Reference specifies the DeviceRGB to DeviceGray conversion as + // gray = 0.3*red + 0.59*green + 0.11*blue + int r = (*pixel & 0x00ff0000) >> 16; + int g = (*pixel & 0x0000ff00) >> 8; + int b = (*pixel & 0x000000ff) >> 0; + // an arbitrary integer approximation of .3*r + .59*g + .11*b + int y = (r*19661+g*38666+b*7209 + 32829)>>16; + *rowp++ = y; + } else { + // copy into RGB format + *rowp++ = (*pixel & 0x00ff0000) >> 16; + *rowp++ = (*pixel & 0x0000ff00) >> 8; + *rowp++ = (*pixel & 0x000000ff) >> 0; + } + } + writer->writeRow(&row); + } + gfree(row); + writer->close(); + delete writer; + if (file == stdout) fflush(file); + else fclose(file); +} + +static void getCropSize(double page_w, double page_h, double *width, double *height) +{ + int w = crop_w; + int h = crop_h; + + if (w == 0) + w = (int)ceil(page_w); + + if (h == 0) + h = (int)ceil(page_h); + + *width = (crop_x + w > page_w ? (int)ceil(page_w - crop_x) : w); + *height = (crop_y + h > page_h ? (int)ceil(page_h - crop_y) : h); +} + +static void getOutputSize(double page_w, double page_h, double *width, double *height) +{ + + if (printing) { + if (doOrigPageSizes) { + *width = page_w; + *height = page_h; + } else { + *width = paperWidth; + *height = paperHeight; + } + } else { + getCropSize(page_w * (x_resolution / 72.0), + page_h * (y_resolution / 72.0), + width, height); + } +} + +static void getFitToPageTransform(double page_w, double page_h, + double paper_w, double paper_h, + cairo_matrix_t *m) +{ + double x_scale, y_scale, scale; + + x_scale = paper_w / page_w; + y_scale = paper_h / page_h; + if (x_scale < y_scale) + scale = x_scale; + else + scale = y_scale; + + cairo_matrix_init_identity (m); + if (scale > 1.0) { + // page is smaller than paper + if (expand) { + // expand to fit + cairo_matrix_scale (m, scale, scale); + } else if (!noCenter) { + // centre page + cairo_matrix_translate (m, (paper_w - page_w)/2, (paper_h - page_h)/2); + } else { + if (!svg) { + // move to PostScript origin + cairo_matrix_translate (m, 0, (paper_h - page_h)); + } + } + } else if (scale < 1.0) + // page is larger than paper + if (!noShrink) { + // shrink to fit + cairo_matrix_scale (m, scale, scale); + } +} + +static cairo_status_t writeStream(void *closure, const unsigned char *data, unsigned int length) +{ + FILE *file = (FILE *)closure; + + if (fwrite(data, length, 1, file) == 1) + return CAIRO_STATUS_SUCCESS; + else + return CAIRO_STATUS_WRITE_ERROR; +} + +static void beginDocument(GooString *outputFileName, double w, double h) +{ + if (printing) { + if (outputFileName->cmp("fd://0") == 0) + output_file = stdout; + else + output_file = fopen(outputFileName->getCString(), "wb"); + + if (ps || eps) { +#if CAIRO_HAS_PS_SURFACE + surface = cairo_ps_surface_create_for_stream(writeStream, output_file, w, h); + if (level2) + cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2); + if (eps) + cairo_ps_surface_set_eps (surface, 1); + if (duplex) { + cairo_ps_surface_dsc_comment(surface, "%%Requirements: duplex"); + cairo_ps_surface_dsc_begin_setup(surface); + cairo_ps_surface_dsc_comment(surface, "%%IncludeFeature: *Duplex DuplexNoTumble"); + } + cairo_ps_surface_dsc_begin_page_setup (surface); +#endif + } else if (pdf) { +#if CAIRO_HAS_PDF_SURFACE + surface = cairo_pdf_surface_create_for_stream(writeStream, output_file, w, h); +#endif + } else if (svg) { +#if CAIRO_HAS_SVG_SURFACE + surface = cairo_svg_surface_create_for_stream(writeStream, output_file, w, h); + cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2); +#endif + } + } +} + +static void beginPage(double w, double h) +{ + if (printing) { + if (ps || eps) { +#if CAIRO_HAS_PS_SURFACE + if (w > h) { + cairo_ps_surface_dsc_comment (surface, "%%PageOrientation: Landscape"); + cairo_ps_surface_set_size (surface, h, w); + } else { + cairo_ps_surface_dsc_comment (surface, "%%PageOrientation: Portrait"); + cairo_ps_surface_set_size (surface, w, h); + } +#endif + } + +#if CAIRO_HAS_PDF_SURFACE + if (pdf) + cairo_pdf_surface_set_size (surface, w, h); +#endif + + cairo_surface_set_fallback_resolution (surface, x_resolution, y_resolution); + + } else { + surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ceil(w), ceil(h)); + } +} + +static void renderPage(PDFDoc *doc, CairoOutputDev *cairoOut, int pg, + double page_w, double page_h, + double output_w, double output_h) +{ + cairo_t *cr; + cairo_status_t status; + cairo_matrix_t m; + + cr = cairo_create(surface); + cairoOut->setCairo(cr); + cairoOut->setPrinting(printing); + + cairo_save(cr); + if (ps && output_w > output_h) { + // rotate 90 deg for landscape + cairo_translate (cr, 0, output_w); + cairo_matrix_init (&m, 0, -1, 1, 0, 0, 0); + cairo_transform (cr, &m); + } + cairo_translate (cr, -crop_x, -crop_y); + if (printing) { + double cropped_w, cropped_h; + getCropSize(page_w, page_h, &cropped_w, &cropped_h); + getFitToPageTransform(cropped_w, cropped_h, output_w, output_h, &m); + cairo_transform (cr, &m); + cairo_rectangle(cr, crop_x, crop_y, cropped_w, cropped_h); + cairo_clip(cr); + } else { + cairo_scale (cr, x_resolution/72.0, y_resolution/72.0); + } + doc->displayPageSlice(cairoOut, + pg, + 72.0, 72.0, + 0, /* rotate */ + !useCropBox, /* useMediaBox */ + gFalse, /* Crop */ + printing, + -1, -1, -1, -1); + cairo_restore(cr); + cairoOut->setCairo(NULL); + + // Blend onto white page + if (!printing && !transp) { + cairo_save(cr); + cairo_set_operator(cr, CAIRO_OPERATOR_DEST_OVER); + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_paint(cr); + cairo_restore(cr); + } + + status = cairo_status(cr); + if (status) + error(errInternal, -1, "cairo error: {0:s}\n", cairo_status_to_string(status)); + cairo_destroy (cr); +} + +static void endPage(GooString *imageFileName) +{ + cairo_status_t status; + + if (printing) { + cairo_surface_show_page(surface); + } else { + writePageImage(imageFileName); + cairo_surface_finish(surface); + status = cairo_surface_status(surface); + if (status) + error(errInternal, -1, "cairo error: {0:s}\n", cairo_status_to_string(status)); + cairo_surface_destroy(surface); + } + +} + +static void endDocument() +{ + cairo_status_t status; + + if (printing) { + cairo_surface_finish(surface); + status = cairo_surface_status(surface); + if (status) + error(errInternal, -1, "cairo error: {0:s}\n", cairo_status_to_string(status)); + cairo_surface_destroy(surface); + fclose(output_file); + } +} + +static GBool setPSPaperSize(char *size, int &psPaperWidth, int &psPaperHeight) { + if (!strcmp(size, "match")) { + psPaperWidth = psPaperHeight = -1; + } else if (!strcmp(size, "letter")) { + psPaperWidth = 612; + psPaperHeight = 792; + } else if (!strcmp(size, "legal")) { + psPaperWidth = 612; + psPaperHeight = 1008; + } else if (!strcmp(size, "A4")) { + psPaperWidth = 595; + psPaperHeight = 842; + } else if (!strcmp(size, "A3")) { + psPaperWidth = 842; + psPaperHeight = 1190; + } else { + return gFalse; + } + return gTrue; +} + +static int numberOfCharacters(unsigned int n) +{ + int charNum = 0; + while (n >= 10) + { + n = n / 10; + charNum++; + } + charNum++; + return charNum; +} + +static GooString *getImageFileName(GooString *outputFileName, int numDigits, int page) +{ + char buf[10]; + GooString *imageName = new GooString(outputFileName); + if (!singleFile) { + snprintf(buf, sizeof(buf), "-%0*d", numDigits, page); + imageName->appendf(buf); + } + if (png) + imageName->append(".png"); + else if (jpeg) + imageName->append(".jpg"); + + return imageName; +} + +// If (printing || singleFile) the output file name includes the +// extension. Otherwise it is the file name base. +static GooString *getOutputFileName(GooString *fileName, GooString *outputName) +{ + GooString *name; + char *s; + char *p; + + if (outputName) { + if (outputName->cmp("-") == 0) { + if (!printing && !singleFile) { + fprintf(stderr, "Error: stdout may only be used with the ps, eps, pdf, svg output options or if -singlefile is used.\n"); + exit(99); + } + return new GooString("fd://0"); + } + return new GooString(outputName); + } + + if (fileName->cmp("fd://0") == 0) { + fprintf(stderr, "Error: an output filename or '-' must be supplied when the PDF file is stdin.\n"); + exit(99); + } + + // be careful not to overwrite the input file when the output format is PDF + if (pdf && fileName->cmpN("http://", 7) != 0 && fileName->cmpN("https://", 8) != 0) { + fprintf(stderr, "Error: an output filename or '-' must be supplied when the output format is PDF and input PDF file is a local file.\n"); + exit(99); + } + + // strip everything up to last '/' + s = fileName->getCString(); + p = strrchr(s, '/'); + if (p) { + p++; + if (*p == 0) { + fprintf(stderr, "Error: invalid output filename.\n"); + exit(99); + } + name = new GooString(p); + } else { + name = new GooString(s); + } + + // remove .pdf extension + p = strrchr(name->getCString(), '.'); + if (p && strcasecmp(p, ".pdf") == 0) { + GooString *name2 = new GooString(name->getCString(), name->getLength() - 4); + delete name; + name = name2; + } + + // append new extension + if (ps) + name->append(".ps"); + else if (eps) + name->append(".eps"); + else if (pdf) + name->append(".pdf"); + else if (svg) + name->append(".svg"); + + return name; +} + +static void checkInvalidPrintOption(GBool option, const char *option_name) +{ + if (option) { + fprintf(stderr, "Error: %s may only be used with the -png or -jpeg output options.\n", option_name); + exit(99); + } +} + +static void checkInvalidImageOption(GBool option, const char *option_name) +{ + if (option) { + fprintf(stderr, "Error: %s may only be used with the -ps, -eps, -pdf, or -svg output options.\n", option_name); + exit(99); + } +} + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName = NULL; + GooString *outputName = NULL; + GooString *outputFileName = NULL; + GooString *imageFileName = NULL; + GooString *ownerPW, *userPW; + CairoOutputDev *cairoOut; + int pg, pg_num_len; + double pg_w, pg_h, tmp, output_w, output_h; + int num_outputs; + + // parse args + if (!parseArgs(argDesc, &argc, argv)) + exit(99); + + if ( resolution != 0.0 && + (x_resolution == 150.0 || + y_resolution == 150.0)) { + x_resolution = resolution; + y_resolution = resolution; + } + if (argc < 2 || argc > 3 || printVersion || printHelp) { + fprintf(stderr, "pdftocairo version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdftocairo", " []", argDesc); + } + if (printVersion || printHelp) + exit(0); + else + exit(99); + } + + num_outputs = (png ? 1 : 0) + + (jpeg ? 1 : 0) + + (ps ? 1 : 0) + + (eps ? 1 : 0) + + (pdf ? 1 : 0) + + (svg ? 1 : 0); + if (num_outputs == 0) { + fprintf(stderr, "Error: one of the output format options (-png, -jpeg, -ps, -eps, -pdf, -svg) must be used.\n"); + exit(99); + } + if (num_outputs > 1) { + fprintf(stderr, "Error: use only one of the output format options (-png, -jpeg, -ps, -eps, -pdf, -svg).\n"); + exit(99); + } + if (png || jpeg) + printing = gFalse; + else + printing = gTrue; + + if (printing) { + checkInvalidPrintOption(mono, "-mono"); + checkInvalidPrintOption(gray, "-gray"); + checkInvalidPrintOption(transp, "-transp"); + checkInvalidPrintOption(icc.getCString()[0], "-icc"); + checkInvalidPrintOption(singleFile, "-singlefile"); + } else { + checkInvalidImageOption(level2, "-level2"); + checkInvalidImageOption(level3, "-level3"); + checkInvalidImageOption(doOrigPageSizes, "-origpagesizes"); + checkInvalidImageOption(paperSize[0], "-paper"); + checkInvalidImageOption(paperWidth > 0, "-paperw"); + checkInvalidImageOption(paperHeight > 0, "-paperh"); + checkInvalidImageOption(noCrop, "-nocrop"); + checkInvalidImageOption(expand, "-expand"); + checkInvalidImageOption(noShrink, "-noshrink"); + checkInvalidImageOption(noCenter, "-nocenter"); + checkInvalidImageOption(duplex, "-duplex"); + } + + if (icc.getCString()[0] && !png) { + fprintf(stderr, "Error: -icc may only be used with png output.\n"); + exit(99); + } + + if (transp && !png) { + fprintf(stderr, "Error: -transp may only be used with png output.\n"); + exit(99); + } + + if (mono && gray) { + fprintf(stderr, "Error: -mono and -gray may not be used together.\n"); + exit(99); + } + + if (mono && !png) { + fprintf(stderr, "Error: -mono may only be used with png output.\n"); + exit(99); + } + + if (level2 && level3) { + fprintf(stderr, "Error: use only one of the 'level' options.\n"); + exit(99); + } + if (!level2 && !level3) + level3 = gTrue; + + if (eps && (doOrigPageSizes || paperSize[0] || paperWidth > 0 || paperHeight > 0)) { + fprintf(stderr, "Error: page size options may not be used with eps output.\n"); + exit(99); + } + + if (paperSize[0]) { + if (!setPSPaperSize(paperSize, paperWidth, paperHeight)) { + fprintf(stderr, "Invalid paper size\n"); + exit(99); + } + } + + globalParams = new GlobalParams(); + if (quiet) { + globalParams->setErrQuiet(quiet); + } + + // open PDF file + if (ownerPassword[0]) { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0]) { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + + fileName = new GooString(argv[1]); + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + if (argc == 3) + outputName = new GooString(argv[2]); + else + outputName = NULL; + + outputFileName = getOutputFileName(fileName, outputName); + +#if USE_CMS + icc_data = NULL; + if (icc.getCString()[0]) { + FILE *file = fopen(icc.getCString(), "rb"); + if (!file) { + fprintf(stderr, "Error: unable to open icc profile %s\n", icc.getCString()); + exit(4); + } + fseek (file, 0, SEEK_END); + icc_data_size = ftell(file); + fseek (file, 0, SEEK_SET); + icc_data = (unsigned char*)gmalloc(icc_data_size); + if (fread(icc_data, icc_data_size, 1, file) != 1) { + fprintf(stderr, "Error: unable to read icc profile %s\n", icc.getCString()); + exit(4); + } + fclose(file); + profile = cmsOpenProfileFromMem(icc_data, icc_data_size); + if (!profile) { + fprintf(stderr, "Error: lcms error opening profile\n"); + exit(4); + } + } else { + profile = cmsCreate_sRGBProfile(); + } + GfxColorSpace::setDisplayProfile(profile); +#endif + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + if (!doc->isOk()) { + fprintf(stderr, "Error opening PDF file.\n"); + exit(1); + } + +#ifdef ENFORCE_PERMISSIONS + // check for print permission + if (printing && !doc->okToPrint()) { + fprintf(stderr, "Printing this document is not allowed.\n"); + exit(3); + } +#endif + + // get page range + if (firstPage < 1) + firstPage = 1; + if (singleFile && lastPage < 1) + lastPage = firstPage; + if (lastPage < 1 || lastPage > doc->getNumPages()) + lastPage = doc->getNumPages(); + + if (eps && firstPage != lastPage) { + fprintf(stderr, "EPS files can only contain one page.\n"); + exit(99); + } + + if (singleFile && firstPage < lastPage) { + if (!quiet) { + fprintf(stderr, + "Warning: Single file will write only the first of the %d pages.\n", + lastPage + 1 - firstPage); + } + lastPage = firstPage; + } + + // Make sure firstPage is always used so that beginDocument() is called + if ((printOnlyEven && firstPage % 2 == 0) || (printOnlyOdd && firstPage % 2 == 1)) + firstPage++; + + cairoOut = new CairoOutputDev(); + cairoOut->startDoc(doc); + if (sz != 0) + crop_w = crop_h = sz; + pg_num_len = numberOfCharacters(doc->getNumPages()); + for (pg = firstPage; pg <= lastPage; ++pg) { + if (printOnlyEven && pg % 2 == 0) continue; + if (printOnlyOdd && pg % 2 == 1) continue; + if (useCropBox) { + pg_w = doc->getPageCropWidth(pg); + pg_h = doc->getPageCropHeight(pg); + } else { + pg_w = doc->getPageMediaWidth(pg); + pg_h = doc->getPageMediaHeight(pg); + } + + if (printing && pg == firstPage) { + if (paperWidth < 0 || paperHeight < 0) { + paperWidth = (int)ceil(pg_w); + paperHeight = (int)ceil(pg_h); + } + } + + if (scaleTo != 0) { + resolution = (72.0 * scaleTo) / (pg_w > pg_h ? pg_w : pg_h); + x_resolution = y_resolution = resolution; + } else { + if (x_scaleTo > 0) { + x_resolution = (72.0 * x_scaleTo) / pg_w; + if (y_scaleTo == -1) + y_resolution = x_resolution; + } + if (y_scaleTo > 0) { + y_resolution = (72.0 * y_scaleTo) / pg_h; + if (x_scaleTo == -1) + x_resolution = y_resolution; + } + } + if ((doc->getPageRotate(pg) == 90) || (doc->getPageRotate(pg) == 270)) { + tmp = pg_w; + pg_w = pg_h; + pg_h = tmp; + } + if (imageFileName) { + delete imageFileName; + imageFileName = NULL; + } + if (!printing) + imageFileName = getImageFileName(outputFileName, pg_num_len, pg); + getOutputSize(pg_w, pg_h, &output_w, &output_h); + + if (pg == firstPage) + beginDocument(outputFileName, output_w, output_h); + beginPage(output_w, output_h); + renderPage(doc, cairoOut, pg, pg_w, pg_h, output_w, output_h); + endPage(imageFileName); + } + endDocument(); + + // clean up + delete cairoOut; + delete doc; + delete globalParams; + if (fileName) + delete fileName; + if (outputName) + delete outputName; + if (outputFileName) + delete outputFileName; + if (imageFileName) + delete imageFileName; + if (ownerPW) + delete ownerPW; + if (userPW) + delete ownerPW; + +#if USE_CMS + cmsCloseProfile(profile); + if (icc_data) + gfree(icc_data); +#endif + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return 0; +} diff --git a/utils/pdftohtml.1 b/utils/pdftohtml.1 new file mode 100644 index 0000000..44137e4 --- /dev/null +++ b/utils/pdftohtml.1 @@ -0,0 +1,108 @@ +.TH PDFTOHTML 1 +.\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection +.\" other parms are allowed: see man(7), man(1) +.SH NAME +pdftohtml \- program to convert PDF files into HTML, XML and PNG images +.SH SYNOPSIS +.B pdftohtml +.I "[options] [ ]" +.SH "DESCRIPTION" +This manual page documents briefly the +.BR pdftohtml +command. +This manual page was written for the Debian GNU/Linux distribution +because the original program does not have a manual page. +.PP +.B pdftohtml +is a program that converts PDF documents into HTML. It generates its output in +the current working directory. +.SH OPTIONS +A summary of options are included below. +.TP +.B \-h, \-help +Show summary of options. +.TP +.B \-f +first page to print +.TP +.B \-l +last page to print +.TP +.B \-q +do not print any messages or errors +.TP +.B \-v +print copyright and version info +.TP +.B \-p +exchange .pdf links with .html +.TP +.B \-c +generate complex output +.TP +.B \-s +generate single HTML that includes all pages +.TP +.B \-i +ignore images +.TP +.B \-noframes +generate no frames. Not supported in complex output mode. +.TP +.B \-stdout +use standard output +.TP +.B \-zoom +zoom the PDF document (default 1.5) +.TP +.B \-xml +output for XML post-processing +.TP +.B \-enc +output text encoding name +.TP +.B \-opw +owner password (for encrypted files) +.TP +.B \-upw +user password (for encrypted files) +.TP +.B \-hidden +force hidden text extraction +.TP +.B \-dev +output device name for Ghostscript (png16m, jpeg etc). +Unless this option is specified, Splash will be used +.TP +.B \-fmt +image file format for Splash output (png or jpg). +If complex is selected, but neither \-fmt or \-dev are specified, +\-fmt png will be assumed +.TP +.B \-nomerge +do not merge paragraphs +.TP +.B \-nodrm +override document DRM settings +.TP +.B \-wbt +adjust the word break threshold percent. Default is 10. +Word break occurs when distance between two adjacent characters is +greater than this percent of character height. + +.SH AUTHOR + +Pdftohtml was developed by Gueorgui Ovtcharov and Rainer Dorsch. It is +based and benefits a lot from Derek Noonburg's xpdf package. + +This manual page was written by Søren Boll Overgaard , +for the Debian GNU/Linux system (but may be used by others). +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdffonts (1), +.BR pdfimages (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftoppm (1), +.BR pdftops (1), +.BR pdftotext (1) diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc new file mode 100644 index 0000000..d6475b0 --- /dev/null +++ b/utils/pdftohtml.cc @@ -0,0 +1,603 @@ +//======================================================================== +// +// pdftohtml.cc +// +// +// Copyright 1999-2000 G. Ovtcharov +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007-2008, 2010, 2012 Albert Astals Cid +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Mike Slegeir +// Copyright (C) 2010 Suzuki Toshiya +// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac@cdacmumbai.in) and Onkar Potdar (onkar@cdacmumbai.in) +// Copyright (C) 2011 Steven Murdoch +// Copyright (C) 2012 Igor Slepchin +// Copyright (C) 2012 Ihar Filipau +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#ifdef HAVE_DIRENT_H +#include +#endif +#include +#include "parseargs.h" +#include "goo/GooString.h" +#include "goo/gmem.h" +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "Outline.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "HtmlOutputDev.h" +#ifdef HAVE_SPLASH +#include "SplashOutputDev.h" +#include "splash/SplashBitmap.h" +#endif +#include "PSOutputDev.h" +#include "GlobalParams.h" +#include "PDFDocEncoding.h" +#include "Error.h" +#include "DateInfo.h" +#include "goo/gfile.h" + +#ifndef GHOSTSCRIPT +# define GHOSTSCRIPT "gs" +#endif + +static int firstPage = 1; +static int lastPage = 0; +static GBool rawOrder = gTrue; +GBool printCommands = gTrue; +static GBool printHelp = gFalse; +GBool printHtml = gFalse; +GBool complexMode=gFalse; +GBool singleHtml=gFalse; // singleHtml +GBool ignore=gFalse; +static GBool useSplash=gTrue; +static char extension[5]="png"; +static double scale=1.5; +GBool noframes=gFalse; +GBool stout=gFalse; +GBool xml=gFalse; +static GBool errQuiet=gFalse; +static GBool noDrm=gFalse; +double wordBreakThreshold=10; // 10%, below converted into a coefficient - 0.1 + +GBool showHidden = gFalse; +GBool noMerge = gFalse; +static char ownerPassword[33] = ""; +static char userPassword[33] = ""; +static char gsDevice[33] = "none"; +static GBool printVersion = gFalse; + +static GooString* getInfoString(Dict *infoDict, const char *key); +static GooString* getInfoDate(Dict *infoDict, const char *key); + +static char textEncName[128] = ""; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to convert"}, + {"-l", argInt, &lastPage, 0, + "last page to convert"}, + /*{"-raw", argFlag, &rawOrder, 0, + "keep strings in content stream order"},*/ + {"-q", argFlag, &errQuiet, 0, + "don't print any messages or errors"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"-p", argFlag, &printHtml, 0, + "exchange .pdf links by .html"}, + {"-c", argFlag, &complexMode, 0, + "generate complex document"}, + {"-s", argFlag, &singleHtml, 0, + "generate single document that includes all pages"}, + {"-i", argFlag, &ignore, 0, + "ignore images"}, + {"-noframes", argFlag, &noframes, 0, + "generate no frames"}, + {"-stdout" ,argFlag, &stout, 0, + "use standard output"}, + {"-zoom", argFP, &scale, 0, + "zoom the pdf document (default 1.5)"}, + {"-xml", argFlag, &xml, 0, + "output for XML post-processing"}, + {"-hidden", argFlag, &showHidden, 0, + "output hidden text"}, + {"-nomerge", argFlag, &noMerge, 0, + "do not merge paragraphs"}, + {"-enc", argString, textEncName, sizeof(textEncName), + "output text encoding name"}, + {"-dev", argString, gsDevice, sizeof(gsDevice), + "output device name for Ghostscript (png16m, jpeg etc)"}, + {"-fmt", argString, extension, sizeof(extension), + "image file format for Splash output (png or jpg)"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-nodrm", argFlag, &noDrm, 0, + "override document DRM settings"}, + {"-wbt", argFP, &wordBreakThreshold, 0, + "word break threshold (default 10 percent)"}, + {NULL} +}; + +#ifdef HAVE_SPLASH +class SplashOutputDevNoText : public SplashOutputDev { +public: + SplashOutputDevNoText(SplashColorMode colorModeA, int bitmapRowPadA, + GBool reverseVideoA, SplashColorPtr paperColorA, + GBool bitmapTopDownA = gTrue, + GBool allowAntialiasA = gTrue) : SplashOutputDev(colorModeA, + bitmapRowPadA, reverseVideoA, paperColorA, bitmapTopDownA, + allowAntialiasA) { } + virtual ~SplashOutputDevNoText() { } + + void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) { } + GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) { return false; } + void endType3Char(GfxState *state) { } + void beginTextObject(GfxState *state) { } + GBool deviceHasTextClip(GfxState *state) { return false; } + void endTextObject(GfxState *state) { } + GBool interpretType3Chars() { return gFalse; } +}; +#endif + +int main(int argc, char *argv[]) { + PDFDoc *doc = NULL; + GooString *fileName = NULL; + GooString *docTitle = NULL; + GooString *author = NULL, *keywords = NULL, *subject = NULL, *date = NULL; + GooString *htmlFileName = NULL; + GooString *psFileName = NULL; + HtmlOutputDev *htmlOut = NULL; +#ifdef HAVE_SPLASH + SplashOutputDev *splashOut = NULL; +#endif + PSOutputDev *psOut = NULL; + GBool doOutline; + GBool ok; + char *p; + GooString *ownerPW, *userPW; + Object info; + const char * extsList[] = {"png", "jpeg", "bmp", "pcx", "tiff", "pbm", NULL}; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (!ok || argc < 2 || argc > 3 || printHelp || printVersion) { + fprintf(stderr, "pdftohtml version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", "Copyright 1999-2003 Gueorgui Ovtcharov and Rainer Dorsch"); + fprintf(stderr, "%s\n\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdftohtml", " [ ]", argDesc); + } + exit(1); + } + + // init error file + //errorInit(); + + // read config file + globalParams = new GlobalParams(); + + if (errQuiet) { + globalParams->setErrQuiet(errQuiet); + printCommands = gFalse; // I'm not 100% what is the differecne between them + } + + if (textEncName[0]) { + globalParams->setTextEncoding(textEncName); + if( !globalParams->getTextEncoding() ) { + goto error; + } + } + + // convert from user-friendly percents into a coefficient + wordBreakThreshold /= 100.0; + + // open PDF file + if (ownerPassword[0]) { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0]) { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + + fileName = new GooString(argv[1]); + + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + goto error; + } + + // check for copy permission + if (!doc->okToCopy()) { + if (!noDrm) { + error(errNotAllowed, -1, "Copying of text from this document is not allowed."); + goto error; + } + fprintf(stderr, "Document has copy-protection bit set.\n"); + } + + // construct text file name + if (argc == 3) { + GooString* tmp = new GooString(argv[2]); + if (!xml) { + if (tmp->getLength() >= 5) { + p = tmp->getCString() + tmp->getLength() - 5; + if (!strcmp(p, ".html") || !strcmp(p, ".HTML")) { + htmlFileName = new GooString(tmp->getCString(), tmp->getLength() - 5); + } + } + } else { + if (tmp->getLength() >= 4) { + p = tmp->getCString() + tmp->getLength() - 4; + if (!strcmp(p, ".xml") || !strcmp(p, ".XML")) { + htmlFileName = new GooString(tmp->getCString(), tmp->getLength() - 4); + } + } + } + if (!htmlFileName) { + htmlFileName =new GooString(tmp); + } + delete tmp; + } else if (fileName->cmp("fd://0") == 0) { + error(errCommandLine, -1, "You have to provide an output filename when reading form stdin."); + goto error; + } else { + p = fileName->getCString() + fileName->getLength() - 4; + if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) + htmlFileName = new GooString(fileName->getCString(), + fileName->getLength() - 4); + else + htmlFileName = fileName->copy(); + // htmlFileName->append(".html"); + } + + if (scale>3.0) scale=3.0; + if (scale<0.5) scale=0.5; + + if (complexMode || singleHtml) { + //noframes=gFalse; + stout=gFalse; + } + + if (stout) { + noframes=gTrue; + complexMode=gFalse; + singleHtml=gFalse; + } + + if (xml) + { + complexMode = gTrue; + singleHtml = gFalse; + noframes = gTrue; + noMerge = gTrue; + } + + // get page range + if (firstPage < 1) + firstPage = 1; + if (lastPage < 1 || lastPage > doc->getNumPages()) + lastPage = doc->getNumPages(); + + doc->getDocInfo(&info); + if (info.isDict()) { + docTitle = getInfoString(info.getDict(), "Title"); + author = getInfoString(info.getDict(), "Author"); + keywords = getInfoString(info.getDict(), "Keywords"); + subject = getInfoString(info.getDict(), "Subject"); + date = getInfoDate(info.getDict(), "ModDate"); + if( !date ) + date = getInfoDate(info.getDict(), "CreationDate"); + } + info.free(); + if( !docTitle ) docTitle = new GooString(htmlFileName); + + if( strcmp("none", gsDevice) ) { + useSplash = gFalse; + /* determine extensions of output background images */ + int i; + for(i = 0; extsList[i]; i++) + { + if( strstr(gsDevice, extsList[i]) != (char *) NULL ) + { + strncpy(extension, extsList[i], sizeof(extension)); + break; + } + } + } + +#ifndef HAVE_SPLASH + if( useSplash ) { + fprintf(stderr, "You are trying to use the -fmt option but your pdftohtml was built without support for it. Please use the -dev option\n"); + delete docTitle; + delete author; + delete keywords; + delete subject; + delete date; + delete htmlFileName; + delete globalParams; + delete fileName; + delete doc; + return -1; + } +#endif + + if (!singleHtml) + rawOrder = complexMode; // todo: figure out what exactly rawOrder do :) + else + rawOrder = singleHtml; + +#ifdef DISABLE_OUTLINE + doOutline = gFalse; +#else + doOutline = doc->getOutline()->getItems() != NULL; +#endif + // write text file + htmlOut = new HtmlOutputDev(doc->getCatalog(), htmlFileName->getCString(), + docTitle->getCString(), + author ? author->getCString() : NULL, + keywords ? keywords->getCString() : NULL, + subject ? subject->getCString() : NULL, + date ? date->getCString() : NULL, + extension, + rawOrder, + firstPage, + doOutline); + delete docTitle; + if( author ) + { + delete author; + } + if( keywords ) + { + delete keywords; + } + if( subject ) + { + delete subject; + } + if( date ) + { + delete date; + } + + if (htmlOut->isOk()) + { + doc->displayPages(htmlOut, firstPage, lastPage, 72 * scale, 72 * scale, 0, + gTrue, gFalse, gFalse); + htmlOut->dumpDocOutline(doc); + } + + if ((complexMode || singleHtml) && !xml && !ignore) { + if(useSplash) { +#ifdef HAVE_SPLASH + GooString *imgFileName = NULL; + // White paper color + SplashColor color; + color[0] = color[1] = color[2] = 255; + // If the user specified "jpg" use JPEG, otherwise PNG + SplashImageFileFormat format = strcmp(extension, "jpg") ? + splashFormatPng : splashFormatJpeg; + + splashOut = new SplashOutputDevNoText(splashModeRGB8, 4, gFalse, color); + splashOut->startDoc(doc); + + for (int pg = firstPage; pg <= lastPage; ++pg) { + doc->displayPage(splashOut, pg, + 72 * scale, 72 * scale, + 0, gTrue, gFalse, gFalse); + SplashBitmap *bitmap = splashOut->getBitmap(); + + imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", + htmlFileName->getCString(), pg, extension); + + bitmap->writeImgFile(format, imgFileName->getCString(), + 72 * scale, 72 * scale); + + delete imgFileName; + } + + delete splashOut; +#endif + } else { + int h=xoutRound(htmlOut->getPageHeight()/scale); + int w=xoutRound(htmlOut->getPageWidth()/scale); + //int h=xoutRound(doc->getPageHeight(1)/scale); + //int w=xoutRound(doc->getPageWidth(1)/scale); + + psFileName = new GooString(htmlFileName->getCString()); + psFileName->append(".ps"); + + psOut = new PSOutputDev(psFileName->getCString(), doc, + NULL, firstPage, lastPage, psModePS, w, h); + psOut->setDisplayText(gFalse); + doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0, + gTrue, gFalse, gFalse); + delete psOut; + + /*sprintf(buf, "%s -sDEVICE=png16m -dBATCH -dNOPROMPT -dNOPAUSE -r%d -sOutputFile=%s%%03d.png -g%dx%d -q %s", GHOSTSCRIPT, resolution, htmlFileName->getCString(), w, h, + psFileName->getCString());*/ + + GooString *gsCmd = new GooString(GHOSTSCRIPT); + GooString *tw, *th, *sc; + gsCmd->append(" -sDEVICE="); + gsCmd->append(gsDevice); + gsCmd->append(" -dBATCH -dNOPROMPT -dNOPAUSE -r"); + sc = GooString::fromInt(static_cast(72*scale)); + gsCmd->append(sc); + gsCmd->append(" -sOutputFile="); + gsCmd->append("\""); + gsCmd->append(htmlFileName); + gsCmd->append("%03d."); + gsCmd->append(extension); + gsCmd->append("\" -g"); + tw = GooString::fromInt(static_cast(scale*w)); + gsCmd->append(tw); + gsCmd->append("x"); + th = GooString::fromInt(static_cast(scale*h)); + gsCmd->append(th); + gsCmd->append(" -q \""); + gsCmd->append(psFileName); + gsCmd->append("\""); + // printf("running: %s\n", gsCmd->getCString()); + if( !executeCommand(gsCmd->getCString()) && !errQuiet) { + error(errIO, -1, "Failed to launch Ghostscript!\n"); + } + unlink(psFileName->getCString()); + delete tw; + delete th; + delete sc; + delete gsCmd; + delete psFileName; + } + } + + delete htmlOut; + + // clean up + error: + if(doc) delete doc; + delete fileName; + if(globalParams) delete globalParams; + + if(htmlFileName) delete htmlFileName; + HtmlFont::clear(); + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return 0; +} + +static GooString* getInfoString(Dict *infoDict, const char *key) { + Object obj; + // Raw value as read from PDF (may be in pdfDocEncoding or UCS2) + GooString *rawString; + // Value converted to unicode + Unicode *unicodeString; + int unicodeLength; + // Value HTML escaped and converted to desired encoding + GooString *encodedString = NULL; + // Is rawString UCS2 (as opposed to pdfDocEncoding) + GBool isUnicode; + + if (infoDict->lookup(key, &obj)->isString()) { + rawString = obj.getString(); + + // Convert rawString to unicode + if (rawString->hasUnicodeMarker()) { + isUnicode = gTrue; + unicodeLength = (obj.getString()->getLength() - 2) / 2; + } else { + isUnicode = gFalse; + unicodeLength = obj.getString()->getLength(); + } + unicodeString = new Unicode[unicodeLength]; + + for (int i=0; igetChar((i+1)*2) & 0xff) << 8) | + (rawString->getChar(((i+1)*2)+1) & 0xff); + } else { + unicodeString[i] = pdfDocEncoding[rawString->getChar(i) & 0xff]; + } + } + + // HTML escape and encode unicode + encodedString = HtmlFont::HtmlFilter(unicodeString, unicodeLength); + delete[] unicodeString; + } + + obj.free(); + return encodedString; +} + +static GooString* getInfoDate(Dict *infoDict, const char *key) { + Object obj; + char *s; + int year, mon, day, hour, min, sec, tz_hour, tz_minute; + char tz; + struct tm tmStruct; + GooString *result = NULL; + char buf[256]; + + if (infoDict->lookup(key, &obj)->isString()) { + s = obj.getString()->getCString(); + // TODO do something with the timezone info + if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) { + tmStruct.tm_year = year - 1900; + tmStruct.tm_mon = mon - 1; + tmStruct.tm_mday = day; + tmStruct.tm_hour = hour; + tmStruct.tm_min = min; + tmStruct.tm_sec = sec; + tmStruct.tm_wday = -1; + tmStruct.tm_yday = -1; + tmStruct.tm_isdst = -1; + mktime(&tmStruct); // compute the tm_wday and tm_yday fields + if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S+00:00", &tmStruct)) { + result = new GooString(buf); + } else { + result = new GooString(s); + } + } else { + result = new GooString(s); + } + } + obj.free(); + return result; +} + diff --git a/utils/pdftoppm.1 b/utils/pdftoppm.1 new file mode 100644 index 0000000..2321d6d --- /dev/null +++ b/utils/pdftoppm.1 @@ -0,0 +1,158 @@ +.\" Copyright 2005-2011 Glyph & Cog, LLC +.TH pdftoppm 1 "15 August 2011" +.SH NAME +pdftoppm \- Portable Document Format (PDF) to Portable Pixmap (PPM) +converter (version 3.03) +.SH SYNOPSIS +.B pdftoppm +[options] +.I PDF-file PPM-root +.SH DESCRIPTION +.B Pdftoppm +converts Portable Document Format (PDF) files to color image files in +Portable Pixmap (PPM) format, grayscale image files in Portable +Graymap (PGM) format, or monochrome image files in Portable Bitmap +(PBM) format. +.PP +Pdftoppm reads the PDF file, +.IR PDF-file , +and writes one PPM file for each page, +.IR PPM-root - number .ppm, +where +.I number +is the page number. +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to convert. +.TP +.BI \-l " number" +Specifies the last page to convert. +.TP +.B \-o +Generates only the odd numbered pages. +.TP +.B \-e +Generates only the even numbered pages. +.TP +.BI \-singlefile +Writes only the first page and does not add digits. +.TP +.BI \-r " number" +Specifies the X and Y resolution, in DPI. The default is 150 DPI. +.TP +.BI \-rx " number" +Specifies the X resolution, in DPI. The default is 150 DPI. +.TP +.BI \-ry " number" +Specifies the Y resolution, in DPI. The default is 150 DPI. +.TP +.BI \-scale-to " number" +Scales the long side of each page (width for landscape pages, height +for portrait pages) to fit in scale-to pixels. The size of the short +side will be determined by the aspect ratio of the page. +.TP +.BI \-scale-to-x " number" +Scales each page horizontally to fit in scale-to-x pixels. If +scale-to-y is set to -1, the vertical size will determined by the +aspect ratio of the page. +.TP +.BI \-scale-to-y " number" +Scales each page vertically to fit in scale-to-y pixels. If scale-to-x +is set to -1, the horizontal size will determined by the aspect ratio +of the page. +.TP +.BI \-x " number" +Specifies the x-coordinate of the crop area top left corner +.TP +.BI \-y " number" +Specifies the y-coordinate of the crop area top left corner +.TP +.BI \-W " number" +Specifies the width of crop area in pixels (default is 0) +.TP +.BI \-H " number" +Specifies the height of crop area in pixels (default is 0) +.TP +.BI \-sz " number" +Specifies the size of crop square in pixels (sets W and H) +.TP +.B \-cropbox +Uses the crop box rather than media box when generating the files +.TP +.B \-mono +Generate a monochrome PBM file (instead of a color PPM file). +.TP +.B \-gray +Generate a grayscale PGM file (instead of a color PPM file). +.TP +.B \-png +Generates a PNG file instead a PPM file. +.TP +.B \-jpeg +Generates a JPEG file instead a PPM file. +.TP +.B \-tiff +Generates a TIFF file instead a PPM file. +.TP +.BI \-tiffcompression " none | packbits | jpeg | lzw | deflate" +Specifies the TIFF compression type. This defaults to "none". +.TP +.BI \-freetype " yes | no" +Enable or disable FreeType (a TrueType / Type 1 font rasterizer). +This defaults to "yes". +.TP +.BI \-aa " yes | no" +Enable or disable font anti-aliasing. This defaults to "yes". +.TP +.BI \-aaVector " yes | no" +Enable or disable vector anti-aliasing. This defaults to "yes". +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-q +Don't print any messages or errors. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdftoppm software and documentation are copyright 1996-2011 Glyph +& Cog, LLC. +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdffonts (1), +.BR pdfimages (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftops (1), +.BR pdftotext (1) diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc new file mode 100644 index 0000000..04a0dfb --- /dev/null +++ b/utils/pdftoppm.cc @@ -0,0 +1,440 @@ +//======================================================================== +// +// pdftoppm.cc +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2007 Ilmari Heikkinen +// Copyright (C) 2008 Richard Airlie +// Copyright (C) 2009 Michael K. Johnson +// Copyright (C) 2009 Shen Liang +// Copyright (C) 2009 Stefan Thomas +// Copyright (C) 2009-2011 Albert Astals Cid +// Copyright (C) 2010, 2012 Adrian Johnson +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Jonathan Liu +// Copyright (C) 2010 William Bader +// Copyright (C) 2011 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#ifdef _WIN32 +#include // for O_BINARY +#include // for setmode +#endif +#include +#include +#include "parseargs.h" +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "GlobalParams.h" +#include "Object.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "splash/SplashBitmap.h" +#include "splash/Splash.h" +#include "SplashOutputDev.h" + +static int firstPage = 1; +static int lastPage = 0; +static GBool printOnlyOdd = gFalse; +static GBool printOnlyEven = gFalse; +static GBool singleFile = gFalse; +static double resolution = 0.0; +static double x_resolution = 150.0; +static double y_resolution = 150.0; +static int scaleTo = 0; +static int x_scaleTo = 0; +static int y_scaleTo = 0; +static int x = 0; +static int y = 0; +static int w = 0; +static int h = 0; +static int sz = 0; +static GBool useCropBox = gFalse; +static GBool mono = gFalse; +static GBool gray = gFalse; +static GBool png = gFalse; +static GBool jpeg = gFalse; +static GBool jpegcmyk = gFalse; +static GBool tiff = gFalse; +#if SPLASH_CMYK +static GBool overprint = gFalse; +#endif +static char enableFreeTypeStr[16] = ""; +static char antialiasStr[16] = ""; +static char vectorAntialiasStr[16] = ""; +static char ownerPassword[33] = ""; +static char userPassword[33] = ""; +static char TiffCompressionStr[16] = ""; +static GBool quiet = gFalse; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to print"}, + {"-l", argInt, &lastPage, 0, + "last page to print"}, + {"-o", argFlag, &printOnlyOdd, 0, + "print only odd pages"}, + {"-e", argFlag, &printOnlyEven, 0, + "print only even pages"}, + {"-singlefile", argFlag, &singleFile, 0, + "write only the first page and do not add digits"}, + + {"-r", argFP, &resolution, 0, + "resolution, in DPI (default is 150)"}, + {"-rx", argFP, &x_resolution, 0, + "X resolution, in DPI (default is 150)"}, + {"-ry", argFP, &y_resolution, 0, + "Y resolution, in DPI (default is 150)"}, + {"-scale-to", argInt, &scaleTo, 0, + "scales each page to fit within scale-to*scale-to pixel box"}, + {"-scale-to-x", argInt, &x_scaleTo, 0, + "scales each page horizontally to fit in scale-to-x pixels"}, + {"-scale-to-y", argInt, &y_scaleTo, 0, + "scales each page vertically to fit in scale-to-y pixels"}, + + {"-x", argInt, &x, 0, + "x-coordinate of the crop area top left corner"}, + {"-y", argInt, &y, 0, + "y-coordinate of the crop area top left corner"}, + {"-W", argInt, &w, 0, + "width of crop area in pixels (default is 0)"}, + {"-H", argInt, &h, 0, + "height of crop area in pixels (default is 0)"}, + {"-sz", argInt, &sz, 0, + "size of crop square in pixels (sets W and H)"}, + {"-cropbox",argFlag, &useCropBox, 0, + "use the crop box rather than media box"}, + + {"-mono", argFlag, &mono, 0, + "generate a monochrome PBM file"}, + {"-gray", argFlag, &gray, 0, + "generate a grayscale PGM file"}, +#if ENABLE_LIBPNG + {"-png", argFlag, &png, 0, + "generate a PNG file"}, +#endif +#if ENABLE_LIBJPEG + {"-jpeg", argFlag, &jpeg, 0, + "generate a JPEG file"}, +#if SPLASH_CMYK + {"-jpegcmyk",argFlag, &jpegcmyk, 0, + "generate a CMYK JPEG file"}, +#endif +#endif +#if SPLASH_CMYK + {"-overprint",argFlag, &overprint, 0, + "enable overprint"}, +#endif +#if ENABLE_LIBTIFF + {"-tiff", argFlag, &tiff, 0, + "generate a TIFF file"}, + {"-tiffcompression", argString, TiffCompressionStr, sizeof(TiffCompressionStr), + "set TIFF compression: none, packbits, jpeg, lzw, deflate"}, +#endif +#if HAVE_FREETYPE_FREETYPE_H | HAVE_FREETYPE_H + {"-freetype", argString, enableFreeTypeStr, sizeof(enableFreeTypeStr), + "enable FreeType font rasterizer: yes, no"}, +#endif + + {"-aa", argString, antialiasStr, sizeof(antialiasStr), + "enable font anti-aliasing: yes, no"}, + {"-aaVector", argString, vectorAntialiasStr, sizeof(vectorAntialiasStr), + "enable vector anti-aliasing: yes, no"}, + + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + + {"-q", argFlag, &quiet, 0, + "don't print any messages or errors"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +static void savePageSlice(PDFDoc *doc, + SplashOutputDev *splashOut, + int pg, int x, int y, int w, int h, + double pg_w, double pg_h, + char *ppmFile) { + if (w == 0) w = (int)ceil(pg_w); + if (h == 0) h = (int)ceil(pg_h); + w = (x+w > pg_w ? (int)ceil(pg_w-x) : w); + h = (y+h > pg_h ? (int)ceil(pg_h-y) : h); + doc->displayPageSlice(splashOut, + pg, x_resolution, y_resolution, + 0, + !useCropBox, gFalse, gFalse, + x, y, w, h + ); + + SplashBitmap *bitmap = splashOut->getBitmap(); + + if (ppmFile != NULL) { + if (png) { + bitmap->writeImgFile(splashFormatPng, ppmFile, x_resolution, y_resolution); + } else if (jpeg) { + bitmap->writeImgFile(splashFormatJpeg, ppmFile, x_resolution, y_resolution); + } else if (jpegcmyk) { + bitmap->writeImgFile(splashFormatJpegCMYK, ppmFile, x_resolution, y_resolution); + } else if (tiff) { + bitmap->writeImgFile(splashFormatTiff, ppmFile, x_resolution, y_resolution, TiffCompressionStr); + } else { + bitmap->writePNMFile(ppmFile); + } + } else { +#ifdef _WIN32 + setmode(fileno(stdout), O_BINARY); +#endif + + if (png) { + bitmap->writeImgFile(splashFormatPng, stdout, x_resolution, y_resolution); + } else if (jpeg) { + bitmap->writeImgFile(splashFormatJpeg, stdout, x_resolution, y_resolution); + } else if (tiff) { + bitmap->writeImgFile(splashFormatTiff, stdout, x_resolution, y_resolution, TiffCompressionStr); + } else { + bitmap->writePNMFile(stdout); + } + } +} + +static int numberOfCharacters(unsigned int n) +{ + int charNum = 0; + while (n >= 10) + { + n = n / 10; + charNum++; + } + charNum++; + return charNum; +} + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName = NULL; + char *ppmRoot = NULL; + char *ppmFile; + GooString *ownerPW, *userPW; + SplashColor paperColor; + SplashOutputDev *splashOut; + GBool ok; + int exitCode; + int pg, pg_num_len; + double pg_w, pg_h, tmp; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (mono && gray) { + ok = gFalse; + } + if ( resolution != 0.0 && + (x_resolution == 150.0 || + y_resolution == 150.0)) { + x_resolution = resolution; + y_resolution = resolution; + } + if (!ok || argc > 3 || printVersion || printHelp) { + fprintf(stderr, "pdftoppm version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdftoppm", "[PDF-file [PPM-file-prefix]]", argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + goto err0; + } + if (argc > 1) fileName = new GooString(argv[1]); + if (argc == 3) ppmRoot = argv[2]; + + // read config file + globalParams = new GlobalParams(); + if (enableFreeTypeStr[0]) { + if (!globalParams->setEnableFreeType(enableFreeTypeStr)) { + fprintf(stderr, "Bad '-freetype' value on command line\n"); + } + } + if (antialiasStr[0]) { + if (!globalParams->setAntialias(antialiasStr)) { + fprintf(stderr, "Bad '-aa' value on command line\n"); + } + } + if (vectorAntialiasStr[0]) { + if (!globalParams->setVectorAntialias(vectorAntialiasStr)) { + fprintf(stderr, "Bad '-aaVector' value on command line\n"); + } + } + if (quiet) { + globalParams->setErrQuiet(quiet); + } + + // open PDF file + if (ownerPassword[0]) { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0]) { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + + if (fileName == NULL) { + fileName = new GooString("fd://0"); + } + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + delete fileName; + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err1; + } + + // get page range + if (firstPage < 1) + firstPage = 1; + if (singleFile && lastPage < 1) + lastPage = firstPage; + if (lastPage < 1 || lastPage > doc->getNumPages()) + lastPage = doc->getNumPages(); + + if (singleFile && firstPage < lastPage) { + if (!quiet) { + fprintf(stderr, + "Warning: Single file will write only the first of the %d pages.\n", + lastPage + 1 - firstPage); + } + lastPage = firstPage; + } + + // write PPM files +#if SPLASH_CMYK + if (jpegcmyk || overprint) { + globalParams->setOverprintPreview(gTrue); + paperColor[0] = 0; + paperColor[1] = 0; + paperColor[2] = 0; + paperColor[3] = 0; + } else +#endif + { + paperColor[0] = 255; + paperColor[1] = 255; + paperColor[2] = 255; + } + splashOut = new SplashOutputDev(mono ? splashModeMono1 : + gray ? splashModeMono8 : +#if SPLASH_CMYK + (jpegcmyk || overprint) ? splashModeCMYK8 : +#endif + splashModeRGB8, 4, + gFalse, paperColor); + splashOut->startDoc(doc); + if (sz != 0) w = h = sz; + pg_num_len = numberOfCharacters(doc->getNumPages()); + for (pg = firstPage; pg <= lastPage; ++pg) { + if (printOnlyEven && pg % 2 == 0) continue; + if (printOnlyOdd && pg % 2 == 1) continue; + if (useCropBox) { + pg_w = doc->getPageCropWidth(pg); + pg_h = doc->getPageCropHeight(pg); + } else { + pg_w = doc->getPageMediaWidth(pg); + pg_h = doc->getPageMediaHeight(pg); + } + + if (scaleTo != 0) { + resolution = (72.0 * scaleTo) / (pg_w > pg_h ? pg_w : pg_h); + x_resolution = y_resolution = resolution; + } else { + if (x_scaleTo > 0) { + x_resolution = (72.0 * x_scaleTo) / pg_w; + if (y_scaleTo == -1) + y_resolution = x_resolution; + } + if (y_scaleTo > 0) { + y_resolution = (72.0 * y_scaleTo) / pg_h; + if (x_scaleTo == -1) + x_resolution = y_resolution; + } + } + pg_w = pg_w * (x_resolution / 72.0); + pg_h = pg_h * (y_resolution / 72.0); + if ((doc->getPageRotate(pg) == 90) || (doc->getPageRotate(pg) == 270)) { + tmp = pg_w; + pg_w = pg_h; + pg_h = tmp; + } + if (ppmRoot != NULL) { + const char *ext = png ? "png" : (jpeg || jpegcmyk) ? "jpg" : tiff ? "tif" : mono ? "pbm" : gray ? "pgm" : "ppm"; + if (singleFile) { + ppmFile = new char[strlen(ppmRoot) + 1 + strlen(ext) + 1]; + sprintf(ppmFile, "%s.%s", ppmRoot, ext); + } else { + ppmFile = new char[strlen(ppmRoot) + 1 + pg_num_len + 1 + strlen(ext) + 1]; + sprintf(ppmFile, "%s-%0*d.%s", ppmRoot, pg_num_len, pg, ext); + } + savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, ppmFile); + delete[] ppmFile; + } else { + savePageSlice(doc, splashOut, pg, x, y, w, h, pg_w, pg_h, NULL); + } + } + delete splashOut; + + exitCode = 0; + + // clean up + err1: + delete doc; + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} diff --git a/utils/pdftops.1 b/utils/pdftops.1 new file mode 100644 index 0000000..c7aeaf5 --- /dev/null +++ b/utils/pdftops.1 @@ -0,0 +1,227 @@ +.\" Copyright 1996-2011 Glyph & Cog, LLC +.TH pdftops 1 "15 August 2011" +.SH NAME +pdftops \- Portable Document Format (PDF) to PostScript converter +(version 3.03) +.SH SYNOPSIS +.B pdftops +[options] +.RI +.RI [] +.SH DESCRIPTION +.B Pdftops +converts Portable Document Format (PDF) files to PostScript so they +can be printed. +.PP +Pdftops reads the PDF file, +.IR PDF-file , +and writes a PostScript file, +.IR PS-file . +If +.I PS-file +is not specified, pdftops converts +.I file.pdf +to +.I file.ps +(or +.I file.eps +with the \-eps option). If +.I PS-file +is \'-', the PostScript is sent to stdout. +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to print. +.TP +.BI \-l " number" +Specifies the last page to print. +.TP +.B \-level1 +Generate Level 1 PostScript. The resulting PostScript files will be +significantly larger (if they contain images), but will print on Level +1 printers. This also converts all images to black and white. No +more than one of the PostScript level options (\-level1, \-level1sep, +\-level2, \-level2sep, \-level3, \-level3Sep) may be given. +.TP +.B \-level1sep +Generate Level 1 separable PostScript. All colors are converted to +CMYK. Images are written with separate stream data for the four +components. +.TP +.B \-level2 +Generate Level 2 PostScript. Level 2 supports color images and image +compression. This is the default setting. +.TP +.B \-level2sep +Generate Level 2 separable PostScript. All colors are converted to +CMYK. The PostScript separation convention operators are used to +handle custom (spot) colors. +.TP +.B \-level3 +Generate Level 3 PostScript. This enables all Level 2 features plus +CID font embedding. +.TP +.B \-level3Sep +Generate Level 3 separable PostScript. The separation handling is the +same as for \-level2Sep. +.TP +.B \-origpagesizes +Generate a PostScript file with variable page sizes and orientations, +taking for each page the size of the original page in the PDF file. +The PostScript file contains "<> setpagedevice" +lines in each page header, so that the paper input tray gets correctly +changed on the printer. This option should be used when pdftops is used +as a print filter. Any specification of the page size via \-paper, +\-paperw, or \-paperh will get overridden as long as each page of the +PDF file has a defined paper size. No more than one of the mode options +(\-origpagesizes, \-eps, \-form) may be given. +.TP +.B \-eps +Generate an Encapsulated PostScript (EPS) file. An EPS file contains +a single image, so if you use this option with a multi-page PDF file, +you must use \-f and \-l to specify a single page. No more than one of +the mode options (\-origpagesizes, \-eps, \-form) may be given. +.TP +.B \-form +Generate a PostScript form which can be imported by software that +understands forms. A form contains a single page, so if you use this +option with a multi-page PDF file, you must use \-f and \-l to specify a +single page. The \-level1 option cannot be used with \-form. No more +than one of the mode options (\-origpagesizes, \-eps, \-form) may be +given. +.TP +.B \-opi +Generate OPI comments for all images and forms which have OPI +information. (This option is only available if pdftops was compiled +with OPI support.) +.TP +.B \-binary +Write binary data in Level 1 PostScript. By default, pdftops writes +hex-encoded data in Level 1 PostScript. Binary data is non-standard +in Level 1 PostScript but reduces the file size and can be useful +when Level 1 PostScript is required only for its restricted use +of PostScript operators. +.TP +.BI \-r " number" +Set the resolution in DPI when pdftops rasterizes images with +transparencies or, for Level 1 PostScript, when pdftops +rasterizes images with color masks. +By default, pdftops rasterizes images to 300 DPI. +.TP +.B \-noembt1 +By default, any Type 1 fonts which are embedded in the PDF file are +copied into the PostScript file. This option causes pdftops to +substitute base fonts instead. Embedded fonts make PostScript files +larger, but may be necessary for readable output. +.TP +.B \-noembtt +By default, any TrueType fonts which are embedded in the PDF file are +copied into the PostScript file. This option causes pdftops to +substitute base fonts instead. Embedded fonts make PostScript files +larger, but may be necessary for readable output. Also, some +PostScript interpreters do not have TrueType rasterizers. +.TP +.B \-noembcidps +By default, any CID PostScript fonts which are embedded in the PDF +file are copied into the PostScript file. This option disables that +embedding. No attempt is made to substitute for non-embedded CID +PostScript fonts. +.TP +.B \-noembcidtt +By default, any CID TrueType fonts which are embedded in the PDF file +are copied into the PostScript file. This option disables that +embedding. No attempt is made to substitute for non-embedded CID +TrueType fonts. +.TP +.B \-passfonts +By default, references to non-embedded 8-bit fonts in the PDF file are +substituted with the closest "Helvetica", "Times-Roman", or "Courier" font. +This option passes references to non-embedded fonts +through to the PostScript file. +.TP +.B \-preload +preload images and forms +.TP +.BI \-paper " size" +Set the paper size to one of "letter", "legal", "A4", or "A3". This +can also be set to "match", which will set the paper size to match the +size specified in the PDF file. \-origpagesizes overrides this setting +if the PDF file has defined page sizes. +.TP +.BI \-paperw " size" +Set the paper width, in points. \-origpagesizes overrides this setting +if the PDF file has defined page sizes. +.TP +.BI \-paperh " size" +Set the paper height, in points. \-origpagesizes overrides this setting +if the PDF file has defined page sizes. +.TP +.B \-nocrop +By default, output is cropped to the CropBox specified in the PDF +file. This option disables cropping. +.TP +.B \-expand +Expand PDF pages smaller than the paper to fill the paper. By +default, these pages are not scaled. +.TP +.B \-noshrink +Don't scale PDF pages which are larger than the paper. By default, +pages larger than the paper are shrunk to fit. +.TP +.B \-nocenter +By default, PDF pages smaller than the paper (after any scaling) are +centered on the paper. This option causes them to be aligned to the +lower-left corner of the paper instead. +.TP +.B \-duplex +Set the Duplex pagedevice entry in the PostScript file. This tells +duplex-capable printers to enable duplexing. +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-q +Don't print any messages or errors. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdftops software and documentation are copyright 1996-2011 Glyph & +Cog, LLC. +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdffonts (1), +.BR pdfimages (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftotext (1) diff --git a/utils/pdftops.cc b/utils/pdftops.cc new file mode 100644 index 0000000..7f5a0ce --- /dev/null +++ b/utils/pdftops.cc @@ -0,0 +1,422 @@ +//======================================================================== +// +// pdftops.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +// Modified for Debian by Hamish Moffatt, 22 May 2002. +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Kristian Høgsberg +// Copyright (C) 2007-2008, 2010 Albert Astals Cid +// Copyright (C) 2009 Till Kamppeter +// Copyright (C) 2009 Sanjoy Mahajan +// Copyright (C) 2009, 2011, 2012 William Bader +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2012 Thomas Freitag +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#include "parseargs.h" +#include "goo/GooString.h" +#include "goo/gmem.h" +#include "GlobalParams.h" +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "PSOutputDev.h" +#include "Error.h" + +static GBool setPSPaperSize(char *size, int &psPaperWidth, int &psPaperHeight) { + if (!strcmp(size, "match")) { + psPaperWidth = psPaperHeight = -1; + } else if (!strcmp(size, "letter")) { + psPaperWidth = 612; + psPaperHeight = 792; + } else if (!strcmp(size, "legal")) { + psPaperWidth = 612; + psPaperHeight = 1008; + } else if (!strcmp(size, "A4")) { + psPaperWidth = 595; + psPaperHeight = 842; + } else if (!strcmp(size, "A3")) { + psPaperWidth = 842; + psPaperHeight = 1190; + } else { + return gFalse; + } + return gTrue; +} + + +static int firstPage = 1; +static int lastPage = 0; +static GBool level1 = gFalse; +static GBool level1Sep = gFalse; +static GBool level2 = gFalse; +static GBool level2Sep = gFalse; +static GBool level3 = gFalse; +static GBool level3Sep = gFalse; +static GBool doOrigPageSizes = gFalse; +static GBool doEPS = gFalse; +static GBool doForm = gFalse; +#if OPI_SUPPORT +static GBool doOPI = gFalse; +#endif +static int splashResolution = 0; +static GBool psBinary = gFalse; +static GBool noEmbedT1Fonts = gFalse; +static GBool noEmbedTTFonts = gFalse; +static GBool noEmbedCIDPSFonts = gFalse; +static GBool noEmbedCIDTTFonts = gFalse; +static GBool fontPassthrough = gFalse; +static GBool preload = gFalse; +static char paperSize[15] = ""; +static int paperWidth = -1; +static int paperHeight = -1; +static GBool noCrop = gFalse; +static GBool expand = gFalse; +static GBool noShrink = gFalse; +static GBool noCenter = gFalse; +static GBool duplex = gFalse; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; +static GBool quiet = gFalse; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; +#if SPLASH_CMYK +static GBool overprint = gFalse; +#endif + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to print"}, + {"-l", argInt, &lastPage, 0, + "last page to print"}, + {"-level1", argFlag, &level1, 0, + "generate Level 1 PostScript"}, + {"-level1sep", argFlag, &level1Sep, 0, + "generate Level 1 separable PostScript"}, + {"-level2", argFlag, &level2, 0, + "generate Level 2 PostScript"}, + {"-level2sep", argFlag, &level2Sep, 0, + "generate Level 2 separable PostScript"}, + {"-level3", argFlag, &level3, 0, + "generate Level 3 PostScript"}, + {"-level3sep", argFlag, &level3Sep, 0, + "generate Level 3 separable PostScript"}, + {"-origpagesizes",argFlag, &doOrigPageSizes,0, + "conserve original page sizes"}, + {"-eps", argFlag, &doEPS, 0, + "generate Encapsulated PostScript (EPS)"}, + {"-form", argFlag, &doForm, 0, + "generate a PostScript form"}, +#if OPI_SUPPORT + {"-opi", argFlag, &doOPI, 0, + "generate OPI comments"}, +#endif + {"-r", argInt, &splashResolution, 0, + "resolution for rasterization, in DPI (default is 300)"}, + {"-binary", argFlag, &psBinary, 0, + "write binary data in Level 1 PostScript"}, + {"-noembt1", argFlag, &noEmbedT1Fonts, 0, + "don't embed Type 1 fonts"}, + {"-noembtt", argFlag, &noEmbedTTFonts, 0, + "don't embed TrueType fonts"}, + {"-noembcidps", argFlag, &noEmbedCIDPSFonts, 0, + "don't embed CID PostScript fonts"}, + {"-noembcidtt", argFlag, &noEmbedCIDTTFonts, 0, + "don't embed CID TrueType fonts"}, + {"-passfonts", argFlag, &fontPassthrough,0, + "don't substitute missing fonts"}, + {"-preload", argFlag, &preload, 0, + "preload images and forms"}, + {"-paper", argString, paperSize, sizeof(paperSize), + "paper size (letter, legal, A4, A3, match)"}, + {"-paperw", argInt, &paperWidth, 0, + "paper width, in points"}, + {"-paperh", argInt, &paperHeight, 0, + "paper height, in points"}, + {"-nocrop", argFlag, &noCrop, 0, + "don't crop pages to CropBox"}, + {"-expand", argFlag, &expand, 0, + "expand pages smaller than the paper size"}, + {"-noshrink", argFlag, &noShrink, 0, + "don't shrink pages larger than the paper size"}, + {"-nocenter", argFlag, &noCenter, 0, + "don't center pages smaller than the paper size"}, + {"-duplex", argFlag, &duplex, 0, + "enable duplex printing"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, +#if SPLASH_CMYK + {"-overprint",argFlag, &overprint, 0, + "enable overprint"}, +#endif + {"-q", argFlag, &quiet, 0, + "don't print any messages or errors"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName; + GooString *psFileName; + PSLevel level; + PSOutMode mode; + GooString *ownerPW, *userPW; + PSOutputDev *psOut; + GBool ok; + char *p; + int exitCode; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (!ok || argc < 2 || argc > 3 || printVersion || printHelp) { + fprintf(stderr, "pdftops version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdftops", " []", argDesc); + } + if (printVersion || printHelp) + exit(0); + else + exit(1); + } + if ((level1 ? 1 : 0) + + (level1Sep ? 1 : 0) + + (level2 ? 1 : 0) + + (level2Sep ? 1 : 0) + + (level3 ? 1 : 0) + + (level3Sep ? 1 : 0) > 1) { + fprintf(stderr, "Error: use only one of the 'level' options.\n"); + exit(1); + } + if ((doOrigPageSizes ? 1 : 0) + + (doEPS ? 1 : 0) + + (doForm ? 1 : 0) > 1) { + fprintf(stderr, "Error: use only one of -origpagesizes, -eps, and -form\n"); + exit(1); + } + if (level1) { + level = psLevel1; + } else if (level1Sep) { + level = psLevel1Sep; + } else if (level2Sep) { + level = psLevel2Sep; + } else if (level3) { + level = psLevel3; + } else if (level3Sep) { + level = psLevel3Sep; + } else { + level = psLevel2; + } + if (doForm && level < psLevel2) { + fprintf(stderr, "Error: forms are only available with Level 2 output.\n"); + exit(1); + } + mode = doOrigPageSizes ? psModePSOrigPageSizes + : doEPS ? psModeEPS + : doForm ? psModeForm + : psModePS; + fileName = new GooString(argv[1]); + + // read config file + globalParams = new GlobalParams(); + if (paperSize[0]) { + if (!setPSPaperSize(paperSize, paperWidth, paperHeight)) { + fprintf(stderr, "Invalid paper size\n"); + delete fileName; + goto err0; + } + } +#if SPLASH_CMYK + if (overprint) { + globalParams->setOverprintPreview(gTrue); + } +#endif + if (expand) { + globalParams->setPSExpandSmaller(gTrue); + } + if (noShrink) { + globalParams->setPSShrinkLarger(gFalse); + } + if (noCenter) { + globalParams->setPSCenter(gFalse); + } + if (level1 || level1Sep || level2 || level2Sep || level3 || level3Sep) { + globalParams->setPSLevel(level); + } + if (splashResolution > 0) { + globalParams->setPSRasterResolution(splashResolution); + } + if (noEmbedT1Fonts) { + globalParams->setPSEmbedType1(!noEmbedT1Fonts); + } + if (noEmbedTTFonts) { + globalParams->setPSEmbedTrueType(!noEmbedTTFonts); + } + if (noEmbedCIDPSFonts) { + globalParams->setPSEmbedCIDPostScript(!noEmbedCIDPSFonts); + } + if (noEmbedCIDTTFonts) { + globalParams->setPSEmbedCIDTrueType(!noEmbedCIDTTFonts); + } + if (fontPassthrough) { + globalParams->setPSFontPassthrough(fontPassthrough); + } + if (preload) { + globalParams->setPSPreload(preload); + } +#if OPI_SUPPORT + if (doOPI) { + globalParams->setPSOPI(doOPI); + } +#endif + if (psBinary) { + globalParams->setPSBinary(psBinary); + } + if (quiet) { + globalParams->setErrQuiet(quiet); + } + + // open PDF file + if (ownerPassword[0] != '\001') { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0] != '\001') { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err1; + } + +#ifdef ENFORCE_PERMISSIONS + // check for print permission + if (!doc->okToPrint()) { + error(errNotAllowed, -1, "Printing this document is not allowed."); + exitCode = 3; + goto err1; + } +#endif + + // construct PostScript file name + if (argc == 3) { + psFileName = new GooString(argv[2]); + } else if (fileName->cmp("fd://0") == 0) { + error(errCommandLine, -1, "You have to provide an output filename when reading form stdin."); + goto err1; + } else { + p = fileName->getCString() + fileName->getLength() - 4; + if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) { + psFileName = new GooString(fileName->getCString(), + fileName->getLength() - 4); + } else { + psFileName = fileName->copy(); + } + psFileName->append(doEPS ? ".eps" : ".ps"); + } + + // get page range + if (firstPage < 1) { + firstPage = 1; + } + if (lastPage < 1 || lastPage > doc->getNumPages()) { + lastPage = doc->getNumPages(); + } + + // check for multi-page EPS or form + if ((doEPS || doForm) && firstPage != lastPage) { + error(errCommandLine, -1, "EPS and form files can only contain one page."); + goto err2; + } + + // write PostScript file + psOut = new PSOutputDev(psFileName->getCString(), doc, + NULL, firstPage, lastPage, mode, + paperWidth, + paperHeight, + duplex); + if (psOut->isOk()) { + doc->displayPages(psOut, firstPage, lastPage, 72, 72, + 0, noCrop, !noCrop, gTrue); + } else { + delete psOut; + exitCode = 2; + goto err2; + } + delete psOut; + + exitCode = 0; + + // clean up + err2: + delete psFileName; + err1: + delete doc; + delete fileName; + err0: + delete globalParams; + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} diff --git a/utils/pdftotext.1 b/utils/pdftotext.1 new file mode 100644 index 0000000..0199b03 --- /dev/null +++ b/utils/pdftotext.1 @@ -0,0 +1,137 @@ +.\" Copyright 1997-2011 Glyph & Cog, LLC +.TH pdftotext 1 "15 August 2011" +.SH NAME +pdftotext \- Portable Document Format (PDF) to text converter +(version 3.03) +.SH SYNOPSIS +.B pdftotext +[options] +.RI [ PDF-file +.RI [ text-file ]] +.SH DESCRIPTION +.B Pdftotext +converts Portable Document Format (PDF) files to plain text. +.PP +Pdftotext reads the PDF file, +.IR PDF-file , +and writes a text file, +.IR text-file . +If +.I text-file +is not specified, pdftotext converts +.I file.pdf +to +.IR file.txt . +If +.I text-file +is \'-', the text is sent to stdout. +.SH OPTIONS +.TP +.BI \-f " number" +Specifies the first page to convert. +.TP +.BI \-l " number" +Specifies the last page to convert. +.TP +.BI \-r " number" +Specifies the resolution, in DPI. The default is 72 DPI. +.TP +.BI \-x " number" +Specifies the x-coordinate of the crop area top left corner +.TP +.BI \-y " number" +Specifies the y-coordinate of the crop area top left corner +.TP +.BI \-W " number" +Specifies the width of crop area in pixels (default is 0) +.TP +.BI \-H " number" +Specifies the height of crop area in pixels (default is 0) +.TP +.B \-layout +Maintain (as best as possible) the original physical layout of the +text. The default is to \'undo' physical layout (columns, +hyphenation, etc.) and output the text in reading order. +.TP +.BI \-fixed " number" +Assume fixed-pitch (or tabular) text, with the specified character +width (in points). This forces physical layout mode. +.TP +.B \-raw +Keep the text in content stream order. This is a hack which often +"undoes" column formatting, etc. Use of raw mode is no longer +recommended. +.TP +.B \-htmlmeta +Generate a simple HTML file, including the meta information. This +simply wraps the text in
 and 
and prepends the meta +headers. +.TP +.B \-bbox +Generate an XHTML file containing bounding box information for each +word in the file. +.TP +.BI \-enc " encoding-name" +Sets the encoding to use for text output. This defaults to "UTF-8". +.TP +.B \-listenc +Lits the available encodings +.TP +.BI \-eol " unix | dos | mac" +Sets the end-of-line convention to use for text output. +.TP +.B \-nopgbrk +Don't insert page breaks (form feed characters) between pages. +.TP +.BI \-opw " password" +Specify the owner password for the PDF file. Providing this will +bypass all security restrictions. +.TP +.BI \-upw " password" +Specify the user password for the PDF file. +.TP +.B \-q +Don't print any messages or errors. +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH BUGS +Some PDF files contain fonts whose encodings have been mangled beyond +recognition. There is no way (short of OCR) to extract text from +these files. +.SH EXIT CODES +The Xpdf tools use the following exit codes: +.TP +0 +No error. +.TP +1 +Error opening a PDF file. +.TP +2 +Error opening an output file. +.TP +3 +Error related to PDF permissions. +.TP +99 +Other error. +.SH AUTHOR +The pdftotext software and documentation are copyright 1996-2011 Glyph +& Cog, LLC. +.SH "SEE ALSO" +.BR pdfdetach (1), +.BR pdffonts (1), +.BR pdfimages (1), +.BR pdfinfo (1), +.BR pdftocairo (1), +.BR pdftohtml (1), +.BR pdftoppm (1), +.BR pdftops (1) diff --git a/utils/pdftotext.cc b/utils/pdftotext.cc new file mode 100644 index 0000000..a170f1b --- /dev/null +++ b/utils/pdftotext.cc @@ -0,0 +1,486 @@ +//======================================================================== +// +// pdftotext.cc +// +// Copyright 1997-2003 Glyph & Cog, LLC +// +// Modified for Debian by Hamish Moffatt, 22 May 2002. +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Dominic Lachowicz +// Copyright (C) 2007-2008, 2010, 2011 Albert Astals Cid +// Copyright (C) 2009 Jan Jockusch +// Copyright (C) 2010 Hib Eris +// Copyright (C) 2010 Kenneth Berland +// Copyright (C) 2011 Tom Gleason +// Copyright (C) 2011 Steven Murdoch +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include "config.h" +#include +#include +#include +#include +#include +#include "parseargs.h" +#include "printencodings.h" +#include "goo/GooString.h" +#include "goo/gmem.h" +#include "GlobalParams.h" +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "PDFDoc.h" +#include "PDFDocFactory.h" +#include "TextOutputDev.h" +#include "CharTypes.h" +#include "UnicodeMap.h" +#include "PDFDocEncoding.h" +#include "Error.h" +#include + +static void printInfoString(FILE *f, Dict *infoDict, const char *key, + const char *text1, const char *text2, UnicodeMap *uMap); +static void printInfoDate(FILE *f, Dict *infoDict, const char *key, const char *fmt); + +static int firstPage = 1; +static int lastPage = 0; +static double resolution = 72.0; +static int x = 0; +static int y = 0; +static int w = 0; +static int h = 0; +static GBool bbox = gFalse; +static GBool physLayout = gFalse; +static double fixedPitch = 0; +static GBool rawOrder = gFalse; +static GBool htmlMeta = gFalse; +static char textEncName[128] = ""; +static char textEOL[16] = ""; +static GBool noPageBreaks = gFalse; +static char ownerPassword[33] = "\001"; +static char userPassword[33] = "\001"; +static GBool quiet = gFalse; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; +static GBool printEnc = gFalse; + +static const ArgDesc argDesc[] = { + {"-f", argInt, &firstPage, 0, + "first page to convert"}, + {"-l", argInt, &lastPage, 0, + "last page to convert"}, + {"-r", argFP, &resolution, 0, + "resolution, in DPI (default is 72)"}, + {"-x", argInt, &x, 0, + "x-coordinate of the crop area top left corner"}, + {"-y", argInt, &y, 0, + "y-coordinate of the crop area top left corner"}, + {"-W", argInt, &w, 0, + "width of crop area in pixels (default is 0)"}, + {"-H", argInt, &h, 0, + "height of crop area in pixels (default is 0)"}, + {"-layout", argFlag, &physLayout, 0, + "maintain original physical layout"}, + {"-fixed", argFP, &fixedPitch, 0, + "assume fixed-pitch (or tabular) text"}, + {"-raw", argFlag, &rawOrder, 0, + "keep strings in content stream order"}, + {"-htmlmeta", argFlag, &htmlMeta, 0, + "generate a simple HTML file, including the meta information"}, + {"-enc", argString, textEncName, sizeof(textEncName), + "output text encoding name"}, + {"-listenc",argFlag, &printEnc, 0, + "list available encodings"}, + {"-eol", argString, textEOL, sizeof(textEOL), + "output end-of-line convention (unix, dos, or mac)"}, + {"-nopgbrk", argFlag, &noPageBreaks, 0, + "don't insert page breaks between pages"}, + {"-bbox", argFlag, &bbox, 0, + "output bounding box for each word and page size to html. Sets -htmlmeta"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-q", argFlag, &quiet, 0, + "don't print any messages or errors"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +static std::string myStringReplace(const std::string &inString, const std::string &oldToken, const std::string &newToken) { + std::string result = inString; + size_t foundLoc; + int advance = 0; + do { + foundLoc = result.find(oldToken, advance); + if (foundLoc != std::string::npos){ + result.replace(foundLoc, oldToken.length(), newToken); + advance = foundLoc + newToken.length(); + } + } while (foundLoc != std::string::npos ); + return result; +} + +static std::string myXmlTokenReplace(const char *inString){ + std::string myString(inString); + myString = myStringReplace(myString, "&", "&" ); + myString = myStringReplace(myString, "'", "'" ); + myString = myStringReplace(myString, "\"", """ ); + myString = myStringReplace(myString, "<", "<" ); + myString = myStringReplace(myString, ">", ">" ); + return myString; +} + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GooString *fileName; + GooString *textFileName; + GooString *ownerPW, *userPW; + TextOutputDev *textOut; + FILE *f; + UnicodeMap *uMap; + Object info; + GBool ok; + char *p; + int exitCode; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + if (bbox) { + htmlMeta = gTrue; + } + if (!ok || (argc < 2 && !printEnc) || argc > 3 || printVersion || printHelp) { + fprintf(stderr, "pdftotext version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdftotext", " []", argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + goto err0; + } + + // read config file + globalParams = new GlobalParams(); + + if (printEnc) { + printEncodings(); + delete globalParams; + exitCode = 0; + goto err0; + } + + fileName = new GooString(argv[1]); + if (fixedPitch) { + physLayout = gTrue; + } + + if (textEncName[0]) { + globalParams->setTextEncoding(textEncName); + } + if (textEOL[0]) { + if (!globalParams->setTextEOL(textEOL)) { + fprintf(stderr, "Bad '-eol' value on command line\n"); + } + } + if (noPageBreaks) { + globalParams->setTextPageBreaks(gFalse); + } + if (quiet) { + globalParams->setErrQuiet(quiet); + } + + // get mapping to output encoding + if (!(uMap = globalParams->getTextEncoding())) { + error(errCommandLine, -1, "Couldn't get text encoding"); + delete fileName; + goto err1; + } + + // open PDF file + if (ownerPassword[0] != '\001') { + ownerPW = new GooString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0] != '\001') { + userPW = new GooString(userPassword); + } else { + userPW = NULL; + } + + if (fileName->cmp("-") == 0) { + delete fileName; + fileName = new GooString("fd://0"); + } + + doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err2; + } + +#ifdef ENFORCE_PERMISSIONS + // check for copy permission + if (!doc->okToCopy()) { + error(errNotAllowed, -1, "Copying of text from this document is not allowed."); + exitCode = 3; + goto err2; + } +#endif + + // construct text file name + if (argc == 3) { + textFileName = new GooString(argv[2]); + } else if (fileName->cmp("fd://0") == 0) { + error(errCommandLine, -1, "You have to provide an output filename when reading form stdin."); + goto err2; + } else { + p = fileName->getCString() + fileName->getLength() - 4; + if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) { + textFileName = new GooString(fileName->getCString(), + fileName->getLength() - 4); + } else { + textFileName = fileName->copy(); + } + textFileName->append(htmlMeta ? ".html" : ".txt"); + } + + // get page range + if (firstPage < 1) { + firstPage = 1; + } + if (lastPage < 1 || lastPage > doc->getNumPages()) { + lastPage = doc->getNumPages(); + } + + // write HTML header + if (htmlMeta) { + if (!textFileName->cmp("-")) { + f = stdout; + } else { + if (!(f = fopen(textFileName->getCString(), "wb"))) { + error(errIO, -1, "Couldn't open text file '{0:t}'", textFileName); + exitCode = 2; + goto err3; + } + } + fputs("", f); + fputs("\n", f); + fputs("\n", f); + doc->getDocInfo(&info); + if (info.isDict()) { + Object obj; + if (info.getDict()->lookup("Title", &obj)->isString()) { + printInfoString(f, info.getDict(), "Title", "", "\n", uMap); + } else { + fputs("\n", f); + } + obj.free(); + printInfoString(f, info.getDict(), "Subject", + "\n", uMap); + printInfoString(f, info.getDict(), "Keywords", + "\n", uMap); + printInfoString(f, info.getDict(), "Author", + "\n", uMap); + printInfoString(f, info.getDict(), "Creator", + "\n", uMap); + printInfoString(f, info.getDict(), "Producer", + "\n", uMap); + printInfoDate(f, info.getDict(), "CreationDate", + "\n"); + printInfoDate(f, info.getDict(), "LastModifiedDate", + "\n"); + } + info.free(); + fputs("\n", f); + fputs("\n", f); + if (!bbox) fputs("
\n", f);
+    if (f != stdout) {
+      fclose(f);
+    }
+  }
+
+  // write text file
+  if (bbox) {
+    textOut = new TextOutputDev(NULL, physLayout, fixedPitch, rawOrder, htmlMeta);
+    if (!(f = fopen(textFileName->getCString(), "ab"))) {
+      error(errIO, -1, "Couldn't open text file '{0:t}' for append", textFileName);
+      exitCode = 2;
+      delete textOut;
+      goto err3;
+    }
+
+    if (textOut->isOk()) {
+      fprintf(f, "\n");
+      for (int page = firstPage; page <= lastPage; ++page) {
+        fprintf(f, "  \n",doc->getPageMediaWidth(page), doc->getPageMediaHeight(page));
+        doc->displayPage(textOut, page, resolution, resolution, 0, gTrue, gFalse, gFalse);
+        TextWordList *wordlist = textOut->makeWordList();
+        const int word_length = wordlist != NULL ? wordlist->getLength() : 0;
+        TextWord *word;
+        double xMinA, yMinA, xMaxA, yMaxA;
+        if (word_length == 0)
+          fprintf(stderr, "no word list\n");
+
+        for (int i = 0; i < word_length; ++i) {
+          word = wordlist->get(i);
+          word->getBBox(&xMinA, &yMinA, &xMaxA, &yMaxA);
+          const std::string myString = myXmlTokenReplace(word->getText()->getCString());
+          fprintf(f,"    %s\n", xMinA, yMinA, xMaxA, yMaxA, myString.c_str());
+        }
+        fprintf(f, "  \n");
+        delete wordlist;
+      }
+      fprintf(f, "\n");
+    }
+    fclose(f);
+  } else {
+    textOut = new TextOutputDev(textFileName->getCString(),
+				physLayout, fixedPitch, rawOrder, htmlMeta);
+    if (textOut->isOk()) {
+      if ((w==0) && (h==0) && (x==0) && (y==0)) {
+	doc->displayPages(textOut, firstPage, lastPage, resolution, resolution, 0,
+			  gTrue, gFalse, gFalse);
+      } else {
+	
+	for (int page = firstPage; page <= lastPage; ++page) {
+	  doc->displayPageSlice(textOut, page, resolution, resolution, 0,
+			      gTrue, gFalse, gFalse, 
+			      x, y, w, h);
+	}
+      }
+
+    } else {
+    delete textOut;
+    exitCode = 2;
+    goto err3;
+    }
+  }
+  delete textOut;
+
+  // write end of HTML file
+  if (htmlMeta) {
+    if (!textFileName->cmp("-")) {
+      f = stdout;
+    } else {
+      if (!(f = fopen(textFileName->getCString(), "ab"))) {
+	error(errIO, -1, "Couldn't open text file '{0:t}'", textFileName);
+	exitCode = 2;
+	goto err3;
+      }
+    }
+    if (!bbox) fputs("
\n", f); + fputs("\n", f); + fputs("\n", f); + if (f != stdout) { + fclose(f); + } + } + + exitCode = 0; + + // clean up + err3: + delete textFileName; + err2: + delete doc; + delete fileName; + uMap->decRefCnt(); + err1: + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} + +static void printInfoString(FILE *f, Dict *infoDict, const char *key, + const char *text1, const char *text2, UnicodeMap *uMap) { + Object obj; + GooString *s1; + GBool isUnicode; + Unicode u; + char buf[8]; + int i, n; + + if (infoDict->lookup(key, &obj)->isString()) { + fputs(text1, f); + s1 = obj.getString(); + if ((s1->getChar(0) & 0xff) == 0xfe && + (s1->getChar(1) & 0xff) == 0xff) { + isUnicode = gTrue; + i = 2; + } else { + isUnicode = gFalse; + i = 0; + } + while (i < obj.getString()->getLength()) { + if (isUnicode) { + u = ((s1->getChar(i) & 0xff) << 8) | + (s1->getChar(i+1) & 0xff); + i += 2; + } else { + u = pdfDocEncoding[s1->getChar(i) & 0xff]; + ++i; + } + n = uMap->mapUnicode(u, buf, sizeof(buf)); + fwrite(buf, 1, n, f); + } + fputs(text2, f); + } + obj.free(); +} + +static void printInfoDate(FILE *f, Dict *infoDict, const char *key, const char *fmt) { + Object obj; + char *s; + + if (infoDict->lookup(key, &obj)->isString()) { + s = obj.getString()->getCString(); + if (s[0] == 'D' && s[1] == ':') { + s += 2; + } + fprintf(f, fmt, s); + } + obj.free(); +} diff --git a/utils/pdfunite.1 b/utils/pdfunite.1 new file mode 100644 index 0000000..9b1f2e8 --- /dev/null +++ b/utils/pdfunite.1 @@ -0,0 +1,33 @@ +.\" Copyright 2011 The Poppler Developers - http://poppler.freedesktop.org +.TH pdfunite 1 "15 September 2011" +.SH NAME +pdfunite \- Portable Document Format (PDF) page merger +.SH SYNOPSIS +.B pdfunite +[options] +.I PDF-sourcefile1..PDF-sourcefilen PDF-destfile +.SH DESCRIPTION +.B pdfunite +merges several PDF (Portable Document Format) files in order of their occurence on command line to one PDF result file. +.TP +Neither of the PDF-sourcefile1 to PDF-sourcefilen should be encrypted. +.SH OPTIONS +.TP +.B \-v +Print copyright and version information. +.TP +.B \-h +Print usage information. +.RB ( \-help +and +.B \-\-help +are equivalent.) +.SH EXAMPLE +pdfunite sample1.pdf sample2.pdf sample.pdf +.TP +merges all pages from sample1.pdf and sample2.pdf (in that order) and creates sample.pdf +.SH AUTHOR +The pdfunite software and documentation are copyright 1996-2004 Glyph & Cog, LLC +and copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org +.SH "SEE ALSO" +.BR pdfseparate (1), diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc new file mode 100644 index 0000000..212f89b --- /dev/null +++ b/utils/pdfunite.cc @@ -0,0 +1,182 @@ +//======================================================================== +// +// pdfunite.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2011 Thomas Freitag +// Copyright (C) 2012 Arseny Solokha +// Copyright (C) 2012 Fabio D'Urso +// +//======================================================================== +#include +#include +#include "parseargs.h" +#include "config.h" +#include +#include + +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; + +static const ArgDesc argDesc[] = { + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +/////////////////////////////////////////////////////////////////////////// +int main (int argc, char *argv[]) +/////////////////////////////////////////////////////////////////////////// +// Merge PDF files given by arguments 1 to argc-2 and write the result +// to the file specified by argument argc-1. +/////////////////////////////////////////////////////////////////////////// +{ + int objectsCount = 0; + Guint numOffset = 0; + std::vector pages; + std::vector offsets; + XRef *yRef, *countRef; + FILE *f; + OutStream *outStr; + int i; + int j, rootNum; + std::vectordocs; + int majorVersion = 0; + int minorVersion = 0; + char *fileName = argv[argc - 1]; + int exitCode; + + exitCode = 99; + if (argc <= 3 || printVersion || printHelp) { + fprintf(stderr, "pdfunite version %s\n", PACKAGE_VERSION); + fprintf(stderr, "%s\n", popplerCopyright); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdfunite", ".. ", + argDesc); + } + if (printVersion || printHelp) + exitCode = 0; + return exitCode; + } + exitCode = 0; + globalParams = new GlobalParams(); + + for (i = 1; i < argc - 1; i++) { + GooString *gfileName = new GooString(argv[i]); + PDFDoc *doc = new PDFDoc(gfileName, NULL, NULL, NULL); + if (doc->isOk() && !doc->isEncrypted()) { + docs.push_back(doc); + if (doc->getPDFMajorVersion() > majorVersion) { + majorVersion = doc->getPDFMajorVersion(); + minorVersion = doc->getPDFMinorVersion(); + } else if (doc->getPDFMajorVersion() == majorVersion) { + if (doc->getPDFMinorVersion() > minorVersion) { + minorVersion = doc->getPDFMinorVersion(); + } + } + } else if (doc->isOk()) { + error(errUnimplemented, -1, "Could not merge encrypted files ('{0:s}')", argv[i]); + return -1; + } else { + error(errSyntaxError, -1, "Could not merge damaged documents ('{0:s}')", argv[i]); + return -1; + } + } + + if (!(f = fopen(fileName, "wb"))) { + error(errIO, -1, "Could not open file '{0:s}'", fileName); + return -1; + } + outStr = new FileOutStream(f, 0); + + yRef = new XRef(); + countRef = new XRef(); + yRef->add(0, 65535, 0, gFalse); + PDFDoc::writeHeader(outStr, majorVersion, minorVersion); + + for (i = 0; i < (int) docs.size(); i++) { + for (j = 1; j <= docs[i]->getNumPages(); j++) { + PDFRectangle *cropBox = NULL; + if (docs[i]->getCatalog()->getPage(j)->isCropped()) + cropBox = docs[i]->getCatalog()->getPage(j)->getCropBox(); + docs[i]->replacePageDict(j, + docs[i]->getCatalog()->getPage(j)->getRotate(), + docs[i]->getCatalog()->getPage(j)->getMediaBox(), cropBox, NULL); + Ref *refPage = docs[i]->getCatalog()->getPageRef(j); + Object page; + docs[i]->getXRef()->fetch(refPage->num, refPage->gen, &page); + pages.push_back(page); + offsets.push_back(numOffset); + Dict *pageDict = page.getDict(); + docs[i]->markPageObjects(pageDict, yRef, countRef, numOffset); + } + objectsCount += docs[i]->writePageObjects(outStr, yRef, numOffset); + numOffset = yRef->getNumObjects() + 1; + } + + rootNum = yRef->getNumObjects() + 1; + yRef->add(rootNum, 0, outStr->getPos(), gTrue); + outStr->printf("%d 0 obj\n", rootNum); + outStr->printf("<< /Type /Catalog /Pages %d 0 R", rootNum + 1); + outStr->printf(">>\nendobj\n"); + objectsCount++; + + yRef->add(rootNum + 1, 0, outStr->getPos(), gTrue); + outStr->printf("%d 0 obj\n", rootNum + 1); + outStr->printf("<< /Type /Pages /Kids ["); + for (j = 0; j < (int) pages.size(); j++) + outStr->printf(" %d 0 R", rootNum + j + 2); + outStr->printf(" ] /Count %d >>\nendobj\n", pages.size()); + objectsCount++; + + for (i = 0; i < (int) pages.size(); i++) { + yRef->add(rootNum + i + 2, 0, outStr->getPos(), gTrue); + outStr->printf("%d 0 obj\n", rootNum + i + 2); + outStr->printf("<< "); + Dict *pageDict = pages[i].getDict(); + for (j = 0; j < pageDict->getLength(); j++) { + if (j > 0) + outStr->printf(" "); + const char *key = pageDict->getKey(j); + Object value; + pageDict->getValNF(j, &value); + if (strcmp(key, "Parent") == 0) { + outStr->printf("/Parent %d 0 R", rootNum + 1); + } else { + outStr->printf("/%s ", key); + PDFDoc::writeObject(&value, NULL, outStr, yRef, offsets[i]); + } + value.free(); + } + outStr->printf(" >>\nendobj\n"); + objectsCount++; + } + Guint uxrefOffset = outStr->getPos(); + Ref ref; + ref.num = rootNum; + ref.gen = 0; + Dict *trailerDict = PDFDoc::createTrailerDict(objectsCount, gFalse, 0, &ref, yRef, + fileName, outStr->getPos()); + PDFDoc::writeXRefTableTrailer(trailerDict, yRef, gFalse /* do not write unnecessary entries */, + uxrefOffset, outStr, yRef); + delete trailerDict; + + outStr->close(); + fclose(f); + delete yRef; + delete countRef; + for (j = 0; j < (int) pages.size (); j++) pages[j].free(); + for (i = 0; i < (int) docs.size (); i++) delete docs[i]; + delete globalParams; + return exitCode; +} diff --git a/utils/printencodings.cc b/utils/printencodings.cc new file mode 100644 index 0000000..dec6f98 --- /dev/null +++ b/utils/printencodings.cc @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2008, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "printencodings.h" + +#include "GlobalParams.h" +#include "goo/GooList.h" +#include "goo/GooString.h" + +void printEncodings() +{ + GooList *encNames = globalParams->getEncodingNames(); + printf("Available encodings are:\n"); + for (int i = 0; i < encNames->getLength(); ++i) { + GooString *enc = (GooString*)encNames->get(i); + printf("%s\n", enc->getCString()); + } + delete encNames; +} diff --git a/utils/printencodings.h b/utils/printencodings.h new file mode 100644 index 0000000..5be2819 --- /dev/null +++ b/utils/printencodings.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2008, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef PRINTENCODINGS_H +#define PRINTENCODINGS_H + +void printEncodings(); + +#endif